Прунинг LLM¶
~8 минут чтения
Предварительно: квантизация LLM, дистилляция знаний
Зачем это нужно¶
Llama 3.1 70B занимает 140 GB в FP16. Для инференса на одном GPU это нереально. Прунинг удаляет "лишние" веса -- те, которые вносят минимальный вклад в output. Модель становится легче, но сохраняет 90-95% качества.
Аналогия: представьте оркестр из 100 музыкантов. Некоторые играют так тихо, что их не слышно на фоне остальных. Если убрать 30-50 самых тихих, слушатель почти не заметит разницы -- но аренда зала станет вдвое дешевле.
Три вопроса прунинга: какие веса удалить (importance metric), сколько удалить (sparsity level), и как удалить -- поштучно (unstructured) или целыми блоками (structured). Ответ на каждый -- trade-off между качеством и скоростью.
Ландшафт прунинга (2026)¶
| Method | Sparsity | Hardware | Accuracy | Speed |
|---|---|---|---|---|
| Unstructured (Wanda) | 50-70% | Specialized | High | Varies |
| Structured (SlimLLM) | 30-50% | Any | Medium-High | Guaranteed |
| Semi-structured (N:M) | 50% | Sparse Tensor Cores | High | 2x |
| Hybrid (STUN) | 50-60% | Any | High | Good |
Типы прунинга¶
graph TD
P["Pruning"] --> U["Unstructured<br/>Отдельные веса"]
P --> S["Structured<br/>Нейроны/головы/слои"]
P --> NM["Semi-structured (N:M)<br/>Фиксированный паттерн"]
U --> UH["Hardware: Sparse Tensor Cores<br/>Sparsity: 50-70%"]
S --> SH["Hardware: любое<br/>Sparsity: 30-50%"]
NM --> NMH["Hardware: A100/H100<br/>Sparsity: ровно 50%"]
style P fill:#e8eaf6,stroke:#3f51b5
style U fill:#e8f5e9,stroke:#4caf50
style S fill:#fff3e0,stroke:#ef6c00
style NM fill:#f3e5f5,stroke:#9c27b0
style UH fill:#e8f5e9,stroke:#4caf50
style SH fill:#fff3e0,stroke:#ef6c00
style NMH fill:#f3e5f5,stroke:#9c27b0
| Тип | Что удаляется | Sparsity | Speedup | Hardware |
|---|---|---|---|---|
| Unstructured | Отдельные веса (random позиции) | 50-70% | Требует sparse kernels | Ampere+ Sparse TC |
| Structured | Целые нейроны, attention heads, слои | 30-50% | Реальный на любом HW | Любое |
| Semi-structured (N:M) | 2 из 4 весов в каждой группе | Ровно 50% | 2x гарантированный | A100/H100 |
Sparsity Formula¶
Phase Transitions (Nature 2026)¶
| Sparsity Level | Unstructured | Structured |
|---|---|---|
| < 30% | Minimal loss | Minimal loss |
| 30-50% | Small loss | Moderate loss |
| 50-70% | Moderate loss | COLLAPSE |
| > 70% | COLLAPSE | COLLAPSE |
Wanda (Pruning by Weights and Activations)¶
Paper: "A Simple and Effective Pruning Approach for LLMs" (ICLR 2024, arXiv 2306.11695)
Ключевой инсайт: важность веса определяется не только его величиной, но и тем, насколько большие активации через него проходят. Маленький вес на "горячем" канале важнее большого веса на "холодном".
Формула важности¶
- \(S_{ij}\) -- importance score для веса \(W_{ij}\)
- \(|W_{ij}|\) -- абсолютная величина веса
- \(\|X_j\|_2\) -- L2 норма входных активаций на этом канале
Алгоритм¶
- Прогнать калибровочные данные (128 последовательностей достаточно)
- Посчитать нормы активаций \(\|X_j\|_2\) для каждого входного канала
- Для каждого веса: \(S_{ij} = |W_{ij}| \times \|X_j\|_2\)
- Удалить k% весов с наименьшим score per output channel
- Никакого дообучения -- одноразовый пас
Wanda Performance¶
| Model | Sparsity | Perplexity (WikiText2) |
|---|---|---|
| LLaMA-7B | 0% (dense) | 5.68 |
| LLaMA-7B | 50% Wanda | 6.52 |
| LLaMA-7B | 50% Magnitude | 25.6 |
| LLaMA-7B | 50% SparseGPT | 6.58 |
SparseGPT¶
Paper: "SparseGPT: Prune to 50% Sparsity" (arXiv 2301.00774)
Ключевой инсайт: удалив один вес, можно скомпенсировать ошибку, слегка подправив оставшиеся. Hessian матрица (второй порядок) подсказывает точно, какие веса как подправить.
Алгоритм (на основе Optimal Brain Surgeon)¶
- Посчитать аппроксимацию Гессиана: \(H \approx X^T X\)
- Для каждого веса (по колонкам, left-to-right):
- Определить оптимальный кандидат на удаление
- Рассчитать компенсирующие обновления для оставшихся весов
- Обновить обратный Гессиан
- Применить все обновления
Сложность: \(O(d^3)\) на слой -- дорого, но точнее Wanda. ~4 часа на 65B модель.
Wanda vs SparseGPT¶
| Aspect | Wanda | SparseGPT |
|---|---|---|
| Speed | Fast (minutes) | Slow (hours) |
| Memory | Low | High (Hessian) |
| Accuracy | Comparable | Slightly better |
| Complexity | Simple | Complex |
| Best for | Quick experiments | Best quality |
Structured Pruning¶
SlimLLM (ICML 2025)¶
Structured pruning с layer-wise sparsity allocation -- не все слои одинаково избыточны. Ранние слои (low-level features) обычно менее prunable, поздние -- более.
STUN: Structured-Then-Unstructured (ACL 2025)¶
Гибрид: сначала structured pruning (удаление целых голов/нейронов -- работает на любом hardware), затем unstructured refinement (дополнительная sparsity на оставшейся структуре).
graph LR
ORIG["Original Model"] --> S["Phase 1: Structured<br/>Удалить целые головы/нейроны"]
S --> U["Phase 2: Unstructured<br/>Fine-grained weight removal"]
U --> RES["Result: Hardware-friendly<br/>+ высокая sparsity"]
style ORIG fill:#e8eaf6,stroke:#3f51b5
style S fill:#fff3e0,stroke:#ef6c00
style U fill:#e8f5e9,stroke:#4caf50
style RES fill:#f3e5f5,stroke:#9c27b0
Sequential Attention (Google Research)¶
| Aspect | Details |
|---|---|
| Focus | Attention head pruning |
| Key Innovation | Sequential selection |
| Application | Head-level + embedding sparsity |
Semi-Structured Pruning (N:M)¶
Паттерн 2:4¶
В каждой группе из 4 весов ровно 2 обнуляются: [1.2, 0, 3.4, 0] [0, 2.1, 0, 1.8].
Регулярный паттерн позволяет NVIDIA Sparse Tensor Cores пропускать нули аппаратно -- гарантированный 2x speedup без custom kernels. Ограничение: ровно 50% sparsity, ни больше ни меньше.
N:M Performance¶
| Hardware | Speedup (2:4) | Speedup (4:8) |
|---|---|---|
| A100 | 1.8-2.0x | 1.5-1.8x |
| H100 | 2.0-2.5x | 1.8-2.0x |
| CPU | No speedup | No speedup |
MACKO (2025)¶
Paper: "Making Unstructured Pruning Work" (Nov 2025)
Прорыв: впервые 50% unstructured sparsity оправдана в продакшене. MACKO преодолевает hardware inefficiency unstructured pruning, добиваясь реальных speedups на 50% sparsity.
Сравнение методов¶
Обзор¶
| Feature | Wanda | SparseGPT | SlimLLM | STUN |
|---|---|---|---|---|
| Type | Unstructured | Unstructured | Structured | Hybrid |
| Retraining | No | No | Optional | Optional |
| Max Sparsity | 50% | 60% | 50% | 60% |
| Speed | Fast | Slow | Medium | Medium |
| Hardware | Special | Special | Any | Any |
| MoE Support | Limited | Limited | Good | Good |
Accuracy vs Sparsity¶
| Sparsity | Dense | Wanda | SparseGPT | Structured |
|---|---|---|---|---|
| 0% | 100% | - | - | - |
| 25% | - | 98% | 98.5% | 96% |
| 50% | - | 95% | 95.5% | 88% |
| 60% | - | 90% | 92% | 75% |
| 70% | - | 80% | 85% | Collapse |
Практические рекомендации¶
Decision Tree: выбор метода¶
graph TD
START{"Какой hardware?"} -->|"A100/H100<br/>Sparse Tensor Cores"| NM["N:M (2:4) sparsity<br/>50%, 2x speedup"]
START -->|"GPU без Sparse TC"| Q2{"Нужен speedup<br/>или memory?"}
Q2 -->|"Memory savings"| WANDA["Wanda unstructured 50%<br/>Быстро, просто"]
Q2 -->|"Real speedup"| STRUCT["Structured 30-40%<br/>Любой hardware"]
START -->|"Max compression"| STUN["STUN hybrid 50-60%<br/>Structured + Unstructured"]
style NM fill:#f3e5f5,stroke:#9c27b0
style WANDA fill:#e8f5e9,stroke:#4caf50
style STRUCT fill:#fff3e0,stroke:#ef6c00
style STUN fill:#e8eaf6,stroke:#3f51b5
Use Case Matrix¶
| Use Case | Recommended | Sparsity | Reason |
|---|---|---|---|
| Edge deployment | Structured | 30-40% | Any hardware |
| Cloud GPU | N:M 2:4 | 50% | Sparse TC speedup |
| Research | Wanda | 50% | Fast, easy |
| Production | STUN | 50% | Balance accuracy/speed |
| MoE models | STUN | 40-50% | MoE-specific handling |
Ключевые числа для интервью¶
| Method | Safe Sparsity | Collapse Point |
|---|---|---|
| Unstructured | 50% | 70%+ |
| Structured | 40% | 50%+ |
| N:M 2:4 | 50% (fixed) | N/A |
Speedups¶
| Hardware | Unstructured 50% | Structured 50% | N:M 2:4 |
|---|---|---|---|
| A100 | 0.8-1.2x | 1.5-2x | 1.8-2x |
| H100 | 0.9-1.3x | 1.8-2.5x | 2.0-2.5x |
| CPU | 0.5-0.8x | 1.2-1.5x | No speedup |
Processing Time¶
| Model | Wanda | SparseGPT | Structured |
|---|---|---|---|
| 7B | 1-5 min | 30-60 min | 5-15 min |
| 70B | 30-60 min | 4-8 hours | 1-2 hours |
Memory Savings¶
| Sparsity | 7B Model | 70B Model |
|---|---|---|
| 0% | 14 GB | 140 GB |
| 50% | 7 GB | 70 GB |
| 60% | 5.6 GB | 56 GB |
Для интервью¶
Q: "В чем разница между structured и unstructured pruning?"¶
Strong: "Unstructured удаляет отдельные веса -- дает sparsity 50-70% с минимальной потерей качества, но нужны sparse tensor cores (Ampere+) для реального ускорения. Structured удаляет целые нейроны/головы/слои -- дает реальный speedup на любом hardware, но quality drop больше при > 40%. Semi-structured N:M -- компромисс: 2:4 паттерн на A100/H100 дает 2x speedup при 50% sparsity."
Red flag: "Structured -- это когда pruning по структуре, unstructured -- без структуры" (тавтология без содержания).
Q: "Wanda vs SparseGPT -- когда что?"¶
Strong: "Wanda: magnitude x activation norm, per-channel pruning, без дообучения. 5 минут на 7B модель, comparable accuracy. SparseGPT: second-order (Hessian), error compensation -- точнее на 0.5-1 ppl, но 30-60 минут на 7B. Для quick experiments и итераций -- Wanda. Для финального production model -- SparseGPT."
Red flag: "SparseGPT лучше потому что новее" (хронологически Wanda новее SparseGPT).
Q: "Можно ли обрезать 90% весов LLM?"¶
Strong: "Phase transition: unstructured до 50% -- minimal loss, 50-70% -- moderate, > 70% -- collapse. Structured еще строже: > 50% collapse. Nature 2026 показала что это фазовый переход, а не плавная деградация. Для 90% compression лучше комбинировать: prune 50% + quantize INT4 = effective 87.5% compression."
Red flag: "Да, pruning удаляет ненужные веса, нужно просто найти правильный порог" (игнорирует phase transition).
Q: "Design: оптимальная pipeline компрессии 70B модели"¶
Strong: "P-KD-Q pipeline: (1) Structured pruning 30-40% (удалить головы + FFN), (2) Knowledge distillation от оригинала (teacher) для recovery, (3) Quantization INT4/FP8 последним шагом. Порядок критичен -- quantization ДО distillation вызывает perplexity spike на порядок. Итого: 70B -> ~45B (prune) -> 45B recovered (KD) -> ~12 GB FP4."
Pruned модель НЕ быстрее без hardware support
Главное заблуждение: "50% sparsity = 2x speedup". На стандартном GPU sparse матрица обрабатывается ТАК ЖЕ медленно, как dense -- нули все равно считаются. Реальный speedup только на: (1) NVIDIA Sparse Tensor Cores (N:M sparsity, Ampere+), (2) специализированных sparse inference engines (MACKO 2025), (3) structured pruning (удаление целых computation units). Правило: unstructured sparsity = memory savings, structured pruning = latency savings.
Самопроверка
- LLaMA 7B при 50% Wanda: perplexity 6.52. При 50% magnitude-only: 25.6. Почему разница 4x? Что дает учет активаций?
- 2:4 sparsity дает 2x speedup на A100. Почему НЕ 4:8 sparsity (тоже 50%) -- не дает 2x?
- Почему structured pruning при 50% дает collapse, а unstructured -- нет?
Sources¶
- arXiv — "Wanda: A Simple and Effective Pruning Approach" (2306.11695)
- arXiv — "SparseGPT: Prune to 50% Sparsity" (2301.00774)
- Nature — "Phase transitions in large language model compression" (s44387-026-00072-8)
- MarkTechPost — "LLM-Pruning Collection: JAX-based Repo" (Jan 2026)
- ICML 2025 — "SlimLLM: Accurate Structured Pruning"
- ACL 2025 — "STUN: Structured-Then-Unstructured Pruning for MoE"
- Substack — "MACKO: Making Unstructured Pruning Work" (Nov 2025)
- Google Research — "Sequential Attention for LLM Pruning"
- GitHub — "UniPruning: State-of-the-art LLM pruning"
- arXiv — "LLMs can Compress LLMs: Adaptive Pruning by Agents" (2601.09694)
50% unstructured sparsity 'бесплатно' -- но только с hardware support
SparseGPT и Wanda показывают < 1% quality loss при 50% sparsity. НО: без hardware support (NVIDIA A100 sparse tensor cores, Ampere+) sparse модель НЕ быстрее dense. CPU/старые GPU не умеют skip нулевых весов. Structured pruning (удаление целых attention heads/layers) дает реальное ускорение на любом hardware, но с большей потерей качества. Правило: unstructured sparsity для memory savings + Ampere+, structured pruning для latency savings на любом hardware.
See Also¶
- Квантизация LLM -- альтернативный подход к компрессии: снижение точности вместо удаления весов, часто комбинируют (P-KD-Q)
- Дистилляция знаний LLM -- третий подход: обучить маленькую модель, оптимальный pipeline = prune -> distill -> quantize
- Оптимизация инференса -- pruning как часть общей стратегии оптимизации inference
- Эффективные трансформеры -- архитектурные подходы к эффективности: Mamba, linear attention, MoE
- ML на устройствах -- edge deployment, где pruning критичен для ограниченных ресурсов