NETBYTE
Začít projekt

Výzkum

Helix, díl 1: trénujeme evropský jazykový model

Trénujeme vlastní jazykový model. Je malý – 320 milionů parametrů –, ale čte všech 24 úředních jazyků Evropské unie a trénuje na grafických kartách určených pro hry. Tento první díl vypráví, jak jsme se sem dostali; druhý vyjde, až trénink skončí.

Autor: Marcus Weitschat 8 min čtení

Tečková matice toho, čemu může každý token v Helixu věnovat pozornost: modrý pás pro lokální okno, žluté tečky pro vlastní blok, roztroušené oranžové tečky pro vybavování na dlouhé vzdálenosti.

Proč herní studio trénuje jazykový model

NETBYTE dělá hry, aplikace a weby. Jazykové modely se v takových produktech objevují čím dál častěji: jako postavy, které odpovídají, jako nápověda, která rozumí otázce, jako nástroje, které něco udělají. Většina otevřených modelů myslí především anglicky; estonština, irština nebo maltština přicházejí až na okraji. Chtěli jsme celému řetězci porozumět sami – data, tokenizér, architektura, trénink – a zjistit, kam skutečně jdou peníze.

parametrů
320 mil.
úředních jazyků EU
24
trénovacích tokenů
6,5 mld.
za pronajaté GPU
≈ 12 $

Helix začal jako výzkumný prototyp. Všechno níže je rozhodnutí, které ho formovalo, každé podložené měřením – a k tomu chyby, které nás stály nejvíc času.

Čtyři nápady, přežil jeden

Prototyp mířil na čtyři známé slabiny dnešních generátorů textu. Píše po blocích 16 tokenů místo po jednom, umí několikrát projít sdíleným jádrem vrstev, pro každý blok předpovídá kompaktní „plán“ a kombinuje levnou lokální pozornost s lineární pozorností pro velké vzdálenosti.

Psaní po blocích fungovalo hned: malý testovací model napsal 64 tokenů ve 13 průchodech sítí, kde běžný model potřebuje jeden průchod na token – zhruba pětinu práce. Zbylé tři nápady neprošly tvrdším testem. Postavili jsme úlohy, ve kterých odpověď leží daleko za lokálním oknem, takže se model musí ohlédnout přes celý text.

Obrázek 1 Vybavování na dlouhé vzdálenosti Podíl správných odpovědí v úloze na vybavování, jejíž nápověda leží mimo lokální okno. Malý referenční model, stejný rozpočet pro každou variantu.
  1. Jen lokální okno 23,1 %
  2. + lineární pozornost, plán a smyčky 23,1 %
  3. + 2 přesné globální hlavy 49,4 %
  4. Plná pozornost (kontrola) 49,0 %
Zobrazit data
VariantaSprávně
Jen lokální okno23,1 %
+ lineární pozornost, plán a smyčky23,1 %
+ 2 přesné globální hlavy49,4 %
Plná pozornost (kontrola)49,0 %
Náhoda (25 %)25,0 %

Vyřešila je jen přesná pozornost přes celou vzdálenost. Lineární pozornost, plán a smyčky zůstaly na úrovni náhody; optimalizátor dokonce stáhl lineární paměť na poločas kratší než jeden token. Dvě přesné globální hlavy stačily, aby se vyrovnaly plné pozornosti.

Výsledný model proto ponechává v každé vrstvě osm lokálních hlav s oknem 256 tokenů a v každé druhé vrstvě přidává dvě přesné globální hlavy; vrstvy mezi nimi si ponechávají dvě hlavy lineární pozornosti s hradlem. Plán a smyčky jsou vypnuté. Zůstávají v kódu a jsou otestované, ale na skutečném textu se jejich cena nevyplatila.

Obrázek 2 Kam se dívá každá vrstva Deset hlav pozornosti na vrstvu, dvanáct vrstev. Každá vrstva má osm lokálních hlav; liché vrstvy přidávají dvě přesné globální hlavy, sudé dvě hlavy lineární pozornosti s hradlem.
  • Lokální, okno 256 tokenů
  • Přesná globální pozornost
  • Lineární pozornost s hradlem
Zobrazit data
Typ hlavyVrstvyHlav na vrstvu
Lokální, okno 256 tokenů1–128
Přesná globální pozornost1, 3, 5, 7, 9, 112
Lineární pozornost s hradlem2, 4, 6, 8, 10, 122

Měřit, ne předpokládat

Každý trénovací trik jsme testovali na modelu s 94 miliony parametrů se stejným rozpočtem na běh: 29,5 milionu tokenů, stejný seed, stejné pořadí dat. Dva běhy téže konfigurace se liší o ±0,03, takže cokoli menšího je šum.

