VLLM+ray多节点部署大模型
现在的大模型越来越大,分布式部署大模型已经成为不可避免,学习一下分布式部署模型的方式成为算法工程师的必备技能。
添加图片注释,不超过 140 字(可选)
部署方案:A机器上有4张卡,B机器上有4张卡,我只用A机器上的1张卡和B机器上的1张卡。(官方的样例是使用节点的所有卡,这里两个节点各选一张是为了能够学习和验证分布式部署,其他的卡主要是已经部署了服务,不方便让其他人把服务下了。。)这里的步骤将官方的脚本进行拆解,按步骤分步执行。 环境: 显卡型号:v100 cuda版本:12.2 vllm镜像:0.7.3 大模型:qwen-coder-32b-gptq
1 启动容器:在两个节点都启动一个容器。
docker run --rm -it --cap-add=ALL --security-opt seccomp=unconfined -e NVIDIA_VISIBLE_DEVICES=0 -e DEVICE=cuda:0 --shm-size 10.24g --name llm-ray --network=host --ipc=host -v /data:/mnt --entrypoint /bin/bash vllm/vllm-openai:v0.7.3
注:--cap-add=ALL --security-opt seccomp=unconfined 是为了控制容器的权限,否则ray在启动的时候会因权限不够而失败。也可以直接用特权模式--privileged,但是我为了控制容器接入指定的0号显卡,这里不使用特权模型。特权模式会让指定失败。NVIDIA_VISIBLE_DEVICES=0 -e DEVICE=cuda:0 用来指定使用0号显卡。--network=host --ipc=host指定容器的网络和host一致。
2 安装ray:vllm中的镜像安装的mini版 ray,为了以防万一用完整版的ray来部署。 Pip3 install ray[default]
3 配置nccl 因为涉及多个节点,这里需要指定网卡来通信。一般网卡众多,本方案是没有高速互联使用pcie的方案。运行ifconfig查看存在的网卡,挑选一个是inet字段是本机ip的网卡。尽量不要选择docke和io。记录要选择的网卡名称后,通过以下命令设置环境变量,注意,不同的节点网络设置不同,网卡名称可能不相同,要逐个节点查看,逐个节点设置,防止启动模型的时候出现nccl错误。
export NCCL_DEBUG=INFO # 为了能够在出问题的时候查看具体的报错内容export NCCL_SOCKET_IFNAME=ibp25s0 # 设置指定的网卡export GLOO_SOCKET_IFNAME= ibp25s0 # 设置指定的网卡export TP_SOCKET_IFNAME= ibp25s0 # 设置指定的网卡export NCCL_IB_DISABLE=1 # 如果使用以太网而非 InfiniBand,InfiniBand是高速互联。
注:官方有一种设置NCCL_SOCKET_IFNAME的方式是在开头加上“^”,这个符号表示非,用于过滤掉后面所有逗号隔开的网卡名称,例如NCCL_SOCKET_IFNA这个符号表示非,用于过滤掉后面所有逗号隔开的网卡名称,例如NCCL_SOCKET_IFNAME=^br,ca,en,是将名称以br开头,ca开头,en开头等网卡过滤掉,剩下的就是你用的网卡。这里为了简单直接设置想要使用的网卡:export NCCL_SOCKET_IFNAME=ibp25s0。另外docker和io这两个网卡一般不会使用,除非没有其他的网卡可以用。
4 使用 Ray 启动多节点任务
在主节点上启动 Ray Head:ray start--head --port=6379 在其他节点上启动 Ray Worker:ray start--address='<主节点IP>:6379' ray status或ray list nodes 查看是否启动成功,需要观察节点数和gpu数量。 python3 -m vllm.entrypoints.openai.api_server--model /mnt/Qwen2.5-Coder-32B-Instruct-GPTQ-Int4 --served-model-name Qwen25-32-gptq --host0.0.0.0--port6800--block-size16--pipeline-parallel-size2--trust-remote-code--enforce-eager
5 启动模型 模型参数需要在主节点和其他节点都放置一份,映射到docker容器内的路径相同。
python3 -m vllm.entrypoints.openai.api_server --model /mnt/Qwen2.5-Coder-32B-Instruct-GPTQ-Int4 --served-model-name Qwen25-32-gptq --host 0.0.0.0 --port 6800 --block-size 16 --pipeline-parallel-size 2 --trust-remote-code --enforce-eager
注:这里我只有两张卡,而且是两个节点所以没有设置--tensor-parallel-size。在生产部署双节点16张卡的配置是--pipeline-parallel-size=2 --tensor-parallel-size=8
参考链接: 1https://blog.csdn.net/qq_15060477/article/details/145793576?spm=1001.2014.3001.5506 2https://mp.weixin.qq.com/s/kUwgNtDN16qm82h8FWu31g 3https://mp.weixin.qq.com/s/tdubYmXNt98ZN6SB7iMIrw 4 vllm官方https://docs.vllm.ai/en/latest/getting_started/examples/multi-node-serving.html 5vllm官方https://docs.vllm.ai/en/latest/serving/distributed_serving.html 6nccl官方https://docs.nvidia.com/deeplearning/nccl/user-guide/docs/env.html?highlight=nccl_socket_ifname
人工智能芯片与自动驾驶

浙公网安备 33010602011771号