Introduzione
I modelli di apprendimento profondo possono essere computazionalmente costosi, soprattutto quando vengono distribuiti in scenari sensibili alla latenza come i veicoli autonomi. Avere una GPU potente non garantisce previsioni rapide se il tuo modello non è ottimizzato per l’inferenza. Questo è dove Nvidia tensorrt Entra in gioco, un SDK che perfeziona, quantizza e accelera i modelli di apprendimento profondo in modo che funzionino significativamente più velocemente.
Questo articolo fornisce una profonda panoramica tecnica della conversione Modelli Pytorch Tensorrt, coprendo gli strumenti, le configurazioni e le migliori pratiche. Esamineremo anche come Tensorrt ha ridotto la latenza di oltre il 70% in un sistema di guida autonomo.
Perché Tensorrt è importante
I quadri di apprendimento automatico come Pytorch o Tensorflow eccellono durante l’allenamento, ma le loro pipeline di inferenza predefinite potrebbero non essere ottimizzate. Tensorrt applica fusione del kernel, quantizzazione, parallelismo strato e altre ottimizzazioni su misura per le GPU NVIDIA. Questi miglioramenti possono ridurre significativamente il tempo di inferenza mantenendo l’accuratezza del modello.
Vantaggi chiave di Tensorrt:
- Le operazioni fuse riducono le spese generali unendo strati come convoluzione e normalizzazione batch
- La precisione mista (FP16 o INT8) può ridurre il tempo di calcolare senza un grande calo di precisione
- Kernels ottimizzato i kernel gestiscono le operazioni in modo più efficiente del codice GPU generico
In breve, Tensorrt è progettato per far funzionare i modelli più velocemente sulle GPU di Nvidia.
Flusso di lavoro: da Pytorch a Tensorrt
Di seguito è riportata la procedura generale per la conversione di un modello Pytorch:
- Esportare in Onnx: IL Open Neural Community Trade (ONNX) Il formato è ampiamente supportato e funge da rappresentazione intermedia.
- Ottimizzare e costruire usando Tensorrt: Caricare il grafico ONNX, calibrare se necessario (per int8) e compilare un motore TENSORRT.
- Integrare Il motore Tensorrt all’interno dell’applicazione (C ++ o Python).
Esportazione di un modello Pytorch in Onnx
Ecco un esempio semplificato usando un classificatore basato su Resnet:
import torch
from torchvision import fashions
mannequin = fashions.resnet50(pretrained=True)
mannequin.eval()
dummy_input = torch.randn(1, 3, 224, 224)
torch.onnx.export(
mannequin,
dummy_input,
"resnet50.onnx",
input_names=("enter"),
output_names=("output"),
opset_version=11
)
A questo punto, abbiamo un File onnx che può essere alimentato in tensort.
Costruire un motore Tensorrt
Ora possiamo usare l’API Python o C ++ di Tensorrt. Esploriamo la versione Python:
import tensorrt as trt
TRT_LOGGER = trt.Logger(trt.Logger.WARNING)
builder = trt.Builder(TRT_LOGGER)
community = builder.create_network(
1
Questo codice imposta un costruttore di tensorrt, analizza il grafico ONNX e abilita l’ottimizzazione FP16. In alternativa, puoi fare affidamento Calibrazione int8 Se si desidera un risultato ancora più veloce, tuttavia, ciò richiede un set di dati di calibrazione.
Integrazione del motore
Una volta che hai un serializzato .trt file, puoi incorporarlo in un’applicazione:
import pycuda.autoinit
import pycuda.driver as cuda
with open("resnet50.trt", "rb") as f:
runtime = trt.Runtime(TRT_LOGGER)
engine = runtime.deserialize_cuda_engine(f.learn())
context = engine.create_execution_context()
#Allocate reminiscence, run inference, course of output
Questo approccio è significativamente più rapido rispetto all’esecuzione del modello attraverso la pipeline di inferenza di Pytorch predefinita su una GPU.
Usando precisione mista e int8
Precisione mista (FP16)
La precisione mista prevede in genere lo stoccaggio di parametri del modello in FP16 mentre alcuni accumuli vengono eseguiti in maggiore precisione. Ciò riduce l’utilizzo della larghezza di banda della memoria e può aumentare la throughput.
builder.fp16_mode = True
builder.max_batch_size = 16
builder.max_workspace_size = 1
L’abbiamo trovato Fp16 La modalità spesso riduce il tempo di inferenza di circa il 40 percento rispetto a FP32, con una perdita di precisione minima.
Calibrazione int8
Int8 può ridurre ulteriormente le spese generali di inferenza, ma è necessario un set di dati di calibrazione rappresentativa. Tensorrt analizzerà le gamme dinamiche di attivazioni intermedie, quindi mappe i valori a punto cell a numeri interi a 8 bit.
def calibration_stream(batch_size=8):
for imgs, _ in calibration_loader:
yield imgs.numpy()
calibrator = trt.IInt8EntropyCalibrator2(
stream=calibration_stream,
cache_file="calib.cache"
)
builder.int8_mode = True
builder.int8_calibrator = calibrator
Mentre FP16 è più semplice per abilitare INT8 può produrre accelerazioni più elevate se è possibile accettare la fase di calibrazione aggiuntiva.
Caso di studio: applicazione di guida autonoma
Una startup di guida autonoma ha utilizzato Tensorrt per distribuire un modello di rilevamento degli oggetti nei loro veicoli. I tempi di inferenza iniziali hanno funzionato circa 80 ms per body a 30 fps. Story sovraccarico è problematico poiché il modello deve funzionare frequentemente per il processo decisionale.
Prima di Tensorrt
- Modello: Un’architettura personalizzata in stile yolo a Pytorch
- GPU: Nvidia rtx 3090
- Latenza: ~ 80 ms, portando a body mancati in determinati scenari advert alta velocità
Dopo Tensorrt
- Processo: Esportazione in ONNX, abilita FP16, fusione di strato parziale
- Latenza: ~ 24 ms (riduzione del 70 percento)
- Affidabilità: Il software program del driver non ha più saltato i telai
Hanno lasciato cadere un sovraccarico di inferenza da 80 ms a meno di 25 ms, unendo più operazioni e utilizzando FP16.
Bilanciamento della velocità e della precisione
La precisione mista (e soprattutto INT8) può accelerare l’inferenza, ma è fondamentale valutare il calo dell’accuratezza. Consigliamo:
- Raccogli un set di check in particolare per misurare piccoli cambiamenti nelle previsioni.
- Confronta le metriche (Mappa per il rilevamento, F1 per la classificazione) su FP32, FP16 e INT8.
- Regolare La tua strategia di quantizzazione o ri-tenerare determinati livelli se l’accuratezza è influenzata in modo troppo grave.
In molti casi, FP16 offre cambiamenti di precisione minimi. Int8 richiede spesso un po ‘più di cura.
Finest follow per una robusta pipeline di inferenza AI
- Ridurre al minimo i trasferimenti di dati preplanendo i dati sulla GPU, se possibile. Ogni copia della G-GPU gonfia la latenza totale.
- Usa forme dinamiche solo se essenziale. Tensorrt può gestire le dimensioni dinamiche di enter, ma può ridurre il potenziale di ottimizzazione.
- Parallelizza I/O: Sovrappone il caricamento dei dati di enter con l’esecuzione del kernel.
- Usa il profiler (sistemi TRTEXEC o NSIGHT) per identificare i colli di bottiglia.
- Ricontrollare periodicamente I dati di calibrazione per i cambiamenti di distribuzione.
L’adesione a questi passaggi garantisce prestazioni a bassa latenza nella produzione.
Conclusione
Tensorrt perfeziona e accelera i modelli di apprendimento profondo applicando ottimizzazioni intelligenti come la fusione dell’operatore, la quantizzazione e la movimentazione della forma dinamica in modo specifico verso le GPU NVIDIA. Negli scenari critici di latenza, questi miglioramenti possono essere fondamentali, garantendo che i modelli rispondano abbastanza rapidamente per guidare sistemi autonomi o analisi sensibili al tempo. Combinando le esportazioni ONNX, le configurazioni del costruttore personalizzato e la precisione calibrata, Tensorrt consente un sostanziale guadagno di efficienza nei carichi di lavoro di inferenza. Se la tua pipeline AI si contende con la latenza advert alta latenza o le bottiglia di throughput, Tensorrt è il percorso pratico e advert alte prestazioni verso soluzioni più reattive e affidabili.