為了充分發揮昇騰 910B 物理機的優勢,滿足企業級用戶對于大規模并行計算和分布式存儲的需求,我們特此編寫了這份基于物理機Galaxy鏡像和CTyunOS操作系統的昇騰910B多機部署指南。本指南旨在為用戶提供一個從環境準備到服務管理的全面解決方案,幫助用戶便捷快速的搭建起穩定、高效地AI計算集群。
一、環境準備
1.1 前置條件
- 建議通過彈性高性能計算入口(彈性高性能計算)開通多臺昇騰910B物理機集群(集群配置--管理節點--隊列與計算節點--確認配置)
- 管理節點使用CTyunOS-23.01.2@GalaxyMaster-NPU24.1.0.3鏡像的昇騰910B物理機(綁定EIP)
- 所有計算節點使用CTyunOS-23.01.2@GalaxyCompute-NPU24.1.0.3鏡像的昇騰910B物理機
- 使用共享存儲:官網控制臺海量文件服務OceanFS(海量文件服務 OceanFS) 或彈性文件服務SFS Turbo(彈性文件服務 SFS)
1.2 本地NVME分區
將節點的nvme1n1和nvme0n1兩塊NVME盤分別掛載在/mnt/nvme1n1和/mnt/nvme0n1上。
#!/bin/bash
# 設備列表
devices=("/dev/nvme0n1" "/dev/nvme1n1")
mount_points=("/mnt/nvme0n1" "/mnt/nvme1n1")
fs_type="xfs"
# 確保 root 權限
if [[ $EUID -ne 0 ]]; then
echo "請使用 root 運行此腳本!"
exit 1
fi
for i in "${!devices[@]}"; do
device="${devices[$i]}"
mount_point="${mount_points[$i]}"
# 創建掛載目錄
mkdir -p "$mount_point"
# 獲取設備的文件系統類型
current_fs=$(blkid -s TYPE -o value "$device")
if [[ -z "$current_fs" ]]; then
echo "設備 $device 沒有文件系統,正在格式化為 $fs_type..."
mkfs.xfs -f "$device"
else
echo "$device 已格式化為 $current_fs,跳過格式化"
fi
# 確保設備未被掛載后再嘗試掛載
umount "$device" 2>/dev/null
mount -t "$fs_type" "$device" "$mount_point"
if [[ $? -ne 0 ]]; then
echo "錯誤:無法掛載 $device 到 $mount_point,請檢查設備或文件系統!"
exit 1
fi
echo "$device 已成功掛載到 $mount_point"
# 獲取 UUID 并更新 /etc/fstab,避免重復添加
uuid=$(blkid -s UUID -o value "$device")
if ! grep -q "$uuid" /etc/fstab; then
echo "UUID=$uuid $mount_point $fs_type defaults 0 0" >> /etc/fstab
echo "$device (UUID=$uuid) 已添加到 /etc/fstab"
else
echo "$device 已存在于 /etc/fstab,無需添加"
fi
done
echo "所有磁盤已成功掛載并配置為開機自動掛載!"
如下可查看磁盤分區情況:
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop0 7:0 0 4.2G 1 loop
sda 8:0 0 446.6G 0 disk
├─sda1 8:1 0 122M 0 part
├─sda2 8:2 0 976.6M 0 part /boot/efi
├─sda3 8:3 0 1.9G 0 part /boot
└─sda4 8:4 0 443.6G 0 part
├─system-lv_swap 253:0 0 16G 0 lvm [SWAP]
└─system-lv_root 253:1 0 427.6G 0 lvm /
nvme1n1 259:0 0 2.9T 0 disk
└─nvme1n1p1 259:4 0 2.9T 0 part /mnt/nvme1n1
nvme0n1 259:1 0 2.9T 0 disk
└─nvme0n1p1 259:3 0 2.9T 0 part /mnt/nvme0n1
根據galaxy集群啟動后,/home和/opt目錄為各節點共享目錄:
$ df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 4.0M 0 4.0M 0% /dev
tmpfs 756G 419M 755G 1% /dev/shm
tmpfs 303G 1.8G 301G 1% /run
tmpfs 4.0M 0 4.0M 0% /sys/fs/cgroup
/dev/mapper/system-lv_root 428G 20G 408G 5% /
tmpfs 756G 200K 756G 1% /tmp
/dev/sda3 1.9G 148M 1.7G 9% /boot
/dev/sda2 975M 6.4M 969M 1% /boot/efi
tmpfs 152G 0 152G 0% /run/user/0
/dev/nvme0n1p1 3.0T 21G 2.9T 1% /mnt/nvme0n1
/dev/nvme1n1p1 3.0T 654G 2.3T 22% /mnt/nvme1n1
master001:/data/nfs/home 428G 20G 408G 5% /home
master001:/data/nfs/opt 428G 20G 408G 5% /opt
注意上面舉例使用master001作NFS服務的效果,這里也可以按需使用OceanFS來做共享存儲。
本指南部署,會把模型和mindie容器鏡像存入每個節點的/mnt/nvme1n1目錄,并使用home目錄進行服務啟動,home目錄將僅存放日志文件,非常輕量化。
1.3 下載腳本
下載腳本包并解壓在home目錄。
$ cd /home
$ wget //jiangsu-10.zos.daliqc.cn/galaxy/deployment/deepseek-hw-nnode-v20250331.tar
--2025-03-31 10:14:14-- //jiangsu-10.zos.daliqc.cn/galaxy/deployment/deepseek-hw-nnode-v20250331.tar
Resolving jiangsu-10.zos.daliqc.cn (jiangsu-10.zos.daliqc.cn)... 117.88.33.209, 117.88.33.247, 218.91.113.207
Connecting to jiangsu-10.zos.daliqc.cn (jiangsu-10.zos.daliqc.cn)|117.88.33.209|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 20480 (20K) [application/x-tar]
Saving to: 'deepseek-hw-nnode-v20250331.tar'
100%[===================================================================================================================================>] 20,480 --.-K/s in 0.007s
2025-03-31 10:14:14 (2.74 MB/s) - 'deepseek-hw-nnode-v20250331.tar' saved [20480/20480]
$ tar xvf deepseek-hw-nnode-v20250331.tar
$ ls -l
total 20
drwxr-xr-x 7 root root 238 Mar 31 09:51 deepseek
-rw-r--r-- 1 root root 20480 Mar 31 10:05 deepseek-hw-nnode-v20250331.tar
1.4 下載MindIE
將MindIE容器放在每個節點的/mnt/nvme1n1盤下:
mkdir -p /mnt/nvme1n1/apptainer/
cd /mnt/nvme1n1/apptainer/
wget //jiangsu-10.zos.daliqc.cn/galaxy/apptainer/mindie/mindie_2.0.T6.B023-800I-A2-py3.11-openeuler24.03-lts-aarch64.sif
ls -l /mnt/nvme1n1/apptainer/
下載完成后,在/home/deepseek目錄下做一個軟鏈接:
cd /home/deepseek
ln -s /mnt/nvme1n1/apptainer/mindie_2.0.T6.B023-800I-A2-py3.11-openeuler24.03-lts-aarch64.sif .
1.5 下載模型文件
將模型文件下載并保存在每個節點的/mnt/nvme1n1/model/ 目錄下,這里以量化版DeepSeek-R1-bf16-hfd-w8a8模型舉例:
ls -l /mnt/nvme1n1/model/DeepSeek-R1-bf16-hfd-w8a8/
total 658940180
-rwxr-x--- 1 root root 1791 Mar 19 15:46 config.json
-rwxr-x--- 1 root root 10556 Mar 19 15:46 configuration_deepseek.py
-rwxr-x--- 1 root root 15229 Mar 19 15:46 md5sum.txt
-rwxr-x--- 1 root root 9923927 Mar 19 15:46 quant_model_description_w8a8_dynamic.json
-rwxr-x--- 1 root root 4300743184 Mar 19 15:47 quant_model_weight_w8a8_dynamic-00001-of-00157.safetensors
...
-rwxr-x--- 1 root root 16470256 Mar 19 15:46 quant_model_weight_w8a8_dynamic.index.json
-rwxr-x--- 1 root root 6038 Mar 19 15:46 README.md
-rwxr-x--- 1 root root 3584 Mar 19 15:55 tokenizer_config.json
-rwxr-x--- 1 root root 7847602 Mar 19 15:55 tokenizer.json
注意所有文件的訪問權限設置為750。
二、服務管理
2.1 服務配置
根據節點數量修改 srun_clean.sh 和 srun_deepseek.sh:
#!/bin/bash
#SBATCH -N 2
...
如果是4臺,需修改-N后面的數值為4。
根據具體使用的模型,修改node.sh 中的內容:
export MODEL_DIR=/mnt/nvme1n1/model/DeepSeek-R1-bf16-hfd-w8a8
export MINDIE_IMG=mindie_2.0.T6.B023-800I-A2-py3.11-openeuler24.03-lts-aarch64.sif
其中:
- MODEL_DIR 為模型在每個節點的本地盤中的具體路徑(必須位置統一)
- MINDIE_IMG為使用的MindIE容器
2.2 DeepSeek服務啟動
僅需如下3條命令,即可啟動服務(根據模型大小,啟動服務需等待5-30分鐘不等):
cd /home/deepseek
sbatch srun_clean.sh
sbatch srun_deepseek.sh
查看log目錄下的out文件,當出現如下信息時,服務啟動成功:
$ more deepseek.33.out
Loading cthpc_910b/1.0.0/mpich-3.2.1
Loading requirement: mpich/3.2.1/gcc-10.3.1
Service Address: //192.168.0.34:1025/v1
Config updated successfully. Output file: json/config.33.json
Start to parse ranktable file
Finished parsing ranktable file.
Update worldSize and npuDeviceIds of backend config successfully for Multi Nodes Inference.
Start to parse ranktable file
Finished parsing ranktable file.
Update worldSize and npuDeviceIds of backend config successfully for Multi Nodes Inference.
Warning: path /configs/mki_cfg.ini does not exist
...
Multi Nodes infer slave instance need not init TokenizerProcessPool and HttpWrapper
Daemon start success!
Daemon start success!
注意DeepSeek主節點,根據調度節點自動生成,這里log顯示為192.168.0.34。
進行檢測,給DeepSeek提個問題:
$ curl -i --location '//192.168.0.34:1025/v1/chat/completions' --header 'Content-Type: application/json' --data '{ "model": "DeepSeek-R1", "stream": false, "messages": [ {"role": "user", "content": "你是誰"} ] }'
HTTP/1.1 200 OK
Connection: close
Content-Length: 625
Content-Type: application/json
Keep-Alive: timeout=180, max=2147483647
{"id":"endpoint_common_132","object":"chat.completion","created":1743387462,"model":"DeepSeek-R1","choices":[{"index":0,"message":{"role":"assistant","tool_calls":null,"content":"<think>\n\n</think>\n\n您好!我是由中國的深度求索(DeepSeek)公司開發的智能助手DeepSeek-R1。如您有任何任何問題,我會盡我所能為您提供幫助。"},"finish_reason":"stop"}],"usage":{"prompt_tokens":4,"completion_tokens":42,"total_tokens":46},"prefill_time":136,"decode_time_arr":[125,74,74,74,76,73,75,73,75,74,75,75,74,74,73,74,74,74,74,74,75,74,74,74,74,74,74,74,77,75,76,75,74,74,74,74,74,75,74,73,82]}
2.3 查看DeepSeek狀態
可通過slurm命令squeue,查看作業運行信息:
$ squeue
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
7 batch deepseek root R 5:13:46 2 compute001,master001
注意可在/home/deepseek/log_ds目錄中查看當前作業的日志文件。
2.4 DeepSeek服務停止
僅需一條命令即可停止deepseek服務:
scancel --me