开学第一周,上海交大超算队5位同学在网络信息中心教师和华为工程师的指导下,成功在昇腾910B服务器上部署了DeepSeek满血版模型,整理出一份完整的部署文档避坑指南。
	
文档以DeepSeek-V3-int8为例介绍部署流程,R1的部署流程与其类似,仅需在模型权重获取以及服务配置上做相应修改。
	
	变量说明:
	$SERVER_IP: 当前服务器IP
	$OTHER_SERVER_IP:另一台服务器IP
	$NETMASK: 子网掩码
	$IPi: 第i个NPU设置的IP
	$GATEWAY_IP: 网关IP
	
0.基础环境
	
	2 * 昇腾Atlas 800T A2
	openEuler 22.03 TLS
	单台服务器的NPU最大显存容量为8 * 64 =512 GB,所以需要两台服务器才可以将模型int8权重全部加载。
	
1.获取权重
	
	MODELERS社区提供DeepSeek全系列权重,包括V3的int8量化版本、R1的int8量化版本等,大家可以按需下载到/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
	正常情况下上面的每一条命令都会显示8个NPU的相关信息,如果出现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服务
	
	1)docker 启动
	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
	进入docker的bash进行后续的工作
	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中有关TLS和https相关的选项是否设置正确,最后可以检查hccl_2s_16p.json文件是否有拼写错误。
	3)启动服务后,出现leakage等报错信息
	建议:这个估计与服务启动时的预运行相关,我们尝试了将调低NPU_MEMORY_FRACTION,但是这样并不能解决问题,最后是通过将maxSeqLen,maxInputTokenLen调低之后解决了这个问题。如果出现了类似的错误也可以考虑将这两个值继续调低。
	关于上海交大超算队更多信息见官网:https://xflops.sjtu.edu.cn/
	SJTU HPC QQ交流群:422403907