MLOps per modelli Python con Azure Machine Learning

Archiviazione BLOB di Azure
Registro Azure Container
Azure DevOps
Azure Machine Learning
Azure Pipelines

Questa architettura di riferimento illustra come implementare l'integrazione continua (CI), il recapito continuo (CD) e la pipeline di ripetizione del training per un'applicazione di intelligenza artificiale usando Azure DevOps e Azure Machine Learning. La soluzione è basata sul set di dati di diabete scikit-learn, ma può essere facilmente adattata per qualsiasi scenario di intelligenza artificiale e altri sistemi di compilazione diffusi, ad esempio Jenkins o Travis.

Un'implementazione di riferimento per questa architettura è disponibile in GitHub.

Architettura

Diagramma dell'architettura DevOps di Machine Learning.

Scaricare un file di Visio di questa architettura.

Workflow

Questa architettura è costituita dai servizi seguenti:

Azure Pipelines. Questo sistema di compilazione e test si basa su Azure DevOps e usato per le pipeline di compilazione e versione. Azure Pipelines suddivide queste pipeline in passaggi logici denominati attività. Ad esempio, l'attività dell'interfaccia della riga di comando di Azure semplifica l'uso delle risorse di Azure.

Azure Machine Learning è un servizio cloud per il training, l'assegnazione di punteggi, la distribuzione e la gestione di modelli di Machine Learning su larga scala. Questa architettura usa Azure Machine Learning Python SDK per creare un'area di lavoro, risorse di calcolo, pipeline di Machine Learning e l'immagine di assegnazione dei punteggi. Un'area di lavoro di Azure Machine Learning offre lo spazio in cui sperimentare, eseguire il training e distribuire modelli di Machine Learning.

L'ambiente di calcolo di Azure Machine Learning è un cluster di macchine virtuali su richiesta con scalabilità automatica e opzioni del nodo GPU e CPU. Il processo di training viene eseguito in questo cluster.

Le pipeline di Azure Machine Learning offrono flussi di lavoro di Machine Learning riutilizzabili che possono essere riutilizzati in scenari diversi. Il training, la valutazione del modello, la registrazione del modello e la creazione di immagini vengono eseguiti in passaggi distinti all'interno di queste pipeline per questo caso d'uso. La pipeline viene pubblicata o aggiornata alla fine della fase di compilazione e viene attivata all'arrivo dei nuovi dati.

Archiviazione BLOB di Azure. I contenitori BLOB vengono usati per archiviare i log dal servizio di assegnazione dei punteggi. In questo caso, vengono raccolti sia i dati di input che la stima del modello. Dopo una trasformazione, questi log possono essere usati per la ripetizione del training del modello.

Registro Azure Container. Lo script Python di assegnazione dei punteggi viene incluso nel pacchetto come immagine Docker e il controllo delle versioni nel Registro di sistema.

Istanze di Azure Container. Come parte della pipeline di versione, l'ambiente di controllo di qualità e di gestione temporanea viene simulato distribuendo l'immagine del servizio Web di assegnazione dei punteggi in Istanze di Container, che offre un modo semplice e serverless per eseguire un contenitore.

Servizio Azure Kubernetes. Dopo aver testato accuratamente l'immagine del servizio Web di assegnazione dei punteggi nell'ambiente di controllo di qualità, viene distribuita nell'ambiente di produzione in un cluster Kubernetes gestito.

Azure Application Insights. Questo servizio di monitoraggio viene usato per rilevare le anomalie delle prestazioni.

MLOps Pipeline

Questa soluzione illustra l'automazione end-to-end di varie fasi di un progetto di intelligenza artificiale usando strumenti già noti ai software engineer. Il problema di Machine Learning è semplice per mantenere l'attenzione sulla pipeline DevOps. La soluzione usa il set di dati scikit-learn diabetes e crea un modello di regressione lineare ridge per stimare la probabilità di diabete.

Questa soluzione si basa sulle tre pipeline seguenti:

  • Pipeline di compilazione. Compila il codice ed esegue una suite di test.
  • Ripetere il training della pipeline. Ripete il training del modello in base a una pianificazione o quando diventano disponibili nuovi dati.
  • Pipeline di versione. Operazionalizza l'immagine di assegnazione dei punteggi e la promuove in modo sicuro in ambienti diversi.

Le sezioni successive descrivono ognuna di queste pipeline.

Pipeline di compilazione

