Dagli Esperimenti 🧪 al Deployment 🚀 MLflow 101 | Parte 01

Esperimenti 🧪 al Deployment 🚀 MLflow 101 | Parte 01

Potenzia il tuo percorso MLOps creando un filtro antispam utilizzando Streamlit e MLflow

Fonte immagine: Unsplash

Perché❓

Immagina questo: hai un’idea per un nuovo business e i dati di cui hai bisogno sono a portata di mano. Sei entusiasta di creare quel fantastico modello di apprendimento automatico 🤖. Ma, diciamocelo, questo percorso non è una passeggiata! Farai esperimenti come un matto, ti occuperai della preelaborazione dei dati, sceglierai gli algoritmi e regolerai gli iperparametri fino a girarti la testa 😵‍💫. Man mano che il progetto diventa più complicato, è come cercare di afferrare il fumo: perdi il controllo di tutti quegli esperimenti e idee brillanti che hai avuto lungo il cammino. E credimi, ricordare tutto ciò è più difficile che radunare gatti 😹

Ma aspetta, c’è di più! Una volta che hai quel modello, devi distribuirlo come un campione! E con dati in continuo cambiamento e bisogni dei clienti, dovrai ripetutamente addestrare il modello più spesso di quanto cambi calzini! È come una montagna russa infinita e hai bisogno di una soluzione solida per tenerlo tutto insieme 🔗. Entra in gioco MLOps! È il segreto che porta ordine al caos ⚡

Ok, ragazzi, ora che abbiamo affrontato il Perché, immergiamoci nel Cosa e nel succoso Come di questo blog.

Immagine dell'autore

Diamo un’occhiata al flusso di lavoro che costruiremo alla fine di questo blog 👆

Tieniti forte, perché questa non sarà una lettura veloce! Ridurla significherebbe perdere dettagli essenziali. Stiamo creando una soluzione MLOps end-to-end e, per renderla realistica, ho dovuto dividerla in tre sezioni. Tuttavia, a causa di determinate linee guida di pubblicazione, dovrò dividerla in una serie di 2 post del blog.

Sezione 1: Fonderemo le basi e le teorie 📜

Sezione 2: Ecco dove si trova l’azione! Stiamo costruendo un filtro antispam e tracciando tutti quegli esperimenti pazzi con MLflow 🥼🧪

Sezione 3: Ci concentreremo sul vero affare: distribuire e monitorare il nostro modello campione, rendendolo pronto per la produzione 🚀

Prepariamoci a fare MLOps alla grande!

Sezione 1: Le basi 🌱

Cos’è MLOps ❔

MLOps rappresenta una collezione di metodologie e migliori pratiche del settore volte ad aiutare i data scientist a semplificare e automatizzare l’intero ciclo di vita di addestramento, distribuzione e gestione del modello all’interno di un ambiente di produzione su larga scala.

Fonte immagine: Databricks

Gradualmente sta emergendo come un approccio distintivo e autonomo per gestire l’intero ciclo di vita dell’apprendimento automatico. Le fasi essenziali nel processo MLOps includono le seguenti:

  1. Raccolta dei dati: Raccolta di dati pertinenti da diverse fonti per l’analisi.
  2. Analisi dei dati: Esplorazione ed esame dei dati raccolti per ottenere informazioni.
  3. Trasformazione/Preparazione dei dati: Pulizia, trasformazione e preparazione dei dati per l’addestramento del modello.
  4. Addestramento e sviluppo del modello: Progettazione e sviluppo di modelli di apprendimento automatico utilizzando i dati preparati.
  5. Validazione del modello: Valutazione delle prestazioni del modello e garanzia della sua accuratezza.
  6. Servizio del modello: Distribuzione del modello addestrato per fornire previsioni del mondo reale.
  7. Monitoraggio del modello: Monitoraggio continuo delle prestazioni del modello in produzione per mantenerne l’efficacia.
  8. Riaddestramento del modello: Periodicamente riaddestrare il modello con nuovi dati per mantenerlo aggiornato e preciso.

Come lo implementeremo? Mentre sono disponibili diverse opzioni come Neptune, Comet e Kubeflow, ecc., ci atteniamo a MLflow. Quindi, familiarizziamo con MLflow e approfondiamo i suoi principi.

MLflow 101

MLflow è come il coltellino svizzero del machine learning: è super versatile e open source, aiutandoti a gestire l’intero percorso di machine learning come un boss. Si integra bene con tutte le librerie di machine learning più famose (TensorFlow, PyTorch, Scikit-learn, spaCy, Fastai, Statsmodels, ecc.). Tuttavia, puoi anche usarlo con qualsiasi altra libreria, algoritmo o strumento di distribuzione che preferisci. Inoltre, è progettato per essere super personalizzabile: puoi facilmente aggiungere nuovi flussi di lavoro, librerie e strumenti utilizzando plugin personalizzati.

Ml Workflow: Mlflow

MLflow segue una filosofia di progettazione modulare e basata su API, suddividendo la sua funzionalità in quattro parti distinte.

Fonte: Mlflow

Ora, vediamo ciascuna di queste parti una per una!

  1. MLflow Tracking: È un’API e un’interfaccia utente che consente di registrare parametri, versioni del codice, metriche e artefatti durante l’esecuzione del tuo machine learning e visualizzare i risultati in seguito. Funziona in qualsiasi ambiente, consentendoti di registrare su file locali o su un server e confrontare più esecuzioni. I team possono anche utilizzarlo per confrontare i risultati di diversi utenti.
  2. Mlflow Projects: È un modo per confezionare e riutilizzare facilmente il codice di data science. Ogni progetto è una directory con codice o un repository Git e un file di descrizione per specificare le dipendenze e le istruzioni di esecuzione. MLflow tiene automaticamente traccia della versione del progetto e dei parametri quando si utilizza l’API di tracciamento, semplificando l’esecuzione di progetti da GitHub o dal proprio repository Git e concatenandoli in flussi di lavoro a più passaggi.
  3. Mlflow Models: Consente di confezionare modelli di machine learning in diversi formati e offre vari strumenti per il deployment. Ogni modello è salvato come una directory con un file di descrizione che elenca i formati supportati. MLflow fornisce strumenti per distribuire tipi comuni di modelli su piattaforme diverse, incluse server REST basati su Docker, Azure ML, AWS SageMaker e Apache Spark per inferenze batch e in streaming. Quando si esportano modelli MLflow utilizzando l’API di tracciamento, MLflow tiene automaticamente traccia della loro origine, inclusi il progetto e l’esecuzione da cui provengono.
  4. Mlflow Registry: È un repository centralizzato di modelli con API e interfaccia utente per gestire in modo collaborativo l’intero ciclo di vita di un modello MLflow. Include la lineage del modello, il versioning, le transizioni di stage e le annotazioni per una gestione efficace del modello.

Questo è tutto per la nostra comprensione di base delle offerte di MLflow. Per ulteriori dettagli approfonditi, consulta la sua documentazione ufficiale qui 👉📄. Ora, armati di questa conoscenza, immergiamoci nella Sezione 2. Inizieremo creando un’applicazione di filtro spam semplice e poi passeremo in modalità sperimentazione completa, tracciando diversi esperimenti con esecuzioni uniche!

Sezione 2: Sperimentare 🧪 e Osservare 🔍

