Seguici sui social

TensorRT-LLM: una guida completa per ottimizzare l'inferenza di modelli linguistici di grandi dimensioni per ottenere le massime prestazioni

Intelligenza Artificiale

TensorRT-LLM: una guida completa per ottimizzare l'inferenza di modelli linguistici di grandi dimensioni per ottenere le massime prestazioni

mm
Quantizzazione TensorRT-LLM NVIDEA, fusione delle operazioni, precisione FP8 e supporto multi-GPU

Poiché la domanda di modelli linguistici di grandi dimensioni (LLM) continua ad aumentare, garantire un'inferenza rapida, efficiente e scalabile è diventato più cruciale che mai. NVIDIA TensorRT-LLM interviene per affrontare questa sfida fornendo un set di potenti strumenti e ottimizzazioni specificamente progettati per l'inferenza LLM. TensorRT-LLM offre una serie impressionante di miglioramenti delle prestazioni, come quantizzazione, fusione del kernel, batching in volo e supporto multi-GPU. Questi progressi consentono di raggiungere velocità di inferenza fino a 8 volte superiori rispetto ai tradizionali metodi basati su CPU, trasformando il modo in cui distribuiamo LLM in produzione.

Questa guida completa esplorerà tutti gli aspetti di TensorRT-LLM, dalla sua architettura e dalle sue caratteristiche principali agli esempi pratici per l'implementazione di modelli. Che tu sia un ingegnere di intelligenza artificiale, uno sviluppatore di software o un ricercatore, questa guida ti fornirà le conoscenze per sfruttare TensorRT-LLM per ottimizzare l'inferenza LLM sulle GPU NVIDIA.

Accelerare l'inferenza LLM con TensorRT-LLM

TensorRT-LLM offre notevoli miglioramenti nelle prestazioni di inferenza LLM. Secondo i test di NVIDIA, le applicazioni basate su TensorRT mostrano fino a 8 volte più veloci velocità di inferenza rispetto alle piattaforme basate solo su CPU. Si tratta di un progresso cruciale nelle applicazioni in tempo reale come chatbot, sistemi di raccomandazione e sistemi autonomi che richiedono risposte rapide.

Come funziona

TensorRT-LLM velocizza l'inferenza ottimizzando le reti neurali durante l'implementazione utilizzando tecniche come:

  • Quantizzazione: Riduce la precisione dei pesi e delle attivazioni, riducendo le dimensioni del modello e migliorando la velocità di inferenza.
  • Fusione di strati e tensori: Unisce operazioni come le funzioni di attivazione e le moltiplicazioni di matrici in un'unica operazione.
  • Ottimizzazione del kernel: Seleziona i kernel CUDA ottimali per l'elaborazione GPU, riducendo i tempi di esecuzione.

Queste ottimizzazioni garantiscono che i modelli LLM funzionino in modo efficiente su un'ampia gamma di piattaforme di distribuzione, dai data center su larga scala ai sistemi embedded.

Ottimizzazione delle prestazioni di inferenza con TensorRT

Basato sul modello di programmazione parallela CUDA di NVIDIA, TensorRT fornisce ottimizzazioni altamente specializzate per l'inferenza sulle GPU NVIDIA. Semplificando processi come quantizzazione, ottimizzazione del kernel e fusione delle operazioni tensoriali, TensorRT garantisce che gli LLM possano essere eseguiti con una latenza minima.

Alcune delle tecniche più efficaci includono:

  • Quantizzazione: Ciò riduce la precisione numerica dei parametri del modello mantenendo un'elevata accuratezza, velocizzando di fatto l'inferenza.
  • Fusione tensoriale: Unendo più operazioni in un singolo kernel CUDA, TensorRT riduce al minimo il sovraccarico di memoria e aumenta la produttività.
  • Auto-tuning del kernel: TensorRT seleziona automaticamente il kernel migliore per ogni operazione, ottimizzando l'inferenza per una determinata GPU.

Queste tecniche consentono a TensorRT-LLM di ottimizzare le prestazioni di inferenza per attività di apprendimento profondo quali elaborazione del linguaggio naturale, motori di raccomandazione e analisi video in tempo reale.

Accelerare i carichi di lavoro dell'intelligenza artificiale con TensorRT

