T27.AI

Блог

Один выброс, 23 нуля: модуль курса о блоке OCP MX

2026-10-06 · 8 мин чтения

[один блок из 32, выбранный, чтобы показать обнуление, без модели и без числа точности; ocp_mx.t27 влит в t27, но ещё не на сайте; урок 33 — запись, а не плеер в браузере; только программа] В курсе t27 три новых урока о форматах Microscaling (MX) от Open Compute Project, где 32 веса делят один байт масштаба. Один вес 3,3 среди 31 маленького задаёт этот масштаб, и в MXFP4 23 из 30 ненулевых маленьких становятся нулём; MXFP6 E2M3 теряет 4, MXINT8 2, MXFP6 E3M2 и MXFP8 E4M3 — ни одного. Числа взяты из спеки с 49 тестами, и замена одного смещения экспоненты с 15 на 16 роняет ровно один из них.

Гравюрный триптих к статье: Один выброс, 23 нуля: модуль курса о блоке OCP MX
Открыть полный триптих в исходном размере
#t27#NumberFormats#MutationTesting

В курсе t27 теперь 33 урока. Новый, одиннадцатый модуль «ИИ-числа: блок MX» — три урока о форматах Microscaling (MX) от Open Compute Project: веса хранятся в 4, 6 или 8 битах, и на каждые 32 веса приходится один общий масштаб. Урок 31 объясняет общий масштаб и компилирует его спеку прямо в браузере. Урок 32 запускает ту же спеку на настоящей машине. Урок 33 показывает, что один большой вес делает с остальными весами своего блока: из 31 веса 30 ненулевые и один ровно ноль, и в MXFP4 23 из 30 ненулевых становятся нулём. Каждое число в этом посте напечатано командой в записи или проверено тестом в спеке.

t27c on ocp_mx.t27 -- OCP MX v1.0, native

t27c 0.4.0 и Zig 0.16.0 в лаборатории t27c: тест, который считает обнулённые веса, 49 из 49 тестов проходят, затем смещение экспоненты меняется с 15 на 16, и падает ровно один тест; git возвращает спеку. 32,7 с, показано целиком; приглашение и набор поставлены, каждый напечатанный байт настоящий. Открыть запись на отдельной странице.

Один байт масштаба на 32 веса

Блок MX — это 32 элемента и один общий масштаб. Каждый элемент — маленькое число: FP4 E2M1, FP6 E2M3 или E3M2, FP8 E4M3 или E5M2, или 8-битное целое. Масштаб — один байт под названием E8M0: восемь бит экспоненты, без знака, без мантиссы. Код e означает 2 в степени e минус 127, код 255 означает NaN, а нуля нет. Блок MXFP4 — это 32 x 4 бита плюс 8, то есть 4,25 бита на вес.

Урок 31 открывает в плеере e8m0.t27, нашу спеку этого байта. Компилятор t27 работает в странице как WebAssembly, выдаёт все семь бэкендов и запускает проверки спеки: 17 из 27 проходят, ни одна не падает, 10 пропущены, и у каждой написано, почему браузер не может её запустить. Урок 32 — та же спека на настоящей машине, где ничего не пропускается: 18 из 18 тестов проходят в Zig, а 9 инвариантов доказываются во время компиляции, так что компиляция и есть проверка.

t27c on e8m0.t27 -- the MX shared scale byte, native

t27c 0.4.0 и Zig 0.16.0 в лаборатории t27c: константы e8m0.t27, отчёт о тестах (18 проходят, 9 инвариантов доказаны при компиляции), тесты Zig и Verilog, который компилятор пишет для проверки NaN. 19,9 с, показано целиком. Открыть запись на отдельной странице.

Один выброс, формат за форматом

