Модель должна не только быть точной, но и помещаться в память и отвечать быстро. На собесе ML-инженера спрашивают, сколько памяти нужно модели, как работают квантование и дистилляция и что ограничивает скорость генерации.
Форматы чисел и память
| Формат | Байт на параметр | Особенность |
|---|---|---|
| fp32 | 4 | эталон обучения |
| bf16 | 2 | диапазон как у fp32, мантисса 7 бит |
| fp16 | 2 | точнее bf16, но узкий диапазон |
| int8, fp8 | 1 | инференс, иногда обучение |
| int4 | 0.5 | инференс LLM, плюс масштабы групп |
Модель на 7 млрд параметров: 14 ГБ в bf16 и около 3.5 ГБ в 4 битах. Для инференса нужна ещё память под KV-кеш и активации.
Квантование
Симметричное int8:
s = max|w| / 127, q = round(w / s), w ≈ q·s
- Масштаб по тензору, каналу или группе: чем мельче группа, тем точнее.
- Выбросы раздувают масштаб: один вес 100 делает шаг сетки около 0.79, и маленькие веса превращаются в ноль.
- PTQ квантует готовую модель с калибровкой на небольшой выборке. int8 обычно почти без потерь.
- QAT имитирует квантование при обучении, градиент проходит через округление по straight-through estimator. Точнее при низкой разрядности, но дороже.
- Для LLM популярно weight-only квантование в 4 бита методами, которые учитывают влияние ошибки на выход слоя (GPTQ, AWQ и подобные). Активации квантовать сложнее из-за выбросов в отдельных каналах.
Проверяйте качество на своей задаче, особенно рассуждения, код и длинный контекст.
Дистилляция
Маленький ученик учится повторять мягкие вероятности большого учителя:
L = α·T²·KL(softmax(z_t/T) ‖ softmax(z_s/T)) + (1 - α)·CE(y, z_s)
- Температура T > 1 открывает «тёмные знания»: насколько неверные классы похожи на верный.
- T² компенсирует уменьшение градиентов.
- LLM дистиллируют и на текстах, сгенерированных учителем.
Прунинг
- Неструктурированный: обнулить мелкие веса. Хорошо сжимает хранение, но на GPU почти не ускоряет.
- Структурированный: удалить каналы, головы, слои. Матрицы становятся меньше, ускорение реальное.
- Полуструктурированный 2:4: из каждых четырёх весов два нулевые, поддерживается тензорными ядрами новых GPU.
Что ограничивает скорость генерации LLM
Генерация одного токена читает все веса из памяти, а вычислений мало: процесс упирается в пропускную способность памяти. Помогают:
- батчинг запросов (continuous batching): одно чтение весов на много запросов;
- квантование весов: меньше байт читать;
- speculative decoding: маленькая модель предлагает несколько токенов, большая проверяет их за один проход;
- эффективный KV-кеш (PagedAttention, GQA, квантование кеша).
План ускорения в проде
- Измерить: латентность или пропускная способность, где узкое место.
- Инженерия инференса: батчинг, компиляция, специализированные рантаймы, кеширование.
- bf16, затем int8 или 4 бита.
- Дистилляция и структурированный прунинг, если нужно кратное ускорение.
- Проверка качества после каждого шага на важных срезах.
Частые ошибки
- Считать, что неструктурированный прунинг ускоряет инференс.
- Квантовать по тензору целиком при сильных выбросах.
- Оценивать сжатую модель только по средней метрике.
- Путать bf16 и fp16.
Что спросят на собесе
- Сколько памяти занимает модель на N параметров в разных форматах.
- Как работает int8-квантование, PTQ против QAT.
- Что такое дистилляция и зачем температура.
- Почему генерация LLM упирается в память и как её ускоряют.