Learning
Všechny články
AI24. srpna 2026 6 min

Stejné váhy ještě neznamenají stejný model

Attention kernel, kvantizace KV cache i počet GPU mění odpověď

Model, který si stáhneš, je jen polovina modelu

Stáhneš váhy, spustíš je lokálně a máš pocit, že model je hloupější než tentýž model přes API. Obvyklé vysvětlení zní kvantizace. Skutečná odpověď je širší: váhy nejsou model, model je až váhy plus stack, který je vykonává. A ten stack má stovky komponent, z nichž každá si smí zvolit trochu jinou aritmetiku.

Autor série měření pustil na jedné kartě RTX PRO 6000 Blackwell model Qwen 3.6-27B na reálné stotisícitokenové úloze a měnil vždy jednu proměnnou pod modelem. Váhy zůstávaly bit po bitu totožné. Výstupy ne.


Čtyři vrstvy, kde se aritmetika rozejde

Attention kernel. FlashAttention 2, Flash Inference a Triton počítají tutéž pozornost jinými cestami. Zpočátku dávají bitově shodné výsledky. Dál v kontextu se rozcházejí a rozdíl se propíše až do toho, který token vyhrál jako nejpravděpodobnější.

Kvantizace KV cache. Snížení přesnosti uložených klíčů a hodnot z BF16 na INT8 nebo INT4 nezhorší kvalitu plošně. Zasáhne bodově. V jedné sekvenci volání nástrojů se INT4 varianta z chyby dokázala vzpamatovat, INT8 ne. Nižší přesnost tedy nemusí znamenat horší běh, což je přesně ten druh nemonotónnosti, který znemožňuje intuitivní ladění.

Kvantizace vah. Mezi BF16, FP8, INT8, NVFP4 a AWQ se u nejnižších přesností rozešla zhruba polovina tokenů, jakmile kontext narostl na 88 tisíc.

Tenzorový paralelismus. Rozložení modelu přes víc GPU mění pořadí redukcí přes NCCL, a tím i výsledek. U jednoho a téhož volání nástroje uspěl běh na jedné kartě, na dvou selhal a na čtyřech znovu prošel.


Proč se z nuly na dvacátém desetinném místě stane jiná odpověď

Klíčový krok je vzorkování. Výběr tokenu je diskretizace: spojité rozdělení pravděpodobností se srazí na jednu celočíselnou volbu. Dokud vede jeden kandidát s velkým odstupem, je jedno, že se pravděpodobnosti liší v posledních bitech. V okamžiku, kdy jsou dva kandidáti blízko, rozhodne ten poslední bit — a od té chvíle běží obě varianty po jiné větvi.

To je také důvod, proč se rozpad nechová hladce. Neroste plynule s délkou kontextu. Objevuje se ve shlucích a závisí spíš na obsahu promptu než na jeho délce: většina pozic má jasného vítěze, ale text obsahuje místa, kde je rozhodnutí těsné. Tam se stack propíše do sémantiky.

Nejhůř to dopadá u strukturovaných výstupů. V próze se odchýlené slovo ztratí. Ve volání nástroje je jeden znak navíc rozdíl mezi platným argumentem a parsovací chybou, po které agent zabloudí.


Co to dělá s benchmarky

Většina publikovaných čísel neuvádí attention backend, přesnost KV cache ani topologii GPU. Přitom se ukázalo, že tyhle proměnné samy o sobě posunou výstup víc, než kolik dělá rozdíl mezi dvěma sousedními verzemi modelu.

Z toho plyne nepříjemný závěr: skóre bez popisu stacku není měření, je to anekdota. A stejně tak srovnání dvou fine-tunů, které běžely na jiné konfiguraci, neměří fine-tune.


Co si z toho odnést

Ber inference stack jako součást artefaktu, ne jako běhové prostředí. Když ladíš chování lokálního modelu, patří verze kernelu, přesnost KV cache a počet karet do stejné kolonky jako teplota a systémový prompt — jsou to vstupy, ne detaily nasazení.

Když měříš, zafixuj celý stack a zapiš ho vedle výsledku. Rozdíl, který přičítáš modelu, může být rozdíl v pořadí sčítání.

A když stavíš agenta, počítej s tím, že tahle nejistota se nejvíc projeví přesně tam, kde jsi nejcitlivější — v argumentech volání nástrojů. Validace výstupu a schopnost zotavit se z rozbitého volání nejsou luxus, ale reakce na vlastnost hardwaru pod modelem.

Zdroje

Poslech místo čtení — 1 zdroj k načtení.