Ottimizza i tuoi lavori di inferenza utilizzando l'inferenza batch dinamica con TorchServe su Amazon SageMaker

Nodo di origine: 1884601

Nel deep learning, l'elaborazione in batch si riferisce all'inserimento di più input in un modello. Sebbene sia essenziale durante l'addestramento, può essere molto utile per gestire i costi e ottimizzare il throughput anche durante il tempo di inferenza. Gli acceleratori hardware sono ottimizzati per il parallelismo e il batch aiuta a saturare la capacità di calcolo e spesso porta a un throughput più elevato.

L'invio in batch può essere utile in diversi scenari durante la distribuzione del modello in produzione. Qui li classifichiamo ampiamente in due casi d'uso:

  • Applicazioni in tempo reale in cui diverse richieste di inferenza vengono ricevute da client diversi e vengono raggruppate dinamicamente in batch e alimentate al modello di servizio. La latenza è solitamente importante in questi casi d'uso.
  • Applicazioni offline in cui diversi input o richieste vengono raggruppati sul lato client e inviati al modello di servizio. Un throughput più elevato è spesso l'obiettivo per questi casi d'uso, il che aiuta a gestire i costi. I casi d'uso di esempio includono l'analisi video e la valutazione del modello.

Amazon Sage Maker fornisce due opzioni popolari per i tuoi lavori di inferenza. Per le applicazioni in tempo reale, SageMaker Hosting utilizza TorchServe come libreria di back-end che gestisce il batch dinamico delle richieste ricevute. Per le applicazioni offline, puoi utilizzare i processi di trasformazione batch di SageMaker. In questo post, esaminiamo un esempio di ciascuna opzione per aiutarti a iniziare.

Perché TorchServe è nativamente integrato con SageMaker tramite Toolkit di inferenza PyTorch di SageMaker, puoi distribuire facilmente un modello PyTorch su TorchServe utilizzando SageMaker Hosting. In alcuni casi potrebbe essere necessario personalizzare ulteriormente l'ambiente utilizzando immagini Docker personalizzate. In questo post, mostriamo innanzitutto come distribuire un endpoint in tempo reale utilizzando il toolkit di inferenza PyTorch nativo di SageMaker e configurando la dimensione del batch per ottimizzare il throughput. Nel secondo esempio, dimostriamo come utilizzare un'immagine Docker personalizzata per configurare configurazioni TorchServe avanzate che non sono disponibili come variabile di ambiente per ottimizzare il processo di inferenza batch.

Best practice per l'inferenza batch

L'elaborazione in batch può aumentare la velocità effettiva e ottimizzare le risorse perché aiuta a completare un numero maggiore di inferenze in un determinato periodo di tempo a scapito della latenza. Per ottimizzare la distribuzione del modello per una maggiore velocità effettiva, la linea guida generale consiste nell'aumentare le dimensioni del batch finché la velocità effettiva non diminuisce. Questo si adatta molto spesso alle applicazioni offline, in cui diversi input vengono raggruppati in batch (come fotogrammi video, immagini o testo) per ottenere output di previsione.

Per le applicazioni in tempo reale, la latenza è spesso una preoccupazione principale. C'è un compromesso tra un throughput più elevato e una maggiore dimensione e latenza del batch; potrebbe essere necessario apportare modifiche in base alle esigenze per soddisfare il contratto di servizio sulla latenza. In termini di best practice sul cloud, il costo per un certo numero di inferenze è una linea guida utile per prendere una decisione informata che soddisfi le tue esigenze aziendali. Un fattore che contribuisce alla gestione dei costi è la scelta dell'acceleratore giusto. Per ulteriori informazioni, vedere Scegli il miglior acceleratore di intelligenza artificiale e la compilazione di modelli per l'inferenza di visione artificiale con Amazon SageMaker.

Batch dinamico di TorchServe su SageMaker

