Zyphra heeft ZYFA (Zyphra FlashAttention on AMD) uitgebracht, een set FP8- en BF16-aandachtskernels voor de AMD Instinct MI355X GPU’s. Volgens het bedrijf zijn zijn FP8-kernels tussen 1,16 en 1,76 keer sneller dan AITER, de standaard kernelbibliotheek van AMD, op echte modelactivaties. De code is open source gepubliceerd onder de Apache 2.0-licentie.
- Zyphra brengt ZYFA uit, open source onder Apache 2.0, voor AMD MI355X.
- De FP8-kernels zijn 1,16 tot 1,76 keer sneller dan AITER op echte activaties.
- Lean P vervangt de exponentiële door een vermenigvuldiging-optelling en vermindert het softmaxwerk.
- ZYFA blijft nauwkeuriger dan AITER, maar werkt alleen voor causale prefill op MI355X.
ZYFA is een FP8-aandachtsmotor ontworpen voor de prefill-fase, dat wil zeggen de verwerking van de gegeven context voordat het antwoord wordt gegenereerd, op lange contexten. Het voedt de Zyphra Optimization Engine (ZOE), die Zyphra Cloud aanstuurt. De BF16-kernels zijn geschreven in HIP, terwijl de FP8-kernels handmatig gepland assemblercode zijn, gegenereerd door een in Python geschreven generator.
Waarom presteert FP8 minder goed op de MI355X?
FP8 matrixinstructies bereiken een piek die twee keer zo hoog is als die van BF16. Maar FP8 versnelt alleen de twee matrixproducten, QKᵀ en PV, terwijl de softmax, die scores omzet in kansen, op de vectorunit draait op dezelfde snelheid voor beide precisies. Voor 32 queries tegen 128 keys kost het FP8 matrixwerk 1.024 cycli, tegenover 896 vectorcycli voor de exacte softmax: de kernel moet de twee fasen dus bijna perfect overlappen. Volgens de door Zyphra gepubliceerde uitvoeringstraces blijft de matrixpijplijn van AITER 31,7% van de cycli inactief. De MI355X volgt de voltooiing van matrixinstructies niet op hardwareniveau, dus de instructievolgorde moet deze overlapping creëren.
Drie technieken om de bottleneck te omzeilen
De eerste, genaamd Lean P, vervangt de exponentiële van de softmax door een enkele vermenigvuldiging-optelling. Een bitpatroon e4m3, gelezen als een geheel getal, neemt met 8 toe bij elke verdubbeling van de waarde, dus de code voor 2^x is ongeveer 8x plus een constante. Deze aanpak vermindert de vectorcycli van de softmax per blok van 896 naar 384.
De tweede is een ping-pong planning in twee golven: twee waves delen elke SIMD, de ene geeft matrixinstructies af terwijl de andere kansen berekent, daarna wisselen ze van rol. Met Lean P is de matrixpijplijn 86% van de cycli bezet in steady-state, tegen 60% met exacte berekening. De derde bestaat uit blokschaling: elk blok van 64 keys wordt vermenigvuldigd met een macht van 2 vóór afronding, een factor die de schaalinstructie voor matrix van CDNA4 kosteloos verwijdert. De som van de rijen wordt berekend vanuit de afgeronde kansen, met een extra matrixinstructie per blok.
Reële winsten en nauwkeurigheid
Op echte activaties bij 16K bereiken de FP8-winsten 1,16 keer voor Mistral-7B, 1,17 keer voor Qwen3-8B en 1,76 keer voor DeepSeek-V2-Lite. Op Gaussische benchmarks bij 32K bereikt de FP8-kernel met kopgrootte 128 2.672 TFLOP/s, tegen 1.944 voor AITER. De kernel blijft leidend op de MLA-vorm, met 2.464 TFLOP/s tegen 1.237, een verhouding van 1,99.
Het verschil tussen benchmarks en echte modellen komt door de frequentie van de MI355X, die afhangt van het aantal bits dat omslaat in de operanden. AITER laat meer kleine kansen nul of subnormale getallen worden, waardoor minder bits omslaan en een hogere klok mogelijk is: 2.108 MHz tegen 1.628 MHz voor ZYFA op de Mistral-7B-laag. ZYFA vereist echter minder cycli in totaal. Volgens het Zyphra-team moeten prestaties gemeten worden op echte activaties, bij volgehouden frequentie.
Vergeleken met een fp64-berekening is de FP8-fout van ZYFA 0,22 keer die van AITER op Mistral-7B en 0,38 keer op Qwen3-8B. Op het volledige Mistral-7B-model bereikt de KL-divergentie, die het verschil tussen twee kansverdelingen meet, 3,4×10⁻³ met ZYFA en 5,9×10⁻³ met AITER. Zyphra geeft ook aan dat ZYFA beperkt is tot causale prefill in de voorwaartse fase, zonder decoding of gepagineerde KV-cache, en dat het alleen werkt op MI355X.
