Logo Zephyrnet

Distribuzione di modelli PyTorch per inferenza su scala mediante TorchServe

Data:

Molti servizi con cui interagisci oggi si basano sull'apprendimento automatico (ML). Dalla ricerca online e dai consigli sui prodotti al riconoscimento vocale e alla traduzione linguistica, questi servizi necessitano di modelli ML per fornire previsioni. Man mano che il ML si fa strada in un numero ancora maggiore di servizi, affronti la sfida di raccogliere i risultati del tuo duro lavoro e distribuire il modello in modo rapido e affidabile alla produzione. E con l'aumento del numero di persone che utilizzano questi servizi, è ancora più difficile assicurarsi che i modelli forniscano previsioni a bassa latenza in modo sicuro e affidabile a milioni di utenti contemporaneamente.

Gli sviluppatori utilizzano molti diversi framework open source per lo sviluppo del modello. Negli ultimi anni, PyTorch è diventato il framework di deep learning preferito da molti ricercatori, sviluppatori e data scientist che sviluppano applicazioni basate su ML. Preferiscono PyTorch per la sua semplicità e il modo Pythonico di implementare e addestrare i modelli e per la possibilità di passare senza problemi tra le modalità desiderose e quelle grafiche. Tuttavia, fino ad ora non era un modo semplice e supportato in modo nativo per servire i modelli PyTorch in produzione su larga scala.

AWS è entusiasta di condividere la versione sperimentale di Torcia Servire, una libreria di modelli open source per PyTorch.

AWS ha sviluppato TorchServe in collaborazione con Facebook. AWS e Facebook manterranno e continueranno a contribuire a TorchServe, insieme alla più ampia community di PyTorch. Con oltre l'83% dei progetti PyTorch basati su cloud accade su AWS, siamo entusiasti di lanciare TorchServe per affrontare la difficoltà di implementare i modelli PyTorch. Con TorchServe, puoi distribuire i modelli PyTorch in modalità desiderosa o grafica utilizzando TorchScript, servire più modelli contemporaneamente, modelli di produzione di versioni per test A/B, caricare e scaricare modelli in modo dinamico e monitorare registri dettagliati e metriche personalizzabili.

TorchServe è facile da usare. Viene fornito con una comoda CLI da distribuire localmente ed è facile da impacchettare in un container e con cui è possibile scalare Amazon Sage Maker or Amazon EX. Con i gestori predefiniti per problemi comuni come la classificazione delle immagini, il rilevamento degli oggetti, la segmentazione delle immagini e la classificazione del testo, puoi eseguire la distribuzione con poche righe di codice, non dovrai più scrivere lunghi gestori di servizi per l'inizializzazione, la preelaborazione e la post-elaborazione. TorchServe è open source, il che significa che è completamente aperto ed estensibile per soddisfare le tue esigenze di distribuzione.

Questo post esamina in modo approfondito TorchServe, le sue caratteristiche e capacità principali e come utilizzarlo. Fornisce esempi di codice per illustrarne i vantaggi e i concetti chiave e mostra anche un esempio per il ridimensionamento dell'inferenza PyTorch utilizzando TorchServe e Amazon SageMaker.

Prima del rilascio di TorchServe, se volevi servire i modelli PyTorch, dovevi sviluppare le tue soluzioni di servizio del modello. Dovevi sviluppare gestori personalizzati per il tuo modello, sviluppare un server modello, creare il tuo container Docker, capire come renderlo accessibile tramite la rete e integrarlo con il tuo sistema di orchestrazione del cluster e così via.

Con TorchServe, ottieni molte funzionalità pronte all'uso. Ti offre la piena flessibilità di distribuire modelli PyTorch addestrati in modo efficiente su larga scala senza dover scrivere gestori personalizzati per i modelli più diffusi. Puoi passare da un modello addestrato alla distribuzione di produzione con poche righe di codice.

Iniziare con TorchServe

Iniziare con TorchServe è facile. Questo post ha testato gli esempi su un c5.xlarge Amazon EC2 istanza che esegue l'AMI di Deep Learning. Puoi anche provare i passaggi sul tuo laptop o desktop locale. Per istruzioni sull'avvio di un'istanza Amazon EC2, consulta Guida introduttiva ad Amazon EC2.

Per installare TorchServe, segui le istruzioni su GitHub. Si consiglia di utilizzare un Conda o un altro ambiente virtuale per gestire le dipendenze. Dopo aver installato TorchServe, sei pronto per distribuire il tuo primo modello completando i seguenti passaggi:

  1. Scarica il repository TorchServe per accedere agli esempi. Esegui il seguente codice:
    mkdir torchserve-examples
    cd torchserve-examples
    git clone https://github.com/pytorch/serve.git

  2. Scarica un modello di classificazione delle immagini DenseNet dal repository di modelli PyTorch ufficiale. Esegui il seguente codice:
    wget https://download.pytorch.org/models/densenet161-8d451a50.pth

  3. Converti il ​​modello da PyTorch al formato TorchServe. TorchServe utilizza un formato di archivio del modello con estensione .mar. Un file .mar racchiude i checkpoint del modello o un file di definizione del modello con state_dict (oggetto dizionario che mappa ogni livello al suo parametro tensore). Puoi usare il torch-model-archiver strumento in TorchServe per creare un file .mar. Non è necessario creare un gestore personalizzato, basta specificare --handler image_classifiere imposta automaticamente un gestore per te. Ora che hai il file .mar, ospitalo con TorchServe. Esegui il seguente codice:
    torch-model-archiver --model-name densenet161 --version 1.0 --model-file serve/examples/image_classifier/densenet_161/model.py --serialized-file densenet161-8d451a50.pth --extra-files serve/examples/image_classifier/index_to_name.json --handler image_classifier ls *.mar
    

    Si riceve il seguente output:

    densenet161.mar serve

  4. Ospita un modello. Esegui il seguente codice:
    mkdir model_store
    mv densenet161.mar model_store/
    torchserve --start --model-store model_store --models densenet161=densenet161.mar

  5. Prova TorchServe aprendo un altro terminale sullo stesso host ed eseguendo il codice seguente (puoi usare tmux per gestire più sessioni):
    curl -O https://s3.amazonaws.com/model-server/inputs/kitten.jpg
    curl -X POST http://127.0.0.1:8080/predictions/densenet161 -T kitten.jpg

    Si riceve il seguente output:

    [ { "tiger_cat": 0.4693356156349182 }, { "tabby": 0.46338796615600586 }, { "Egyptian_cat": 0.06456131488084793 }, { "lynx": 0.0012828155886381865 }, { "plastic_bag": 0.00023323005007114261 }
    ]

Distribuzione senza modifiche del codice per modelli standard con gestori predefiniti

Molti casi d'uso di deep learning rientrano in una delle seguenti categorie: classificazione delle immagini, rilevamento di oggetti, segmentazione delle immagini e classificazione del testo. Se stai lavorando su una di queste applicazioni, puoi distribuire senza modifiche al codice, come nella sezione precedente. Non è necessario convertire da desideroso a TorchScript o viceversa, o scrivere gestori di servizi per l'inizializzazione, la preelaborazione e la postelaborazione.

Il servizio della torcia torch-model-archiver lo strumento può rilevare e gestire automaticamente le diverse rappresentazioni di PyTorch (modalità desiderosa e TorchScript). Per i modelli comuni supportati da pacchetti come TorchVision, TorchText e TorchAudio, torch-model-archiver utilizza un gestore predefinito per l'inizializzazione, la pre-elaborazione e la post-elaborazione. È comunque possibile scrivere gestori personalizzati se si dispone di un modello personalizzato o se si desidera introdurre una logica personalizzata per estendere i gestori predefiniti.

Per un elenco completo dei gestori predefiniti supportati, vedere il Repository GitHub. Per istruzioni su come scrivere un gestore personalizzato, vedere il Repository GitHub.

Ospitare più modelli e ridimensionare i lavoratori

