NETBYTE
Rozpocznij projekt

Badania

Helix, część 1: trenujemy europejski model językowy

Trenujemy własny model językowy. Jest mały – 320 milionów parametrów – ale czyta we wszystkich 24 językach urzędowych Unii Europejskiej i trenuje na kartach graficznych zbudowanych do gier. Ta pierwsza część opowiada, jak do tego doszliśmy; druga pojawi się, gdy trening się skończy.

Autor: Marcus Weitschat 8 min czytania

Macierz punktów pokazująca, na co może zwracać uwagę każdy token w Helix: niebieski pas to lokalne okno, żółte punkty to własny blok, rozsiane pomarańczowe punkty to przywoływanie z dużych odległości.

Po co studiu gier własny model językowy

NETBYTE tworzy gry, aplikacje i strony internetowe. Modele językowe coraz częściej siedzą w środku takich produktów: jako postacie, które odpowiadają, jako pomoc, która rozumie pytanie, jako narzędzia, które coś robią. Większość otwartych modeli myśli najpierw po angielsku; estoński, irlandzki czy maltański są gdzieś na marginesie. Chcieliśmy sami zrozumieć cały łańcuch – dane, tokenizer, architekturę, trening – i sprawdzić, na co naprawdę idą pieniądze.

parametrów
320 mln
języki urzędowe UE
24
tokenów treningowych
6,5 mld
za wynajęte GPU
≈ 12 $

Helix zaczynał jako prototyp badawczy. Wszystko, co dalej, to decyzje, które go ukształtowały, każda poparta pomiarem – oraz błędy, które kosztowały nas najwięcej czasu.

Cztery pomysły, przetrwał jeden

Prototyp celował w cztery znane słabości dzisiejszych generatorów tekstu. Pisze blokami po 16 tokenów zamiast po jednym, może wielokrotnie przechodzić przez wspólny rdzeń warstw, przewiduje zwięzły „plan” dla każdego bloku i łączy tanią uwagę lokalną z uwagą liniową dla dużych odległości.

Pisanie blokami zadziałało od razu: mały model testowy zapisał 64 tokeny w 13 przejściach przez sieć, podczas gdy zwykły model potrzebuje jednego przejścia na token – to mniej więcej jedna piąta pracy. Pozostałe trzy pomysły oblały trudniejszy test. Zbudowaliśmy zadania, w których odpowiedź leży daleko poza lokalnym oknem, więc model musi spojrzeć wstecz przez cały tekst.

Rysunek 1 Przywoływanie z dużych odległości Odsetek poprawnych odpowiedzi w zadaniu na przywoływanie, którego wskazówka leży poza lokalnym oknem. Mały model referencyjny, ten sam budżet dla każdego wariantu.
  1. Tylko lokalne okno 23,1%
  2. + uwaga liniowa, plan i pętle 23,1%
  3. + 2 dokładne głowice globalne 49,4%
  4. Pełna uwaga (kontrola) 49,0%
Pokaż dane
WariantPoprawnie
Tylko lokalne okno23,1%
+ uwaga liniowa, plan i pętle23,1%
+ 2 dokładne głowice globalne49,4%
Pełna uwaga (kontrola)49,0%
Przypadek (25%)25,0%

Rozwiązała je tylko dokładna uwaga na całym dystansie. Uwaga liniowa, plan i pętle zostały na poziomie przypadku; optymalizator skręcił nawet pamięć liniową do okresu półtrwania krótszego niż jeden token. Dwie dokładne globalne głowice wystarczyły, by dorównać pełnej uwadze.

Dlatego ostateczny model zachowuje w każdej warstwie osiem lokalnych głowic z oknem 256 tokenów i dodaje dwie dokładne globalne głowice w co drugiej warstwie; warstwy pomiędzy mają dwie głowice bramkowanej uwagi liniowej. Plan i pętle są wyłączone. Nadal są w kodzie i mają testy, ale na prawdziwym tekście nie zarobiły na swój koszt.

Rysunek 2 Na co patrzy każda warstwa Dziesięć głowic uwagi na warstwę, dwanaście warstw. Każda warstwa ma osiem głowic lokalnych; warstwy nieparzyste dodają dwie dokładne głowice globalne, parzyste dwie głowice bramkowanej uwagi liniowej.
  • Lokalna, okno 256 tokenów
  • Dokładna uwaga globalna
  • Bramkowana uwaga liniowa
Pokaż dane
Typ głowicyWarstwyGłowice na warstwę
Lokalna, okno 256 tokenów1–128
Dokładna uwaga globalna1, 3, 5, 7, 9, 112
Bramkowana uwaga liniowa2, 4, 6, 8, 10, 122

Mierzyć, nie zakładać

Każdą sztuczkę treningową testowaliśmy na modelu z 94 milionami parametrów, z tym samym budżetem na przebieg: 29,5 miliona tokenów, ten sam seed, ta sama kolejność danych. Dwa przebiegi tej samej konfiguracji różnią się o ±0,03, więc wszystko poniżej to szum.

