網(wǎng)站怎么添加背景如何在百度上做產(chǎn)品推廣
文章目錄
-
- 1、vLLM分布式部署
-
- docker鏡像構(gòu)建
- 通信環(huán)境配置
- 2、其他大模型部署工具
- 3、問題記錄
- 參考文獻(xiàn)
單臺機(jī)器GPU資源不足以執(zhí)行推理任務(wù)時(shí),一個(gè)方法是模型蒸餾量化,結(jié)果就是會(huì)犧牲些效果。另一種方式是采用多臺機(jī)器多個(gè)GPU進(jìn)行推理,資源不足就堆機(jī)器雖然暴力但也是個(gè)不錯(cuò)的解決方法。值得注意的是多機(jī)多卡部署的推理框架,也適用于單機(jī)多卡,單機(jī)單卡,這里不過多贅述。
1、vLLM分布式部署
我的需求是Ubuntu中部署70B+大模型,不量化,兩臺機(jī)器,每臺機(jī)器4張4090 24G顯卡,采用docker環(huán)境,在稍微調(diào)研了一些支持多級多卡、支持serving部署的工具后,最終選擇vllm部署,主要原因是看著簡單,主流的開源LLM都支持且提供OpenAI接口訪問。
docker鏡像構(gòu)建
?? docker鏡像構(gòu)建基本上就是參照一位博主的文章vLLM分布式多GPU Docker部署踩坑記來構(gòu)建的鏡像,區(qū)別就是去掉了里面的ENTRYPOINT以及添加node的entrypoint,僅在執(zhí)行命令docker run時(shí)加上了使容器不退出的一行代碼:tail -f /dev/null。
去掉的主要原因是作為新手小白,部署環(huán)境在頻繁的踩坑,需要隨時(shí)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是我自己構(gòu)建的docker image.
通信環(huán)境配置
?? 我是一臺機(jī)器啟動(dòng)了一個(gè)docker,將docker當(dāng)作一個(gè)節(jié)點(diǎn),在docker里面執(zhí)行ray start --head --port=6379,將另一臺機(jī)器的docker作為worker節(jié)點(diǎn),并加入到ray cluster中,如果機(jī)器間的通信沒有問題,worker節(jié)點(diǎn)在幾秒內(nèi)就能加入集群。
-
docker run啟動(dòng)
ray集群的構(gòu)建,涉及到很多端口,且有些是在某個(gè)范圍內(nèi)隨機(jī)分配端口,如果采用docker和容器間的端口一一映射形式啟動(dòng)docker,docker run命令會(huì)執(zhí)行相當(dāng)久且不利于firewall規(guī)則的配置,因此建議選用network=host ipc=host形式的docker啟動(dòng)方式。 -
firewall規(guī)則的配置
在work節(jié)點(diǎn)執(zhí)行ray start --address==xxx命令后,work節(jié)點(diǎn)加入了ray cluster,短暫時(shí)間后執(zhí)行ray status命令,work節(jié)點(diǎn)掉線了,多半是機(jī)器間的通信問題,如果是同一網(wǎng)段的兩臺機(jī)器,可以采用以下命令設(shè)置同一網(wǎng)段內(nèi)的機(jī)器互相訪問無限制(命令僅需在head節(jié)點(diǎn)的宿主機(jī)中操作,網(wǎng)段替換為宿主機(jī)的實(shí)際網(wǎng)段)firewall-cmd --permanent --zone=trusted --add-source=192.168.0.0/16 #允許該網(wǎng)段所有訪問所有端口 firewall-cmd --reload
不建議直接關(guān)閉掉防火墻,容易產(chǎn)生更大的安全問題。更多信息參考該博文。
-
環(huán)境變量配置
vllm多節(jié)點(diǎn)多GPU部署LLM,節(jié)點(diǎn)間的通信涉及到GOO、TCP、NCCL等,下面是一些配置信息(docker內(nèi)編輯/etc/profile文件,并source /etc/profile,或者寫入~/.bashrc,同樣需要source ~/.bashrc)# 指定通信網(wǎng)卡 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是容器中的網(wǎng)卡名稱,指定采用哪個(gè)網(wǎng)卡進(jìn)行通信。下面的CUDA_HOME替換為你的cuda的實(shí)際路徑。
# 環(huán)境變量 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里面的主機(jī)設(shè)置
確保head節(jié)點(diǎn)的IP與指定的通信網(wǎng)卡的IP一致,同時(shí),檢查/etc/hosts里面的IP對應(yīng)的主機(jī)名與docker的主機(jī)名是一致的。
2、其他大模型部署工具
- 推理工具
- Deepspeed-inference& Deepspeed-fastgen
- Accelerate
- TensorRT-LLM
- ollama
- llama.cpp
- FastChat
- serving部署工具
- Triton inferece server(僅FasterTransformer后端支持多節(jié)點(diǎn)多卡部署)
- LMdeploy
- vllm
3、問題記錄
- 【1】vllm啟動(dòng)時(shí)出現(xiàn) WARNING[XFORMERS]: xFormers can’t load C++/CUDA extensions. xFormers was built for 問題
- 現(xiàn)象1:PyTorch 2.3.0+cu121 with CUDA 1201 (you have 2.3.0+cu118)
- 現(xiàn)象2:Python 3.10.14 (you have 3.10.12)
- 原因: xFormers與pytorch、cuda、python版本不一致,解決辦法就是找到相應(yīng)的包重新安裝,conda-xFormers版本列表、Github-xFormers,或者更新你得pytorch版本,選擇torch2.3.0+cu12
- 【2】vllm啟動(dòng)時(shí)出現(xiàn) NameError: name ‘vllm_ops’ is not defined 問題
- 為保持整篇文章的整潔,原因分析和解決辦法我放另一篇文章了
- 【3】vLLM執(zhí)行推理時(shí)出現(xiàn):ValueError: Total number of attention heads (32) must be divisible by tensor parallel size (6).
- 更改vLLM的tensor_parallel_size參數(shù),使其可以被被部署的大模型的注意力頭數(shù)整除即可,頭數(shù)可以查看大模型config.json中的參數(shù):num_attention_heads。
- 【4】vllm在線OpenAI接口推理服務(wù)啟動(dòng)后出現(xiàn):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 ,上次未正確退出導(dǎo)致,kill掉再次執(zhí)行即可
- 或者重啟整個(gè)ray,即ray stop后再次ray start命令
- 【5】啟動(dòng)ray集群后,再執(zhí)行更新python庫、環(huán)境變量變更等操作,嘗試啟動(dòng)vllm推理可能不起作用
- ray stop后重新啟動(dòng)ray cluster
- 【6】vLLM未正常啟動(dòng),出現(xiàn)報(bào)錯(cuò):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.- 未正確設(shè)置GLOO_SOCKET_IFNAME、TP_SOCKET_IFNAME或者NCCL通信相關(guān)的環(huán)境變量,按照上述通信環(huán)境配置-環(huán)境變量配置后,重啟ray環(huán)境。極少可能是hosts文件中IP和主機(jī)名映射出現(xiàn)問題。
參考文獻(xiàn)
- vLLM分布式多GPU Docker部署踩坑記:博客
- vLLM官方倉庫及文檔:Github