我第一次跑通vLLM,是在一台只有单张RTX 3060的机器上。怎么说呢,被折磨了一个晚上。当时还没意识到问题出在哪,只觉得“大模型推理框架”这个东西,官方文档写得明明白白,但我照着抄命令就是起不来服务。后来反复对比版本、CUDA、PyTorch的兼容关系,才终于把那行docker run跑通。那一刻我突然意识到,关于vLLM的资料虽然多,但真正能让人从零到一跑起来、再到调优、甚至看懂内部原理的中文教程,其实非常稀缺。
这就是我写这套vLLM教程的初衷。作为一个被各种报错毒打过的过来人,我想把那些散落在GitHub Issue、官方文档、社媒讨论里的经验,整理成一条清晰的学习路径。这套教程会从部署讲起,覆盖服务化调用、性能调优、缓存命中率优化、常见报错排查,再到调度器、算子等源码级话题,适合所有正在或者准备用vLLM做推理服务的人——不管你是刚接触大模型部署的新手,还是已经在生产环境里挣扎的工程师,都能在这里找到对应的章节。
1. 为什么要写这套vLLM教程:先从我踩过的坑说起
1.1 一次让我怀疑人生的部署经历
大概半年前,我接到一个任务:把Qwen模型部署成HTTP服务,供业务方调用。我当时的想法很简单——这东西不是有手就行吗?装个vLLM,写几行Python,起个服务,完事。
现实很快打了我的脸。我先是用pip直接安装vLLM,结果装完之后一跑,直接报CUDA版本不匹配。我以为是CUDA的问题,折腾了半天系统环境,后来才发现是vLLM、PyTorch、CUDA三者之间存在严格的版本对应关系。光是理清这个对应关系,就花了我半天时间。好不容易装好了,又遇到模型下载问题。Hugging Face在国内访问时好时坏,我不得不换用ModelScope下载,再手动指定模型路径。等到服务终于起来,我兴冲冲地调用/v1/chat/completions接口,却发现返回速度远没有官方宣传的那么快。
那一次经历让我明白了一件事:vLLM的上手门槛,从来不在“运行”本身,而在“环境兼容”和“参数配置”。
1.2 现有资料的碎片化问题
后来我在社区里逛得多了,发现很多人都在问类似的问题:“vLLM部署Qwen3.8B要多大显存?”“为什么我的首字延迟这么高?”“chunk_size参数怎么设置?”这些问题在官方文档里不是没有答案,而是答案散落在各个角落,检索成本极高。GitHub Issue里有讨论,Discord里有答疑,官方文档里的说明又比较简略,加上vLLM版本迭代速度极快,有时候你搜到一篇两个月前写的教程,里面的API已经变了。
这让我萌生了一个想法:既然我已经踩过这么多坑,为什么不把整个学习过程系统地整理出来?既是对自己知识的梳理,也能帮后来者少走弯路。
1.3 这套教程的定位与适用读者
这套vLLM教程,目标只有一个:带你从“知道vLLM这个名字”走到“能独立完成部署、调优、二次开发”。整套内容按照我实际的学习路径来组织,不跳步、不藏私。如果你属于下面几类人之一,这套教程就是为你准备的:
- 刚接触大模型推理服务,想知道vLLM到底是什么、能做什么;
- 已经跑通了简单的Demo,但想在性能、并发、缓存等方面做进一步优化;
- 遇到了具体报错(OOM、版本冲突、低吞吐等),想找到系统的排查思路;
- 不满足于只做使用者,想理解PagedAttention、Continuous Batching、调度器等底层机制,甚至自己动手改源码。
2. vLLM到底解决了什么问题:先弄清楚它凭什么快
2.1 没有vLLM的时代:朴素推理为什么慢
要理解vLLM的价值,得先看没有它的时候,大模型推理是怎么做的。Google在2017年提出的Transformer架构,开启了大模型时代,但Transformer的推理过程有一个天然的低效点:它是逐token生成的。模型每生成一个词,都要把之前所有token的Key和Value缓存下来,用于计算注意力权重。这些缓存就是KV Cache,它们的大小随序列长度线性增长。
在没有专门推理框架的时候,最朴素的实现方式是:每个请求独占一份显存,这份显存按照请求可能的最大长度预先分配。这就好比你去餐厅吃饭,明明一个人,却给你预留了一张十人桌。显存利用率极低,并发能力自然上不去。更麻烦的是,当多个请求同时到达时,传统的推理服务通常采用“静态批处理”方式——要么排队等前面的请求完全结束,要么约定好一批请求同时开始同时结束。任何一个慢请求都会拖累整批,吞吐量惨不忍睹。
2.2 PagedAttention:给KV Cache做虚拟内存
vLLM的核心创新之一,是提出了PagedAttention机制。这个思想的来源很有意思——它借鉴的是操作系统里的虚拟内存分页管理。传统的KV Cache分配是连续的内存块,容易产生碎片;PagedAttention把KV Cache切成固定大小的块,按需分配,不要求物理连续。这样多个请求的KV Cache可以交错存储,显存利用率可以接近100%。
这一点和JVM内存管理有异曲同工之妙,但做得更彻底。JVM的堆内存虽然也会分代、分块,但对象的存储位置通常是连续的;PagedAttention则把每个token的KV Cache都当作一个可独立调度的“页”,物理上分散排列,逻辑上通过索引表串起来。这个设计让显存利用率大幅提升,也让推理服务的并发能力上了一个台阶。
2.3 Continuous Batching:让GPU一刻不闲
vLLM的第二大创新,是Continuous Batching(连续批处理)。传统批处理的问题在于,批中所有请求必须同步前进,一个请求结束了,它占用的计算资源也不能立即释放给其他请求。Continuous Batching的思路是:在token级别的粒度上进行调度。每个请求的每个生成步骤都是独立的,一个请求生成了<eos>结束,那它立刻退出批次,空出来的显存和计算资源马上分配给新进入的请求。
这个机制对吞吐量的提升非常显著,尤其在高并发场景下。如果你的服务需要同时处理几十上百个请求,Continuous Batching能让你在同样的硬件条件下,吞吐量翻倍甚至更多。这也是为什么vLLM在业界迅速成为主流推理框架的核心原因之一。
2.4 vLLM不是银弹:它的边界在哪里
说了这么多优点,也得泼盆冷水。vLLM并不是全能的。首先,它做的是推理加速,训练和微调不是它的主战场;其次,它对显存有一定的要求,虽然优化了缓存利用率,但如果你显卡的显存连模型权重都装不下,那也跑不起来;再次,vLLM对自定义模型结构的支持是有限的,虽然现在支持了很多主流架构,但如果你用的是比较小众的模型,可能还是要等社区适配。
理解这层边界很重要。它决定了你在什么场景下应该选择vLLM,什么场景下应该考虑其他方案(比如TensorRT-LLM、SGLang、TGI等)。这也是为什么我在这套教程里,不仅会讲vLLM怎么用,也会带着大家对比它和SGLang等框架的差异——选型本身就是一门学问。
3. 整套教程的路线图:从部署到二次开发全覆盖
3.1 阶段一:环境准备与最小部署
这一阶段的目标是,让你能在自己的机器上把vLLM服务跑起来,打通HTTP调用链路。我会从基础环境选型开始讲起——操作系统怎么选、CUDA版本怎么配、PyTorch和vLLM的版本对应关系怎么查、模型权重去哪里下载(国内推荐ModelScope)、Docker部署和源码安装两种方式各自的优劣。
很多人在这一步就被劝退了,所以我特意把这一阶段拆得很细。每个命令都解释它在干什么,每个参数都说明它的含义。vLLM的发布节奏非常快,经常出现“昨天还能用的命令,今天升级后参数就变了”的情况,因此我还会专门教你怎么读懂vLLM的Changelog,避免被版本更新坑到。顺带提一句,vLLM 0.23.0里有一个关于chunk_size的bug,在网上引起了不少讨论,这恰好说明了“跟着版本走”的重要性——这个我会在教程的对应章节里展开。
3.2 阶段二:OpenAI兼容API与推理参数详解
跑通服务只是第一步,真正要用于生产,你得搞懂vLLM提供的API。vLLM的在线服务接口设计得很聪明,它直接兼容了OpenAI的API格式,这意味着你可以用OpenAI的SDK来调用本地vLLM服务,迁移成本几乎为零。我会从/v1/chat/completions、/v1/completions、/v1/embeddings等常用接口入手,把流式输出、请求参数(temperature、top_p、max_tokens、frequency_penalty等)逐一讲透。
这里有一个很多新手会忽视的点:vLLM里的部分参数,比如--max-model-len、--gpu-memory-utilization、--max-num-seqs,它们的设置会直接影响显存分配和并发能力,而这些参数又和模型本身的配置存在联动关系。我不会只告诉你“要这样设”,还会告诉你为什么这个值和那个值之间要搭着调。
3.3 阶段三:性能调优专题
这一阶段是整套教程里含金量最高的部分之一。我会深入讲解vLLM的多个核心性能指标:吞吐量(Throughput)、首字延迟(TTFT)、每个输出token的延迟(TPOT)、端到端延迟等。分清这些指标很重要——比如网上很多人抱怨“vLLM首字慢”,却忽略了一个事实:首字延迟主要取决于显存中KV Cache的命中情况、输入序列的长度以及调度器的决策策略,而不是单纯由推理框架本身决定。
此外,我还会专门讲缓存优化。vLLM使用了一种叫Prefix Caching的机制,如果请求的前缀相同,是可以复用之前的KV Cache的。这个机制在RAG场景下效果显著——同一份文档被反复作为上下文传入时,缓存命中率上去了,首字延迟能下降一个量级。“vllm如何优化大模型的缓存命中率”这个关键词在技术社区里一直很热,说明大家都遇到了类似的性能瓶颈。我会从原理到实践,一步步教你怎么开启、验证、调优缓存命中率。
3.4 阶段四:进阶与扩展
如果你跟着教程走到这里,说明你已经能熟练地用vLLM服务于业务了。这时候,你可能会遇到更“硬核”的需求:部署多模态模型(比如Qwen-VL、LLaVA),挂载LoRA适配器,甚至自己实现一个调度器。
“vllm自己写调度器”这个话题在社区里讨论度很高。vLLM的调度器是整个框架的核心组件,负责决定每个step里哪些序列参与计算、KV Cache怎么分配、抢占怎么处理。官方留下了扩展接口,让高级用户可以自定义调度策略。作为一个开放源码的框架,vLLM最吸引人的地方就在于这种可定制性。这部分内容门槛稍高,但我会尽量用通俗的方式拆解源码结构,带着大家看懂调度器的主要流程。
另外还有一个方向是边缘设备部署。NVIDIA Jetson Thor这类嵌入式平台跑vLLM,在工业场景中很常见——比如机器人和智能边缘设备。它和标准GPU服务器不一样的地方在于显存、功耗、驱动栈都受限,部署的姿势也要相应调整。我计划用专门的章节来讲这个问题。
3.5 版本策略与学习节奏
vLLM的迭代速度很快,几乎每个月都有新版本发布,性能和功能都在持续完善。这套教程以vLLM当前的稳定版本为基础,但我会刻意强调“哪些设计是长期稳定的,哪些是可能变化的”。学习的时候,不用追求追新,选一个稳定的版本,跟着教程跑通,再根据你的实际需求选择性升级。生产环境里,盲目的“最新版主义”往往得不偿失——这一点我在后面的章节里会反复强调。
4. 开篇前你需要准备的东西:前置知识、硬件与心态
4.1 硬件需求:从2080 Ti到A100都有对应的玩法
很多人在部署vLLM之前,最关心的就是硬件门槛。坦白说,vLLM对硬件有一定的要求,但远没有想象中那么离谱。如果你是为了学习和跑通Demo,一张RTX 2080 Ti(11GB显存)就足够了,可以部署Qwen3-8B这类模型并做基本的量化或低显存优化。社区里甚至有人用“2080 Ti definitive edition”跑出了不错的性能,这我在后续低显存部署专题里会详细展开。
如果你有RTX 3090、4090这类24GB显存的卡,那基本上可以轻松部署7B到14B级别的模型,并且不用太担心显存不足。如果是27B左右的模型,就建议考虑多卡并行或者使用量化策略了。生产环境里常用的A100/A800(40GB或80GB)自然更从容,同时也需要配置好张量并行。教程里我会用一个章节专门讲显存估算——模型权重、KV Cache、激活值各占多少,怎么算清楚这笔账。
4.2 软件栈:版本兼容性是第一道坎
软件栈的版本匹配问题,是新手最容易崩溃的地方。我见过有人在Windows上用pip硬装vLLM,折腾了一整天,最后发现官方压根不支持Windows原生安装。你是可以选择WSL2或者Docker的方式来解决的,这也是“windows vllm modelscope”相关搜索量居高不下的原因——大家显然都在Windows上踩过坑。
我建议的软件栈如下,供参考:
| 组件 | 推荐版本/方案 |
|---|---|
| 操作系统 | Ubuntu 20.04/22.04(生产环境更稳定) |
| CUDA | 11.8或12.1+,视vLLM版本而定 |
| Python | 3.9~3.12,视vLLM版本而定 |
| PyTorch | 与vLLM官方要求的版本对应 |
| NVIDIA驱动 | 530+(新卡建议更新) |
具体怎么匹配,我会在环境准备那期教程里出一张完整的版本对照表,并解释为什么某些组合能跑、某些组合会崩。这里先给一个核心心法:装vLLM之前,先去官方文档看它的Release Notes,里面会明确写出支持的CUDA和PyTorch版本。
4.3 前置知识:需要的其实没有你想象的深
很多朋友担心自己基础不够,不敢接触vLLM。我可以负责任地告诉你:只要你具备以下基础,就能跟得上这套教程——
- 了解Python的基本语法,会写简单的脚本;
- 知道Docker是什么,会跑基本的
docker run命令; - 对Transformer架构有粗浅的了解(知道Attention机制是干什么的);
- 会用Linux的终端操作。
不需要你会写CUDA kernel,不需要你精通PyTorch的底层机制,更不需要你读过论文原文。当然,如果你能理解“token是一个语言模型处理文本的基本单位”这个概念,就已经超过了大部分人。
4.4 三个心态建设:少走弯路的前提
第一,不要怕报错。vLLM的报错信息大部分情况下是准确的,尤其是显存相关的OOM(Out of Memory)错误,它甚至会把当前显存分配情况、各组件占用比例都打印出来,方便你定位瓶颈。遇到报错不要慌,把它当成框架在帮你诊断问题。
第二,不要盲目抄命令。我见过不少人从网上复制一段vLLM启动命令就开跑,结果各种参数组合根本不适配自己的模型和显存。每一条命令、每一个参数都值得你花时间弄清楚它的含义。磨刀不误砍柴工,这句话在推理性能优化中尤其适用。
第三,不要追求一步到位。vLLM的学习曲线就像爬坡,只要有耐心,每个阶段都能看到阶段性的成果。从“跑通一个最小的demo”到“能稳定服务生产流量”之间,还有很长的路要走,但这条路上的每一步,都让你对这套框架的理解更深一层。
5. 高频问题与认知误区:提前帮你排雷
5.1 “vllm首字慢”到底是怎么回事
在各大技术社区里,“vllm首字慢”是一个出镜率极高的话题。很多用户第一次用vLLM,感觉生成第一个token前的等待时间很长,就会得出vLLM性能不行的结论。这其实是一个典型的指标误区。
首字延迟(TTFT)指的是从请求发出到生成第一个token的时间,它主要由三部分构成:请求排队时间、输入序列的prefill计算时间、以及KV Cache的命中情况。如果请求并发量大,排队时间自然上升;如果输入了很长的提示词(比如几千个token),prefill阶段的矩阵计算量也是实打实的。vLLM的核心优化目标是提高吞吐量,而吞吐量和首字延迟在某种程度上是有矛盾的。理解了这层关系,你就不会再用单一指标去评价一个框架的好坏。
5.2 8B、27B模型的显存估算:一个简单的公式
部署vLLM时最常被问到的问题是:“Qwen3-8B要多大的显存?27B呢?”我给你一个快速估算方法,虽然不精确,但足够你选型使用。
模型权重占用的显存约等于模型参数量乘以精度字节数。以8B模型、FP16精度为例,权重约为( 8 \times 10^9 \times 2 )字节,约16GB。再加上KV Cache(取决于并发数和序列长度)、CUDA context和激活值,总占用通常在20GB以上。所以7B/8B模型配一张24GB的卡,跑起来是比较舒服的;11GB的卡(如2080 Ti、3080笔记本版)则需要量化(比如AWQ、GPTQ)或极限压缩max-model-len。
27B模型FP16权重约54GB,就需要双卡42GB级别并行,或者用量化(比如AWQ 4bit能压到约14GB权重)。在教程里,我会展开一张不同模型、不同精度、不同并发条件下的显存对照表,并示范怎么用vLLM的--gpu-memory-utilization参数来控制缓存使用上限。
5.3 Windows下到底能不能跑vLLM
这个问题也是高频中的高频。官方vLLM并不原生支持Windows,但不代表Windows用户完全没办法。目前比较可行的三条路是:WSL2(Windows Subsystem for Linux)、Docker Desktop、以及通过ModelScope在WSL中使用vLLM。
我推荐的办法是:Windows上装Docker Desktop,然后拉取vLLM官方镜像运行。这个方案绕开了很多原生安装的坑,而且干净利落,不需要在Windows里手动编译CUDA扩展。教程第01期就会带你完整走一遍这个流程,从装Docker到拉镜像、挂载显存、启动服务、调用接口,全流程演示。
5.4 “vllm 0.23.0 chunk_size bug”与版本敏感体质
网上关于“vllm 0.23.0 chunk_size bug”的讨论,我关注了挺长时间。这个bug会导致某些场景下显存分配异常或性能回退,后来官方通过后续版本进行了修复。它带给我最大的教训就是,用vLLM必须养成一个习惯:每次升级版本之后,要把自己的配置跑一遍回归测试。生产环境里建议固定版本,不要频繁升级;升级时要重点阅读Changelog中关于显存分配、调度参数、API变动的部分。
5.5 sglang和vllm,到底应该怎么选
经常有人问我:SGLang这两年势头很猛,和vLLM比到底谁更强?我的回答通常是,这更像一道选择题而不是判断题。SGLang在RadixAttention和高效前缀复用上有自己的独到之处,某些场景下性能表现很亮眼;但vLLM胜在生态成熟、社区庞大、兼容性好,无论新模型发布还是新硬件适配,支持速度基本都是最快的。具体怎么选,要看你的业务场景、模型类型、以及团队的技术储备。这套教程中,我会专门安排一次两种框架的实测算例对比,用数据说话,不搞印象流。
5.6 “自己写调度器”——vLLM的可定制性
最后来聊聊“vllm自己写调度器”这个话题。vLLM之所以能在推理框架中脱颖而出,除了性能以外,很大程度上归功于它良好的架构设计和开放度。调度器是vLLM的决策中枢,它决定了哪些请求可以进入执行列表、KV Cache块如何分配、序列的优先级怎么排序、OOM时优先抢占谁。官方允许开发者通过注册自定义调度器的方式替换默认的FCFS策略,一旦你掌握了这套扩展机制,你的推理服务在业务定制能力上会上升一个台阶。
当然,这属于进阶内容,我给它的定位是“教程第07期以后的彩蛋”,先不展开。大家先把前面的基础打牢,自然能走到这一步。
到这里,前言和导读就差不多了。最后再补充一句实在话:vLLM这样的框架,看十篇教程不如自己跑一遍。遇到问题别急着上网发帖,先看日志、查版本、看显存状态——这三板斧能解决80%的问题。准备好了的话,我们下期见,环境的安装与验证,走起。