华为昇腾DeepSeek模型部署

华为昇腾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:确认模型与配置

bash 复制代码
# 确认模型目录存在
ls -la /home/models/ds-r1-14b

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

确保 config.json 中 modelWeightPath 指向 /home/models/ds-r1-14b,且 modelName、npuDeviceIds、worldSize 等参数正确。

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

bash 复制代码
docker ps -a | grep mindie
docker stop <容器名>   # 若存在
docker rm <容器名>

步骤 3:启动 MindIE 容器

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

bash 复制代码
# 查看 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 目录:

bash 复制代码
-v /home:/home

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

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

bash 复制代码
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:确认配置文件

bash 复制代码
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 服务

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

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

bash 复制代码
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 的服务器上执行):

bash 复制代码
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:

bash 复制代码
-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 容器内找不到配置文件

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

bash 复制代码
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)。

解决方式:

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

1. 模型侧:调大限制

在 /home/config.json 的 ModelDeployConfig 中:

json 复制代码
"maxSeqLen" : 8192,
"maxInputTokenLen" : 8192,

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

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

bash 复制代码
# 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 中设置:

json 复制代码
"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-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:确认模型与配置

bash 复制代码
# 确认模型目录存在
ls -la /home/models/ds-r1-14b

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

确保 config.json 中 modelWeightPath 指向 /home/models/ds-r1-14b,且 modelName、npuDeviceIds、worldSize 等参数正确。

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

bash 复制代码
docker ps -a | grep mindie
docker stop <容器名>   # 若存在
docker rm <容器名>

步骤 3:启动 MindIE 容器

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

bash 复制代码
# 查看 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 目录:

bash 复制代码
-v /home:/home

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

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

bash 复制代码
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:确认配置文件

bash 复制代码
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 服务

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

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

bash 复制代码
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 的服务器上执行):

bash 复制代码
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:

bash 复制代码
-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 容器内找不到配置文件

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

bash 复制代码
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)。

解决方式:

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

1. 模型侧:调大限制

在 /home/config.json 的 ModelDeployConfig 中:

json 复制代码
"maxSeqLen" : 8192,
"maxInputTokenLen" : 8192,

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

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

bash 复制代码
# 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 中设置:

json 复制代码
"truncation" : true

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


六、参考链接

相关推荐
小易老师AI实战12 小时前
多模型融合实战:大模型+轻量小模型混合部署
vllm·大模型部署·模型路由·多模型融合·llm工程化·ai降本增效
程序员龙一18 小时前
VsCode+ClaudeCode+Deepseek的配置
vscode·claude·deepseek·vibecoding
小贺儿开发21 小时前
DeepSeek + Codex + MCP:Unity 游戏开发实测
科技·游戏·unity·ai·程序员·编程·deepseek
月走乂山1 天前
DSH 桌面版用 DeepSeek 报 REQUEST_EXTENSION 的根因定位与修复
electron·node.js·插件系统·deepseek·bug排查·dsh·deepseek harness
Jarming2 天前
infinite-creation本地AI短剧带货项目推荐-本地运行无费用0负担
agent·qwen·skill·minimax·deepseek·skills·agent-skills·minimax-h3
昇腾CANN2 天前
开发者说直播预告|10月13日19:00 社区任务开发经验分享
人工智能·昇腾·cann
死磕音视频2 天前
自己搭一个“私人版 ChatGPT“:Open WebUI 一条命令部署 + 接入本地/云端模型保姆级教程
docker·开源·open webui·大模型部署
论文复现现场2 天前
DeepSeek V4.1 Flash 各平台价格怎么比?缓存、峰谷计费与 Python 成本计算
开发语言·python·缓存·大模型·成本优化·deepseek
我才是银古3 天前
DeepSeek Harness 插件生态解析
插件·deepseek·dsh
feasibility.3 天前
“美版DeepSeek”等海外开放模型,能夺回生态入口吗?——中国开放权重领先下的2026全球AI分水岭
人工智能·开源·大模型·llm·minimax·deepseek·beam