Torcia Servire è la libreria PyTorch nativa per servire modelli in produzione su larga scala. È uno sviluppo congiunto di Facebook e AWS. TorchServe consente di monitorare, aggiungere metriche personalizzate, supportare più modelli, aumentare e diminuire il numero di lavoratori tramite API di gestione sicure e fornire endpoint di inferenza e spiegazione.

Per supportare l'elaborazione in batch, TorchServe fornisce una funzionalità di batch dinamico. Aggrega le richieste ricevute entro un intervallo di tempo specificato, le raggruppa e invia il batch per l'inferenza. Le richieste pervenute vengono evase tramite il gestori in TorchServe. TorchServe ha diversi gestori predefiniti e puoi creare un gestore personalizzato se il tuo caso d'uso non è coperto. Quando usi un gestore personalizzato, assicurati che la logica di inferenza batch sia stata implementata nel gestore. Un esempio di gestore personalizzato con supporto di inferenza batch è disponibile su GitHub.

Puoi configurare il batch dinamico utilizzando due impostazioni, batch_size ed max_batch_delay, tramite le variabili di ambiente in SageMaker o tramite il file config.properties file in TorchServe (se si utilizza un contenitore personalizzato). TorchServe utilizza una qualsiasi delle impostazioni che vengono prima, sia la dimensione massima del batch (batch_size) o l'intervallo di tempo specificato per l'attesa del batch di richieste max_batch_delay.

Con le integrazioni TorchServe con SageMaker, ora puoi distribuire i modelli PyTorch in modo nativo su SageMaker, dove puoi definire un modello SageMaker PyTorch. Puoi aggiungere il caricamento del modello personalizzato, l'inferenza e la logica di pre-elaborazione e post-elaborazione in uno script passato come punto di ingresso a SageMaker PyTorch (vedi il seguente codice di esempio). In alternativa, puoi utilizzare un contenitore personalizzato per distribuire i tuoi modelli. Per ulteriori informazioni, vedere Il server modello SageMaker PyTorch.

Puoi impostare la dimensione del batch per i modelli PyTorch su SageMaker tramite le variabili di ambiente. Se scegli di utilizzare un contenitore personalizzato, puoi raggruppare impostazioni in config.properties con il tuo modello quando impacchetta il tuo modello in TorchServe. Il seguente frammento di codice mostra un esempio su come impostare la dimensione del batch utilizzando le variabili di ambiente e su come distribuire un modello PyTorch su SageMaker:

from SageMaker.pytorch.model import PyTorchModel env_variables_dict = { "SAGEMAKER_TS_BATCH_SIZE": "3", "SAGEMAKER_TS_MAX_BATCH_DELAY": "100000"
} pytorch_model = PyTorchModel( model_data=model_artifact, role=role, source_dir="code", framework_version='1.9', entry_point="inference.py", env=env_variables_dict
) predictor = pytorch_model.deploy(initial_instance_count=1, instance_type="ml.c5.2xlarge", serializer=SageMaker.serializers.JSONSerializer(), deserializer=SageMaker.deserializers.BytesDeserializer())

Nel frammento di codice, model_artifact fa riferimento a tutti i file richiesti per il caricamento del modello addestrato, che viene archiviato in un file .tar e inserito in un file Servizio di archiviazione semplice Amazon (Amazon S3) secchio. inference.py è simile al gestore personalizzato TorchServe; ha diverse funzioni che è possibile sovrascrivere per accogliere l'inizializzazione del modello, la pre-elaborazione e la post-elaborazione delle richieste ricevute e la logica di inferenza.

Le seguenti taccuino mostra un esempio completo di distribuzione di un modello BERT Hugging Face.

Se hai bisogno di un contenitore personalizzato, puoi creare un'immagine del contenitore personalizzata e inviarla al file Registro dei contenitori Amazon Elastic (Amazon ECR). L'artefatto del modello in questo caso può essere un file TorchServe .mar che raggruppa gli artefatti del modello insieme al gestore. Lo dimostreremo nella sezione successiva, in cui utilizziamo un processo di trasformazione batch di SageMaker.

