Skip to main content

昇腾 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镜像预置
MindStudioMsit: br_noncom_MindStudio_8.0.0_POC_20251231分支
HDK24.1.0
CANN≥8.0.T63
昇腾驱动≥24.1.rc2所有节点确认驱动版本一致
昇腾固件≥7.5.0.1.129所有节点确认固件版本一致

1.2 系统环境准备

1.2.1 开通物理机资源

在我们的实践中,我们申请了 Spader-AI 的 4 台裸金属云资源,具体配置为:

主机名主机IPCPUNPU网络内存存储
主机2192.168.0.2192核8片8×200G RoCE v22048GB4×3.2T NVMe
主机3192.168.1.3192核8片8×200G RoCE v22048GB4×3.2T NVMe
主机4192.168.1.4192核8片8×200G RoCE v22048GB4×3.2T NVMe
主机5192.168.1.5192核8片8×200G RoCE v22048GB4×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 注意事项

⚠️ 重要提示: 驱动和固件升级是关键步骤,错误操作可能导致设备不可用

请用户详细阅读官方的 升级前必读 文档,根据文档说明进行升级

注意事项:

  1. 升级分为 deb 包、rpm 包、run 包,可根据官方文档选择合适的安装包格式
  2. 安装顺序:
    • 首次安装: 驱动 → 固件
    • 覆盖安装或升级: 固件 → 驱动
  3. 升级后是否需要重启,请仔细阅读相关文档
  4. 升级完成后必须检查版本确认升级成功

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.runNPU2024/09/29昇腾固件带内升级包273.18KB
Ascend-hdk-910b-npu-driver_24.1.rc3_linux-aarch64.runNPU2024/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 的模型权重有如下下载形式:

  1. 官方渠道:通过 HuggingFace 下载 a. DeepSeek-R1:https://huggingface.co/deepseek-ai/DeepSeek-R1 b. DeepSeek-V3:https://huggingface.co/deepseek-ai/DeepSeek-V3
  2. 魔乐社区:通过 魔乐社区 下载 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

注意⚠️:

  1. 模型转换时间较长,请提前确保好磁盘空间,避免中断。
  2. 转换脚本不会自动复制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

备注:

  1. /data/models/deepseek-r1-bf16 为转换后的模型权重路径。
  2. 不要遗漏 --shm-size 500g 参数,否则后期启动mindie推理服务会报错。
  3. 镜像版本为 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

注意:

  1. 当前容器的ip地址需要根据实际情况填写,由于是使用的 host 网络,填写的是 192.168.0.2
  2. rank_table_file.json 文件路径需要根据实际情况填写
  3. WORLD_SIZE 指的是集群的卡的数量,集群为 4 机 32 卡,此处为 32
  4. 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/"
}

注意:

  1. ipAddress 需要根据实际情况填写,当前为 192.168.0.2
  2. 显存参数需要根据实际情况填写,当前为 32
  3. 模型权重路径需要根据实际情况填写,当前为 /data/models/deepseek-r1-bf16/
  4. 多机推理场景下 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
}'

注意:

  1. model 需要根据 4.3.2 配置文件中的 modelName 填写
  2. ip 需要根据 4.3.2 配置文件中的 ipAddress 填写
  3. 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 节设置正确的环境变量。

5.3 rank_table_file.json 配置错误的 worldSize

错误现象:

# ./bin/mindieservice_daemon
the size of npuDeviceIds (subset) does not equal to worldSize
ERR: Failed to init endpoint! Please check the service log or
console output.
Killed

错误原因: 在多节点推理情况下,配置中的 npuDeviceIdsworldSize 都会被忽略。

解决方案: npuDeviceIdsworldSize 需要按照本机的情况进行配置,例如单机 8 卡的配置下, worldSize 需要配置为 8,npuDeviceIds 配置为 [0,1,2,3,4,5,6,7]。

5.4 各节点 rank_table_file.json 配置文件不一致

错误信息:

# ./bin/mindieservice_daemon
Start to parse ranktable file
Finished parsing ranktable file.
Update worldSize and npuDeviceIds of backend config successfully
for Multi Nodes Inference.
npuDeviceID does not allow repetitive element
ERR: Failed to init endpoint! Please check the service log or
console output.
Killed

错误原因: 各节点 rank_table_file.json 配置文件不一致,导致启动失败。

修复方法: 各节点 rank_table_file.json 配置文件保持一致。

5.5 配置问题:rank_table_file.json 中的server_idcontainer_ip填写

当 docker 启动容器使用 host 模式时: rank_table_file.json 中的server_idcontainer_ip 均填写成主机IP,注意容器开放的端口不要和主机冲突。

5.6 通信错误:hccl execute failed

问题现象: 日志显示NPU设备(IP地址10.52.27.11)与NPU设备(IP地址10.52.27.3)之间connection fail 出现如下网络超时错误:

[ERROR] HCCL(127,mindie_llm_backend_connector):
2025-02-27-19:20:33.904.720 [hccl_socket_manager.cc:580][3182] |
10.52.27.11(24) | 16666 | 10.52.27.3(0) | 0 | server | time out |

错误原因:

  1. 网络错误
  2. 性能瓶颈导致通信失败,可以增加超时时间
  3. 网络防火墙导致通信失败,可以查看各节点之间的网络连接情况

解决方案:

  1. 确保所有服务器之间的网络连接正常
  2. 添加以下环境变量:
export HCCL_DETERMINISTIC=false
export HCCL_OP_EXPANSION_MODE="AIV"
export HCCL_CONNECT_TIMEOUT=7200
export HCCL_EXEC_TIMEOUT=0
  1. 关闭防火墙,如果是云主机需要修改对应的安全组配置。

5.7 显存不足:NPU out of memory

问题现象:

Warm-up fail due to  out of memory error.

错误原因:

  1. 显存配置不足
  2. 模型权重过大

解决方案:

  1. 适当调高NPU_MEMORY_FRACTION环境变量(默认值为0.8)
  2. 适当调低mindie-service服务化配置文件config.json中maxSeqLen、maxInputTokenLen、maxPrefillBatchSize、maxPrefillTokens、maxBatchSize等参数。
export NPU_MEMORY_FRACTION=0.96
export PYTORCH_NPU_ALLOC_CONF=expandable segments:True

5.8 其他

由于控制台输出内容较少,遇到推理报错时,请打开日志环境变量,收集日志信息查看具体错误信息。

算子库日志|默认输出路径为"~/atb/log"

export ASDOPS_LOG_LEVEL = INFO
export ASDOPS_LOG_TO_FILE = 1

加速库日志|默认输出路径为"~/mindie/log/debug"

export ATB_LOG_LEVEL = INFO
export ATB_LOG_TO_FILE = 1

MindIE Service日志|默认输出路径为"~/mindie/log/debug"

export MINDIE_LOG_TO_FILE = 1
export MINDIE_LOG_TO_LEVEL = debug

CANN日志收集|默认输出路径为"~/ascend"

export ASCEND_GLOBAL_LOG_TO_LEVEL = 1

附录:资源与参考


免责声明:本文档提供的信息仅用于参考,具体部署可能需要根据您的实际环境进行调整。如有变更,请以最新官方文档为准。