Перейти к содержанию
Новое AiManual теперь в MAX Подписаться
Публикация AiManual

Практическое руководство по дообучению тернарных моделей Prism-ML Bonsai с ternary_QAT

Пошаговое руководство по fine-tuning тернарных моделей Bonsai с использованием ternary_QAT. Разбираем высокий learning rate, архитектурные ограничения и даём ко

Коротко

Что будет в материале

  1. 01

    Что такое ternary_QAT и зачем он нужен для Bonsai

  2. 02

    Архитектурные ограничения тернарного QAT и как их обойти

  3. 03

    Пошаговое руководство: дообучаем Bonsai на своих данных

  4. 04

    Оценка результатов: бенчмарки и сравнение с аналогами

Релиз инструментария ternary_QAT от ElectroGlyph закрывает критический пробел в экосистеме тернарных моделей - возможность тонкой настройки (fine-tuning) на собственных данных. Ключевая инженерная находка проекта - использование аномально высокой скорости обучения (learning rate), которая компенсирует ограниченную ёмкость весов, закодированных значениями -1, 0 и 1. Этот материал содержит полный разбор метода, архитектурные обоснования и пошаговую инструкцию для воспроизведения результатов.

Тернарные модели семейства Bonsai от Prism-ML, включая версии на 8B и 27B параметров, уже доказали эффективность на CPU-инференсе. Мы детально разбирали их производительность в материале о 1-битных моделях в 2026 году и сравнивали с аналогами в анализе GGUF-квантизаций Bonsai-27B. Дообучение выводит их на новый уровень: адаптация к домену, стилю или специфичной задаче без потери главного преимущества - экстремально низкого потребления памяти.

Что такое ternary_QAT и зачем он нужен для Bonsai

ternary_QAT - это открытый инструментарий для Quantization-Aware Training (QAT), разработанный специально под архитектуру тернарных моделей Prism-ML Bonsai. В отличие от стандартного QAT, где веса имитируют квантование во время обучения, но остаются в float-представлении, ternary_QAT работает напрямую с ограниченным пространством состояний {-1, 0, 1}.

Проблема, которую решает инструментарий: тернарные сети после первичного обучения имеют фиксированную выразительность. Каждый вес занимает менее 2 бит, и информационная ёмкость слоя радикально уступает FP16-аналогам. Прямое дообучение стандартными методами не даёт результата - градиенты не могут эффективно обновлять дискретные значения. ternary_QAT обходит это ограничение через агрессивную стратегию оптимизации с learning rate, который на порядок выше привычных значений для полносвязных моделей.

Практическая ценность для инженера: вы берёте предобученную модель Bonsai, которая уже работает на CPU с 5-10 ГБ оперативной памяти, и за несколько эпох адаптируете её под конкретный датасет - документацию, диалоги, технические спецификации. Результат - специализированная модель, сохраняющая все преимущества тернарного инференса.

Архитектурные ограничения тернарного QAT и как их обойти

Почему тернарные веса - это вызов для дообучения

Веса моделей Bonsai квантованы в три состояния: -1, 0 и 1. При прямом проходе (forward pass) вычисления сводятся к сложению и вычитанию активаций, что даёт колоссальный прирост скорости на CPU. При обратном проходе (backward pass) возникает фундаментальная трудность: функция квантования имеет нулевой градиент почти везде, кроме точек перехода.

Стандартный подход - Straight-Through Estimator (STE), который пропускает градиент через операцию квантования без изменений. Для тернарных сетей STE работает хуже, чем для INT8-квантования. Причина в том, что расстояние между состояниями велико относительно диапазона весов, и градиент, вычисленный для float-представления, часто указывает направление, которое не приводит к изменению тернарного значения. Модель застревает в локальном оптимуме, а loss перестаёт снижаться уже после нескольких десятков шагов.

Роль высокой скорости обучения в ternary_QAT

