Откуда берутся 140 ГБ у модели с обозначением 70B
Число 7B, 8B, 32B, 70B или 405B в названии языковой модели обычно относится к количеству ее параметров. Параметры можно грубо представить как числовые коэффициенты нейросети, полученные во время обучения. Для запуска уже обученной модели их необходимо хранить в памяти и постоянно читать при вычислениях. Поэтому первый расчет требований к памяти начинается не с длины контекста и даже не с видеокарты, а с количества параметров и формата, в котором записан каждый из них.
Если один параметр хранится в FP32, на него требуется 32 бита, или 4 байта. Модель с 70 млрд параметров в таком представлении потребовала бы приблизительно 280 ГБ только для весов. FP16 и BF16 уменьшают величину примерно вдвое: 70 млрд × 2 байта дают около 140 ГБ. Восьмибитное представление в идеальном случае уменьшает объем до 70 ГБ, четырехбитное до 35 ГБ. Это десятичные оценки. В программах, которые выводят GiB, цифры будут меньше, поскольку 1 GiB равен 1 073 741 824 байтам.
Именно поэтому фраза «у меня видеокарта на 24 ГБ, значит 70B в 4 битах должна поместиться» не сходится уже на первом расчете. Даже если представить идеальное четырехбитное хранение без единого дополнительного байта, 35 ГБ больше 24 ГБ. Реальные форматы квантования дополнительно используют масштабы, метаданные, блоки и иногда веса другой точности, поэтому размер файла обычно не равен простому произведению числа параметров на четыре бита.

Для конкретного примера удобно использовать Llama 3.1 70B. Meta выпустила семейство Llama 3.1 в вариантах 8B, 70B и 405B с контекстом до 128K токенов. В карточке Llama 3.1 70B также указано использование Grouped-Query Attention, или GQA, что существенно для дальнейшего расчета памяти под контекст. Модель плотная: при обработке токена работают все ее основные параметры, в отличие от архитектур Mixture-of-Experts, где общее и активное число параметров могут сильно различаться.
С современными MoE-моделями надпись вроде 100B или 200B требует дополнительной проверки. У модели может быть очень большое суммарное количество параметров, но для каждого токена маршрутизатор активирует только часть экспертов. Это снижает объем вычислений на токен, однако не означает, что все остальные веса автоматически перестают занимать память. Если вся модель загружается в GPU, хранить приходится и неактивные в данный момент эксперты. Поэтому при выборе локальной модели нужно различать total parameters, active parameters и фактический размер конкретного файла весов.
С обучением арифметика еще тяжелее. Во время inference нужны веса, промежуточные активации, кеш и рабочие буферы. При обучении появляются градиенты и состояния оптимизатора. Hugging Face в разборе потребления памяти приводит для mixed-precision обучения с AdamW оценку порядка 18 байт на параметр плюс память активаций. Поэтому возможность запустить квантованную 32B-модель на домашней видеокарте ничего не говорит о возможности полноценно обучать такую модель на той же GPU.
Почему Q4 не означает ровно четыре бита на каждый параметр
Квантование уменьшает точность представления весов. Вместо 16-битного числа можно использовать 8, 6, 5, 4 и даже меньше бит. На первый взгляд результат должен масштабироваться линейно: модель в Q4 должна занимать четверть пространства относительно FP16. В реальном файле появляются дополнительные данные, необходимые для восстановления приближенных значений при вычислениях.
Один из распространенных подходов состоит в том, что веса разбиваются на блоки. Значения внутри блока кодируются числами низкой разрядности, но вместе с ними хранится scale и другая информация, позволяющая сопоставить маленькое целое число с исходным диапазоном весов. Служебные значения могут храниться в большей точности. Поэтому фактическое число бит на один вес оказывается выше номинальных четырех.
В экосистеме llama.cpp это особенно хорошо видно по количеству форматов. Существуют Q4_0, Q4_1, Q4_K_S, Q4_K_M, Q5_K_M, Q6_K, Q8_0 и другие варианты. Буква Q4 сообщает лишь общий класс. K-кванты используют блочную структуру, а варианты S, M и L различаются тем, как распределяется точность между тензорами. Документация llama.cpp прямо указывает, что квантование уменьшает размер и способно ускорять inference, но может вносить потерю точности, которую оценивают, например, через perplexity или KL divergence.



