FP8预填充+INT4解码:Hopper上Llama推理新优化

FuTransformer为Hopper上的Prefill和Decode分别设计FP8与INT4量化路径,兼顾算力与带宽瓶颈。
FuTransformer是针对Llama-style Transformer在NVIDIA Hopper GPU上的CUDA推理实现,核心思路是承认Prefill与Decode的计算特征不对称,分别采用不同量化策略。Prefill阶段权重复用充分、瓶颈在矩阵乘法,因此走FP8路径,通过GEMM与epilogue融合、RMSNorm增益折叠、延迟缩放和结果直写KV-cache来减少数据搬运,在单张H100上达到1.29 PFLOP/s,比编译PyTorch FP8快最多1.48倍。Decode阶段几乎无权重复用、瓶颈转向权重与KV-cache读取,因此采用INT4权重与INT4 KV-cache,并让反量化结果直接作为Tensor Core的MMA操作数,配合块对角Hadamard变换缓解离群通道误差,在8B/70B形状下比PyTorch最快方案快1.3至2.4倍。精度方面,INT4权重使perplexity从6.24升至7.23(RTN)或6.99(GPTQ),旋转缓存再增加0.20。作者强调量化策略应跟随推理阶段瓶颈,而非追求全流程统一格式,但结论目前仅限单卡H100实验环境。
为什么Prefill和Decode需要不同的量化策略?
Transformer推理的两个阶段有着截然不同的计算特征。Prefill阶段同时处理整个提示序列,权重可以在多个token之间复用,性能瓶颈主要来自矩阵乘法和激活值的数据搬运;而单token的Decode阶段几乎没有权重复用,瓶颈转移到权重读取和KV-cache读取上。
这种不对称性意味着,用同一套量化方案覆盖两个阶段往往会在某一侧做出妥协。FuTransformer正是针对这一矛盾提出的CUDA实现,它为NVIDIA Hopper GPU上的Llama-style Transformer块分别设计了FP8预填充路径和INT4解码路径。

