1. 别再把“推理”看成一次简单的前向计算
这年头只要聊大模型,绕不开“推理”这两个字。但很多人对推理的理解还停留在“模型跑一下,输出结果”的层面,这就错过了这个领域最有意思的部分。大模型推理不是什么单次计算,而是一整套围绕每生成一个token要付出多少成本展开的系统工程。过去三年我一直在做推理侧的优化和部署,亲眼看着这一块从“能跑就行”变成“谁跑得便宜、谁跑得快、谁能塞进更多用户,谁就赢”。
先抛个反直觉的结论:模型的智力水平当然重要,但在真实业务里,推理系统的工程水平往往比模型本身的benchmark更决定产品成败。同一颗GPU,有人只能同时服务几十路请求,有人能扛几百路;同一台MacBook,有人跑7B模型卡到没法用,有人用4-bit量化加MLX流畅得像本地应用。差距不在模型,在推理。
那为什么过去这段时间推理突然成了风口?因为训练只是造出模型,模型真正产生价值,是在被反复调用、持续输出的时候。这个“持续输出”就是推理。训练是一次性的资本开支,推理是永不停止的运营成本。当模型从实验室走向千行百业,推理成本、推理速度、推理的稳定性,直接决定了商业化能不能闭环。
这篇文章我想把大模型推理的来龙去脉、当下最实用的优化手段和未来价值转移的方向一次说透。不整教科书式的理论堆砌,就把我自己实测过的路径、踩过的坑、看到的趋势,诚实地写出来。
2. 过去十年:推理从“手写kernel”到“引擎之争”
2.1 GPU诞生那天的推理方式:效率极低但没人觉得不对
在Transformer兴起之前,深度学习推理的日子远没有想象中那么“古老”。CNN、RNN的时代,推理就是一个固定的计算图:输入张量,走一遍卷积、归一化、激活、全连接,输出结果。那时候的优化思路也简单粗暴——手写CUDA kernel、把算子融合一下、用TensorRT做个int8量化,基本就到头了。
但大模型彻底改写了这个游戏。Transformer的解码是自回归的:每生成一个token,都要重新走一遍整个网络。更麻烦的是,每个token都要依赖之前所有的token,这种顺序依赖让并行计算变得非常别扭。你用GPU算一次前向可能只需要几毫秒,但生成200个token,就要循环200次,这个循环里还伴随着KV Cache的反复读取和写入。
我记得刚开始接触GPT类模型推理时,第一个反应是:这不就是拿最贵的显卡干最笨的循环活吗?每一轮都在重复计算前面已经算过的东西,纯粹靠显存和带宽硬扛。那时的推理框架也粗糙,比如最早的HuggingFace Transformers库,处理并发请求就是简单的批处理,一个用户一个用户地排队,GPU利用率惨不忍睹。
这个阶段的“价值”几乎全部集中在模型研究本身。谁把模型做得更大、更聪明,谁就有话语权。推理只是附带品,没人指望从推理速度里榨出商业价值。格局在那时还很清晰:算力为王,显存是爹。
2.2 vLLM和PagedAttention:推理第一次成为独立的工程赛道
转折点在2023年,vLLM带着PagedAttention横空出世。这个项目的意义怎么强调都不过分——它让整个行业意识到,推理不是模型的附属品,而是一个可以独立优化的系统问题。
PagedAttention解决的核心矛盾是显存碎片化。传统推理里,KV Cache需要为每个请求预留连续显存空间,但请求长度是不可预测的,预留多了浪费,预留少了溢出。vLLM借鉴操作系统虚拟内存的分页思想,把KV Cache切成固定大小的块,按需分配,像内存分页一样管理。这个思路让推理吞吐量直接翻倍甚至更多。
更重要的是,vLLM引入了Continuous Batching机制——不再等一个批次全部生成完才释放slot,而是每当一个请求结束,立即插入新请求。这样GPU的空闲时间被压到极低。我第一次把线上服务从HF Transformers切到vLLM时,同样一张A10,吞吐量从不到10条请求跃升到几十条,而且延迟更稳定。那种感受很难用语言描述,就是“原来是这么回事”。
vLLM带来的是一个更深的信号:推理的价值开始从“聪明的模型”向“高效的执行”转移。开源社区的情绪也变了,大家不比谁训的模型大,开始比谁的推理引擎快、谁支持的多模态多、谁的调度器更聪明。新一批创业公司也冒出来了,专门做推理加速和部署优化,这个变化放在五年前是没人敢想的。
2.3 框架混战:TensorRT-LLM、SGLang、MLC-LLM与推理硬件的分钟级适配
vLLM之后,推理引擎进入百花齐放的时代。NVIDIA官方下场做了TensorRT-LLM,针对自家GPU做极致优化,算子融合、显存管理、量化支持都做到了顶尖,但代价是编译时间漫长、生态封闭。SGLang走的是另一条路,专注结构化生成的运行时优化,把复杂提示的调度做到极致。MLC-LLM则是编译器路线的代表,把模型一次性编译成跨平台的部署产物,在移动端、Web端跑得飞起。
这时候的推理优化已经不是单一技巧的堆叠,而是变成了一个系统工程:模型并行、张量并行、投机采样、量化、算子融合、动态Batch、KV Cache量化、Prefix Cache……每一块都是一整个研究子方向。我在自己项目里接触这些技术时最大的感受是:没有银弹,必须按业务场景排列组合。
比如你做的是高并发短文本生成,那PagedAttention和Continuous Batching是核心;你做的是长文档总结,那KV Cache管理和prefill阶段优化更重要;你在Mac上本地跑模型,那MLX和4-bit量化才是命根子。这种“分场景定制”的成熟度,本身就是推理作为一个独立行业成熟的标志。
到这一步,价值已经从“模型”进一步下沉到“推理基建”。谁的引擎能更快适配新模型、更稳地跑在高并发下、更省算力,谁就切走蛋糕最大的一块。NVIDIA因为芯片和生态双重垄断,成了这个阶段最大的赢家,这一点所有人都看得见。
3. 当下的推理实战:从量化选型到引擎调优的落地细节
3.1 算力不够怎么办:4-bit量化不是我推荐,是刚需
聊现在的推理,绕不开量化。我一直认为,量化不是“牺牲精度换速度”的妥协,而是理解模型参数分布之后的必然选择。大模型训练完之后,大多数权重分布在很窄的范围内,把FP16的两位小数换成INT4的整数表达,绝大部分场景下效果几乎无损,但显存和带宽占用直接砍掉四分之三。
我在Apple Silicon上跑Qwen3.8的27B模型时,用MMLU等基准对比过FP16和MLX 4-bit:精度差距非常有限,但速度从完全不可用变成了基本流畅对话。如果你的机器只有780M核显或者一块老旧的消费级显卡,4-bit现在就是我心目中的最低起步配置,不然你连模型都塞不进显存,还谈什么推理速度。
关键是要选对量化实施框架。CUDA环境首选GPTQ或AWQ,跑在GPU上并行度高,质量稳定;Apple生态自然选MLX的4-bit量化,它利用统一内存架构的优势,能直接在内存里做混合精度推理,效果显著。我跑27B模型时,MLX 4-bit在M2 Max上能做到每秒吞吐接近可接受水平,虽然达不到云端高端的水平,但本地离线用已经足够了。如果你的场景是纯CPU推理,那GGUF格式的Q4_K_M档位会更实在,兼容性极强。
这里必须提醒一句:量化不是万能的。如果你做的是代码生成、数学推理这类对精确性敏感的任务,或者要处理极长的上下文,4-bit会让输出质量有明显波动。我的建议是任务简单、对延迟敏感的走低bit量化;复杂推理任务至少留到8-bit或直接FP16,别为了省显存把正确率搭进去。
3.2 推理引擎实测:vLLM是首选,但nano-vllm才是最好的“解剖教材”
vLLM的强悍不需要我再吹一遍,但我更想聊聊它的教学版本——nano-vllm。这是个规模小得多的项目,代码量不到2000行,却精确复现了vLLM最核心的推理调度逻辑。对于学习推理原理的人来说,研究nano-vllm远比自己啃vLLM源码高效十倍。
我学习的时候是这么啃的:先用nano-vllm跑通一个最简的模型推理,然后从三个问题入手——KV Cache怎么分配?调度器怎么决定哪个请求先跑?批处理什么时候插入新请求?逐个函数地读代码、画调用关系、打日志验证。半个月后回过头看vLLM的源码,很多曾经晦涩的抽象概念全通了。
如果你想通过nano-vllm入门推理引擎,我建议用这个路径:先跑通官方示例,再读Scheduler和CacheEngine两个核心模块;不要跳过日志分析,你自己给代码加print,看它每轮循环里请求状态是怎么流转的;最后尝试改一个最简单的策略,比如修改最大批大小或换一种调度排序,观察吞吐和延迟的变化。这三步走完,你对推理引擎的认知会比看十篇博客都深。
3.3 本地部署和边缘设备:780M核显调配出来的“能跑”到底是什么水平
本地部署是许多人的真实需求:数据不能出内网、不想付API费、或者单纯想离线折腾。我最近用一个780M核显的设备做测试,只靠核显跑7B模型,在4-bit量化下能出字,但速度就是“打字机”水平,每秒五六个token,勉强能用但谈不上流畅。
如果你也在打核显的主意,先别急着追求大模型。我的实操建议是:7B以下模型配4-bit量化是核显的舒适区;超过这个规模,你会被显存带宽和内存带宽同时卡住。核显的最大优势是和CPU共享系统内存,能塞进大模型,但瓶颈也在共享带宽上。想让它快,可以试试用小上下文窗口、限制最大生成长度、关掉不必要的采样选项,这些都能让体验提升一大截。
比核显体验好一个量级的方案是Apple Silicon的MacBook Pro。统一内存架构处理KV Cache的时候效率极高,M系列芯片的NPU还能分担一部分decode工作。我实测下来,MLX框架在M系列上的推理速度要明显快于同样算力水平的Windows笔记本,而且功耗低、安静、不用抢电。如果预算允许,M系列Pro机型本地跑7B-14B模型是比较舒服的甜点位。
3.4 算力约束下的资源配置:不是堆卡,是建模
回到工程层面。很多团队在算力紧张时第一反应是“加卡”,但我在多个项目里观察到的真相是:绝大多数推理性能问题,根源不在卡少,而在资源调配不合理。
我建议你按这个思路做资源配置建模:先算总吞吐需求(每秒请求数乘平均生成长度),再定延迟目标(TTFT小于多少、TPOT小于多少),然后测单卡在不同并发下的最大吞吐和延迟曲线,最后根据目标与曲线的交点反推卡数。这一步做完你会发现,很多时候优化调度比增加硬件投入划算得多。
具体到参数层面,需要仔细搭配max_num_seqs(最大并发批次数)、max_model_len(最大上下文长度)和gpu_memory_utilization(显存利用率)。有一个常见误区:把max_model_len设得很大,看起来能处理长文本,实际却把KV Cache的显存占满,导致并发能力急剧下降。我的习惯是,先从业务实际需求出发设定最大上下文,一般128K需求就设128K,不要盲目体验极限,然后给KV Cache预留充足空间,最后逐步调大max_num_seqs观察延迟拐点。这几步做扎实,单卡吞吐翻倍是常有的事。
4. 推理“卡脖子”的底层瓶颈与破解方向
4.1 显存带宽:被大多数人忽略的硬约束
聊推理优化,所有人都在聊算力、聊TOPS,但真正常年吃紧的是显存带宽。算力再高,如果参数和KV Cache搬不动,一切都白搭。大模型推理本质上是带宽密集型任务——每一个token的生成,都要把权重从显存搬到计算单元,这个搬运开销远大于计算开销本身。
举个例子:一个7B模型,FP16权重14GB,单次前向即使只要读一遍全部权重,在带宽1TB/s的显卡上,光搬运就要14毫秒。而计算本身可能只要两毫秒。这就是为什么我经常说,推理瓶颈卡在带宽,不在SM核心利用率。量化之所以立竿见影,核心原因正是它减少了搬运量——4-bit权重只有FP16的四分之一,搬运时间直接缩短。
把KV Cache也考虑进来,情况更严峻。长上下文场景下,KV Cache动不动占几个GB到几十GB,每生成一个新token都要把它从头读一遍。这也是为什么KV Cache量化和滑动窗口注意力会成为热门研究方向。老实讲,我对模型结构的关注正在减少,对这种存储与访存模式的优化反而越来越多,因为这才是推理成本的命门。
4.2 深度学习编译器和算子融合:把“碎片计算”焊成“整块搬运”
显存带宽问题虽然硬,但通过算子融合还是能挤出大量闲置空间。所谓算子融合,是把多个连续计算步骤合并成一个kernel,减少中间结果的显存写回和读入。以Transformer的一层为例,正常的实现可能要十几个kernel来回切,融合优化后可以压缩到三四个甚至更少。
编译器在这件事里扮演关键角色。TVM、MLIR、XLA这些编译器生态都在做同一件事:把计算图分析、调度、映射到具体硬件指令。MLC-LLM的思路尤其有意思,它把模型编译成可移植的库,然后针对不同后端生成机器码,一次编译到处跑。我在尝试用MLC编译7B模型部署到Web端时,体验是有点惊艳的——模型在浏览器里跑Transformer,速度虽然比原生慢一截,但已经像样了。
不过编译器路线有一个绕不开的痛点:编译时间特别长,模型结构一变就得整个重来。做研究迭代模型结构时不划算,但在固定模型结构的部署场景里,这种“慢工出细活”正是工业级的正确路径。
4.3 投机采样与并行解码:用“小聪明”换真实加速
既然自回归解码本质上就是“生成一个token就得停一次”,那就有人动脑筋:能不能用小模型先猜出好几个token,然后让大模型一次验证?这就是投机采样的核心思路。
我用一个具体的比喻来解释:大模型是一位很可靠的专家,请他写一百个字很费时间;投机采样相当于先请一位实习生写几个草稿,专家只需看一遍就能判断哪个对、哪个错。如果实习生猜得准,专家一次就能确认多个token,省下好几次前向的时间。这项技术在7B模型配128M小模型时,能把解码速度提升1.5到3倍,代价是显存多占一份小模型的空间。
我自己的实测结果是,在短文本、指令明确的场景里,投机采样的加速效果相当可观;但在创造性写作、长文生成这类小模型猜不准的场景,收益就明显缩水甚至可能变慢。所以这个技术适合拿来当优化手段,但不适合当默认选项。和它搭配的还有Medusa这种并行解码思路,原理是在模型头上加几个并行解码头,让一次前向产出多个token。
4.4 连续批处理和调度策略:把GPU当成高峰期的地铁
任何一个推理服务,如果让请求随机到达,GPU的利用率都会波动得很厉害。连续批处理的出现,就是为了让GPU始终处于“满载发车”的状态。它的核心逻辑是:批内任意一个请求结束,立刻让新请求顶上,时刻保证batch里坐满人。
调度策略则是决定“排队顺序”的艺术。先来先服务能保证公平,但长请求会阻塞短请求;按长度优先排序能降低平均延迟,但可能有饥饿风险。工业级引擎通常把两者结合,既设置最大等待时间,又按长度动态调整优先级。我自己调试线上服务时,在调度上花的精力比选模型多得多,因为调好的调度策略能直接决定用户体验和成本曲线。
5. 未来已来:推理时计算、世界模型与价值迁移的终局
5.1 OpenAI o1带来的范式震动:思考越久,答案越好
2024年下半年,OpenAI o1类模型的发布让推理领域发生了又一次范式转移。传统大模型是“一次前向出结果”,o1则是推理时计算的代表——模型在给出答案前会先生成大量隐藏的思维链token,反复推演、自我纠错,消耗的计算量远超普通模型,但正确率也同步大幅提升。
这个方向带来的启示很微妙:模型聪明不是全部,让它“愿意思考”同样能带来质变。对未来推理系统而言,如何高效地生成和管理这些思维链token,怎么缓存已验证的推理路径、避免重复计算,将成为新的优化热点。你此前积累的KV Cache技术、调度策略、分布式并行经验,都会在这里再次派上用场。
5.2 推理时计算的价值向“数据与验证”迁移
一旦模型开始做大量推理时计算,新的问题就浮出水面:这个token它在“思考”什么?哪些推理步骤是有效的,哪些是在绕远路?这时候,验证器、过程奖励模型、搜索树剪枝这类话题的价值会迅速上升。推理的下一步不再是单纯加速计算,而是让计算花在“值得花”的地方。
我觉得这才是标题里那个问题的真正答案:价值正在从“算得快”向“算得对”迁移,从“模型本身”向“验证模型推理质量的基础设施”迁移。谁能设计出更好的验证器、更好的奖励模型、更好的推理路径搜索策略,谁就掌握了下一代推理系统的方向盘。大模型的智力天花板已经被证明是可以靠推理时计算来突破的,但推理时计算的成本也需要被水管工程一样的基建能力来约束。
5.3 世界模型与“语言先验”的博弈:DeepMind那篇论文给我的启发
说到未来推理,我头脑里总有一个论文的影子:DeepMind展示了大语言模型在跳过视觉输入后,仅靠语言先验就能在视觉问答任务上达到高准确率。很多人讨论这论文是为了看“模型到底有没有视觉能力”,但我的关注点是另一层:语言先验本身是多么强大,而纯粹依赖语言先验的推理又是多么危险。
好的推理系统不应该只依赖语言统计规律,而应该学会建立世界模型——对物理规律、时空关系、因果链路的可执行模拟。现实世界里的工程师纠结推理延迟时,往往是在做检索、验证、搜索的组合优化;未来的推理系统会做更复杂的事:把符号规则、模拟器、真实传感器数据接入模型推理回路。那时,推理不再只是模型的“内部认知”,而是和外部世界持续交互的“主动认知”。
5.4 推理成本的“杰文斯悖论”:更便宜,反而更多
最后聊一个有意思的经济学现象。当推理成本下降、响应速度提升,智能体的需求并不会减少,反而会增加——这就像汽车变得更便宜后,人们会开更多的车。当每个token的成本降到足够低,大模型就会被嵌入到越来越多过去想都不敢想的场景里:实时翻译耳机、工业质检、个人助理、代码审查、教育陪练。
所以从价值投资的角度看,推理侧的成本降低不会让这个市场萎缩,反而会无限扩大。训练侧的价值会继续向上游集中(更强的模型、更贵的数据),但推理侧的价值会向下游分散(更便宜的服务、更广泛的应用)。做应用的人不必焦虑“模型会不会变得太强让我失业”,反而应该焦虑“我的应用能不能足够快地把最好的模型融入到用户体验里”。
6. 写在最后:一点实操体会
这段内容收尾之前,我想分享几个经过实际检验的心得。
第一,不要迷信单一框架。vLLM很强,但不代表所有场景都适合它。API服务、并发场景选vLLM没毛病;本地离线、要跑在笔记本上,MLC-LLM或llama.cpp更稳;Apple Silicon用户,MLX就是最优解。工具是为场景服务的,别为框架的信仰买单。
第二,性能测试必须覆盖长尾场景。短请求快不代表长请求也快。我在线上踩过最狠的坑就是只在短文本上测性能,结果上线后面对大量长文档请求,延迟直接翻了几倍。测性能一定要包含“长上下文+高并发”的压测组合,不然你的SLA就是纸糊的。
第三,从学习角度,nano-vllm的优先级要高于vLLM源码。如果你想入推理引擎这个行当,先啃nano-vllm把调度、缓存、批处理这三大核心吃透,再去接触工业级框架。顺序反了,很容易被庞大的代码量劝退。
最后说一句我的真实判断:大模型推理这个领域的精彩程度,远没到尾声。过去几年我们解决了“怎么把推理做得又快又便宜”,未来几年要解决的是“怎么让推理变得可信、可验证、可交互”。这条路还很宽,值得每一位做AI基建的人继续走下去。