Obrázek 3 Co pomohlo – a co byl šum Změna validační ztráty oproti základu s AdamW. Model s 94 mil. parametrů, 29,5 milionu tokenů na běh. Pod nulou je lépe; šedý pás je šum mezi běhy (±0,03).
  1. Muon + rozvrh WSD -0,587
  2. Optimalizátor Muon -0,347
  3. Hlubší a užší síť -0,099
  4. Rozvrh WSD -0,080
  5. Reziduum hodnot -0,007
  6. z-loss +0,029
  7. Pozornost se seskupenými dotazy +0,088
Zobrazit data
ZměnaΔ ztráty (naty)
Muon + rozvrh WSD-0,587
Optimalizátor Muon-0,347
Hlubší a užší síť-0,099
Rozvrh WSD-0,080
Reziduum hodnot-0,007
z-loss+0,029
Pozornost se seskupenými dotazy+0,088

Optimalizátor Muon byl jedinou velkou pákou a dobře se kombinuje s rozvrhem rychlosti učení warmup-stable-decay. Vrácení embeddingu a výstupní vrstvy zpět na AdamW, jak doporučují autoři Muonu, přineslo dalších 0,12 a zrychlilo trénink o 5 %. Kombinace se jednoduše nesčítají: hlubší a užší síť pomáhala s AdamW a škodila s Muonem. Proto každá slibná kombinace dostala vlastní běh.

24 jazyků, 6,5 miliardy tokenů

Helix čte webový text z FineWeb-Edu pro angličtinu a z FineWeb-2 pro zbylých 23 jazyků – u větších z jeho horní desetiny vybrané podle kvality. Kód, matematika a malý syntetický proud chatů směs doplňují. Angličtina dostává třetinu. Ostatní jazyky jsou váženy podle množství dostupného textu, vyhlazeného tak, aby irština a maltština nezapadly, a žádný zdroj se neopakuje víc než čtyřikrát – do té hranice je opakování téměř stejně dobré jako čerstvá data.

Obrázek 4 Co Helix čte Podíl trénovacích tokenů podle skupin zdrojů. Korpus o 6,5 miliardy tokenů ve 34 proudech; kód a značkování zahrnuje Python, JavaScript, C, C++, Javu, HTML, CSS a Markdown.
  1. Dalších 23 jazyků EU 51,6 %
  2. Angličtina 33,0 %
  3. Kód a značkování 10,0 %
  4. Matematika 3,0 %
  5. Syntetické chaty a nástroje 2,4 %
Zobrazit data
ZdrojPodíl
Dalších 23 jazyků EU51,6 %
Angličtina33,0 %
Kód a značkování10,0 %
Matematika3,0 %
Syntetické chaty a nástroje2,4 %

Proud chatů je extraktivní: odpovědi se přebírají ze skutečných odstavců a výsledky nástrojů se počítají, nikoli vymýšlejí. Učí formát, ne znalosti. Tokenizér je bajtový BPE s 64 000 položkami; pro každý jazyk psaný latinkou vměstná do jednoho tokenu 3,3 až 4 bajty textu.

Tři chyby, které stojí za vyprávění

  • Model, který četl odpověď. V jedné větvi kódu globální hlavy ignorovaly kauzální masku a viděly budoucí tokeny. Ztráta klesla během 75 kroků z 6,85 na 1,71 a šestnáctihodinový běh byl k ničemu. Podezřele dobrá ztráta je hlášení o chybě; přesně tohle teď hlídá regresní test.
  • Znaky nejsou bajty. Komprese se počítala ve znacích místo v bajtech UTF-8. To si vymyslelo „slabinu“ v čínštině a řečtina s bulharštinou vypadaly skoro dvakrát hůř, než ve skutečnosti jsou.
  • Dokumenty rozlámané na každém prázdném řádku. Enkodér dělil dokumenty na každém prázdném řádku – a prázdné řádky jsou uprostřed téměř každého zdrojového souboru. Ztratilo se až 35 % textu s kódem a matematikou. Opravili jsme oddělovač a 31. října přestavěli celý korpus; trvalo to 2 hodiny a 12 minut.

Od stolu k pronajatému stroji

Prvních 1,66 miliardy tokenů proběhlo na jediné AMD Radeon RX 7800 XT. Použitelné to udělaly dvě věci: příznak jádra pozornosti, který je ve výchozím stavu vypnutý – bez něj byla pozornost 12× pomalejší –, a kompilace každé vrstvy pomocí torch.compile. Při mediánu 11 800 tokenů za sekundu by zbytek trval ještě skoro pět dní.

Napsali jsme proto autopilota. Pronajímá GPU na Vast.ai, nahraje kód, korpus a checkpoint, trénuje, každé tři hodiny stáhne checkpoint domů a zastaví se dřív, než dojde kredit. Druhého listopadu prošel třemi stroji, které poskytovatelé nikdy nespustili, a pak zakotvil u dvou RTX 4070 Ti Super v Německu za 0,363 $ na hodinu. Nahrání 15,4 GiB trvalo 40 minut.

