ternary.c64
тернарный трансформер на Commodore 64
Трансформер llama2 на 688 128 тернарных весов (−1, 0, +1), который запускается на штатном Commodore 64 без расширения RAM. Веса лежат в EasyFlash-картридже и не попадают в RAM, а все вычисления идут в int16 fixed point. Проект Джузеппе Де Мартино, MIT, собран на llama2.c.
➕ Ключевые особенности
- ➕ Архитектура llama2: dim 128, 4 слоя, 8 голов, 1 KV-голова, контекст 128 токенов, словарь 512.
- ➖ Все матрицы attention и FFN — тернарные (−1, 0, +1); эмбеддинги на C64 — int8.
- 🔙 Обучен с нуля на TinyStories; validation loss — 1.4390.
- 🟰 На C64 нет float: int16 Q5.10, SiLU/exp/обратный корень/RoPE — таблицы, активации квантуются в int8.
- ✖ В тернарном ядре нет умножения: таблица девяти сумм, 21 цикл на MAC; attention — quarter-square MAC, 81 цикл.
- ▶ 361 КБ EasyFlash-картридж (22 банка), 242 КБ ternarised model; в RAM остаётся 256 байт.
▶ Пример
Запуск в PyTorch с тернарным forward pass:
import os, json, torch
from safetensors.torch import load_file
from model import Transformer, ModelArgs
import bitpatch
os.environ["TERNARY"] = "1"
model = Transformer(ModelArgs(**json.load(open("config.json"))))
bitpatch.apply(model)
model.load_state_dict(load_file("model.safetensors"))
На C64 эталонная фраза генерируется 24 минуты 5 секунд; примерно одно слово за 40 секунд.
Подробнее
Validation loss: 1.4390 после 20 000 итераций на TinyStories.На C64: 24 мин 5 с на эталонную фразу, ~39,2–45,9 с на слово; проверено только в эмуляторе VICE, на реальном железе — нет.
Ограничения: знает только детские истории; вне простого английского токенизация рассыпается; fixed point совпадает с float на эталонном промпте, на произвольных — примерно в трети случаев.
Веса: 688 128 тернарных; эмбеддинги 65 536, связаны с выходной головой; нормы 1 152.








Комментарии