内容: a. DeepSeek-671B 大模型部署于两台配备 8卡 L20 GPU 的服务器。技术栈采用 Docker 容器化技术,VLLM高性能推理引擎和 Ray 分布式计算框架。
b. 官方文档: VLLM-Distributed
c. 官方教程操作流程繁琐,需要在多个SSH会话窗口之间频繁切换。为简化部署过程,本文基于官方文档进行了流程整合与优化,将原本分散的步骤系统化整理,提供一套更为简洁明了的一站式部署指南。
前置条件: a. 两台服务器上安装:Docker,Nvidia驱动,Nvidia container toolkit。
b. 确认两台服务器网络硬件配置(可与硬件厂商确认)。可使用 ifconfig 和 ping 来确认网络连接。
c. 下载 DeepSeek-671B模型+ VLLM的docker镜像至两台服务器上。本示例使用DeepSeek-V3(int4 版本)。
确认服务器的网络配置并在下方docker compose 文件里调整环境变量: #IB网络确认: ibv_devinfo 显示No IB devices found 指无IB网络设备, 显示Link layer: Ethernet则网卡是RoCE而非IB, 显示Link layer: InfiniBand则是IB网络 #如果因为服务器无IB设备或者IB设备不一致而需要禁用IB网络: NCCL_IB_DISABLE=1 --禁用IB NCCL_IBEXT_DISABLE=1 --禁用RoCE #如果有ib网络则可配置如下,自行调整网卡名称: - NCCL_SOCKET_IFNAME=bond0 - GLOO_SOCKET_IFNAME=bond0 - NCCL_IB_HCA=mlx5_0,mlx5_3 - NCCL_IB_TIMEOUT=22 - NCCL_IB_DISABLE=0 - NCCL_DEBUG=INFO #如果无ib网络则可配置如下,自行调整网卡名称: - GLOO_SOCKET_IFNAME=bond0 - NCCL_SOCKET_IFNAME=bond0 - NCCL_IB_DISABLE=1 - NCCL_IBEXT_DISABLE=1 - NCCL_DEBUG=INFO Ray框架需要确认头节点(head node)和子节点(worker node)。两台服务器上分别准备docker compose 文件: #定义变量: # 头节点: VLLM_HOST_IP --本机ip RAY_PORT --本机ray端口号,和模型服务使用端口号有所区分 VOLUME_DS_RAY --本机RAY日志存储位置(可选) VOLUME_DS_V3_MODEL_PATH --本机模型路径 # 子节点: VLLM_HOST_IP --本机ip RAY_HEAD_IP --头节点的ip,与上面的VLLM_HOST_IP保持一致 RAY_PORT --头节点使用的IP,与上面的RAY_PORT保持一致 VOLUME_DS_RAY --本机RAY日志存储位置(可选) VOLUME_DS_V3_MODEL_PATH --本机模型路径 #头节点部分 node-head-ds-v3: image: vllm/vllm-openai:v0.11.0 container_name: node-head-ds-v3 entrypoint: ["/bin/bash", "-c", "ray start --block --head --node-ip-address=${VLLM_HOST_IP} --port=${RAY_PORT}"] network_mode: host privileged: true shm_size: 64g deploy: resources: reservations: devices: - driver: nvidia capabilities: [gpu] device_ids: ['0', '1', '2', '3', '4', '5', '6', '7'] volumes: - ${VOLUME_DS_V3_PATH}:/ds-v3 - ${VOLUME_DS_V3_PATH}/ray:/tmp/ray - ${VOLUME_DS_V3_MODEL_PATH}:/models environment: - NCCL_IB_HCA=mlx5_0,mlx5_3 - NCCL_SOCKET_IFNAME=bond0 - GLOO_SOCKET_IFNAME=bond0 - NCCL_DEBUG=INFO - VLLM_HOST_IP=${VLLM_HOST_IP} - NCCL_IB_TIMEOUT=22 - NCCL_IB_DISABLE=0 #子节点部分 node-worker-ds-v3: image: vllm/vllm-openai:v0.11.0 container_name: node-worker-ds-v3 entrypoint: ["/bin/bash", "-c", "ray start --block --address=${RAY_HEAD_IP}:${RAY_PORT}"] network_mode: host privileged: true shm_size: 64g deploy: resources: reservations: devices: - driver: nvidia capabilities: [gpu] device_ids: ['0', '1', '2', '3', '4', '5', '6', '7'] volumes: - ${VOLUME_DS_V3_PATH}:/ds-v3 - ${VOLUME_DS_RAY}/ray:/ds-v3/tmp/ray - ${VOLUME_DS_V3_MODEL_PATH}:/models environment: - GLOO_SOCKET_IFNAME=bond0 - NCCL_SOCKET_IFNAME=bond0 - VLLM_HOST_IP=${VLLM_HOST_IP} - NCCL_IB_HCA=mlx5_0,mlx5_3 - NCCL_IB_TIMEOUT=22 - NCCL_IB_DISABLE=0 两个节点分别启动容器,然后进入头节点容器,确认ray框架搭建成功,即可启动服务 --头节点 docker compose up -d node-head-ds-v3 --子节点 docker compose up -d node-worker-ds-v3 --进入头节点: sudo docker exec -it node-head-ds-v3 bash --查看ray节点连接情况: ray status --RAY框架需要头节点和子节点互通,本次实践中在子节点使用以下命令打开防火墙限制(可选): sudo ufw allow from $VLLM_POST_IP --出现两个 Active Node即连接成功 ...