Come costruire un flusso di lavoro end-to-end per l’apprendimento automatico

'Creazione di un flusso di lavoro completo per l'apprendimento automatico.'

Una delle lamentele più comuni che sentiamo dagli ingegneri di machine learning nella community riguarda quanto sia costoso e soggetto a errori passare manualmente attraverso il flusso di lavoro di machine learning per la costruzione e il deploy dei modelli. Eseguono manualmente script per preprocessare i dati di addestramento, rieseguono gli script di deploy, regolano manualmente i loro modelli e trascorrono le ore lavorative per mantenere aggiornati i modelli sviluppati in precedenza.

La costruzione di pipeline di machine learning end-to-end consente agli ingegneri di machine learning di costruire una volta sola, eseguire di nuovo e riutilizzare molte volte. Consente loro di concentrarsi maggiormente sul deploy di nuovi modelli anziché sulla manutenzione di quelli esistenti. Fornisce la possibilità di concentrarsi su nuovi modelli anziché dedicare troppo sforzo alla manutenzione dei modelli esistenti.

Se tutto va bene, ovviamente 😉

In questo articolo, imparerai:

  • 1
    Esplora l’architettura di una pipeline di ML, compresi i componenti.
  • 2
    Impara i passaggi essenziali e le migliori pratiche che gli ingegneri di machine learning possono seguire per costruire pipeline di machine learning robuste, scalabili e end-to-end.
  • 3
    Costruisci e deploy rapidamente una pipeline di ML end-to-end con Kubeflow Pipelines su AWS.
  • 4
    Scopri le sfide nella costruzione di pipeline di ML end-to-end e le migliori pratiche per costruirle.

Cosa è una pipeline di machine learning?

Le pipeline di machine learning sono composte da una sequenza di componenti o fasi collegate tra loro che definiscono il flusso di lavoro di machine learning per risolvere problemi specifici. Le pipeline ti permettono di orchestrare le fasi del tuo flusso di lavoro di ML che possono essere automatizzate. L’orchestrazione qui implica che le dipendenze e il flusso di dati tra le fasi del flusso di lavoro devono essere completati nell’ordine corretto.

Un flusso di lavoro di ML “standard” ha tre fasi: acquisizione dei dati e gestione delle caratteristiche, gestione degli esperimenti e sviluppo del modello, e gestione del modello | Fonte: Autore

Costruiresti una pipeline per:

  • Raggiungere la riproducibilità nel tuo flusso di lavoro (l’esecuzione della pipeline ripetutamente su input simili produrrà output simili).
  • Semplificare la gestione end-to-end delle diverse fasi del flusso di lavoro di machine learning per progetti con poca o nessuna intervento (automazione) da parte del team di ML.
  • Ridurre il tempo necessario per spostare dati e modelli dalla fase di sperimentazione alla fase di produzione.
  • Permettere al tuo team di concentrarsi maggiormente sulla creazione di nuove soluzioni anziché sulla manutenzione di quelle esistenti, utilizzando componenti modulari che offrono automazione per il tuo flusso di lavoro.
  • Semplificare il riutilizzo dei componenti (una fase specifica del flusso di lavoro di machine learning) per creare e deployare soluzioni end-to-end che si integrano con sistemi esterni senza dover ricostruire tutto ogni volta.

Pipeline di machine learning vs piattaforma di machine learning

La pipeline di ML fa parte della più ampia piattaforma di ML. È utilizzata per ottimizzare, orchestrare e automatizzare il flusso di lavoro di machine learning all’interno della piattaforma di ML.

Le pipeline e le piattaforme sono concetti correlati in MLOps, ma si riferiscono a diversi aspetti del flusso di lavoro di machine learning. Una piattaforma di ML è un ambiente che standardizza lo stack tecnologico per il tuo team di ML/AI e fornisce strumenti, librerie e infrastrutture per lo sviluppo, il deploy e l’operazionalizzazione di applicazioni di machine learning.

La piattaforma include tipicamente componenti per l’ecosistema di ML come gestione dei dati, store delle caratteristiche, tracciatori degli esperimenti, un registro dei modelli, un ambiente di test, servizio di modelli e gestione dei modelli. È progettata per fornire un ambiente unificato e integrato principalmente per data scientist e MLE per sviluppare e deployare modelli, gestire dati e ottimizzare il flusso di lavoro di machine learning.

L’architettura di una pipeline di machine learning

L’architettura di una pipeline di machine learning può essere una costruzione in tempo reale (online) o batch (offline), a seconda del caso d’uso e dei requisiti di produzione. Per mantenere i concetti semplici in questo articolo, imparerai come appare una pipeline tipica senza considerare le sfumature delle costruzioni in tempo reale o batch.

L’articolo di Semi Koen offre una panoramica dettagliata sulle architetture delle pipeline di machine learning.

Una tipica pipeline di machine learning con diverse fasi evidenziate | Fonte: Autore

Tipi comuni di pipeline di machine learning