TensorRT accelera i carichi di lavoro di apprendimento profondo incorporando ottimizzazioni di precisione come INT8 e FP16Questi formati a precisione ridotta consentono un'inferenza significativamente più rapida mantenendo l'accuratezza. Ciò è particolarmente prezioso nelle applicazioni in tempo reale in cui la bassa latenza è un requisito critico.

INT8 e FP16 le ottimizzazioni sono particolarmente efficaci in:

  • Video Streaming:Le attività di elaborazione video basate sull'intelligenza artificiale, come il rilevamento di oggetti, traggono vantaggio da queste ottimizzazioni riducendo il tempo impiegato per elaborare i fotogrammi.
  • Sistemi di raccomandazione: Accelerando l'inferenza per i modelli che elaborano grandi quantità di dati utente, TensorRT consente la personalizzazione in tempo reale su larga scala.
  • Natural Language Processing (NLP):TensorRT migliora la velocità delle attività di NLP come la generazione, la traduzione e la sintesi di testo, rendendole adatte alle applicazioni in tempo reale.

Distribuisci, esegui e scala con NVIDIA Triton

Una volta che il tuo modello è stato ottimizzato con TensorRT-LLM, puoi facilmente distribuirlo, eseguirlo e ridimensionarlo utilizzando Server di inferenza NVIDIA Triton. Triton è un software open source che supporta batching dinamico, ensemble di modelli e throughput elevato. Fornisce un ambiente flessibile per la gestione di modelli AI su larga scala.

Alcune delle caratteristiche chiave includono:

  • Esecuzione simultanea del modello: Esegui più modelli contemporaneamente, massimizzando l'utilizzo della GPU.
  • Dosaggio dinamico: Combina più richieste di inferenza in un unico batch, riducendo la latenza e aumentando la produttività.
  • Ingressi audio/video in streaming: Supporta flussi di input in applicazioni in tempo reale, come analisi video in diretta o servizi di conversione da parlato a testo.

Ciò rende Triton uno strumento prezioso per l'implementazione di modelli ottimizzati TensorRT-LLM in ambienti di produzione, garantendo elevata scalabilità ed efficienza.

Caratteristiche principali di TensorRT-LLM per l'inferenza LLM

API Python open source

TensorRT-LLM fornisce un'esperienza altamente modulare e API Python open source, semplificando il processo di definizione, ottimizzazione ed esecuzione di LLM. L'API consente agli sviluppatori di creare LLM personalizzati o di modificare quelli predefiniti per adattarli alle proprie esigenze, senza richiedere una conoscenza approfondita di CUDA o framework di deep learning.

Batching in volo e attenzione tramite paging

Una delle caratteristiche distintive di TensorRT-LLM è Batching in volo, che ottimizza la generazione di testo elaborando più richieste contemporaneamente. Questa funzionalità riduce al minimo i tempi di attesa e migliora l'utilizzo della GPU tramite batching dinamico delle sequenze.

Inoltre, Attenzione cercata assicura che l'utilizzo della memoria rimanga basso anche quando si elaborano lunghe sequenze di input. Invece di allocare memoria contigua per tutti i token, l'attenzione paginata suddivide la memoria in "pagine" che possono essere riutilizzate dinamicamente, impedendo la frammentazione della memoria e migliorando l'efficienza.

Inferenza multi-GPU e multi-nodo

Per modelli più grandi o carichi di lavoro più complessi, TensorRT-LLM supporta multi-GPU e inferenza multi-nodoQuesta capacità consente la distribuzione dei calcoli del modello su più GPU o nodi, migliorando la produttività e riducendo il tempo di inferenza complessivo.

Supporto all'8PQ

Con l'avvento dei FP8 (virgola mobile a 8 bit), TensorRT-LLM sfrutta le GPU H100 di NVIDIA per convertire i pesi del modello in questo formato per un'inferenza ottimizzata. FP8 consente un consumo di memoria ridotto e un calcolo più rapido, particolarmente utile nelle distribuzioni su larga scala.

Architettura e componenti TensorRT-LLM

Comprendere l'architettura di TensorRT-LLM ti aiuterà a utilizzare meglio le sue capacità per l'inferenza LLM. Analizziamo i componenti chiave:

Definizione del modello

TensorRT-LLM consente di definire LLM utilizzando una semplice API Python. L'API costruisce un rappresentazione grafica del modello, semplificando la gestione dei livelli complessi coinvolti nelle architetture LLM come GPT o BERT.

Attacchi di peso

