一、使用V100的显卡,设置多个进程并发调用Vllm加载的大模型时发现,模型运行起来的时间是累加起来的,说明vllm响应的多并发是按照串行的方式。
原因:目前这个问题不清楚是因为Vllm的不支持Vllm的原因还是其他原因。
二、在引用vllm包的时候提示“ImportError: No module named vllm”
(一)错误提示:
Traceback (most recent call last):
File "test.py", line 3, in <module>
from vllm import LLM, SamplingParams
ImportError: No module named vllm
(二)排查:
首先,排查是否正确安装了vllm包,如果没有的话,就pip install vllm。
我这里是正常安装了的,甚至又重新装了一遍。
(三)原因:
当前或父级目录下有一个文件夹名字vllm与vllm库名字冲突,import命令将其放在了vllm库优先级之前,换个路径运行就可以了,或者重命名文件夹(我选择重命名了文件夹)。
三、vllm中的参数enforce_eager设为True后会导致统计的推理时间变长
1.概念:
enforce_eager
是一个参数,用于控制vLLM是否始终使用PyTorch的eager模式(即时执行模式),默认为False,vLLM会默认使用eager模式和CUDA图的混合模式来执行操作,这种混合模式旨在提供最大的性能和灵活性。
CUDA图是PyTorch中用于优化性能的一种技术。禁用CUDA图(即设置enforce_eager
为True)可能会影响性能,但可以减少内存需求。对于小型模型,CUDA图可能对性能提升有帮助,但对于大型模型,性能差异可能不大
2.总结:
(1)如果模型较小,且性能是关键考虑因素,可以考虑使用CUDA图,即默认状态,不做变动。
(2)如果模型较大,或者需要减少内存使用,可以考虑启用enforce_eager
。
(3)在实际部署之前,最好进行一系列的测试,以确定最佳的配置。可以先尝试不启用enforce_eager
,如果遇到显存不足或性能问题,再考虑启用它。
3.解决方案:
最终去掉了这个参数后,总体推理时间恢复到20s,如果设置enforce_eager=True,则推理时间为100s+,推理时间差距太大了。
from vllm import LLM, SamplingParams
llm = LLM(
model="model/Qwen2.5-32B-Instruct-GPTQ-Int4",
tensor_parallel_size=8,
trust_remote_code=True,
dtype="half",
max_num_batched_tokens=32768, # 减小批处理token数--最大32768可能超出内存
gpu_memory_utilization=0.85, # 降低GPU显存使用率
swap_space=4, # 增加CPU内存交换空间
# enforce_eager=True, # 强制即时执行模式
max_num_seqs=64, # 限制最大序列数
# max_model_len=4096, # 限制模型最大长度(这个参数是R1蒸馏的模型必须要有的)
)
四、swap_space 设为多少合适?如何进行选择?
swap_space 参数的选择需要根据以下几个因素来权衡:
1.模型大小:
Qwen2.5-32B 模型约需要 32GB 的模型权重空间
在 half precision (FP16) 下,基础内存需求约为 16GB
运行时还需要额外的内存用于 attention cache 和中间激活值
2.GPU显存容量:
如果您使用 8 张 GPU (tensor_parallel_size=8)
每张卡大约需要处理 32B/8 ≈ 4GB 的模型权重
加上运行时内存,每张卡实际需求会更高
3.swap_space 计算参考公式:
recommended_swap = (model_size_gb / num_gpus) * swap_factor
选择建议:
1.保守设置:
如果 GPU 显存较小,设置较大的 swap_space (6-8GB)
会牺牲一些性能,但能确保稳定运行
2.平衡设置:
对于常见的配置,设置 4GB 通常是个不错的选择
在性能和稳定性之间取得平衡
3.激进设置:
如果 GPU 显存充足,可以设置较小的 swap_space (2GB或更少)
能获得更好的性能,但要注意监控内存使用
4.动态调整:
可以从较大值开始(如 6GB)
逐步减小并监控性能和稳定性
找到最适合您硬件的值
5.监控指标:
如果看到 OOM 错误,需要增加 swap_space
如果 CPU 使用率过高,可能 swap 太大
如果生成速度明显变慢,可以尝试减小 swap_space
6.# 根据不同情况选择 swap_space
swap_space=6, # 如果 GPU 显存较小(如 24GB)
# swap_space=4, # 如果 GPU 显存较大(如 32GB)
# swap_space=2, # 如果 GPU 显存充足(如 40GB+)
五、VLLM无法加载AWQ量化的模型
结论:经过实验,VLLM无法加载AWQ量化的模型。
六、Vllm加载Qwen2.5-7B-Instruct-GPTQ-Int4Qwen2.5-14B-Instruct-GPTQ-Int4模型提示错误。
提示内容:The input size is not aligned with the quantized weight shape. This can be caused by too large tensor parallel size.(输入大小与量化权重形状不对齐。这可能是由太大的张量并行大小引起的)
设置的参数:
python -m vllm.entrypoints.openai.api_server \
--model /data/sxw/3-model/Qwen2.5-14B-Instruct-GPTQ-Int4 \
--served-model-name Qwen2.5-14B-Instruct-GPTQ-Int4 \
--gpu-memory-utilization 0.85 \
--max-num-batched-tokens 32768 \
--max-model-len 8192 \
--dtype half \
--tensor-parallel-size 8 \
--swap-space 4 \
--max-num-seqs 100 \
修改参数:
python -m vllm.entrypoints.openai.api_server \
--model /data/sxw/3-model/Qwen2.5-14B-Instruct-GPTQ-Int4 \
--served-model-name Qwen2.5-14B-Instruct-GPTQ-Int4 \
--gpu-memory-utilization 0.85 \
--max-num-batched-tokens 32768 \
--max-model-len 4096 \
--dtype half \
--tensor-parallel-size 8 \
--swap-space 4 \
--max-num-seqs 64 \
提示:Total number of attention heads (40) must be divisible by tensor parallel size (7)
并行数设为8不合适,并且并行数还得能被40整除,于是将tensor-parallel-size设为4。但依然报错
UserWarning: resource_tracker: There appear to be 1 leaked shared_memory objects to clean up at shutdown warnings.warn('resource_tracker: There appear to be %d '。
Failed: Cuda error /workspace/csrc/custom_all_reduce.cuh:364 'invalid argument'
最终原因:是Qwen2.5-7B-Instruct-GPTQ-Int4和Qwen2.5-14B-Instruct-GPTQ-Int4的模型在用vllm运行的时候,只能使用一张卡。tensor parallel size 只能设为1。
七、Vllm不能同时运行多个模型
经过测试,在Vllm使用命令已经加一个模型运行后,再运行另一个模型,就会提示:OSError: [Errno 98] Address already in use
所以,Vllm无法像ollama那样同时加载多个模型在显存中,想调用哪个的模型的时候就直接使用API等方式调用。