Раздел 6.3 спецификации MX выводит масштаб из наибольшего по модулю значения в блоке: его степень двойки минус наибольшая экспонента, которую может показать элемент. Одно значение решает масштаб для всех 32. В нашем рабочем блоке 31 вес от -0,17 до 0,17, один из них ровно ноль, и один выброс, 3,3. ocp_mx.t27 переводит блок в каждый тип элемента и считает ненулевые входы, которые вернулись нулём. Все числа обнулённых, масштабы и ошибки ниже проверяются в спеке; ошибки проверены точно, в единицах 2^-24, и здесь показаны десятичными дробями.

ЭлементБит на весОбщий масштабОбнулено (из 31 ненулевого входа)Сумма абсолютных ошибок
MXFP4 E2M14,252^-1232,5610
MXFP6 E2M36,252^-140,5625
MXFP6 E3M26,252^-300,3218
MXINT88,252^120,2451
MXFP8 E4M38,252^-700,1064

В MXFP4 не выживает и сам выброс: 3,3 при масштабе 2^-1 — это 6,6, больше наибольшего значения FP4, 6,0, поэтому оно обрезается и хранится как 3,0. На шести битах в этом блоке диапазон важнее точности. E3M2, у которого на один бит экспоненты больше и на один бит мантиссы меньше, ничего не обнуляет и ошибается меньше: выброс сталкивает маленькие веса в субнормальные числа E2M3. Это сравнение спека тоже проверяет.

Коды, которые спека ожидает для каждого элемента блока, взяты не из самой спеки. Их посчитала отдельная реализация раздела 6.3 в точной рациональной арифметике (Python fractions), и спека сверяет их бит в бит для MXFP4, обоих типов MXFP6, MXFP8 E4M3 и MXINT8.

Это один блок, собранный, чтобы показать эффект. О целой модели он ничего не говорит: там цену решает доля блоков, в которых есть такой выброс. Урок 29, раньше в курсе, сравнивает форматы на настоящей языковой модели; этот модуль — нет.

Спека, которая ловит свою ошибку

Запись заканчивается подброшенной ошибкой: смещение экспоненты E5M2 меняется с 15 на 16. Падает ровно один тест, bias_puts_the_min_normal_at_two_to_one_minus_bias, и git возвращает файл. На ревью проверили 11 таких мутантов, и каждый уронил хотя бы один тест; их список — в пул-реквесте. Ревью нашло и другое: первая версия генерировала Zig без ошибок, но он не компилировался — 20 ошибок из-за индексов массивов и знакового деления. «Генерируется» и «компилируется» — разные утверждения, и теперь спека выполняет оба. Дефект компилятора, который за этим стоит, заведён как t27#6867.

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

Перед тем как писать этот пост, мы прочитали страницы двенадцати других источников, которые учат этим форматам или реализуют их, 6 октября 2026 года. В таблице они сведены в десять строк. «Посчитано» значит, что страница называет, сколько мелких значений один выброс превращает в ноль.

ИсточникВидБлок MX и масштаб E8M0Нули от одного выбросаГде работаетТесты за цифрами
A Visual Guide to Quantization, M. Grootendorst (2024)статья с иллюстрацияминет: INT8 и INT4, без FP8, FP4 и MXпоказано на картинке, не посчитаностатичные рисунки—
Introducing NVFP4, NVIDIA (2025)статьясравнивает MXFP4 с NVFP4 и ошибку их байтов масштабане посчитаностатично—
MXFP4 in Transformers, Hugging Face (2025)статья и документацияMXFP4, блоки по 32, без разобранного блоканетнужна видеокартабенчмарки, тесты не названы
Quantization Fundamentals и Quantization in Depth, DeepLearning.AIвидеокурсыне названы на страницах курсовнетпримеры кодане указано
TinyML and Efficient Deep Learning, MIT 6.5940 (осень 2024)университетский курсне названы на странице курса; слайды не читалинет на странице курсалабораторные в Colabне указано
OCP MX v1.0 и arXiv:2310.10537стандарт и статьяда, нормативное определениедаёт правило, без разобранного блокаPDFтестовые векторы не опубликованы
microsoft/microxcalingбиблиотекада: MXFP8, MXFP6, MXFP4, MXINT8 (и INT4, INT2), блоки по 32нетPyTorch и CUDAда, на Python
graphcore-research/gfloatбиблиотекада: форматы элементов и блоков OCP MXнетPython, ноутбукида, сверено с torchao
Understanding MXFP4 Quantization, K. Sharma (2025)интерактивная страницатолько MXFP4, со своим правилом масштабапишет, что выброс стоит точности, не посчитановаш браузер, ваши числане указаны
Floating Point Conversion Calculator, sw23интерактивная страницаE8M0 и все типы элементов MX, по одному значениюблока нетваш браузер, ссылки для обменада: тестовые векторы и CI
Этот модуль, уроки t27 с 31 по 33модуль курсада: пять типов элементов, блоки по 32, E8M0посчитано: 23, 4, 0, 2 и 0 из 31 ненулевого входаурок 31 — в вашем браузере; урок 33 — записьда: 49 тестов в спеке