Prima di compilare il modello, i pesi (o parametri) devono essere vincolati alla rete. Questo passaggio assicura che i pesi siano incorporati nel motore TensorRT, consentendo un'inferenza rapida ed efficiente. TensorRT-LLM consente inoltre aggiornamenti dei pesi dopo la compilazione, aggiungendo flessibilità per i modelli che necessitano di aggiornamenti frequenti.

Abbinamento e fusione di modelli

Operazione Fusione è un'altra potente funzionalità di TensorRT-LLM. Fondendo più operazioni (ad esempio, moltiplicazioni di matrici con funzioni di attivazione) in un singolo kernel CUDA, TensorRT riduce al minimo il sovraccarico associato a più lanci di kernel. Ciò riduce i trasferimenti di memoria e velocizza l'inferenza.

plugin

Per estendere le capacità di TensorRT, gli sviluppatori possono scrivere i plugin—kernel personalizzati che eseguono attività specifiche come l'ottimizzazione di blocchi di attenzione multi-testa. Ad esempio, il Attenzione Flash Il plugin migliora significativamente le prestazioni dei livelli di attenzione LLM.

Benchmark: miglioramenti delle prestazioni di TensorRT-LLM

TensorRT-LLM dimostra significativi guadagni di prestazioni per l'inferenza LLM su varie GPU. Ecco un confronto della velocità di inferenza (misurata in token al secondo) utilizzando TensorRT-LLM su diverse GPU NVIDIA:

Modello Precisione Lunghezza di ingresso/uscita H100 (80 GB) A100 (80 GB) L40S FP8
GPTJ 6B FP8 128/128 34,955 11,206 6,998
GPTJ 6B FP8 2048/128 2,800 1,354 747
LLaMA v2 7B FP8 128/128 16,985 10,725 6,121
LLaMA v3 8B FP8 128/128 16,708 12,085 8,273

Questi benchmark dimostrano che TensorRT-LLM offre miglioramenti sostanziali nelle prestazioni, in particolare per le sequenze più lunghe.

Pratica: installazione e creazione di TensorRT-LLM

Passaggio 1: creare un ambiente contenitore

Per semplificare l'utilizzo, TensorRT-LLM fornisce immagini Docker per creare un ambiente controllato per la creazione e l'esecuzione di modelli.

docker build --pull \
             --target devel \
             --file docker/Dockerfile.multi \
             --tag tensorrt_llm/devel:latest .


Passaggio 2: eseguire il contenitore

Esegui il contenitore di sviluppo con accesso alle GPU NVIDIA:

docker run --rm -it \
           --ipc=host --ulimit memlock=-1 --ulimit stack=67108864 --gpus=all \
           --volume ${PWD}:/code/tensorrt_llm \
           --workdir /code/tensorrt_llm \
           tensorrt_llm/devel:latest

Passaggio 3: creare TensorRT-LLM dalla sorgente

All'interno del contenitore, compilare TensorRT-LLM con il seguente comando:

python3 ./scripts/build_wheel.py --trt_root /usr/local/tensorrt
pip install ./build/tensorrt_llm*.whl

Questa opzione è particolarmente utile quando si vogliono evitare problemi di compatibilità correlati alle dipendenze Python o quando ci si concentra sull'integrazione C++ nei sistemi di produzione. Una volta completata la build, troverete le librerie compilate per il runtime C++ in cpp/build/tensorrt_llm directory, pronta per l'integrazione con le tue applicazioni C++.

Passaggio 4: collegare il runtime C++ TensorRT-LLM

Quando integri TensorRT-LLM nei tuoi progetti C++, assicurati che i percorsi di inclusione del tuo progetto puntino a cpp/include directory. Contiene le intestazioni API stabili e supportate. Le librerie TensorRT-LLM sono collegate come parte del processo di compilazione C++.

Ad esempio, la configurazione CMake del tuo progetto potrebbe includere:

include_directories(${TENSORRT_LLM_PATH}/cpp/include)
link_directories(${TENSORRT_LLM_PATH}/cpp/build/tensorrt_llm)
target_link_libraries(your_project tensorrt_llm)

Questa integrazione consente di sfruttare le ottimizzazioni TensorRT-LLM nei progetti C++ personalizzati, garantendo un'inferenza efficiente anche in ambienti di basso livello o ad alte prestazioni.

Funzionalità avanzate di TensorRT-LLM

