多机部署(以全量版 Deepseek 为例)
- 本文主要讨论原理性的满血版 Deepseek 部署,快速部署参考musa-deploy 工具用户手册---DeepSeek 一体机部署-满血版多机部署
模型权重文件准备
如果用户环境没有权重文件,需要下载好对应权重。以 ModelScope 为例:
| 模型 | 精度 | ModelScope 魔搭社区链接 |
|---|---|---|
| DeepSeek-R1 | BF16 | unsloth/DeepSeek-R1-BF16 |
| DeepSeek-V3-0324 | BF16 | unsloth/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
#!/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 启动参数说明:
--max-num-seqs: 通过指定最大并发控制 MUSA Graph capture 次数。当并发超过设置的大小,推理时将不使用 MUSA Graph,吞吐性能会有所降低。该值设置过大会影响显存占用,建议范围 1-64。如果不想开启 graph,可以使用--enforce-eager参数代替该值。(注意:DeepSeek-R1-671B BF16 精度下,因内存限制四机无法开启 graph)。--max_model_len: 最大 token 数,包括输入与输出的总和。注意 vLLM 服务启动后,发送请求指定的 max token 仅指输出,所以需要预估输入长度,否则可能会触发问题 2.6: resource temporarily unavailable。该值设置过大可能会触发问题 2.5: 向 vllm 服务发送请求时报错: "This model's maximum context length is xxx tokens. However, you requested xxx tokens"。
验证服务
可以通过使用 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 变量。

