vLLM 启动优化:模型预热与并行加载配置

说明如何复用 `torch.compile` 缓存和已记录的 KV cache 内存参数减少重复启动工作,并用 Run:ai Model Streamer 配置并发与分片读取,解释 `-O2`、`-O0` 的融合与启动取舍。

模型预热要复用编译产物和内存分析结果;并行加载要控制 loader 的并发、分片读取与 CPU 缓冲上限;编译融合则取决于所选优化级别。具体边界见 vLLM 的优化与调优文档 与 Run:ai Model Streamer 文档。对 vllm 命令,这些设置需要一起核对,不能只把并发值调大。

用 vllm 启动前要准备什么

官方 Quickstart 将 Linux 和 Python 3.10 到 3.13 列为前提,并推荐用 uv 创建 Python 3.12 虚拟环境:

uv venv --python 3.12 --seed
source .venv/bin/activate
uv pip install vllm --torch-backend=auto

--torch-backend=auto 会检查已安装的 CUDA driver,并自动选择对应的 PyTorch index。GPU 还应满足 GPU 安装文档 列出的条件:NVIDIA GPU 的 compute capability 需要达到 7.5 或更高,预编译包包含 C++ 和 CUDA 12.9 binaries。

模型预热与编译融合如何取舍

按 vLLM 的优化与调优文档,torch.compile 产物保存在 VLLM_CACHE_ROOT 下,默认路径是 ~/.cache/vllm。该目录可以复制到其他机器,也可以预置进容器镜像。重启时保留并复用这个目录,可以避免重新生成已有编译产物。

文档还说明,把上次日志记录的 --kv-cache-memory 值传回下一次启动,可以跳过内存分析测量和 CUDA graph 内存估算。这里的“模型预热”应限定为这些启动侧复用操作;官方页面没有给出通用的首请求预热命令,不要把任意 completion 请求当成固定步骤。

优化级别也会改变启动成本。-O2 是默认级别,包含额外编译范围、更多融合以及 FULL_AND_PIECEWISE CUDA graphs;-O0 不启用优化,启动最快,但运行性能最低。需要快速排查启动阶段时可选 -O0,持续运行则应同时考虑编译和融合开销。

并行加载:模型并行与读取并发要分开

模型并行和 loader 并发不是同一件事。内存优化说明 指出,tensor parallelism 会把模型拆到多张 GPU;普通加载路径中,每个进程会读取完整 checkpoint 再切分,因此磁盘读取时间会随 tensor-parallel size 增大。对于已经分片的 checkpoint,加载时间则应保持不变,不能只根据并行度判断磁盘读取成本。

Run:ai Model Streamer 会并发读取 tensor,并将其传到 GPU memory。先安装可选依赖:

pip3 install vllm[runai]

文档分别给出了本地路径和 S3 URI 的启动形式:

vllm serve /home/meta-llama/Llama-3.2-3B-Instruct \
  --load-format runai_streamer
vllm serve s3://core-llm/Llama-3-8b \
  --load-format runai_streamer

loader 并发和读取缓冲通过 --model-loader-extra-config 调整。文档给出的参数形式分别是:

--model-loader-extra-config '{"concurrency":16}'
--model-loader-extra-config '{"memory_limit":5368709120}'

concurrency 控制读取并发,memory_limit 用于限制读取期间的 CPU buffer;这些数值是文档示例,不应直接当作所有机器的固定配置。分片加载还可评估 runai_streamer_sharded,该变体让每个 TP/PP worker 只读取自己的 shard,而不是完整 checkpoint。

启动参数要守住内存边界

内存优化说明 建议通过 max_model_len 限制上下文长度,并通过 max_num_seqs 限制最大 batch size,从而降低内存占用。数值应按实际 prompt、output 和并发需求填写,不要为了缩短启动时间而忽略业务上下文。

设备选择也有明确边界:应在启动前设置 CUDA_VISIBLE_DEVICES,而不是先调用 torch 的 device 函数选择设备。多进程部署时尤其要核对每个进程最终能看到哪些 GPU。

怎样确认服务与加载结果可用

Benchmark CLI 文档 将 vllm bench 用于功能评估和回归测试,并推荐生产服务器使用 GuideLLM。检查服务时,可以先准备 ShareGPT 数据:

wget https://huggingface.co/datasets/anon8231489123/ShareGPT_Vicuna_unfiltered/resolve/main/ShareGPT_V3_unfiltered_cleaned_split.json

然后对已经运行的服务执行在线 benchmark:

vllm bench serve \
  --backend vllm \
  --model NousResearch/Hermes-3-Llama-3.1-8B \
  --endpoint /v1/completions \
  --dataset-name sharegpt

报告包含 request throughput、output-token throughput 和 total-token throughput。TTFT 从客户端发送请求计时,到收到第一个 streamed output;ITL 记录相邻 streamed outputs 之间的间隔;TPOT 按请求计算并排除第一个 token,随后再跨请求汇总。

启动慢或加载失败时先查什么

  • runai_streamer 无法启动时,先核对 vllm[runai] 可选依赖、模型路径和 --load-format。
  • 启用 tensor parallelism 后磁盘读取变慢时,先区分普通 checkpoint 读取与分片 loader,不要继续盲目增加 TP。
  • 启动后内存紧张时,重新核对 max_model_len、max_num_seqs 和设备可见性。
  • 重复 benchmark 同一服务时,Benchmark CLI 文档 提醒请求可能复用 prefix cache 并抬高 throughput;不同工具的指标名称也不统一,比较前应先核对定义。

本文步骤按正文链接的官方文档整理,未运行或测量;具体参数和字段名应在使用前按当前版本复核。

资料来源