一、资源选型
在天翼云官网开通海量文件服务(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],master001
2.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/nvme1n1
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目录仅用于服务启动及存放日志文件,轻量化设计可减少共享存储压力。
2.3 下载脚本
需将脚本包下载并解压至/home目录:
$ cd /home
$ wget https://jiangsu-10.zos.ctyun.cn/galaxy/deployment/lsep_8node_v20250731.tar
$ tar -xvf lsep_8node_v20250731.tar
解压完成后,可通过以下命令查看目录结构:
$ ll
total 100
-rw-r--r-- 1 root root 102400 Jul 31 15:13 lsep_8node_v20250731.tar
drwxr-xr-x 9 root root 280 Jul 31 15:08 lsep_deepseek
2.4 下载 MindIE
需将 MindIE 容器存放至各节点的/mnt/nvme1n1目录,操作步骤如下:
$ mkdir -p /mnt/nvme1n1/apptainer/
$ cd /mnt/nvme1n1/apptainer/
$ wget https://jiangsu-10.zos.ctyun.cn/galaxy/apptainer/mindie/mindie_2.1.RC1.B123-800I-A2-py3.11-openeuler24.03-lts.sif
下载完成后,可通过以下命令查看文件:
$ ll /mnt/nvme1n1/apptainer/
total 4973664
-rw-r--r-- 1 root root 5093031936 Jul 30 21:27 mindie_2.1.RC1.B123-800I-A2-py3.11-openeuler24.03-lts.sif
为方便后续调用,需在/home/lsep_deepseek目录下创建软链接:
$ cd /home/lsep_deepseek
$ ln -s /mnt/nvme1n1/apptainer/mindie_2.1.RC1.B123-800I-A2-py3.11-openeuler24.03-lts.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目录下修改lsep_start.sh脚本,配置 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 'http://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 方案中,模型信息端口与推理服务端口分离,默认端口设置如下:
模型信息接口:http://[IP1]:1025/v1/models
推理服务端口:3025
推理服务 API 接口:http://[IP1]:3025/v1
其中,[IP1]为步骤 2.1 中配置的 coordinator 服务部署节点的 IP 地址。
4.2 客户端调用(以 Anything LLM 为例)
以下以 Anything LLM 工具调用大 EP 服务为例,其他客户端的使用方式类似。
首先,需通过 1025 端口获取模型信息:
注意
此时调用模型服务可能会报 400 错误,属于正常现象。
随后,将端口修改为 3025 即可调用推理服务,正常使用模型功能: