Alterna · учебный материал
10.2 Размер записи и точность
Два формата могут занимать одинаковые два байта, но по-разному делить их между диапазоном и точностью.
Что в этом материале
- Меньше битов — не одно и то же упрощение
Содержание и основные понятия
На предыдущей странице: как записать число конечным числом битов.
Два формата могут занимать одинаковые два байта, но по-разному делить их между диапазоном и точностью.
Числа имеют конечную точность; их нужно хранить и переносить. Матричные блоки дают много независимой работы, но память и организация групп также влияют на результат.
Для изменения рисунка включитеJavaScript; расчёт и теория доступны далее.
Меньше битов — не одно и то же упрощение
FP16 имеет5exponent и10fraction bits, BF16 —8и7. BF16 сохраняет широкий exponent range, но возле1имеет более редкую сетку: шаг2^-7=.0078125 против2^-10=.0009765625 уFP16. Одинаковые16бит хранения не дают одинаковую точность. H02.
Округление nearest ties-to-even выбирает ближайшее представимое число, а при точной середине — вариант с чётным младшим битом. ДляFP16 значение1+2^-11 находится посередине между1и1+2^-10 и округляется к1. Значение1+3·2^-11 округляется к1+2·2^-10.
Минимальный положительный subnormal FP16 —2^-24, максимальное конечное —65504. Наш codec поддерживает gradual underflow. В H02 описаны конкретные TPU с flush-to-zero для BF16: это особенность исполнения, не поведение нашего абстрактного хранилища.
FP8 — семейство. Здесь реализован
E5M2
с IEEE-like special values. E4M3 из H03 иначе расходует special encodings; нельзя просто сократить поля и объявить результат E4M3FN. Для INT8 в лаборатории явно выбран symmetric quantizer q=clamp(round(x/scale),−127,127), восстановление q·scale. Он не floating point и требует масштаба.
Исследовать.
Сравните.1,1.0005,70000и очень малое значение. Разделите rounding error, underflow и overflow. Экономия байтов весов не означает, что accumulation тоже выполняется в том же формате: mixed precision часто сочетает низкую точность inputs с более точным аккумулятором.
import struct
half=lambda x:struct.unpack('>e',struct.pack('>e',x))[0]
assert half(1+2**-11)==1
assert half(1+3*2**-11)==1+2**-9
assert half(2**-24)==2**-24
Код повторяет только что разобранные операции.
Полный проверяемыйPython-пример главы
доступен отдельным файлом; показанный короткий фрагмент не заменяет его реализацию.
FP16:1/5/10;BF16:1/8/7. Codec хранения не определяет все особенности исполнения.
Много похожих действий одновременно. Как этот вопрос продолжает полученный результат?
Python-примеры главы 10
Академическая база →