Calcola l’efficienza computazionale dei modelli di Deep Learning con FLOPs e MACs.

Calcola l'efficienza computazionale dei modelli di Deep Learning con FLOPs e MACs. -> Calculate computational efficiency of Deep Learning models using FLOPs and MACs.

In questo articolo impareremo la sua definizione, le differenze e come calcolare FLOPs e MACs usando pacchetti Python.

Cosa sono FLOPs e MACs?

FLOPs (Floating Point Operations) e MACs (Multiply-Accumulate Operations) sono metriche comunemente utilizzate per calcolare la complessità computazionale dei modelli di deep learning. Sono un modo veloce e facile per comprendere il numero di operazioni aritmetiche necessarie per eseguire una determinata computazione. Ad esempio, quando si lavora con diverse architetture di modelli come MobileNet o DenseNet per dispositivi edge, le persone utilizzano MACs o FLOPs per stimare le prestazioni del modello. Inoltre, il motivo per cui usiamo il termine “stimare” è che entrambe le metriche sono approssimazioni invece della cattura effettiva delle prestazioni di runtime del modello. Tuttavia, possono ancora fornire informazioni molto utili sul consumo di energia o sui requisiti di calcolo, il che è abbastanza utile nell’edge computing.

FLOPs si riferisce specificamente al numero di operazioni in virgola mobile, che includono operazioni di addizione, sottrazione, moltiplicazione e divisione su numeri in virgola mobile. Queste operazioni sono diffuse in molte computazioni matematiche coinvolte nell’apprendimento automatico, come moltiplicazioni di matrici, attivazioni e calcoli del gradiente. FLOPs sono spesso utilizzati per misurare il costo o la complessità computazionale di un modello o di una specifica operazione all’interno di un modello. Ciò è utile quando è necessario fornire una stima del numero totale di operazioni aritmetiche richieste, che viene generalmente utilizzato nel contesto della misurazione dell’efficienza del calcolo.

MACs, d’altra parte, contano solo il numero di operazioni di moltiplicazione-accumulo, che coinvolgono la moltiplicazione di due numeri e l’aggiunta del risultato. Questa operazione è fondamentale per molte operazioni di algebra lineare, come le moltiplicazioni di matrici, le convoluzioni e i prodotti puntuali. MACs sono spesso utilizzati come misura più specifica della complessità computazionale in modelli che si basano pesantemente su operazioni di algebra lineare, come le reti neurali convoluzionali (CNN).

Una cosa degna di nota qui è che FLOPs non possono essere l’unico fattore che le persone calcolano per avere un’idea dell’efficienza di calcolo. Molti altri fattori sono considerati necessari quando si stima l’efficienza del modello. Ad esempio, quanto è parallelo l’ambiente di sistema; quale architettura usa il modello (ad esempio, i costi di convoluzione di gruppo in MACs); quale piattaforma di calcolo utilizza il modello (ad esempio, Cudnn ha l’accelerazione GPU per le reti neurali profonde e le operazioni standard come il forward o la normalizzazione sono altamente ottimizzate).

Sono FLOPS e FLOPs la stessa cosa?

FLOPS con tutte le lettere maiuscole è l’abbreviazione di “operazioni in virgola mobile al secondo”, che si riferisce alla velocità di calcolo e viene generalmente utilizzato come misura delle prestazioni hardware. La “S” in “FLOPS” sta per “secondo” e insieme a “P” (come “per”), viene generalmente utilizzata per rappresentare un tasso.

FLOPs (con la lettera minuscola “s” indica il plurale), d’altra parte, si riferisce alle operazioni in virgola mobile. Viene comunemente utilizzato per calcolare la complessità computazionale di un algoritmo o di un modello. Tuttavia, nella discussione sull’AI, a volte FLOPs può avere entrambi i significati sopra menzionati e si lascerà al lettore identificare quello esatto a cui si riferisce. Inoltre, ci sono state alcune discussioni che chiedono alle persone di abbandonare completamente l’uso di “FLOPs” e utilizzare invece “FLOP” in modo da rendere più facile distinguere tra l’uno e l’altro. In questo articolo, continueremo a usare FLOPs.

Relazione tra FLOPs e MACs

Come menzionato nella sezione precedente, la differenza principale tra FLOPs e MACs include quali tipi di operazioni aritmetiche contano e il contesto in cui vengono utilizzati. Il consenso generale della comunità dell’AI, come il commento di GitHub nella Figura 2, è che un MACs equivale approssimativamente a due FLOPs. Per le reti neurali profonde, le operazioni di moltiplicazione-accumulo sono pesanti nei calcoli, quindi i MACs sono considerati più significativi.

Come Calcolare FLOPs?

La buona notizia è che ci sono già diverse librerie open source disponibili per il calcolo specifico di FLOPs in modo da non doverlo implementare da zero. Alcune delle più popolari includono flops-counter.pytorch e pytorch-OpCounter. Ci sono anche pacchetti come torchstat che forniscono agli utenti un analizzatore di rete generale basato su PyTorch. Vale anche la pena notare che per questi pacchetti le funzionalità e i modelli supportati sono limitati. Quindi, se si esegue un modello che consiste in strati di rete personalizzati, potrebbe essere necessario calcolare i FLOPs da soli.

Qui mostriamo un esempio di codice per calcolare i FLOPs utilizzando pytorch-OpCounter e un alexnet pre-addestrato di torchvision:

from torchvision.models import alexnet
from thop import profile

model = alexnet()
input = torch.randn(1, 3, 224, 224)
macs, params = profile(model, inputs=(input, ))

Conclusione

In questo articolo, abbiamo presentato la definizione di FLOPs e MACs, quando vengono di solito utilizzati e la differenza tra le due caratteristiche.

Riferimenti

  • https://github.com/sovrasov/flops-counter.pytorch
  • https://github.com/Lyken17/pytorch-OpCounter
  • https://github.com/Swall0w/torchstat
  • https://arxiv.org/pdf/1704.04861.pdf
  • https://arxiv.org/abs/1608.06993

Danni Li è l’attuale AI Resident presso Meta. È interessata alla costruzione di sistemi AI efficienti e il suo attuale focus di ricerca è sui modelli di ML on-device. È anche una forte sostenitrice della collaborazione open source e dell’utilizzo del supporto della comunità per massimizzare il nostro potenziale di innovazione.