網(wǎng)站怎么添加背景如何在百度上做產(chǎn)品推廣
文章目錄
-
- 1、vLLM分布式部署
-
- docker鏡像構(gòu)建
- 通信環(huán)境配置
- 2、其他大模型部署工具
- 3、問題記錄
- 參考文獻(xiàn)
單臺機器GPU資源不足以執(zhí)行推理任務(wù)時,一個方法是模型蒸餾量化,結(jié)果就是會犧牲些效果。另一種方式是采用多臺機器多個GPU進(jìn)行推理,資源不足就堆機器雖然暴力但也是個不錯的解決方法。值得注意的是多機多卡部署的推理框架,也適用于單機多卡,單機單卡,這里不過多贅述。
1、vLLM分布式部署
我的需求是Ubuntu中部署70B+大模型,不量化,兩臺機器,每臺機器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時加上了使容器不退出的一行代碼:tail -f /dev/null。
去掉的主要原因是作為新手小白,部署環(huán)境在頻繁的踩坑,需要隨時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)境配置
?? 我是一臺機器啟動了一個docker,將docker當(dāng)作一個節(jié)點,在docker里面執(zhí)行ray start --head --port=6379,將另一臺機器的docker作為worker節(jié)點,并加入到ray cluster中,如果機器間的通信沒有問題,worker節(jié)點在幾秒內(nèi)就能加入集群。
-
docker run啟動
ray集群的構(gòu)建,涉及到很多端口,且有些是在某個范圍內(nèi)隨機分配端口,如果采用docker和容器間的端口一一映射形式啟動docker,docker run命令會執(zhí)行相當(dāng)久且不利于firewall規(guī)則的配置,因此建議選用network=host ipc=host形式的docker啟動方式。 -
firewall規(guī)則的配置
在work節(jié)點執(zhí)行ray start --address==xxx命令后,work節(jié)點加入了ray cluster,短暫時間后執(zhí)行ray status命令,work節(jié)點掉線了,多半是機器間的通信問題,如果是同一網(wǎng)段的兩臺機器,可以采用以下命令設(shè)置同一網(wǎng)段內(nèi)的機器互相訪問無限制(命令僅需在head節(jié)點的宿主機中操作,網(wǎng)段替換為宿主機的實際網(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é)點多GPU部署LLM,節(jié)點間的通信涉及到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)卡名稱,指定采用哪個網(wǎng)卡進(jìn)行通信。下面的CUDA_HOME替換為你的cuda的實際路徑。
# 環(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里面的主機設(shè)置
確保head節(jié)點的IP與指定的通信網(wǎng)卡的IP一致,同時,檢查/etc/hosts里面的IP對應(yīng)的主機名與docker的主機名是一致的。
2、其他大模型部署工具
- 推理工具
- Deepspeed-inference& Deepspeed-fastgen
- Accelerate
- TensorRT-LLM
- ollama
- llama.cpp
- FastChat
- serving部署工具
- Triton inferece server(僅FasterTransformer后端支持多節(jié)點多卡部署)
- LMdeploy
- vllm
3、問題記錄
- 【1】vllm啟動時出現(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啟動時出現(xiàn) NameError: name ‘vllm_ops’ is not defined 問題
- 為保持整篇文章的整潔,原因分析和解決辦法我放另一篇文章了
- 【3】vLLM執(zhí)行推理時出現(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ù)啟動后出現(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í)行即可
- 或者重啟整個ray,即ray stop后再次ray start命令
- 【5】啟動ray集群后,再執(zhí)行更新python庫、環(huán)境變量變更等操作,嘗試啟動vllm推理可能不起作用
- ray stop后重新啟動ray cluster
- 【6】vLLM未正常啟動,出現(xiàn)報錯: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和主機名映射出現(xiàn)問題。
參考文獻(xiàn)
- vLLM分布式多GPU Docker部署踩坑記:博客
- vLLM官方倉庫及文檔:Github