NETBYTE
Starta projekt

Forskning

Helix, del 1: vi tränar en europeisk språkmodell

Vi tränar en egen språkmodell. Den är liten – 320 miljoner parametrar – men den läser alla 24 officiella språk i Europeiska unionen, och den tränar på grafikkort byggda för spel. Den här första delen berättar hur vi kom hit; den andra kommer när träningen är klar.

Av Marcus Weitschat 8 min läsning

Punktmatris över vad varje token i Helix kan uppmärksamma: ett blått band för det lokala fönstret, gula prickar för det egna blocket och utspridda orange prickar för återkallning över långa avstånd.

Varför en spelstudio tränar en språkmodell

NETBYTE gör spel, appar och webbplatser. Språkmodeller finns allt oftare inuti sådana produkter: som figurer som svarar, som hjälp som förstår en fråga, som verktyg som gör något. De flesta öppna modeller tänker på engelska först; estniska, iriska eller maltesiska hamnar i marginalen. Vi ville förstå hela kedjan själva – data, tokenizer, arkitektur, träning – och ta reda på vart pengarna faktiskt tar vägen.

parametrar
320 milj.
officiella EU-språk
24
träningstokens
6,5 mdr
för de hyrda GPU:erna
≈ 12 $

Helix började som en forskningsprototyp. Allt nedan är ett beslut som formade den, vart och ett underbyggt av en mätning – och de misstag som kostade oss mest tid.

Fyra idéer, en överlevde

Prototypen gav sig på fyra kända svagheter hos dagens textgeneratorer. Den skriver i block om 16 tokens i stället för en token i taget, den kan köra en delad kärna av lager flera gånger, den förutsäger en kompakt ”plan” för varje block, och den blandar billig lokal attention med linjär attention för långa avstånd.

Blockskrivandet fungerade direkt: en liten testmodell skrev 64 tokens på 13 genomlöpningar av nätet, där en vanlig modell behöver en genomlöpning per token – ungefär en femtedel av arbetet. De tre andra idéerna föll på ett hårdare test. Vi byggde uppgifter där svaret ligger långt utanför det lokala fönstret, så att modellen måste blicka tillbaka genom hela texten.

Figur 1 Återkallning över långa avstånd Andel rätta svar i en återkallningsuppgift där ledtråden ligger utanför det lokala fönstret. Liten referensmodell, samma budget för varje variant.
  1. Bara lokalt fönster 23,1 %
  2. + linjär attention, plan och loopar 23,1 %
  3. + 2 exakta globala huvuden 49,4 %
  4. Full attention (kontroll) 49,0 %
Visa data
VariantRätt
Bara lokalt fönster23,1 %
+ linjär attention, plan och loopar23,1 %
+ 2 exakta globala huvuden49,4 %
Full attention (kontroll)49,0 %
Slump (25 %)25,0 %

Bara exakt attention över hela avståndet löste dem. Linjär attention, plan och loopar stannade på slumpnivå; optimeraren hade till och med vridit ner det linjära minnet till en halveringstid på mindre än en token. Två exakta globala huvuden räckte för att komma ikapp full attention.

Den slutliga modellen behåller därför åtta lokala huvuden med ett fönster på 256 tokens i varje lager och lägger till två exakta globala huvuden i vartannat lager; lagren däremellan behåller två huvuden med grindad linjär attention. Plan och loopar är avstängda. De finns kvar i koden och är testade, men på riktig text tjänade de inte in sin kostnad.

Figur 2 Vad varje lager tittar på Tio attention-huvuden per lager, tolv lager. Varje lager har åtta lokala huvuden; udda lager lägger till två exakta globala huvuden, jämna lager två huvuden med grindad linjär attention.
  • Lokal, fönster på 256 tokens
  • Exakt global attention
  • Grindad linjär attention
Visa data
HuvudtypLagerHuvuden per lager
Lokal, fönster på 256 tokens1–128
Exakt global attention1, 3, 5, 7, 9, 112
Grindad linjär attention2, 4, 6, 8, 10, 122

Mät, gissa inte

Vi testade varje träningsknep på en modell med 94 miljoner parametrar och samma budget per körning: 29,5 miljoner tokens, samma seed, samma dataordning. Två körningar av samma konfiguration skiljer sig med ±0,03, så allt mindre är brus.