In linea con le fasi del flusso di lavoro di ML (dati, modello e produzione), un pipeline di ML comprende tre pipeline diverse che risolvono diverse fasi del flusso di lavoro. Queste includono:

  • 1
    Pipeline dei dati (o input).
  • 2
    Pipeline del modello (o addestramento).
  • 3
    Pipeline di servizio (o produzione).

Nelle grandi organizzazioni, due o più team probabilmente gestiranno ciascuna pipeline a causa della sua funzionalità e scala. Le pipeline sono interoperabili per costruire un sistema funzionante:

Pipeline dei dati (input) (acquisizione dati e gestione delle caratteristiche)

Questa pipeline trasporta dati grezzi da una posizione all’altra. Copre l’intero processo di movimento dei dati, da dove vengono raccolti i dati, ad esempio tramite flussi di dati o elaborazione batch, fino alle applicazioni downstream come data lake o modelli di machine learning.

Pipeline di addestramento del modello

Questa pipeline addestra uno o più modelli sui dati di addestramento con iperparametri preimpostati. Li valuta, li ottimizza e imballa il modello ottimale prima di inviarlo alle applicazioni come il registro dei modelli o la pipeline di servizio.

Pipeline di servizio

Questa pipeline distribuisce il modello come un servizio di previsione (o punteggio) in produzione e utilizza un altro servizio per abilitare il monitoraggio delle prestazioni.

Questo articolo classifica le diverse pipeline come “pipeline di apprendimento automatico” perché consentono applicazioni di ML in base alla loro funzione nel flusso di lavoro. Inoltre, sono interoperabili per consentire applicazioni di produzione, specialmente durante la manutenzione (riallenamento e test continui).

Elementi di una pipeline di apprendimento automatico

Alcune pipeline forniranno astrazioni di alto livello per questi componenti attraverso tre elementi:

  1. Trasformatore: un algoritmo in grado di trasformare un set di dati in un altro.
  2. Stimatore: un algoritmo addestrato su un set di dati per produrre un trasformatore.
  3. Valutatore: per esaminare l’accuratezza del modello addestrato.

Componenti della pipeline di apprendimento automatico

Un componente di pipeline è una fase nel flusso di lavoro di apprendimento automatico che svolge un compito specifico prendendo in input, elaborandolo e producendo un output. I componenti comprendono implementazioni del processo di flusso di lavoro manuale che si utilizza per le fasi automatizzabili, tra cui:

  • Ingestione dei dati (estrazione e versionamento).
  • Validazione dei dati (scrittura di test per verificare la qualità dei dati).
  • Preelaborazione dei dati.
  • Addestramento e taratura del modello, dato un numero selezionato di algoritmi da esplorare e un intervallo di iperparametri da utilizzare durante l’esperimento.
  • Analisi delle prestazioni e valutazione del modello.
  • Imballaggio e registrazione del modello.
  • Deploy del modello.
  • Punteggio del modello.
  • Monitoraggio delle prestazioni del modello.

Con la maggior parte degli strumenti, i componenti della pipeline conterranno codice eseguibile che può essere contenuto in un container (per eliminare problemi di dipendenza). Ogni passaggio può essere gestito con uno strumento di orchestrazione come Kubeflow Pipelines, Metaflow o ZenML.

Passiamo brevemente in rassegna ciascuno dei componenti di seguito.

Ingestione, estrazione e versionamento dei dati

Questo componente acquisisce dati da una fonte di dati (esterna alla pipeline di apprendimento automatico) come input. Quindi trasforma il set di dati in un formato (ad esempio, CSV, Parquet, ecc.) che verrà utilizzato nei passaggi successivi della pipeline. In questo passaggio, i dati grezzi e versionati vengono anche trasformati per renderne più facile la tracciabilità.

Validazione dei dati

Questo passaggio raccoglie i dati trasformati come input e, attraverso una serie di test e validatori, garantisce che soddisfino i criteri per il componente successivo. Controlla i dati per problemi di qualità e rileva valori anomali e outlier. Questo componente controlla anche segni di deriva dei dati o possibili discrepanze tra addestramento e servizio per inviare log ad altri componenti o avvisare il data scientist responsabile.

Se i test di validazione hanno esito positivo, i dati vengono inviati al componente successivo, e se falliscono, l’errore viene registrato e l’esecuzione si interrompe.

Preelaborazione dei dati e ingegneria delle caratteristiche

Le fasi di pulizia dei dati, segregazione e ingegneria delle caratteristiche prendono in input i dati validati e trasformati dal componente precedente. I processi coinvolti in questo passaggio dipendono dal problema che stai risolvendo e dai dati. I processi qui possono includere:

  • Selezione delle caratteristiche: selezionare le caratteristiche più appropriate da pulire e ingegnerizzare.
  • Pulizia delle caratteristiche: trattamento dei valori mancanti delle caratteristiche e rimozione degli outlier tramite limitazione/bloccaggio basato sull’implementazione del codice.
  • Trasformazione delle caratteristiche: trasformazione delle caratteristiche distorte dei dati (se applicabile).
  • Creazione delle caratteristiche: creazione di nuove caratteristiche da quelle esistenti o combinazione di diverse caratteristiche per crearne una nuova.
  • Segregazione dei dati: suddivisione dei dati in set di addestramento, test e validazione.
  • Standardizzazione/normalizzazione delle caratteristiche: conversione dei valori delle caratteristiche in valori con scala e distribuzione simili.
  • Pubblicazione delle caratteristiche in un repository delle caratteristiche da utilizzare per l’addestramento e l’inferenza da parte di tutta l’organizzazione.

