Come Patsnap ha utilizzato l’inferenza GPT-2 su Amazon SageMaker con bassa latenza e costi ridotti

Patsnap utilized GPT-2 inference on Amazon SageMaker with low latency and reduced costs.

Questo post sul blog è stato scritto a quattro mani, e include una introduzione, di Zilong Bai, ingegnere senior di elaborazione del linguaggio naturale presso Patsnap.

Probabilmente sei familiare con la funzione di suggerimento dell’autocompletamento quando cerchi qualcosa su Google o Amazon. Sebbene i termini di ricerca in questi scenari siano parole chiave o espressioni abbastanza comuni che usiamo nella vita quotidiana, in alcuni casi i termini di ricerca sono molto specifici dello scenario. La ricerca di brevetti è uno di questi casi. Recentemente, il AWS Generative AI Innovation Center ha collaborato con Patsnap per implementare una funzione che suggerisce automaticamente parole chiave di ricerca come esplorazione dell’innovazione per migliorare l’esperienza dell’utente sulla loro piattaforma.

Patsnap fornisce una piattaforma globale one-stop per la ricerca, l’analisi e la gestione dei brevetti. Utilizzano big data (come la cronologia delle ricerche precedenti) per fornire molti strumenti brevettuali potenti ma facili da usare. Questi strumenti hanno permesso ai clienti globali di Patsnap di avere una migliore comprensione dei brevetti, tracciare gli avanzamenti tecnologici recenti, identificare le tendenze dell’innovazione e analizzare i concorrenti in tempo reale.

Allo stesso tempo, Patsnap sta sfruttando il potere del machine learning (ML) per sviluppare funzionalità che possono migliorare continuamente l’esperienza dell’utente sulla piattaforma. Un’iniziativa recente è quella di semplificare la difficoltà di costruire espressioni di ricerca mediante la compilazione automatica delle query di ricerca di brevetti utilizzando modelli di generazione di testo all’avanguardia. Patsnap aveva addestrato un modello GPT-2 personalizzato per questo scopo. Poiché non esiste una funzione del genere in un motore di ricerca brevettuale (per la loro migliore conoscenza), Patsnap ritiene che aggiungere questa funzionalità aumenterà l’affezione degli utenti finali.

Tuttavia, nei loro recenti esperimenti, la latenza di inferenza e le query al secondo (QPS) di un modello GPT-2 basato su PyTorch non potevano soddisfare determinate soglie che giustificano il suo valore commerciale. Per affrontare questa sfida, gli scienziati del AWS Generative AI Innovation Center hanno esplorato una varietà di soluzioni per ottimizzare le prestazioni di inferenza di GPT-2, riducendo così la latenza del modello di circa il 50% in media e migliorando il QPS del 200%.

Sfide di inferenza del modello di linguaggio di grandi dimensioni e approcci di ottimizzazione

In generale, l’applicazione di un modello così grande in un ambiente di produzione del mondo reale è complessa. Il costo di calcolo proibitivo e la latenza di GPT-2 basato su PyTorch rendevano difficile la sua adozione diffusa dal punto di vista delle operazioni aziendali. In questo progetto, il nostro obiettivo è migliorare significativamente la latenza con costi di calcolo ragionevoli. In particolare, Patsnap richiede quanto segue:

  • La latenza media di inferenza del modello per generare espressioni di ricerca deve essere controllata entro 600 millisecondi in scenari di ricerca in tempo reale
  • Il modello richiede un’elevata throughput e QPS per effettuare un gran numero di ricerche al secondo durante le ore di punta dell’attività

In questo post, discutiamo delle nostre scoperte utilizzando istanze di Amazon Elastic Compute Cloud (Amazon EC2), caratterizzate da istanze basate su GPU che utilizzano NVIDIA TensorRT.

In breve, utilizziamo NVIDIA TensorRT per ottimizzare la latenza di GPT-2 e lo implementiamo su un endpoint di Amazon SageMaker per il servizio del modello, riducendo la latenza media da 1.172 millisecondi a 531 millisecondi.

Nelle sezioni seguenti, esaminiamo i dettagli tecnici delle soluzioni proposte con frammenti di codice chiave e mostriamo confronti con lo stato attuale del cliente basati su metriche chiave.

Panoramica del modello GPT-2

GPT-2 di Open AI è un grande modello di linguaggio basato su trasformatore con 1,5 miliardi di parametri, addestrato sul dataset WebText, contenente 8 milioni di pagine web. GPT-2 è addestrato con un obiettivo semplice: prevedere la parola successiva, data tutte le parole precedenti all’interno di un testo. La diversità del dataset fa sì che questo obiettivo semplice contenga dimostrazioni naturali di molte attività in diversi domini. GPT-2 mostra un’ampia gamma di capacità, compresa la capacità di generare campioni di testo sintetico condizionale di qualità senza precedenti, in cui avviamo il modello con un input e lo lasciamo generare una lunga continuazione. In questa situazione, lo sfruttiamo per generare query di ricerca. Man mano che i modelli GPT diventano sempre più grandi, i costi di inferenza aumentano continuamente, il che aumenta la necessità di distribuire questi modelli con costi accettabili.

