在消费类 GPU 上实现用于扩散 Transformer 的本机 INT8 计算:用于 Ideogram 4.0 的融合 INT8 GEMM 内核
Realizing Native INT8 Compute for Diffusion Transformers on Consumer GPUs: A Fused INT8 GEMM Kernel for Ideogram 4.0
摘要
后训练 INT8 (W8A8) 扩散量化 Transformer 被广泛部署为速度优化,但在消费类 Ampere GPU 上,它通常比它旨在击败的 FP8 和 NF4 替代品慢。我们将其追溯到软件工件:生产“INT8”前向量化权重和激活,只是立即将它们反量化回 bf16 并运行 bf16 矩阵乘法,从不使用 GPU 的 INT8 张量核心,因此硬件的计算优势完全无法实现。我们通过将单个融合的 Triton INT8 GEMM(Ampere 张量核心上的 int8xint8->int32,每个词元 x 每个通道的去量化和偏差折叠到尾声中,根据 GEMM 形状自动调整)来缩小这一差距,并将其放入 Ideogram 4.0 扩散 Transformer 的线性层中,而不是去量化到 bf16 路径。在内核中,int8xint8->int32 累积与 torch._int_mm 相比是位精确的,并且反量化输出与余弦相似度 1.0 处的参考匹配,没有 NaN,每个 GEMM 的运行速度比 bf16 快 2.8-4.2 倍。它在 768 像素处提供约 1.1 倍(约 9-10%)的加速,在 1024 像素处,它在单个 RTX 3090 上在 156.5 秒内生成图像,比单卡 NF4(164.5 秒)和 FP8(172.9 秒)基线更快,并且在这些点估计(PickScore/CLIPScore)上没有可测量的质量成本。因此,INT8 从最慢的变体变为最快的变体,并且 1024px 变得单 GPU 可行。轻松满足主要速度标准(优于 FP8,约 9.5%); NF4 裕度(~4.9%,单次运行 n=4)在我们未量化的运行间方差内,最好解读为与满足拉伸目标一致。我们以诚实的部署图结束:胜利是针对消费者 Ampere 的,在 A100 和 B200 上,相同的内核输给了这些卡的快速本机 bf16/FP8 路径。