Разработчики ElectroGlyph обнаружили, что увеличение learning rate до значений 5e-3 - 1e-2 (против типичных 5e-5 - 5e-4 для FP-моделей) кардинально меняет картину. Высокий шаг обновления позволяет весам быстрее пересекать пороговые значения, при которых тернарное состояние действительно изменяется.

Механизм работает так: float-тень веса (shadow weight), которая накапливает градиенты, получает достаточно большое смещение за один шаг, чтобы перейти из зоны притяжения одного тернарного состояния в зону другого. При малом learning rate тень колеблется внутри одной зоны, и реальный тернарный вес никогда не меняется. При большом - тень агрессивно дрейфует, и модель эффективно исследует дискретное пространство конфигураций.

Конкретные значения из репозитория ternary_QAT: для датасетов размером 1-10 тысяч примеров рекомендуется learning rate 8e-3 с линейным затуханием до 1e-4 к концу обучения. Для датасетов свыше 50 тысяч примеров стартовый learning rate снижают до 3e-3, чтобы избежать нестабильности на ранних этапах.

Пошаговое руководство: дообучаем Bonsai на своих данных

Подготовка окружения и данных

Для работы ternary_QAT требуется Python 3.10+ и минимум 16 ГБ оперативной памяти. GPU не обязателен - весь пайплайн обучения заточен под CPU, хотя наличие CUDA-совместимой карты ускорит процесс в 3-5 раз.

Клонируйте репозиторий и установите зависимости:

git clone https://github.com/ElectroGlyph/ternary_QAT
cd ternary_QAT
pip install -r requirements.txt

Данные должны быть подготовлены в формате JSONL. Каждая строка - объект с полями "instruction" и "output":

{"instruction": "Объясни принцип работы тернарного квантования", "output": "Тернарное квантование представляет веса значениями -1, 0 и 1..."}
{"instruction": "Напиши функцию сложения на Python", "output": "def add(a, b):\n    return a + b"}

Для задач классификации или регрессии поддерживается CSV-формат с колонками "text" и "label". Загрузчик автоматически конвертирует данные в промпты, совместимые с форматом Bonsai.

Конфигурация обучения: на что обратить внимание

Центральный параметр - learning rate. Файл конфигурации config.yaml содержит следующие ключевые секции:

training:
  learning_rate: 8.0e-3  # стартовый LR
  lr_schedule: linear_decay
  min_lr: 1.0e-4
  warmup_steps: 100
  batch_size: 4
  epochs: 3
  max_seq_length: 2048

model:
  base_model: Prism-ML/Bonsai-27B
  quantization: ternary
  use_flash_attention: true

Batch size 4 - максимум для 32 ГБ RAM при длине контекста 2048 токенов. Если памяти меньше 32 ГБ, снижайте batch size до 2 или используйте gradient accumulation с параметром gradient_accumulation_steps: 2. Количество эпох редко имеет смысл поднимать выше 3 - тернарные модели быстро насыщаются из-за ограниченной ёмкости. Дальнейшее обучение ведёт к переобучению и деградации на валидации.

Запуск и мониторинг обучения

Команда запуска:

python train.py --config config.yaml --data ./my_dataset.jsonl --output ./finetuned_bonsai

Логи выводятся каждые 50 шагов и содержат метрики:

Step 100/1500 | Loss: 2.341 | Acc: 0.67 | LR: 7.5e-3 | Tokens/s: 1240
Step 150/1500 | Loss: 2.102 | Acc: 0.71 | LR: 7.2e-3 | Tokens/s: 1238

Ключевой индикатор успешного обучения - снижение loss в первые 200-300 шагов. Если loss стоит на месте или растёт, снижайте learning rate вдвое. Accuracy на уровне 0.65-0.75 для генеративных задач считается хорошим результатом для тернарной модели; FP16-аналоги на тех же данных показывают 0.80-0.85, но требуют в 8-10 раз больше памяти на инференсе.

