马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
文章目次
- 1、vLLM分布式摆设
- 2、其他大模子摆设工具
- 3、问题记录
- 参考文献
单台机器GPU资源不足以执行推理任务时,一个方法是模子蒸馏量化,效果就是会牺牲些效果。另一种方式是采取多台机器多个GPU举行推理,资源不足就堆机器固然暴力但也是个不错的解决方法。值得注意的是多机多卡摆设的推理框架,也适用于单机多卡,单机单卡,这里不过多赘述。
1、vLLM分布式摆设
我的需求是Ubuntu中摆设70B+大模子,不量化,两台机器,每台机器4张4090 24G显卡,采取docker环境,在轻微调研了一些支持多级多卡、支持serving摆设的工具后,终极选择vllm摆设,主要缘故原由是看着简朴,主流的开源LLM都支持且提供OpenAI接口访问。
docker镜像构建
?? docker镜像构建基本上就是参照一位博主的文章vLLM分布式多GPU Docker摆设踩坑记来构建的镜像,区别就是去掉了里面的ENTRYPOINT以及添加node的entrypoint,仅在执行命令docker run时加上了使容器不退出的一行代码:tail -f /dev/null。
去掉的主要缘故原由是作为新手小白,摆设环境在频仍的踩坑,必要随时stop/start ray集群。
- docker run -d
- --runtime=nvidia
- --network=host
- --ipc=host
- -v ${volume_user}:/vllm
- --gpus $gpus
- --name $container_name
- vllm:v5
- tail -f /dev/null
复制代码 注意: dockerfile里面不要使用命令EXPOSE暴露任何端口, vllm:v5是我自己构建的docker image.
通讯环境配置
?? 我是一台机器启动了一个docker,将docker当作一个节点,在docker里面执行ray start --head --port=6379,将另一台机器的docker作为worker节点,并加入到ray cluster中,假如机器间的通讯没有问题,worker节点在几秒内就能加入集群。
- docker run启动
ray集群的构建,涉及到许多端口,且有些是在某个范围内随机分配端口,假如采取docker和容器间的端口一一映射情势启动docker,docker run命令会执行相称久且不利于firewall规则的配置,因此发起选用network=host ipc=host情势的docker启动方式。
- firewall规则的配置
在work节点执行ray start --address==xxx命令后,work节点加入了ray cluster,短暂时间后执行ray status命令,work节点掉线了,多半是机器间的通讯问题,假如是同一网段的两台机器,可以采取以下命令设置同一网段内的机器互相访问无限定(命令仅需在head节点的宿主机中操作,网段更换为宿主机的实际网段)
- firewall-cmd --permanent --zone=trusted --add-source=192.168.0.0/16 #允许该网段所有访问所有端口
- firewall-cmd --reload
复制代码 不发起直接关闭掉防火墙,容易产生更大的安全问题。更多信息参考该博文。
- 环境变量配置
vllm多节点多GPU摆设LLM,节点间的通讯涉及到GOO、TCP、NCCL等,下面是一些配置信息(docker内编辑/etc/profile文件,并source /etc/profile,或者写入~/.bashrc,同样必要source ~/.bashrc)
- # 指定通信网卡
- export GLOO_SOCKET_IFNAME=eno16np0
- export TP_SOCKET_IFNAME=eno16np0
- # NCCL配置
- # export NCCL_SOCKET_NTHREADS=10
- export NCCL_SOCKET_IFNAME=eno16np0
- export NCCL_DEBUG=info
- export NCCL_NET=Socket
- export NCCL_IB_DISABLE=0
复制代码 eno16np0是容器中的网卡名称,指定采取哪个网卡举行通讯。下面的CUDA_HOME更换为你的cuda的实际路径。
- # 环境变量
- export CUDA_HOME="/usr/local/cuda-12.1"
- export PATH="${CUDA_HOME}/bin${PATH:+:"${PATH}"}"
- export LD_LIBRARY_PATH="${CUDA_HOME}/lib64:${CUDA_HOME}/extras/CUPTI/lib64${LD_LIBRARY_PATH:+:"${LD_LIBRARY_PATH}"}"
- export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH
复制代码 - docker里面的主机设置
确保head节点的IP与指定的通讯网卡的IP同等,同时,检查/etc/hosts里面的IP对应的主机名与docker的主机名是同等的。
2、其他大模子摆设工具
- 推理工具
- Deepspeed-inference& Deepspeed-fastgen
- Accelerate
- TensorRT-LLM
- ollama
- llama.cpp
- FastChat
- serving摆设工具
- Triton inferece server(仅FasterTransformer后端支持多节点多卡摆设)
- LMdeploy
- vllm
3、问题记录
- 【1】vllm启动时出现 WARNING[XFORMERS]: xFormers can’t load C++/CUDA extensions. xFormers was built for 问题
- 征象1:PyTorch 2.3.0+cu121 with CUDA 1201 (you have 2.3.0+cu118)
- 征象2:Python 3.10.14 (you have 3.10.12)
- 缘故原由: xFormers与pytorch、cuda、python版本不同等,解决办法就是找到相应的包重新安装,conda-xFormers版本列表、Github-xFormers,或者更新你得pytorch版本,选择torch2.3.0+cu12
- 【2】vllm启动时出现 NameError: name ‘vllm_ops’ is not defined 问题
- 为保持整篇文章的整齐,缘故原由分析息争决办法我放另一篇文章了
- 【3】vLLM执行推理时出现:ValueError: Total number of attention heads (32) must be divisible by tensor parallel size (6).
- 更改vLLM的tensor_parallel_size参数,使其可以被被摆设的大模子的注意力头数整除即可,头数可以查察大模子config.json中的参数:num_attention_heads。
- 【4】vllm在线OpenAI接口推理服务启动后出现:ValueError: Ray does not allocate any GPUs on the driver node. Consider adjusting the Ray placement group or running the driver on a GPU node
- 可能是后台有相同的命令: python -m vllm.entrypoints.openai.api_server ,前次未精确退出导致,kill掉再次执行即可
- 或者重启整个ray,即ray stop后再次ray start命令
- 【5】启动ray集群后,再执行更新python库、环境变量变动等操作,实验启动vllm推理可能不起作用
- 【6】vLLM未正常启动,出现报错:RuntimeError: Gloo connectFullMesh failed with […/third_party/gloo/gloo/transport/tcp/pair.cc:144] no erro 且
Error executing method init_device. This might cause deadlock in distributed execution.
- 未精确设置GLOO_SOCKET_IFNAME、TP_SOCKET_IFNAME或者NCCL通讯相关的环境变量,按照上述通讯环境配置-环境变量配置后,重启ray环境。少少可能是hosts文件中IP和主机名映射出现问题。
参考文献
- vLLM分布式多GPU Docker摆设踩坑记:博客
- vLLM官方仓库及文档:Github
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |