Обучение прямо в тритах. Часть третья: TERMAP → TERNIC → TERLUT

В первых двух частях я проверял, можно ли обучать модель прямо в компактной тритовой записи. Теперь замкнулась вся цепочка: TERMAP сжимает → TERNIC обучает → TERLUT исполняет. Она проверена и на маленьких моделях, и на снимке C5 с 1,47 миллиарда параметров.

Три имени — три задачи

TERMAP, «Термап» — TERnary Mixed-precision Allocation and Packing, распределение точности и упаковка в триты. Он выбирает, каким матрицам сколько точности оставить, и записывает веса тритами: −1, 0 и +1. Несколько тритов — это цифры одного веса, а не дополнительные связи нейросети.

TERNIC, «Терник» — Ternary Error-Residual Normalization with Integer Carry, тритовое обучение с нормализацией поправок и целочисленным накоплением. Маленькие поправки не пропадают при округлении: счётчик накапливает их, пока не получится шаг по тритовой сетке. Полная копия весов в обычных числах и полный массив их градиентов не нужны. Промежуточные вычисления при этом остаются численными, а масштабы групп весов во время обучения фиксированы.

TERLUT, «Терлут» — TERnary Look-Up Tables, тритовые таблицы поиска. Он вычисляет результат по упакованным весам с помощью таблиц сумм активаций. Обученную модель можно сохранить, загрузить отдельно и исполнять без состояния оптимизатора.

На маленькой модели: теперь лучше Adam в нашем тесте

Во второй части TERNIC ещё немного уступал Adam по ошибке предсказания. Следующее улучшение — заранее дать весам больший диапазон движения: при случайной инициализации расширить диапазон вдвое, затем зафиксировать его. Число тритов и размер состояния обучения не выросли.

Средняя ошибка на трёх стартах, бит на байтовый токен; меньше — лучше:

Текст TERNIC из прежних опытов TERNIC с новым стартовым диапазоном Adam с тем же новым стартом
Шекспир 2,859 2,718 2,815
«Алиса» 2,364 2,163 2,292

TERNIC выиграл у Adam и по ошибке, и по доле правильно предсказанных токенов во всех шести парах «текст — старт». Начальные веса внутри каждой новой пары, данные и число шагов совпадали. Это результат нашего небольшого протокола: проверочные тексты уже использовались при разработке, а Adam отдельно не перенастраивался.

На C5: от упаковки до обученного файла

Следующая проверка — уже готовый снимок большой модели. TERMAP упаковал его, TERNIC изменил веса, а TERLUT прочитал сохранённый результат. Рецепт случайного старта маленькой модели здесь не применялся.

Хранение весов C5 Объём
Исходные FP32-веса — 32-битные числа 5,876 ГБ
Упакованные веса в памяти TERLUT 0,795 ГБ
Сокращение в 7,4 раза

Это объём весов, а не вся память обучения. В проверке продолжения обучения пик выделенной памяти составлял около 6,51 ГиБ.

С первого раза продолжение обучения не получилось: шаг от маленькой модели оказался слишком большим, и C5 начал выдавать переводы строк. После уменьшения шага и его дальнейшего снижения прошли 256 обновлений без такого схлопывания. Веса действительно изменились, а масштабы остались прежними.

Ошибка C5, бит на токен словаря До TERNIC После
Учебные окна 3,991 2,585
Контрольная проза 3,943 3,930
Дополнительная проза 4,385 4,377

Здесь восемь многократно повторяемых учебных окон и два небольших набора прозы. Ошибка снизилась, хотя доля точных предсказаний на прозе немного уменьшилась — на 0,39 процентного пункта. Это проверка короткого продолжения обучения, не доказательство общего превосходства большой модели.

Сохранение и восстановление прошли проверку повтором следующего обновления. После загрузки в TERLUT триты и масштабы сохранились точно, а все четыре проверяемые генерации совпали с обычным исполнителем тех же весов.

TERLUT исполняет быстрее

Отдельно измерил скорость на A10, на исходном упакованном снимке до обучения. Оба исполнителя использовали CUDA Graph — механизм запуска заранее записанной последовательности вычислений на GPU.

Режим Обычный исполнитель тритов TERLUT Ускорение
Один запрос, токенов/с 22,64 43,28 1,91×
Пакет из 8 запросов, суммарно токенов/с 24,19 57,90 2,39×

Это короткий тест генерации по 12 токенов; в пакете повторялся один запрос. Сравнение — с другим исполнителем той же тритовой записи, не с оптимизированной FP16-моделью. Загрузка и подготовка в замер не входят.

А что она отвечает?

Для проверки самих ответов лимит увеличили до 64 токенов и сравнили три состояния: исходный FP32, после TERMAP и после TERNIC.

Исходная модель уже ошибалась: на «12 + 5» отвечала «18», а вопрос о книге на столе уводила в повторяющийся диалог. Но «18 − 7» она в итоге вычисляла правильно — 11. После упаковки этот ответ потерялся, и короткое дообучение его не восстановило. Продолжение рассказа про снег оставалось связным на всех трёх этапах.

Поэтому рабочая цепочка и хороший ответ — разные результаты. Здесь подтверждены упаковка, реальное обучение упакованных весов, сохранение и исполнение. Качество ответов ещё требует работы.

Итог

TERMAP сжимает. TERNIC обучает. TERLUT исполняет. Это уже проверенный путь от исходных весов до отдельно загружаемой обученной модели. Тритовая запись стала не только способом хранить готовые веса, но и форматом, в котором модель может продолжать учиться и работать.

Андрей Рощупкин · Тернит

Все записи дневника ↗