La pipeline CI viene attivata ogni volta che viene archiviato il codice. Pubblica una pipeline di Azure Machine Learning aggiornata dopo la compilazione del codice e l'esecuzione di un gruppo di test. La pipeline di compilazione è costituita dalle attività seguenti:

  • Qualità del codice. Questi test assicurano che il codice sia conforme agli standard del team.

  • Unit test. Questi test assicurano che il codice funzioni, abbia una code coverage adeguata ed è stabile.

  • Test dei dati. Questi test verificano che gli esempi di dati siano conformi allo schema e alla distribuzione previsti. Personalizzare questo test per altri casi d'uso ed eseguirlo come pipeline di integrità dei dati separata che viene attivata man mano che arrivano nuovi dati. Ad esempio, spostare l'attività di test dei dati in una pipeline di inserimento dati in modo da poterla testare in precedenza.

Nota

È consigliabile valutare la possibilità di abilitare le procedure DevOps per i dati usati per eseguire il training dei modelli di Machine Learning, ma questo argomento non è trattato in questo articolo. Per altre informazioni sull'architettura e sulle procedure consigliate per CI/CD di una pipeline di inserimento dati, vedere DevOps per una pipeline di inserimento dati.

Quando si configura l'infrastruttura per Azure Machine Learning e Python SDK, vengono eseguite le attività una tantum seguenti:

  • Creare l'area di lavoro che ospita tutte le risorse correlate ad Azure Machine Learning.
  • Creare le risorse di calcolo che eseguono il processo di training.
  • Creare la pipeline di Machine Learning con lo script di training aggiornato.
  • Pubblicare la pipeline di Machine Learning come endpoint REST per orchestrare il flusso di lavoro di training. La sezione successiva descrive questo passaggio.

Ripetere il training della pipeline

La pipeline di Machine Learning orchestra il processo di ripetizione del training del modello in modo asincrono. La ripetizione del training può essere attivata in base a una pianificazione o quando i nuovi dati diventano disponibili chiamando l'endpoint REST della pipeline pubblicata nel passaggio precedente.

Questa pipeline illustra i passaggi seguenti:

  • Training del modello. Lo script Python di training viene eseguito nella risorsa di calcolo di Azure Machine Learning per ottenere un nuovo file di modello archiviato nella cronologia di esecuzione. Poiché il training è l'attività a elevato utilizzo di calcolo in un progetto di intelligenza artificiale, la soluzione usa l'ambiente di calcolo di Azure Machine Learning.

  • Valutazione del modello. Un semplice test di valutazione confronta il nuovo modello con il modello esistente. Solo quando il nuovo modello è migliore viene alzato di livello. In caso contrario, il modello non è registrato e la pipeline viene annullata.

  • Registrare il modello. Il modello sottoposto a ripetizione del training viene registrato con il registro dei modelli di Azure Machine Learning. Questo servizio fornisce il controllo della versione per i modelli insieme ai tag di metadati in modo che possano essere facilmente riprodotti.

Pipeline di versione

Questa pipeline illustra come rendere operativa l'immagine di assegnazione dei punteggi e promuoverla in modo sicuro in ambienti diversi. Questa pipeline è suddivisa in due ambienti, qa e produzione:

Ambiente qa

  • Trigger dell'artefatto del modello. Le pipeline di versione vengono attivate ogni volta che è disponibile un nuovo artefatto. Un nuovo modello registrato in Gestione modelli di Azure Machine Learning viene considerato come artefatto di versione. In questo caso, viene attivata una pipeline per ogni nuovo modello.

  • Creare un'immagine di assegnazione dei punteggi. Il modello registrato viene inserito in un pacchetto con uno script di assegnazione dei punteggi e le dipendenze Python (file YAML Conda) in un'immagine Docker di operazionalizzazione. Il controllo della versione dell'immagine avviene automaticamente tramite Registro Azure Container.

  • Eseguire la distribuzione in Istanze di Container. Questo servizio viene usato per creare un ambiente non di produzione. L'immagine di assegnazione dei punteggi viene distribuita anche qui e viene usata principalmente per i test. Istanze di Container offre un modo semplice e rapido per testare l'immagine Docker.

  • Testare il servizio Web. Un semplice test dell'API assicura che l'immagine sia stata distribuita correttamente.

Ambiente di produzione

  • Eseguire la distribuzione in servizio Azure Kubernetes. Questo servizio viene usato per distribuire un'immagine di assegnazione dei punteggi come servizio Web su larga scala in un ambiente di produzione.

  • Testare il servizio Web. Un semplice test dell'API assicura che l'immagine sia stata distribuita correttamente.

Considerazioni

Queste considerazioni implementano i pilastri di Azure Well-Architected Framework, che è un set di set di principi guida che possono essere usati per migliorare la qualità di un carico di lavoro. Per altre informazioni, vedere Framework ben progettato di Microsoft Azure.

Scalabilità

una pipeline di compilazione in Azure DevOps può essere ridimensionata per applicazioni di qualsiasi dimensione. Le pipeline di compilazione hanno un timeout massimo che varia a seconda dell'agente su cui vengono eseguite. Le compilazioni possono essere eseguite per sempre sugli agenti self-hosted (agenti privati). Per gli agenti ospitati da Microsoft per un progetto pubblico, le compilazioni possono essere eseguite per sei ore. Per i progetti privati, il limite è di 30 minuti.