Ok, ragazzi, preparatevi per un viaggio emozionante! Prima di immergerci nel laboratorio e sporcarci le mani con gli esperimenti, delineiamo il nostro piano di attacco in modo da sapere cosa stiamo costruendo. Per cominciare, realizzeremo un classificatore di spam utilizzando il classificatore random forest (so che Multinomial NB funziona meglio per la classificazione dei documenti, ma hey, vogliamo giocare con gli iperparametri del random forest). Intenzionalmente lo renderemo non molto efficace all’inizio, solo per il brivido. Poi, libereremo la nostra creatività e tracceremo varie esecuzioni, regolando gli iperparametri e sperimentando con cose interessanti come Bag of Words e Tfidf. E indovinate un po’? Useremo l’interfaccia utente di MLflow come dei boss per tutte quelle fantastiche azioni di tracciamento e ci prepareremo per la prossima sezione. Quindi allacciate le cinture, perché ci divertiremo un sacco! 🧪💥

Diventare Uno con i Dati 🗃️

Per questa attività, utilizzeremo il dataset Spam Collection disponibile su Kaggle. Questo dataset contiene 5.574 messaggi SMS in inglese, contrassegnati come ham (legittimi) o spam. Tuttavia, c’è uno squilibrio nel dataset, con circa 4.825 etichette ham. Per evitare deviazioni e mantenere le cose concise, ho deciso di eliminare alcuni campioni di ham, riducendoli a circa 3.000, e ho salvato il CSV risultante per ulteriori utilizzi nel nostro modello e nella preelaborazione del testo. Sentiti libero di scegliere il tuo approccio in base alle tue esigenze: questo era solo per essere concisi. Ecco il frammento di codice che mostra come ho ottenuto questo.

Costruire un classificatore di spam di base 🤖

Ora abbiamo i dati pronti per iniziare, costruiamo rapidamente un classificatore di base. Non ti annoierò con il vecchio cliché che i computer non riescono a comprendere il linguaggio del testo, quindi è necessario vettorizzarlo per la rappresentazione del testo. Una volta fatto ciò, possiamo alimentarlo agli algoritmi di ML/DL e non ti dirò se hai bisogno di un ripasso o hai dubbi, non preoccuparti: ho pensato a tutto in uno dei miei precedenti blog a cui puoi fare riferimento. Lo sai già, vero? 🤗

Padroneggiare i modelli di regressione: una guida completa all’analisi predittiva

Introduzione

levelup.gitconnected.com

Ok, andiamo al sodo! Caricheremo i dati e preelaboreremo i messaggi per rimuovere le stopwords, la punteggiatura e altro ancora. Li stemmeremo o li lemmatizzeremo anche per sicurezza. Quindi arriva la parte eccitante: vettorizzare i dati per ottenere delle caratteristiche sorprendenti con cui lavorare. Successivamente, divideremo i dati per l’addestramento e il testing, li adatteremo al classificatore foresta casuale e faremo quelle succose previsioni sul set di test. Infine, è il momento della valutazione per vedere come si comporta il nostro modello! Mettiamo in pratica ciò che diciamo ⚡

In questo codice, ho fornito diverse opzioni per gli esperimenti come commenti, come la preelaborazione con o senza stopwords, lemmatizzazione, stemmizzazione, ecc. Allo stesso modo, per la vettorizzazione, puoi scegliere tra Bag of Words, TF-IDF o embedding. Ora, passiamo alla parte divertente! Addestreremo il nostro primo modello chiamando queste funzioni in sequenza e passando iperparametri.

Sì, sono totalmente d’accordo, questo modello è praticamente inutile. La precisione è quasi zero, il che porta a un punteggio F1 vicino a 0. Dato che abbiamo uno squilibrio leggero nelle classi, il punteggio F1 diventa più cruciale della precisione in quanto fornisce una misura complessiva di precisione e richiamo: questa è la sua magia! Quindi, eccolo qui: il nostro primo modello terribile, senza senso e inutile. Ma hey, niente paura, fa tutto parte del percorso di apprendimento 🪜.

Ora, avviamo MLflow e prepariamoci a sperimentare con diverse opzioni e iperparametri. Una volta che avremo ottimizzato le cose, tutto inizierà a avere senso. Saremo in grado di visualizzare e analizzare i nostri progressi come dei professionisti!