Rysunek 3 Co pomogło – a co było szumem Zmiana straty walidacyjnej względem bazowego AdamW. Model z 94 mln parametrów, 29,5 miliona tokenów na przebieg. Poniżej zera jest lepiej; szary pas to szum między przebiegami (±0,03).
  1. Muon + harmonogram WSD -0,587
  2. Optymalizator Muon -0,347
  3. Głębsza, węższa sieć -0,099
  4. Harmonogram WSD -0,080
  5. Rezydualne wartości -0,007
  6. z-loss +0,029
  7. Uwaga z grupowanymi zapytaniami +0,088
Pokaż dane
ZmianaΔ straty (naty)
Muon + harmonogram WSD-0,587
Optymalizator Muon-0,347
Głębsza, węższa sieć-0,099
Harmonogram WSD-0,080
Rezydualne wartości-0,007
z-loss+0,029
Uwaga z grupowanymi zapytaniami+0,088

Optymalizator Muon był jedyną dużą dźwignią i dobrze łączy się z harmonogramem współczynnika uczenia warmup-stable-decay. Przeniesienie embeddingu i warstwy wyjściowej z powrotem na AdamW, jak zalecają autorzy Muona, dało kolejne 0,12 i przyspieszyło trening o 5%. Kombinacje nie sumują się po prostu: głębsza i węższa sieć pomagała z AdamW, a szkodziła z Muonem. Dlatego każda obiecująca kombinacja dostała własny przebieg.

24 języki, 6,5 miliarda tokenów

Helix czyta teksty z sieci z FineWeb-Edu dla angielskiego i z FineWeb-2 dla pozostałych 23 języków – w przypadku większych z jego górnej dziesiątej części, filtrowanej pod kątem jakości. Kod, matematyka i niewielki syntetyczny strumień czatów uzupełniają mieszankę. Angielski dostaje jedną trzecią. Pozostałe języki są ważone według ilości dostępnego tekstu, wygładzonej tak, by irlandzki i maltański nie utonęły, a żadne źródło nie powtarza się więcej niż cztery razy – do tej granicy powtórka jest prawie tak dobra jak świeże dane.

Rysunek 4 Co czyta Helix Udział tokenów treningowych według grup źródeł. Korpus 6,5 miliarda tokenów w 34 strumieniach; kod i znaczniki obejmują Python, JavaScript, C, C++, Javę, HTML, CSS i Markdown.
  1. 23 pozostałe języki UE 51,6%
  2. Angielski 33,0%
  3. Kod i znaczniki 10,0%
  4. Matematyka 3,0%
  5. Syntetyczne czaty i narzędzia 2,4%
Pokaż dane
ŹródłoUdział
23 pozostałe języki UE51,6%
Angielski33,0%
Kod i znaczniki10,0%
Matematyka3,0%
Syntetyczne czaty i narzędzia2,4%

Strumień czatów jest ekstrakcyjny: odpowiedzi są kopiowane z prawdziwych akapitów, a wyniki narzędzi są obliczane, a nie wymyślane. Uczy formatu, nie wiedzy. Tokenizer to bajtowy BPE z 64 000 wpisów; dla każdego języka zapisywanego alfabetem łacińskim mieści w jednym tokenie od 3,3 do 4 bajtów tekstu.

Trzy błędy warte opowiedzenia

  • Model, który czytał odpowiedź. W jednej ścieżce kodu globalne głowice ignorowały maskę przyczynową i widziały przyszłe tokeny. Strata spadła z 6,85 do 1,71 w 75 krokach, a 16-godzinny przebieg okazał się bezwartościowy. Podejrzanie dobra strata to zgłoszenie błędu; teraz pilnuje tego dokładnie test regresji.
  • Znaki to nie bajty. Kompresję liczono w znakach zamiast w bajtach UTF-8. To wymyśliło „słabość” chińskiego, a grecki i bułgarski wyglądały prawie dwa razy gorzej, niż są w rzeczywistości.
  • Dokumenty rozcięte na każdej pustej linii. Enkoder dzielił dokumenty na każdej pustej linii – a puste linie są w środku niemal każdego pliku z kodem. Przepadło do 35% tekstu z kodem i matematyką. Naprawiliśmy separator i 31 października przebudowaliśmy cały korpus; zajęło to 2 godziny i 12 minut.

Z biurka na wynajętą maszynę

Pierwsze 1,66 miliarda tokenów przeszło na jednej karcie AMD Radeon RX 7800 XT. Dwie rzeczy sprawiły, że dało się z tego korzystać: flaga jądra uwagi, domyślnie wyłączona – bez niej uwaga była 12 razy wolniejsza – oraz kompilacja każdej warstwy przez torch.compile. Przy medianie 11 800 tokenów na sekundę reszta trwałaby jeszcze prawie pięć dni.

