NETBYTE
Начать проект

Исследования

Helix, часть 1: обучаем европейскую языковую модель

Мы обучаем собственную языковую модель. Она небольшая — 320 миллионов параметров, — но читает на всех 24 официальных языках Европейского союза и обучается на видеокартах, созданных для игр. Эта первая часть рассказывает, как мы к этому пришли; вторая выйдет, когда обучение закончится.

Автор: Marcus Weitschat 8 мин чтения

Точечная матрица того, на что может смотреть каждый токен в Helix: синяя полоса — локальное окно, жёлтые точки — собственный блок, разбросанные оранжевые точки — извлечение на больших расстояниях.

Зачем игровой студии своя языковая модель

NETBYTE делает игры, приложения и сайты. Языковые модели всё чаще живут внутри таких продуктов: персонажи, которые отвечают, помощь, которая понимает вопрос, инструменты, которые что-то делают. Большинство открытых моделей думают прежде всего по-английски; эстонский, ирландский или мальтийский остаются на обочине. Мы хотели сами разобраться во всей цепочке — данные, токенизатор, архитектура, обучение — и понять, куда на самом деле уходят деньги.

параметров
320 млн
официальных языка ЕС
24
токенов обучения
6,5 млрд
за арендованные GPU
≈ 12 $

Helix начинался как исследовательский прототип. Всё, что ниже, — решения, которые его сформировали, каждое подкреплено измерением, а также ошибки, отнявшие у нас больше всего времени.

Четыре идеи, выжила одна

Прототип бил по четырём известным слабостям современных генераторов текста. Он пишет блоками по 16 токенов, а не по одному, может несколько раз прогонять общее ядро слоёв, предсказывает компактный «план» для каждого блока и сочетает дешёвое локальное внимание с линейным вниманием для дальних расстояний.

Блочная запись заработала сразу: небольшая тестовая модель написала 64 токена за 13 проходов через сеть, тогда как обычной модели нужен один проход на токен — примерно пятая часть работы. Остальные три идеи провалили более жёсткий тест. Мы построили задачи, в которых ответ лежит далеко за пределами локального окна, так что модели приходится оглядываться на весь текст.

Рисунок 1 Извлечение на больших расстояниях Доля верных ответов в задаче на извлечение, где подсказка лежит за пределами локального окна. Небольшая эталонная модель, одинаковый бюджет для каждого варианта.
  1. Только локальное окно 23,1 %
  2. + линейное внимание, план и циклы 23,1 %
  3. + 2 точные глобальные головы 49,4 %
  4. Полное внимание (контроль) 49,0 %
Показать данные
ВариантВерно
Только локальное окно23,1 %
+ линейное внимание, план и циклы23,1 %
+ 2 точные глобальные головы49,4 %
Полное внимание (контроль)49,0 %
Случайность (25 %)25,0 %

Решило их только точное внимание на всю дистанцию. Линейное внимание, план и циклы остались на уровне случайного угадывания; оптимизатор даже свёл линейную память к периоду полураспада меньше одного токена. Двух точных глобальных голов хватило, чтобы сравняться с полным вниманием.

Поэтому финальная модель оставляет в каждом слое восемь локальных голов с окном в 256 токенов и добавляет две точные глобальные головы через слой; промежуточные слои сохраняют две головы линейного внимания с гейтом. План и циклы отключены. Они остались в коде и покрыты тестами, но на реальном тексте не окупили своей стоимости.

Рисунок 2 Куда смотрит каждый слой Десять голов внимания на слой, двенадцать слоёв. В каждом слое восемь локальных голов; нечётные слои добавляют две точные глобальные головы, чётные — две головы линейного внимания с гейтом.
  • Локальное, окно 256 токенов
  • Точное глобальное внимание
  • Линейное внимание с гейтом
Показать данные
Тип головыСлоиГолов на слой
Локальное, окно 256 токенов1–128
Точное глобальное внимание1, 3, 5, 7, 9, 112
Линейное внимание с гейтом2, 4, 6, 8, 10, 122

Измерять, а не предполагать

Каждый приём обучения мы проверяли на модели с 94 миллионами параметров с одинаковым бюджетом на запуск: 29,5 миллиона токенов, тот же seed, тот же порядок данных. Два запуска одной конфигурации расходятся на ±0,03, так что всё меньшее — шум.

