新闻动态

上海交大超算队同学在昇腾910B上成功部署DeepSeek满血版模型!附完整部署文档!

开学第一周,上海交大超算队5位同学在网络信息中心教师和华为工程师的指导下,成功在昇腾910B服务器上部署了DeepSeek满血版模型,整理出一份完整的部署文档避坑指南。


文档以DeepSeek-V3-int8为例介绍部署流程,R1的部署流程与其类似,仅需在模型权重获取以及服务配置上做相应修改。


变量说明:

$SERVER_IP当前服务器IP

$OTHER_SERVER_IP:另一台服务器IP

$NETMASK子网掩码

$IPiiNPU设置的IP

$GATEWAY_IP网关IP


0.基础环境


2 * 昇腾Atlas 800T A2

openEuler 22.03 TLS

单台服务器的NPU最大显存容量为8 * 64 =512 GB,所以需要两台服务器才可以将模型int8权重全部加载。


1.获取权重


MODELERS社区提供DeepSeek全系列权重,包括V3int8量化版本、R1int8量化版本等,大家可以按需下载到/data目录下,详见 DeepSeek模型权重下载(https://modelers.cn/updates/zh/modelers/20250213-deepseek%E6%9D%83%E9%87%8D%E4%B8%8B%E8%BD%BD/)


2.添加用户组

groupadd HwHiAiUser
useradd -g HwHiAiUser -d /home/HwHiAiUser -m HwHiAiUser -s /bin/bash

昇腾的驱动安装依赖于这个特殊的用户,需要我们手动创建这个用户,否则驱动的安装会出现错误。


3.安装驱动


./Ascend-hdk-910b-npu-driver_24.1.0_linux-aarch64.run --full --install-for-all

./Ascend-hdk-910b-npu-firmware_7.5.0.3.220.run --full

测试安装命令 npu-smi info # 查看npu使用


4.安装docker


可以使用远程安装or离线安装

1)离线安装