Di nuovo, ciò che accade in questo componente è soggetto al processo di preparazione dei dati iniziale del data scientist (manuale), al problema e ai dati utilizzati.

Allenamento e ottimizzazione del modello

Questo componente può recuperare le caratteristiche preparate dal feature store o ottenere il dataset preparato (set di addestramento e di validazione) come input dal componente precedente.

Questo componente utilizza un insieme di iperparametri predefiniti per addestrare il modello (usando grid-search CV, Neural Architecture Search o altre tecniche). Può anche addestrare diversi modelli in parallelo con diversi set di valori di iperparametri. Il modello addestrato viene inviato al componente successivo come artefatto.

Valutazione del modello

Il modello addestrato è l’input per questo componente e viene valutato sul set di validazione. È possibile analizzare i risultati per ogni modello in base a metriche come ROC, AUC, precisione, richiamo e accuratezza. Le metriche vengono di solito impostate in base al problema. Tali metriche vengono quindi registrate per future analisi.

Analisi e convalida del modello

Questo componente:

  • 1
    Valuta la capacità del modello di generalizzare a dati non visti.
  • 2
    Analizza l’interpretabilità/spiegabilità del modello per aiutarti a comprendere la qualità e i pregiudizi del modello o dei modelli che intendi distribuire. Esamina quanto bene il modello si comporta su sottoinsiemi di dati e l’importanza delle caratteristiche del modello. È un modello a “scatola nera” o è possibile spiegare le decisioni?

Se addestri più modelli, il componente può anche valutare ciascun modello sul set di test e fornire l’opzione di selezionare un modello ottimale.

Inoltre, il componente restituirà anche statistiche e metadati che ti aiutano a capire se il modello si adatta all’ambiente di distribuzione target. Ad esempio:

  • È troppo grande per soddisfare i requisiti di infrastruttura?
  • Quanto tempo impiega per restituire una previsione?
  • Quante risorse (utilizzo della CPU, memoria, ecc.) consuma quando effettua una previsione?

Se il tuo flusso di lavoro è in fase di distribuzione, questo componente può anche aiutarti a confrontare le metriche del modello addestrato con quelle in produzione e avvisarti se sono significativamente inferiori.

Confezionamento e registrazione del modello

Questo componente confeziona il tuo modello per la distribuzione negli ambienti di staging o di produzione. Gli artefatti del modello e i file di configurazione necessari vengono confezionati, versionati e inviati al registro del modello.

I container sono una tecnica utile per confezionare i modelli. Incapsulano il modello distribuito per eseguirlo ovunque come servizio di scoring separato. Sono disponibili anche altre opzioni di distribuzione, come riscrivere il codice distribuito nel linguaggio dell’ambiente di produzione. È più comune utilizzare i container per i flussi di lavoro di machine learning.

Distribuzione del modello

Puoi distribuire il modello confezionato e registrato in un ambiente di staging (come software tradizionale con DevOps) o nell’ambiente di produzione. L’ambiente di staging è per i test di integrazione. L’ambiente di staging è il primo ambiente simile alla produzione in cui i modelli possono essere testati con altri servizi nell’intero sistema che consentono l’applicazione, ad esempio distribuire un servizio di raccomandazione e testarlo con il server backend che instrada la richiesta del client al servizio.

Alcune organizzazioni potrebbero optare per lo staging su una piattaforma di orchestrazione dei container come Kubernetes. Dipende dallo strumento che stai utilizzando per l’orchestrazione del flusso di lavoro.

Anche se non è consigliato, è possibile distribuire modelli che sono stati confezionati e registrati direttamente nell’ambiente di produzione.

Servizio di scoring del modello

Il modello distribuito prevede richieste dei client in tempo reale (per sistemi online) o a lotti (per sistemi offline). Le previsioni vengono registrate su un servizio di monitoraggio o su un archivio di valutazione online per monitorare le prestazioni predictive del modello, specialmente per il concetto di deriva del modello.

Puoi adottare strategie di distribuzione come il rilascio di canarino, il rilascio in modalità shadow e i test A/B con il servizio di scoring. Ad esempio, puoi distribuire più modelli challenger insieme al modello campione in produzione. Tutti riceveranno le stesse richieste di previsione dai client, ma solo il modello campione restituirà i risultati delle previsioni. Gli altri registri delle previsioni con il servizio di monitoraggio.

Monitoraggio delle prestazioni e ciclo di feedback del flusso di lavoro

La parte finale nel flusso di lavoro è il componente di monitoraggio, che esegue controlli sui dati. Monitora anche i punteggi di valutazione delle inferenze raccolti (metriche del modello o altre metriche proxy) per misurare le prestazioni dei modelli in produzione.

