amarao: (Default)
amarao ([personal profile] amarao) wrote2025-08-06 11:29 pm

4-битный AI

В связи с релизом gpt-oss с 4-битным форматом, объяснение этого формата проще показать в виде перечисления, чем длинной простыни рассуждений.

4-битный float (MXFP4) позволяет записать следующие числа:

{-6.0, -4.0, -3.0, -2.0, -1.5, -1.0, -0.5, -0.0, 0.0, 0.5, 1.0, 1.5, 2.0, 3.0, 4.0, 6.0}

И вот вся AI вот на этом типе данных и держится. С учётом потерянного полубита в районе нуля, чую я, что троичные форматы не за горизонтом... Ну или, в этом контексте, base15. Объективная экономия 6%. Если только кто-то научится их быстро умножать и складывать...
vak: (Default)

[personal profile] vak 2025-08-06 09:04 pm (UTC)(link)
Отсюда понятно, почему человеческий разум может удерживать и эффективно обрабатывать максимум семь отдельных элементов. Потому что FP4 в мозгах. Мантисса больше не позволяет. 😀
juan_gandhi: (Default)

[personal profile] juan_gandhi 2025-08-07 12:30 am (UTC)(link)
Хм, base 15. А в чём цимес?
sab123: (Default)

[personal profile] sab123 2025-08-07 02:14 am (UTC)(link)
https://sab123.dreamwidth.org/775720.html про логарифмическое представление. На самом деле любые операции над 4-бтовыим числами можно легко производить в виде таблицы, там будет всего 256 вариантов.
kondybas: (Default)

[personal profile] kondybas 2025-08-07 10:05 am (UTC)(link)
Так а кроме таблиці - как? Єто ж типичній enum.

[personal profile] ichthuss 2025-08-07 10:50 am (UTC)(link)
Кроме таблицьі - так же, как и с single и double. На них таблиц не напасешься.
kondybas: (Default)

[personal profile] kondybas 2025-08-07 01:05 pm (UTC)(link)
А как можно для сабжа віполнить то же сложение 1.5+1.5 - но без доп.преобразований?

[personal profile] ichthuss 2025-08-07 06:13 pm (UTC)(link)
Не понял вопрос. Для чисел с плавающей запятой 0.75*2^1 + 0.75*2^-1 это будет:
1. Свести к общему показателю (в данном случае он и так общий)
2. Сложить мантиссы: 0.75+0.75 = 1.5
3. Нормализовать: 1.5 = 0.75*2^1
Итого вьіходит 0.75*2^2, т.е. 3.
kondybas: (Default)

[personal profile] kondybas 2025-08-07 07:22 pm (UTC)(link)
Мне кажется, что, все-таки, не 0.75, а 0.5. И не 0.75*2^-1, а 0.5*2^0. И єто только для четірех меньших чисел в множестве. Какими коєффициентами можно получить 2,3,4 и 6 я так сразу и не соображу.

Вероятно, есть какая-то табличка соответствия бинарного представления закодированому флоату. К которой нужно обращаться на каждій чих. Разве нет?

[personal profile] ichthuss 2025-08-09 12:20 pm (UTC)(link)
В принципе, для такого маленького представления табличка может действительно оказаться эффективнее. Но принципиально - нет, здесь нет необходимости ни в какой табличке, все построено строго по логике обычных флоатов и может быть реализовано чисто схемотехнически, логично.

Имеем:
- 1 бит знака
- 2 бита показателя
- 1 бит мантиссы.

При этом мантисса у нас почти всегда нормализованная (т.е. старший бит "1"), поэтому реально мантисса 2 бита, из которых хранится младший, а старший подразумевается. Подразумевается он всегда 1, кроме наименьшего значения показателя - тогда мантисса денормализованная, и старший бит подразумевается 0. Т.е. мантисса может принимать значения 0.75, 0.5, 0.25, 0 (последние два - только в случае денормализации). Или, эквивалентно, можно считать это значениями 3,2,1,0, изменив соответственно интерпретацию показателя.

