Ottimizza i modelli di machine learning con il model pruning. Ottieni un'inferenza più rapida, un utilizzo ridotto della memoria e un'efficienza energetica per implementazioni con risorse limitate.
La potatura del modello è una tecnica di ottimizzazione dei modelli per ridurre le dimensioni e la complessità computazionale delle reti reti neurali rimuovendo i parametri non necessari. parametri non necessari. Quando i modelli di intelligenza artificiale si ingrandiscono per raggiungere prestazioni più elevate, spesso diventano parametrizzati, contenenti molte connessioni o neuroni che contribuiscono poco all'output finale. Identificando ed eliminando ed eliminando questi componenti ridondanti, gli sviluppatori possono creare modelli più snelli che richiedono meno memoria ed energia, fornendo al contempo un'inferenza più veloce in tempo reale. e di energia, garantendo al contempo un'inferenza più rapida in tempo reale. Questo processo è particolarmente importante per l'implementazione di architetture sofisticate quali YOLO11 su hardware in cui le risorse sono scarse, come i telefoni cellulari o sensori incorporati.
Il processo di potatura si articola in tre fasi principali: formazione, potatura e perfezionamento. messa a punto. Inizialmente, un modello di grandi dimensioni viene addestrato convergenza per catturare caratteristiche complesse. Durante la fase di pruning, un algoritmo valuta l'importanza di specifici parametri, di solito parametri specifici, solitamente weights and biases-in base a criteri come criteri come l'ampiezza o la sensibilità. I parametri ritenuti insignificanti vengono azzerati o eliminati del tutto.
Tuttavia, il semplice taglio di parti di una rete può degradarne l'accuratezza. precisione. Per ovviare a questo inconveniente, il modello viene sottoposto a un un successivo ciclo di riqualificazione, noto come fine-tuning. Questa fase consente ai parametri rimanenti di adattarsi e compensare le connessioni mancanti, spesso riportando le prestazioni del modello a livelli vicini a quelli originali. L'efficacia di questo efficacia di questo approccio è supportata dall'ipotesi del Ipotesi del biglietto della lotteria, che suggerisce che le reti dense contengano sottoreti più piccole in grado di raggiungere un'accuratezza paragonabile se addestrate in modo isolato.
Le strategie di potatura sono generalmente classificate in base alla struttura dei componenti da rimuovere:
Sebbene entrambe siano tecniche di ottimizzazione molto diffuse, è importante distinguere il pruning dalla quantizzazione del modello. La potatura si concentra sulla riduzione il numero di parametri (connessioni o neuroni), modificando di fatto l'architettura del modello. Al contrario, la quantizzazione quantizzazione riduce la precisione dei parametri, ad esempio convertendo i numeri in virgola mobile a 32 bit in numeri a 8 bit. a 32 bit in numeri interi a 8 bit. Questi metodi sono spesso complementari; uno sviluppatore potrebbe prima sfrondare un modello per rimuovere la ridondanza e poi quantificarlo. per rimuovere la ridondanza e poi quantizzarlo per ridurre ulteriormente l'ingombro in memoria per la distribuzione. distribuzione.
La potatura gioca un ruolo fondamentale nel rendere la visione computerizzata avanzata accessibile in scenari pratici:
Framework come PyTorch forniscono utilità integrate per applicare di potatura in modo programmatico. L'esempio seguente mostra come applicare il pruning non strutturato a un livello convoluzionale, un'operazione comune prima di esportare un modello in un formato ottimizzato come il un'operazione comune prima di esportare un modello in un formato ottimizzato, come ad esempio ONNX.
import torch
import torch.nn.utils.prune as prune
# Initialize a standard convolutional layer
layer = torch.nn.Conv2d(in_channels=3, out_channels=64, kernel_size=3)
# Apply L1 unstructured pruning to remove 30% of the connections
# This sets the smallest 30% of weights (by absolute value) to zero
prune.l1_unstructured(layer, name="weight", amount=0.3)
# Verify sparsity: calculate the percentage of zero parameters
sparsity = float(torch.sum(layer.weight == 0)) / layer.weight.nelement()
print(f"Layer sparsity: {sparsity:.2%}")