Alcuni componenti di monitoraggio monitorano anche l’efficienza operativa del flusso di lavoro, inclusi:

  • stato del flusso di lavoro,
  • chiamate API,
  • timeout delle richieste,
  • utilizzo delle risorse, ecc.

Per un flusso di lavoro di machine learning completamente automatizzato, l’integrazione continua (CI), la distribuzione continua (CD) e l’addestramento continuo (CT) diventano cruciali. I flussi di lavoro possono essere pianificati per eseguire CI, CD o CT. Possono anche essere attivati da:

  • 1
    deriva del modello, 
  • 2
    deriva dei dati,
  • 3
    su richiesta dello scienziato dei dati responsabile.

L’automazione del tuo flusso di lavoro di machine learning diventa una decisione cruciale per la produttività se esegui molti modelli in produzione.

Come costruire un flusso di lavoro di machine learning end-to-end

Costruisci la maggior parte dei flussi di lavoro nella seguente sequenza:

  • 1
    Definire l’implementazione del componente come funzioni modulari in uno script o riutilizzare implementazioni di codice preesistenti.
  • 2
    Containerizzare gli script modulari in modo che le loro implementazioni siano indipendenti e separate.
  • 3
    Impacchettare le implementazioni e distribuirle su una piattaforma. 

Script modulari

Definire i componenti come funzioni modulari che prendono in input e restituiscono un output è un modo per costruire ciascun componente del tuo flusso di lavoro di machine learning. Dipende dal linguaggio che usi per sviluppare il tuo flusso di lavoro di machine learning. I componenti sono collegati con un linguaggio specifico del dominio (DSL) per formare il flusso di lavoro.

Ecco un esempio di uno script scritto in un DSL per definire un flusso di lavoro di machine learning in Kubeflow Pipeline:

import kfp.dsl as dsl

def my_pipeline_step(nome_step, param1, param2, ...):
    return dsl.ContainerOp(
        name = nome_step,
        image = '<percorso all'immagine del tuo container>',
        arguments = [
            '--param1', param1,
            '--param2', param2,
            ...
        ],
        file_outputs = {
            'output1' : '/output1.txt',
            'output2' : '/output2.json',
            ...
        }
    )

Pacchetti e container

Puoi decidere di utilizzare uno strumento per container come Docker o un altro metodo per garantire che il tuo codice possa essere eseguito ovunque.

Piattaforme e strumenti di orchestrazione

Le piattaforme e gli strumenti di orchestrazione dei flussi di lavoro possono aiutare a gestire gli script e i container confezionati in un DAG o un flusso di lavoro completo orchestrato che può eseguire i passaggi in sequenza.

Strumenti di flusso di lavoro di machine learning

Ecco alcuni esempi di strumenti e piattaforme di orchestrazione dei flussi di lavoro di machine learning:

  • 1
    Metaflow.
  • 2
    Kedro pipelines.
  • 3
    ZenML.
  • 4
    Flyte.
  • 5
    Kubeflow pipelines.

Metaflow

Metaflow, originariamente un progetto di Netflix, è un framework nativo per il cloud che unisce tutti i componenti dello stack di ML insieme – dall’orchestrazione alla versione, alla modellazione, alla distribuzione e ad altre fasi. Metaflow consente di specificare un flusso di lavoro come un DAG di calcoli relativi al tuo flusso di lavoro. Netflix esegue centinaia o migliaia di progetti di machine learning su Metaflow, ecco quanto è scalabile.

Metaflow si differenzia dagli altri framework di flusso di lavoro perché può caricare e archiviare artefatti (come dati e modelli) come variabili di istanza Python regolari. Chiunque abbia una conoscenza di base di Python può usarlo senza dover imparare altri linguaggi specifici del dominio (DSL).

Come Metaflow struttura diverse parti dello stack di ML in un flusso scritto in codice Python arbitrario. | Fonte: What is Metaflow | Metaflow Docs.

Per saperne di più su Metaflow nella documentazione e iniziare tramite i tutorial o le pagine di risorse.

Kedro

Kedro è una libreria Python per la creazione di flussi di lavoro modulari di data science. Kedro ti aiuta a creare flussi di lavoro di data science composti da componenti riutilizzabili, ognuno con una “singola responsabilità”, per velocizzare il pipelining dei dati, migliorare il prototipazione della data science e promuovere la riproducibilità del flusso di lavoro.

Nodi Kedro (quadrati), dataset (rettangoli con bordi arrotondati) e flussi di lavoro (l’interconnessione tra di loro) | Fonte: Kedro Docs Visualise pipelines page

Scopri come puoi costruire pipeline di apprendimento automatico con Kedro in questo articolo.

ZenML

ZenML è un framework MLOps estensibile e open-source per la costruzione di pipeline MLOps portabili e pronte per la produzione. È stato creato per permettere ai data scientist e agli ingegneri MLOps di collaborare durante lo sviluppo per la produzione.

Crea pipeline di apprendimento automatico riproducibili con ZenML. | Fonte: Homepage del sito web di ZenML

Approfondisci i concetti fondamentali di ZenML nella documentazione.

Flyte

