Model Pruning
Il pruning del modello rimuove pesi, filtri o livelli poco importanti da una rete neurale per ridurne dimensioni e calcoli. Pruning non strutturato e strutturato, con codice.
Il pruning dei modelli rimuove i parametri che contribuiscono poco all'output di una rete neurale addestrata, dai singoli pesi fino a filtri, teste di attenzione o layer interi, per rendere il modello più piccolo ed economico da eseguire. La maggior parte delle reti è sovraparametrizzata, quindi è possibile rimuovere una grande parte dei pesi con una perdita minima di accuratezza, soprattutto se in seguito il modello viene sottoposto a fine-tuning. Un metodo di pruning e riaddestramento del 2015 ha ridotto AlexNet da 61 milioni a 6,7 milioni di parametri e VGG-16 da 138 milioni a 10,3 milioni, senza perdita di accuratezza su ImageNet. Il pruning è un passaggio standard per preparare i modelli a telefoni, fotocamere e altro hardware per l'IA edge e oggi viene applicato anche ai modelli linguistici di grandi dimensioni (LLM).
Come funziona il pruning dei modelli#
Il pruning assegna un punteggio di importanza a ogni peso o struttura candidata, rimuove la frazione con il punteggio più basso e sottopone a fine-tuning i pesi del modello rimasti per recuperare accuratezza. Il criterio più semplice e ancora più comune è il modulo: i pesi vicini a zero o i filtri con norma L1 o L2 ridotta modificano meno l'output quando vengono rimossi. Altri criteri usano gradienti o attivazioni per stimare quanto aumenterebbe la perdita senza ogni componente. Rimuovere una grande frazione in una sola volta tende a danneggiare l'accuratezza, quindi il pruning viene di solito eseguito a più riprese, ciascuna seguita dal fine-tuning, finché il modello non raggiunge la dimensione desiderata o l'accuratezza non scende sotto la soglia tollerata:
Il pruning ha anche cambiato il modo in cui i ricercatori concepiscono le dimensioni delle reti. L'ipotesi del biglietto della lotteria sostiene che una rete densa contenga piccole sottoreti che, addestrate isolatamente a partire dai pesi iniziali originali, raggiungono l'accuratezza della rete completa, e gli autori hanno costantemente individuato sottoreti di dimensioni inferiori al 10-20% di quelle originali su MNIST e CIFAR-10.
Pruning non strutturato e strutturato#
Il pruning non strutturato azzera singoli pesi in qualsiasi punto di un tensore. Raggiunge un'elevata sparsità con una perdita minima di accuratezza, ma i tensori mantengono la stessa forma, quindi i kernel densi standard eseguono lo stesso lavoro e per accelerare servono kernel sparsi o il supporto hardware. Le GPU NVIDIA dalla generazione Ampere in poi eseguono uno di questi pattern, la sparsità 2:4 con due zeri ogni quattro pesi consecutivi, a una velocità di calcolo fino al doppio rispetto a quella densa. Il pruning strutturato rimuove interi filtri, canali, teste o layer, producendo un modello denso più piccolo che funziona più velocemente su qualsiasi processore, ma con un costo maggiore in termini di accuratezza a parità di pesi rimossi. La rimozione di un filtro elimina anche il canale di input corrispondente del layer successivo e librerie come Torch-Pruning tracciano automaticamente queste dipendenze. Le utility di pruning di PyTorch mostrano la differenza tra i due metodi:
import torch
from torch.nn.utils import prune
# Two identical convolution layers, one for each pruning style
torch.manual_seed(0)
a = torch.nn.Conv2d(16, 32, kernel_size=3)
b = torch.nn.Conv2d(16, 32, kernel_size=3)
# Unstructured: zero the 50% of individual weights with the smallest magnitude
prune.l1_unstructured(a, name="weight", amount=0.5)
# Structured: zero the 50% of output filters with the smallest L2 norm
prune.ln_structured(b, name="weight", amount=0.5, n=2, dim=0)
for name, layer in [("unstructured", a), ("structured", b)]:
zeros = (layer.weight == 0).float().mean().item()
empty = (layer.weight.flatten(1) == 0).all(dim=1).sum().item()
print(f"{name}: {zeros:.0%} of weights zero, {empty} of 32 filters empty")Entrambi i layer finiscono con il 50% dei pesi a zero. Solo il layer strutturato ha filtri vuoti, 16 su 32; eliminarli lascia un layer denso con metà dei filtri e dimezza i calcoli sull'hardware ordinario. Anche l'hardware progettato per la sparsità trae vantaggio dal metodo non strutturato: l'integrazione CVflow di Ambarella per Ultralytics YOLO, mantenuta da Ambarella nel proprio fork del pacchetto, esegue il pruning progressivo dei pesi durante l'addestramento di YOLO e mantiene tale sparsità durante l'esportazione ONNX per la compilazione sui suoi chip IA edge.
Pruning e tecniche correlate#
- Quantizzazione dei modelli: Riduce la precisione di ogni peso, ad esempio da numeri in virgola mobile a 32 bit a interi a 8 bit, mantenendoli tutti. Spesso pruning e quantizzazione vengono combinati, perché il pruning riduce il numero di operazioni e la quantizzazione rende ciascuna di esse meno costosa.
- Distillazione della conoscenza: Addestra un modello allievo più piccolo a imitare un modello insegnante più grande e spesso segue il pruning strutturato per recuperare l'accuratezza persa rimuovendo interi filtri o layer.
- Dropout: Azzera temporaneamente attivazioni casuali durante l'addestramento come forma di regolarizzazione; in inferenza si usa la rete completa.
Pruning dei modelli linguistici di grandi dimensioni#
Riaddestrare un LLM dopo ogni fase di pruning costa troppo, quindi i metodi one-shot lo potano in un solo passaggio usando un piccolo set di calibrazione. SparseGPT ha portato i modelli OPT da 175 miliardi di parametri e BLOOM da 176 miliardi al 60% di sparsità non strutturata in meno di 4,5 ore, con un aumento trascurabile della perplessità, e supporta anche il pattern 2:4 accelerato dalle GPU. Il pruning strutturato combinato con la distillazione della conoscenza produce modelli densi più piccoli: Minitron di NVIDIA ha derivato modelli da 8B e 4B da un modello preaddestrato da 15B potando i canali degli embedding, i neuroni MLP e le teste di attenzione, per poi riaddestrarli con fino a 40 volte meno token rispetto all'addestramento da zero.