Per usare il timeout massimo, impostare la proprietà seguente nel file YAML di Azure Pipelines:

jobs:
- job: <job_name>
  timeoutInMinutes: 0

Idealmente, completare rapidamente la pipeline di compilazione ed eseguire solo unit test e un subset di altri test. In questo modo è possibile convalidare rapidamente le modifiche e risolverle in caso di problemi. Eseguire test a esecuzione prolungata durante gli orari di minore attività.

La pipeline di versione pubblica un servizio Web di assegnazione dei punteggi in tempo reale. Una versione dell'ambiente qa viene eseguita usando Istanze di Container per praticità, ma è possibile usare un altro cluster Kubernetes in esecuzione nell'ambiente qa/staging.

Ridimensionare l'ambiente di produzione in base alle dimensioni del cluster servizio Azure Kubernetes. Le dimensioni del cluster dipendono dal carico previsto per il servizio Web di assegnazione dei punteggi distribuito. Per le architetture di assegnazione dei punteggi in tempo reale, la velocità effettiva è una metrica di ottimizzazione chiave. Per gli scenari di apprendimento non avanzato, la CPU deve essere sufficiente per gestire il carico; Tuttavia, per i carichi di lavoro di Deep Learning, quando la velocità è un collo di bottiglia, le GPU offrono in genere prestazioni migliori rispetto alle CPU. servizio Azure Kubernetes supporta sia i tipi di nodo CPU che GPU, motivo per cui questa soluzione la usa per la distribuzione di immagini. Per altre informazioni, vedere GPU e CPU per la distribuzione di modelli di Deep Learning.

Ridimensionare la pipeline di ripetizione del training in base al numero di nodi nella risorsa di calcolo di Azure Machine Learning e usare l'opzione di scalabilità automatica per gestire il cluster. Questa architettura usa CPU. Per i carichi di lavoro di Deep Learning, le GPU sono una scelta migliore e sono supportate dall'ambiente di calcolo di Azure Machine Learning.

Gestione

  • Monitorare il processo di ripetizione del training. Le pipeline di Machine Learning orchestrano la ripetizione del training in un cluster di computer e offrono un modo semplice per monitorarli. Usare l'interfaccia utente di Azure Machine Learning ed esaminare la sezione pipeline per i log. In alternativa, questi log vengono scritti anche nel BLOB e possono essere letti da questa posizione e usando strumenti come Archiviazione di Azure Explorer.

  • Logging (Wiki Microsoft/ApplicationInsights-aspnetcore: registrazione). Azure Machine Learning offre un modo semplice per eseguire la registrazione in ogni passaggio del ciclo di vita di Machine Learning. I log vengono archiviati in un contenitore BLOB. Per altre informazioni, vedere Abilitare la registrazione in Azure Machine Learning. Per un monitoraggio più completo, configurare Application Insights per l'uso dei log.

  • Sicurezza. Tutti i segreti e le credenziali vengono archiviati in Azure Key Vault e accessibili in Azure Pipelines usando gruppi di variabili.

Ottimizzazione dei costi

L'ottimizzazione dei costi riguarda l'analisi dei modi per ridurre le spese non necessarie e migliorare l'efficienza operativa. Per altre informazioni, vedere Panoramica del pilastro di ottimizzazione dei costi.

Azure DevOps è gratuito per progetti open source e progetti di piccole dimensioni con un massimo di cinque utenti. Per i team più grandi, acquistare un piano in base al numero di utenti.

Il calcolo è il più grande driver di costo in questa architettura e il relativo costo varia a seconda del caso d'uso. Questa architettura usa l'ambiente di calcolo di Azure Machine Learning, ma sono disponibili altre opzioni . Azure Machine Learning non aggiunge alcun supplemento oltre al costo delle macchine virtuali che supportano il cluster di calcolo. Configurare il cluster di calcolo in modo che abbia almeno 0 nodi, in modo che, quando non in uso, possa ridurre fino a 0 nodi e non comportare costi. Il costo di calcolo dipende dal tipo di nodo, da un numero di nodi e dalla modalità di provisioning (priorità bassa o dedicata). È possibile stimare il costo per Machine Learning e altri servizi usando il calcolatore prezzi di Azure.

Distribuire lo scenario

Per distribuire questa architettura di riferimento, seguire i passaggi descritti nella Guida introduttiva nel repository GitHub.

Collaboratori

Questo articolo viene gestito da Microsoft. Originariamente è stato scritto dai seguenti contributori.

Autore principale:

  • Baltimoreet Singh Solanki | Senior Software Engineer

Passaggi successivi