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
验证方法与通过标准
- 输出正确性:每条prompt均生成非空文本,且内容与prompt语义相关(如第1条应包含"Paris"或法国城市名)。
- 批量有效性:控制台按顺序打印5条prompt及其生成结果,无报错中断。
- 性能指标:程序末尾输出总耗时与吞吐量(数值因硬件而异,但必须为正数且能正常打印)。
- 显存释放:程序正常退出,无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过小可能导致生成不完整。