Перейти к содержанию

Прунинг 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

\[\text{Sparsity} = \frac{\text{Zero Weights}}{\text{Total Weights}} = 1 - \frac{\text{Non-zero Weights}}{\text{Total Weights}}\]

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} = |W_{ij}| \cdot \|X_j\|_2\]
  • \(S_{ij}\) -- importance score для веса \(W_{ij}\)
  • \(|W_{ij}|\) -- абсолютная величина веса
  • \(\|X_j\|_2\) -- L2 норма входных активаций на этом канале

Алгоритм

  1. Прогнать калибровочные данные (128 последовательностей достаточно)
  2. Посчитать нормы активаций \(\|X_j\|_2\) для каждого входного канала
  3. Для каждого веса: \(S_{ij} = |W_{ij}| \times \|X_j\|_2\)
  4. Удалить k% весов с наименьшим score per output channel
  5. Никакого дообучения -- одноразовый пас

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)

  1. Посчитать аппроксимацию Гессиана: \(H \approx X^T X\)
  2. Для каждого веса (по колонкам, left-to-right):
  3. Определить оптимальный кандидат на удаление
  4. Рассчитать компенсирующие обновления для оставшихся весов
  5. Обновить обратный Гессиан
  6. Применить все обновления

Сложность: \(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.

Самопроверка

  1. LLaMA 7B при 50% Wanda: perplexity 6.52. При 50% magnitude-only: 25.6. Почему разница 4x? Что дает учет активаций?
  2. 2:4 sparsity дает 2x speedup на A100. Почему НЕ 4:8 sparsity (тоже 50%) -- не дает 2x?
  3. Почему structured pruning при 50% дает collapse, а unstructured -- нет?

Sources

  1. arXiv — "Wanda: A Simple and Effective Pruning Approach" (2306.11695)
  2. arXiv — "SparseGPT: Prune to 50% Sparsity" (2301.00774)
  3. Nature — "Phase transitions in large language model compression" (s44387-026-00072-8)
  4. MarkTechPost — "LLM-Pruning Collection: JAX-based Repo" (Jan 2026)
  5. ICML 2025 — "SlimLLM: Accurate Structured Pruning"
  6. ACL 2025 — "STUN: Structured-Then-Unstructured Pruning for MoE"
  7. Substack — "MACKO: Making Unstructured Pruning Work" (Nov 2025)
  8. Google Research — "Sequential Attention for LLM Pruning"
  9. GitHub — "UniPruning: State-of-the-art LLM pruning"
  10. 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