Flyte è una piattaforma per orchestrare pipeline di apprendimento automatico su larga scala. Puoi utilizzare Flyte per il deployment, la manutenzione, la gestione del ciclo di vita, il controllo delle versioni e la formazione. Puoi anche utilizzarla con piattaforme come Feast, PyTorch, TensorFlow e whylogs per svolgere attività per l’intero ciclo di vita del modello.

L’architettura della piattaforma Flyte. | Fonte: Flyte: MLOps semplificato

Questo articolo di Samhita Alla, una software engineer e tech evangelist presso Union.ai, fornisce una panoramica semplificata delle applicazioni di Flyte in MLOps. Consulta la documentazione per iniziare.

Kubeflow Pipelines

Kubeflow Pipelines è uno strumento di orchestrazione per la costruzione e il deployment di workflow di apprendimento automatico completi, portatili, scalabili e riproducibili direttamente su cluster Kubernetes. Puoi definire Kubeflow Pipelines con i seguenti passaggi:

Passaggio 1: Scrivi l’implementazione del codice per ciascun componente come un file/script eseguibile o riutilizza componenti pre-costruiti.

Passaggio 2: Definisci il workflow utilizzando un linguaggio specifico del dominio (DSL).

Passaggio 3: Costruisci e compila il workflow appena definito.

Passaggio 4: Il passaggio 3 creerà un file YAML statico che può essere attivato per eseguire il workflow tramite l’intuitiva Python SDK per le pipeline.

Kubeflow è notoriamente complesso e con cicli di sviluppo lenti, altre piattaforme basate su K8s come Flyte stanno rendendo più semplice la costruzione di pipeline. Ma il deployment di un servizio gestito nel cloud come Google Kubernetes Engine (GKE) può essere più semplice.

Ci sono anche altre opzioni, come Prefect e Argo, che puoi considerare. Questo articolo potrebbe essere utile, poiché confronta più di 10 strumenti di orchestrazione di workflow e pipeline: Migliori strumenti di orchestrazione di workflow e pipeline.

DEMO: Esempio di pipeline di apprendimento automatico end-to-end

In questo esempio, costruirai una pipeline di apprendimento automatico con Kubeflow Pipelines basata sull’infame competizione di apprendimento automatico Titanic su Kaggle. Questo progetto utilizza l’apprendimento automatico per creare un modello che predice quali passeggeri sono sopravvissuti al naufragio del Titanic.

Il dataset fornisce anche informazioni sul destino dei passeggeri del Titanic, riassunte in base allo stato economico (classe), al sesso, all’età e alla sopravvivenza.

Pre-requisiti

  • In questa demo, utilizzerai MiniKF per configurare Kubeflow su AWS. Arrikto MiniKF è il modo più veloce e semplice per iniziare con Kubeflow. Puoi anche utilizzare MiniKF per configurare Kubeflow ovunque, incluso il tuo computer locale. Puoi saperne di più su come configurare Kubeflow con MiniKF su Google Cloud e sul tuo computer locale nella documentazione.
  • Se non hai ancora un account AWS, creane uno.
  • L’utilizzo di Arrikto MiniKF tramite AWS Marketplace costa $0.509/ora al momento della stesura di questo testo. La demo richiede meno di un’ora per essere completata, quindi non dovresti spendere più di $3 seguendo questa demo.
  • Questa demo utilizza Arrikto MiniKF v20210428.0.1 e questa versione installa quanto segue:
    • Kubeflow v1.3.
    • Kale v0.7.0. – Uno strumento di orchestrazione e workflow per Kubeflow che ti permette di eseguire workflow completi di data science a partire da un notebook.
    • Kubernetes (utilizzando Minikube v1.22.0).

Le procedure dimostrative funzionano anche con l’ultima versione di Arrikto MiniKF v20221221.0.0 al momento della stesura di questo testo. Puoi seguire questo tutorial nella documentazione ufficiale per imparare come distribuire Kubeflow con MiniKF attraverso il Marketplace di AWS.

Se hai distribuito Kubeflow con MiniKF, passiamo alla dashboard di Kubeflow per configurare il progetto:

Per iniziare, fai clic su (1) “Notebooks” e (2) “+NUOVO SERVER”.

Specifica un nome per il tuo server di notebook:

Lascia gli altri valori predefiniti (a seconda delle tue esigenze, ovviamente) e fai clic su “AGGIUNGI VOLUME” nella categoria “Data Volumes”:

Vedrai ora un nuovo volume dati aggiunto con il nome specificato per il tuo server e “-vol-1/” come suffisso:

Ora puoi avviare il server di notebook:

Questo potrebbe richiedere alcuni minuti per essere configurato, a seconda del numero di risorse specificate. Quando vedi il segno di spunta verde, fai clic su “CONNETTI“:

Questo ti porterà al launcher di Jupyterlab, dove puoi creare un nuovo notebook e accedere al terminale:

Quando avvii il terminale, inserisci il seguente comando (ricorda di inserire il nome del tuo volume dati):

$ cd <INSERISCI QUI IL NOME DEL TUO VOLUME DATI>

$ git clone https://github.com/NonMundaneDev/layer-demo-kubeflow.git