KV-cache是自回归解码中缓存历史token的Key和Value张量的机制,避免每步重新计算整个前缀的注意力。其大小随batch size、序列长度、层数和隐藏维度线性增长,在长上下文场景下可占显存的主要部分。Decode阶段每生成一个token都需读取全部KV-cache,因此其带宽开销与序列长度成正比,这正是文章将KV-cache读取列为Decode瓶颈、并为其单独设计INT4缓存副本的原因。
Tensor Core fragment布局指NVIDIA GPU中矩阵乘加指令(如MMA)对操作数在寄存器和共享内存中的排布有特定要求,数据需按特定线程-元素对应关系摆放。若反量化结果不满足该布局,就需先写入共享内存再重排,引入额外搬运。文章强调权重和key按fragment布局存放,正是为了让反量化输出直接作为MMA操作数,省去这次重排与写回。
FP8 Prefill:把GEMM和epilogue融合到底
FuTransformer沿用了CODA的GEMM-plus-epilogue思路,但将其应用到推理场景,并做了几项针对性改造:直接将结果写入KV-cache位置、把固定的RMSNorm增益折叠进权重、使用延迟缩放直接输出FP8,以及支持无padding的预填充。
这些改动的共同目标是减少中间数据的往返搬运。将RMSNorm增益折叠进权重意味着推理时少一次逐元素的乘加;延迟缩放则让FP8输出无需额外的量化步骤。在单张H100上,该预填充路径比编译后的PyTorch FP8快最多1.48倍,达到1.29 PFLOP/s。
在8B形状下带SwiGLU的gate/up投影上,其BF16路径比CODA快1.13倍,而FP8路径比所评估的BF16 CODA路径快2.02至2.18倍。
INT4 Decode:让反量化直接进入MMA操作数
Decode路径使用了INT4投影权重和INT4 KV-cache副本。关键设计在于,权重和key都按照Tensor Core的fragment布局存放,反量化后可以直接作为MMA操作数使用,无需生成完整的中间tile。这消除了INT4方案中常见的一次额外内存写入。
另一个细节是针对离群通道的精度补偿。论文采用块对角Hadamard变换来降低缓存量化误差,缓解离群通道对INT4量化的干扰。
在8B和70B形状、batch 1至32的范围内,INT4解码比PyTorch的BF16与INT4块中较快者还要快1.3至2.4倍;相比编译并CUDA-graphed的BF16快2.1至3.3倍,相比使用PyTorch INT4投影kernel的同一块快1.3至6.3倍——后者针对单query行设计,在batch 32时甚至输给BF16。相比自家的FP8路径,INT4解码也快31%至51%。
完整Llama-3.1-8B在batch 1下每步解码耗时2.8毫秒,而编译版transformers实现为8.1毫秒。
Hadamard变换是一种正交线性变换,可将向量中各分量能量均匀分散。量化中若某些通道存在幅度远大于其他通道的离群值,INT4的有限动态范围会被这些通道占据,导致其余通道量化误差增大。块对角Hadamard变换对权重或激活按块施加旋转,把离群能量摊薄到块内各维度,从而降低整体量化误差。文章用它处理KV-cache,代价是perplexity增加约0.20,换取了缓存量化误差的下降;变换需在推理前后对应施加,因此也带来少量额外计算。
精度代价:perplexity从6.24到7.23
量化加速并非没有代价。将WikiText-2的每个token都通过INT4权重路径解码,perplexity从6.24上升到7.23(round-to-nearest权重)或6.99(同格式的GPTQ);旋转后的INT4缓存再增加0.20。
这些数字提供了清晰的权衡参考:GPTQ在该格式下明显优于朴素的round-to-nearest,而Hadamard旋转带来的额外0.20 perplexity换取了缓存量化误差的下降。kernel实现与量化参考计算之间的perplexity差异在0.001以内,说明加速并未引入额外的数值偏差。
**Perplexity(困惑度)**是语言模型评估的常用指标,定义为模型对测试文本每个token平均负对数似然的指数,数值越低表示模型对文本的预测越准确。它受分词方式、测试集和上下文长度影响,因此只在同一设定下横向比较才有意义。文中6.24到7.23的上升幅度约16%,对应INT4权重路径引入的量化噪声;而GPTQ的6.99说明利用校准数据优化舍入能挽回部分损失。kernel与参考实现间差异小于0.001,则表明加速实现本身未额外引入数值偏差。
GPTQ是一种训练后量化方法,利用少量校准数据逐层最小化量化误差,通过近似二阶信息(Hessian)决定权重舍入方向,使量化后输出与全精度输出的偏差最小。与朴素的round-to-nearest(直接就近舍入)相比,GPTQ在极低比特(如INT4)下通常能显著降低精度损失,这正是文中同一INT4格式下GPTQ perplexity(6.99)明显优于RTN(7.23)的原因。其代价是需要一次离线校准过程,且不同模型需重新校准。
实践意义
FuTransformer的价值不在于单项指标的突破,而在于展示了分阶段量化在Hopper上的工程可行性:预填充用FP8吃满算力,解码用INT4压低带宽压力,两者共享同一套fragment布局的反量化逻辑。对于部署Llama-style模型的团队,这条路径提示了一个方向——量化策略应当跟随推理阶段的瓶颈走,而不是追求全流程统一格式。
需要留意的是,上述加速数据均来自单卡H100的实验环境,多卡并行、更长上下文以及不同batch分布下的表现仍需进一步验证。
相关推荐

零成本搭建AI超级员工系统:智能体自动工作流全解析
深度拆解B站演示的AI超级员工系统:Agent智能体编排、数字人口播、地图与企业获客、24小时智能客服及法务模块全覆盖。分析零成本开户背后的商业逻辑与合规风险,帮助创业者判断这套AI数字员工系统的真实投产比。

Chatbot与AI Agent的本质区别:从对话到执行的跨越
Chatbot和AI Agent有什么区别?本文基于Learn Tech频道的MCP系列讲解,用订机票、笔记摘要等实例说明:Chatbot只给答案,Agent通过思考-行动-观察循环真正完成任务,并拆解模型、工具、记忆、目标四大部件及MCP的桥梁作用,同时讨论Agent的适用边界与权限风险。

免费GitHub仓库:342小时AI课程,从数学到MCP服务器
一个免费GitHub仓库提供342小时AI课程,包含523节课、20个阶段,覆盖数学基础到Agent构建和MCP服务器。支持目标驱动学习,每节课产出可留存的prompt、skill或agent,已有近10万人开始学习。