TensorRT-LLM è più di una semplice libreria di ottimizzazione; include diverse funzionalità avanzate che aiutano ad affrontare distribuzioni LLM su larga scala. Di seguito, esploriamo alcune di queste funzionalità in dettaglio:

1. Batching in volo

Il batching tradizionale prevede di attendere che un lotto sia completamente raccolto prima di procedere all'elaborazione, il che può causare dei ritardi. Batching in volo cambia questo avviando dinamicamente l'inferenza sulle richieste completate all'interno di un batch, continuando a raccogliere altre richieste. Ciò migliora la produttività complessiva riducendo al minimo i tempi di inattività e migliorando l'utilizzo della GPU.

Questa funzionalità è particolarmente utile nelle applicazioni in tempo reale, come chatbot o assistenti vocali, in cui il tempo di risposta è fondamentale.

2. Attenzione cercata

Attenzione cercata è una tecnica di ottimizzazione della memoria per la gestione di grandi sequenze di input. Invece di richiedere memoria contigua per tutti i token in una sequenza (che può portare alla frammentazione della memoria), Paged Attention consente al modello di suddividere i dati della cache chiave-valore in "pagine" di memoria. Queste pagine vengono allocate e liberate dinamicamente in base alle necessità, ottimizzando l'utilizzo della memoria.

L'attenzione di tipo Paged è fondamentale per gestire sequenze di grandi dimensioni e ridurre il sovraccarico di memoria, in particolare nei modelli generativi come GPT e LLaMA.

3. Plugin personalizzati

TensorRT-LLM consente di estendere le sue funzionalità con plugin personalizzatiI plugin sono kernel definiti dall'utente che abilitano ottimizzazioni o operazioni specifiche non coperte dalla libreria TensorRT standard.

Ad esempio, al cotone biologico viene applicata l'etichetta Attenzione Flash plugin è un kernel personalizzato ben noto che ottimizza i livelli di attenzione multi-testa nei modelli basati su Transformer. Utilizzando questo plugin, gli sviluppatori possono ottenere notevoli accelerazioni nel calcolo dell'attenzione, uno dei componenti più dispendiosi in termini di risorse degli LLM.

Per integrare un plugin personalizzato nel tuo modello TensorRT-LLM, puoi scrivere un kernel CUDA personalizzato e registrarlo con TensorRT. Il plugin verrà richiamato durante l'esecuzione del modello, fornendo miglioramenti delle prestazioni su misura.

4. Precisione FP8 su NVIDIA H100

Con Precisione FP8, TensorRT-LLM sfrutta le ultime innovazioni hardware di NVIDIA nel Architettura H100 Hopper. FP8 riduce l'ingombro di memoria degli LLM memorizzando pesi e attivazioni in un formato floating-point a 8 bit, con conseguente calcolo più rapido senza sacrificare molta accuratezza. TensorRT-LLM compila automaticamente i modelli per utilizzare kernel FP8 ottimizzati, accelerando ulteriormente i tempi di inferenza.

Ciò rende TensorRT-LLM la scelta ideale per distribuzioni su larga scala che richiedono prestazioni e efficienza energetica di alto livello.

Esempio: distribuzione di TensorRT-LLM con Triton Inference Server

Per le distribuzioni di produzione, NVIDIA Server di inferenza Triton fornisce una piattaforma solida per la gestione di modelli su larga scala. In questo esempio, mostreremo come distribuire un modello ottimizzato TensorRT-LLM utilizzando Triton.

Passaggio 1: impostare il repository del modello

Crea un repository di modelli per Triton, che memorizzerà i file del tuo modello TensorRT-LLM. Ad esempio, se hai compilato un modello GPT2, la struttura della tua directory potrebbe apparire così:

mkdir -p model_repository/gpt2/1
cp ./trt_engine/gpt2_fp16.engine model_repository/gpt2/1/

Passaggio 2: creare il file di configurazione Triton

Nello stesso model_repository/gpt2/ directory, creare un file di configurazione denominato config.pbtxt che indica a Triton come caricare ed eseguire il modello. Ecco una configurazione di base per TensorRT-LLM:

name: "gpt2"
platform: "tensorrt_llm"
max_batch_size: 8

input [
  {
    name: "input_ids"
    data_type: TYPE_INT32
    dims: [-1]
  }
]

output [
  {
    name: "logits"
    data_type: TYPE_FP32
    dims: [-1, -1]
  }
]

Passaggio 3: avviare Triton Server