(3) Avvia il notebook `layer_kubeflow_titanic_demo.ipynb`:

Dopo aver eseguito la prima cella di codice, riavvia il kernel in modo che le modifiche possano entrare in vigore nel kernel corrente:

Kale aiuta a compilare i passaggi nel tuo notebook in un flusso di lavoro di machine learning che può essere eseguito con Kubeflow Pipelines. Per trasformare il notebook in un flusso di lavoro di ML,

(1) Fai clic sull’icona di Kale, e poi

(2) Fai clic su “abilita”:

Kale rileverà automaticamente i passaggi che deve eseguire e quelli che deve saltare come parte del processo esplorativo nel notebook. In questo notebook, Kale classifica tutti i passaggi in un componente poiché tutti prendono in input e restituiscono un artefatto di output.

(1) Ora puoi modificare la descrizione del tuo pipeline e altri dettagli. Quando hai finito,

(2) clicca su ” COMPILA E ESEGUI “:

Se tutto va bene, dovresti vedere un’immagine come quella qui sotto. Clicca su ” Visualizza ” accanto a ” Pipeline in esecuzione… ” e si aprirà una nuova scheda:

Dovresti essere in grado di visualizzare l’esecuzione di un pipeline e vedere il DAG (Grafo Aciclico Diretto) del Kubeflow Pipeline appena eseguito con Kale tramite l’interfaccia utente della pipeline:

Ora, per visualizzare il risultato restituito dal tuo modello per il passaggio di servizio, clicca sul passaggio ” randomforest ” > vai a ” Visualizzazioni ” e scorri fino alla sezione ” Static HTML ” e visualizza il risultato della previsione per l’ultima cella:

In questo caso, basandosi sui dati di esempio passati nel passaggio di servizio per il notebook, il modello ha previsto che questo particolare passeggero non sopravviverà al naufragio.

Puoi anche ottenere l’URL endpoint che serve il tuo modello seguendo i seguenti passaggi:

Clicca su ” Modelli ” nella barra laterale e osserva che un modello è già in fase di servizio. Osserva il Predictor, Runtime e Protocollo. Clicca sul nome del modello.

Vedrai una dashboard per visualizzare i dettagli del modello che stai servendo in produzione.

(1) Monitora il tuo modello in produzione con Metrics e registra per risolvere errori. Puoi anche vedere il

(2) “URL esterno” e

(3) “URL interno”, gli endpoint da cui puoi accedere al tuo modello da qualsiasi altra richiesta di servizio o client. L'”URL esterno” può essere reindirizzato al tuo URL personalizzato.

Per ora, accederemo al modello tramite il terminale tramite l’endpoint “URL interno”. Copia l’endpoint e torna al tuo terminale di Jupyterlab. Salva l’endpoint in una variabile con il seguente comando:

$ export MODEL_DEPLOYMENT_URL=<INSERISCI QUI IL TUO URL INTERNO>

$ curl --header "Content-Type: application/json; format=pandas-records"   --request POST   --data  '{"instances": [[3, 0, 4, 1, 2 ,3, 0, 1, 0, 8, 3, 6, 2]]}'  $MODEL_DEPLOYMENT_URL

Dovresti ottenere la stessa risposta di quella del notebook della Pipeline:

Congratulazioni! Hai costruito una pipeline end-to-end con Kubeflow.

Sfide associate alle pipeline di ML

Alcune sfide che probabilmente incontrerai mentre lavori con le pipeline di ML includono le seguenti:

  • 1
    Requisiti di infrastruttura e scalabilità.
  • 2
    Complessità delle interdipendenze del flusso di lavoro.
  • 3
    Pianificazione dei flussi di lavoro è un dilemma.
  • 4
    Riproducibilità delle pipeline.
  • 5
    Tracciamento degli esperimenti.

Requisiti di infrastruttura e scalabilità

La promessa delle pipeline di machine learning si concretizza quando hai l’infrastruttura eccellente su cui dovrebbero essere eseguite. Aziende come Uber, Airbnb, ecc. ospitano la propria infrastruttura e hanno il budget per costruirla internamente. Questo è irrealistico, soprattutto per le piccole aziende e le startup che si affidano all’infrastruttura cloud per portare i loro prodotti sul mercato.

L’utilizzo dell’infrastruttura cloud per eseguire le pipeline di dati, addestramento e produzione può comportare costi e bollette esponenziali se non le monitori correttamente. Potresti anche incontrare situazioni in cui diversi componenti del flusso di lavoro richiedono esigenze di infrastruttura significativamente diverse.

Le pipeline di machine learning ti consentono di eseguire esperimenti in modo efficiente e su larga scala, ma questo scopo potrebbe essere sconfitto se le risorse e il budget sono limitati.

Complessità delle interdipendenze del flusso di lavoro

L’implementazione dei flussi di lavoro delle pipeline può essere complicata a causa delle complesse interdipendenze dei passaggi delle pipeline, che possono crescere e diventare difficili da gestire.

