释放小七猫的分享欲

310P 部署 DeepSeek 调研

tags: Python
@ 26/06/2025

由于目前设备不便于网络安装模型,本调研仅收集资料,具体的部署情况还需进一步探究。

设备环境:

  • ARM 64
  • 310P
  • CANN 8.0.1

模型下载

deepseek-ai/DeepSeek-R1-Distill-Qwen-32B

以上网址可以下载 DeepSeek-R1 的 32B 蒸馏模型。

  1. 官方推荐:通过 ModelScope SDK 下载模型
# 安装 ModelScope
pip install modelscope

# 下载完整模型库
modelscope download --model deepseek-ai/DeepSeek-R1-Distill-Qwen-32B

# 下载单个文件到指定本地文件夹(以下载 README.md 到当前路径下“dir”目录为例)
modelscope download --model deepseek-ai/DeepSeek-R1-Distill-Qwen-32B README.md --local_dir ./dir

# SDK/模型下载
from modelscope import snapshot_download
model_dir = snapshot_download('deepseek-ai/DeepSeek-R1-Distill-Qwen-32B')

这种方式需要全程联网。

  1. 通过 git-lfs 下载
# 安装 lfs
git lfs install

# 下载模型
git clone https://www.modelscope.cn/deepseek-ai/DeepSeek-R1-Distill-Qwen-32B.git

# 如果您希望跳过 lfs 大文件下载,可以使用如下命令
GIT_LFS_SKIP_SMUDGE=1 git clone https://www.modelscope.cn/deepseek-ai/DeepSeek-R1-Distill-Qwen-32B.git

这种方式理论上便于迁移,但需要实际验证。

部署模型

mindie 是昇腾的模型运行基础环境,MindIE 镜像地址,可用于部署各类大模型。

该镜像已具备模型运行所需的基础环境,包括:CANN、FrameworkPTAdapter、MindIE 与 ATB-Models,可实现模型快速上手推理。

为方便使用,该镜像中内置了 ATB-Models 压缩包,并放置于/opt/package 之下,如需使用,可从镜像中获取。

使用前提:

  • 宿主机上已经安装好固件与驱动,具体可参考安装驱动和固件。
  • 宿主机上已经安装好 Docker。

使用该镜像需要申请权限

根据操作指南拉取镜像

docker pull  --platform=linux/arm64  swr.cn-south-1.myhuaweicloud.com/ascendhub/mindie:2.0.RC2-800I-A3-py311-openeuler24.03-lts

注意,如果机器无法上网,需要通过可以访问互联网的机器拉取镜像、导出、传输到内网机器、然后导入即可。如果机器可以访问公网,直接拉取即可。

# 导出镜像
docker save -o 2.0.RC2-800I-A3-py311-openeuler24.03-lts.tar swr.cn-south-1.myhuaweicloud.com/ascendhub/mindie:2.0.RC2-800I-A3-py311-openeuler24.03-lts

# 导入镜像
docker load -i 2.0.RC2-800I-A3-py311-openeuler24.03-lts.tar

用 docker 启动镜像

docker run -it -d --net=host --shm-size=10g \
    --privileged \
    --name deepseek-r1-distill-root-test \
    -v /usr/local/Ascend/driver:/usr/local/Ascend/driver:ro \
    -v /usr/local/sbin:/usr/local/sbin:ro \
    # 映射model目录
    -v /data1/apps/models:/storage/llm \
    swr.cn-south-1.myhuaweicloud.com/ascendhub/mindie:2.0.RC2-800I-A3-py311-openeuler24.03-lts \
    bash
docker exec -it deepseek-r1-distill-root-test bash

确认环境可用性

  1. 检查 NPU
npu-smi info

如果出现

bash: npu-smi: command not found

则需要查找主机上 npu-smi 的位置,并把 npu-smi 挂载到容器内部

find / -name npu-smi

一般来说,可能出现在 /usr/local/bin/npu-smi​ 路径下。

  1. 检查 Python 环境
import torch
import torch_npu

运行 python,执行以上命令,确认 torch 及 torch_npu 是否正常。

  1. 检查 mindie 环境
pip list | grep mindie

有以下输出则说明各组件正常。

mindie_llm                        1.0.0
mindiebenchmark                   1.0.0
mindieclient                      1.0.0
mindiesd                          1.0.0
mindietorch                       1.0.0+torch2.1.0.abi0
  1. 确认模型地址正确
cd /storage/llm/deepseek-ai/DeepSeek-R1-Distill-Qwen-7B
cd /storage/llm/deepseek-ai/DeepSeek-R1-Distill-Qwen-14B
cd /storage/llm/deepseek-ai/DeepSeek-R1-Distill-Qwen-32B

确认权限

chmod -R 750 /storage/llm

开始推理

  1. 纯模型推理

以 Llama 3 系列模型为例,具体可参考容器中$ATB_SPEED_HOME_PATH/examples/models/llama3/README.md 中的说明

cd $ATB_SPEED_HOME_PATH
python examples/run_pa.py --model_path /path-to-weights

请修改权重路径/path-to-weights,另外$ATB_SPEED_HOME_PATH 已默认设置好,无需自行设置。

启动后会执行推理,显示默认问题 Question 和推理结果 Answer,若用户想要自定义输入问题,可使用--input_texts 参数设置,如:

python examples/run_pa.py --model_path /path-to-weights --input_texts "What is deep learning?"
  1. 启动服务

MindIE Service 是面向通用模型场景的推理服务化框架,通过开放、可扩展的推理服务化平台架构提供推理服务化能力,支持对接业界主流推理框架接口,满足大语言模型的高性能推理需求。请参考 MindIE Service 开发指南。

以下给出最为简单的启动方法;

