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启动日志的四个核心模块。说白了,模型加载看路径和耗时,显存分配看剩余空间,KV Cache看块数量和大小,调度器看并发能力。把这四块日志盯住了,90%的启动问题你都能快速定位。
一句话总结:启动日志不是给你看的流水账,而是vLLM的体检报告。每次部署新模型,我都会先扫一遍这四类日志,确认各项指标正常再放流量进来。养成这个习惯,能省掉很多半夜被叫起来排查的麻烦。