Каждый из них делает то, чего этот модуль не делает. A Visual Guide to Quantization охватывает всю область, от квантования после обучения до GGUF, с терпеливыми картинками. NVIDIA и Hugging Face показывают настоящие модели на этих точностях, с цифрами точности и памяти; здесь модели нет вовсе. Два курса DeepLearning.AI учат видео и кодом под руководством, а курс MIT — целый семестр. microxcaling запускает MX внутри настоящих моделей PyTorch. Калькулятор sw23 разбирает каждый тип элемента MX бит за битом, с режимами округления и переполнения и тестовыми векторами за ними, а Understanding MXFP4 Quantization даёт ввести свои числа и смотреть, как меняются коды.

Честное сравнение для «выведено из стандарта и проверено тестами» — gfloat: читаемая эталонная реализация на Python для многих форматов, блоки MX тоже, сверенная со второй библиотекой. Чего мы не нашли нигде, так это счёта, на котором построен модуль: сколько мелких весов блока один выброс отправляет в ноль, тип элемента за типом. Стандарт даёт правило без разобранного блока, статьи описывают эффект словами или одной цифрой ошибки, библиотеки умеют закодировать такой блок, но ни на одной прочитанной странице этого счёта нет. Это узкое утверждение, и другого мы не делаем. Тесты блока в вашем браузере мы пока тоже не запускаем: урок 33 — запись.

Одно различие важно, если сравнивать числа разных инструментов. Understanding MXFP4 Quantization выбирает масштаб как округление вверх log2(max / 6), а её полный визуализатор берёт блоки по 16. Раздел 6.3 спецификации OCP берёт наибольшую степень двойки, не превышающую максимум блока, и делит на наибольшую степень двойки, которую может хранить элемент, а блоки в нём по 32. Спецификация разрешает и другие способы перевода, так что ни один из них не ошибается. Но для нашего блока с выбросом 3,3 первое правило даёт масштаб 2^0, второе — 2^-1, и два инструмента выдают для одних и тех же весов разные коды.

Тем, кто строит MX

ocp_mx.t27 — один файл. Он декодирует каждый код FP4 E2M1 (16), FP6 E2M3 и E3M2 (по 64), INT8, OFP8 E4M3 и E5M2 (по 256), включая NaN и Inf; кодирует с округлением к ближайшему, при равенстве к чётному, с насыщением; и выполняет перевод блока из раздела 6.3. Каждый источник указан рядом с кодом, который он обосновывает. Его 49 тестов проверяют точные целые: коды, масштабы, счёт обнулённых и ошибки в единицах 2^-24. Названные коды и пять таблиц кодов блока можно прогнать против перевода в своём ядре или в железе. Если какой-то из них расходится с вашим прочтением спецификации, мы хотим об этом знать: откройте issue в gHashTag/t27.

До этой спеки каталог форматов t27, на котором стоит arXiv:2606.09686, перечислял mxfp8, mxfp6 и mxfp4 и ссылался на OCP MX v1.0, но ни одна спека в t27 не декодировала элемент MX и не выполняла перевод блока (t27#6827).

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

Попробовать

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

Пруфы

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

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

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