一、資源選型
在天翼云官網開通海量文件服務(OceanFS)或彈性文件服務(SFS)。
注意
創建 OceanFS 時,需開啟 “終端節點” 創建開關。
在天翼云官網開通彈性高性能計算服務,具體配置如下:
1 臺昇騰 910B NPU 物理機,作為master管理節點
7 臺昇騰 910B NPU 物理機,作為compute計算節點
注意
在集群創建過程中,“隊列與計算節點” 頁面的隊列名稱需設置為 batch(默認值)。
二、環境準備
2.1 配置管理節點參與計算任務
設置管理節點提供計算資源,可按以下步驟手動配置:
在管理節點修改調度器配置文件,在文件末尾添加以下信息(其中[管理節點名]需替換為集群管理節點的 hostname):
$ vim /opt/galaxy/scheduler/slurm/22.05.9.1/etc/slurm.conf
...
NodeName=[管理節點名] CPUs=192 Boards=2 SocketsPerBoard=2 CoresPerSocket=48 ThreadsPerCore=1 RealMemory=1546544 Gres=gpu:910b2:8在隊列配置文件中,將集群管理節點的 hostname 添加到 Nodes 列表首位:
$ vim /opt/galaxy/scheduler/slurm/22.05.9.1/etc/queue_config
PartitionName=batch Default=yes MaxTime=-1 State=UP PriorityTier=40000 Nodes=[管理節點名],compute001,compute002,compute003,compute004,compute005,compute006,compute007將任意一臺計算節點的/etc/default/gres.conf文件拷貝到管理節點的/etc/default/目錄,示例命令如下(在管理節點執行):
$ scp compute0001:/etc/default/gres.conf /etc/default/在管理節點重啟 slurm 服務:
$ systemctl start slurmd
$ systemctl enable slurmd
$ systemctl restart slurmctld檢查管理節點是否已加入計算隊列(例如查看 master001 是否在 batch 隊列中,已加入的示例如下):
$ sinfo
PARTITION AVAIL TIMELIMIT NODES STATE NODELIST
batch* up infinite 8 idle compute[001-007],master0012.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 MOUNTPOINT
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.7G 0 part
|-system-lv_swap 253:0 0 16G 0 lvm [SWAP]
`-system-lv_root 253:1 0 427.7G 0 lvm /
nvme0n1 259:0 0 2.9T 0 disk /mnt/nvme0n1
nvme1n1 259:1 0 2.9T 0 disk /mnt/nvme1n1galaxy 集群啟動后,/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目錄僅用于服務啟動及存放日志文件,輕量化設計可減少共享存儲壓力。
2.3 下載腳本
需將腳本包下載并解壓至/home目錄:
$ cd /home
$ wget //jiangsu-10.zos.daliqc.cn/galaxy/deployment/lsep_8node_v20250901.tar
$ tar -xvf lsep_8node_v20250901.tar解壓完成后,可通過以下命令查看目錄結構:
$ ll
total 840
-rw-r--r-- 1 root root 860160 Sep 1 17:55 lsep_8node_v20250901.tar
drwxr-xr-x 8 root root 255 Sep 1 17:52 lsep_deepseek2.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.1.RC1-800I-A2-py311-openeuler24.03-lts-fix.sif下載完成后,可通過以下命令查看文件:
$ ll /mnt/nvme1n1/apptainer/
total 5032820
-rw-r--r-- 1 root root 5153607680 Sep 1 10:54 mindie_2.1.RC1-800I-A2-py311-openeuler24.03-lts-fix.sif為方便后續調用,需在/home/lsep_deepseek目錄下創建軟鏈接:
$ cd /home/lsep_deepseek
$ ln -s /mnt/nvme1n1/apptainer/mindie_2.1.RC1-800I-A2-py311-openeuler24.03-lts-fix.sif .2.5 下載模型文件
需將模型文件下載并存儲在各節點的/mnt/nvme1n1/model/目錄,以下以量化版 DeepSeek-R1 模型為例展示目錄結構:
$ ll /mnt/nvme1n1/model/DeepSeek-R1-0528-W8A8/
total 658940180
-rwxr-x--- 1 root root 1802 Jul 7 10:49 config.json
-rwxr-x--- 1 root root 48 Jun 5 10:58 configuration.json
-rwxr-x--- 1 root root 14707 Jun 5 10:58 md5sums.txt
-rwxr-x--- 1 root root 10712695936 Jun 5 14:22 mtp_float-1.safetensors
-rwxr-x--- 1 root root 10716492808 Jun 5 14:22 mtp_float-2.safetensors
-rwxr-x--- 1 root root 5497763368 Jun 5 14:22 mtp_float-3.safetensors
-rwxr-x--- 1 root root 10289502 Jun 5 10:58 quant_model_description_w8a8_dynamic.json
-rwxr-x--- 1 root root 4287134112 Jun 5 14:22 quant_model_weight_w8a8_dynamic-00001-of-00158.safetensors
-rwxr-x--- 1 root root 4291084296 Jun 5 14:22 quant_model_weight_w8a8_dynamic-00002-of-00158.safetensors
...
-rwxr-x--- 1 root root 1853358176 Jun 5 14:22 quant_model_weight_w8a8_dynamic-00158-of-00158.safetensors
-rwxr-x--- 1 root root 17224440 Jun 5 10:58 quant_model_weight_w8a8_dynamic.safetensors.index.json
-rwxr-x--- 1 root root 1680 Jun 5 10:58 README.md
-rwxr-x--- 1 root root 3957 Jun 5 10:58 tokenizer_config.json
-rwxr-x--- 1 root root 7847602 Jun 5 10:58 tokenizer.json注意
如需快速完成模型罐裝,可聯系公有云事業部通過對等連接方式實現。
三、服務起停
3.1 配置 DeepSeek 大 EP 服務
需在/home/lsep_deepseek目錄下修改腳本,配置 coordinator 與 controller 的執行節點:
$ cd /home/lsep_deepseek
$ vim lsep_start.sh
export IP_COORDINATOR=[IP1]
export IP_CONTROLLER=[IP2]其中:
[IP1]需替換為部署 coordinator 服務的服務器 IP 地址
[IP2]需替換為部署 controller 服務的服務器 IP 地址
注意
集群推理服務的 API 接口使用的 IP 為[IP1]。
coordinator 與 controller 服務需部署在不同的服務器上。
3.2 啟動 DeepSeek 大 EP 服務
執行以下命令即可啟動大 EP 服務(啟動過程約需 5 分鐘):
$ cd /home/lsep_deepseek
$ sh lsep_start.sh
IP_COORDINATOR = 192.168.0.24
IP_CONTROLLER = 192.168.0.42
Submitted srun_p.sh, Job ID: 889
Submitted srun_p.sh, Job ID: 890
Submitted srun_d.sh, Job ID: 891
Created symlink: ranktable_p1.json -> ranktable.889.json
Created symlink: ranktable_p2.json -> ranktable.890.json
Created symlink: ranktable_d.json -> ranktable.891.json
Submitted srun_coordinator.sh, Job ID: 892
Submitted srun_controller.sh, Job ID: 893服務啟動后,可查看logs目錄下的ms_coordinator_run_log.txt文件,當出現以下信息時,說明服務啟動成功:
$ tail -f logs/ms_coordinator_run_log.txt
...
MindIE-MS coordinator is ready!!!可通過以下命令進行服務檢測(向 DeepSeek 模型發送提問):
$ curl -i --location '//192.168.0.24:3025/v1/chat/completions' --header 'Content-Type: application/json' --data '{ "model": "DeepSeek-R1", "stream": false, "messages": [ {"role": "user", "content": "你是誰"} ] }'
HTTP/1.1 200 OK
Server: MindIE-MS
Content-Type: application/json; charset=utf-8
Content-Length: 4939
{"id":"14721165810121334024","object":"chat.completion","created":1753083070,"model":"DeepSeek-R1","choices":[{"index":0,"message":{"role":"assistant","content":"<think>\n嗯,用戶問了一個非常基礎但也很關鍵的問題——“你是誰”。這通常是用戶第一次接觸助手時的開場白,可能帶著好奇或試探的心態。\n\n用戶可能剛打開聊天界面,想確認自己在和什么樣的AI交流。ta需要快速建立對助手的認知框架:是工具還是伙伴?專業還是親切?甚至可能隱含“你能幫我到什么程度”的期待。\n\n考慮到這是初遇場景,回復要同時完成三個目標:明確身份(DeepSeek-R1)、傳遞功能邊界(知識截止2024年7月)、建立親和力(表情符號和開放結尾)。用“小伙伴”的比喻降低距離感,但“知識豐富”又暗示專業性。\n\n最后那句“有什么可以幫你”的開放式提問很重要——既承接了身份介紹,又把主動權交還給用戶,避免初遇時單方面輸出造成的壓迫感。那個笑臉表情應該能緩解新用戶的緊張情緒吧?\n</think>\n你好呀!我是 **DeepSeek-R1**,由中國的「深度求索」團隊研發的一款智能助手。你可以把我當作一個知識豐富、樂于助人的小伙伴~??\n\n我的主要能力包括:\n\n- 回答各種知識類問題(歷史、科技、文化、生活常識等) \n- 幫你寫作、改文案、寫報告、寫代碼 \n- 閱讀和分析你上傳的文檔(PDF、Word、Excel等) \n- 陪你聊天、解悶、出主意、做計劃 \n\n目前我是**純文字助手**,還不支持語音或識圖,但我會盡力用文字給你最貼心的幫助! \n?? 我的知識更新到 **2024年7月**,所以對之前的事情了解得比較多~\n\n有什么我可以幫你的嗎???","tool_calls":null},"logprobs":null,"finish_reason":"stop"}],"usage":{"prompt_tokens":4,"completion_tokens":359,"total_tokens":363,"batch_size":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}3.3 查看 DeepSeek 大 EP 服務狀態
可通過 slurm 命令squeue查看作業運行信息:
$ squeue
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
892 batch coordina root R 2:43 8 hpc-ep-910bcompute[0001-0007],hpc-ep-910bmaster0001
893 batch controll root R 2:43 8 hpc-ep-910bcompute[0001-0007],hpc-ep-910bmaster0001
889 batch prefill root R 2:46 2 hpc-ep-910bcompute0001,hpc-ep-910bmaster0001
890 batch prefill root R 2:46 2 hpc-ep-910bcompute[0003,0006]
891 batch decode root R 2:46 4 hpc-ep-910bcompute[0002,0004-0005,0007]注意
可在/home/lsep_deepseek/logs目錄中查看當前作業的日志文件。
3.4 停止 DeepSeek 大 EP 服務
執行以下命令即可停止 DeepSeek 大 EP 服務:
$ sh lsep_stop.sh如需清理歷史 DeepSeek 大 EP 服務的所有日志,可執行:
$ sh lsep_clean.sh注意
ascend目錄下會生成大量日志文件,可能占用較多磁盤空間,建議定期清理。
四、大模型服務調用
4.1 API 接口調用
當前大 EP 方案中,模型信息端口與推理服務端口分離,默認端口設置如下:
模型信息接口://[IP1]:1025/v1/models
推理服務端口:3025
推理服務 API 接口://[IP1]:3025/v1
其中,[IP1]為步驟 2.1 中配置的 coordinator 服務部署節點的 IP 地址。
4.2 客戶端調用(以 Anything LLM 為例)
以下以 Anything LLM 工具調用大 EP 服務為例,其他客戶端的使用方式類似。
首先,需通過 1025 端口獲取模型信息:
注意
此時調用模型服務可能會報 400 錯誤,屬于正常現象。
隨后,將端口修改為 3025 即可調用推理服務,正常使用模型功能: