跳到主要内容

多机部署(以全量版 Deepseek 为例)

提示

模型权重文件准备

如果用户环境没有权重文件,需要下载好对应权重。以 ModelScope 为例:

模型精度ModelScope 魔搭社区链接
DeepSeek-R1BF16unsloth/DeepSeek-R1-BF16
DeepSeek-V3-0324BF16unsloth/DeepSeek-V3-0324-BF16

后文中的启动命令以模型文件放置在每台服务器 host 的 /data/DeepSeek-R1-BF16 目录下为例。如果实际路径不同,请根据实际路径调整启动命令参数。

提示

大模型本地加载比挂载共享目录要快,建议将模型在每台机器 /data 目录下拷贝一份,挂载至容器内

启动容器

启动容器:

docker run -it -d \
--privileged \
--net host \
--name=vllm-musa \
-w /workspace \
-v /data:/home/model \
--shm-size=500g \
--env MTHREADS_VISIBLE_DEVICES=all \
registry.mthreads.com/mcconline/vllm-musa-qy2-py310:v0.7.3 \
/bin/bash

进入容器:

docker exec -it vllm-musa bash

容器内执行: service ssh start 开启 ssh,端口 62262,密码 123456

启动服务

将以下脚本保存为 run.sh

run.sh
#!/bin/bash

if [[ $1 == "--help" ]]; then
echo "Usage: run.sh [TP_SIZE] [PP_SIZE] [MODEL_PATH] [HOSTFILE] [VLLM_PP_LAYER_PARTITION]"
echo ""
echo "Parameters:"
echo " TP_SIZE Number of Tensor Parallelism"
echo " PP_SIZE Number of Pipeline Parallelism"
echo " MODEL_PATH Path to the model"
echo " HOSTFILE Host file for distributed inference"
echo " VLLM_PP_LAYER_PARTITION Optional partition scheme (comma-separated values); omit to skip"
echo ""
echo "Example:"
echo " ./run.sh 2 4 /path/to/model /path/to/hostfile 13,12,12,12,12"
exit 0
fi

set -u
TP_SIZE=$1
PP_SIZE=$2
MODEL_PATH=$3
HOSTFILE=$4
VLLM_PP_LAYER_PARTITION="${5:-}"
set +u

MODEL_NAME=DeepSeek-R1-671B
MAX_MODEL_LEN=24576
BATCH_SIZE=128
NUM_GPU_BLOACKS=$(( MAX_MODEL_LEN * BATCH_SIZE ))
GPU_MEMORY_UTILIZATION=0.8
WORLD_SIZE=($PP_SIZE * $TP_SIZE)
SSH_PORT=62262
RAY_PORT=62379

env_array=(
MCCL_PROTOS=2
MUSA_PRINT_ENV=1
MUSA_HOME="/usr/local/musa"
TRITON_CACHE_DIR="/tmp/triton"
LIBRARY_PATH="/opt/intel/oneapi/mkl/lib/intel64:${LIBRARY_PATH}"
LD_LIBRARY_PATH="/usr/lib/x86_64-linux-gnu/:/usr/local/musa/lib"
VLLM_NCCL_SO_PATH="/usr/local/musa/lib/libmccl.so.2"
VLLM_TORCH_PROFILER_DIR="/home/model/"
)

if [[ -n "$VLLM_PP_LAYER_PARTITION" ]]; then
env_array+=(VLLM_PP_LAYER_PARTITION="$VLLM_PP_LAYER_PARTITION")
fi

for item in "${env_array[@]}"; do
echo "export $item"
eval "export $item"
done

pkill -f /opt/conda/envs/py310/bin/python3
ray stop
rm -rf ${TRITON_CACHE_DIR}/*

CURRENT_TIME=$(date "+%Y-%m-%d_%H:%M:%S")
echo $CURRENT_TIME
mkdir -p ./output/$CURRENT_TIME

set -u
WORK_HOME="$PWD"
EXPNAME="pp${PP_SIZE}_tp${TP_SIZE}_gpus${WORLD_SIZE}"
LOG_FILE=$WORK_HOME/output/$CURRENT_TIME/$EXPNAME.log
set +u

hostlist=$(grep -v '^#\|^$' $HOSTFILE | awk '{print $1}' | xargs)

first_host=true
first_host_ip=127.0.0.1
for host in ${hostlist[@]}; do
echo ray start $host
((COUNT++))
if $first_host; then
first_host=false
first_host_ip=$host
ssh -p $SSH_PORT $host "ray stop"
ssh -p $SSH_PORT $host "${env_array[@]} ray start --head --port=${RAY_PORT} --dashboard-host='0.0.0.0' --num-gpus 8"
sleep 3s
else
ssh -p $SSH_PORT $host "ray stop"
ssh -p $SSH_PORT $host "${env_array[@]} ray start --address ${first_host_ip}:${RAY_PORT} --num-gpus 8"
fi
done

ray status

vllm serve $MODEL_PATH \
--trust-remote-code \
--max-num-seqs $BATCH_SIZE \
--max_model_len $MAX_MODEL_LEN \
--gpu-memory-utilization $GPU_MEMORY_UTILIZATION \
--served-model-name $MODEL_NAME \
--distributed-executor-backend ray \
-tp $TP_SIZE \
-pp $PP_SIZE 2>&1 | tee -a $LOG_FILE

给脚本增加可执行权限:

chmod +x run.sh

执行 ./run.sh --help 获取帮助:

./run.sh --help
Usage: run.sh [TP_SIZE] [PP_SIZE] [MODEL_PATH] [HOSTFILE] [VLLM_PP_LAYER_PARTITION]

Parameters:
TP_SIZE Number of Tensor Parallelism
PP_SIZE Number of Pipeline Parallelism
MODEL_PATH Path to the model
HOSTFILE Host file for distributed inference
VLLM_PP_LAYER_PARTITION Optional partition scheme (comma-separated values); omit to skip

Example:
./run.sh 2 4 /path/to/model /path/to/hostfile 13,12,12,12,12

创建 hostfile,写入需要使用的集群机器 IP,需注意将执行 run.sh 的脚本机器的放在 hostfile 第一行。四机样例如下:

10.1.0.1
10.1.0.2
10.1.0.3
10.1.0.4

以 4 机拉起 DeepSeek-R1-BF16 为例:

bash run.sh 8 4 /home/model/DeepSeek-R1-BF16 hostfile 16,15,15,15

参数说明:

  • 8:TP(Tensor Parallelism)

  • 4:PP(Pipeline Parallelism)

  • 16,15,15,15:模型 pp=4 时分层。总合应该等于 61 (DeepSeek-R1 | config.json | num_hidden_layers),例如 pp=5 时,可以设置为:13,12,12,12,12

vllm serve 启动参数说明:

验证服务

可以通过使用 curl 验证服务, 注意 API 服务 IP 应使用主节点 IP(hostfile 第一行):

curl http://10.1.0.1:8000/v1/chat/completions -H "Content-Type: application/json" -d '{
"model": "DeepSeek-R1-671B",
"messages": [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "1+1等于几?"}
]
}'

此处model即为 run.sh 脚本中的 MODEL_NAME 变量。