исследования 2 мин

Дообучение тернарной модели на 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:

  1. Загружается fp16-чекпоинт (тернарные значения в «толстой» обёртке)
  2. Forward pass: веса терниризуются на лету по группам по 128 штук
  3. Backward pass: градиенты проходят через straight-through estimator к fp16-латентам
  4. Латенты дрейфуют, веса меняют знак при пересечении порога
  5. Результат упаковывается обратно в 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 НЕ гарантирует практической пользы: модель может отлично имитировать стиль данных, но не выполнять задачу
  • Ключ к дообучению — качество данных: логи != проверенные решения, и модель учится тому, что видит
квантизациядообучениеQATтернарные моделиагенты

Автор: Никита Громов · Источник: reddit.com

Мнение редакции

Это честный полевой отчёт, а не success story — и именно поэтому ценен. Автор наступил на грабли, о которых мало кто говорит вслух: модель минимизирует то, что вы ей дали, а не то, что вы имели в виду. Если датасет — логи ваших сессий с AI-кодером, модель научится выглядеть как AI-кодер, а не кодить. Loss падает, метрики растут, а толку ноль. Это не баг квантизации — это фича имитационного обучения.

Второй момент: тернарные модели — это не просто «сжали и забыли». Автор показал, что их можно дообучать через QAT, но инфраструктура сырая (нужен форк llama.cpp), а привычные калибровки не работают. Если вы думаете запустить Bonsai на старом MacBook и подкрутить под свою задачу — да, можно. Но приготовьтесь разбираться, почему ваш loss идеален, а модель бесполезна.

Инструменты из статьи

Агентный кодинг в терминале от Anthropic: сам пишет, тестирует и правит код...

Доступ из РФ →

Ещё по теме

Комментарии