一、环境准备
1.1 前置条件
管理节点:使用galaxy master 镜像的A800(80GB)GPU 的物理机。
计算节点:所有计算节点需使用 galaxy compute 镜像。
服务状态:确保 slurm 服务已初始化并成功启动。
1.2 本地 NVME 分区
将各个节点的两块 NVME 盘(nvme0n1 和 nvme1n1)分别挂载至指定路径(/mnt/nvme0n1 和 /mnt/nvme1n1),具体操作步骤如下:
#!/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
执行挂载脚本:sh mount.nvme.sh
1.3 下载应用及脚本
在指定目录下下载 sglang 应用,并将其放置于 /home/sglang 目录中,具体操作如下:
mkdir -p /home/sglang/log
cd /home/sglang
wget https://jiangsu-10.zos.ctyun.cn/galaxy/apptainer/sglang/sglang_v0.4.5.post3-cu125.sif
1.4 下载模型文件
DeepSeek 模型体积较大,建议通过 huggingface 或 modelscope 平台进行下载,并将模型存储在每台计算节点的 NVME 磁盘中,例如存储在 /mnt/nvme1n1/model 目录下。推荐使用 DeepSeek-R1-Channel-INT8 模型,模型存储路径示例:/mnt/nvme1n1/model/DeepSeek-R1-Channel-INT8 。
二、起停服务
2.1 配置 deepseek
在 /home/sglang 目录下创建 srun.sh 文件,文件内容如下:
#!/bin/bash
#SBATCH -N 2
#SBATCH --ntasks=2
#SBATCH --exclusive
#SBATCH --partition=batch
#SBATCH -J deepseek
#SBATCH -o log/log_ds_%J.out
#SBATCH --gres=gpu:8
#export NCCL_DEBUG=INFO
export NCCL_SOCKET_IFNAME=bond0
export NCCL_IB_HCA=mlx5_0,mlx5_1,mlx5_5,mlx5_6
export OMP_NUM_THREADS=8
export HF_DATASETS_NUM_THREADS=8
export TRANSFORMERS_OFFLINE=1
export SGLANG_IMG=sglang_v0.4.5.post3-cu125.sif
export MODEL_DIR=/mnt/nvme1n1/model/DeepSeek-R1-Channel-INT8/
export MODEL_NAME=DeepSeek-R1
export NODES=$(scontrol show hostnames $SLURM_JOB_NODELIST)
export MASTER_ADDR=$(scontrol show hostnames "$SLURM_JOB_NODELIST" | head -n 1 | hostname -i)
readarray -t NODE_ARRAY <<< "$NODES"
for i in "${!NODE_ARRAY[@]}"; do
NODE_NAME="${NODE_ARRAY[$i]}"
NODE_RANK="$i"
echo $NODE_NAME,$NODE_RANK,$SLURM_NNODES
srun --nodes=1 --nodelist=$NODE_NAME --ntasks=1 \
--gres=gpu:8 \
--cpus-per-task 64 \
--output="log/log_ds_%J.out" \
--error="log/log_ds_%J.err" \
apptainer exec --nv --no-home --writable-tmpfs \
-B $MODEL_DIR:/root/.cache/huggingface \
$SGLANG_IMG \
python3 -m sglang.launch_server \
--model-path /root/.cache/huggingface \
--served-model-name $MODEL_NAME \
--host 0.0.0.0 --port 8000 \
--trust-remote-code \
--tensor-parallel-size 16 \
--enable-torch-compile \
--torch-compile-max-bs 8 \
--quantization w8a8_int8 \
--dist-init-addr $MASTER_ADDR:5000 \
--nnodes $SLURM_NNODES --node-rank $NODE_RANK &
done
wait
用户可根据实际情况修改以下三项配置内容:
- SGLANG_IMG:指定 sglang apptainer 镜像容器,后续可根据需求自行升级替换。示例配置:export SGLANG_IMG=sglang_v0.4.5.post3-cu125.sif
- MODEL_DIR:设置模型的具体存储位置。示例配置:export MODEL_DIR=/mnt/nvme1n1/model/DeepSeek-R1-Channel-INT8/
- MODEL_NAME:定义显示的模型名称。示例配置:export MODEL_NAME=DeepSeek-R1
2.2 启动 deepseek
切换至 /home/sglang 目录,执行以下命令启动 deepseek 服务:
cd /home/sglang
sbatch srun_sglang.sh
执行结果示例:Submitted batch job 403。当在 log 目录下的 err 文件中出现以下信息时,表明服务已成功启动:
INFO: Started server process [4506]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
2.3 查看 deepseek 状态
通过 slurm 命令 squeue 可查看作业运行信息,执行命令:
squeue
执行结果示例:
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
403 batch deepseek root R 8:19 2 compute[01-02]
同时,用户可在 /home/sglang/log 目录中查看当前作业的 log 文件,获取更多详细信息。
2.4 停止 deepseek
若需停止 DS 服务,可通过以下方式操作:
已知服务的 JOB ID(例如上述示例中的 403),可执行命令:
scancel 403
也可使用命令直接取消当前用户的所有作业:
scancel --me
三、总结
本次部署的核心环节涵盖环境准备与服务起停两大部分。在环境准备阶段,需完成镜像选择、磁盘挂载、软件安装以及模型下载等关键操作;服务起停部分则详细介绍了服务的配置、启动、状态查看及停止方法。通过严格按照本指南操作,可顺利完成 基于NVidia A800-80GB 的双机部署,为相关应用的高效运行奠定基础 。