Iniziare con MLflow ♾️

Prima di tutto, facciamo partire MLflow. Per mantenere le cose ordinate, è consigliato configurare un ambiente virtuale. Puoi semplicemente installare MLflow usando pip 👉pip install mlflow

Una volta installato, avvia l’interfaccia utente di MLflow eseguendo 👉mlflow ui nel terminale (assicurati di farlo all’interno dell’ambiente virtuale in cui hai installato MLflow). In questo modo verrà avviato il server MLflow nel tuo browser locale all’indirizzo http://localhost:5000. Vedrai una pagina simile a 👇

Image By Author: Mlflow UI

Dato che non abbiamo ancora registrato nulla, non ci sarà molto da controllare nell’interfaccia utente. MLflow offre diverse opzioni di tracciamento, come locale, locale con database, su un server o persino su cloud. Per questo progetto, per ora ci atteniamo a tutto locale. Una volta che avremo familiarità con la configurazione locale, sarà possibile passare l’URI del server di tracciamento e configurare alcuni parametri in seguito: i principi di base rimangono gli stessi.

Ora, immergiamoci nella parte divertente: memorizzare metriche, parametri e persino modelli, visualizzazioni o qualsiasi altro oggetto, noto anche come artefatti.

La funzionalità di tracciamento di MLflow può essere vista come un’evoluzione o una sostituzione del logging tradizionale nel contesto dello sviluppo di machine learning. Nel logging tradizionale, solitamente si utilizza la formattazione personalizzata delle stringhe per registrare informazioni come iperparametri, metriche e altri dettagli rilevanti durante l’addestramento e la valutazione dei modelli. Questo approccio di logging può diventare noioso e soggetto a errori, specialmente quando si lavora con un gran numero di esperimenti o pipeline di machine learning complesse, mentre MLflow automatizza il processo di registrazione e organizzazione di queste informazioni, rendendo più facile gestire e confrontare gli esperimenti, portando a workflow di machine learning più efficienti e riproducibili.

Tracciamento di MLflow 📈

Il tracciamento di MLflow è incentrato su tre funzioni principali: log_param per la registrazione dei parametri, log_metric per la registrazione delle metriche e log_artifact per la registrazione degli artefatti (ad esempio, file di modelli o visualizzazioni). Queste funzioni facilitano il tracciamento organizzato e standardizzato dei dati correlati agli esperimenti durante il processo di sviluppo del machine learning.

Immagine di Author: Tracciamento di MLflow

Quando si registra un singolo parametro, viene registrato utilizzando una coppia chiave-valore all’interno di una tupla. D’altra parte, quando si lavora con più parametri, si utilizza un dizionario con coppie chiave-valore. Lo stesso concetto si applica anche alla registrazione delle metriche. Ecco un esempio di codice per illustrare il processo.

# Registra un parametro (coppia chiave-valore)log_param("valore_configurazione", randint(0, 100))# Registra un dizionario di parametrilog_params({"param1": randint(0, 100), "param2": randint(0, 100)})

Comprendere l’esperimento 🧪 vs i run 🏃‍♀️

Un esperimento funge da contenitore che rappresenta un gruppo di run di machine learning correlati, fornendo un raggruppamento logico per i run con un obiettivo comune. Ogni esperimento ha un ID univoco dell’esperimento e è possibile assegnare un nome di facile identificazione.

D’altra parte, un run corrisponde all’esecuzione del codice di machine learning all’interno di un esperimento. È possibile avere più run con diverse configurazioni all’interno di un singolo esperimento e a ogni run viene assegnato un ID univoco del run. Le informazioni di tracciamento, che includono parametri, metriche e artefatti, vengono memorizzate in un backend, come un file system locale, un database (ad esempio, SQLite o MySQL) o uno storage cloud remoto (ad esempio, AWS S3 o Azure Blob Storage).

