华为昇腾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-14BDeepSeek 专区

二、部署步骤

步骤 0:模型下载(如未准备)

模型目录路径无强制要求,在 config.jsonmodelWeightPath 中配置为实际存放路径即可。推荐使用华为昇腾官方提供的 MindIE 适配模型,可从以下渠道获取:

来源 链接
DeepSeek-R1 14B 官方模型页(权重与镜像) ModelZoo DeepSeek-R1-Distill-Qwen-14B
MindIE 模型支持与下载说明 MindIE 模型支持列表
昇腾 AscendHub 镜像与模型 AscendHubMindIE 镜像详情

下载后按 MindIE 说明解压到目标目录,并在 config.json 中设置 modelWeightPath 指向该目录。

步骤 1:确认模型与配置

# 确认模型目录存在
ls -la /home/models/ds-r1-14b

# 查看配置文件
cat /home/config.json

确保 config.jsonmodelWeightPath 指向 /home/models/ds-r1-14b,且 modelNamenpuDeviceIdsworldSize 等参数正确。

步骤 2:停止并清理旧容器(如有)

docker ps -a | grep mindie
docker stop <容器名>   # 若存在
docker rm <容器名>

步骤 3:启动 MindIE 容器

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(宿主机或容器内执行):

# 查看 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 目录:

-v /home:/home

并在启动服务前,将 /home/config.json 复制到 MindIE 的 conf 目录。

步骤 4:进入容器并加载环境

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:确认配置文件

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 服务

cd /usr/local/Ascend/mindie/latest/mindie-service
# 确保 PATH 含 npu-smi(见步骤 4)
./bin/mindieservice_daemon

另开终端监控 NPU 使用情况:

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.jsonmodelName 一致)。

本机验证(在部署 MindIE 的服务器上执行):

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.jsonmodelName 一致 必填
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:

-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-portsiptables 是否放行 1025

5.3 模型加载失败

  • 检查 modelWeightPath 是否正确:ls /home/models/ds-r1-14b
  • 检查 npu-smi info 是否识别到 NPU
  • 查看 MindIE 日志中的具体报错

5.4 返回 404 或 model 不存在

  • 确认请求中的 modelconfig.jsonmodelName 完全一致(大小写、下划线等)

5.5 容器内找不到配置文件

若挂载路径与镜像内不一致,可手动复制:

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 日志提示:

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)。

解决方式

方式 说明
模型侧 调大 maxInputTokenLenmaxSeqLen(见下)
模型侧 启用 truncation: true,由 MindIE 自动截断超长输入
调用侧 在发送前自行截断 messages(OpenAI API 无请求级截断参数)

1. 模型侧:调大限制

/home/config.jsonModelDeployConfig 中:

"maxSeqLen" : 8192,
"maxInputTokenLen" : 8192,

14B 模型在 310P3 双卡上,8192 一般可支持;若显存不足可试 4096 或 6144。

1.1 一键修改(32B 模型):先查当前值,再备份并替换为 8192(显存不足可改为 4096 或 6144):

# 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 中设置:

"truncation" : true

MindIE 会对超过 maxInputTokenLen 的输入自动截断,无需调大显存。修改后需重启 MindIE 服务。


六、参考链接

华为昇腾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-14BDeepSeek 专区

二、部署步骤

步骤 0:模型下载(如未准备)

模型目录路径无强制要求,在 config.jsonmodelWeightPath 中配置为实际存放路径即可。推荐使用华为昇腾官方提供的 MindIE 适配模型,可从以下渠道获取:

来源 链接
DeepSeek-R1 14B 官方模型页(权重与镜像) ModelZoo DeepSeek-R1-Distill-Qwen-14B
MindIE 模型支持与下载说明 MindIE 模型支持列表
昇腾 AscendHub 镜像与模型 AscendHubMindIE 镜像详情

下载后按 MindIE 说明解压到目标目录,并在 config.json 中设置 modelWeightPath 指向该目录。

步骤 1:确认模型与配置

# 确认模型目录存在
ls -la /home/models/ds-r1-14b

# 查看配置文件
cat /home/config.json

确保 config.jsonmodelWeightPath 指向 /home/models/ds-r1-14b,且 modelNamenpuDeviceIdsworldSize 等参数正确。

步骤 2:停止并清理旧容器(如有)

docker ps -a | grep mindie
docker stop <容器名>   # 若存在
docker rm <容器名>

步骤 3:启动 MindIE 容器

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(宿主机或容器内执行):

# 查看 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 目录:

-v /home:/home

并在启动服务前,将 /home/config.json 复制到 MindIE 的 conf 目录。

步骤 4:进入容器并加载环境

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:确认配置文件

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 服务

cd /usr/local/Ascend/mindie/latest/mindie-service
# 确保 PATH 含 npu-smi(见步骤 4)
./bin/mindieservice_daemon

另开终端监控 NPU 使用情况:

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.jsonmodelName 一致)。

本机验证(在部署 MindIE 的服务器上执行):

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.jsonmodelName 一致 必填
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:

-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-portsiptables 是否放行 1025

5.3 模型加载失败

  • 检查 modelWeightPath 是否正确:ls /home/models/ds-r1-14b
  • 检查 npu-smi info 是否识别到 NPU
  • 查看 MindIE 日志中的具体报错

5.4 返回 404 或 model 不存在

  • 确认请求中的 modelconfig.jsonmodelName 完全一致(大小写、下划线等)

5.5 容器内找不到配置文件

若挂载路径与镜像内不一致,可手动复制:

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 日志提示:

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)。

解决方式

方式 说明
模型侧 调大 maxInputTokenLenmaxSeqLen(见下)
模型侧 启用 truncation: true,由 MindIE 自动截断超长输入
调用侧 在发送前自行截断 messages(OpenAI API 无请求级截断参数)

1. 模型侧:调大限制

/home/config.jsonModelDeployConfig 中:

"maxSeqLen" : 8192,
"maxInputTokenLen" : 8192,

14B 模型在 310P3 双卡上,8192 一般可支持;若显存不足可试 4096 或 6144。

1.1 一键修改(32B 模型):先查当前值,再备份并替换为 8192(显存不足可改为 4096 或 6144):

# 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 中设置:

"truncation" : true

MindIE 会对超过 maxInputTokenLen 的输入自动截断,无需调大显存。修改后需重启 MindIE 服务。


六、参考链接

Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