T27.AI

Блог

Два курса t27 по 27 уроков: сначала FPGA, потом ИИ-числа

2026-10-07 · 9 мин чтения

[ни один урок не обучает сеть; тесты 15 новых уроков идут в записях нативного t27c, а не в браузере; 35 из 127 мутантов выживают и не разобраны; только программа, без платы] Курс t27 теперь — два курса по 27 уроков, 9 модулей по 3 урока (записи уроков с 13 по 21 ждут t27#7400): «С нуля до чипа» о программировании FPGA и «ИИ-числа на t27», который начинается с 6 переехавших уроков и добавляет ещё 21, до маленькой тернарной сети. Каждый из последних 15 уроков подкладывает в спеку ошибку в одну строку и показывает единственный названный тест, который падает. По 14 их функциям tri mutate spec сделала 127 мутантов, и тесты убили 92.

Гравюрный триптих к статье: Два курса t27 по 27 уроков: сначала FPGA, потом ИИ-числа
Открыть полный триптих в исходном размере
#t27#Ternary#MutationTesting

Курс t27 разросся до 33 уроков в 11 модулях: 27 о программировании FPGA, потом 6 о форматах чисел для ИИ. Это две темы в одном курсе, и ссылкой на него нельзя было поделиться ни одной темой отдельно. Теперь это два курса по 27 уроков, и в каждом курсе 9 модулей по 3 урока. Курс 1, «С нуля до чипа», оставляет себе уроки FPGA и свой адрес. Курс 2, «ИИ-числа на t27», начинается с 6 переехавших уроков и добавляет ещё 21, до маленькой тернарной сети. Каждый урок открывает свой виджет и одну спеку t27, а каждый из последних 15 уроков подкладывает в спеку одну ошибку и показывает тот единственный тест, который её ловит.

Почему 27 и почему два курса

27 — это 3 x 3 x 3, форма слова TRI-27, и каждый курс — это 9 модулей по 3 урока, всего 27 уроков. Когда теме нужно больше 27 уроков, она становится вторым курсом, связанным с предыдущим: последний урок курса 1 заканчивается ссылкой на урок 1 курса 2, а урок 1 курса 2 ссылается обратно. У каждого курса свой адрес в приложении, своя страница под t27.ai/learn/, своя карточка для превью и своя строка в карте сайта, поэтому каждым можно поделиться отдельно.

Ни одна ссылка, работавшая до разделения, не сломалась. Страница урока остаётся по адресу t27.ai/learn/<урок>/, в каком бы курсе урок ни был. В приложении старый адрес переехавшего урока, #/course/<урок>, теперь открывает его по адресу #/ai-numbers/<урок>. Прогресс — один список в вашем браузере для обоих курсов, поэтому урок, отмеченный пройденным до разделения, остаётся пройденным и после.

Курс 2, часть за частью

УрокиЧастьЧему учит
1-3Лаборатория: наши исследованияСвой формат чисел, честная таблица результатов и таблицы модели, перемноженные на плате.
4-6ИИ-числа: блок MXКак ИИ-чипы хранят веса в нескольких битах: один общий масштаб на блок, сам байт масштаба и что один выброс делает с соседями.
7-9Тернарные весаВеса, которые бывают только минус масштаб, ноль или плюс масштаб, пять правил, которые должен пройти тернарный алфавит, и прогон тестов, который ничего не проверил.
10-12Тернарный формат Ternary Network FloatПравило, которое компилятор проверяет до запуска любого теста, и 17-битное число с плавающей точкой, порядок которого — четыре сбалансированных трита.
13-15Арифметика чисел со знакомУмножить два числа со знаком, сложить их, когда знаки разные, и сделать то и другое сразу в умножении с накоплением.
16-18Части нейронаReLU с изломом в нуле, степень двойки для softmax и argmax, который называет ответ.
19-21Обучение на ошибкеПотеря, которая оценивает неверную догадку в битах, один шаг, который сдвигает вес против градиента, и скрытый слой, который нужен XOR.
22-24BitNet: тернарные сетиПорог, который сжимает сумму обратно до трёх значений, один нейрон, который становится другой функцией при смене весов, и нейрон, который читает входы по 27 тритов за раз.
25-27Тернарный MAC как чипСкалярное произведение 27 тритов как провода без регистра, та же сумма, которую регистр копит на каждом такте, и небольшая целая сеть в конце курса.

Курс 1 сохраняет свои 27 уроков в 9 модулях по 3: чип, числа в железе, ваша программа на t27, внутри t27c, от спеки к железу, читаем синтез, размещение, трассировка и тайминг, битстрим и на плате.

Каждый новый урок подкладывает одну ошибку

Уроки с 13 по 27 разбирают каждый одну спеку из тернарного каталога t27. Виджет каждого — запись терминала на нашей лабораторной машине, где нативный компилятор t27c и Zig гоняют тесты, которые браузер пока не умеет запускать. Запись показывает важные строки и гоняет тесты спеки. Потом tri mutate plant меняет одну строку, снова гоняет тесты и проходит, только если упал ровно названный тест, а git diff показывает, что файл вернулся к прежнему виду. Во всех 15 падает ровно один названный тест.

Записи уроков с 13 по 21 ещё не готовы. Их девяти спекам (gft_smul, gft_sadd, gft_signed_mac, gft_relu, gft_exp2, gft_argmax4, gft_nll, gft_sgd_step и gft_xornet) нужны команды tri test и tri mutate plant из t27#7400, который ещё не смержен. До тех пор каждый из этих уроков открывает страницу-заглушку, где сказано, что запись ещё не готова, и нет никакого запуска; текст урока говорит то же. Уроки с 22 по 27 открывают свои записи уже сейчас.

УрокСпекаТестыПодложенная ошибкаЕдинственный упавший тест
13 Знак — это один битgft_smul.t273знак произведения всегда 0m2
14 Разные знаки — вычитаниеgft_sadd.t273складывает величины, когда знаки разныеa2
15 Умножить, потом сложитьgft_signed_mac.t274знак ставится через OR, а не XORpp
16 Излом в нулеgft_relu.t274отрицательные входы проходят насквозьnegz
17 Два в степени xgft_exp2.t274теряет минус у k для отрицательного xem1
18 Выбрать наибольшееgft_argmax4.t274> становится >= для двух положительных оценокtie_low
19 Потеря в битахgft_nll.t273neg превращает 0 в ноль с поставленным битом знакаperfect
20 Один шаг вниз по склонуgft_sgd_step.t273умножает g на само себя, а не на etaascend
21 XOR нужен изломgft_xornet.t274нет relu у одного скрытого нейронаx00
22 Обратно в три значенияactivation_quantizer.t277> становится >= на порогеquantize_boundary_hi
23 Тот же нейрон, другие весаbitnet_majority.t2712один вес из P становится Zmaj_p_n_n
24 Нейрон по кускамbitnet_neuron_nchunk.t2711цикл читает один кусок, а не всеneuron_zero_chunks
25 Скалярное произведение из проводовcomb_ternary_dot.t274N на P даёт +1dot_all_n_x_all_p
26 Складывать на каждом тактеstream_ternary_mac.t274P в a читается как Ndot_all_p_x_all_p
27 Целая сетьbitnet_mlp.t274третий скрытый трит попадает не в тот битpack3_zzz

Одна подложенная ошибка показывает, что тест умеет падать. О тестах, которые никто не написал, она говорит мало. Поэтому каждая запись заканчивается командой tri mutate spec: она делает в функции урока все однострочные изменения, которые знает, и считает, сколько из них заметили тесты.

Что нашли мутанты

По 14 функциям из 15 tri mutate spec сделала 127 мутантов. 92 убиты, каждый — упавшим тестом, 35 выжили; ни один не завис и ни один не перестал собираться. Восемь функций убили всех мутантов. Шесть — нет:

СпекаФункцияМутантыУбитыВыжили
gft_exp2.t27on_comb341717
gft_sadd.t27sadd18108
gft_smul.t27smul16124
gft_argmax4.t27gt963
comb_ternary_dot.t27tmul752
gft_relu.t27on_comb541

Выживший — это изменение в одну строку, которого не замечает ни один тест. Либо не хватает теста, либо изменение не меняет того, что возвращает функция. В таких спеках встречаются оба случая. В gft_relu.t27 строку 11, if (x == 0) { return 0; }, можно удалить, не изменив ни одного результата, потому что строка 13 возвращает x, а x уже 0. Какой из 35 выживших какого рода, пока не разобрано; начинать стоит с gft_exp2.t27, где при 4 тестах 17 выживших. Для gft_xornet.t27 подсчёт не напечатал итога вовсе, поэтому она не вошла в суммы.

Пока делались записи, нашлись две проблемы в инструментах. tri test печатал зелёную строку, не запустив ни одного теста, так что запись с ним ничего не доказывала. Пул-реквест t27#7400 заставляет его гонять тесты и падать, если хоть один упал или не прошёл ни один, и добавляет tri mutate plant: она подкладывает ошибку, требует, чтобы упали ровно названные тесты, и сверяет хеш файла до и после. t27c test-report по-прежнему выходит с кодом 0, когда тест падает, поэтому каждый вердикт в этих записях читается из его текста (t27#7370).

Где ещё этому учат

Перед тем как писать, мы прочитали страницы 16 других источников, которые учат тернарным сетям, квантованным сетям на FPGA или сети с нуля либо строят их; читали 7 октября 2026 года. В таблице оставлено 11 из них.

ИсточникВидТернарные весаГде работаетКакие тесты за ним
The Era of 1-bit LLMs, S. Ma et al. (2024)статьяда, определение BitNet b1.58GPUперплексия и точность против LLaMA
bitnet.cpp, Microsoftбиблиотека выводадаCPU, а с 2025 года и GPUнабор тестов не назван
Fine-tuning LLMs to 1.58bit, Hugging Face (2024)статья в блогеда, квантователь шаг за шагомGPUбенчмарки и кривые потерь
A Visual Guide to Quantization, M. Grootendorst (2024)иллюстрированная статьяда, с разобранными числамистатичные рисункинет, кода там нет
Ternary Weight Encoder, binarycon.comинтерактивная страницаупаковывает веса, которые уже тернарныеваш браузерне указаны
FINN, AMD Researchкомпилятор и блокнотыбинарные и квантованные; тернарные на прочитанных страницах не названыплаты FPGA; симуляция на Python, C++ и RTLда: каждый этап против эталона
TernaryCore (2026)библиотека на Verilogда: MAC, скалярное произведение, умножение матрицсимуляция; платы Arty A7-100T и Tang Nano 9kчисло пройденных тестов стенда и RTL против Python; тесты не названы
TeLLMe, Y. Qiao et al. (arXiv:2504.16266)статьяда, веса 1,58 битаFPGA Kria KV260проверка правильности не описана
micrograd и Neural Networks: Zero to Hero, A. Karpathyбиблиотека и видеокурснетPythonградиенты сверяются с PyTorch
MiniTorch, S. Rushучебная библиотеканетPython и модуль на CUDAмодульные тесты и тесты свойств, которые должен пройти ученик
nand2tetris, Project 2курс и книганетсимулятор железа на компьютеретестовый скрипт и файл сравнения на каждую микросхему
Этот курс, уроки с 13 по 27курсда: скалярное произведение 27 тритов, MAC и маленькая сетьспеки в вашем браузере; тесты в записях нативного t27cда: 74 теста, одна подложенная ошибка на урок, 127 мутантов

Каждый из них делает то, чего этот курс не делает. Статья о BitNet, bitnet.cpp и статья Hugging Face работают в масштабе настоящих моделей, от 700M до 70B параметров, с измеренными ускорениями; ни один урок здесь не касается обученной модели. FINN превращает обученные сети в ускорители на FPGA и проверяет каждый этап в симуляции, а TeLLMe запускает целую тернарную языковую модель на FPGA для периферийных устройств. Ближе всех TernaryCore: открытый Verilog, который идёт от тернарного MAC к скалярному произведению и к умножению матриц, с тестами, и работает на настоящих платах. В micrograd, MiniTorch и nand2tetris ученик сам строит каждую часть против тестов.

Чего мы не нашли ни на одной из этих страниц, так это формы этих уроков: одна подложенная ошибка в одну строку на урок, которая роняет ровно один названный тест, после чего файл возвращается к прежнему виду. Ближе всего nand2tetris и MiniTorch: там собственная ошибка ученика роняет их тесты, но ошибку не подкладывают и не показывают. Это узкое утверждение о прочитанных страницах, а не обо всех курсах на свете. И тесты этих 15 уроков пока не идут в вашем браузере; они идут в записях.

Чего это не показывает

Попробовать

Чего это не решает

Пруфы

Поработаем вместе

Хотите так же проверить собственный дизайн?

Я аудирую RTL и строю независимые побитово точные модели, затем провожу результат через синтез и, когда это полезно, проверяю на плате Artix-7. Первый модуль проверки — бесплатно.