Рисунок 3 Что помогло — а что было шумом Изменение валидационного loss относительно базовой линии с AdamW. Модель на 94 млн параметров, 29,5 миллиона токенов на запуск. Ниже нуля — лучше; серая полоса — шум между запусками (±0,03).
  1. Muon + расписание WSD -0,587
  2. Оптимизатор Muon -0,347
  3. Более глубокая и узкая сеть -0,099
  4. Расписание WSD -0,080
  5. Остаточная связь значений -0,007
  6. z-loss +0,029
  7. Внимание с группированными запросами +0,088
Показать данные
ИзменениеΔ loss (наты)
Muon + расписание WSD-0,587
Оптимизатор Muon-0,347
Более глубокая и узкая сеть-0,099
Расписание WSD-0,080
Остаточная связь значений-0,007
z-loss+0,029
Внимание с группированными запросами+0,088

Оптимизатор Muon оказался единственным крупным рычагом, и он хорошо сочетается с расписанием скорости обучения warmup-stable-decay. Возврат эмбеддинга и выходного слоя к AdamW, как советуют авторы Muon, дал ещё 0,12 и ускорил обучение на 5 %. Комбинации не складываются просто так: более глубокая и узкая сеть помогала с AdamW и вредила с Muon. Поэтому каждая многообещающая комбинация получила собственный запуск.

24 языка, 6,5 миллиарда токенов

Helix читает веб-тексты из FineWeb-Edu для английского и из FineWeb-2 для остальных 23 языков — для крупных из его верхней десятой части, отобранной по качеству. Код, математика и небольшой синтетический поток чатов дополняют смесь. Английскому достаётся треть. Остальные языки взвешены по объёму доступного текста со сглаживанием, чтобы ирландский и мальтийский не утонули, и ни один источник не повторяется больше четырёх раз: до этой границы повтор почти так же хорош, как свежие данные.

Рисунок 4 Что читает Helix Доля токенов обучения по группам источников. Корпус из 6,5 миллиарда токенов в 34 потоках; код и разметка включают Python, JavaScript, C, C++, Java, HTML, CSS и Markdown.
  1. Ещё 23 языка ЕС 51,6 %
  2. Английский 33,0 %
  3. Код и разметка 10,0 %
  4. Математика 3,0 %
  5. Синтетические чаты и инструменты 2,4 %
Показать данные
ИсточникДоля
Ещё 23 языка ЕС51,6 %
Английский33,0 %
Код и разметка10,0 %
Математика3,0 %
Синтетические чаты и инструменты2,4 %

Поток чатов экстрактивный: ответы берутся из реальных абзацев, а результаты инструментов вычисляются, а не выдумываются. Он учит формату, а не знаниям. Токенизатор — байтовый BPE на 64 000 записей; для каждого языка на латинице он упаковывает в один токен от 3,3 до 4 байт текста.

Три бага, о которых стоит рассказать

  • Модель, которая подсматривала ответ. В одной ветке кода глобальные головы игнорировали каузальную маску и видели будущие токены. Loss упал с 6,85 до 1,71 за 75 шагов, и 16-часовой запуск оказался бесполезен. Подозрительно хороший loss — это баг-репорт; теперь именно этот случай стережёт регрессионный тест.
  • Символы — не байты. Сжатие считалось в символах, а не в байтах UTF-8. Это придумало «слабость» в китайском и заставило греческий и болгарский выглядеть почти вдвое хуже, чем на самом деле.
  • Документы, разорванные на каждой пустой строке. Кодировщик делил документы на каждой пустой строке, а пустые строки стоят посреди почти любого файла с кодом. Пропало до 35 % текста кода и математики. Мы исправили разделитель и 31 октября пересобрали весь корпус; это заняло 2 часа 12 минут.

Со стола на арендованную машину

Первые 1,66 миллиарда токенов прошли на одной AMD Radeon RX 7800 XT. Сделать это пригодным помогли две вещи: флаг ядра внимания, по умолчанию выключенный, — без него внимание работало в 12 раз медленнее, — и компиляция каждого слоя через torch.compile. При медиане 11 800 токенов в секунду остаток занял бы ещё почти пять дней.

