Предобучение языковой модели с нуля: стек rust-bpe, PyTorch Lightning, Trackio | AiManual
AiManual Logo Ai / Manual.
08 Фев 2026 Инструмент

Собери свою LM на коленках: rust-bpe, PyTorch Lightning и Trackio

Полный стек для предобучения маленькой языковой модели с нуля в 2026: rust-bpe токенизатор, PyTorch Lightning для обучения, Trackio для мониторинга.

Зачем собирать модель с нуля, если есть готовые?

Потому что иногда нужно не просто запустить готовое, а понять, как это работает изнутри. В 2026 году предобучение маленькой языковой модели с нуля — не про практическую пользу (хотя и ее тоже), а про образовательный эффект. Это как собрать двигатель ВАЗ-2106: современные электромобили быстрее и комфортнее, но после разборки-сборки карбюратора начинаешь понимать принципы работы ДВС на уровне интуиции.

Мой стек для такого образовательного треша выглядит так: rust-bpe для токенизации, PyTorch Lightning для обучения и Trackio для мониторинга. Никакого Hugging Face transformers на этапе предобучения — только голые тензоры и боль.

На 8 февраля 2026 года PyTorch Lightning 2.4 поддерживает нативные интеграции с новыми типами ускорителей, включая экспериментальную поддержку Groq LPU. Rust-bpe обновлен до версии 0.8 с улучшенной многопоточностью.

rust-bpe: когда Python-токенизаторы плачут кровью

Первая проблема при предобучении — токенизация. Стандартный подход: взять tokenizers от Hugging Face и молиться. Но когда обрабатываешь гигабайты текста, Python-реализация BPE начинает тормозить так, что кажется, будто время течет вспять.

Rust-bpe решает это радикально: это нативная Rust-библиотека для обучения и применения Byte Pair Encoding. Скорость? В 5-8 раз выше, чем у tokenizers на тех же данных. Память? Экономит до 40% по сравнению с Python-аналогами. И главное — она выдает чистые файлы с токенами и словарем, которые можно загрузить куда угодно.

Как выглядит работа с rust-bpe в 2026

# Установка (актуально на 08.02.2026)
cargo install rust-bpe-cli

# Обучение токенизатора на TinyStories
rust-bpe train \
  --input-path ./tinystories.txt \
  --vocab-size 50257 \
  --output-dir ./tokenizer \
  --threads 16 \
  --new-format-2025  # Флаг, появившийся в версии 0.7

Ключевое отличие от старых версий — флаг --new-format-2025, который включает оптимизации для работы с современными моделями размером от 1M до 100M параметров. Без него rust-bpe все равно быстрый, но с ним — просто реактивный.

Не пытайтесь использовать старые форматы словарей из 2023-2024 годов. В rust-bpe 0.8 изменилась внутренняя структура хранения специальных токенов, что ломает обратную совместимость. Если у вас есть старые чекпойнты — конвертируйте их через утилиту convert-legacy.

PyTorch Lightning: когда надоело писать train loops

Вторая часть стека — фреймворк, который превращает хаос обучения в структурированный процесс. PyTorch Lightning 2.4 (актуальная версия на февраль 2026) — это уже не просто обертка над PyTorch, а полноценная экосистема с собственной философией.

Что изменилось за последний год? Lightning теперь нативно поддерживает:

  • Автоматическое определение оптимального размера батча (adaptive batch sizing)
  • Градиентный checkpointing для моделей от 100M параметров
  • Интеграцию с Trackio через коллбэки (об этом ниже)
  • Поддержку новых типов precision: bfloat16 на CPU, float8 на совместимых GPU

Архитектура nano-GPT по-современному

Вместо того чтобы копировать устаревший код из 2023, я использую архитектуру, которая учитывает lessons learned за последние три года:

# Фрагмент LightningModule для nano-GPT (актуальный синтаксис 2026)
class NanoGPT(LightningModule):
    def __init__(self, vocab_size, n_embd, n_head, n_layer):
        super().__init__()
        
        # Используем новые слои из PyTorch 2.5
        self.token_embedding = nn.Embedding(vocab_size, n_embd)
        self.position_embedding = nn.Embedding(1024, n_embd)
        
        # Transformer блоки с post-norm (более стабильное обучение)
        self.blocks = nn.ModuleList([
            TransformerBlock(n_embd, n_head, dropout=0.1)
            for _ in range(n_layer)
        ])
        
        # LayerNorm в конце, а не в начале каждого блока
        self.ln_f = nn.LayerNorm(n_embd)
        self.lm_head = nn.Linear(n_embd, vocab_size, bias=False)
        
        # Новое в 2026: автоматическая инициализация весов
        self.apply(self._init_weights)
        
    def _init_weights(self, module):
        # Улучшенная инициализация для маленьких моделей
        if isinstance(module, nn.Linear):
            torch.nn.init.normal_(module.weight, mean=0.0, std=0.02)
            if module.bias is not None:
                torch.nn.init.zeros_(module.bias)
        elif isinstance(module, nn.Embedding):
            torch.nn.init.normal_(module.weight, mean=0.0, std=0.02)

Ключевое отличие от старых реализаций — post-norm вместо pre-norm. Для маленьких моделей это работает стабильнее, особенно когда обучаешь с нуля на ограниченных данных.