Processo di trasformazione batch di SageMaker

Per i casi d'uso offline in cui le richieste vengono raggruppate da un'origine dati come un set di dati, SageMaker fornisce processi di trasformazione batch. Questi job ti consentono di leggere i dati da un bucket S3 e di scrivere i risultati in un bucket S3 di destinazione. Per ulteriori informazioni, vedere Utilizza la trasformazione in batch per ottenere inferenze da set di dati di grandi dimensioni. Di seguito è riportato un esempio completo di inferenza batch che utilizza processi di trasformazione batch taccuino, in cui utilizziamo un modello di traduzione automatica del concorso FLORES. In questo esempio, mostriamo come utilizzare un contenitore personalizzato per valutare il nostro modello utilizzando SageMaker. L'utilizzo di un contenitore di inferenza personalizzato consente di personalizzare ulteriormente la configurazione di TorchServe. In questo esempio, vogliamo modificare e disabilitare la decodifica JSON, cosa che possiamo fare tramite TorchServe config.properties file.

Quando si utilizza un gestore personalizzato per TorchServe, è necessario assicurarsi che il gestore implementi la logica di inferenza batch. Ogni gestore può avere funzioni personalizzate per eseguire la pre-elaborazione, l'inferenza e la post-elaborazione. Un esempio di gestore personalizzato con supporto di inferenza batch è disponibile su GitHub.

Usiamo il nostro contenitore personalizzato per raggruppare gli artefatti del modello con il gestore come facciamo in TorchServe (creando un file .mar). Abbiamo anche bisogno di un punto di ingresso al contenitore Docker che avvii TorchServe con la dimensione del batch e la decodifica JSON impostate in config.properties. Lo dimostriamo nell'esempio taccuino.

Il processo di trasformazione in batch di SageMaker richiede l'accesso ai file di input da un bucket S3, dove divide i file di input in mini batch e li invia per l'inferenza. Considerare i seguenti punti durante la configurazione del processo di trasformazione batch:

  • Posiziona i file di input (come un set di dati) in un bucket S3 e impostalo come origine dati nelle impostazioni del processo.
  • Assegna un bucket S3 in cui salvare i risultati del processo di trasformazione batch.
  • Impostato BatchStrategia a MultiRecord ed SplitType a Line se hai bisogno del lavoro di trasformazione batch per creare mini batch dal file di input. Se non è possibile suddividere automaticamente il set di dati in mini batch, è possibile suddividerlo in mini batch inserendo ciascun batch in un file di input separato, inserito nel bucket S3 dell'origine dati.
  • Assicurarsi che la dimensione del batch rientri nella memoria. SageMaker di solito lo gestisce automaticamente; tuttavia, quando si dividono i batch manualmente, questo deve essere regolato in base alla memoria.

Il codice seguente è un esempio per un processo di trasformazione batch:

s3_bucket_name= 'SageMaker-us-west-2-XXXXXXXX'
batch_input = f"s3://{s3_bucket_name}/folder/jobename_TorchServe_SageMaker/"
batch_output = f"s3://{s3_bucket_name}/folder/jobname_TorchServe_SageMaker_output/" batch_job_name = 'job-batch' + time.strftime("%Y-%m-%d-%H-%M-%S", time.gmtime())
batch_job_name request = { "ModelClientConfig": { "InvocationsTimeoutInSeconds": 3600, "InvocationsMaxRetries": 1, }, "TransformJobName": batch_job_name, "ModelName": model_name, "MaxConcurrentTransforms":1, "BatchStrategy": "MultiRecord", "TransformOutput": {"S3OutputPath": batch_output, "AssembleWith": "Line", "Accept": "application/json"}, "TransformInput": { "DataSource": { "S3DataSource": {"S3DataType": "S3Prefix", "S3Uri": batch_input} }, "SplitType" : "Line", "ContentType": "application/json", }, "TransformResources": {"InstanceType": "ml.p2.xlarge", "InstanceCount": 1},
}