Napisaliśmy więc autopilota. Wynajmuje GPU na Vast.ai, wysyła kod, korpus i checkpoint, trenuje, co trzy godziny ściąga checkpoint do domu i zatrzymuje się, zanim skończą się środki. 2 listopada przeszedł przez trzy maszyny, których dostawcy nigdy nie uruchomili, a potem zatrzymał się na dwóch RTX 4070 Ti Super w Niemczech za 0,363 $ za godzinę. Wysyłka 15,4 GiB trwała 40 minut.

Rysunek 5 Szybkość treningu Tokeny na sekundę dla modelu 320 mln przy długości sekwencji 1024 (mediana). Lokalnie: jedna AMD Radeon RX 7800 XT. Wynajem: dwie NVIDIA RTX 4070 Ti Super.
  1. Lokalnie, przed optymalizacją 8319
  2. Lokalnie, po kompilacji 11 830
  3. Wynajem, 2 GPU 41 367
Pokaż dane
KonfiguracjaTokeny/s
Lokalnie, przed optymalizacją8319
Lokalnie, po kompilacji11 830
Wynajem, 2 GPU41 367

41 400 tokenów na sekundę to 3,5 raza więcej niż przy biurku. Wynajęta część – 4,8 miliarda tokenów w około 33 godziny – kosztuje mniej więcej 12 $.

Gdzie Helix jest dzisiaj

Rysunek 6 Dotychczasowy trening Strata w natach na token, im niżej, tym lepiej. Odłożony: tekst, na którym model nigdy nie trenuje. Trening: średnia z każdych 50 milionów tokenów; w fazie wygaszania spada szybciej, częściowo dlatego, że zmienia się mieszanka danych. Oś kończy się na planowanych 6,5 miliarda tokenów.
  • Odłożony
  • Trening

Strata (naty na token)

Przeczytane tokeny w miliardach

Pokaż dane
Przeczytane tokeny w miliardachOdłożonyTrening
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

Na dzień 3 listopada 2026 roku Helix przeczytał 5,35 z 6,5 miliarda tokenów. Od 5,2 miliarda trwa faza wygaszania: współczynnik uczenia spada, a mieszanka przesuwa się w stronę matematyki, kodu i czatów. Na odłożonym tekście ze wszystkich strumieni strata wynosi 3,12 nata na token.

Rysunek 7 Gdzie jest każdy język Bity na bajt na odłożonym tekście po 5,35 miliarda tokenów, im niżej, tym lepiej. Grecki i bułgarski wyglądają lepiej częściowo dlatego, że każda ich litera zajmuje dwa bajty.
  1. grecki 0,721
  2. bułgarski 0,844
  3. francuski 1,065
  4. angielski 1,086
  5. hiszpański 1,135
  6. portugalski 1,219
  7. niemiecki 1,257
  8. niderlandzki 1,268
  9. włoski 1,277
  10. polski 1,355
  11. duński 1,364
  12. węgierski 1,407
  13. słowacki 1,412
  14. maltański 1,415
  15. rumuński 1,416
  16. szwedzki 1,418
  17. irlandzki 1,422
  18. słoweński 1,431
  19. czeski 1,444
  20. litewski 1,450
  21. łotewski 1,451
  22. chorwacki 1,507
  23. fiński 1,508
  24. estoński 1,727
Pokaż dane
JęzykBity na bajt
grecki0,721
bułgarski0,844
francuski1,065
angielski1,086
hiszpański1,135
portugalski1,219
niemiecki1,257
niderlandzki1,268
włoski1,277
polski1,355
duński1,364
węgierski1,407
słowacki1,412
maltański1,415
rumuński1,416
szwedzki1,418
irlandzki1,422
słoweński1,431
czeski1,444
litewski1,450
łotewski1,451
chorwacki1,507
fiński1,508
estoński1,727

Co to oznacza w praktyce, najlepiej widać na nieedytowanej próbce z checkpointu przy około 4,9 miliarda tokenów. Początek jest nasz, reszta pochodzi od Helix:

Próbka po angielsku, checkpoint przy 4,9 miliarda tokenów, bez edycji

Początek tekstu: The history of the printing press begins in the fifteenth century, when Johannes Gutenberg introduced movable type to Europe. Before that, books Odpowiedź 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.

Gramatyka, dobór słów i temat się trzymają; fakty nie. Mniej więcej tego można się spodziewać po 320 milionach parametrów i 6,5 miliarda tokenów: płynnego modelu, który zmyśla.

Co dalej

Pretrening kończy się za kilka godzin. Potem przyjdą etap długiego kontekstu z książkami z Project Gutenberg i unijnymi tekstami prawnymi z EUR-Lex, dostrajanie do rozmów i korzystania z narzędzi oraz mały model szkicowy, który przyspiesza generowanie.

Wróć do wszystkich wpisów

Następny krok

Co powinno powstać jako następne?

Prosimy opowiedzieć nam o swojej grze, aplikacji, stronie internetowej lub projekcie AI. Na początek wystarczy krótka wiadomość.