Trackio: смотреть на графики вместо чтения логов

Третья часть стека — мониторинг. В 2026 году уже недостаточно просто смотреть на loss в консоли. Trackio — относительно новый инструмент (первый стабильный релиз в 2025), который делает для ML-экспериментов то же, что Grafana для инфраструктуры.

Чем Trackio лучше старых решений вроде Weights & Biases или TensorBoard?

Инструмент Плюсы в 2026 Минусы для предобучения
Trackio Локальный запуск, низкое потребление RAM, интеграция с Lightning Меньше готовых визуализаций
Weights & Biases Облако, коллаборация, много фич Требует интернет, платный для серьезных проектов
TensorBoard Бесплатный, проверенный временем Устаревший UI, тормозит на длинных экспериментах

Trackio интегрируется с PyTorch Lightning через коллбэк:

from trackio import TrackIOCallback
from pytorch_lightning import Trainer

# Инициализация Trackio (новый API 2026)
trackio_callback = TrackIOCallback(
    project_name="nano-gpt-pretrain",
    config=config,  # Конфиг модели
    log_gradients=True,  # Теперь работает без тормозов
    log_weights_freq=1000,  # Частота логирования весов
)

trainer = Trainer(
    max_epochs=10,
    callbacks=[trackio_callback],
    accelerator="cuda",
    devices=1,
    # Новый параметр в Lightning 2.4
    enable_progress_bar=True,
)

Самое крутое в Trackio — возможность ставить алерты. Например, "если loss не уменьшился за последние 500 шагов — остановить обучение и отправить уведомление". Для предобучения, которое может идти сутками, это спасает от пустой траты ресурсов.

Собираем все вместе: от текста до работающей модели

1 Подготовка данных

Берем TinyStories — датасет с простыми детскими историями, идеальный для обучения маленьких моделей. В 2026 году доступна версия TinyStories-33M с 33 миллионами токенов (против 10M в оригинале).

# Скачиваем и токенизируем
wget https://huggingface.co/datasets/roneneldan/TinyStories/resolve/main/TinyStories-33M.txt
rust-bpe train --input-path TinyStories-33M.txt --vocab-size 50257 --output-dir ./tokenizer

2 Настройка обучения

Конфигурация для модели на ~10M параметров (достаточно, чтобы генерировать связные истории, но мало, чтобы требовать суперкомпьютер):

config = {
    "vocab_size": 50257,
    "n_embd": 512,        # Размер эмбеддингов
    "n_head": 8,          # 8 голов внимания
    "n_layer": 6,         # 6 трансформерных блоков
    "block_size": 256,    # Контекстное окно
    "batch_size": 64,     # На RTX 4090 в 2026 — можно и больше
    "learning_rate": 6e-4,
    "weight_decay": 0.1,
    "betas": (0.9, 0.95),
    "grad_norm_clip": 1.0,
}

3 Запуск и мониторинг

Запускаем обучение и открываем Trackio dashboard:

# Запуск обучения
python train_nanogpt.py --config config.yaml

# В другом терминале — запуск Trackio UI
trackio serve --port 8080 --experiment-dir ./experiments

Через 12-24 часа на RTX 4090 получаем модель с perplexity около 15-20 на валидации. Это не state-of-the-art, но для образовательного проекта — более чем достаточно.

Что можно сделать с этой моделью дальше?

Обученная модель — не конечная цель, а отправная точка. Дальше можно:

  1. Залить на Hugging Face как community model. В 2026 году HF Hub поддерживает модели от 1M параметров, а не только гигантов.
  2. Дообучить на специфичных данных — например, на технической документации или кодексах законов. Для этого пригодится техника из статьи про тонкую настройку LLM.
  3. Поэкспериментировать с архитектурой — добавить MoE-слои как в GigaChat 3 Lightning, но в миниатюре.
  4. Сжать модель — применить квантование Q4, чтобы запускать на слабом железе. Методы из статьи про Unsloth + Q4 квантование работают и для 10M моделей.
💡
Если хочется пойти еще дальше в оптимизации, посмотрите на cuda-nn — фреймворк для запуска моделей на Rust и CUDA без PyTorch. Для маленьких моделей это overkill, но для понимания низкоуровневых оптимизаций — бесценно.

Кому подойдет этот стек в 2026?

Не всем. Если нужно быстро получить работающую модель для продакшена — берите готовые решения вроде Qwen3-14B или DeepSeek и дообучайте. Но если:

  • Хотите понять, как работают LLM на уровне архитектуры
  • Планируете эксперименты с новыми типами слоев или алгоритмами обучения
  • Готовы потратить время на отладку и поиск оптимальных гиперпараметров
  • Любите контролировать каждый аспект процесса

— тогда rust-bpe + PyTorch Lightning + Trackio дадут то, что не дадут высокоуровневые библиотеки: глубокое понимание и полный контроль.

Самое парадоксальное: после того как соберешь свою модель с нуля, начинаешь иначе смотреть на большие LLM. Понимаешь, что GPT-5 или Claude 4 — это не магия, а просто много слоев, много данных и много вычислений. И это понимание стоит потраченного времени.

P.S. Если решите повторить — не забудьте про аугментацию данных. TinyStories хорош для начала, но настоящие модели обучают на терабайтах текста. Хотя для первого раза хватит и детских рассказов.