Блог
[один блок из 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 роняет ровно один из них.

В курсе 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
Блок 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
Раздел 6.3 спецификации MX выводит масштаб из наибольшего по модулю значения в блоке: его степень двойки минус наибольшая экспонента, которую может показать элемент. Одно значение решает масштаб для всех 32. В нашем рабочем блоке 31 вес от -0,17 до 0,17, один из них ровно ноль, и один выброс, 3,3. ocp_mx.t27 переводит блок в каждый тип элемента и считает ненулевые входы, которые вернулись нулём. Все числа обнулённых, масштабы и ошибки ниже проверяются в спеке; ошибки проверены точно, в единицах 2^-24, и здесь показаны десятичными дробями.
| Элемент | Бит на вес | Общий масштаб | Обнулено (из 31 ненулевого входа) | Сумма абсолютных ошибок |
|---|---|---|---|---|
| MXFP4 E2M1 | 4,25 | 2^-1 | 23 | 2,5610 |
| MXFP6 E2M3 | 6,25 | 2^-1 | 4 | 0,5625 |
| MXFP6 E3M2 | 6,25 | 2^-3 | 0 | 0,3218 |
| MXINT8 | 8,25 | 2^1 | 2 | 0,2451 |
| MXFP8 E4M3 | 8,25 | 2^-7 | 0 | 0,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 | стандарт и статья | да, нормативное определение | даёт правило, без разобранного блока | тестовые векторы не опубликованы | |
| 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, и два инструмента выдают для одних и тех же весов разные коды.
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).
ocp_mx.t27 влит в t27 6 октября 2026 года (t27#6828, сквош-коммит 322cc77d7). Запись ocp_mx сделана раньше, на коммите ветки 1a3786657; файл в обоих совпадает байт в байт.ocp_mx.t27 ещё нет на сайте, поэтому страница не запускает его тесты (вычислитель сайта, запущенный на этом файле, проходит все 49).Поработаем вместе
Я аудирую RTL и строю независимые побитово точные модели, затем провожу результат через синтез и, когда это полезно, проверяю на плате Artix-7. Первый модуль проверки — бесплатно.