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资源提前做好规划隔离,后期的扩容可能成本比较高;