Figur 3 Vad som hjälpte – och vad som var brus Förändring i valideringsförlust mot AdamW-baslinjen. Modell med 94 milj. parametrar, 29,5 miljoner tokens per körning. Under noll är bättre; det grå bandet är bruset mellan körningar (±0,03).
  1. Muon + WSD-schema −0,587
  2. Muon-optimerare −0,347
  3. Djupare, smalare nät −0,099
  4. WSD-schema −0,080
  5. Värderesidual −0,007
  6. z-loss +0,029
  7. Grouped-query attention +0,088
Visa data
ÄndringΔ förlust (nats)
Muon + WSD-schema−0,587
Muon-optimerare−0,347
Djupare, smalare nät−0,099
WSD-schema−0,080
Värderesidual−0,007
z-loss+0,029
Grouped-query attention+0,088

Muon-optimeraren var den enda stora hävstången, och den går att kombinera med ett warmup-stable-decay-schema för inlärningstakten. Att flytta tillbaka embedding och utdatalager till AdamW, som Muon-författarna rekommenderar, gav ytterligare 0,12 och gjorde träningen 5 % snabbare. Kombinationer adderas inte bara: ett djupare, smalare nät hjälpte under AdamW och skadade under Muon. Därför fick varje lovande kombination en egen körning.

24 språk, 6,5 miljarder tokens

Helix läser webbtext från FineWeb-Edu för engelska och från FineWeb-2 för de övriga 23 språken – för de större från dess kvalitetsfiltrerade översta tiondel. Kod, matematik och en liten syntetisk chattström fullbordar blandningen. Engelska får en tredjedel. De andra språken viktas efter hur mycket text som finns, utjämnat så att iriska och maltesiska inte dränks, och ingen källa upprepas mer än fyra gånger – fram till dess är upprepning nästan lika bra som färska data.

Figur 4 Vad Helix läser Andel träningstokens per källgrupp. Korpus på 6,5 miljarder tokens i 34 strömmar; kod och märkspråk omfattar Python, JavaScript, C, C++, Java, HTML, CSS och Markdown.
  1. 23 andra EU-språk 51,6 %
  2. Engelska 33,0 %
  3. Kod och märkspråk 10,0 %
  4. Matematik 3,0 %
  5. Syntetisk chatt och verktyg 2,4 %
Visa data
KällaAndel
23 andra EU-språk51,6 %
Engelska33,0 %
Kod och märkspråk10,0 %
Matematik3,0 %
Syntetisk chatt och verktyg2,4 %

Chattströmmen är extraktiv: svaren kopieras från riktiga stycken och verktygsresultat räknas ut i stället för att hittas på. Den lär ut format, inte kunskap. Tokenizern är en BPE på bytenivå med 64 000 poster; den packar mellan 3,3 och 4 byte text i en token för varje språk med latinsk skrift.

Tre buggar värda att berätta om

  • Modellen som läste svaret. I en kodväg ignorerade de globala huvudena den kausala masken och kunde se framtida tokens. Förlusten föll från 6,85 till 1,71 på 75 steg, och en körning på 16 timmar var värdelös. En misstänkt bra förlust är en buggrapport; nu vaktar ett regressionstest exakt det fallet.
  • Tecken är inte byte. Komprimeringen räknades i tecken i stället för UTF-8-byte. Det hittade på en ”svaghet” i kinesiska och fick grekiska och bulgariska att se nästan dubbelt så dåliga ut som de är.
  • Dokument brutna vid varje tom rad. Kodaren delade dokument vid varje tom rad – och tomma rader står mitt i nästan varje källfil. Upp till 35 % av kod- och matematiktexten gick förlorad. Vi lagade avgränsaren och byggde om hela korpusen den 31 oktober; det tog 2 timmar och 12 minuter.

Från skrivbordet till en hyrd maskin

De första 1,66 miljarderna tokens kördes på ett enda AMD Radeon RX 7800 XT. Två saker gjorde det användbart: en kärnflagga för attention som är avstängd som standard – utan den var attention 12 gånger långsammare – och kompilering av varje lager med torch.compile. Med en median på 11 800 tokens per sekund hade resten tagit nästan fem dagar till.