Utilizzare il seguente comando Docker per avviare Triton con il repository del modello:

docker run --rm --gpus all \
    -v $(pwd)/model_repository:/models \
    nvcr.io/nvidia/tritonserver:23.05-py3 \
    tritonserver --model-repository=/models

Passaggio 4: inviare richieste di inferenza a Triton

Una volta che il server Triton è in esecuzione, puoi inviare richieste di inferenza ad esso tramite HTTP o gRPC. Ad esempio, utilizzando curl per inviare una richiesta:

curl -X POST http://localhost:8000/v2/models/gpt2/infer -d '{
  "inputs": [
    {"name": "input_ids", "shape": [1, 128], "datatype": "INT32", "data": [[101, 234, 1243]]}
  ]
}'

Triton elaborerà la richiesta utilizzando il motore TensorRT-LLM e restituirà i logit come output.

Best Practice per l'ottimizzazione dell'inferenza LLM con TensorRT-LLM

Per sfruttare appieno la potenza di TensorRT-LLM, è importante seguire le best practice sia durante l'ottimizzazione che durante l'implementazione del modello. Ecco alcuni suggerimenti chiave:

1. Profila il tuo modello prima dell'ottimizzazione

Prima di applicare ottimizzazioni come la quantizzazione o la fusione del kernel, usa gli strumenti di profilazione di NVIDIA (come Nsight Systems o TensorRT Profiler) per comprendere gli attuali colli di bottiglia nell'esecuzione del tuo modello. Ciò ti consente di individuare aree specifiche per il miglioramento, portando a ottimizzazioni più efficaci.

2. Utilizzare la precisione mista per prestazioni ottimali

Quando si ottimizzano i modelli con TensorRT-LLM, utilizzando precisione mista (una combinazione di FP16 e FP32) offre un'accelerazione significativa senza una perdita importante di accuratezza. Per il miglior equilibrio tra velocità e accuratezza, considera di usare FP8 dove disponibile, specialmente sulle GPU H100.

3. Sfrutta l'attenzione di Paged per sequenze di grandi dimensioni

Per le attività che comportano lunghe sequenze di input, come la sintesi di documenti o conversazioni multi-turn, abilitare sempre Attenzione cercata per ottimizzare l'utilizzo della memoria. Ciò riduce il sovraccarico di memoria e previene errori di memoria esaurita durante l'inferenza.

4. Ottimizzazione del parallelismo per configurazioni multi-GPU

Quando si distribuiscono LLM su più GPU o nodi, è essenziale ottimizzare le impostazioni per parallelismo tensoriale e parallelismo delle condutture per adattarlo al tuo carico di lavoro specifico. La corretta configurazione di queste modalità può portare a significativi miglioramenti delle prestazioni distribuendo il carico computazionale in modo uniforme tra le GPU.

Conclusione

TensorRT-LLM rappresenta un cambio di paradigma nell'ottimizzazione e nell'implementazione di modelli linguistici di grandi dimensioni. Con le sue funzionalità avanzate come quantizzazione, fusione delle operazioni, precisione FP8 e supporto multi-GPU, TensorRT-LLM consente agli LLM di funzionare più velocemente e in modo più efficiente sulle GPU NVIDIA. Sia che tu stia lavorando su applicazioni di chat in tempo reale, sistemi di raccomandazione o modelli linguistici su larga scala, TensorRT-LLM fornisce gli strumenti necessari per superare i limiti delle prestazioni.

Questa guida ti ha guidato nella configurazione di TensorRT-LLM, nell'ottimizzazione dei modelli con la sua API Python, nell'implementazione su Triton Inference Server e nell'applicazione delle best practice per un'inferenza efficiente. Con TensorRT-LLM, puoi accelerare i tuoi carichi di lavoro AI, ridurre la latenza e fornire soluzioni LLM scalabili agli ambienti di produzione.

Per ulteriori informazioni, fare riferimento al sito ufficiale Documentazione TensorRT-LLM e Documentazione del server di inferenza Triton.

Ho trascorso gli ultimi cinque anni immergendomi nell'affascinante mondo del Machine Learning e del Deep Learning. La mia passione e competenza mi hanno portato a contribuire a oltre 50 diversi progetti di ingegneria del software, con un focus particolare su AI/ML. La mia continua curiosità mi ha anche attirato verso l'elaborazione del linguaggio naturale, un campo che non vedo l'ora di esplorare ulteriormente.