La scalabilità delle interdipendenze complesse del flusso di lavoro può anche essere un problema, poiché alcuni componenti potrebbero richiedere più risorse di calcolo rispetto ad altri. Ad esempio, l’addestramento del modello può utilizzare più risorse di calcolo rispetto alla trasformazione dei dati.

Dilemma della pianificazione del flusso di lavoro

La pianificazione dei flussi di lavoro in una pipeline di machine learning e la fornitura di resilienza contro errori e situazioni impreviste possono essere molto complesse. Quando si utilizza un pianificatore di flusso di lavoro, può essere difficile specificare tutte le azioni che l’orchestratore dovrebbe intraprendere quando un lavoro fallisce.

Riproducibilità delle pipeline

Eseguire decine o centinaia di pipeline su larga scala, con più fasi interconnesse che possono coinvolgere varie trasformazioni dei dati, parametri algoritmici e dipendenze software, può influire sulla riproducibilità delle pipeline.

Spesso dimenticati, ma l’infrastruttura, il codice e la configurazione utilizzati per produrre i modelli non sono correttamente versionati e si trovano in uno stato non riproducibile e non utilizzabile.

— Ketan Umare, Co-Fondatore e CEO di Union.ai, in una sessione AMA su MLOps.community 2022.

In altri casi, è possibile creare pipeline con configurazioni hardware specifiche che eseguono su un sistema operativo e dipendenze di librerie variabili. Ma quando si compila la pipeline per eseguirla in un ambiente diverso, queste differenze ambientali possono influire sulla riproducibilità delle pipeline di machine learning.

Best practice per la creazione di pipeline di ML

Dalla ricerca nelle conversazioni della comunità al dialogo con ingegneri di aziende come Brainly e Hypefactors per estrarre i principali apprendimenti da Netflix, Lyft, Spotify, e così via, scopri alcune delle best practice per la creazione di pipeline di ML di seguito.

Traccia le tue pipeline di machine learning

Allegiamo automaticamente un tracciatore di esperimenti a ogni pipeline che lanciamo senza che i nostri utenti se ne accorgano. Per noi, ciò garantisce almeno un insieme minimo di parametri tracciati… In generale, vediamo il tracciamento degli esperimenti come uno strumento che dovrebbe essere utilizzato con la pipeline. Consigliamo di utilizzare una pipeline per tracciare i tuoi esperimenti: in questo modo garantirai che siano riproducibili.

— Simon Stiebellehner, Ingegnere principale MLOps e MLE presso TMNL, in “Differenze tra la distribuzione di software classico e l’esecuzione di modelli ML” su MLOps LIVE.

Vuoi sfruttare tecniche e tecnologie per rendere la tua pipeline riproducibile e facile da debuggare. Questo comporta l’esplorazione di pratiche, tra cui:

  • Controllo delle versioni: per gestire le dipendenze, inclusi codice, dati, configurazione, dipendenze di librerie, metadati della pipeline e artefatti, consentendo un facile tracciamento e confronto delle versioni delle pipeline.
  • Implementazione della governance del sistema. A seconda dei passaggi presenti nella tua pipeline, puoi analizzare i metadati delle esecuzioni delle pipeline e la genealogia degli artefatti di ML per rispondere a domande sulla governance del sistema. Ad esempio, potresti utilizzare i metadati per determinare quale versione del tuo modello era in produzione in un determinato momento.
  • Utilizzo di strumenti e framework dedicati che supportano il tracciamento e la gestione delle pipeline, come neptune.ai o MLflow, possono fornire capacità complete di tracciamento e monitoraggio.

Gli strumenti di tracciamento ti consentono di:

  • registrare i risultati degli esperimenti,
  • visualizzare i componenti della pipeline,
  • documentare i dettagli dei passaggi per facilitare la collaborazione tra i membri del team,
  • monitorare le prestazioni della pipeline durante l’esecuzione, facilitando il tracciamento dell’evoluzione della pipeline nel tempo,
  • gestire il progresso della pipeline.

Ecco uno studio di caso interessante su come ReSpo.Vision monitora le loro pipeline con neptune.ai

ReSpo.Vision utilizza l’IA nell’analisi dei dati sportivi per estrarre dati 3D dai video di trasmissione sportiva da una singola telecamera. Eseguono molti pipeline kedro nel processo.

Wojtek Rosiński, CTO di ReSpo.Vision, dice: “Quando usiamo Neptune con kedro, possiamo facilmente monitorare il progresso delle pipeline che vengono eseguite su molte macchine, perché spesso eseguiamo molte pipeline contemporaneamente, quindi diventa quasi impossibile monitorarle tutte comodamente. Con Neptune, possiamo anche eseguire facilmente diverse pipeline utilizzando parametri diversi e quindi confrontare i risultati tramite l’interfaccia utente”.

In basso puoi vedere un esempio di come appare nell’interfaccia utente di Neptune.

Neptune si integra nativamente con strumenti come Kedro e ZenML. Ma anche senza un’integrazione pronta all’uso, puoi usarlo con qualsiasi altro strumento di pipeline che hai a disposizione.

  • Scopri come iniziare con neptune.ai
  • Leggi lo studio di caso completo per saperne di più su come ReSpo.Vision monitora i loro esperimenti e le loro pipeline

