本教程将指导如何在多机多卡环境中部署 vLLM 推理服务,以实现高效的分布式推理。假设你已经安装了 Docker 和下载好了模型文件,并且两台服务器的模型存放路径一致。


1. 安装 NVIDIA Container Toolkit

在开始之前,确保你的服务器已经安装了 NVIDIA Container Toolkit,以便 Docker 能够使用 GPU 资源。

1.1 添加 NVIDIA 容器工具包仓库

运行以下命令,添加 NVIDIA 容器工具包的官方仓库:

1
2
3
4
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
&& curl -s -L https://mirrors.ustc.edu.cn/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
sudo sed 's#deb https://nvidia.github.io#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://mirrors.ustc.edu.cn#g' | \
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

如果还是无法下载建议手动下载后安装:

1
2
3
4
sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg /gpgkey路径
curl -s -L https://mirrors.ustc.edu.cn/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
sudo sed 's#deb https://nvidia.github.io#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://mirrors.ustc.edu.cn#g' | \
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
  • 作用:添加 NVIDIA 容器工具包的 GPG 密钥和软件源,确保可以从官方仓库安装最新版本。

1.2 安装 NVIDIA Container Toolkit

更新软件包列表并安装 NVIDIA Container Toolkit:

1
2
3
sudo apt-get update
sudo apt-get install -y nvidia-docker2
sudo systemctl restart docker
  • 作用:安装 nvidia-docker2 包,重启 Docker 服务以加载 NVIDIA 驱动,使 Docker 容器能够使用 GPU 资源。

2. 下载 vLLM 集群启动脚本

运行以下命令,下载并准备 vLLM 集群启动脚本:

1
2
wget https://raw.githubusercontent.com/vllm-project/vllm/main/examples/online_serving/run_cluster.sh
chmod +x run_cluster.sh
  • 作用:下载 run_cluster.sh 脚本,用于启动 vLLM 集群。chmod +x 使脚本具有可执行权限。

注意,脚本当中的端口为 6379,这个端口跟redis数据库的端口是冲突的,如果你已经启用这个端口运行其他服务,你需要更改这个脚本当中的端口,主从节点都需要同步更改。


3. 启动 vLLM 集群

3.1 启动主节点(Head Node)

在主节点上运行以下命令启动集群的主节点:

1
2
3
4
5
6
7
8
sudo bash run_cluster.sh \
docker.1ms.run/vllm/vllm-openai:latest \ # 使用 vLLM 的 Docker 镜像
192.168.xxx.xxx \ # 主节点的 IP 地址
--head \ # 指定为主节点
/data/model/qeternity/DeepSeek-R1-Distill-Qwen-32B-FP8 \ # 模型路径
-e VLLM_HOST_IP=192.168.xxx.xxx \ # 设置主节点的 IP 地址
-e GLOO_SOCKET_IFNAME=eno1 \ # 指定集群通信的网卡接口
-e NCCL_SOCKET_IFNAME=eno1 # 指定 NCCL 通信的网卡接口
  • **--head**:标记该节点为集群的主节点。
  • **VLLM_HOST_IP**:设置主节点的 IP 地址,用于集群通信。
  • **GLOO_SOCKET_IFNAMENCCL_SOCKET_IFNAME**:指定集群通信使用的网卡接口名称(如 eno1),确保集群内部通信的正确性。

命令推荐后台运行或采用自动化脚本执行

3.2 启动从节点(Worker Node)

在从节点上运行以下命令启动集群的从节点:

1
2
3
4
5
6
7
8
sudo bash run_cluster.sh \
docker.1ms.run/vllm/vllm-openai:latest \ # 使用 vLLM 的 Docker 镜像
192.168.xxx.xxx \ # 主节点的 IP 地址
--worker \ # 指定为从节点
/data/model/qeternity/DeepSeek-R1-Distill-Qwen-32B-FP8 \ # 模型路径
-e VLLM_HOST_IP=192.168.xxx.xxx \ # 设置从节点的 IP 地址
-e GLOO_SOCKET_IFNAME=eno1 \ # 指定集群通信的网卡接口
-e NCCL_SOCKET_IFNAME=eno1 # 指定 NCCL 通信的网卡接口
  • **--worker**:标记该节点为集群的从节点。
  • **VLLM_HOST_IP**:设置从节点的 IP 地址,用于集群通信。
  • **GLOO_SOCKET_IFNAMENCCL_SOCKET_IFNAME**:与主节点相同,指定集群通信使用的网卡接口名称。

命令推荐后台运行或采用自动化脚本执行


4. 启动推理服务

在主节点的容器内启动 vLLM 推理服务:

1
2
3
4
5
6
7
8
9
vllm serve /root/.cache/huggingface \  # 模型缓存路径
--tokenizer /root/.cache/huggingface \ # Tokenizer 路径
--served-model-name llm \ # 模型服务名称
--port 9990 \ # 推理服务端口
--gpu-memory-utilization 0.85 \ # GPU 内存利用率(85%)
--max-model-len=16384 \ # 最大模型长度
--max-num-seqs 20 \ # 最大序列数
--tensor-parallel-size 8 \ # 张量并行大小
--pipeline-parallel-size 2 # 管道并行大小
  • **--served-model-name**:指定推理服务的名称,客户端通过此名称访问模型。
  • **--port**:指定推理服务的监听端口(如 9990)。
  • **--gpu-memory-utilization**:设置 GPU 内存利用率,避免 GPU 内存溢出。
  • **--max-model-len**:设置模型的最大输入长度。
  • **--max-num-seqs**:设置推理的最大序列数。
  • **--tensor-parallel-size--pipeline-parallel-size**:指定分布式推理的并行策略,提升推理效率。

5. 验证集群状态

在任意节点上进入容器并检查 Ray 集群状态:

1
2
sudo docker exec -it <容器ID> bash
ray status
  • 作用:检查 Ray 集群的状态,确保主节点和从节点已正确连接。

6. 测试推理服务

使用 curl 或其他工具测试推理服务是否正常运行:

1
curl -X POST -H "Content-Type: application/json" -d '{"prompt": "Hello, world!"}' http://192.168.191.11:9990/v1/chat/completions
  • 作用:向推理服务发送测试请求,验证服务是否正常响应。

如果返回合理的推理结果,说明部署成功。


通过以上步骤,可以在多机多卡环境中成功部署 vLLM 推理服务。如果有任何问题,百度吧,剩下的我也没遇到过。