Zyphra 开源 ZYFA:MI355X 上 FP8 快 1.76 倍

11 月 6 日,Zyphra 发布 ZYFA,也就是 Zyphra FlashAttention on AMD,这是一组面向 AMD Instinct MI355X GPU 的 FP8 与 BF16 prefill 注意力内核,采用 Apache 2.0 协议开源。这是 Zyphra 面向长上下文 prefill 的 FP8 注意力引擎,同时也给 Zyphra Optimization Engine 的注意力部分提供底层能力。

快 1.16 到 1.76 倍,误差低 62% 到 78%

在真实模型激活数据上,ZYFA 的 FP8 内核比 AMD 默认内核库 AITER 快 1.16 到 1.76 倍。在 head dimension 为 128 的条件下,ZYFA 的 FP8 误差比 AITER 低 62% 到 78%。项目以技术论文加代码的形式发布,BF16 内核用 HIP 编写,FP8 内核则是由 Python 生成器手工调度的汇编。

卡在哪里:softmax 抢走矩阵单元

问题出在 FP8 只加速两次矩阵乘,也就是 QK 转置与 PV,夹在中间的 softmax 在两种精度下都跑在向量单元上,速度完全一样。32 个 query 对 128 个 key 时,FP8 矩阵部分要 1024 个周期,而精确 FP8 softmax 要 896 个向量周期,内核需要近乎完美的重叠才能让矩阵单元忙起来。Zyphra 的线程追踪显示,AITER 的矩阵管线有 31.7% 的周期处于空闲。

Lean P 把 softmax 周期砍到 384

解决办法是 Lean P 写法,把 e4m3 位模式当作整数读时数值每翻一倍就增长 8,于是 2 的 x 次方大约是 8x 加一个常数。Lean P 每写一个 FP8 概率只做一次乘加和一次整数转换,把每块的 softmax 向量周期从 896 降到 384。两个 wave 共享同一组 SIMD,一个发矩阵指令一个算概率,然后交换角色,配合 Lean P 后矩阵管线在稳态周期中的忙碌比例从 60% 提升到 86%。同厂商的稀疏注意力路线,可对照 Zyphra ZHA 稀疏注意力的 373 倍加速推算。

硬件门槛与能效实测

落地条件相当硬。ZYFA 只支持 AMD Instinct MI355X 这一款卡,要求 CDNA4 架构、gfx950 目标、ROCm 7.2.3 与 PyTorch 2.12,调用方式是直接替换 flash_attn_func 的 drop-in 接口。32K token 的高斯基准下,head dim 128 的 FP8 内核跑到 2672 TFLOP/s,AITER 是 1944 TFLOP/s,MLA 形状下是 2464 对 1237,约 1.99 倍。能效上,采集到的 Mistral-7B 与 Qwen3-8B 真实层里,ZYFA 分别是 1.94 和 1.91 TFLOP/J,AITER 是 1.60 和 1.56。相对 fp64 的 KL 散度,完整 Mistral-7B 上 ZYFA 是 3.4 乘 10 的负 3 次方,AITER 是 5.9 乘 10 的负 3 次方。

只有前向,不覆盖解码

边界也写得清楚。ZYFA 只做因果前向的 prefill,没有 decode,没有分页 KV 缓存,也不支持 MLA 之外的其他形状。真实模型收益小于基准收益的原因在于频率:MI355X 的频率取决于操作数翻转了多少位,AITER 让更多小概率变成零或非规格数,位翻转少所以频率更高,Mistral-7B 层上 AITER 跑 2108 MHz 而 ZYFA 只有 1628 MHz。Zyphra 自己的建议是在真实激活、持续频率下做基准测试。