MLflow offre un’API unificata per registrare e tracciare questi dettagli degli esperimenti, indipendentemente dal backend utilizzato. Questo approccio semplificato consente il recupero e il confronto senza sforzo dei risultati degli esperimenti, migliorando la trasparenza e la gestibilità del processo di sviluppo del machine learning.

Per iniziare, è possibile creare un esperimento utilizzando mlflow.create_experiment() o un metodo più semplice, mlflow.set_experiment("nome_tuo_exp"). Se viene fornito un nome, verrà utilizzato l’esperimento esistente; in caso contrario, ne verrà creato uno nuovo per registrare i run.

Successivamente, richiamare mlflow.start_run() per inizializzare il run attivo corrente e avviare la registrazione. Dopo aver registrato le informazioni necessarie, chiudere il run utilizzando mlflow.end_run().

Ecco un esempio di base che illustra il processo:

import mlflow# Crea un esperimento (o usa uno esistente)mlflow.set_experiment("nome_tuo_exp")# Avvia il run e inizia la registrazionewith mlflow.start_run():    # Registra qui i parametri, le metriche e gli artefatti    mlflow.log_param("nome_parametro", valore_parametro)    mlflow.log_metric("nome_metrica", valore_metrica)    mlflow.log_artifact("percorso_all_artefatto")# Il run viene chiuso automaticamente alla fine del blocco 'with'

Creazione dell’interfaccia utente per l’ottimizzazione degli iperparametri utilizzando Streamlit🔥

Invece di eseguire script tramite la shell e fornire i parametri lì, opteremo per un approccio user-friendly. Costruiamo un’interfaccia utente di base che permetta agli utenti di inserire sia il nome dell’esperimento che valori specifici degli iperparametri. Quando viene cliccato il pulsante di addestramento, verrà invocata la funzione di addestramento con gli input specificati. Inoltre, esploreremo come interrogare gli esperimenti e i run una volta che avremo un numero significativo di run salvati.

Con questa UI interattiva, gli utenti possono sperimentare senza sforzo con diverse configurazioni e tenere traccia delle loro esecuzioni per uno sviluppo di machine learning più efficiente. Non mi addentrerò nei dettagli di Streamlit poiché il codice è semplice. Ho apportato piccole modifiche alla precedente funzione di addestramento per il logging di MLflow, oltre a implementare impostazioni personalizzate per il tema. Prima di eseguire un esperimento, agli utenti viene chiesto di scegliere tra inserire un nuovo nome per l’esperimento (che registra le esecuzioni in quell’esperimento) o selezionare un esperimento esistente dal menu a discesa, generato utilizzando mlflow.search_experiments(). Inoltre, gli utenti possono facilmente ottimizzare gli iperparametri secondo necessità. Ecco il codice dell’applicazione 👇

e questo è come apparirà l’app 🚀

Immagine dell'autore: Streamlit UI (Trainer App)

Ok, è ora di un temporaneo addio 👋, ma non preoccuparti – ci riuniremo nella prossima puntata di questa serie di blog 🤝. Nel prossimo capitolo, ci immergeremo negli esperimenti e metteremo i nostri modelli in una lotta da combattimento in una gabbia e solo i migliori sopravvivranno nel Colosseo del monitoraggio di MLflow 🦾. Una volta entrato nel ritmo, non vorrai mettere in pausa, quindi prendi una tazza di caffè 🍵, ricaricati 🔋 e unisciti a noi per il prossimo entusiasmante capitolo ⚡. Ecco il link alla Parte 02 👇

VoAGI

Modifica la descrizione

pub.towardsai.net

Ci vediamo là 👀

Grazie per la lettura 🙏 Continua a dare il massimo 🤘 Continua a imparare 🧠 Continua a condividere 🤝 e soprattutto continua a sperimentare! 🧪🔥✨😆