TorchServe fornisce un'API di gestione per elencare i modelli registrati, registrare nuovi modelli sui server esistenti, annullare la registrazione dei modelli attuali, aumentare o diminuire il numero di lavoratori per modello, descrivere lo stato di un modello, aggiungere versioni e impostare versioni predefinite. L'API di gestione è in ascolto sulla porta 8081 ed è accessibile solo da localhost per impostazione predefinita, ma è possibile modificare il comportamento predefinito.

Per registrare un nuovo modello, completare i seguenti passaggi:

  1. Scarica un nuovo modello con il seguente codice:
    wget https://download.pytorch.org/models/fasterrcnn_resnet50_fpn_coco-258fb6c6.pth
    torch-model-archiver --model-name fastrcnn --version 1.0 --model-file serve/examples/object_detector/fast-rcnn/model.py --serialized-file fasterrcnn_resnet50_fpn_coco-258fb6c6.pth --handler object_detector --extra-files serve/examples/object_detector/index_to_name.json mv fastrcnn.mar model_store/

  2. Registra il nuovo modello con il seguente codice:
    curl -X POST "http://localhost:8081/models?url=fastrcnn.mar"
    

    Si riceve il seguente output:

    { "status": "Model "fastrcnn" registered"
    }
    

    È inoltre possibile interrogare l'elenco dei modelli registrati con il seguente codice:

    curl "http://localhost:8081/models"

    Si riceve il seguente output:

    { "models": [ { "modelName": "densenet161", "modelUrl": "densenet161.mar" }, { "modelName": "fastrcnn", "modelUrl": "fastrcnn.mar" } ]
    }
    

  3. Lavoratori in scala per un modello. Un nuovo modello non ha lavoratori assegnati, quindi imposta un numero minimo di lavoratori con il seguente codice:
    curl -v -X PUT "http://localhost:8081/models/fastrcnn?min_worker=2"
    curl "http://localhost:8081/models/fastrcnn"
    

    Si riceve il seguente output:

    [ { "modelName": "fastrcnn", "modelVersion": "1.0", "modelUrl": "fastrcnn.mar", "runtime": "python", "minWorkers": 2, "maxWorkers": 2, "batchSize": 1, "maxBatchDelay": 100,
    …
    …

    Se il tuo modello è ospitato su una CPU con molti core come l'istanza c5.24xlarge EC2 con 96 vCPU, puoi facilmente ridimensionare il numero di thread usando il metodo descritto in precedenza.

  4. Annulla la registrazione del modello con il seguente codice:
    curl -X DELETE http://localhost:8081/models/fastrcnn/

  5. Per eseguire la versione di un modello, quando si chiama torch-model-archiver, passa un numero di versione a --version Vedi il seguente codice:
    torch-model-archiver --model-name fastrcnn --version 1.0 ...

Esecuzione di previsioni batch (o inferenze batch)

Per alcune applicazioni, potrebbe essere necessario eseguire inferenze in batch. Se si dispone di un set di dati di grandi dimensioni e si desidera generare inferenze offline, è computazionalmente più efficiente raccogliere il set di dati in batch di grandi dimensioni ed elaborarli. In alcuni casi di utilizzo in tempo reale in cui si dispone di un budget di latenza più tollerante, è possibile raggruppare più richieste e fornire risultati, migliorare l'utilizzo delle risorse e ridurre le spese operative nel processo. Un altro caso d'uso del batch è la preelaborazione dei dati di addestramento con altri modelli prima dell'addestramento di un nuovo modello.

TorchServe supporta le inferenze batch in modo nativo. Per istruzioni sull'esecuzione delle inferenze batch di TorchServe, vedere il Repository GitHub.

Registrazione e metriche

TorchServe ti offre un facile accesso a i registri ed metrica che sono completamente personalizzabili. Per impostazione predefinita, TorchServe stampa i messaggi di registro su stderr ed stout. TorchServe utilizza log4je puoi personalizzare la registrazione modificando proprietà log4j.

TorchServe raccoglie anche metriche a livello di sistema come CPUUtilization, DiskUtilizatione altri per impostazione predefinita. Puoi anche specificare metriche personalizzate utilizzando l'API delle metriche. La schermata seguente mostra l'output di registro predefinito quando viene richiesta un'inferenza da TorchServe.

Distribuzioni PyTorch su larga scala utilizzando TorchServe e Amazon SageMaker

Amazon SageMaker è un servizio completamente gestito con funzionalità per l'etichettatura dei dati, lo sviluppo di modelli, l'addestramento di modelli su larga scala e le distribuzioni di modelli. Per la distribuzione e l'hosting, Amazon SageMaker offre una comoda distribuzione con un clic di modelli addestrati sui cluster di formazione Amazon SageMaker. Tuttavia, è anche completamente modulare: puoi inserire i tuoi algoritmi e contenitori e utilizzare solo i servizi di cui hai bisogno.

Questo post mostra come creare un container TorchServe e ospitarlo utilizzando Amazon SageMaker. Amazon SageMaker offre un'esperienza di hosting completamente gestita. Basta specificare il tipo di istanza e il numero massimo e minimo desiderati e Amazon SageMaker si occupa del resto.

Con poche righe di codice, puoi chiedere ad Amazon SageMaker di avviare le istanze, da cui scaricare il tuo modello Amazon S3 al tuo contenitore TorchServe e configura l'endpoint HTTPS sicuro per la tua applicazione. Sul lato client, ottieni previsioni con una semplice chiamata API a questo endpoint sicuro supportato da TorchServe.

Eseguendo l'esempio

Puoi eseguire l'esempio su istanze Amazon SageMaker Notebook, Amazon EC2 o sul tuo laptop o desktop. Se stai utilizzando un laptop o un desktop locale, assicurati di scaricare e installare il file CLI AWS e configuralo, SDK AWS per Python (boto3)e SDK Python di Amazon SageMaker. Dopo la distribuzione, i modelli sono ospitati su istanze di distribuzione completamente gestite di Amazon SageMaker.

Per un'esperienza più comoda, avvia un'istanza notebook Amazon SageMaker, che offre un'interfaccia notebook Jupyter e viene fornita con tutte le librerie AWS installate e pronte per l'uso. Per ulteriori informazioni, vedere Utilizza le istanze notebook Amazon SageMaker.

Questo post presuppone che tu stia eseguendo i seguenti passaggi su un'istanza notebook Amazon SageMaker.

Ruoli e politiche IAM

Quando si creare una nuova istanza di notebook, ti viene richiesto di creare un nuovo ruolo IAM. Vuoi creare un ruolo con accesso Amazon S3. La console Amazon SageMaker ti guida attraverso questo processo.

Il tuo nuovo ruolo sembra AmazonSageMaker-ExecutionRole-XXX, con un identificatore univoco per XXX. Perché è necessario creare e inviare un container TorchServe a Amazon ECR, devi anche aggiungere il AmazonEC2ContainerRegistryFullAccess policy al ruolo dell'istanza notebook. Puoi farlo su IAM console o utilizzando l'AWS CLI. Vedere il codice seguente:

aws iam attach-role-policy --policy-arn arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryFullAccess --role-name AmazonSageMaker-ExecutionRole-XXX

Per ulteriori informazioni, vedere Aggiunta e rimozione delle autorizzazioni di identità IAM.

A seguire

Il codice, i file di configurazione, i notebook Jupyter e i Dockerfile utilizzati in questo post sono disponibili su GitHub. I passaggi nell'esempio seguente provengono da deploy_torchserve.ipynb Notebook Jupyter.

Per seguire, apri il deploy_torchserve.ipynb notebook ed eseguire ogni cella. In alternativa, puoi copiare e incollare i seguenti passaggi in una cella separata in un nuovo notebook Jupyter ed eseguirli in ordine.

La seguente schermata mostra il deploy_torchserve.ipynb esempio.

Clonazione del repository di esempio

Per clonare il repository di esempio, inserisci il seguente codice:

git clone https://github.com/shashankprasanna/torchserve-examples.git
cd torchserve-examples

Clona il repository TorchServe e installa torch-model-archiver

Usa lo strumento `torch-model-archiver` per creare un file di archivio del modello. Il file di archivio del modello .mar contiene i checkpoint del modello insieme al suo `state_dict` (oggetto dizionario che mappa ogni livello al suo tensore di parametro).

!git clone https://github.com/pytorch/serve.git
!pip install serve/model-archiver/

Download di un modello PyTorch, creazione di un archivio TorchServe e caricamento su Amazon S3

Per scaricare un modello PyTorch e creare un archivio TorchServe, inserisci il seguente codice:

!wget -q https://download.pytorch.org/models/densenet161-8d451a50.pth model_file_name = 'densenet161'
!torch-model-archiver --model-name {model_file_name} --version 1.0 --model-file serve/examples/image_classifier/densenet_161/model.py --serialized-file densenet161-8d451a50.pth --extra-files serve/examples/image_classifier/index_to_name.json --handler image_classifier

Caricamento del modello su Amazon S3

Per caricare il modello su Amazon S3, completa i seguenti passaggi:

  1. Crea una sessione boto3 e ottieni le informazioni sulla regione e sull'account
    import boto3, time, json
    sess = boto3.Session()
    sm = sess.client('sagemaker')
    region = sess.region_name
    account = boto3.client('sts').get_caller_identity().get('Account') import sagemaker
    role = sagemaker.get_execution_role()
    sagemaker_session = sagemaker.Session(boto_session=sess)
    

  2. Ottieni il nome del bucket Amazon SageMaker S3 predefinito
    bucket_name = sagemaker_session.default_bucket()
    prefix = 'torchserve'
    

  3. Crea un file tar.gz compresso dal file densenet161.mar, perché Amazon SageMaker prevede che i modelli si trovino in un file tar.gz.
    !tar cvfz {model_file_name}.tar.gz densenet161.mar

  4. Carica il modello nel tuo bucket S3 nella directory dei modelli.
!aws s3 cp {model_file_name}.tar.gz s3://{bucket_name}/{prefix}/model

Creazione di un registro Amazon ECR

Crea un nuovo registro del contenitore Docker per le immagini del contenitore TorchServe. Amazon SageMaker estrae il container TorchServe da questo registro. Vedere il codice seguente:

registry_name = 'torchserve'
!aws ecr create-repository --repository-name torchserve

Creazione di un container TorchServe Docker e push su Amazon ECR

Il repository per questo post contiene già un Dockerfile per la creazione di un container TorchServe. Crea un'immagine del container Docker in locale e inviala al repository Amazon ECR che hai creato nel passaggio precedente. Vedere il codice seguente:

image_label = 'v1'
image = f'{account}.dkr.ecr.{region}.amazonaws.com/{registry_name}:{image_label}' !docker build -t {registry_name}:{image_label} .
!$(aws ecr get-login --no-include-email --region {region})
!docker tag {registry_name}:{image_label} {image}
!docker push {image}

Ottieni il seguente output che conferma che il container è stato creato e inviato correttamente ad Amazon ECR:

Hosting di un endpoint di inferenza

Esistono diversi modi per ospitare un endpoint di inferenza e fare previsioni. L'approccio più rapido consiste nell'utilizzare Amazon SageMaker Python SDK. Tuttavia, se intendi richiamare l'endpoint da un'applicazione client, dovresti utilizzare SDK Amazon per la lingua di tua scelta.

Hosting di un endpoint di inferenza ed esecuzione di previsioni con Amazon SageMaker SDK

Per ospitare un endpoint di inferenza ed effettuare previsioni utilizzando Amazon SageMaker SDK, completa i seguenti passaggi:

  1. Crea un modello. La funzione modello prevede il nome dell'immagine del contenitore TorchServe e la posizione dei modelli addestrati. Vedere il codice seguente:
    import sagemaker
    from sagemaker.model import Model
    from sagemaker.predictor import RealTimePredictor
    role = sagemaker.get_execution_role() model_data = f's3://{bucket_name}/models/{model_file_name}.tar.gz'
    sm_model_name = 'torchserve-densenet161' torchserve_model = Model(model_data = model_data, image = image, role = role, predictor_cls=RealTimePredictor, name = sm_model_name)
    

    Per ulteriori informazioni sulla funzione modello, vedere Modello.

  2. Sulla console Amazon SageMaker, per vedere i dettagli del modello, scegli Modelli.
  3. Distribuire l'endpoint del modello. Specifica il tipo di istanza e il numero di istanze su cui desideri che Amazon SageMaker esegua il container. Vedere il codice seguente:
    endpoint_name = 'torchserve-endpoint-' + time.strftime("%Y-%m-%d-%H-%M-%S", time.gmtime())
    predictor = torchserve_model.deploy(instance_type='ml.m4.xlarge', initial_instance_count=1, endpoint_name = endpoint_name)
    

    Puoi anche configurarlo per ridimensionare automaticamente in base a metriche, come il numero totale di chiamate. Per ulteriori informazioni, vedere Ridimensiona automaticamente i modelli Amazon SageMaker.

  4. Sulla console Amazon SageMaker, per vedere l'endpoint ospitato, scegli endpoint.
  5. Testare il modello con il seguente codice:
    !wget -q https://s3.amazonaws.com/model-server/inputs/kitten.jpg file_name = 'kitten.jpg'
    with open(file_name, 'rb') as f: payload = f.read() payload = payload response = predictor.predict(data=payload)
    print(*json.loads(response), sep = 'n')
    

La schermata seguente mostra l'output del richiamo del modello ospitato da TorchServe. La modella pensa che il gattino nell'immagine sia un gatto tigre o un gatto soriano.

Se stai creando applicazioni come app mobili o pagine Web che devono richiamare l'endpoint TorchServe per ottenere previsioni sui nuovi dati, puoi utilizzare Amazon API anziché Amazon SageMaker SDK. Ad esempio, se utilizzi Python sul lato client, utilizza Amazon SDK per Python (boto3). Per un esempio di come utilizzare boto3 per creare un modello, configurare un endpoint, creare un endpoint e infine eseguire inferenze sull'endpoint di inferenza, fare riferimento a questo esempio di notebook Jupyter su GitHub.

Conclusione

Questo post ha introdotto TorchServe e le sue caratteristiche e vantaggi principali. TorchServe è facile da usare sia per gli sviluppatori che preparano i modelli per la produzione, sia per gli ingegneri operativi che implementano i container in produzione. TorchServe supporta la modalità desiderosa e TorchScript e viene fornito con gestori predefiniti per i modelli più comunemente distribuiti, quindi puoi eseguire la distribuzione senza modifiche al codice. TorchServe può ospitare più modelli contemporaneamente e supporta il controllo delle versioni. Per un elenco completo delle funzionalità, vedere il  Repository GitHub.

Questo post ha anche presentato una demo end-to-end della distribuzione di modelli PyTorch su TorchServe utilizzando Amazon SageMaker. Puoi usarlo come modello per distribuire i tuoi modelli PyTorch su Amazon SageMaker. Un esempio completo è disponibile su GitHub.

Se hai domande o commenti su TorchServe o su questo post, lascia un commento qui sotto o crea un problema sul Repository GitHub.


Informazioni sugli autori

Shashank Prasanna è un evangelista tecnico di intelligenza artificiale e machine learning presso Amazon Web Services (AWS), dove si concentra sull'aiutare ingegneri, sviluppatori e data scientist a risolvere problemi complessi con l'apprendimento automatico. Prima di entrare in AWS, ha lavorato presso NVIDIA, MathWorks (produttori di MATLAB e Simulink) e Oracle in ruoli di marketing di prodotto, gestione del prodotto e sviluppo software.

Manoj Rao è uno sviluppatore di software con AWS. Lavora per rendere il runtime/inferenza ML il più possibile semplice. Nel tempo libero, armeggia con il kernel Linux, Emacs e scarabocchi sul suo blog.

Fonte: https://aws.amazon.com/blogs/machine-learning/deploying-pytorch-models-for-inference-at-scale-using-torchserve/

spot_img

L'ultima intelligenza

spot_img