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:
- Scarica il repository TorchServe per accedere agli esempi. Esegui il seguente codice:
- Scarica un modello di classificazione delle immagini DenseNet dal repository di modelli PyTorch ufficiale. Esegui il seguente codice:
- 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 iltorch-model-archiver
strumento in TorchServe per creare un file .mar. Non è necessario creare un gestore personalizzato, basta specificare--handler image_classifier
e imposta automaticamente un gestore per te. Ora che hai il file .mar, ospitalo con TorchServe. Esegui il seguente codice:Si riceve il seguente output:
- Ospita un modello. Esegui il seguente codice:
- Prova TorchServe aprendo un altro terminale sullo stesso host ed eseguendo il codice seguente (puoi usare tmux per gestire più sessioni):
Si riceve il seguente output:
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:
- Scarica un nuovo modello con il seguente codice:
- Registra il nuovo modello con il seguente codice:
Si riceve il seguente output:
È inoltre possibile interrogare l'elenco dei modelli registrati con il seguente codice:
Si riceve il seguente output:
- Lavoratori in scala per un modello. Un nuovo modello non ha lavoratori assegnati, quindi imposta un numero minimo di lavoratori con il seguente codice:
Si riceve il seguente output:
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.
- Annulla la registrazione del modello con il seguente codice:
- Per eseguire la versione di un modello, quando si chiama
torch-model-archiver
, passa un numero di versione a--version
Vedi il seguente codice:
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
, DiskUtilization
e 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:
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:
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).
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:
Caricamento del modello su Amazon S3
Per caricare il modello su Amazon S3, completa i seguenti passaggi:
- Crea una sessione boto3 e ottieni le informazioni sulla regione e sull'account
- Ottieni il nome del bucket Amazon SageMaker S3 predefinito
- Crea un file tar.gz compresso dal file densenet161.mar, perché Amazon SageMaker prevede che i modelli si trovino in un file tar.gz.
- Carica il modello nel tuo bucket S3 nella directory dei modelli.
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:
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:
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:
- Crea un modello. La funzione modello prevede il nome dell'immagine del contenitore TorchServe e la posizione dei modelli addestrati. Vedere il codice seguente:
Per ulteriori informazioni sulla funzione modello, vedere Modello.
- Sulla console Amazon SageMaker, per vedere i dettagli del modello, scegli Modelli.
- 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:
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.
- Sulla console Amazon SageMaker, per vedere l'endpoint ospitato, scegli endpoint.
- Testare il modello con il seguente codice:
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.