Obrázek 5 Rychlost tréninku Tokeny za sekundu pro model s 320 mil. parametrů při délce sekvence 1 024 (medián). Lokálně: jedna AMD Radeon RX 7800 XT. Pronájem: dvě NVIDIA RTX 4070 Ti Super.
  1. Lokálně, před optimalizací 8 319
  2. Lokálně, zkompilováno 11 830
  3. Pronájem, 2 GPU 41 367
Zobrazit data
SestavaTokeny/s
Lokálně, před optimalizací8 319
Lokálně, zkompilováno11 830
Pronájem, 2 GPU41 367

41 400 tokenů za sekundu je 3,5násobek stolu. Pronajatá část – 4,8 miliardy tokenů zhruba za 33 hodin – stojí asi 12 $.

Kde je Helix dnes

Obrázek 6 Dosavadní trénink Ztráta v natech na token, nižší je lepší. Odložený: text, na kterém model nikdy netrénuje. Trénink: průměr za každých 50 milionů tokenů; při dochlazení klesá rychleji, zčásti proto, že se mění směs dat. Osa končí u plánovaných 6,5 miliardy tokenů.
  • Odložený
  • Trénink

Ztráta (naty na token)

Přečtené tokeny v miliardách

Zobrazit data
Přečtené tokeny v miliardáchOdloženýTrénink
0,064,5714,261
0,553,7763,574
1,043,6943,469
1,543,5963,421
2,033,4263,238
2,523,3293,143
3,013,2913,113
3,503,2633,076
3,993,2253,079
4,493,2443,076
4,983,2183,036
5,353,1232,884

K 3. listopadu 2026 přečetl Helix 5,35 ze svých 6,5 miliardy tokenů. Od 5,2 miliardy běží fáze dochlazení: rychlost učení klesá a směs se posouvá k matematice, kódu a chatům. Na odloženém textu ze všech proudů je ztráta 3,12 natu na token.

Obrázek 7 Kde je který jazyk Bity na bajt na odloženém textu po 5,35 miliardy tokenů, nižší je lepší. Řečtina a bulharština vypadají lépe zčásti proto, že každé jejich písmeno zabírá dva bajty.
  1. řečtina 0,721
  2. bulharština 0,844
  3. francouzština 1,065
  4. angličtina 1,086
  5. španělština 1,135
  6. portugalština 1,219
  7. němčina 1,257
  8. nizozemština 1,268
  9. italština 1,277
  10. polština 1,355
  11. dánština 1,364
  12. maďarština 1,407
  13. slovenština 1,412
  14. maltština 1,415
  15. rumunština 1,416
  16. švédština 1,418
  17. irština 1,422
  18. slovinština 1,431
  19. čeština 1,444
  20. litevština 1,450
  21. lotyština 1,451
  22. chorvatština 1,507
  23. finština 1,508
  24. estonština 1,727
Zobrazit data
JazykBity na bajt
řečtina0,721
bulharština0,844
francouzština1,065
angličtina1,086
španělština1,135
portugalština1,219
němčina1,257
nizozemština1,268
italština1,277
polština1,355
dánština1,364
maďarština1,407
slovenština1,412
maltština1,415
rumunština1,416
švédština1,418
irština1,422
slovinština1,431
čeština1,444
litevština1,450
lotyština1,451
chorvatština1,507
finština1,508
estonština1,727

Co to znamená v praxi, nejlépe ukazuje neupravená ukázka z checkpointu při zhruba 4,9 miliardy tokenů. Začátek je náš, zbytek je od Helixu:

Ukázka v angličtině, checkpoint při 4,9 miliardy tokenů, bez úprav

Začátek textu: The history of the printing press begins in the fifteenth century, when Johannes Gutenberg introduced movable type to Europe. Before that, books Výstup modelu: for printing were usually in the form of texts, usually in the format of illustrations. In its introduction to the printing press, Gutenberg uses one line-of-action model to illustrate a series of printed pieces of a book.

Gramatika, volba slov a téma drží; fakta ne. Přibližně to lze čekat od 320 milionů parametrů a 6,5 miliardy tokenů: plynulý model, který si vymýšlí.

Co přijde dál

Předtrénink skončí za pár hodin. Potom přijde fáze dlouhého kontextu s knihami z Project Gutenberg a právními texty EU z EUR-Lex, doladění pro konverzaci a práci s nástroji a malý návrhový model, který zrychlí generování.

Zpět na všechny články

Další krok

Co má vzniknout příště?

Řekněte nám o své hře, aplikaci, webu nebo AI projektu. Pro začátek stačí krátká zpráva.