Квантование & Прунинг & Дистилляция
Блог про сжатие сетей и не только.
От древнейших времен по настоящее время.
Группа с комментариями:
@quant_prune_distill_comments
Post #829
1.72K
🧩 Метод
Наиболее примечательны архитектурные изменения, позволяющие выжимать максимум из ёмкости модели при минимальных накладных расходах на активные вычисления и KV-кэш.
Каузальный энкодер-декодер
Вместо привычной декодерной архитектуры используют энкодер-декодер а-ля трансформер из статьи Vaswani и T5. Однако мотивация за этим — экономить активные параметры на префилле, а также уменьшить размер KV-кэша.
На префилле работает только энкодер, а декодер активизируется на генерации. Размеры энкодера и декодера примерно одинаковы. Декодер переиспользует кэш из энкодера, спроектированный через обучаемые линейные проекции, тем самым освобождаясь от необходимости держать собственный KV-кэш.
В отличие от BERT и тому подобных архитектур, энкодер каузальный — внимание направлено только в прошлое, что делает его совместимым с авторегрессионной генерацией.
Compressed Sparse Attention 2
В DeepSeek-V4 чередовались HCA (Heavily Compressed Attention) и CSA (Compressed Sparse Attention): одно сильно сжимало токены и делало полный аттеншен, а другое сжимало не так сильно и делало спарсный. Теперь аттеншен только один.
⚙️ Устроено оно так: поддерживается SWA (внимание со скользящим окном), которое внимает на последние токены, и иерархический sparse attention, который отбирает важные токены по всей последовательности с помощью обучаемой подсети, а потом компонуется со SWA. TopK считается на основе query/key-индексеров.
Существуют три режима слоя:
- 🔵 Full mode. Слой считает полный KV-кэш и сам определяет, какие токены ему нужны в спарсном attention. Самый гибкий, но дорогой случай.
- 🟡 Reindex mode. Используем KV-кэш с другого слоя, но считаем свой TopK, используя специфичные для данного слоя query.
- 🟢 Reuse mode. Переиспользуем как KV-кэш, так и TopK-индексы.
В энкодере на 1 Full Mode приходится 5 Reuse. В декодере — только Reuse и Reindex. Reuse к Reindex — в отношении 3:1. Потому кэш нужно хранить по факту лишь в небольшой доле слоёв.
Иерархический attention в данном слое оценивает все токены по важности, а также непрерывные блоки некоторой длины для оценки перспективных кандидатов будущими слоями. Full mode-слой отбирает перспективные блоки, а последующие Reindex mode-слои ищут TopK уже среди этого сильно порезанного пула кандидатов.
Single-pass mHC
Дабы немного повысить эффективность mHC, матрицу смешивания входов для текущего блока считают в прошлом блоке. Это позволяет лучше перекрывать передачу с вычислениями и почти не теряет в качестве.
Engram
🧠 Дабы обогатить представления признаков условной памятью, накатывают Engram с 2-, 3- и 4-граммами. Наивно накатывать их выйдет слишком накладно — ни в какую память не влезет. Потому нужный эмбед достаётся через хэширование.
Дабы уменьшить риск коллизий, используют восемь независимых хэш-таблиц. Размер каждой из них — примерно 16M токенов, но берут разные простые числа, чтобы головы были более независимы. В Engram-таблице 198B параметров, распределённых между двумя слоями. Такой распил таблицы нужен для эффективного pipeline parallelism, чтобы не было перекоса в конкретную часть модели.
На выходы модуля энграмм навешивается гейт, который решает, надо ли и с какой силой добавлять информацию от Engram-эмбеддингов в данный токен. Хранится всё в FP8.
DSpark
Отдельные MTP-головы не учат, а вместо этого поверх предобученной модели тренируют драфтер. DSpark-драфт-модель обновляется в процессе посттрейна и используется для ускорения генерации роллаутов на RL.
FP4 Cache
💾 Чтобы сэкономить на хранении KV-кэша, его квантизуют в FP4. За основу берут NVFP4, но без global scale. Вместо этого данные нормализуют так, чтобы они укладывались в целевой диапазон.
Наиболее примечательны архитектурные изменения, позволяющие выжимать максимум из ёмкости модели при минимальных накладных расходах на активные вычисления и KV-кэш.
Каузальный энкодер-декодер
Вместо привычной декодерной архитектуры используют энкодер-декодер а-ля трансформер из статьи Vaswani и T5. Однако мотивация за этим — экономить активные параметры на префилле, а также уменьшить размер KV-кэша.
На префилле работает только энкодер, а декодер активизируется на генерации. Размеры энкодера и декодера примерно одинаковы. Декодер переиспользует кэш из энкодера, спроектированный через обучаемые линейные проекции, тем самым освобождаясь от необходимости держать собственный KV-кэш.
В отличие от BERT и тому подобных архитектур, энкодер каузальный — внимание направлено только в прошлое, что делает его совместимым с авторегрессионной генерацией.
Compressed Sparse Attention 2
В DeepSeek-V4 чередовались HCA (Heavily Compressed Attention) и CSA (Compressed Sparse Attention): одно сильно сжимало токены и делало полный аттеншен, а другое сжимало не так сильно и делало спарсный. Теперь аттеншен только один.
⚙️ Устроено оно так: поддерживается SWA (внимание со скользящим окном), которое внимает на последние токены, и иерархический sparse attention, который отбирает важные токены по всей последовательности с помощью обучаемой подсети, а потом компонуется со SWA. TopK считается на основе query/key-индексеров.
Существуют три режима слоя:
- 🔵 Full mode. Слой считает полный KV-кэш и сам определяет, какие токены ему нужны в спарсном attention. Самый гибкий, но дорогой случай.
- 🟡 Reindex mode. Используем KV-кэш с другого слоя, но считаем свой TopK, используя специфичные для данного слоя query.
- 🟢 Reuse mode. Переиспользуем как KV-кэш, так и TopK-индексы.
В энкодере на 1 Full Mode приходится 5 Reuse. В декодере — только Reuse и Reindex. Reuse к Reindex — в отношении 3:1. Потому кэш нужно хранить по факту лишь в небольшой доле слоёв.
Иерархический attention в данном слое оценивает все токены по важности, а также непрерывные блоки некоторой длины для оценки перспективных кандидатов будущими слоями. Full mode-слой отбирает перспективные блоки, а последующие Reindex mode-слои ищут TopK уже среди этого сильно порезанного пула кандидатов.
Single-pass mHC
Дабы немного повысить эффективность mHC, матрицу смешивания входов для текущего блока считают в прошлом блоке. Это позволяет лучше перекрывать передачу с вычислениями и почти не теряет в качестве.
Engram
🧠 Дабы обогатить представления признаков условной памятью, накатывают Engram с 2-, 3- и 4-граммами. Наивно накатывать их выйдет слишком накладно — ни в какую память не влезет. Потому нужный эмбед достаётся через хэширование.
Дабы уменьшить риск коллизий, используют восемь независимых хэш-таблиц. Размер каждой из них — примерно 16M токенов, но берут разные простые числа, чтобы головы были более независимы. В Engram-таблице 198B параметров, распределённых между двумя слоями. Такой распил таблицы нужен для эффективного pipeline parallelism, чтобы не было перекоса в конкретную часть модели.
На выходы модуля энграмм навешивается гейт, который решает, надо ли и с какой силой добавлять информацию от Engram-эмбеддингов в данный токен. Хранится всё в FP8.
DSpark
Отдельные MTP-головы не учат, а вместо этого поверх предобученной модели тренируют драфтер. DSpark-драфт-модель обновляется в процессе посттрейна и используется для ускорения генерации роллаутов на RL.
FP4 Cache
💾 Чтобы сэкономить на хранении KV-кэша, его квантизуют в FP4. За основу берут NVFP4, но без global scale. Вместо этого данные нормализуют так, чтобы они укладывались в целевой диапазон.
- ❤ 7
- 👍 1