В итоге имеем (для положительных чисел):
- показатель 00: денормализованная мантисса, коэффициент 2, значения мантиссы 0.0 и 0.25 дают нам числа 0.0 и 0.5
- показатель 01: нормализованная мантисса, коэффициент 2, значения мантиссы 0.5 и 0.75 дают нам числа 1.0 и 1.5
- показатель 10: нормализованная мантисса, коэффициент 4, значения мантиссы 0.5 и 0.75 дают нам числа 2.0 и 3.0
- показатель 11: нормализованная мантисса, коэффициент 8, значения мантиссы 0.5 и 0.75 дают нам числа 4.0 и 6.0

Если интерпретировать мантиссу как 0-3 вместо 0.0 - 0.75, то показатели надо, соответственно, интерпретировать как 0.5 - 2 вместо 2 - 8.
sab123: (Default)

[personal profile] sab123 2025-08-07 10:59 pm (UTC)(link)
1.5 - это третье от нуля положительное число. То есть, видимо, 0011 в двоичном виде. А результат, 3 - это пятое число, то есть 0101. Нам надо сделать вычисление 0011 + 0011 = 0101. Логическая формула для этого вычисления будет:

z0 = z2 = x0 & x1 & ~x2 & ~x3 & y0 & y1 & ~y2 & ~y3
z1 = z3 = ~(x0 & x1 & ~x2 & ~x3 & y0 & y1 & ~y2 & ~y3)

Другие варианты добавятся дизъюнктивно из других вычислений всех возможных входных пар, после чего формулы будет можно упростить через вынеcение общего за скобки.
kondybas: (Default)

[personal profile] kondybas 2025-08-08 05:19 am (UTC)(link)
Как-то непохоже єто на вічисление, на мой дилетантский взгляд. Больше похоже на адресацию в таблично заданной фции. Насчет упрощения имеется в виду что-то вроде
z0 = ~z1 = z2 = ~z3 = (x0 & x1 & ~x2 & ~x3 & y0 & y1 & ~y2 & ~y3)
или более существенное?
sab123: (Default)

[personal profile] sab123 2025-08-08 11:48 pm (UTC)(link)
Начинается с того, что пишутся все 256 возможных комбинаций. Потом для каждого бита результата смотрим, в каких из комбинаций он будет единицей (с нулями смотреть не надо - этих я привел только по случаю того, что н епривел 256 комбинаций). Записываем все эти комбинации как конъюнкции (как я показал) и соединяем в дизъюнкцию - это будет Дизъюнктивная Нормальная Форма для этого бита результата. ПЗУ (таблица) реализует тупо ее в лоб. Если реализовывать логикой, то начинаем выносить за скобки общие множители, чтобы упростить функцию (для классических способов оптимизации - см. карты Карно). В том числе при наличии нескольких битов результата можно выносить общие подвыражения из вычисления нескольких битов.
sab123: (Default)

[personal profile] sab123 2025-08-07 10:50 pm (UTC)(link)
Можно сделать логическую схему с тем же результатом.

[personal profile] permeakra 2025-08-07 04:51 pm (UTC)(link)
Я скорее поверю в base17 на 4 битах =). На реальных задачах тензоры и матрицы обычно разреженные (sparse), т.е. нулевое значение хранить не надо. Остается по 8 значений в обе стороны от нуля. Аккумулятор в любом случае желательно большим делать чтоб не словить переполнение.
Edited 2025-08-07 16:52 (UTC)

[personal profile] permeakra 2025-08-08 04:40 pm (UTC)(link)
> AI-ку считать - реальная задача?

Да.

>Сложная вычислительная задача?

Зависит от размера модели и конкретной задачи.

[personal profile] permeakra 2025-08-11 12:20 pm (UTC)(link)
Если это не обучение, то по нынешним временам это не HPC *в том понимании, к которому я привык*. Лично я привык относить к HPC системы под задачи, которые подразумевают рабочие множества от терабайта, которые на кластере на пару тысяч ядер общего назначения надо гонять часы и дни. Например ab initio обсчет прогноза погоды на пару недель.

Вот обучение модели с последующим её остругиванием - может быть и HPC.

[personal profile] permeakra 2025-08-12 09:21 am (UTC)(link)
Для тебя как пользователя это детали реализации. А для организации процесса там есть разница.

Если, грубо говоря, у тебя рабочее множество помещается в память одной машины - это один коленкор. Если нет и тебе нужно творчески его распределять по нодам кластера - совершенно другой.