VLLM调优

vLLM 是一个高效的大模型推理框架,专为优化显存利用和高吞吐量设计。以下是从多个角度进行推理调优的关键方法,帮助你在速度、显存占用和并发能力之间找到平衡:


1. 模型参数优化

  • Batch Size 调整

    • 增大 max_num_batched_tokens:提升吞吐量(适合离线批量推理),但可能增加延迟。
    • 减小 max_num_seqs:降低显存占用,但可能限制并发。
    llm = LLM(model="meta-llama/Llama-2-7b-chat-hf", 
             max_num_batched_tokens=4096,  # 增大批次token上限
             max_num_seqs=256)            # 限制并发请求数
    
  • 解码策略选择

    • 贪心解码(Greedy):速度最快,适合实时交互。
    • Beam Search:质量更高但显存占用大,通过 beam_width 控制计算量。
    outputs = llm.generate(prompts, 
                          use_beam_search=True, 
                          beam_width=4)  # 平衡质量与速度
    

2. PagedAttention 优化

  • 块大小(Block Size)
    • 调整 block_size 减少内存碎片(默认16),例如设为32可能提升长文本性能。
    llm = LLM(..., block_size=32)
    
  • 工作空间预分配
    • 通过 gpu_memory_utilization 预分配显存(默认0.9),接近1可能引发OOM需谨慎。
    llm = LLM(..., gpu_memory_utilization=0.95)
    

3. 动态批处理与并发

  • 开启 Continuous Batching
    llm = LLM(..., enable_continuous_batching=True)
    
  • 调整并发参数
    • max_parallel_loading_workers: 增加模型加载并行度(需足够CPU资源)。

4. 硬件相关优化

  • 量化压缩
    llm = LLM(..., quantization="awq")  # 或 "gptq"
    
  • 混合精度推理
    llm = LLM(..., dtype="bfloat16")  # A100/V100等支持加速
    
  • 张量并行(多GPU)
    llm = LLM(..., tensor_parallel_size=4)  # 4卡并行
    

5. 系统级优化

  • CUDA配置
    export CUDA_VISIBLE_DEVICES=0,1  
    # 指定GPU 0,1 表示当前进程只能使用系统中的 第 0 号和第 1 号 GPU。
      #这里的 0 和 1 是 GPU 的逻辑编号,由系统(如 NVIDIA 驱动)分配。
    export PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:128  # 减少显存碎片
    
  • 异步推理模式
    outputs = await llm.generate_async(prompts)  # 异步非阻塞
    

6. 高级技巧

  • 预热模型
    llm.generate(["warmup"], max_tokens=10)  # 触发内核初始化
    
  • 自定义内核
    从源码编译安装,启用特定优化(如FlashAttention-2)。
  • 模型剪枝
    结合LoRA等轻量化技术减少参数量。

7. 性能评估工具

  • 内置监控
    print(llm.llm_engine.stat_logger)  # 查看吞吐/延迟指标
    
  • Profiler工具
    使用Nsight Systems或PyTorch Profiler分析CUDA内核。

调优注意事项

  1. 权衡指标:吞吐量 vs 延迟 vs 显存,根据场景选择。
  2. 渐进调整:每次修改一个参数,观察影响。
  3. 硬件匹配:量化需显卡支持(如AWQ仅限NVIDIA+Ampere+)。
  4. 日志分析:关注vllm日志中的OOM警告或性能提示。

在 vLLM 中,所有与模型初始化配置相关的代码(如模型加载参数、显存优化、并行策略等)必须写在模型运行之前(即创建 LLM 对象时),而推理参数(如解码策略、生成长度等)则在调用 generate() 方法时指定。以下是具体位置说明:


1. 模型初始化配置(写在创建 LLM 对象时)

这些代码需要在加载模型时一次性配置,且必须在调用 generate() 之前完成。典型场景:

# ------------------------------
# 1. 初始化阶段的配置(模型运行前)
# ------------------------------
from vllm import LLM

# 所有初始化参数在此处设置
llm = LLM(
    model="meta-llama/Llama-2-7b-chat-hf",
    # 硬件/显存优化
    dtype="bfloat16",                    # 混合精度
    quantization="awq",                  # 量化(需提前转换模型)
    tensor_parallel_size=2,              # 多GPU并行
    block_size=32,                       # PagedAttention块大小
    gpu_memory_utilization=0.95,         # 显存预分配
    max_num_batched_tokens=4096,         # 批次token上限
    max_num_seqs=256,                    # 最大并发序列数
    enable_continuous_batching=True,     # 开启动态批处理
    max_parallel_loading_workers=4       # 模型加载并行度
)

# 可选:预热模型(运行一次短推理)
_ = llm.generate("Warm up", sampling_params=...)

2. 推理参数配置(写在调用 generate() 时)

这些参数在每次推理请求时动态指定,用于控制单次生成行为:

# ------------------------------
# 2. 推理阶段的配置(模型运行中)
# ------------------------------
from vllm import SamplingParams

# 定义生成参数(每个请求可独立配置)
sampling_params = SamplingParams(
    temperature=0.7,
    top_p=0.9,
    max_tokens=512,
    use_beam_search=True,  # 选择解码策略
    beam_width=4           # Beam Search宽度
)

# 执行推理(传入参数)
outputs = llm.generate(
    prompts=["Hello, how are you?", "Explain quantum computing."],
    sampling_params=sampling_params  # 此处指定解码策略
)

3. 特殊配置(写在脚本最顶层)

部分系统级配置(如环境变量)需在整个 Python 进程启动时设置,通常放在文件最顶部:

# ------------------------------
# 0. 系统级配置(脚本最开头)
# ------------------------------
import os
os.environ["CUDA_VISIBLE_DEVICES"] = "0,1"  # 指定GPU
os.environ["PYTORCH_CUDA_ALLOC_CONF"] = "max_split_size_mb:128"  # 显存优化

# 然后才是模型初始化和推理代码

关键区别总结

配置类型代码位置典型参数
系统级配置脚本最开头(import 之后)CUDA_VISIBLE_DEVICES、环境变量
模型初始化参数创建 LLM(...) 对象时dtype, quantization, block_size
动态推理参数generate(prompts, sampling_params)use_beam_search, temperature
异步调用在异步函数中使用 awaitawait llm.generate_async(...)

常见错误示例

# ❌ 错误:初始化后无法修改量化等参数
llm = LLM(model="llama2-7b")
llm.quantization = "awq"  # 不会生效!

# ❌ 错误:环境变量写在模型初始化之后
llm = LLM(...)
os.environ["CUDA_VISIBLE_DEVICES"] = "0"  # 已经太晚!

最佳实践

  1. 所有模型初始化参数封装在一个配置字典中,确保代码可维护性:
    model_config = {
        "model": "meta-llama/Llama-2-7b-chat-hf",
        "dtype": "bfloat16",
        "block_size": 32,
        "gpu_memory_utilization": 0.95
    }
    llm = LLM(**model_config)
    
  2. 对不同的业务场景(如高吞吐 vs 低延迟),分别定义不同的 SamplingParams 模板。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值