Дообучение тернарной модели на 8 миллиардов параметров: эксперимент с Bonsai на собственном железе
Энтузиаст попытался дообучить тернарную модель Bonsai 8B (веса только -1/0/+1, ~2 ГБ памяти) на задачах кодинга. Классические методы калибровки квантизации здесь не работают, требуется quantization-aware training. Главный вывод: низкий loss не гарантирует результата — модель училась имитировать стиль логов, а не решать задачи, пока автор не переключился на проверенные решения вместо сырых записей сессий.
Это первый публичный опыт дообучения суб-2-битной модели на специализированную задачу. Показывает, что крошечные модели можно адаптировать, но требует переосмысления привычных метрик и данных — урок для всех, кто планирует работать с экстремально сжатыми моделями.
Что такое Bonsai и зачем это нужно
PrismML выпустила семейство тернарных моделей Bonsai: каждый вес принимает только одно из трёх значений (-1, 0, +1), плюс общий fp16-масштаб на группу из 128 весов. В итоге модель на 8 миллиардов параметров занимает ~2 ГБ памяти — истинные ~1.7 бита на вес, в отличие от «2-битных» GGUF-квантизаций, которые на деле ближе к 2.8 битам.
Ключевое отличие от BitNet: Bonsai не тренируют с нуля, а конвертируют готовую модель (в данном случае Qwen3-8B) в тернарную форму проприетарным методом. Это позволяет сохранить качество исходной модели, но добавляет новую проблему: как такую модель дообучать?
Почему классическая калибровка не работает
Методы вроде imatrix, AWQ и GPTQ существуют, чтобы минимизировать ошибку округления при квантизации — разрыв между полноразмерной моделью и её сжатой версией. Но у Bonsai такого разрыва нет: чекпоинт уже точно равен scale * {-1,0,+1}, так что повторная квантизация — это lossless re-encode, и калибровать нечего.
Quantization-aware training на Metal
Автор воспроизвел стандартный QAT с straight-through estimator:
- Загружается fp16-чекпоинт (тернарные значения в «толстой» обёртке)
- Forward pass: веса терниризуются на лету по группам по 128 штук
- Backward pass: градиенты проходят через straight-through estimator к fp16-латентам
- Латенты дрейфуют, веса меняют знак при пересечении порога
- Результат упаковывается обратно в 2-битный GGUF
Всё это работает на Metal (macOS), без CUDA, хоть и медленнее.
Главный провал: низкий loss ≠ способность решать
Задача: сделать из модели лучшего агента-кодера, оценка на SWE-rebench-v1 (10 реальных issue на Python). Результаты:
- Базовая модель: 50% patch rate, 0% pass rate
- QAT на последних 18 слоях: 40% patch rate, loss ~1.0, зациклилась (одна команда повторилась 553 раза)
- QAT на всех 36 слоях: 30% patch rate, loss 0.91 — лучший loss, худший patch rate
Модель с самым низким loss оказалась самой бесполезной: она научилась аккуратно имитировать стиль логов (короткие шаги, чистые вызовы инструментов, ранний stop), но не решать задачи. Автор тренировал на записях собственных сессий с Claude Code, OpenCode и Qwen Code, собранных инструментом LogMiner — но это были просто логи, а не проверенные решения.
Диагноз: метрика и цель не совпадали. Минимизация loss учила модель имитировать форму, а не суть.
Следующая итерация: только проверенные решения
Автор переключился на данные из другой модели (9B agentic coder), которая решает реальные GitHub issue. Теперь в датасет попадают только траектории, где скрытые тесты прошли успешно. Это учит модель не стилю лога, а структуре работающего решения.
Первый запуск — всего 12 проверенных траекторий (намеренно мало для чистоты эксперимента). Результаты автор обещает в следующей итерации.
Ключевые выводы
- Тернарные модели (~1.7 бита/вес) реально работают в ~2 ГБ памяти, но требуют специального llama.cpp fork
- Классические методы калибровации квантизации (imatrix, AWQ, GPTQ) бесполезны для нативно-тернарных моделей — там нечего калибровать
- Quantization-aware training с straight-through estimator можно делать на Metal, не только на CUDA
- Низкий training loss НЕ гарантирует практической пользы: модель может отлично имитировать стиль данных, но не выполнять задачу
- Ключ к дообучению — качество данных: логи != проверенные решения, и модель учится тому, что видит
Автор: Никита Громов · Источник: reddit.com
Это честный полевой отчёт, а не success story — и именно поэтому ценен. Автор наступил на грабли, о которых мало кто говорит вслух: модель минимизирует то, что вы ей дали, а не то, что вы имели в виду. Если датасет — логи ваших сессий с AI-кодером, модель научится выглядеть как AI-кодер, а не кодить. Loss падает, метрики растут, а толку ноль. Это не баг квантизации — это фича имитационного обучения.
Второй момент: тернарные модели — это не просто «сжали и забыли». Автор показал, что их можно дообучать через QAT, но инфраструктура сырая (нужен форк llama.cpp), а привычные калибровки не работают. Если вы думаете запустить Bonsai на старом MacBook и подкрутить под свою задачу — да, можно. Но приготовьтесь разбираться, почему ваш loss идеален, а модель бесполезна.
Инструменты из статьи
Агентный кодинг в терминале от Anthropic: сам пишет, тестирует и правит код...
Доступ из РФ →
Комментарии