310P 部署 DeepSeek 调研

本文档详细介绍了在 ARM 64 架构的昇腾 310P 设备(CANN 8.0.1 环境)上部署**DeepSeek-R1-Distill-Qwen-32B 大模型**的技术流程,涵盖模型下载、环境配置与推理部署全链路。模型可通过**ModelScope SDK**或**git-lfs**离线获取,需确保文件权限和储存路径正确。部署基于**昇腾 MindIE 镜像**(需权限申请),通过 Docker 容器整合 CANN、PyTorch-NPU 及 MindIE 组件,需挂载宿主机 NPU 驱动并验证环境可用性。推理支持**直接脚本调用**(如`run_pa.py`加载权重,支持自定义提问)或**服务化启动**(修改`config.json`中的端口、NPU 设备集和模型路径后后台运行服务),重点关注硬件资源匹配(如`worldSize`与 NPU 卡数适配)和配置文件参数校准(如显存分配、序列长度等)。整体流程强调离线迁移的可行性与昇腾硬件的适配优化,实际部署需根据具体硬件条件调整参数。

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

设备环境:

  • ARM 64
  • 310P
  • CANN 8.0.1

模型下载

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

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

  1. 官方推荐:通过 ModelScope SDK 下载模型
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 安装 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 下载
1
2
3
4
5
6
7
8
# 安装 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。

使用该镜像需要申请权限

根据操作指南拉取镜像

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

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

1
2
3
4
5
# 导出镜像
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 启动镜像

1
2
3
4
5
6
7
8
9
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
1
docker exec -it deepseek-r1-distill-root-test bash

确认环境可用性

  1. 检查 NPU
1
npu-smi info

如果出现

1
bash: npu-smi: command not found

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

1
find / -name npu-smi

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

  1. 检查 Python 环境
1
2
import torch
import torch_npu

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

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

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

1
2
3
4
5
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. 确认模型地址正确
1
2
3
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

确认权限

1
chmod -R 750 /storage/llm

开始推理

  1. 纯模型推理

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

1
2
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 参数设置,如:

1
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,具体参数含义与配置规则请参考配置参数说明,详情见后。 使用后台进程方式启动服务:

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

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

1
Daemon start success!

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

设置模型服务启动配置

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

按照建议修改

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
{
	...
	"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,
					...
				}
			]
		},
	}
}

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

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
{
    "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
        }
    }
}
Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计