MLflow su cloud
In questo articolo parlerò di come ospitare mlflow su cloud (AWS e GCP), eseguire esperimenti di machine learning, registrare parametri, metriche e archiviare il modello nel registro del modello
Cos'è mlflow?
mlflow è una piattaforma open source che gestisce il ciclo di vita del machine learning end-to-end. Le sue funzionalità principali sono:
- Monitoraggio degli esperimenti: mantiene tutti gli esperimenti di machine learning e la capacità di interrogarli
- Riproducibilità: impacchetta il codice di apprendimento automatico ed è in grado di riprodurre tali risultati su qualsiasi piattaforma
- Distribuzione: capacità di distribuire i modelli ML in una varietà di ambienti (es: AWS Sagemaker, GCP Cloud run, .. ecc.)
- Registro dei modelli: mantenimento di più versioni del modello in un repository centralizzato
Possiamo eseguire mlflow su macchine locali, ma ospitarlo su cloud ha i suoi vantaggi
- Possiamo sfruttare l'archiviazione cloud, la potenza di calcolo, la sicurezza, ecc
- Vista centralizzata di tutti gli esperimenti da ciascun membro del team
Abbiamo i seguenti 3 componenti principali in mlflow:
- Dashboard: è un'interfaccia utente in cui possiamo vedere l'elenco di esperimenti, parametri del modello, metriche .. ecc. per ogni esperimento
- Meta Store: utilizza un database back-end (MySql) per archiviare tutti gli esperimenti, i parametri, le metriche ecc.
- Artifactory Store: lo utilizza per file di grandi dimensioni, come il modello serializzato. In generale utilizziamo file system distribuiti come Amazon S3 o GCP Cloud Storage.
- Docker
- Database MySql
- File system distribuito
Il diagramma dell'architettura sopra mostra quali sono tutti i servizi AWS di cui abbiamo bisogno e come interagiscono per ospitare mlflow su AWS. Lanceremo mlflow utilizzando AWS Fargate che è senza server.
Per prima cosa, dobbiamo creare un file docker, che pacchettizzi mlflow e le sue dipendenze. Definiamo le seguenti dipendenze in requirements.txt
Il file docker per l'installazione di mlflow e l'esecuzione del server
Il file docker ha bucket e altri dettagli di connessione al database come variabili, questi valori verranno configurati come variabili di ambiente nella definizione dell'attività Fargate
Una volta che abbiamo il dockerfile, esegui il comando seguente per creare l'immagine docker
docker build -t mlflowtracker .
Ora, dobbiamo eseguire il push dell'immagine docker che abbiamo creato localmente nel registro dei container in AWS.
# Login
aws ecr get-login-password --region region | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.region.amazonaws.com
# Tag local docker image
docker tag <image_name> aws_account_id.dkr.ecr.region.amazonaws.com/repository_name:tag
# Push image
docker push aws_account_id.dkr.ecr.region.amazonaws.com/repository_name:tag
Successivamente abbiamo bisogno di MySql per mlflow per archiviare meta informazioni, per le quali creeremo un'istanza AWS RDS MySql
Per i passaggi per creare MySql in AWS RDS, fai clic qui
Dobbiamo creare un bucket S3 per mlflow per archiviare gli artefatti del modello. Vai su aws console, cerca s3, fornisci il nome del bucket e assicurati di bloccare tutto l'accesso pubblico e fai clic su "Crea bucket"
Successivamente dobbiamo creare il cluster AWS ECS selezionando fargate come compute. Vai alla console AWS e cerca Elastic Container Service e fai clic su "Crea cluster". Nella pagina di creazione del cluster, fornisci il nome del cluster, seleziona vpc e subnet. Per impostazione predefinita, viene selezionata l'opzione fargate.
In ECS, un'attività è un'entità a livello granulare che esegue l'immagine docker, è simile a un pod in Kubernetes. Quindi, dobbiamo creare una definizione dell'attività che utilizzerà l'immagine docker che abbiamo caricato su ECR. Qui definiamo i valori delle variabili d'ambiente. Per creare la definizione dell'attività, vai su Amazon Elastic Container Service > Definizioni dell'attività > Crea nuova definizione dell'attività e fornisci il nome dell'attività, l'URI dell'immagine che abbiamo caricato in ECR, la porta del container e le variabili di ambiente
Durante la creazione della definizione dell'attività seleziona il ruolo ecsTaskExecution che viene creato automaticamente da AWS, assicurati di aggiungere la policy di accesso s3 in modo che possa leggere e scrivere nel bucket s3
Una volta creata la definizione dell'attività, è necessario creare un servizio che utilizzi la definizione dell'attività creata sopra. Durante la creazione del servizio possiamo selezionare il numero minimo e massimo di attività di cui abbiamo bisogno (ho selezionato solo 1 attività), in modo che possa ridimensionarsi automaticamente. Abbiamo la possibilità di creare un bilanciamento del carico durante questo passaggio.
Per creare il servizio ECS, vai su Amazon Elastic Container Service > cluster > nome_cluster > Crea e fornisci il nome del servizio, seleziona la definizione dell'attività e la sua revisione che abbiamo creato in precedenza, inserisci il numero minimo e massimo di attività, seleziona vpc nella sezione networking, seleziona l'applicazione bilanciamento del carico nella sezione del bilanciamento del carico e fornire il nome, la porta del listner e il nome del gruppo di destinazione
Una volta creato il servizio, viene avviato il numero richiesto di attività, possiamo utilizzare l'URL del bilanciamento del carico per avviare il dashboard mlflow.
Nota: il sistema di bilanciamento del carico utilizza un gruppo di sicurezza che definisce le regole di rete in entrata e in uscita, è necessario modificare/aggiungere regole, in modo da poter accedere all'interfaccia utente mlflow.
Ora che abbiamo ospitato mlflow su AWS, eseguiamo un esperimento di machine learning dal nostro locale puntando a mlflow su cloud
Dopo aver eseguito l'esperimento, possiamo vedere tutti i parametri, le metriche e il modello in mlflow che abbiamo registrato durante l'esperimento
MLflow su GCP
Il diagramma dell'architettura sopra mostra i servizi GCP che abbiamo richiesto e come interagiscono per ospitare mlflow su GCP. Lanceremo mlflow utilizzando GCP Cloudrun che è senza server.
Possiamo usare lo stesso Dockerfile e requirements.txt (fai riferimento alla sezione MLflow su AWS) tranne per il fatto che dobbiamo cambiare boto3 in google-cloud-storage
Le variabili all'interno del Dockerfile per artefatto predefinito, i dettagli di connessione al database verranno configurati come variabili di ambiente in google cloudrun
Esegui i seguenti comandi per creare, codificare e inviare l'immagine docker a Google Container Registry (GCR)
# Build docker image
docker build -t mlflowtracker-gcp .
# Install docker credential helper using gcloud
gcloud components install docker-credential-gcr docker-credential-gcr configure-docker
# Tag docker image
docker tag <local_image_name> gcr.io/gcp_project_id/mlflowtracker-gcp:latest
# Push docker image
docker push gcr.io/gcp_project_id/mlflowtracker-gcp:latest
Abbiamo creato un'istanza database, ora è necessario creare un database e un utente in modo che mlflow possa utilizzare questi dettagli per connettersi al database. Nella pagina SQL, fare clic su Database e fare clic su Crea database fornire il nome del database. Allo stesso modo, fai clic sul collegamento degli utenti e fornisci nome utente e password
Dobbiamo creare un bucket di archiviazione cloud per mlflow per archiviare gli artefatti del modello. Per creare un bucket di archiviazione cloud, cerca l'archiviazione cloud nella console GCP, fai clic sul pulsante "Crea", fornisci il nome del bucket, la regione e fai clic su Crea
Creeremo un servizio cloudrun in gcp che utilizzerà l'immagine docker che abbiamo caricato nel registro contenitori. Per creare un'istanza cloud run, vai alla pagina cloud run fai clic su crea servizio, seleziona l'immagine del container che abbiamo caricato su GCR, fornisci la porta del container, i valori della CPU e della memoria, le istanze minime e massime per il ridimensionamento automatico e le variabili di ambiente.
Nota: assicurati che l'account di servizio che hai scelto in cloudrun abbia accesso all'archiviazione cloud, altrimenti il caricamento dell'artifactory del modello fallirebbe
Ora che abbiamo ospitato mlflow su GCP, eseguiamo un esperimento di machine learning dal nostro locale puntando a mlflow su cloud
Dopo aver eseguito l'esperimento, possiamo vedere tutti i parametri, le metriche e il modello in mlflow che abbiamo registrato durante l'esperimento
Nota: abbiamo creato manualmente tutte le risorse cloud utilizzando la console, utilizzare l'infrastruttura come codice (Terraform o CloudFormation) è una buona pratica
Spero che tu abbia un'ottima comprensione di come possiamo ospitare mlflow su piattaforme cloud AWS e GCP ed eseguire esperimenti di machine learning su cloud
Buon apprendimento !!