昇腾 910B 多机环境 DeepSeek-V3/R1 671B 满血版部署指南
本文档将详细阐述基于物理机服务的 Deepseek-R1-671b 多机部署方案,基于 4 台 8 卡昇腾 910B GPU 物理机和 2 台 4 卡昇腾 910B GPU 物理机进行最佳实践,内容涵盖环境准备、服务启动与故障处理三个方面。
注意:4 台昇腾 910B 物理机服务器可以部署 DeepSeek-R1/V3 671B 版本,2 台昇腾 910B 物理机服务器可以部署 DeepSeek-R1/V3 671B W8A8 量化版本。
1. 准备工作
1.1 软硬件需求概览
- BF16版本部署:4台配备昇腾910B GPU的服务器
- W8A8量化版本部署:2台配备昇腾910B GPU的服务器
- 每台服务器推荐配置:
- CPU: 64核以上(实际测试环境:192核)
- 内存: 512GB以上(实际测试环境:2048GB)
- 存储: 2TB以上SSD存储(实际测试环境:4x3.2TB)
- 网络: 100Gbps RDMA网络互联(实际测试环境:25G网络)
软件要求:
组件 | 版本要求 | 备注 |
---|---|---|
MindIE | ≥2.0.T3 | 官网下载 |
Python 环境 | 3.11 | 镜像预置 |
MindStudio | Msit: br_noncom_MindStudio_8.0.0_POC_20251231分支 | |
HDK | 24.1.0 | |
CANN | ≥8.0.T63 | |
昇腾驱动 | ≥24.1.rc2 | 所有节点确认驱动版本一致 |
昇腾固件 | ≥7.5.0.1.129 | 所有节点确认固件版本一致 |
1.2 系统环境准备
1.2.1 开通物理机资源
在我们的实践中,我们申请了 Spader-AI 的 4 台裸金属云资源,具体配置为:
主机名 | 主机IP | CPU | NPU | 网络 | 内存 | 存储 |
---|---|---|---|---|---|---|
主机2 | 192.168.0.2 | 192核 | 8片 | 8×200G RoCE v2 | 2048GB | 4×3.2T NVMe |
主机3 | 192.168.1.3 | 192核 | 8片 | 8×200G RoCE v2 | 2048GB | 4×3.2T NVMe |
主机4 | 192.168.1.4 | 192核 | 8片 | 8×200G RoCE v2 | 2048GB | 4×3.2T NVMe |
主机5 | 192.168.1.5 | 192核 | 8片 | 8×200G RoCE v2 | 2048GB | 4×3.2T NVMe |
组件 | 版本/说明 |
---|---|
操作系统 | Ubuntu 22.04 64位 for ARM |
内核版本 | 5.15.0-118-generic (2024-07-05) |
1.2.2 初始化系统
连接到服务器后,执行以下命令完成系统初始化:
# 更新系统
sudo apt update && sudo apt upgrade -y
# 设置系统参数
sudo bash -c 'cat >> /etc/sysctl.conf << EOF
net.core.rmem_max=26214400
net.core.wmem_max=26214400
net.ipv4.tcp_rmem=4096 87380 26214400
net.ipv4.tcp_wmem=4096 65536 26214400
EOF'
sudo sysctl -p
# 设置用户限制
sudo bash -c 'cat >> /etc/security/limits.conf << EOF
* soft nofile 1048576
* hard nofile 1048576
* soft memlock unlimited
* hard memlock unlimited
EOF'
1.2.3 安装依赖
# 安装基本工具
sudo apt update && sudo apt install -y ca-certificates curl gnupg \
lsb-release build-essential cmake git wget vim htop iotop
# 安装Python环境
sudo apt install -y python3-dev python3-pip
pip3 install -U pip
# 安装必要的Python包
pip3 install numpy scipy pandas scikit-learn matplotlib torch \
torchvision
1.2.4 安装Docker
使用阿里云镜像安装Docker可以加速下载过程:
# 安装Docker依赖
sudo apt install -y apt-transport-https ca-certificates curl \
software-properties-common gnupg
# 添加阿里云Docker镜像仓库证书
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg |\
sudo gpg --dearmor -o /etc/apt/keyrings/aliyun-docker.gpg
# 添加Docker仓库
echo \
"deb [arch=$(dpkg --print-architecture) \
signed-by=/etc/apt/keyrings/aliyun-docker.gpg] \
https://mirrors.aliyun.com/docker-ce/linux/ubuntu \
$(lsb_release -cs) stable" | sudo \
tee /etc/apt/sources.list.d/docker.list > /dev/null
# 安装Docker
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io
# 启动Docker服务
sudo systemctl enable docker
sudo systemctl start docker
2. 昇腾环境配置
2.1 检查驱动和固件版本
在实际部署过程中,我们首先需要检查当前系统的驱动和固件版本:
# 查看当前驱动和固件版本
for i in {0..7}; do \
npu-smi info -t board -i $i | grep Version; \
done
输出结果示例:
Software Version : x.x.x.x # 驱动版本
Firmware Version : x.x.x.x # 固件版本
检查相关版本是否符合 1.1 节中提到的版本要求, 如果符合,则可以跳过 2.2 步骤,否则需要下载和安装最新版本的驱动和固件。
- 驱动版本 >= 24.1.rc3
- 固件版本 >= 7.5.0.1.129
2.2 驱动和固件升级
2.2.1 注意事项
⚠️ 重要提示: 驱动和固件升级是关键步骤,错误操作可能导致设备不可用
请用户详细阅读官方的 升级前必读 文档,根据文档说明进行升级
注意事项:
- 升级分为
deb
包、rpm
包、run
包,可根据官方文档选择合适的安装包格式 - 安装顺序:
- 首次安装: 驱动 → 固件
- 覆盖安装或升级: 固件 → 驱动
- 升级后是否需要重启,请仔细阅读相关文档
- 升级完成后必须检查版本确认升级成功
2.2.2 固件以及驱动下载地址
昇腾 910B 固件以及驱动下载地址: https://www.hiascend.com/hardware/firmware-drivers/community?product=4&model=32&cann=8.0.0.alpha002&driver=1.0.RC2
运行 DeepSeek-R1/DeepSeek-V3 模型需要下载的固件以及驱动包:
文件名 | 类型 | 发布时间 | 说明 | 大小 |
---|---|---|---|---|
Ascend-hdk-910b-npu-firmware_7.5.0.1.129.run | NPU | 2024/09/29 | 昇腾固件带内升级包 | 273.18KB |
Ascend-hdk-910b-npu-driver_24.1.rc3_linux-aarch64.run | NPU | 2024/09/29 | 昇腾ARM架构驱动包 | 118.66MB |
备注 :本次此次为升级,因此需要按照"固件->驱动"的顺序来处理,安装包格式确认为 run 包。
2.2.3 固件升级
固件升级包为 Ascend-hdk-910b-npu-firmware_7.5.0.1.129.run
# 增加执行权限
chmod +x Ascend-hdk-910b-npu-firmware_7.5.0.1.129.run
# 校验文件完整性
./Ascend-hdk-910b-npu-firmware_7.5.0.1.129.run --check
# 升级固件
sudo ./Ascend-hdk-910b-npu-firmware_7.5.0.1.129.run --upgrade
若系统出现如下关键回显信息,表示升级成功。
Firmware package upgraded successfully!
备注:因为接下来会升级配套版本的驱动,因此无需重启系统,驱动升级后固件版本会自动生效。
2.2.4 驱动安装
驱动安装包为 Ascend-hdk-910b-npu-driver_24.1.rc3_linux-aarch64.run
# 增加执行权限
chmod +x Ascend-hdk-910b-npu-driver_24.1.rc3_linux-aarch64.run
# 校验文件完整性
./Ascend-hdk-910b-npu-driver_24.1.rc3_linux-aarch64.run --check
# 安装驱动
sudo ./Ascend-hdk-910b-npu-driver_24.1.rc3_linux-aarch64.run \
--upgrade
若系统出现如下关键回显信息,表示升级成功。
Firmware package upgraded successfully!
执行如下命令,检查升级后的版本号。
/usr/local/Ascend/driver/tools/upgrade-tool --device_index -1 \
--system_version
2.3 容器准备
昇腾官方针对 DeepSeek-R1-671b / DeepSeek-R1-671b W8A8 量化版有可以直接部署的镜像,可前往昇腾社区/开发资源下载适配。
备注:镜像需要申请方可下载。普通用户按要求填写申请即可,通常需要 2-4 个小时通过审核。
下载地址: https://www.hiascend.com/developer/ascendhub/detail/af85b724a7e5469ebd7ea13c3439d48f
注意:量化版本(DeepSeek-R1-W8A8、DeepSeek-V3-W8A8)需要使用mindie:2.0.T3版本
镜像申请通过后,即可下载。
镜像拉取:
docker pull swr.cn-south-1.myhuaweicloud.com/ascendhub/mindie:2.0.T3-800I-A2-py311-openeuler24.03-lts
备注:弹出的拉取信息会在 6 小时后过期,请及时拉取。
完成之后,请使用docker images命令确认查找具体镜像名称与标签。
3. 模型权重准备
3.1 权重 下载
DeepSeek-R1/DeepSeek-V3 的模型权重有如下下载形式:
- 官方渠道:通过 HuggingFace 下载 a. DeepSeek-R1:https://huggingface.co/deepseek-ai/DeepSeek-R1 b. DeepSeek-V3:https://huggingface.co/deepseek-ai/DeepSeek-V3
- 魔乐社区:通过 魔乐社区 下载 a. DeepSeek-R1:https://modelers.cn/models/State_Cloud/DeepSeek-R1-origin b. DeepSeek-V3:https://modelers.cn/models/State_Cloud/DeepSeek-V3-origin c. DeepSeek-R1-W8A8:https://modelers.cn/models/State_Cloud/DeepSeek-R1-W8A8 d. DeepSeek-V3-W8A8:https://modelers.cn/models/State_Cloud/DeepSeek-V3-W8A8
国内推荐通过魔乐社区下载,下载速度可以达到 50M/s 以上。详细信息可以参考:
https://modelers.cn/updates/zh/modelers/20250213-deepseek%E6%9D%83%E9%87%8D%E4%B8%8B%E8%BD%BD/
3.2 下载和准备模 型
存储空间需求:
- DeepSeek-R1 模型的
FP8
原始权重文件大小约为 700GB - 转换为昇腾 910B 支持的
BF16
类型后,约 1.4TB - 总计需要至少 2.1TB 以上的存储空间
魔乐社区支持 openmind_hub
下载和 Git
下载两种方式
本次采用 openmind_hub
方式下载,下载脚本如下:
#!/usr/bin/env python3
import os
from openmind_hub import snapshot_download
snapshot_download(
repo_id="State_Cloud/DeepSeek-R1-origin",
local_dir="/data/models/deepseek-r1",
local_dir_use_symlinks=False,
)
⚠️ 重要: 运行前必须通过环境变量设定敏感路径白名单 HUB_WHITE_LIST_PATHS
,指定模型下载路径:
export HUB_WHITE_LIST_PATHS="/data/models/deepseek-r1"
3.3 模型转换
昇腾 910B 需要 bfp8 类型模型,因此需要进行模型转换。
DeepSeek官方没有针对DeepSeek-R1提供新的权重转换脚本,需要复用 DeepSeek-V2 的权重转换脚本,执行下面命令进行权重转换。
# 克隆模型转换脚本
git clone https://gitee.com/ascend/ModelZoo-PyTorch.git
# 进入模型转换脚本目录
cd ModelZoo-PyTorch/MindIE/LLM/DeepSeek/DeepSeek-V2/NPU_inference
# 执行转换
# 其中 /data/models/deepseek-r1 表示DeepSeek-R1原始权重路径
#/data/models/deepseek-r1-bf16 表示权重转换后的新权重路径。
python fp8_cast_bf16.py \
--input-fp8-hf-path /data/models/deepseek-r1 \
--output-bf16-hf-path /data/models/deepseek-r1-bf16
注意⚠️:
- 模型转换时间较长,请提前确保好磁盘空间,避免中断。
- 转换脚本不会自动复制tokenizer等文件,需手动操作。
4. 多机部署
4.1 启动推理服务 Docker 容器
在每台服务器上执行以下命令启动Docker容器,模型权重需要放到容器的 /workspace
目录下,后期 mindie
推理服务会读取该路径下的模型权重。其它的挂载都是常规的驱动或者工具,按照要求挂载即可。
docker run -itd --privileged --name=deepseek-r1 --net=host \
--shm-size 500g \
--device=/dev/davinci0 \
--device=/dev/davinci1 \
--device=/dev/davinci2 \
--device=/dev/davinci3 \
--device=/dev/davinci4 \
--device=/dev/davinci5 \
--device=/dev/davinci6 \
--device=/dev/davinci7 \
--device=/dev/davinci_manager \
--device=/dev/hisi_hdc \
--device /dev/devmm_svm \
-v /usr/local/dcmi:/usr/local/dcmi \
-v /usr/bin/hccn_tool:/usr/bin/hccn_tool \
-v /usr/local/sbin:/usr/local/sbin \
-v /usr/local/sbin/npu-smi:/usr/local/sbin/npu-smi \
-v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
-v /usr/local/Ascend/firmware:/usr/local/Ascend/firmware \
-v /etc/hccn.conf:/etc/hccn.conf \
-v /data/models/deepseek-r1-bf16:/workspace \
swr.cn-south-1.myhuaweicloud.com/ascendhub/mindie:2.0.T3-800I-A2-py311-openeuler24.03-lts \
bash
备注:
/data/models/deepseek-r1-bf16
为转换后的模型权重路径。- 不要遗漏
--shm-size 500g
参数,否则后期启动mindie
推理服务会报错。 - 镜像版本为
swr.cn-south-1.myhuaweicloud.com/ascendhub/mindie:2.0.T3-800I-A2-py311-openeuler24.03-lts
,请根据实际情况选择合适的镜像版本。
4.2 推理服务准备
4.2.1 推理服务容器检查
多机部署推理前,需要在每台机器的推理服务 Docker 容器内执行以下命令检查网络配置。出现问题时,可以先排查下本机是否正常,容器内问题一般都是相关目录没有挂载好。
# 检查物理链接
for i in {0..7}; do hccn_tool -i $i -lldp -g | grep Ifname; done
# 输出结果示例:
Ifname: 200GE1/0/9
Ifname: 200GE1/0/10
Ifname: 200GE1/0/11
Ifname: 200GE1/0/12
Ifname: 200GE1/0/13
Ifname: 200GE1/0/14
Ifname: 200GE1/0/15
Ifname: 200GE1/0/16
# 检查链接情况
for i in {0..7}; do hccn_tool -i $i -link -g ; done
# 输出结果示例:
link status: UP
link status: UP
link status: UP
link status: UP
link status: UP
link status: UP
link status: UP
link status: UP
# 检查网络健康情况
for i in {0..7}; do hccn_tool -i $i -net_health -g ; done
# 输出结果示例:
net health status: Success
net health status: Success
net health status: Success
net health status: Success
net health status: Success
net health status: Success
net health status: Success
net health status: Success
# 查看侦测ip的配置是否正确
for i in {0..7}; do hccn_tool -i $i -netdetect -g ; done
# 输出结果示例:
netdetect address: 10.52.27.1
netdetect address: 10.52.27.1
netdetect address: 10.52.27.1
netdetect address: 10.52.27.1
netdetect address: 10.52.27.1
netdetect address: 10.52.27.1
netdetect address: 10.52.27.1
# 查看网关是否配置正确
for i in {0..7}; do hccn_tool -i $i -gateway -g ; done
# 输出结果示例:
default gateway:10.52.27.1, Iface:eth0
default gateway:10.52.27.1, Iface:eth1
default gateway:10.52.27.1, Iface:eth2
default gateway:10.52.27.1, Iface:eth3
default gateway:10.52.27.1, Iface:eth4
default gateway:10.52.27.1, Iface:eth5
default gateway:10.52.27.1, Iface:eth6
default gateway:10.52.27.1, Iface:eth7
# 检查NPU底层tls校验行为一致性,建议全0
for i in {0..7}; do hccn_tool -i $i -tls -g ; done | grep switch
# NPU底层tls校验行为置0操作
for i in {0..7};do hccn_tool -i $i -tls -s enable 0;done
4.2.2 配置多机多卡文件
确定容器内部网络正常后,我们需要为集群提供多机多卡的配置文件 rank_table_file.json
。这个配置文件在集群内各节点上需要保持一致,后续的MindIE推理框架也会参考此配置进行启动。
rank_table_file.json
名字可以更改,但是需要和 mindie
推理服务配置文件中的 rank_table_file
参数一致以及环境变量中的配置一致。
为了方便管理,我们将 rank_table_file.json
这个文件放在 3.2 模型转换后的模型目录 /data/models/deepseek-r1-bf16
下,避免在容器内编辑文件。
rank_table_file.json
配置文件需要了解集群的如下信息:
- server_count:一共使用几台服务器,即节点数。server_list中第一个server为主节点
- device_id:当前卡的本机编号,取值范围[0, 本机卡数)
- device_ip:当前卡的ip地址,可通过hccn_tool命令获取
- rank_id:当前卡在集群内的全局编号,取值范围[0, 总卡数)
- server_id:当前节点的ip地址
- container_ip:容器ip地址(服务化部署时需要),若无特殊配置,则与server_id相同
下面是基于现有环境的 4 机 32 卡的 rank_table_file.json
配置文件示例,其中 server_id: 192.168.0.2
为主节点。
{
"server_count": "4",
"server_list": [
{
"device": [
{"device_id": "0", "device_ip": "10.52.27.3", "rank_id": "0"},
{"device_id": "1", "device_ip": "10.52.27.2", "rank_id": "1"},
{"device_id": "2", "device_ip": "10.52.27.5", "rank_id": "2"},
{"device_id": "3", "device_ip": "10.52.27.4", "rank_id": "3"},
{"device_id": "4", "device_ip": "10.52.27.8", "rank_id": "4"},
{"device_id": "5", "device_ip": "10.52.27.9", "rank_id": "5"},
{"device_id": "6", "device_ip": "10.52.27.7", "rank_id": "6"},
{"device_id": "7", "device_ip": "10.52.27.6", "rank_id": "7"}
],
"server_id": "192.168.0.2",
"container_ip": "192.168.0.2"
},
{
"device": [
{"device_id": "0", "device_ip": "10.52.27.27", "rank_id": "8"},
{"device_id": "1", "device_ip": "10.52.27.26", "rank_id": "9"},
{"device_id": "2", "device_ip": "10.52.27.29", "rank_id": "10"},
{"device_id": "3", "device_ip": "10.52.27.28", "rank_id": "11"},
{"device_id": "4", "device_ip": "10.52.27.32", "rank_id": "12"},
{"device_id": "5", "device_ip": "10.52.27.33", "rank_id": "13"},
{"device_id": "6", "device_ip": "10.52.27.31", "rank_id": "14"},
{"device_id": "7", "device_ip": "10.52.27.30", "rank_id": "15"}
],
"server_id": "192.168.0.3",
"container_ip": "192.168.0.2"
},
{
"device": [
{"device_id": "0", "device_ip": "10.52.27.19", "rank_id": "16"},
{"device_id": "1", "device_ip": "10.52.27.18", "rank_id": "17"},
{"device_id": "2", "device_ip": "10.52.27.21", "rank_id": "18"},
{"device_id": "3", "device_ip": "10.52.27.20", "rank_id": "19"},
{"device_id": "4", "device_ip": "10.52.27.24", "rank_id": "20"},
{"device_id": "5", "device_ip": "10.52.27.25", "rank_id": "21"},
{"device_id": "6", "device_ip": "10.52.27.23", "rank_id": "22"},
{"device_id": "7", "device_ip": "10.52.27.22", "rank_id": "23"}
],
"server_id": "192.168.0.5",
"container_ip": "192.168.0.2"
},
{
"device": [
{"device_id": "0", "device_ip": "10.52.27.11", "rank_id": "24"},
{"device_id": "1", "device_ip": "10.52.27.10", "rank_id": "25"},
{"device_id": "2", "device_ip": "10.52.27.13", "rank_id": "26"},
{"device_id": "3", "device_ip": "10.52.27.12", "rank_id": "27"},
{"device_id": "4", "device_ip": "10.52.27.16", "rank_id": "28"},
{"device_id": "5", "device_ip": "10.52.27.17", "rank_id": "29"},
{"device_id": "6", "device_ip": "10.52.27.15", "rank_id": "30"},
{"device_id": "7", "device_ip": "10.52.27.14", "rank_id": "31"}
],
"server_id": "192.168.0.4",
"container_ip": "192.168.0.2"
}
],
"status": "completed",
"version": "1.0"
}
最后,不要忘了设置rank_table_file.json文件的权限
chmod 640 rank_table_file.json
4.3 启动推理服务
4.3.1 配置推理服务环境变量
在每个容器内执行以下命令配置推理服务环境变量, 其中 MIES_CONTAINER_IP
需要根据实际情况修改:
# 设置环境变量
export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True
# MIES_CONTAINER_IP 当前容器的ip地址,根据实际情况修改
export MIES_CONTAINER_IP=192.168.0.2
export RANKTABLEFILE=/workspace/rank_table_file.json
export OMP_NUM_THREADS=1
export NPU_MEMORY_FRACTION=0.95
# HCCL相关环境变量(解决网络超时问题)
export HCCL_DETERMINISTIC=false
export HCCL_OP_EXPANSION_MODE="AIV"
# 日志相关环境变量
export ATB_LOG_LEVEL=ERROR
export ATB_LOG_TO_STDOUT=1
export ATB_LOG_TO_FILE=1
export ASDOPS_LOG_LEVEL=ERROR
export ASDOPS_LOG_TO_STDOUT=1
export ASDOPS_LOG_TO_FILE=1
注意:
- 当前容器的ip地址需要根据实际情况填写,由于是使用的 host 网络,填写的是 192.168.0.2
- rank_table_file.json 文件路径需要根据实际情况填写
- WORLD_SIZE 指的是集群的卡的数量,集群为 4 机 32 卡,此处为 32
- NPU_MEMORY_FRACTION 指的是当前卡的内存使用比例,一般设置为 0.95
4.3.2 修改推理参数配置
启动 MindIE 之前,还需要对 MindIE 的推理服务进行配置,配置文件位于容器内,集群中的每一个容器都要做一样的配置。
在容 器内的路径为 /usr/local/Ascend/mindie/latest/mindie-service/conf/config.json
。
{
"Version" : "1.0.0",
"LogConfig" :
{
"logLevel" : "Info",
"logFileSize" : 20,
"logFileNum" : 20,
"logPath" : "logs/mindie-server.log"
},
"ServerConfig" :
{
"ipAddress" : "192.168.0.2",
"managementIpAddress" : "192.168.0.2",
"port" : 1025,
"managementPort" : 1026,
"metricsPort" : 1027,
"allowAllZeroIpListening" : false,
"maxLinkNum" : 300,
"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" : false,
"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" : 1,
"npuDeviceIds" : [[0,1,2,3,4,5,6,7]],
"tokenizerProcessNumber" : 8,
"multiNodesInferEnabled" : true,
"multiNodesInferPort" : 1120,
"interNodeTLSEnabled" : false,
"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" : 10000,
"maxInputTokenLen" : 2048,
"truncation" : true,
"ModelConfig" : [
{
"modelInstanceType" : "Standard",
"modelName" : "deepseekr1",
"modelWeightPath" : "/workspace/",
"worldSize" : 8,
"cpuMemSize" : 5,
"npuMemSize" : -1,
"backendType" : "atb",
"trustRemoteCode" : false
}
]
},
"ScheduleConfig" :
{
"templateType" : "Standard",
"templateName" : "Standard_LLM",
"cacheBlockSize" : 128,
"maxPrefillBatchSize" : 8,
"maxPrefillTokens" : 2048,
"prefillTimeMsPerReq" : 150,
"prefillPolicyType" : 0,
"decodeTimeMsPerReq" : 50,
"decodePolicyType" : 0,
"maxBatchSize" : 8,
"maxIterTimes" : 1024,
"maxPreemptCount" : 0,
"supportSelectBatch" : false,
"maxQueueDelayMicroseconds" : 5000
}
}
}
开启多机推理,需要设置ipAddress为主节点IP并调整显存参数:
{
"multiNodesInferEnabled": true,
"maxSeqLen": 32000,
"maxBatchSize": 32,
"modelWeightPath": "/data/models/deepseek-r1-bf16/"
}
注意:
- ipAddress 需要根据实际情况填写,当前为 192.168.0.2
- 显存参数需要根据实际情况填写,当前为 32
- 模型权重路径需要根据实际情况填写,当前为
/data/models/deepseek-r1-bf16/
- 多机推理场景下
npuDeviceIds
会被覆盖,因此只需要保证数量能够与本机匹配不影响启动即可。
4.3.3 启动推理服务
在每个容器内都执行以下命令启动推理服务:
cd /usr/local/Ascend/mindie/latest/mindie-service
./bin/mindieservice_daemon
运行命令后,各节点首先读取配置文件,由主节点下发配置绑定 CPU,然后各节点启动推理服务,当所有节点都启动完毕后,出现 Daemon start success!
即表示启动成功。
从节点日志输出样例:
# cd /usr/local/Ascend/mindie/latest/mindie-service
# ./bin/mindieservice_daemon
Start to parse ranktable file
Finished parsing ranktable file.
Update worldSize and npuDeviceIds of backend config successfully
for Multi Nodes Inference.
[2025-02-26 16:36:06,357] [501] [281472443609440] [llm] [INFO]
[cpu_binding.py-212] : rank_id: 1, device_id: 1, numa_id: 0,
shard_devices: [1, 3], cpus: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23]
...
[2025-02-26 16:36:06,998] [536] [281471900381536] [llm] [INFO]
[cpu_binding.py-238] : process 536, new_affinity is [108, 109,
110, 111, 112, 113, 114, 115, 116, 117, 118, 119], cpu count 12
[2025-02-26 16:36:16,652] [501] [281472443609440] [llm] [INFO]
[dist.py-81] : initialize_distributed has been Set
[2025-02-26 16:36:16,652] [522] [281472149680480] [llm] [INFO]
[dist.py-81] : initialize_distributed has been Set
[2025-02-26 16:36:16,651] [499] [281471688372576] [llm] [INFO]
[dist.py-81] : initialize_distributed has been Set
[2025-02-26 16:36:17,029] [529] [281472118354272] [llm] [INFO]
[dist.py-81] : initialize_distributed has been Set
[2025-02-26 16:36:17,033] [543] [281472141226336] [llm] [INFO]
[dist.py-81] : initialize_distributed has been Set
[2025-02-26 16:36:17,897] [515] [281472854192480] [llm] [INFO]
[dist.py-81] : initialize_distributed has been Set
[2025-02-26 16:36:18,068] [536] [281471900381536] [llm] [INFO]
[dist.py-81] : initialize_distributed has been Set
[2025-02-26 16:36:18,260] [508] [281472308867424] [llm] [INFO]
[dist.py-81] : initialize_distributed has been Set
Daemon start success!
主节点除了会输出以上从节点的日志内容之外,还会输出模型相关信息。
一般启动需要等待 10 分钟以上,出现 Daemon start success!
后,即可测试推理服务。
4.4 测试推理服务
使用 curl测试服务响应:
curl -X POST http://{ip}:{port}/v1/chat/completions \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"model": "deepseekr1",
"messages": [{
"role": "user",
"content": "你好"
}],
"max_tokens": 20,
"presence_penalty": 1.03,
"frequency_penalty": 1.0,
"seed": null,
"temperature": 0.5,
"top_p": 0.95,
"stream": true
}'
注意:
- model 需要根据 4.3.2 配置文件中的
modelName
填写 - ip 需要根据 4.3.2 配置文件中的
ipAddress
填写 - port 需要根据 4.3.2 配置文件中的
port
填写
以上能看到输出,就算是部署成功了。至此,DeepSeek-V3/R1 671B 满血版部署已完成。
5 常见错误
5.1 权限错误 Check path: config.json failed, by:owner id diff
错误现象:
# ./bin/mindieservice_daemon
Check path: config.json failed, by:owner id diff: current process
user id is 0, file owner id is 1001
Failed to check config.json under model weight path.
ERR: Failed to init endpoint! Please check the service log or
console output.
Killed
关于 owner 和 group 的配置需要和镜像匹配,在我们的容器环境下要改成 root:root。
解决方案: 模型的权重配置文件是通过命令挂载到容器中的,所以需要在外部节点上运行以下命令。
chown -R root:root /data/models/deepseek-r1-bf16/
5.2 未设置环境变量 LLMInferEngine failed to init LLMInferModels
错误现象:
# ./bin/mindieservice_daemon
LLMInferEngine failed to init LLMInferModels
ERR: Failed to init endpoint! Please check the service log or
console output.
Killed
没有设置正确的环境变量
解决方案:
在启动 ./bin/mindieservice_daemon
之前,参考 4.3 节设置正确的环境变量。