2. vLLM离线批量推理

任务目标

使用vLLM在离线场景下对一批提示词(prompts)执行批量文本生成,验证吞吐量与输出正确性。本案例聚焦于vLLM的LLM类同步批量推理接口,不涉及API服务部署。

环境依赖

  • Python 3.9+
  • vLLM 0.6.0+(安装:pip install vllm)
  • GPU(NVIDIA,显存≥16GB,用于7B模型)

完整实现代码

from vllm import LLM, SamplingParams
from datetime import datetime

# 1. 初始化模型(首次运行会自动下载权重)
llm = LLM(
    model="facebook/opt-125m",  # 轻量模型便于快速验证;可替换为 "meta-llama/Llama-2-7b-hf"
    dtype="auto",                # 自动选择精度
    max_model_len=512,           # 最大序列长度
    gpu_memory_utilization=0.8,  # 使用80%显存
)

# 2. 定义采样参数
sampling_params = SamplingParams(
    temperature=0.7,
    top_p=0.9,
    max_tokens=64,
    stop=None,
)

# 3. 构造批量输入(离线推理的核心:一次传入多条prompt)
prompts = [
    "The capital of France is",
    "The meaning of life is",
    "Translate to Chinese: hello world",
    "Write a short joke about programming",
    "The best way to learn Python is",
]

# 4. 执行批量推理
start_time = datetime.now()
outputs = llm.generate(prompts, sampling_params)
elapsed = (datetime.now() - start_time).total_seconds()

# 5. 输出结果与性能指标
for i, output in enumerate(outputs):
    generated_text = output.outputs[0].text
    print(f"Prompt {i+1}: {output.prompt!r}")
    print(f"Generated: {generated_text!r}\n")

print(f"批量处理 {len(prompts)} 条提示词,耗时 {elapsed:.2f} 秒")
print(f"吞吐量: {len(prompts) / elapsed:.2f} prompts/sec")

运行方式

# 保存为 offline_batch.py 后执行
python offline_batch.py

验证方法与通过标准

  1. 输出正确性:每条prompt均生成非空文本,且内容与prompt语义相关(如第1条应包含"Paris"或法国城市名)。
  2. 批量有效性:控制台按顺序打印5条prompt及其生成结果,无报错中断。
  3. 性能指标:程序末尾输出总耗时与吞吐量(数值因硬件而异,但必须为正数且能正常打印)。
  4. 显存释放:程序正常退出,无CUDA OOM错误。

关键说明

  • 模型可替换为其他HuggingFace格式模型,但需确保max_model_len不超过模型最大上下文长度。
  • 若GPU显存不足,可降低gpu_memory_utilization至0.5或换用更小模型(如facebook/opt-125m)。
  • vLLM的LLM.generate()自动实现continuous batching,无需手动分batch——这是离线批量推理的核心优势。
  • 采样参数(temperature/top_p/max_tokens)可按需调整,max_tokens过小可能导致生成不完整。