- La conversione a ONNX consente l'interoperabilità tra diversi framework di intelligenza artificiale e l'ottimizzazione hardware tramite ONNX Runtime.
- È essenziale attivare la modalità di inferenza con model.eval() per evitare errori in livelli come Dropout o BatchNorm.
- La quantizzazione a INT8 è fondamentale per ridurre la latenza e il consumo energetico nelle implementazioni mobili e nelle NPU.
- La convalida post-esportazione con strumenti come Netron garantisce che l'architettura e i tensori siano corretti.
Se avete passato le ultime ore a lottare con PyTorch per addestrare un modello che funzioni alla perfezione nel vostro ambiente di sviluppo, sapete che la parte difficile sta per arrivare: la distribuzione. Avere un file .pth è ottimo per salvare i progressi, ma quando volete che la vostra IA funzioni in un'applicazione Windows, su un dispositivo Android o persino nel cloud, questo formato non è sufficiente. È qui che entra in gioco ONNX (Open Neural Network Exchange) , che funge da traduttore universale e permette al vostro modello di comunicare con diversi framework e hardware senza problemi.
Convertire le reti neurali a questo standard non significa solo garantire la compatibilità, ma anche ottimizzare le prestazioni in modo che l'inferenza non rappresenti un collo di bottiglia. Che si tratti di sfruttare la potenza di una GPU NVIDIA con CUDA , l'efficienza di una NPU in un dispositivo mobile o la versatilità di una CPU con ONNX Runtime, il processo di esportazione è il ponte necessario per passare da un prototipo di laboratorio a un prodotto reale che gli utenti possono utilizzare senza che i loro dispositivi si surriscaldino.
Il processo di esportazione tecnica da PyTorch

Per esportare il modello in formato ONNX, lo strumento chiave è la funzione `torch.onnx.export()` . Questa funzione esegue il modello con input fittizi e registra ogni operatore matematico utilizzato per calcolare l'output, creando così un grafico computazionale. Un dettaglio cruciale da non trascurare è l'attivazione della modalità di inferenza tramite `model.eval()` o `model.train(False) `. Se si salta questo passaggio, layer come Dropout o Batch Normalization continueranno a comportarsi come se fossero in fase di addestramento, compromettendo completamente le previsioni in produzione.
Per eseguire la conversione, è necessario definire un tensore di input fittizio che corrisponda esattamente alle dimensioni che il modello si aspetta di ricevere. Ad esempio, se si lavora con immagini RGB da 32x32 pixel e una dimensione del batch pari a uno, il tensore dovrebbe riflettere tale struttura. Durante l'esportazione, è possibile configurare parametri critici come ` opset_version` (che definisce la versione standard ONNX) e ` constant_folding` , che ottimizza il modello eliminando i calcoli di costanti ridondanti.
Inoltre, è fortemente consigliato definire input_names e output_names in modo che, quando caricate il modello su un'altra piattaforma, sappiate esattamente come vengono chiamati i layer di input e output. Se il vostro modello deve accettare diverse dimensioni di batch in tempo reale, dovete configurare dynamic_axes , consentendo che la dimensione del batch sia variabile e non fissa a un numero specifico.
Casi specifici: modelli di visione artificiale e YOLO

Nei progetti di visione artificiale, come la classificazione delle immagini con ResNet18, il formato dei dati a volte non è perfetto fin dall'inizio. È frequente dover creare ulteriori livelli di pre-elaborazione , come un livello di ridimensionamento o un livello di permutazione delle dimensioni (per passare da un formato all'altro), per rendere il modello compatibile con strumenti come BigQuery ML. Una volta esportato, il file .onnx può essere caricato sul cloud e utilizzato per eseguire inferenze in blocco su tabelle di oggetti utilizzando funzioni come ML.PREDICT.
D'altro canto, se si utilizza la famiglia di modelli YOLO (come YOLOv8 o versioni successive), l'esportazione è molto più semplice grazie agli strumenti di Ultralytics. La conversione di questi modelli in ONNX consente una notevole accelerazione dell'inferenza , soprattutto sulla CPU, dove l'utilizzo di ONNX Runtime può rendere il modello fino al 43% più veloce rispetto ad altre implementazioni. Questo è fondamentale per le applicazioni di rilevamento di oggetti in tempo reale, dove ogni millisecondo conta.
Implementazione su dispositivi mobili e hardware reale

Portare l'intelligenza artificiale sui dispositivi (IA on-device) in ecosistemi come Android è una sfida a causa della frammentazione hardware. Eseguire un modello su una CPU, compatibile con tutto ma lenta, non è la stessa cosa che eseguirlo su una GPU o una NPU , che sono estremamente veloci ma molto esigenti in termini di formato del modello. Il flusso di lavoro tipico prevede la conversione da PyTorch a ONNX e poi la conversione in formati come TFLite o LiteRT per sfruttare i delegati hardware di Qualcomm o Google Tensor.
Per evitare che il modello consumi eccessivamente la batteria o surriscaldi il telefono, è fondamentale applicare tecniche di quantizzazione . Ciò comporta la riduzione della precisione dei pesi del modello (ad esempio, da Float32 a INT8). Sebbene si ottenga una leggera perdita di precisione, la riduzione dell'utilizzo della memoria e il guadagno in termini di velocità sono così significativi che questa pratica è diventata standard per qualsiasi app in produzione. Prima di lanciare l'app, è fondamentale eseguire benchmark su dispositivi reali per identificare i livelli che causano colli di bottiglia.
Analisi e validazione del modello esportato

Una volta ottenuto il file .onnx, non date per scontato che tutto sia corretto. L'utilizzo di strumenti di visualizzazione come Netron vi permette di aprire il modello ed esplorarne l'architettura, verificando che i tensori di input e output abbiano il tipo di dati corretto (solitamente Float32). In questa fase potete confermare che il modello restituisca, ad esempio, un vettore di probabilità per ciascuna etichetta di classe.
Poiché durante l'esportazione è possibile applicare ottimizzazioni come la potatura o la distillazione del modello , è fondamentale convalidare nuovamente l'accuratezza del modello esportato. Non dare per scontato che l'accuratezza ottenuta in PyTorch rimanga invariata; esegui dei test con un dataset di validazione sul file ONNX per assicurarti che la qualità della previsione rimanga accettabile prima di integrarlo nell'applicazione finale.
Padroneggiare la transizione da PyTorch a ONNX consente a qualsiasi sviluppatore di superare le barriere degli ambienti di training e implementare soluzioni di intelligenza artificiale scalabili. Dalla corretta configurazione della modalità di inferenza e dall'utilizzo di tensori simulati, all'ottimizzazione per la quantizzazione mobile e alla validazione visiva con strumenti esterni, ogni passaggio garantisce che il modello sia efficiente e compatibile. In definitiva, si tratta di scegliere il runtime e l'hardware di destinazione più adatti per trasformare un file di pesi in uno strumento veloce e funzionale.
Scrittore appassionato del mondo dei byte e della tecnologia in generale. Adoro condividere le mie conoscenze attraverso la scrittura, ed è quello che farò in questo blog, mostrarti tutte le cose più interessanti su gadget, software, hardware, tendenze tecnologiche e altro ancora. Il mio obiettivo è aiutarti a navigare nel mondo digitale in modo semplice e divertente.