Ранняя остановка настраивается через параметр early_stopping_patience: 3 - обучение прекратится, если validation loss не улучшается 3 эпохи подряд. Сохраняется лучший чекпоинт по метрике validation loss.

Оценка результатов: бенчмарки и сравнение с аналогами

Методика тестирования и конфигурация стенда

Все замеры проводились на двух конфигурациях: Intel Xeon Gold 6430 (32 ядра, 128 ГБ RAM) и AMD EPYC 8534P (64 ядра, 256 ГБ RAM). Версия Python 3.11, PyTorch 2.4.0. Измерялись: скорость генерации (токенов в секунду), задержка первого токена (TTFT), пиковое потребление RAM.

Датасет для оценки - комбинация из 500 инструкций, покрывающих генерацию кода, summarization, ответы на вопросы и логические рассуждения. Качество оценивалось по совпадению с эталонным ответом (exact match) и по BLEU-4.

Сравнение с bitnet.cpp: откуда прирост производительности

bitnet.cpp долгое время был основным решением для CPU-инференса бинарных и тернарных сетей. ternary_QAT даёт прирост скорости генерации на 15-22% на том же оборудовании за счёт использования VBMI-инструкций (Vector Bit Manipulation Instructions), появившихся в процессорах Intel Sapphire Rapids и AMD Genoa.

Решение Токенов/с (Xeon) Токенов/с (EPYC) RAM, ГБ BLEU-4
Bonsai-27B + ternary_QAT 8.7 12.3 6.1 0.41
Bonsai-27B + bitnet.cpp 7.1 10.5 6.8 0.39
Qwen3.7-27B FP16 0.8 1.1 54.0 0.58

Прирост скорости обусловлен не только VBMI. ternary_QAT оптимизирует размещение весов в кэш-линиях процессора: веса группируются так, чтобы за одну инструкцию обрабатывать 16 тернарных значений, упакованных в 32-битное слово. bitnet.cpp использует более старую схему упаковки с обработкой 8 значений за инструкцию.

Качество на downstream-задачах остаётся сопоставимым - разница в BLEU-4 в пределах 0.02 пункта. Это ожидаемо: оба решения работают с одной архитектурой и одним представлением весов, ternary_QAT лишь эффективнее использует доступное железо.

Для контекста: мы уже тестировали Bonsai-27B в экстремальных условиях 8GB VRAM и сравнивали с аналогами - результаты в материале о тесте экстремального сжатия. Дообученная версия показывает прирост на 3-5 процентных пунктов в доменных задачах при том же потреблении памяти.

Ограничения, статус проекта и как внести вклад

ternary_QAT находится в стадии активной разработки. Текущая версия 0.3.1 поддерживает модели Bonsai-8B и Bonsai-27B. Поддержка Bonsai-70B заявлена в дорожной карте на Q4 2026. Лицензия - Apache 2.0, что разрешает коммерческое использование без ограничений.

Известные ограничения:

  • Не поддерживается distributed training - обучение только на одной машине
  • Отсутствует интеграция с Hugging Face Trainer API - используется собственный тренировочный цикл
  • Максимальная длина контекста при обучении - 4096 токенов (инференс поддерживает до 120 тысяч через KVarN-квантизацию KV-кэша)
  • Не работает с моделями, имеющими mixture-of-experts (MoE) архитектуру

ElectroGlyph призывает сообщество к тестированию на разнообразных датасетах и репорту багов через GitHub Issues. Особый интерес для разработчиков представляют сценарии с нестандартными языками (не английский и не русский), мультимодальные задачи и агентные сценарии - эти направления пока не покрыты тестами.

Ближайшие планы: поддержка LoRA-адаптеров для тернарных моделей (позволит дообучать без изменения базовых весов), экспорт в GGUF с сохранением fine-tuning-адаптаций, интеграция с llama.cpp для упрощения деплоя.

Подписаться на канал