tar -xvzf docker-26.1.4.tgz
chmod 755 -R docker
cp docker/* /usr/bin
chmod 750 docker.service 
cp docker.service /etc/systemd/system/
systemctl daemon reload
systemctl start docker

2)在线安装

dnf install net-tools -y
yum makecache
yum install -y make dkms gcc kernel-devel-$(uname -r) docker
systemctl start docker 

3)载入docker镜像

docker load mindie-2.0.t3.1.tar


5.NPU网络设置


1)配置NPU IP

hccn_tool -i 0 -ip -s address $IP0 netmask $NETMASK
hccn_tool -i 1 -ip -s address $IP1 netmask $NETMASK
hccn_tool -i 2 -ip -s address $IP2 netmask $NETMASK
hccn_tool -i 3 -ip -s address $IP3 netmask $NETMASK
hccn_tool -i 4 -ip -s address $IP4 netmask $NETMASK
hccn_tool -i 5 -ip -s address $IP5 netmask $NETMASK
hccn_tool -i 6 -ip -s address $IP6 netmask $NETMASK
hccn_tool -i 7 -ip -s address $IP7 netmask $NETMASK

查看IP hccn_tool -i-ip -g

 

2)配置网关与侦测IP

hccn_tool -i 0 -gateway -s gateway $GATEWAY_IP
hccn_tool -i 1 -gateway -s gateway $GATEWAY_IP
hccn_tool -i 2 -gateway -s gateway $GATEWAY_IP
hccn_tool -i 3 -gateway -s gateway $GATEWAY_IP
hccn_tool -i 4 -gateway -s gateway $GATEWAY_IP
hccn_tool -i 5 -gateway -s gateway $GATEWAY_IP
hccn_tool -i 6 -gateway -s gateway $GATEWAY_IP
hccn_tool -i 7 -gateway -s gateway $GATEWAY_IP

hccn_tool -i 0 -netdetect -s address $GATEWAY_IP
hccn_tool -i 1 -netdetect -s address $GATEWAY_IP
hccn_tool -i 2 -netdetect -s address $GATEWAY_IP
hccn_tool -i 3 -netdetect -s address $GATEWAY_IP
hccn_tool -i 4 -netdetect -s address $GATEWAY_IP
hccn_tool -i 5 -netdetect -s address $GATEWAY_IP
hccn_tool -i 6 -netdetect -s address $GATEWAY_IP
hccn_tool -i 7 -netdetect -s address $GATEWAY_IP

3)检测脚本

# 检查物理链接
for i in {0..7}; do hccn_tool -i $i -lldp -g | grep Ifname; done
# 检查链接情况
for i in {0..7}; do hccn_tool -i $i -link -g ; done
# 检查网络健康情况
for i in {0..7}; do hccn_tool -i $i -net_health -g ; done
# 查看侦测ip的配置是否正确
for i in {0..7}; do hccn_tool -i $i -netdetect -g ; done
# 查看网关是否配置正确
for i in {0..7}; do hccn_tool -i $i -gateway -g ; done
# 检查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

正常情况下上面的每一条命令都会显示8NPU的相关信息,如果出现DOWN,或者少输出的情况,则需要去检查服务器网络的物理连接。事实上所有的关于NPU的网络配置都会被/etc/hccn.conf中,我们可以通过输出这个文件来获取所有的NPU网络配置信息。


6.多机配置


我们需要使用两台昇腾服务器进行部署,其中一台作为主节点,另一台作为从节点,仅有主节点可以接收请求,并将两台服务器的计算结果返回。所以我们需要在两台服务器上完成NPU网络配置信息的交换,并指定主节点。步骤中使用到的两个脚本我们放在了本文末尾。

 

1)通信文件生成

这一步将单个节点以及其NPU的网络配置导出为json文件

python3 hccl_tools.py --device_num "[0,8)" --server_ip="$SERVER_IP"

2)拼接json

将两台服务器的网络配置文件进行合并

python3 merge_hccl.py hccl_1.json hccl_2.json

3)添加container IP

"version""1.0",
    "server_count""1",
    "server_list": [
        {
            "server_id""$SERVER_IP",
+            "container_ip":"$SERVER_IP",
            ...
        },
        {
            "server_id""$OTHER_SERVER_IP",
+            "container_ip":"$OTHER_SERVER_IP",
            ...
        },
        ]

将权重文件和修改后的网络配置json复制到/data目录
修改配置文件json的权限为640

chmod 640 /data/<yourjson> 

4)关闭宿主机防火墙

systemctl stop firewalld
systemctl disable firewalld


7. 启动DeepSeek服务


1docker 启动

docker run -itd --privileged  --name=deepseek-v3-int8 --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/Ascend/driver:/usr/local/Ascend/driver \
   -v /usr/local/Ascend/firmware:/usr/local/Ascend/firmware \
   -v /usr/local/sbin/npu-smi:/usr/local/sbin/npu-smi \
   -v /usr/local/sbin:/usr/local/sbin \
   -v /etc/hccn.conf:/etc/hccn.conf \
   -v /data/:/data/ \
   swr.cn-south-1.myhuaweicloud.com/ascendhub/mindie:2.0.T3.1-800I-A2-py311-openeuler24.03-lts \
   bash

进入dockerbash进行后续的工作

docker exec -it <docker_id> /bin/bash

2)进入应用目录配置文件

cd /usr/local/Ascend/mindie/latest/mindie-service/conf
vim config.json

按照下述提示修改json文件

{
  ...
  "ServerConfig": {
    "ipAddress""$SERVER_IP", // TODO: change this to main node host ip
    "managementIpAddress""TODO_MANAGEMENT_IP_ADDRESS", // TODO: change this to main node host ip
    ...
    "httpsEnabled"false, // NOTE: change to false
    ...
    "interCommTLSEnabled"false, // NOTE: change to false
    ...
  },
  "BackendConfig": {
    ...
    "npuDeviceIds": [
      [
        0,
        1,
        2,
        3,
        4,
        5,
        6,
        7
      ]
    ], // NOTE: change to actual device IDs
    ...
    "ModelDeployConfig": {
      "maxSeqLen": 32768, // NOTE: change this 32k
      "maxInputTokenLen": 16384, // NOTE: change this to 16k
      ...
      "ModelConfig": [
        {
          ...
          "modelName""DeepSeek-V3-int8", // NOTE: change this to V3 or R1
          "modelWeightPath""/data/DeepSeek-V3-w8a8", // NOTE: change this to model weight path
          "worldSize": 8, // NOTE: change this to device numbers
          ...
        }
      ]
    },
    "ScheduleConfig": {
      ...
      "maxPrefillBatchSize": 10, // NOTE: change this to 10
      "maxPrefillTokens": 32768, // WARN: config this same with BackendConfig.ModelDeployConfig.maxSeqLen
      ...
      "maxIterTimes": 16384, // NOTE: change this to 16k
      ...
    }
  }
}

3)启动服务

设置环境变量

export MIES_CONTAINER_IP=<host ip>
export RANKTABLEFILE=/data/hccl_2s_16p.json
export MINDIE_LOG_TO_STDOUT=0
export MINDIE_LLM_LOG_TO_STDOUT=0
export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True
export ATB_WORKSPACE_MEM_ALLOC_ALG_TYPE=3
export ATB_WORKSPACE_MEM_ALLOC_GLOBAL=1
export OMP_NUM_THREADS=1

export HCCL_DETERMINISTIC=false
export HCCL_OP_EXPANSION_MODE="AIV"
export MIES_SERVICE_MONITOR_MODE=1
export NPU_MEMORY_FRACTION=0.99

在主节点和从节点上启动

cd /usr/local/Ascend/mindie/latest/mindie-service/bin
nohup ./mindieservice_daemon > mindie-log 2>&1 &

 

 

部署过程中踩过的坑和建议

 

1)系统安装时,在分区界面卡死

建议:应该是OpenEuler的软件bug,我们在自动添加分区-删除home分区后触发了这个问题,后来选择了手动添加分区规避了这个问题。

 

2)出现网络相关的报错

建议:检查服务器的防火墙设置,以及config.json中有关TLShttps相关的选项是否设置正确,最后可以检查hccl_2s_16p.json文件是否有拼写错误。

 

3)启动服务后,出现leakage等报错信息

建议:这个估计与服务启动时的预运行相关,我们尝试了将调低NPU_MEMORY_FRACTION,但是这样并不能解决问题,最后是通过将maxSeqLenmaxInputTokenLen调低之后解决了这个问题。如果出现了类似的错误也可以考虑将这两个值继续调低。

 

关于上海交大超算队更多信息见官网:https://xflops.sjtu.edu.cn/

SJTU HPC QQ交流群:422403907