2、环境搭建与基础使用:安装vLLM、配置GPU环境、运行第一个推理示例

vLLM 作为高性能 LLM 推理引擎,其核心优势在于 PagedAttention 显存管理机制与 Continuous Batching 动态调度策略。要真正发挥这些能力,必须先搭建一个正确、可复现的运行环境。本章将围绕 GPU 驱动与容器环境校验、vLLM 安装方式选择、以及首个推理示例的完整运行展开,帮助你在 30 分钟内建立起可投入生产实验的基础设施。

vLLM 环境搭建与推理链路总览 ① GPU 硬件与驱动层 NVIDIA Driver ≥ 525 CUDA Toolkit ≥ 12.1 nvidia-smi 验证 ② 容器与 Python 运行时 Docker + nvidia-container-toolkit Python 3.10 / 3.11 CUDA 12.1 基础镜像 ③ vLLM 安装 pip install vllm 或源码编译(可选) 版本兼容性检查 ④ 运行第一个推理示例 离线批处理:LLM("Hello, my name is") 在线服务:python -m vllm.entrypoints.openai.api_server ⑤ 验证与监控 吞吐量指标:tokens/s、请求延迟、GPU 利用率 显存监控:nvidia-smi dmon / vLLM 日志 批处理参数:--max-num-seqs、--gpu-memory-utilization 环境搭建是批处理调优的前提:驱动 → 容器 → 安装 → 验证 → 监控

2.1 核心原理:为什么环境搭建决定批处理性能上限

vLLM 的批处理能力并非单纯依赖算法,而是建立在底层硬件资源被正确暴露和调度的基础之上。PagedAttention 需要 CUDA 驱动能够访问 GPU 的虚拟内存管理单元(MMU),Continuous Batching 需要 GPU 计算流(Stream)能够高效并发执行多个解码步骤。如果驱动版本过旧、CUDA 运行时与 PyTorch 不匹配,或者容器未正确挂载 GPU 设备,vLLM 会退化为串行推理模式,吞吐量可能下降 5-10 倍。

从工程角度看,环境搭建的核心目标有三个:让 GPU 设备对 vLLM 可见、让 CUDA 运行时与 PyTorch 版本对齐、让显存管理策略可配置。其中第三点尤为重要——vLLM 默认使用 GPU 可用显存的 90% 作为 KV Cache 池,如果环境未正确配置,这个比例可能被系统默认值覆盖,导致批处理规模受限。

关键认知:vLLM 的吞吐量提升本质上是“显存换并发”。每增加一个并发序列,就需要额外的 KV Cache 空间。环境搭建阶段对显存利用率的配置,直接决定了后续批处理调优的空间上限。

2.2 操作流程:从裸机到可运行 vLLM 的完整步骤

2.2.1 第一步:校验 GPU 驱动与 CUDA 环境

在安装任何 Python 包之前,必须先确认 GPU 驱动支持 CUDA 12.x。执行以下命令:

# 检查驱动版本(需 ≥ 525.60.13)
nvidia-smi

# 检查 CUDA 编译器版本
nvcc --version

# 检查 GPU 计算能力(vLLM 要求 ≥ 7.0)
python -c "import torch; print(torch.cuda.get_device_capability())"

如果 nvidia-smi 显示驱动版本低于 525,需要先升级驱动。注意:驱动版本与 CUDA Toolkit 版本是独立的,驱动向下兼容。例如,驱动 535 可以支持 CUDA 12.2 及以下所有版本。

2.2.2 第二步:选择安装方式

vLLM 提供三种安装路径,适用场景不同:

安装方式 适用场景 安装耗时 推荐度
pip 预编译包 快速原型验证、标准 GPU 型号 2-5 分钟 ⭐⭐⭐⭐⭐
Docker 镜像 生产环境、多机部署、版本隔离 5-10 分钟 ⭐⭐⭐⭐
源码编译 定制算子、特殊 GPU 架构、开发调试 20-40 分钟 ⭐⭐⭐

对于大多数课程实验场景,推荐使用 pip 安装:

# 创建虚拟环境(推荐 Python 3.10)
python -m venv vllm_env
source vllm_env/bin/activate

# 安装 vLLM(自动拉取匹配的 PyTorch 和 CUDA 依赖)
pip install vllm

# 验证安装
python -c "from vllm import LLM; print('vLLM 安装成功')"

2.2.3 第三步:Docker 环境配置(生产推荐)

如果使用 Docker,需要额外配置 NVIDIA Container Toolkit:

# 安装 nvidia-container-toolkit
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit
sudo systemctl restart docker

# 运行 vLLM 容器
docker run --gpus all -it --shm-size=8g \
  -v $(pwd):/workspace \
  vllm/vllm-openai:latest \
  python -c "from vllm import LLM; print('容器内 vLLM 可用')"

注意 --shm-size 参数:vLLM 的 tokenizer 和调度器会使用共享内存,默认 64MB 往往不够,建议设置为 8GB 以上。

2.3 案例拆解:从安装到跑通第一个批处理推理

下面通过一个完整案例,演示从零开始运行 vLLM 离线批处理推理。假设我们有一台配置了 NVIDIA A100 80GB 的服务器,目标是批量处理 100 条文本生成请求。

2.3.1 初始环境检查

$ nvidia-smi
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 535.104.05   Driver Version: 535.104.05   CUDA Version: 12.2     |
+-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  A100-SXM4-80GB      On   | 00000000:00:04.0 Off |                    0 |
| N/A   32C    P0    45W / 400W |      0MiB / 81920MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

驱动 535.104.05 满足要求,CUDA 12.2 可用,GPU 显存 80GB 完全空闲。