Raggiungere una bassa latenza su istanze GPU tramite TensorRT

TensorRT è una libreria C++ per l’inferenza ad alte prestazioni su GPU NVIDIA e acceleratori di deep learning, che supporta i principali framework di deep learning come PyTorch e TensorFlow. Studi precedenti hanno dimostrato un grande miglioramento delle prestazioni in termini di latenza del modello. Pertanto, è una scelta ideale per ridurre la latenza del modello target su GPU NVIDIA.

Siamo in grado di ottenere una significativa riduzione della latenza di inferenza del modello GPT-2 con un modello basato su TensorRT su GPU NVIDIA. Il modello basato su TensorRT viene implementato tramite SageMaker per i test di prestazioni. In questo post, mostriamo i passaggi per convertire il modello GPT-2 originale basato su PyTorch in un modello basato su TensorRT.

Convertire il modello basato su PyTorch di GPT-2 nel modello basato su TensorRT non è difficile tramite lo strumento ufficiale fornito da NVIDIA. Inoltre, con tali conversioni semplici, non sono state osservate evidenti degradazioni dell’accuratezza del modello. In generale, ci sono tre passaggi da seguire:

  1. Analizza il tuo GPT-2. Al momento della stesura di questo documento, lo strumento di conversione di NVIDIA supporta solo la versione del modello GPT-2 di Hugging Face. Se il modello GPT-2 attuale non è la versione originale, è necessario modificarlo di conseguenza. Si consiglia di eliminare il codice personalizzato dall’implementazione originale di GPT-2 di Hugging Face, il che è molto utile per la conversione.
  2. Installa i pacchetti Python richiesti. Il processo di conversione converte prima il modello basato su PyTorch nel modello basato su ONNX e poi converte il modello basato su ONNX nel modello basato su TensorRT. I seguenti pacchetti Python sono necessari per questa conversione in due fasi:
tabulate
toml
torch
sentencepiece==0.1.95
onnx==1.9.0
onnx_graphsurgeon
polygraphy
transformers
  1. Converti il tuo modello. Il codice seguente contiene le funzioni per la conversione in due fasi:
def torch2onnx():
    metadata = NetworkMetadata(variant=GPT2_VARIANT, precision=Precision(fp16=True), other=GPT2Metadata(kv_cache=False))
    gpt2 = GPT2TorchFile(model.to('cpu'), metadata)
    onnx_path = ('Percorso personalizzato per salvare il modello basato su ONNX') # ad esempio, ./model_fp16.onnx
    gpt2.as_onnx_model(onnx_path, force_overwrite=False)
    return onnx_path, metadata
   