Quando utilizziamo le impostazioni precedenti e lanciamo il nostro processo di trasformazione, legge i file di input dal bucket S3 di origine in batch e li invia per l'inferenza. I risultati vengono riscritti nel bucket S3 specificato negli output.

Il seguente frammento di codice mostra come creare e avviare un processo utilizzando le impostazioni precedenti:

sm.create_transform_job(**request) while True: response = sm.describe_transform_job(TransformJobName=batch_job_name) status = response["TransformJobStatus"] if status == "Completed": print("Transform job ended with status: " + status) break if status == "Failed": message = response["FailureReason"] print("Transform failed with the following error: {}".format(message)) raise Exception("Transform job failed") print("Transform job is still in status: " + status) time.sleep(30)

Conclusione

In questo post, abbiamo esaminato le due modalità offerte da SageMaker per l'inferenza online e offline. Il primo utilizza il batch dinamico fornito in TorchServe per raggruppare le richieste da più client. Quest'ultimo utilizza un processo di trasformazione SageMaker per raggruppare le richieste dai file di input in un bucket S3 ed eseguire l'inferenza.

Abbiamo anche mostrato come servire i modelli su SageMaker utilizzando le immagini del contenitore del toolkit di inferenza PyTorch nativo di SageMaker e come utilizzare i contenitori personalizzati per i casi d'uso che richiedono impostazioni di configurazione avanzate di TorchServe.

Mentre TorchServe continua ad evolversi per soddisfare le esigenze della comunità PyTorch, nuove funzionalità vengono integrate in SageMaker per fornire modi performanti per servire i modelli in produzione. Per ulteriori informazioni, consulta il Repo GitHub TorchServe e la Esempi di SageMaker.


Informazioni sugli autori

Phi Nguyen è un architetto di soluzioni presso AWS che aiuta i clienti nel loro viaggio verso il cloud con particolare attenzione a data lake, analisi, tecnologie semantiche e machine learning. Nel tempo libero, puoi trovarlo andare al lavoro in bicicletta, allenare la squadra di calcio di suo figlio o godersi una passeggiata nella natura con la sua famiglia.

Nikhil Kulkarni è uno sviluppatore di software con AWS Machine Learning, che si concentra sul rendere i carichi di lavoro di machine learning più performanti sul cloud ed è un co-creatore di AWS Deep Learning Containers per la formazione e l'inferenza. È appassionato di Deep Learning Systems distribuiti. Al di fuori del lavoro, ama leggere libri, giocherellare con la chitarra e fare la pizza.

Hamid Shojanazeri è un ingegnere partner presso Pytorch che si occupa dell'ottimizzazione e del servizio di modelli ad alte prestazioni OSS. Hamid ha conseguito un dottorato di ricerca in visione artificiale e ha lavorato come ricercatore in laboratori multimediali in Australia, Malesia e come capo PNL in Opus.ai. Gli piace trovare soluzioni più semplici a problemi difficili ed è un appassionato d'arte nel tempo libero.

Geeta Chauhan guida AI Partner Engineering presso Meta AI con esperienza nella creazione di piattaforme distribuite resilienti, anti-fragili e su larga scala per startup e Fortune 500. Il suo team lavora con partner strategici, leader del machine learning in tutto il settore e tutti i principali fornitori di servizi cloud per creare e lanciare nuovi servizi ed esperienze di prodotti AI; e portando i modelli PyTorch dalla ricerca alla produzione. È una vincitrice di Women in IT – Silicon Valley – CTO dell'anno 2019, ACM Distinguished Speaker e leader di pensiero su argomenti che vanno dall'etica nell'intelligenza artificiale, Deep Learning, Blockchain, IoT. È appassionata di promuovere l'uso dell'IA per il bene.

Fonte: https://aws.amazon.com/blogs/machine-learning/optimize-your-inference-jobs-using-dynamic-batch-inference-with-torchserve-on-amazon-sagemaker/

Timestamp:

Di più da Blog di apprendimento automatico AWS