Поэтому мы написали автопилот. Он арендует GPU на Vast.ai, загружает код, корпус и чекпойнт, обучает, каждые три часа забирает чекпойнт домой и останавливается до того, как кончится баланс. 2 ноября он перебрал три машины, которые хосты так и не запустили, а затем остановился на двух RTX 4070 Ti Super в Германии за 0,363 $ в час. Загрузка 15,4 ГиБ заняла 40 минут.

Рисунок 5 Скорость обучения Токенов в секунду для модели на 320 млн параметров при длине последовательности 1024 (медиана). Локально: одна AMD Radeon RX 7800 XT. В аренде: две NVIDIA RTX 4070 Ti Super.
  1. Локально, до оптимизации 8 319
  2. Локально, с компиляцией 11 830
  3. Аренда, 2 GPU 41 367
Показать данные
КонфигурацияТокенов/с
Локально, до оптимизации8 319
Локально, с компиляцией11 830
Аренда, 2 GPU41 367

41 400 токенов в секунду — это в 3,5 раза быстрее, чем на столе. Арендованная часть — 4,8 миллиарда токенов примерно за 33 часа — стоит около 12 $.

Где Helix сейчас

Рисунок 6 Обучение на данный момент Loss в натах на токен, чем ниже, тем лучше. Отложенный: текст, на котором модель никогда не обучается. Обучение: среднее за каждые 50 миллионов токенов; в фазе охлаждения он падает быстрее, отчасти потому, что меняется смесь данных. Ось заканчивается на запланированных 6,5 миллиарда токенов.
  • Отложенный
  • Обучение

Loss (натов на токен)

Прочитано токенов, млрд

Показать данные
Прочитано токенов, млрдОтложенныйОбучение
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

На 3 ноября 2026 года Helix прочитал 5,35 из своих 6,5 миллиарда токенов. С отметки 5,2 миллиарда идёт фаза охлаждения: скорость обучения снижается, а смесь смещается к математике, коду и чатам. На отложенном тексте из всех потоков loss составляет 3,12 ната на токен.

Рисунок 7 Где находится каждый язык Бит на байт на отложенном тексте после 5,35 миллиарда токенов, чем ниже, тем лучше. Греческий и болгарский выглядят лучше отчасти потому, что каждая их буква занимает два байта.
  1. греческий 0,721
  2. болгарский 0,844
  3. французский 1,065
  4. английский 1,086
  5. испанский 1,135
  6. португальский 1,219
  7. немецкий 1,257
  8. нидерландский 1,268
  9. итальянский 1,277
  10. польский 1,355
  11. датский 1,364
  12. венгерский 1,407
  13. словацкий 1,412
  14. мальтийский 1,415
  15. румынский 1,416
  16. шведский 1,418
  17. ирландский 1,422
  18. словенский 1,431
  19. чешский 1,444
  20. литовский 1,450
  21. латышский 1,451
  22. хорватский 1,507
  23. финский 1,508
  24. эстонский 1,727
Показать данные
ЯзыкБит на байт
греческий0,721
болгарский0,844
французский1,065
английский1,086
испанский1,135
португальский1,219
немецкий1,257
нидерландский1,268
итальянский1,277
польский1,355
датский1,364
венгерский1,407
словацкий1,412
мальтийский1,415
румынский1,416
шведский1,418
ирландский1,422
словенский1,431
чешский1,444
литовский1,450
латышский1,451
хорватский1,507
финский1,508
эстонский1,727

Что это значит на практике, лучше всего видно по неотредактированному образцу из чекпойнта примерно на 4,9 миллиарда токенов. Начало наше, остальное — Helix:

Образец на английском, чекпойнт на 4,9 миллиарда токенов, без правок

Начало текста: The history of the printing press begins in the fifteenth century, when Johannes Gutenberg introduced movable type to Europe. Before that, books Ответ модели: 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.

Грамматика, выбор слов и тема держатся; факты — нет. Примерно этого и стоит ждать от 320 миллионов параметров и 6,5 миллиарда токенов: беглая модель, которая выдумывает.

Что дальше

Предобучение закончится через несколько часов. Затем последуют этап длинного контекста с книгами из Project Gutenberg и правовыми текстами ЕС из EUR-Lex, дообучение для диалога и работы с инструментами и небольшая черновая модель, которая ускоряет генерацию.

Ко всем статьям

Следующий шаг

Что должно появиться дальше?

Расскажите нам о своей игре, приложении, сайте или ИИ-проекте. Для начала достаточно короткого сообщения.