Så vi skrev en autopilot. Den hyr GPU:er på Vast.ai, laddar upp kod, korpus och checkpoint, tränar, hämtar hem en checkpoint var tredje timme och stannar innan krediten tar slut. Den 2 november gick den igenom tre maskiner som leverantörerna aldrig startade och landade sedan på två RTX 4070 Ti Super i Tyskland för 0,363 $ i timmen. Uppladdningen på 15,4 GiB tog 40 minuter.

Figur 5 Träningshastighet Tokens per sekund för 320M-modellen vid en sekvenslängd på 1 024 (median). Lokalt: ett AMD Radeon RX 7800 XT. Hyrt: två NVIDIA RTX 4070 Ti Super.
  1. Lokalt, före optimering 8 319
  2. Lokalt, kompilerat 11 830
  3. Hyrt, 2 GPU:er 41 367
Visa data
UppsättningTokens/s
Lokalt, före optimering8 319
Lokalt, kompilerat11 830
Hyrt, 2 GPU:er41 367

41 400 tokens per sekund är 3,5 gånger skrivbordet. Den hyrda delen – 4,8 miljarder tokens på ungefär 33 timmar – kostar runt 12 $.

Var Helix står i dag

Figur 6 Träningen hittills Förlust i nats per token, lägre är bättre. Undanhållen: text som modellen aldrig tränar på. Träning: medelvärde per 50 miljoner tokens; i nedkylningen sjunker den snabbare, delvis för att datablandningen ändras. Axeln slutar vid de planerade 6,5 miljarderna tokens.
  • Undanhållen
  • Träning

Förlust (nats per token)

Lästa tokens i miljarder

Visa data
Lästa tokens i miljarderUndanhållenTräning
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

Den 3 november 2026 har Helix läst 5,35 av sina 6,5 miljarder tokens. Sedan 5,2 miljarder är den i nedkylningsfasen: inlärningstakten sjunker och blandningen förskjuts mot matematik, kod och chatt. På undanhållen text från alla strömmar ligger den på 3,12 nats per token.

Figur 7 Var varje språk står Bitar per byte på undanhållen text efter 5,35 miljarder tokens, lägre är bättre. Grekiska och bulgariska ser bättre ut delvis för att varje bokstav i dem tar två byte.
  1. grekiska 0,721
  2. bulgariska 0,844
  3. franska 1,065
  4. engelska 1,086
  5. spanska 1,135
  6. portugisiska 1,219
  7. tyska 1,257
  8. nederländska 1,268
  9. italienska 1,277
  10. polska 1,355
  11. danska 1,364
  12. ungerska 1,407
  13. slovakiska 1,412
  14. maltesiska 1,415
  15. rumänska 1,416
  16. svenska 1,418
  17. iriska 1,422
  18. slovenska 1,431
  19. tjeckiska 1,444
  20. litauiska 1,450
  21. lettiska 1,451
  22. kroatiska 1,507
  23. finska 1,508
  24. estniska 1,727
Visa data
SpråkBitar per byte
grekiska0,721
bulgariska0,844
franska1,065
engelska1,086
spanska1,135
portugisiska1,219
tyska1,257
nederländska1,268
italienska1,277
polska1,355
danska1,364
ungerska1,407
slovakiska1,412
maltesiska1,415
rumänska1,416
svenska1,418
iriska1,422
slovenska1,431
tjeckiska1,444
litauiska1,450
lettiska1,451
kroatiska1,507
finska1,508
estniska1,727

Vad det betyder i praktiken syns bäst i ett oredigerat prov från en checkpoint vid ungefär 4,9 miljarder tokens. Början är vår, resten är Helix:

Prov på engelska, checkpoint vid 4,9 miljarder tokens, oredigerat

Början: The history of the printing press begins in the fifteenth century, when Johannes Gutenberg introduced movable type to Europe. Before that, books Modellens text: 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.

Grammatik, ordval och ämne håller; fakta gör det inte. Det är ungefär vad man kan vänta sig av 320 miljoner parametrar och 6,5 miljarder tokens: en flytande modell som hittar på.

Vad som händer härnäst

Förträningen är klar om några timmar. Därefter följer en fas med lång kontext med böcker från Project Gutenberg och EU-rättstexter från EUR-Lex, finjustering för samtal och verktygsanvändning samt en liten utkastmodell som snabbar upp genereringen.

Tillbaka till alla inlägg

Nästa steg

Vad ska skapas härnäst?

Berätta om ditt spel, din app, din webbplats eller ditt AI-projekt. Ett kort meddelande räcker för att komma igång.