Componi i componenti della tua pipeline in funzioni più piccole

Utilizza strumenti di pipelining e l’SDK per costruire la tua pipeline con componenti riutilizzabili (definiti come piccole funzioni). Ecco un esempio che segue il flusso di lavoro della pipeline ZenML:

import numpy as np
from sklearn.base import ClassifierMixin
from sklearn.svm import SVC

from zenml.steps import step


@step
def svc_trainer(
    X_train: np.ndarray,
    y_train: np.ndarray,
) -> ClassifierMixin:
    """Allenare un classificatore sklearn SVC."""
    model = SVC(gamma=0.001)
    model.fit(X_train, y_train)
    return model

In questo modo, puoi implementare il tuo flusso di lavoro costruendo componenti personalizzati o riutilizzando quelli predefiniti. Ciò può rendere più facile e veloce la creazione di nuove pipeline, il debug di quelle esistenti e l’integrazione con altri servizi tecnologici organizzativi.

Non caricare le cose a livello di modulo; spesso è una cosa sbagliata. Non vuoi che il caricamento del modulo impieghi molto tempo e fallisca.

— Ketan Umare, Co-Fondatore e CEO di Union.ai, in una sessione AMA su MLOps.community 2022.

In basso c’è un altro esempio di un passo definito come funzione con lo strumento di orchestrazione Prefect:

@task
def split_data(data: pd.DataFrame):
    # Dividere casualmente l'insieme di dati in 70% per l'addestramento e 30% per il test.
    X = data.drop("rented_bikes", axis=1)
    y = data.rented_bikes
    X_train, X_test, y_train, y_test = train_test_split(
        X, y, train_size=0.7, test_size=0.3, random_state=42
    )
    return X_train, X_test, y_train, y_test

@task
def train_model(X_train: pd.DataFrame, y_train: pd.DataFrame):
    # Creare un'istanza del modello: GBRT (Gradient Boosted Regression Tree)
    model = GradientBoostingRegressor()
    # Allenamento del modello
    model.fit(X_train, y_train)
    return model

Scrivi test per la tua pipeline

Un’altra buona pratica è assicurarsi di creare un insieme di test che copra ogni aspetto della tua pipeline, dalle funzioni che compongono i componenti all’esecuzione dell’intera pipeline. Se possibile (e a seconda del caso d’uso), essere disposti ad automatizzare questi test.

Per garantire che i modelli continuino a funzionare come previsto durante i continui cambiamenti alle immagini dei container di addestramento o di servizio sottostanti, abbiamo una famiglia unica di test applicabili a LyftLearn Serving chiamata model self-tests.

— Mihir Mathur, Product Manager di Lyft, in “Powering Millions of Real-Time Decisions with LyftLearn Serving” blog 2023.

Comporre i componenti della tua pipeline in funzioni più piccole può rendere più facile il test. Ecco un esempio dei test di autovalutazione del modello di Lyft in cui sono stati specificati un piccolo numero di campioni per gli input del modello e gli output attesi in una funzione chiamata `test_data`:

class SampleNeuralNetworkModel(TrainableModel):

    @property

    def test_data(self) -> pd.DataFrame:

        return pd.DataFrame(

            [

                # input `[1, 0, 0]` should generate output close to `[1]`

                [[1, 0, 0], 1],

                [[1, 1, 0], 1],

            ],

            columns=["input", "score"],

        )

Scrivi i tuoi test localmente perché, nella maggior parte dei casi in cui la tua stack e la tua configurazione rendono impossibile il testing locale, è probabile che i tuoi utenti finiscano per testare in produzione. Containerizzare le tue fasi può rendere più facile testare le tue pipeline localmente o in un altro ambiente prima di distribuirle in produzione.

Quali sono i test di pipeline che dovresti scrivere? Eugene Yan, nel suo articolo, ha elencato una mappa di scopo di come dovrebbero essere i test di pipeline efficaci, inclusi test unitari, test di integrazione, test di funzionalità, test end-to-end, e così via. Dai un’occhiata all’articolo approfondito.

Conclusioni

Costruire pipeline di machine learning end-to-end è una competenza fondamentale per gli ingegneri di machine learning moderni. Seguendo le best practice come il testing e la validazione approfonditi, il monitoraggio e il tracciamento, l’automazione e la pianificazione, puoi garantire l’affidabilità e l’efficienza delle pipeline.

Con una solida comprensione dei componenti, della struttura e delle sfide di ogni fase della pipeline, puoi costruire pipeline robuste e scalabili che semplificano il tuo flusso di lavoro di ML.

Happy pipelining!


Riferimenti

  • Intro to Kubeflow Pipelines – YouTube
  • Building and Managing Data Science Pipelines with Kedro – neptune.ai
  • Come Metaflow è diventato il framework di data science amato da Netflix • Julie Amundson
  • https://mlops-community.slack.com/archives/C02NLLRUVN3/p1660842600835749
  • Flyte: MLOps Semplificato – MLOps Community
  • https://mlops-community.slack.com/archives/C02NLLRUVN3/p1660844981495249