华为昇腾deepseek模型部署
title: 华为昇腾DeepSeek模型部署 date: 2026-02-09 10:00:00 categories: [AI, hw-ascend] tags: [AI, hw-ascend, LLM部署] image: path: /assets/img/posts/common/hw-ascend.jpg —
华为昇腾DeepSeek模型部署
适用于华为昇腾 310P3 服务器,基于 MindIE 服务化部署 DeepSeek-R1 系列模型,并通过 curl 调用 OpenAI 兼容接口进行对话验证。
一、环境与资源说明
| 项目 | 说明 |
|---|---|
| 硬件 | 3× Atlas 310P3(单卡约 21GB 显存) |
| 系统 | openEuler 22.03 LTS (aarch64) |
| MindIE 镜像 | swr.cn-south-1.myhuaweicloud.com/ascendhub/mindie:1.0.0-300I-Duo-py311-openeuler24.03-lts |
| 模型路径 | /home/models/ds-r1-14b |
| 配置文件 | /home/config.json |
| 服务地址 | 192.168.1.214:1025 |
| 模型名称 | deepseek-r1-14b |
| 模型官方链接 | ModelZoo DeepSeek-R1-Distill-Qwen-14B、DeepSeek 专区 |
二、部署步骤
步骤 0:模型下载(如未准备)
模型目录路径无强制要求,在 config.json 的 modelWeightPath 中配置为实际存放路径即可。推荐使用华为昇腾官方提供的 MindIE 适配模型,可从以下渠道获取:
| 来源 | 链接 |
|---|---|
| DeepSeek-R1 14B 官方模型页(权重与镜像) | ModelZoo DeepSeek-R1-Distill-Qwen-14B |
| MindIE 模型支持与下载说明 | MindIE 模型支持列表 |
| 昇腾 AscendHub 镜像与模型 | AscendHub(MindIE 镜像详情) |
下载后按 MindIE 说明解压到目标目录,并在 config.json 中设置 modelWeightPath 指向该目录。
步骤 1:确认模型与配置
1
2
3
4
5
# 确认模型目录存在
ls -la /home/models/ds-r1-14b
# 查看配置文件
cat /home/config.json
确保 config.json 中 modelWeightPath 指向 /home/models/ds-r1-14b,且 modelName、npuDeviceIds、worldSize 等参数正确。
步骤 2:停止并清理旧容器(如有)
1
2
3
docker ps -a | grep mindie
docker stop <容器名> # 若存在
docker rm <容器名>
步骤 3:启动 MindIE 容器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
docker run -it -d --name mindie-ds-r1 \
--network=host \
--shm-size=8g \
--privileged=true \
--device=/dev/davinci_manager \
--device=/dev/hisi_hdc \
--device=/dev/devmm_svm \
--device=/dev/davinci0 \
--device=/dev/davinci2 \
-v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
-v /usr/local/dcmi:/usr/local/dcmi \
-v /usr/local/sbin/npu-smi:/usr/local/bin/npu-smi \
-v /home/models:/home/models \
-v /home/config.json:/usr/local/Ascend/mindie/latest/mindie-service/conf/config.json \
swr.cn-south-1.myhuaweicloud.com/ascendhub/mindie:1.0.0-300I-Duo-py311-openeuler24.03-lts \
bash
说明:当前配置使用 NPU 0、1 双卡(
npuDeviceIds: [[0,1]]),对应设备为/dev/davinci0、/dev/davinci2(本机设备:davinci0、davinci2、davinci4,无 davinci1)。
查看 NPU 设备列表与 ID(宿主机或容器内执行):
1
2
3
4
5
6
7
8
# 查看 NPU 概要及设备 ID(NPU ID 即列表中各卡的编号 0、1、2...)
npu-smi info
# 查看拓扑,确认设备编号与 /dev/davinci 对应关系
npu-smi info -t topo
# 查看当前有哪些 davinci 设备节点(设备号不一定连续,如 0、2、4)
ls -l /dev/davinci*
配置 npuDeviceIds 时使用 NPU ID(如 [[0,1]]),挂载 --device 时使用实际存在的 /dev/davinciN。
若配置文件路径在镜像内不同,可改为挂载整个 /home 目录:
1
-v /home:/home
并在启动服务前,将 /home/config.json 复制到 MindIE 的 conf 目录。
步骤 4:进入容器并加载环境
1
2
3
4
5
6
7
8
9
docker exec -it -u 0 mindie-ds-r1 bash
# 加载昇腾与 MindIE 环境变量
source /usr/local/Ascend/ascend-toolkit/set_env.sh
source /usr/local/Ascend/mindie/set_env.sh 2>/dev/null || true
source /usr/local/Ascend/mindie/latest/mindie-service/set_env.sh 2>/dev/null || true
# 确认 npu-smi 可用(已通过 -v /usr/local/sbin/npu-smi:/usr/local/bin/npu-smi 挂载)
which npu-smi # 应输出 /usr/local/bin/npu-smi
步骤 5:确认配置文件
1
2
cd /usr/local/Ascend/mindie/latest/mindie-service/conf
cat config.json
当前 /home/config.json 关键配置项:
| 配置项 | 值 | 说明 |
|---|---|---|
ServerConfig.ipAddress | 192.168.1.214 | 服务监听 IP |
ServerConfig.port | 1025 | 主服务端口 |
ServerConfig.managementPort | 1026 | 管理端口 |
ServerConfig.metricsPort | 1027 | 指标端口 |
BackendConfig.npuDeviceIds | [[0,1]] | 使用 NPU 0、1 双卡 |
ModelConfig.modelName | deepseek-r1-14b | 模型名称(curl 请求中需一致) |
ModelConfig.modelWeightPath | /home/models/ds-r1-14b | 模型权重路径 |
ModelConfig.worldSize | 2 | 与 NPU 卡数一致 |
maxSeqLen | 2560 | 最大序列长度,长上下文场景建议调至 8192 |
maxInputTokenLen | 2048 | 最大输入 token 数,超限会报 424,建议调至 8192 |
truncation | false | 设为 true 时由服务端自动截断超长输入,无需调大显存 |
步骤 6:启动 MindIE 服务
1
2
3
cd /usr/local/Ascend/mindie/latest/mindie-service
# 确保 PATH 含 npu-smi(见步骤 4)
./bin/mindieservice_daemon
另开终端监控 NPU 使用情况:
1
watch -n 1 npu-smi info
服务启动后监听 192.168.1.214:1025。
服务状态检查:执行 npu-smi info,若 NPU 0、1 下显示 python 进程且 Memory-Usage 已占用,说明模型已加载,可直接进行 curl 测试。
三、curl 调用服务化接口
服务地址:http://192.168.1.214:1025,模型名:deepseek-r1-14b(需与 config.json 中 modelName 一致)。
本机验证(在部署 MindIE 的服务器上执行):
1
2
3
curl -X POST 'http://192.168.1.214:1025/v1/chat/completions' \
-H 'Content-Type: application/json' \
-d '{"model":"deepseek-r1-14b","messages":[{"role":"user","content":"你好"}],"max_tokens":128,"temperature":0.6}'
四、参数说明
| 参数 | 说明 | 建议 |
|---|---|---|
model | 模型名称,需与 config.json 中 modelName 一致 | 必填 |
messages | 对话消息列表,格式同 OpenAI | 必填,总 token 需 ≤ 服务端 maxInputTokenLen |
max_tokens | 最大生成 token 数(仅控制输出) | 128–2048 |
temperature | 采样温度,0–1 | 0.5–0.7,推荐 0.6 |
top_p | 核采样参数 | 可选,如 0.95 |
DeepSeek-R1 建议:
temperature建议 0.5–0.7,避免重复;指令放在 user 消息中,不要使用 system prompt。
输入长度:接口无max_prompt_tokens等请求级截断参数,超长输入需在调用侧截断,或启用服务端truncation: true。
五、常见问题
5.1 FileNotFoundError: ‘npu-smi’
现象:启动时报错 [Errno 2] No such file or directory: 'npu-smi',ATB 在 is_support_lccl 中调用 npu-smi info -t topo 失败。
原因:容器内无 npu-smi,宿主机上常见路径为 /usr/local/sbin/npu-smi。
解决:启动容器时挂载 npu-smi:
1
-v /usr/local/sbin/npu-smi:/usr/local/bin/npu-smi
若宿主机路径不同,先执行 which npu-smi 确认,再按实际路径挂载到容器内 /usr/local/bin/npu-smi。
5.2 连接被拒绝
- 检查 MindIE 是否已启动:
docker exec mindie-ds-r1 ps aux | grep mindie - 确认端口:当前配置为 1025,服务监听
192.168.1.214:1025 - 检查防火墙:
firewall-cmd --list-ports或iptables是否放行 1025
5.3 模型加载失败
- 检查
modelWeightPath是否正确:ls /home/models/ds-r1-14b - 检查
npu-smi info是否识别到 NPU - 查看 MindIE 日志中的具体报错
5.4 返回 404 或 model 不存在
- 确认请求中的
model与config.json的modelName完全一致(大小写、下划线等)
5.5 容器内找不到配置文件
若挂载路径与镜像内不一致,可手动复制:
1
2
docker exec -it mindie-ds-r1 bash
cp /home/config.json /usr/local/Ascend/mindie/latest/mindie-service/conf/config.json
5.6 上游返回 424 / 输入 token 超限
现象:通过 One API、sqlbot 等代理调用时返回 Error code: 424,或 MindIE 日志提示:
1
Failed to enqueue inferRequest: This model's maximum input ids length cannot be greater than 2048, the input ids length is 5147
原因:请求的输入 token 数(messages + system prompt 等)超过 config.json 中的 maxInputTokenLen(默认 2048)。
解决方式:
| 方式 | 说明 |
|---|---|
| 模型侧 | 调大 maxInputTokenLen、maxSeqLen(见下) |
| 模型侧 | 启用 truncation: true,由 MindIE 自动截断超长输入 |
| 调用侧 | 在发送前自行截断 messages(OpenAI API 无请求级截断参数) |
1. 模型侧:调大限制
在 /home/config.json 的 ModelDeployConfig 中:
1
2
"maxSeqLen" : 8192,
"maxInputTokenLen" : 8192,
14B 模型在 310P3 双卡上,8192 一般可支持;若显存不足可试 4096 或 6144。
1.1 一键修改(32B 模型):先查当前值,再备份并替换为 8192(显存不足可改为 4096 或 6144):
1
2
3
4
5
6
7
8
# 1. 查看当前值
grep -E '"(maxSeqLen|maxInputTokenLen)"' /home/config.json
# 2. 备份并修改
cp /home/config.json /home/config.json.bak.$(date +%Y%m%d_%H%M%S) && sed -i 's/"maxSeqLen"[[:space:]]*:[[:space:]]*[0-9]*/"maxSeqLen" : 8192/' /home/config.json && sed -i 's/"maxInputTokenLen"[[:space:]]*:[[:space:]]*[0-9]*/"maxInputTokenLen" : 8192/' /home/config.json && grep -E '"(maxSeqLen|maxInputTokenLen)"' /home/config.json
# 3. 查看修改差异(比较最新备份与当前文件)
diff $(ls -t /home/config.json.bak.* 2>/dev/null | head -1) /home/config.json
修改后需重启 MindIE 服务。
2. 模型侧:启用自动截断
在 ModelDeployConfig 中设置:
1
"truncation" : true
MindIE 会对超过 maxInputTokenLen 的输入自动截断,无需调大显存。修改后需重启 MindIE 服务。