Transformer 预填充在每个 token 上复用权重,主要受矩阵乘法和激活数据搬移支配;单 token 解码复用少,受权重和 KV-cache 读取主导。我们推出 FUTRANSFORMER,在 NVIDIA Hopper GPU 上的 CUDA 实现,遵循 CODA 的 GEMM-plus-epilogue 思路,并加入以下优化:
- 直接将 KV-cache 写入目标位置;
- 将固定的 RMSNorm 增益折叠进权重;
- FP8 输出直接写入并延迟缩放;
- 预填充阶段无需填充 padding;
- 解码使用 INT4 投影权重和 INT4 KV-cache 拷贝;
- 权重和键采用 Tensor Core 片段布局,可在不生成完整中间 tile 的情况下直接反量化为 MMA 操作数;
- 块对角 Hadamard 变换降低异常通道的缓存量化误差。
在一块 H100 上,预填充比编译的 PyTorch FP8 快至 1.48 倍,算力达 1.29 PFLOP/s。对于 8B 模型的 gate/up 投影使用 SwiGLU,BF16 路径比 CODA 快 1.13 倍,FP8 路径比 BF16 CODA 快 2.02-2.18 倍。跨 8B 与 70B、批次 1-32,INT4 解码比对应的 PyTorch BF16 与 INT4 实现快 1.3-2.4 倍,分别比编译的 CUDA-graph BF16 快 2.1-3.3 倍,比 PyTorch INT4 投影内核快 1.3-6.3 倍,并且比我们的 FP8 路径快 31-51%。完整的 Llama-3.1-8B 解码在 batch-1 时每步仅需 2.8 ms,而编译的 transformers 实现需 8.1 ms。
在 WikiText-2 上使用 INT4 权重路径解码时,困惑度从 6.24 上升到 7.23(四舍五入权重)或 6.99(GPTQ 同格式),旋转的 INT4 缓存额外增加 0.20。我们的内核在困惑度上与量化参考计算的差异不超过 0.001。
点评