修改$MIES_INSTALL_PATH/conf/config.json,具体参数含义与配置规则请参考配置参数说明,详情见后。 使用后台进程方式启动服务:

cd $MIES_INSTALL_PATH
nohup ./bin/mindieservice_daemon > output.log 2>&1 &

在标准输出流捕获到的文件中,打印如下信息说明启动成功:

Daemon start success!

$MIES_INSTALL_PATH 已默认设置好,无需自行设置。

设置模型服务启动配置

vi /usr/local/Ascend/mindie/latest/mindie-service/conf/config.json
# 或者
vi `$MIES_INSTALL_PATH/conf/config.json`

按照建议修改

{
	...
	"ServerConfig" :
	{
		...
		"port" : 1040, #自定义
		"managementPort" : 1041, #自定义
		"metricsPort" : 1042, #自定义
		...
		"httpsEnabled" : false,  # 取消https协议启动服务
		...
	},

	"BackendConfig": {
		...
		"npuDeviceIds" : [[0,1]],
		...
		"ModelDeployConfig":
		{
			"truncation" : false,
			"ModelConfig" : [
				{
					...
					"modelName" : "deepseek-14b",
					"modelWeightPath" : "/storage/llm/deepseek-ai/DeepSeek-R1-Distill-Qwen-14B",
					"worldSize" : 2,
					...
				}
			]
		},
	}
}

配置文件示例,不可以直接用,需要根据实际硬件环境修改,可以将参考。

{
    "Version": "1.1.0",
    "LogConfig": {
        "logLevel": "Verbose",
        "logFileSize": 200,
        "logFileNum": 64,
        "logPath": "logs/mindservice.log"
    },

    "ServerConfig": {
        "ipAddress": "127.0.0.1",
        "managementIpAddress": "127.0.0.2",
        "port": 1025,
        "managementPort": 1026,
        "metricsPort": 1027,
        "allowAllZeroIpListening": false,
        "maxLinkNum": 1000,
        "httpsEnabled": false,
        "fullTextEnabled": false,
        "tlsCaPath": "security/ca/",
        "tlsCaFile": ["ca.pem"],
        "tlsCert": "security/certs/server.pem",
        "tlsPk": "security/keys/server.key.pem",
        "tlsPkPwd": "security/pass/key_pwd.txt",
        "tlsCrlPath": "security/certs/",
        "tlsCrlFiles": ["server_crl.pem"],
        "managementTlsCaFile": ["management_ca.pem"],
        "managementTlsCert": "security/certs/management/server.pem",
        "managementTlsPk": "security/keys/management/server.key.pem",
        "managementTlsPkPwd": "security/pass/management/key_pwd.txt",
        "managementTlsCrlPath": "security/management/certs/",
        "managementTlsCrlFiles": ["server_crl.pem"],
        "kmcKsfMaster": "tools/pmt/master/ksfa",
        "kmcKsfStandby": "tools/pmt/standby/ksfb",
        "inferMode": "standard",
        "interCommTLSEnabled": true,
        "interCommPort": 1121,
        "interCommTlsCaPath": "security/grpc/ca/",
        "interCommTlsCaFiles": ["ca.pem"],
        "interCommTlsCert": "security/grpc/certs/server.pem",
        "interCommPk": "security/grpc/keys/server.key.pem",
        "interCommPkPwd": "security/grpc/pass/key_pwd.txt",
        "interCommTlsCrlPath": "security/grpc/certs/",
        "interCommTlsCrlFiles": ["server_crl.pem"],
        "openAiSupport": "vllm"
    },

    "BackendConfig": {
        "backendName": "mindieservice_llm_engine",
        "modelInstanceNumber": 4,
        "npuDeviceIds": [
            [0, 1],
            [2, 3],
            [4, 5],
            [6, 7]
        ],
        "tokenizerProcessNumber": 8,
        "multiNodesInferEnabled": false,
        "multiNodesInferPort": 1120,
        "interNodeTLSEnabled": true,
        "interNodeTlsCaPath": "security/grpc/ca/",
        "interNodeTlsCaFiles": ["ca.pem"],
        "interNodeTlsCert": "security/grpc/certs/server.pem",
        "interNodeTlsPk": "security/grpc/keys/server.key.pem",
        "interNodeTlsPkPwd": "security/grpc/pass/mindie_server_key_pwd.txt",
        "interNodeTlsCrlPath": "security/grpc/certs/",
        "interNodeTlsCrlFiles": ["server_crl.pem"],
        "interNodeKmcKsfMaster": "tools/pmt/master/ksfa",
        "interNodeKmcKsfStandby": "tools/pmt/standby/ksfb",
        "ModelDeployConfig": {
            "maxSeqLen": 13000,
            "maxInputTokenLen": 4096,
            "truncation": false,
            "ModelConfig": [
                {
                    "modelInstanceType": "Standard",
                    "modelName": "deepseek-32b",
                    "modelWeightPath": "/storage/llm/deepseek-ai/DeepSeek-R1-Distill-Qwen-32B",
                    "worldSize": 2,
                    "cpuMemSize": 100,
                    "npuMemSize": 10,
                    "backendType": "atb",
                    "trustRemoteCode": false
                }
            ]
        },

        "ScheduleConfig": {
            "templateType": "Standard",
            "templateName": "Standard_LLM",
            "cacheBlockSize": 128,

            "maxPrefillBatchSize": 50,
            "maxPrefillTokens": 16384,
            "prefillTimeMsPerReq": 150,
            "prefillPolicyType": 0,

            "decodeTimeMsPerReq": 50,
            "decodePolicyType": 0,

            "maxBatchSize": 200,
            "maxIterTimes": 4096,
            "maxPreemptCount": 0,
            "supportSelectBatch": false,
            "maxQueueDelayMicroseconds": 5000
        }
    }
}