def onnx2trt(onnx_path, metadata):
    trt_path = 'Percorso personale per salvare il modello basato su TensorRT' # ad esempio, ./model_fp16.onnx.engine
    batch_size = 10
    max_sequence_length = 42
    profiles = [Profile().add(
        "input_ids",
        min=(1, 1),
        opt=(batch_size, max_sequence_length // 2),
        max=(batch_size, max_sequence_length),
    )]
    gpt2_engine = GPT2ONNXFile(onnx_path, metadata).as_trt_engine(output_fpath=trt_path, profiles=profiles)
    gpt2_trt = GPT2TRTDecoder(gpt2_engine, metadata, config, max_sequence_length=42, batch_size=10)

Confronto di latenza: PyTorch vs. TensorRT

JMeter viene utilizzato per il benchmark delle prestazioni in questo progetto. JMeter è un progetto Apache che può essere utilizzato come strumento di test di carico per analizzare e misurare le prestazioni di una varietà di servizi. Registriamo il QPS e la latenza del modello originale basato su PyTorch e del nostro modello GPT-2 convertito basato su TensorRT su un’istanza AWS P3.2xlarge. Come mostreremo in seguito in questo post, grazie alla potente capacità di accelerazione di TensorRT, la latenza di GPT-2 è significativamente ridotta. Quando la concorrenza della richiesta è 1, la latenza media è stata ridotta di 274 millisecondi (2,9 volte più veloce). Dal punto di vista del QPS, è aumentato a 7 da 2,4, che corrisponde a un aumento di circa 2,9 volte rispetto al modello originale basato su PyTorch. Inoltre, all’aumentare della concorrenza, il QPS continua ad aumentare. Ciò suggerisce costi inferiori con un aumento della latenza accettabile (ma comunque molto più veloce rispetto al modello originale).

La tabella seguente confronta la latenza:

. Concorrenza QPS Latenza massima Latenza minima Latenza media
Versione PyTorch del cliente (su p3.2xlarge) 1 2,4 632 105 417
2 3,1 919 168 636
3 3,4 1911 222 890
4 3,4 2458 277 1172
Versione TensorRT di AWS (su p3.2xlarge) 1 7 (+4,6) 275 22 143 (-274 ms)
2 7,2 (+4,1) 274 51 361 (-275 ms)
3 7,3 (+3,9) 548 49 404 (-486 ms)
4 7,5 (+4,1) 765 62 531 (-641 ms)

Deploy TensorRT-based GPT-2 con SageMaker e un container personalizzato

GPT-2 basato su TensorRT richiede una versione relativamente recente di TensorRT, quindi scegliamo la modalità di utilizzare il tuo container (BYOC) di SageMaker per distribuire il nostro modello. La modalità BYOC fornisce un modo flessibile per distribuire il modello e puoi creare ambienti personalizzati nel tuo container Docker. In questa sezione, mostriamo come creare il tuo container, distribuire il tuo modello GPT-2 e testarlo con l’API del punto di accesso di SageMaker.

Crea il tuo container

Il contenuto della directory del container è presentato nel codice seguente. In particolare, il file Dockerfile e build.sh vengono utilizzati per creare il container Docker. gpt2 e predictor.py implementano il modello e l’API di inferenza. serve, nginx.conf e wsgi.py forniscono la configurazione per il server web NGINX.

container
├── Dockerfile    # crea il nostro docker basato su questo file.
├── build.sh      # crea la nostra immagine e la carica su Amazon ECR
├── gpt2          # directory del modello
├── predictor.py  # funzione di backend per invocare il modello
├── serve         # file di impostazione del server web
├── nginx.conf    # file di impostazione del server web
└── wsgi.py       # file di impostazione del server web

Puoi eseguire sh ./build.sh per creare il container.

Distribuisci su un endpoint di SageMaker

Dopo aver creato un container per eseguire GPT-2 basato su TensorRT, puoi abilitare l’inferenza in tempo reale tramite un endpoint di SageMaker. Utilizza i seguenti frammenti di codice per creare l’endpoint e distribuire il modello all’endpoint utilizzando le corrispondenti API di SageMaker:

import boto3from time import gmtime, strftime
from sagemaker import get_execution_role

sm_client = boto3.client(service_name='sagemaker')
runtime_sm_client = boto3.client(service_name='sagemaker-runtime')
account_id = boto3.client('sts').get_caller_identity()['Account']
region = boto3.Session().region_name
s3_bucket = '${Your s3 bucket}'
role = get_execution_role()
model_name = '${Your Model Name}'
# devi caricare il tuo container su S3 prima
container = '${Your Image Path}'
instance_type = 'ml.p3.2xlarge'
container = {
    'Image': container
}
create_model_response = sm_client.create_model(
    ModelName = model_name,
    ExecutionRoleArn = role,
    Containers = [container])
    
# Impostazione dell'endpoint
endpoint_config_name = '${Your Endpoint Config Name}'
print('Nome della configurazione dell\'endpoint: ' + endpoint_config_name)
create_endpoint_config_response = sm_client.create_endpoint_config(
    EndpointConfigName = endpoint_config_name,
    ProductionVariants=[{
        'InstanceType': instance_type,
        'InitialInstanceCount': 1,
        'InitialVariantWeight': 1,
        'ModelName': model_name,
        'VariantName': 'AllTraffic'}])
print("Endpoint config Arn: " + create_endpoint_config_response['EndpointConfigArn'])

# Distribuzione del modello
endpoint_name = '${Your Endpoint Name}'
print('Nome dell\'endpoint: ' + endpoint_name)
create_endpoint_response = sm_client.create_endpoint(
    EndpointName=endpoint_name,
    EndpointConfigName=endpoint_config_name)
print('Endpoint Arn: ' + create_endpoint_response['EndpointArn'])
resp = sm_client.describe_endpoint(EndpointName=endpoint_name)
status = resp['EndpointStatus']
print("Stato dell'endpoint: " + status)
print('In attesa che l\'endpoint {} sia in servizio...'.format(endpoint_name))
waiter = sm_client.get_waiter('endpoint_in_service')
waiter.wait(EndpointName=endpoint_name)

Testa il modello distribuito

Dopo che il modello è stato distribuito con successo, puoi testare l’endpoint tramite l’istanza del notebook di SageMaker con il seguente codice:

import json
import boto3

sagemaker_runtime = boto3.client("sagemaker-runtime", region_name='us-east-2')
endpoint_name = "${Your Endpoint Name}"
request_body = {"input": "amazon"}
payload = json.dumps(request_body)
content_type = "application/json"
response = sagemaker_runtime.invoke_endpoint(
                            EndpointName=endpoint_name,
                            ContentType=content_type,
                            Body=payload # Rimpiazza con i tuoi dati.
                            )
result = json.loads(response['Body'].read().decode())
print(result)

Conclusion

In questo post, abbiamo descritto come abilitare l’inferenza GPT-2 a bassa latenza su SageMaker per creare valore aziendale. In particolare, con il supporto di NVIDIA TensorRT, possiamo ottenere un’accelerazione di 2,9 volte sulle istanze GPU NVIDIA con SageMaker per un modello GPT-2 personalizzato.

Se desideri aiuto per accelerare l’utilizzo dei modelli GenAI nei tuoi prodotti e servizi, contatta il AWS Generative AI Innovation Center. Il AWS Generative AI Innovation Center può aiutarti a rendere le tue idee realtà più velocemente e in modo più efficace. Per iniziare con il Generative AI Innovation Center, visita qui.