最近跟几个做推理加速的同行聊,大家不约而同提到了同一个趋势:模型开始“想”得越来越久。以前的大模型回答问题是“张嘴就来”,现在的模型会在内部生成大量推理片段,反复校验、回溯、多步推导之后再给出答案。这个转变在算法侧叫“慢思考”,说白了就是让模型在解码之前先进行长链路的内部推理,用更多的计算换取更高的正确率。
但慢思考带来的直接后果,是单次请求的token消耗量暴增,有些场景下甚至是原来的几十倍。这时候再回头看整个AI计算栈,会发现一个很尴尬的事实:计算单元其实没那么紧张,真正的瓶颈已经变成了数据搬运——也就是存储墙。这个墙以前被大batch、高并发掩盖了,慢思考等于把这层窗户纸直接捅破。
这篇文章我想把慢思考如何从算法底层“引爆”存储墙,以及为什么这会强制重构整个AI计算栈这件事讲透。内容会比较硬,会涉及KV Cache、带宽计算、PagedAttention、数据流调度这些底层细节,但也尽量兼顾刚入门的读者。如果你在做大模型推理服务、算子优化,或者准备设计下一代推理硬件,这篇文章应该对你有参考价值。
1. 先搞清楚存储墙到底“墙”在哪里
1.1 计算和存储之间的“剪刀差”
存储墙不是一个新概念,计算机体系结构课里早就讲过。核心矛盾就一句话:处理器性能每年增长百分之几十,而内存带宽和延迟的改善每年只有几个百分点。几十年下来,两者之间拉开了一个数量级的差距。CPU要等内存,GPU也要等显存,AI加速器同样逃不过这个规律。
在大模型推理场景里,这个矛盾被进一步放大了。一个LLM的权重参数动不动就是百亿、千亿级别,每次生成一个token,理论上需要把所有权重至少读一遍。以7B模型为例,单次decoding的权重读取量大约是14GB(权重复制两份算),而单张A100的HBM带宽是2TB/s左右。这样一算,单次token生成的理论时间下限大约是7毫秒,这还没算激活值、KV Cache和其他开销。换句话说,就算计算单元完全空闲,光是把权重从显存里搬出来就够吃满整个memory带宽。
有人可能觉得,A100不行,H100总行了吧?H100的HBM带宽是3.35TB/s,比A100提升了近70%,但H100的FP16算力也从312TFLOPS涨到了989TFLOPS,涨幅是217%。算力涨得比带宽快得多,计算带宽比进一步恶化,存储墙只会越来越厚。
1.2 快思考时代为什么“墙”不明显
在快思考范式下,模型生成token的路径很短,模型直接给出答案,所有注意力和计算都集中在解码当前token上。这时候通过加大batch size,把多个请求的token解码叠加在一起,就能让权重读取的“固定开销”被多个请求分摊,计算利用率可以拉得很高。推理引擎只要能把batch堆上去,存储墙的影响就被压在了后台。
这也是为什么之前大家优化推理性能时,重心都放在算子融合、显存复用、量化这些方向上,很少有人觉得存储系统本身是个致命问题。因为只要batch大,计算流水线就是饱和的,带宽的问题被掩盖了。
慢思考把这个逻辑彻底推翻了。它要求模型在回答前先生成一连串的“隐藏推理片段”,这些片段不直接面向用户,但对最终答案质量至关重要。直观上看,慢思考像是把一道问答题变成了应用题,模型要先列式、计算、验证好几步再给出最终答案。每一步都是一次完整的模型前向传播,都需要读取全部权重,生成新的token,还要更新KV Cache。
2. 慢思考如何精准引爆存储墙
2.1 KV Cache的显存黑洞
慢思考对KV Cache的影响是最直接、最致命的。KV Cache是Transformer解码过程中保存的Key和Value矩阵缓存,用于避免重复计算历史token的注意力。它的显存占用和序列长度成正比,和层数、注意力头数、隐藏维度成正比。慢思考会让序列长度显著增加,KV Cache也就跟着线性膨胀。
可以做一道计算题感受一下。假设一个65B参数的模型,隐藏维度8192,层数80。每个token的KV Cache大小是2(K和V)乘层数乘隐藏维度乘以精度字节数。以FP16为例,大概是2乘以80乘以8192乘以2字节,等于每个token约2.6MB。如果推理上下文长度撑到8K,单条请求的KV Cache就需要约20.3GB。一条请求就干掉了A100 80GB版近四分之一的显存。如果算上慢思考带来的几千token内部推理序列,再加用户上下文的几千token,随便一条请求的KV Cache冲到30GB以上是轻轻松松的。
快思考时代,一条请求几千token上下文的场景不算多,而且可以通过提前截断来避开。慢思考等于把长上下文变成了常态,模型内部推理产生的token动辄几百上千,KV Cache的膨胀速度是几何级的。这直接挤压了batch size的可行性,batch一旦缩水,计算利用率断崖式下跌,存储墙自然浮出水面。
2.2 权重读取从“分摊”变“独吞”
慢思考不仅增加KV Cache,还改变了权重读取的节奏。快思考时,多请求共享同一份权重,只要batch大,权重相当于被并行复用。慢思考时,每个请求生成的推理token数量暴增,但请求之间是独立的,无法像同步batch那样整齐划一。推理服务要维持高batch利用率,要么用连续批处理把不同阶段的请求拼到一起,要么就得忍受单请求长时间占用计算单元,导致权重读取的摊薄效应变差。
打个比方,快思考像是公交车,所有乘客挤在一辆车上,司机跑一趟能送几十个人;慢思考像是每人都要打的士,虽然路线更自由,但每公里油耗却是成倍上升。最终算力利用率、带宽利用率都会显著下降,存储墙的问题被直接放大到了系统层面。
2.3 显存带宽的硬性天花板
再回到能力侧。显存带宽不是无限制扩张的。目前HBM的制造工艺、堆叠层数、功耗都接近物理极限,单颗HBM3E的带宽密度提升已经放缓。相对地,算力依然在通过制程微缩和架构优化高速增长。一旦双方的发展曲线不再匹配,计算过程就会被动变成“等数据”的过程。慢思考正好把这个“等”字放大得无比明显。
情况就是这么个情况:慢思考把单请求的计算量推高了几十倍,但这些计算里绝大多数是串行依赖的,无法并行。GPU的算力是并行出来的,串行任务天然无法吃满并行算力。结果就是计算单元在干等,而存储系统在拼命往外吐数据。哪怕存储吞吐跑满,算力利用率也只有可怜的个位数百分比。
3. 存储墙如何重构AI计算全栈
3.1 算子与推理引擎层的重构
先看最贴近硬件的算子层。传统FlashAttention等优化重点在减少显存读写和提升计算密度,它们针对的是快思考场景。慢思考时代,注意力计算的特征变成了“极长的序列、极大的KV Cache、高比例的读操作”。对应的优化思路就要调整。
一个主流方向是重写KV Cache的存储布局。原来KV Cache是一段连续内存按token顺序排列,慢思考的长序列会让分配碎片化严重,利用率暴跌。这里可以借鉴vLLM提出的PagedAttention思路,把KV Cache切成固定大小的“页面”,按需分配,像操作系统管理内存页一样管理KV Cache。好处是显存利用率能压到90%以上,但代价是注意力计算时需要处理跨页引用,对访存局部性不友好。实践中需要对KV Cache的页表做分层,按头和层粒度优化索引,才能在“防碎片”和“快读取”之间取得平衡。
另一个方向是面向稀疏性的结构设计。慢思考的推理序列里,不是每个token都值得保留和参与注意力计算的。很多中间推理token的作用只是“过渡”,对最终答案影响很小。业界正在探索用可学习的方式识别“关键token”,定期做序列精简,压缩KV Cache。这本质是一种模型侧的剪枝策略,需要在精度和效率之间做权衡。关键观察是:与其让硬件被动扛存储墙,不如直接从算法源头减少要存储的数据。
3.2 运行时调度与内存管理的重构
算子层改了还不够,真正决定存储墙能否被软化的是运行时调度这一层。当前主流的continuous batching策略,核心逻辑是让batch动态增减,GPU空闲就立即填充新请求。慢思考打破了连续批处理的假设——请求轻重差异巨大,短请求一个token就结束,长请求要内部推理几百步。这会让调度器面临严重的“木桶效应”,一个慢请求能拖住整批计算。
解决思路之一是引入类似分时系统的“时间片”调度,把慢请求的推理切分成可抢占的阶段,让快请求插空执行。这里需要解决的是状态保存恢复问题,KV Cache的中间状态要怎么安全地暂存和恢复,涉及显存分配和数据拷贝,稍微处理不好,收益就被开销吃掉了。
内存管理这边,核心命题是“显存不够,怎么凑”。慢思考的KV Cache已经大到单卡放不下的程度。主流做法是把KV Cache做分层,热数据留在HBM,冷数据卸载到DRAM甚至SSD。这听起来简单,实际做起来很考验工程能力:CPU和GPU之间的传输瓶颈、卸载的触发时机、预取的准确性,任何一环做不好都会造成卡顿。
3.3 硬件架构与系统设计的重构
当软件层的优化已经无法完全弥合缺口,硬件的底层逻辑就必须变。当前GPU在体系结构上更偏重“计算”,存储层级是为高吞吐并行计算设计的,而慢思考这种“访存密集、低并行度、长串行依赖”的工作负载,和GPU的架构哲学是有错配的。
有意思的是,业界已经在为这类负载设计专门的硬件。一种思路是“数据流优先”架构,把注意力计算和KV Cache的读取拆解到独立硬件模块上,和主计算流水线解耦。Context推理引擎、推测解码模块,本质上都是想让“想”的过程不占用主执行流,缩短存储墙对计算单元的阻塞时间。我自己体会,这个方向短期内的核心不是做出多大的算力,而是做好“精准预取”和“多级缓存”的协同,让需要的数据在计算单元发出请求前就绪。
互联层面,超节点、舱级互联成为热议方向,本质也是想把带宽瓶颈从HBM扩展出去。但前提是存储系统配合重构,否则带宽再大,数据要从远端的存储或另一颗芯片搬过来,延迟依然可怕。存储协议上,业界也在探索共享内存语义、RDMA式的KV Cache交换机制,让多卡共享显存池,而不是各持私地,互不相通。
3.4 算法侧与模型侧的“反向重构”
存储墙不只是工程层要解决的问题,算法侧也需要配合改变。最直接的是模型结构的重新设计:减小KV Cache的占用,比如Multi-Query Attention、Grouped-Query Attention,让多个头共享K和V,直接砍掉KV Cache的体积。现在很多新模型的GQA设置已经成了标配,就是为了给推理阶段的存储减负。
还有更激进的“线性注意力”路线,尝试让注意力计算不随序列长度增长。原理是用核函数或状态空间模拟全局依赖,把注意力矩阵近似化。这类方法在效率测试中表现亮眼,但在复杂推理任务上和标准Transformer的精度差距还不小。慢思考恰恰需要长程推理能力,所以线性注意力能否胜任慢思考场景,目前还没有定论,值得关注。
算法侧的另一个变化是投机采样和思维路径压缩。投机采样用一个小模型快速生成“草稿”,大模型批量验证,本质上是在算法层面减少大模型的串行前向次数,降低权重读取量。思维路径压缩则是在不牺牲回答质量的前提下,让模型少生成冗余的推理中间步。两者都是在“让存储墙无压力”的角度间接解决瓶颈。
4. 从工程实践看全栈重构的可行性路径
4.1 推理引擎改造的优先级排序
讲完原理,落到实际工程,改造推理引擎时应该怎么排优先级?我的经验是,先从“省显存”开始,再优化“带宽利用”,最后才碰“调度策略”。
省显存是基础。KV Cache量化是个高性价比选择——FP16降到FP8,显存占用直接减半。INT4的KV Cache量化虽然激进,但在部分模型上已经能控制精度损失。优先做KV Cache量化能快速缓解显存压力,让batch保持在合理水平,给后续优化留出空间。
然后是带宽优化。这里最值得做的是FlashAttention类的内核优化,把KV Cache的读取优化到极致,同时配合算子融合减少中间结果的往返搬移。内核层面的优化对最终吞吐影响最大,也最考验工程能力,需要对着profile反复调优。调优过程中会发现,存储读取的模式比想象中复杂,不是单纯调大缓存就能解决的,必须有针对性地调整数据布局。
最后才是调度策略。在省显存和带宽优化做完之后,调度的复杂度会低很多。调度层的改造要解决的核心是“如何让慢请求和快请求共存”,不要让一个“想得久”的请求把整个GPU占到天荒地老。正确做法是给请求设置推理时间预估值,预测它会消耗的资源量,再决定要不要让它占据计算单元,以及有没有必要为它预留Ray级别的长任务配额。
4.2 存储系统与计算集群的配套改造
单节点改造解决不了所有问题。慢思考一旦和长上下文结合,KV Cache的总量可能超过单机显存总量,这时集群层面的存储协同就变得很关键。
我的建议是先从KV Cache的分层存储开始,把HBM、DRAM、NVMe SSD按照访问延迟和容量做成三级结构,靠智能缓存算法让不同访问频率的数据待在最合适的层级。HBM保留最近活跃的token,DRAM放整个上下文的基底数据,SSD保存超长的历史状态。层间淘汰策略可以参考CPUcache的LRU思想,但必须结合注意力访问的“位置敏感”特性来微调——因为某些中间token在随后某一步会被重点访问,纯LRU可能导致重要token被过早淘汰。
集群层面最重要的是存储状态的可迁移性。推理任务一旦发生排队或迁移,KV Cache不能跟着计算任务“粘”在一起,否则迁移成本极高。我这里坚持,KV Cache的存储和推理执行必须解耦,存储层做成独立的可挂载资源,执行节点随用随取。这跟数据库里的存储计算分离是一个思路,但换成了推理场景。
4.3 量化掉“存储墙”好奇心之后的一线实践体会
聊点我个人的踩坑经验。改造过程中最容易出的问题是:所有优化都在推理引擎里做,忽略了对模型本身的适配。慢思考模型为了在长序列上表现好,本身对KV Cache的空间和精度就很敏感。简单粗暴地做KV Cache量化,经常导致推理链断裂,中间token被压缩后丢失关键信息,最终答案质量大幅下滑。KV Cache量化必须和模型联合调参,不能只量化不看效果。
另一个实践教训是监控指标的选择。很多团队优化时只看TFLOPS和吞吐量,这两个指标在慢思考场景下非常容易造假。吞吐量高不代表用户体验好,因为慢思考请求的前置等待时间可能非常长。我后来更看重“首token延迟”和“总算力成本/有效回答质量”的比值。算法的“慢思考”本质是用计算换质量,如果这种交换效率太低,就需要重新评估到底值不值得在推理链上跑这么久。
4.4 存储墙问题的行业界再思考
存储墙重构AI计算全栈,本质上不是一场“计划内”的技术演进,而是被慢思考硬生生逼出来的。慢思考用最朴素直接的方式展示了:AI性能的下一步天花板,不在芯片里有多少晶体管,而在数据能不能及时送到该去的地方。
边缘侧也是同样的故事。端侧设备跑慢思考模型时要面对比数据中心更严苛的带宽和内存限制,存储墙问题只会更尖锐。未来会有越来越多协同调度框架出场:一部分推理“想”的动作由中心化的高性能服务完成,一部分“说”的动作返还给端侧小模型,云端与终端共同分担存储墙压力。
我判断,接下来一段时间的AI计算创新方向上,围绕存储墙的软硬协同设计会成为新的热土。PIM计算、近存计算、存内计算这些老概念会被重新翻出来,大量慢思考驱动的工程结构会在新一代系统中落地。任何无法绕过存储墙的架构,最终都会在慢思考模型面前现出原形——这已经不只是一个硬件话题,而是整个AI技术栈必须认真面对的核心命题。
说到底,存储墙一直都在那里,是慢思考让它从一个“被忽略的底层现实”变成了“决定整个系统设计的第一性原则”。谁会坐稳下一个时代的AI基础架构,就看能否与这堵墙共舞了。