2、vLLM启动日志解读:模型加载日志、GPU显存分配日志、KV Cache初始化日志、调度器启动日志

说实话,很多运维同学看到vLLM启动时刷屏的日志就头疼。我刚开始接触时也一样,满屏的INFO和WARNING,根本不知道哪些该看、哪些可以忽略。但干这行久了你会发现——启动日志里藏着大量关键信息,尤其是模型加载、显存分配、KV Cache和调度器这四块。

今天我就带你把这四类日志彻底吃透。嗯,咱们一个一个来。

2.1 模型加载日志:你的模型到底卡在哪?

vLLM启动时,第一件事就是加载模型。你会在日志里看到类似这样的输出:

INFO 02-10 10:23:45 model_runner.py:123] Loading model weights from /data/models/llama-7b/
INFO 02-10 10:23:47 loader.py:89] Using safetensors to load model weights
INFO 02-10 10:23:50 model_runner.py:156] Model loaded in 5.23 seconds

这里有几个关键点:

  • 加载路径:确认模型文件路径是否正确。我遇到过好几次路径写错,结果加载了半天才发现是空目录。
  • 加载方式:safetensors 是推荐格式,比 pickle 安全且快。如果你看到用的是 pickle,建议转换一下。
  • 加载耗时:5秒加载7B模型算正常。如果超过30秒,可能是磁盘IO瓶颈,或者模型文件碎片化严重。

重点:模型加载阶段最容易出问题的是磁盘IO和内存不足。我曾经在生产环境遇到过——模型文件放在NFS上,加载花了整整2分钟,直接导致健康检查超时被kill。后来改成本地SSD,问题解决。

2.2 GPU显存分配日志:显存到底够不够?

模型加载完后,vLLM会开始分配GPU显存。日志大概长这样:

INFO 02-10 10:23:55 gpu_executor.py:201] GPU 0: 80.00 GB total, 72.34 GB free
INFO 02-10 10:23:55 gpu_executor.py:210] Allocating 40.00 GB for model weights
INFO 02-10 10:23:56 gpu_executor.py:225] Remaining GPU memory: 32.34 GB

我个人习惯重点关注两个数字:

  • 模型权重占用:40GB对于7B模型来说偏大,可能是用了FP32。如果是FP16/BF16,7B模型大概14GB左右。这里要检查你的精度设置。
  • 剩余显存:32.34GB会用于KV Cache和推理计算。如果剩余太少,后续并发一高就容易OOM。

避坑指南:我曾经在A100 80GB上部署13B模型,日志显示剩余显存只有8GB。结果一上线,4个并发请求直接OOM。后来发现是--gpu-memory-utilization设成了0.95,留给KV Cache的空间太少。调成0.85后稳定运行。

2.3 KV Cache初始化日志:性能的关键

KV Cache是vLLM高性能推理的核心。初始化日志如下:

INFO 02-10 10:23:57 cache_engine.py:89] Initializing KV Cache with block size 16
INFO 02-10 10:23:57 cache_engine.py:95] Number of blocks: 2048
INFO 02-10 10:23:57 cache_engine.py:102] KV Cache size: 16.00 GB
INFO 02-10 10:23:57 cache_engine.py:110] Using 2.00 GB for prefix caching

这里要搞懂几个参数:

参数 含义 建议值
block size 每个缓存块的大小(token数) 16或32,小模型用16,大模型用32
Number of blocks 总缓存块数量 越大并发能力越强,但占显存也多
KV Cache size KV Cache占用的显存总量 通常占总显存的30%-50%
prefix caching 前缀缓存大小 如果系统提示词很长,建议开启

你想想看,如果KV Cache初始化时block数量太少,意味着能同时处理的请求就少。我见过一个案例,block数量只有512,结果并发一高就排队,延迟飙升到10秒以上。

小技巧:如果你发现日志里KV Cache size接近剩余显存,说明--max-model-len设得太大了。调小这个参数,可以释放更多显存给KV Cache,提升并发能力。

2.4 调度器启动日志:请求怎么排队?

最后一步是调度器启动。日志输出:

INFO 02-10 10:23:58 scheduler.py:45] Scheduler initialized with max_num_seqs=256
INFO 02-10 10:23:58 scheduler.py:52] Using preemption mode: swap
INFO 02-10 10:23:58 scheduler.py:60] Max model length: 4096 tokens

调度器决定了请求如何被分配到GPU上执行。三个关键配置:

  • max_num_seqs:最大并发序列数。256算比较高的,适合高并发场景。如果设得太小,请求会排队等待。
  • preemption mode:抢占模式。swap模式会把低优先级请求的KV Cache换到CPU内存,recompute模式会重新计算。swap更快,但需要CPU内存够大。
  • Max model length:模型最大上下文长度。4096是LLaMA的默认值,如果你用长文本场景,记得调大。

为什么会关注调度器日志?因为这里能看出你的服务能扛多大并发。我有个血的教训——之前把max_num_seqs设成64,结果线上流量一上来,请求排队时间直接占了总延迟的70%。后来改成256,排队时间几乎消失。

知识体系总览

下面这张图帮你理清vLLM启动日志的四个核心模块,以及它们之间的关系:

vLLM启动日志核心模块 模型加载日志 路径/格式/耗时 GPU显存分配日志 权重/剩余/利用率 KV Cache初始化 块大小/数量/前缀缓存 调度器启动日志 并发/抢占/长度 常见问题与排查方向 ● 模型加载慢 → 检查磁盘IO、模型文件格式、是否使用safetensors ● 显存不足/OOM → 调整gpu-memory-utilization、降低max-model-len ● KV Cache太小 → 增大max-num-seqs、调整block size ● 请求排队严重 → 增大max-num-seqs、检查preemption mode 启动日志是vLLM健康的第一道防线,读懂它,问题就解决了一半

嗯,以上就是vLLM启动日志的四个核心模块。说白了,模型加载看路径和耗时,显存分配看剩余空间,KV Cache看块数量和大小,调度器看并发能力。把这四块日志盯住了,90%的启动问题你都能快速定位。

一句话总结:启动日志不是给你看的流水账,而是vLLM的体检报告。每次部署新模型,我都会先扫一遍这四类日志,确认各项指标正常再放流量进来。养成这个习惯,能省掉很多半夜被叫起来排查的麻烦。

专注资料整理