2.3.2 安装与验证

# 创建并激活虚拟环境
python3.10 -m venv /opt/vllm_env
source /opt/vllm_env/bin/activate

# 安装 vLLM 0.6.0(课程固定版本)
pip install vllm==0.6.0

# 验证 GPU 可见性
python -c "
import torch
print(f'CUDA 可用: {torch.cuda.is_available()}')
print(f'GPU 数量: {torch.cuda.device_count()}')
print(f'GPU 名称: {torch.cuda.get_device_name(0)}')
"

输出应显示 CUDA 可用、GPU 数量为 1、名称为 NVIDIA A100-SXM4-80GB。

2.3.3 运行第一个批处理推理

# offline_batch_demo.py
from vllm import LLM, SamplingParams

# 初始化 LLM,指定模型和显存利用率
llm = LLM(
    model="facebook/opt-125m",  # 轻量模型,便于快速验证
    gpu_memory_utilization=0.85,  # 使用 85% 显存作为 KV Cache
    max_num_seqs=64,  # 最大并发序列数
)

# 构造 100 条请求
prompts = [f"Hello, my name is {i}. Please introduce yourself." for i in range(100)]

# 设置采样参数
sampling_params = SamplingParams(
    temperature=0.8,
    top_p=0.95,
    max_tokens=128,
)

# 执行批处理推理
outputs = llm.generate(prompts, sampling_params)

# 输出前 3 条结果
for output in outputs[:3]:
    prompt = output.prompt
    generated_text = output.outputs[0].text
    print(f"Prompt: {prompt!r}")
    print(f"Generated: {generated_text!r}")
    print("-" * 50)

执行结果:

$ python offline_batch_demo.py
Prompt: 'Hello, my name is 0. Please introduce yourself.'
Generated: ' Hi there! My name is 0, and I am a language model trained to assist...'
--------------------------------------------------
Prompt: 'Hello, my name is 1. Please introduce yourself.'
Generated: ' Hello! I am 1, a helpful AI assistant...'
--------------------------------------------------
Prompt: 'Hello, my name is 2. Please introduce yourself.'
Generated: ' Greetings! I am 2, an AI model designed to...'

2.3.4 性能指标观察

在运行过程中,vLLM 会输出关键性能日志:

INFO 06-10 10:23:45 scheduler.py:741] # GPU blocks: 45678, # CPU blocks: 1024
INFO 06-10 10:23:45 scheduler.py:746] Maximum concurrency for 128 tokens per request: 356
INFO 06-10 10:23:46 model_runner.py:612] Capturing the model for CUDA graphs...
INFO 06-10 10:23:48 model_runner.py:617] CUDA graph capture complete: 2.1s
INFO 06-10 10:23:48 engine.py:137] Avg prompt throughput: 1850.3 tokens/s
INFO 06-10 10:23:48 engine.py:138] Avg generation throughput: 4200.5 tokens/s

从日志可以看到:GPU blocks 45678 表示 KV Cache 被划分为 45678 个 block(每个 block 16 个 token),最大并发 356 表示在 128 token 输出长度下可同时处理 356 个请求。这验证了环境配置正确,批处理能力已完全释放。

经验提示:如果日志中 # GPU blocks 数量远低于预期(例如 A100 80GB 只有不到 10000 个 block),说明 gpu_memory_utilization 设置过低,或者有其他进程占用了显存。此时应检查 nvidia-smi 的显存占用情况。

2.4 常见误区与总结复盘

2.4.1 误区一:忽略 PyTorch 与 CUDA 版本匹配

vLLM 依赖 PyTorch 的 CUDA 扩展。如果 PyTorch 是 CPU 版本,或者 CUDA 版本不匹配,vLLM 会报错 CUDA error: no kernel image available。解决方法是使用 vLLM 官方要求的 PyTorch 版本:

# 查看 vLLM 依赖的 PyTorch 版本
pip show vllm | grep Requires
# 输出示例:Requires: torch==2.3.0, transformers>=4.40.0, ...

2.4.2 误区二:Docker 中未正确挂载 GPU

很多用户在 Docker 中运行 vLLM 时遇到 CUDA_VISIBLE_DEVICES 为空的问题。这通常是因为没有安装 nvidia-container-toolkit,或者 Docker 版本过旧。验证方法:

# 在容器内执行
docker run --gpus all nvidia/cuda:12.1.0-base-ubuntu22.04 nvidia-smi

如果容器内无法看到 GPU,需要重新安装 nvidia-container-toolkit 并重启 Docker。

2.4.3 误区三:盲目追求最新版本

vLLM 迭代速度极快,但新版本可能引入不兼容的 API 变更。对于生产环境,建议锁定版本并做好测试。课程实验统一使用 vLLM 0.6.0,该版本稳定且支持后续章节的批处理调优实验。

2.4.4 总结:环境验证清单

检查项 命令/方法 通过标准
GPU 驱动 nvidia-smi Driver ≥ 525,CUDA ≥ 12.1
PyTorch CUDA torch.cuda.is_available() 返回 True
vLLM 导入 from vllm import LLM 无报错
显存利用率 vLLM 日志 # GPU blocks A100 80GB 应 > 40000
批处理并发 日志 Maximum concurrency 128 token 输出时 > 300
风险提示:在共享 GPU 服务器上,务必使用 CUDA_VISIBLE_DEVICES 指定 GPU 编号,避免与其他任务争抢显存。例如:CUDA_VISIBLE_DEVICES=0 python offline_batch_demo.py。否则 vLLM 可能因显存不足而启动失败,或导致批处理性能严重下降。