VLLM相关问题

目录

一、使用V100的显卡,设置多个进程并发调用Vllm加载的大模型时发现,模型运行起来的时间是累加起来的,说明vllm响应的多并发是按照串行的方式。

二、在引用vllm包的时候提示“ImportError: No module named vllm”

三、vllm中的参数enforce_eager设为True后会导致统计的推理时间变长

四、swap_space 设为多少合适?如何进行选择?

五、VLLM无法加载AWQ量化的模型

六、Vllm加载Qwen2.5-7B-Instruct-GPTQ-Int4Qwen2.5-14B-Instruct-GPTQ-Int4模型提示错误。

七、vLLM不能同时运行多个模型

八、vllm部署Qwen3-30B-A3B的时候,提示:There appear to be 1 leaked shared_memory objects to clean up at shutdown warnings.warn('resource_tracker: There appear to be %d '

九、使用vllm部署Qwen3-30B-A3B的时候,提示:LLVM ERROR: Failed to compute parent layout for slice layout

1. fork vs spawn 的核心区别

2. 为何推荐 spawn?

3. 性能权衡与优化

4. 官方推荐与社区实践

5. 总结


一、使用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 同时部署多个模型及调用_vllm部署多个模型-CSDN博客

所以,Vllm无法像ollama那样同时加载多个模型在显存中,想调用哪个的模型的时候就直接使用API等方式调用。

八、vllm部署Qwen3-30B-A3B的时候,提示:There appear to be 1 leaked shared_memory objects to clean up at shutdown warnings.warn('resource_tracker: There appear to be %d '

使用的解决方案是:调整环境变量规避问题

  • 设置 VLLM_WORKER_MULTIPROC_METHODspawn(默认为 fork),减少共享内存泄漏风险:
export VLLM_WORKER_MULTIPROC_METHOD=spawn

其他可能原因及解决方法

1. 未正确关闭模型实例

  • 原因 : 在服务结束后(如程序退出),若未主动释放模型占用的共享内存资源,系统会提示内存泄漏。

  • 解决方法 : 显式调用模型清理函数或关闭服务。
    from vllm import LLM, SamplingParams
    
    # 加载模型
    llm = LLM(model="Qwen/Qwen3-30B")
    
    # 使用后释放资源
    del llm # 或调用特定清理接口(根据实际 API 文档调整)

2. 多进程/异步任务未完全终止

  • 原因 : 如果使用了多进程或异步推理任务,某些后台进程可能仍在运行并占用共享内存。

  • 解决方法 : 确保所有子进程正常终止。
    import multiprocessing
    
    # 启动进程
    process = multiprocessing.Process(target=run_model)
    process.start()
    process.join() # 等待进程结束

3. 框架版本兼容性问题

  • 原因 : vLLM 或 Python 的 multiprocessing 模块可能存在旧版本的共享内存管理缺陷。
  • 解决方法 : 升级到最新版本:

    pip install --upgrade vllm

    pip install --upgrade torch

4. 手动清理残留资源

  • 临时方案 : 手动查找并删除残留的共享内存对象。
    # 查看当前共享内存
    ipcs -m
    
    # 删除指定 ID 的共享内存(替换为实际 ID)
    ipcrm -m <shmid>
  • 注意 : 此操作需谨慎,避免误删其他进程的内存。

九、使用vllm部署Qwen3-30B-A3B的时候,提示:LLVM ERROR: Failed to compute parent layout for slice layout

解决方法:把dtype不能设为half,设为float32.

十、export VLLM_WORKER_MULTIPROC_METHOD 设置为spawn 和fork有什么区别?更推荐哪个?

1. fork vs spawn 的核心区别

特性fork (默认)spawn (推荐)
工作原理复制父进程的全部内存和状态重新启动 Python 解释器,仅传递必要参数
速度快(直接复制内存)较慢(重新初始化)
安全性低(可能继承父进程锁/句柄导致死锁)高(避免共享状态残留)
CUDA/GPU 兼容性差(子进程可能继承父进程的 CUDA 上下文导致崩溃)好(独立初始化 CUDA 环境)
跨平台支持仅类 Unix 系统(Linux/MacOS)所有系统(包括 Windows)
适用场景简单、无 GPU 的纯 CPU 任务涉及 GPU、多线程或复杂依赖的任务

2. 为何推荐 spawn

在 vLLM 的 GPU 推理场景 中,spawn 是更安全的选择,原因如下:

  1. 避免 CUDA 上下文污染

    • fork 会复制父进程的 CUDA 上下文,导致子进程与父进程共享 GPU 资源,可能引发 CUDA_ERROR_ILLEGAL_ADDRESS 等错误。

    • spawn 通过重新初始化 CUDA 环境,确保每个子进程有独立的 GPU 上下文。

  2. 防止死锁和资源泄漏

    • fork 会复制父进程的所有线程和锁,若父进程中有未释放的锁(如 PyTorch 内部锁),子进程可能直接死锁。

    • spawn 从头初始化进程,避免了锁和线程状态的继承。

  3. 兼容复杂依赖

    • 当使用 PyTorch、TensorFlow 等涉及底层硬件加速的库时,spawn 能更好地处理库的初始化流程。

 

3. 性能权衡与优化

指标forkspawn
启动延迟低(毫秒级)较高(秒级)
内存占用高(复制父进程内存)低(按需初始化)
长期稳定性
  • 优化建议
    若因 spawn 导致启动变慢,可通过预加载模型权重或复用 Engine 实例减少重复初始化开销。

4. 官方推荐与社区实践

  • vLLM 官方文档 明确指出:在涉及 GPU 的分布式推理中,应优先使用 spawn 方法 (vLLM Docs)。

  • PyTorch 多进程指南 建议:使用 CUDA 时,spawn 是唯一安全的选择 (PyTorch Multiprocessing)。

5. 总结

  • 优先选择 spawn:适用于所有涉及 GPU、CUDA 或复杂依赖的 vLLM 部署场景。

  • 谨慎使用 fork:仅在纯 CPU 推理且无复杂线程/锁交互的简单任务中使用。

 

 

### vLLM Vicuna-Llama Windows Setup and Issues #### 安装环境配置 为了在Windows上成功安装和运行vLLM(基于Vicuna或LLaMA模型),需要确保满足特定的依赖项和库的要求。推荐使用Anaconda来管理Python环境以及相关包,这可以简化许多复杂性的处理。 对于CUDA支持版本的选择至关重要,因为不同的GPU架构对应不同版本的CUDA驱动程序和支持软件栈。通常情况下,建议采用最新的稳定版CUDA工具链以获得最佳性能表现[^3]。 ```bash # 创建新的Conda虚拟环境并激活它 conda create -n vllm_env python=3.9 conda activate vllm_env # 安装PyTorch及相关组件 pip install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu117/ # 安装Transformers库和其他必要的依赖项 pip install transformers accelerate bitsandbytes datasets peft ``` #### 常见问题及解决方案 ##### GPU兼容性和驱动更新 如果遇到与GPU相关的错误消息,比如`cudaErrorNoKernelImageForDevice`或其他类似的提示,则可能是因为当前使用的CUDA Toolkit版本不匹配硬件或者缺少相应的驱动更新。此时应该访问NVIDIA官方网站下载最新版本的显卡驱动,并确认已正确安装了相适应的操作系统补丁。 ##### 数据加载失败 当尝试加载预训练权重文件时发生异常中断,可能是由于网络连接不稳定造成部分资源未能完全获取到本地缓存目录内;或者是存储路径中含有非法字符影响到了正常读取操作。针对前者可以通过多次重试直至完成整个过程;而后者则需仔细检查指定位置是否符合命名规范要求。 ##### 内存不足警告 鉴于大型语言模型本身具有较高的计算开销,在某些低端配置机器上面可能会触发OOM(out-of-memory)告警信息。对此类状况的有效应对措施之一就是启用混合精度模式(即FP16),从而减少一半以上的浮点数占用空间量级;另外还可以考虑调整批量尺寸(batch size)至更小数值范围以内减轻瞬时间负载压力。 ```python from transformers import AutoModelForCausalLM, BitsAndBytesConfig bnb_config = BitsAndBytesConfig( load_in_4bit=True, bnb_4bit_quant_type="nf4", bnb_4bit_use_double_quant=True, ) model = AutoModelForCausalLM.from_pretrained( "your_model_name", quantization_config=bnb_config ) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SuSuStarSmile

共同成长,一起进步,顶峰相见!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值