开学第一周,上海交大超算队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