slug: 2025-04-17-deepseek-r1-671b-deployment-guide
title: 昇腾 910B 多机环境 DeepSeek-V3/R1 671B 满血版部署指南
tags: [deployment-guide, deepseek, inference]

在这里插入图片描述

本文档将详细阐述基于物理机服务的 Deepseek-R1-671b 多机部署方案,基于 4 台 8 卡昇腾 910B GPU 物理机和 2 台 8 卡昇腾 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 开通物理机资源

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

主机名 主机IP CPU NPU 网络 内存 存储
主机2 192.168.0.2 192核 8片 8×200G RoCE v2 2048GB 4×3.2T NVMe
主机3 192.168.0.3 192核 8片 8×200G RoCE v2 2048GB 4×3.2T NVMe
主机4 192.168.0.4 192核 8片 8×200G RoCE v2 2048GB 4×3.2T NVMe
主机5 192.168.0.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 注意事项

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

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

注意事项:

  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.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 的模型权重有如下下载形式:

  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

附录:资源与参考


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

如果您对高性价比算力、大模型训练训练及推理以及相关业务场景的技术感兴趣,或者对本篇分享中提到的某些观点有自己的见解希望讨论,扫码秒加 SpaderMan 客服,SpaderMan 会带您入群,和各领域技术大佬共同探讨最前沿的 AI 技术。

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