Глава 6 — Обрезка и дистилляция знаний
Шестой пост поглавного разбора LLM Primer VI: Scaling AI Systems. Глава, атакующая количество весов напрямую — сначала обнуляя те, что не имеют значения, а затем перенося поведение большой модели в меньшую.
Зачем эта глава существует
Квантизация ужимает байты на вес. Обрезка ужимает количество весов, которые вообще перемножаются. Дистилляция знаний переносит поведение большого учителя в меньшего ученика, работающего дешевле от начала до конца. Обрезка — правка той же архитектуры, снимающая накладные расходы; дистилляция — смена архитектуры, принимающая цену обучения ради постоянной экономии на инференсе. Глава 6 обходит обе — механику, на которой каждая держится, режимы отказа, с которыми практики сталкиваются, и аппаратно-ускоренный паттерн (разрежённость 2:4), сделавший структурную обрезку экономически интересной снова на Hopper и Blackwell.
6.1 Разрежённость 2:4 — паттерн, который железо вознаграждает
Неструктурная обрезка по магнитуде — обнулить самые маленькие 50 процентов весов и коротко файнтюнить — численно работает, но не ускоряет. GPU выполняют плотные GEMM; разбросанные нули всё равно перемножаются. Структурная обрезка удаляет целые единицы, которые железо может пропустить: attention-головы, MLP-нейроны или (важный случай) N:M-паттерны внутри матриц весов. Hopper и Blackwell поддерживают разрежённость 2:4 нативно — ровно два нуля в каждой четвёрке подряд идущих весов вдоль входной размерности. Чип хранит каждую четвёрку как два ненулевых значения плюс двухбитную маску, разрежённое тензорное ядро пропускает нулевые умножения, и и пропускная, и FLOPs падают примерно вдвое. В измеренной пропускной способности декодинга это ускорение 1,7–1,9×. Хитрость в том, что 2:4 должна быть навязана во время обрезки: алгоритм обходит каждую матрицу группами по четыре и принудительно обнуляет два наименьших, затем либо коротко файнтюнит, либо применяет SparseGPT для компенсации. Маска — метаданные; экономия в рантайме — автоматическая.
6.2 Дистилляция переносит распределение учителя, а не его argmax
Обученный учитель-LLM производит в каждой позиции распределение по словарю — 128k-мерный softmax. Argmax — токен, который он выбрал бы при жадном декодинге. Но распределение кодирует неуверенность учителя, его предпочтения между близкими синонимами и его калибровку. Обучение ученика соответствовать этому распределению переносит всё это: потеря — KL-дивергенция между смягчёнными выходами учителя и ученика, с температурой, расширяющей сигнал градиента в низковероятностный хвост. Ученик, что выходит, ведёт себя как меньшая, более быстрая версия учителя, а не как меньшая модель, обученная с нуля на тех же данных. Patient Knowledge Distillation расширяет рецепт на промежуточные слои, сопоставляя скрытые состояния между связанными парами слоёв ученика и учителя. MiniLLM адресует более тонкий отказ — проблему усреднения мод, где ученик с forward-KL хеджирует между несколькими правдоподобными продолжениями учителя и производит невыразительный выход, — переключаясь на reverse-KL, который предпочитает резкое соответствие одной из мод учителя мягкому покрытию всех.
6.3 Три компрессии складываются в определённом порядке
Сначала дистиллируйте, потом обрезайте, потом квантизуйте. Дистилляция — самая дорогая и архитектурно инвазивная операция; имеет смысл сделать её один раз на плотной модели высокой точности до того, как другие выборы зафиксируются. Обрежьте ученика до 2:4 с SparseGPT и коротким восстановительным файнтюном. Квантизуйте разрежённого ученика до FP8 с llm-compressor. Рабочий стек: 70B BF16-учитель → 13B BF16-дистиллированный ученик → 2:4-разрежённый → FP8-квантизованный. Байты весов на прямой проход падают со 140 ГБ примерно до 6,5 ГБ — 22-кратное сокращение, — а пути FP8 и 2:4 в Hopper превращают это в 8–10-кратный прирост пропускной на GPU. Что стек не сокращает, так это KV-кэш, который зависит от скрытой размерности, числа голов и длины контекста, а не от числа весов. Это тема главы 8. И компрессия уровня модели — на инференс, а не на запрос; она даёт GPU запас, но именно батчинг и работа с KV из глав 7 и 8 превращают эту дешевизну в пропускную для параллельных пользователей.
Что подготавливает глава 6
Главы 5 и 6 исчерпали компрессии на стороне модели — квантизуй байты на вес, обрежь количество весов, дистиллируй модель целиком в меньшую. GPU теперь имеет запас на каждый прямой проход. Глава 7 переходит к системному рычагу, заполняющему этот запас полезной работой: батчингу. Статический батчинг почти работает и падает на проблеме первого-завершившегося. Continuous batching, с планированием на уровне итераций, — то, что запускают продакшен-движки и что превращает bandwidth-bound фазу декодинга из простаивающего чипа в чип, обслуживающий многих пользователей параллельно.
Дальше — Глава 7: Продвинутые стратегии батчинга. Статический, динамический и continuous batching — и долг, который continuous batching создаёт для KV-кэша.
torch.sparse-код для конверсии в 2:4, полный цикл дистилляции на PyTorch с KL-потерей и температурой, добавление сопоставления слоёв PKD, формулировка reverse-KL из MiniLLM и врезка In Plain English о том, почему ученики хеджируют и как их от этого отучить. LLM Primer VI на Amazon →