推理引擎vLLM使用笔记 -- 0x01

01 背景

在火山云下,运行DS-70B模型;官方推荐的推荐引擎是vLLM,相关环境按火山文档逐步安装GPU-部署DeepSeek-R1-Distill模型;
资源信息如下:

资源 配置
磁盘 1 T
Mem 1 T
CPU 88vCPU
GPU 4 * H20 (4 * 98G)
系统 Ubuntu 22.04

02 使用情况

  • 按官方文档启动容器实例
    默认情况下,GPU的存储将被用满(预先给KV Cache预留,默认配置--gpu-memory-utilization 0.95);

实例启动后,根据使用的GPU的个数,有对应个数的CPU一直处于100%的运行状态;

  • 调整容器启动参数,运行多个实例(在火山官方的命令基础上调整参数)
    a.) 运行小模型实例,设置--gpu-memory-utilization 参数

以相同的参数配置运行两个7B模型,第二个实例报错分配的cache内存不足,错误信息如下:

ValueError: No available memory for the cache blocks. Try increasing `gpu_memory_utilization` when initializing the engine.

将第二个实例的--gpu-memory-utilization调大,容器实例正常运行;
启动命令如下:

## 实例1
docker run -d --network host --privileged --gpus=all --name=vllm_qwen7B --ipc=host  
-v /data/models:/data/models  -v /var/run/nvidia-topologyd/:/var/run/nvidia-topologyd/  
-e PORT=6002 -e MODEL_NAME=DeepSeek-R1-Distill-Qwen-7B 
-e VLLM_FLASH_ATTN_VERSION=2 -e TP=4  
-e CMD_ARGS="--gpu-memory-utilization 0.20" 
ai-containers-cn-beijing.cr.volces.com/deeplearning/vllm:0.7.1.v1.iaas

## 实例2
docker run -d --network host --privileged --gpus=all --name=vllm_qwen7B_01 --ipc=host  
-v /data/models:/data/models  -v /var/run/nvidia-topologyd/:/var/run/nvidia-topologyd/  
-e PORT=6003 -e MODEL_NAME=DeepSeek-R1-Distill-Qwen-7B 
-e VLLM_FLASH_ATTN_VERSION=2 -e TP=4  
-e CMD_ARGS="--gpu-memory-utilization 0.50" 
ai-containers-cn-beijing.cr.volces.com/deeplearning/vllm:0.7.1.v1.iaas

b.) 指定GPU运行模型实例,使用容器资源设置及应用环境变量方式
case-1: 指定模型运行的容器资源GPU个数小于模型的张量并行配置(实例启动失败)

实例正常启动运行,不受指定的GPU个数影响,运行在全部的GPU上

## 启动命令
docker run -d --rm --network host --privileged --gpus '"device=0,2"' --name=vllm_qwen7B --ipc=host 
 -v /data/models:/data/models  -v /var/run/nvidia-topologyd/:/var/run/nvidia-topologyd/  
-e PORT=6002 -e MODEL_NAME=DeepSeek-R1-Distill-Qwen-7B -e VLLM_FLASH_ATTN_VERSION=2 -e TP=4 
-e CMD_ARGS="--gpu-memory-utilization 0.20" 
ai-containers-cn-beijing.cr.volces.com/deeplearning/vllm:0.7.1.v1.iaas

case-2:容器资源GPU个数 === 张量并行配置 ===2,指定模型在第0,2张GPU上运行

实例正常启动运行,但不是在预期的GPU上运行,集中在第一张和第二张卡上

## 启动命令
docker run -d --rm --network host --privileged --gpus '"device=0,2"' --name=vllm_qwen7B --ipc=host 
 -v /data/models:/data/models  -v /var/run/nvidia-topologyd/:/var/run/nvidia-topologyd/  
-e PORT=6002 -e MODEL_NAME=DeepSeek-R1-Distill-Qwen-7B -e VLLM_FLASH_ATTN_VERSION=2 -e TP=2 
-e CMD_ARGS="--gpu-memory-utilization 0.20" 
ai-containers-cn-beijing.cr.volces.com/deeplearning/vllm:0.7.1.v1.iaas

case-3:在case-2的基础上,运行新实例,指定模型在第1,3张GPU上运行

实例正常启动运行,但不是在预期的GPU上运行,集中在第一张和第二张卡上

## 启动命令
docker run -d --rm --network host --privileged --gpus '"device=1,3"' --name=vllm_qwen7B_01 --ipc=host 
 -v /data/models:/data/models  -v /var/run/nvidia-topologyd/:/var/run/nvidia-topologyd/  
-e PORT=6003 -e MODEL_NAME=DeepSeek-R1-Distill-Qwen-7B -e VLLM_FLASH_ATTN_VERSION=2 -e TP=2 
-e CMD_ARGS="--gpu-memory-utilization 0.50" 
ai-containers-cn-beijing.cr.volces.com/deeplearning/vllm:0.7.1.v1.iaas

case-4: 应用环境变量GPU个数小于张量并行配置

实例启动不成功,日志信息如下:

## 日志
WARNING 04-29 02:44:53 ray_utils.py:315] The number of required GPUs exceeds the total number of available GPUs in the placement group.
INFO 04-29 02:45:03 ray_utils.py:212] Waiting for creating a placement group of specs for 10 seconds. specs=[{'node:10.25.1.2': 0.001, 'GPU': 1.0}, {'GPU': 1.0}, {'GPU': 1.0}, {'GPU': 1.0}]. Check `ray status` to see if you have enough resources.

## 启动命令
docker run -d --network host --privileged --gpus=all --name=vllm_qwen7B --ipc=host  
-v /data/models:/data/models  -v /var/run/nvidia-topologyd/:/var/run/nvidia-topologyd/  
-e PORT=6002 -e MODEL_NAME=DeepSeek-R1-Distill-Qwen-7B 
-e VLLM_FLASH_ATTN_VERSION=2 -e TP=4 
-e CUDA_VISIBLE_DEVICES=0,2 
-e CMD_ARGS="--gpu-memory-utilization 0.20" 
ai-containers-cn-beijing.cr.volces.com/deeplearning/vllm:0.7.1.v1.iaas

case-5: 应用环境变量GPU个数=== 张量并行配置 ===2,指定模型在第0,2张GPU上运行

实例正常运行在指定的GPU卡上

## 启动命令
docker run -d --network host --privileged --gpus=all --name=vllm_qwen7B --ipc=host  
-v /data/models:/data/models  -v /var/run/nvidia-topologyd/:/var/run/nvidia-topologyd/  
-e PORT=6002 -e MODEL_NAME=DeepSeek-R1-Distill-Qwen-7B 
-e VLLM_FLASH_ATTN_VERSION=2 -e TP=2 
-e CUDA_VISIBLE_DEVICES=0,2 
-e CMD_ARGS="--gpu-memory-utilization 0.20" 
ai-containers-cn-beijing.cr.volces.com/deeplearning/vllm:0.7.1.v1.iaas

case-6:在case-5的基础上,运行新实例,指定模型在第1,3张GPU上运行

实例正常运行在指定的GPU卡上,并且第二个实例的gpu-memory-utilization跟第一个实例一样(在 a.) 样例中,第二个实例需要调大gpu-memory-utilization配置)

## 启动命令
docker run -d --network host --privileged --gpus=all --name=vllm_qwen7B_01 --ipc=host  
-v /data/models:/data/models  -v /var/run/nvidia-topologyd/:/var/run/nvidia-topologyd/  
-e PORT=6003 -e MODEL_NAME=DeepSeek-R1-Distill-Qwen-7B 
-e VLLM_FLASH_ATTN_VERSION=2 -e TP=2 
-e CUDA_VISIBLE_DEVICES=1,3 
-e CMD_ARGS="--gpu-memory-utilization 0.20" 
ai-containers-cn-beijing.cr.volces.com/deeplearning/vllm:0.7.1.v1.iaas

03 问题及分析

  • 实例启动后,有对应GPU个数(被使用)的CPU一直处于100%的运行状态

分析: 在github上,发现该问题的issue:

100% CPU usage when idle

也已经有人提交了该问题的修复方式:Use less CPU when message queue has been empty for some time
根据提交的修复代码,修改本地的vllm对应的文件,并再进行验证,空闲时CPU的使用问题得到解决,但不确定是否会产生其他问题,只能待社区进行充分验证,关注下个release版本是否会引入该修改;

  • 以相同的参数配置运行两个7B模型,第二个实例报错分配的cache内存不足

分析: 根据异常提示 (core.py:208] raise ValueError("No available memory for the cache blocks. ),回溯抛出错误的逻辑块在kv_cache_utils.py中的check_enough_kv_cache_memory函数;
实现的具体代码块在vllm/v1/worker/gpu_worker.py中的determine_available_memory函数,如下图:


determine_available_memory

此函数在计算内存时,会把GPU当前被其他应用使用的内存也计算进来,即peak_memory会把第一个模型使用的存储也包含进来,进而导致在计算kv Cache可用内存时出现负数,导致服务启动失败;调高gpu-memory-utilization值,才可让此逻辑通过。

  • docker关于指定gpu参数不生效(--gpus )

分析: 使用容器指定GPU资源参数(--gpus)不生效 但使用CUDA_VISIBLE_DEVICES环境变量可以生效,同时docker/daemon.json中也已经配置了runtimes;所以初步可以排除NVIDIA 驱动,NVIDIA Container Toolkit等安装问题(在分析过程中找不到原因,该步骤重新执行一遍,依旧无效);
故使用笨方法:将启动命令的参数从基础的逐个增加指定的参数,观察导致该现象的原因,最后发现增加--privileged参数后,导致--gpus的配置无效;
相关参数说明如下:
privileged :


privileged

环境变量NVIDIA_VISIBLE_DEVICES & CUDA_VISIBLE_DEVICES:


NVIDIA_VISIBLE_DEVICES & CUDA_VISIBLE_DEVICES

04 小结

  • 关于资源的使用
    思考:大模型应用的资源使要求都比较高,是否导致框架在设计层面更多考虑代码逻辑的高效和资源的独享(空闲时cpu跑满,模型独享GPU)
  • 应用部署考虑
    基础的模型服务独享一套环境,不同其他服务混部(包括其他模型)
    生产上GPU资源提前做好规划隔离,后期的扩容可能成本比较高;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容