Da blocco note a pipeline Kubeflow con HP Tuning: un percorso di data science

1. Introduzione

Kubeflow è un toolkit di machine learning per Kubernetes. Il progetto è dedicato a rendere i deployment di flussi di lavoro di machine learning (ML) su Kubernetes semplici, portabili e scalabili. L'obiettivo è fornire un modo semplice per eseguire il deployment dei migliori sistemi open source per il machine learning su diverse infrastrutture.

Che aspetto ha un deployment Kubeflow?

Un deployment Kubeflow è:

  • Portabile: funziona su qualsiasi cluster Kubernetes, che sia su Google Cloud Platform (Google Cloud), on-premise o su più provider.
  • Scalabile: può utilizzare risorse fluttuanti ed è vincolato solo dal numero di risorse allocate al cluster Kubernetes.
  • Componibile: consente di configurare passaggi indipendenti in un flusso di lavoro ML completo, scegliendo tra un set selezionato di framework e librerie ML.

Kubeflow offre la possibilità di organizzare i microservizi a basso accoppiamento come singola unità ed eseguirne il deployment in diverse posizioni, ad esempio su un laptop, on-premise o nel cloud.

Questo codelab ti spiega come creare il tuo deployment Kubeflow utilizzando MiniKF e poi eseguire un flusso di lavoro Kubeflow Pipelines con ottimizzazione degli iperparametri per addestrare e pubblicare un modello. Puoi fare tutto questo direttamente da un blocco note Jupyter.

Cosa creerai

In questo codelab, creerai una pipeline di data science complessa con ottimizzazione degli iperparametri su Kubeflow Pipelines, senza utilizzare SDK o comandi dell'interfaccia a riga di comando. Non è necessaria alcuna conoscenza di Kubernetes o Docker. Al termine, l'infrastruttura conterrà:

  • Una VM MiniKF (Mini Kubeflow) che si installa automaticamente:
  • Kubernetes (mediante Minikube)
  • Kubeflow
  • Kale, uno strumento per convertire i blocchi note Jupyter per uso generico in flussi di lavoro Kubeflow Pipelines ( GitHub)
  • Arrikto Rok per il controllo delle versioni e la riproducibilità dei dati

Cosa imparerai a fare

  • Come installare Kubeflow con MiniKF
  • Come convertire i tuoi blocchi note Jupyter in pipeline Kubeflow senza utilizzare SDK o comandi dell'interfaccia a riga di comando
  • Eseguire pipeline di Kubeflow con ottimizzazione degli iperparametri dall'interno di un blocco note con il clic di un pulsante
  • Come eseguire automaticamente la versione dei dati in un blocco note e in ogni passaggio della pipeline

Che cosa ti serve

Questo è un codelab avanzato su Kubeflow. Per ulteriori informazioni di base e per un'introduzione alla piattaforma, consulta la documentazione Introduzione a Kubeflow. Concetti e blocchi di codice non pertinenti sono trattati solo superficialmente e sono forniti solo per operazioni di copia e incolla.

2. Configurare l'ambiente

Configura il progetto Google Cloud

Segui i passaggi riportati di seguito per creare un progetto Google Cloud o configurare il tuo progetto Google Cloud esistente. Se prevedi di utilizzare un progetto Google Cloud esistente, assicurati che soddisfi i requisiti minimi descritti di seguito. Il primo passaggio consiste nell'aprire Resource Manager nella console di Google Cloud.

Crea un nuovo progetto o selezionane uno esistente:

99b103929d928576.png

Verifica i seguenti requisiti minimi:

Per ulteriore assistenza relativa alla configurazione di un progetto della piattaforma Google Cloud, consulta la documentazione di Google Cloud.

Dopo aver configurato il progetto Google Cloud, vai direttamente alle istruzioni per l'installazione di MiniKF.

Apri il progetto Google Cloud preallocato

Per aprire il progetto Google Cloud preallocato, fai clic sul pulsante di seguito per visitare la console di Google Cloud e aprire il riquadro della home page, che si trova nel menu a tre linee in alto a sinistra. Se la schermata è vuota, fai clic su Sì quando ti viene richiesto di creare una dashboard.

3fdc4329995406a0.png

Se il progetto non è già selezionato, fai clic su Seleziona un progetto:

e8952c0b96067dea.png

Seleziona il progetto. Dovresti averne uno solo:

fe25c1925487142.png

3. Installa MiniKF

Crea un'istanza Compute che includa MiniKF

In Google Cloud Marketplace, cerca "MiniKF".

Seleziona la macchina virtuale MiniKF di Arrikto:

d6b423c1911ea85a.png

Fai clic sul pulsante LANCIO e seleziona il tuo progetto:

7d07439db939b61c.png

Nella sezione Configura e Esegui il deployment, scegli un nome e una zona per l'istanza MiniKF e lascia le opzioni predefinite. Quindi, fai clic sul pulsante Esegui il deployment:

7d5f7d17a80a1930.png

Attendi l'avvio dell'istanza di computing MiniKF:

5228086caadc44c6.png

Accedi a MiniKF

Quando la VM MiniKF è attiva, connettiti e accedi facendo clic sul pulsante SSH. Segui le istruzioni sullo schermo per eseguire il comando minikf, che avvierà il deployment di Minikube, Kubeflow e Rok. Il completamento dell'operazione richiede alcuni minuti.

774e83c3e96cf7b3.png

Accedi a Kubeflow

Una volta completata l'installazione e tutti i pod pronti, visita la dashboard MiniKF. Accedi a Kubeflow utilizzando nome utente e password di MiniKF:

251b0bcdbf6d3c71.png

9d49d899bb0b5bd1.png

Gli utenti di Chrome vedranno questa schermata:

6258e0f09e46a6c2.png

Gli utenti di Firefox vedranno questa schermata:

8cff90ce2f0670bd.png

Gli utenti di Safari vedranno questa schermata:

1c6fd768d71c0a92.png

Accedi a Rok

Dopo aver effettuato l'accesso a Kubeflow, apri il menu a sinistra facendo clic sull'icona a forma di hamburger. Fai clic su Snapshots e accedi a Rok utilizzando il nome utente e la password di MiniKF.

16171f35a935a9af.png

80aad6ba5d298a7e.png

Complimenti! Hai eseguito correttamente il deployment di MiniKF su Google Cloud. Ora puoi creare blocchi note, scrivere codice ML, eseguire Kubeflow Pipelines e usare Rok per il controllo delle versioni e la riproducibilità dei dati.

4. Esegui una pipeline dall'interno del blocco note

In questa sezione, eseguirai l'esempio di identificazione della razza canina, un progetto dell'Università di Udacity AI Nanodegree. Data l'immagine di un cane, il modello finale fornirà una stima della razza del cane.

Crea un server di blocchi note nel cluster Kubeflow

Vai al link Notebooks nella dashboard centrale di Kubeflow.

60825e935fd0f39b.png

Fai clic su Nuovo server.

f9303c0a182e47f5.png

Specifica un nome per il server dei blocchi note.

a2343f30bc9522ab.png

Assicurati di aver selezionato la seguente immagine Docker (tieni presente che il tag immagine potrebbe differire):

gcr.io/arrikto/jupyter-kale:f20978e

Aggiungi un nuovo volume di dati vuoto di 5 GB e denominalo dati.

8544d9b05826b316.png

Fai clic su Avvia per creare il server dei blocchi note.

28c024bcc55cc70a.png

Quando il server dei blocchi note è disponibile, fai clic su Connetti per connetterti al server.

52f1f8234988ceaa.png

Scaricare i dati e il blocco note

Si aprirà una nuova scheda con la pagina di destinazione JupyterLab. Crea un nuovo terminale in JupyterLab.

ab9ac96f1a1f0d09.png

Nella finestra del terminale, esegui questi comandi per passare alla cartella data e scaricare il blocco note e i dati che utilizzerai per il resto del lab:

cd data/
git clone https://github.com/kubeflow-kale/kale

Il repository clonato contiene una serie di esempi selezionati con dati e blocchi note con annotazioni.

Nella barra laterale, vai alla cartella data/kale/examples/dog-breed-classification/ e apri il blocco note dog-breed.ipynb.

2bc436465522f65b.png

Esempio di codice ML dell'identificazione delle razze canine

Per il momento, non eseguire le celle che scaricano i set di dati, perché utilizzerai alcuni set di dati più piccoli inclusi nel repository che hai appena clonato. Se esegui questo esempio da casa, scarica i set di dati.

Esegui la cella imports per importare tutte le librerie necessarie. Tieni presente che il codice non funziona perché manca una libreria:

5e2b97ab2512f139.png

Normalmente, devi creare una nuova immagine Docker per poter eseguire questo blocco note come pipeline Kubeflow, in modo da includere le librerie appena installate. Fortunatamente, Rok e Kale si assicurano che tutte le librerie che installi durante lo sviluppo possano arrivare alla tua pipeline, grazie alla tecnologia di creazione di snapshot di Rok e Kale che monta questi volumi di snapshot nei passaggi della pipeline.

Esegui la cella successiva per installare la libreria mancante:

c483da77943a6f01.png

Riavvia il kernel del blocco note facendo clic sull'icona Riavvia:

376b5203209c2c91.png

Esegui di nuovo la cella imports con le librerie corrette installate e osservalo correttamente.

Converti il blocco note in una pipeline in Kubeflow Pipelines

Abilita Kale facendo clic sull'icona Kubeflow nel riquadro sinistro del blocco note:

7b96241f2ab6c389.png

Attiva Kale facendo clic sul cursore nel riquadro di deployment di Kale:

804cfbf9d76b7e23.png

Esplora le dipendenze per cella all'interno del blocco note. Scopri come più celle del blocco note possono far parte di un singolo passaggio della pipeline, come indicato dalle barre colorate a sinistra delle celle, e come un passaggio della pipeline può dipendere dai passaggi precedenti, come indicato dalle etichette dipende dalle etichette sopra le celle. Ad esempio, l'immagine seguente mostra più celle che fanno parte dello stesso passaggio della pipeline. Hanno lo stesso colore rosso e dipendono da un passaggio precedente della pipeline.

fcd0fb351cdfb359.png

Fai clic sul pulsante Compila ed esegui:

18f2f6f0e12393d5.png

Ora Kale prende il controllo del tuo blocco note e lo crea, convertendolo in una pipeline Kubeflow Pipelines. Inoltre, poiché Kale si integra con Rok per acquisire snapshot del volume di dati del blocco note attuale, puoi osservare l'avanzamento dell'istantanea. Rok si occupa del controllo delle versioni dei dati e della riproduzione dell'intero ambiente come era quando hai fatto clic sul pulsante Compila ed esegui. In questo modo, hai una macchina del tempo per i tuoi dati e il tuo codice e la pipeline verrà eseguita nello stesso ambiente in cui hai sviluppato il codice, senza dover creare nuove immagini Docker.

de1b88af76df1a9a.png

La pipeline è stata compilata e caricata su Kubeflow Pipelines. Ora fai clic sul link per andare all'interfaccia utente di Kubeflow Pipelines e visualizzare l'esecuzione.

e0b467e2e7034b5d.png

La UI di Kubeflow Pipelines si apre in una nuova scheda. Attendi il completamento dell'esecuzione.

21a9d54a57f3e20c.png

39e6fa39516d2773.png

Complimenti! Hai appena eseguito una pipeline end-to-end in Kubeflow Pipelines, partendo dal tuo blocco note.

5. Transfer Learning con l'ottimizzazione degli iperparametri

Esamina i risultati

Dai un'occhiata ai log del passaggio cnn-from-scratch. (fai clic sul passaggio nel grafico nell'interfaccia utente di Kubeflow Pipelines, quindi sulla scheda Log). Questa è la fase in cui hai addestrato una rete neurale convoluzionale (CNN) da zero. Nota che il modello addestrato ha una precisione molto bassa e, per di più, il completamento di questo passaggio ha richiesto molto tempo.

62bf0835e9896c67.png

Dai un'occhiata ai log del passaggio cnn-vgg16. In questo passaggio, hai utilizzato il transfer learning sul modello VGG-16 preaddestrato, una rete neurale addestrata dal Visual Geometry Group (VGG). L'accuratezza è molto più elevata rispetto al modello precedente, ma possiamo comunque fare meglio.

2b45072da65e20ae.png

Ora esamina i log del passaggio cnn-resnet50. In questo passaggio, hai utilizzato il transfer learning sul modello ResNet-50 preaddestrato. La precisione è molto più elevata. Questo è quindi il modello che utilizzerai per la parte restante del codelab.

a1dc84ea48a87820.png

Ottimizzazione degli iperparametri

Torna al server del blocco note nella UI di Kubeflow e apri il blocco note denominato dog-breed-katib.ipynb (nel percorso data/kale/examples/dog-breed-classification/). In questo blocco note, eseguirai alcuni esperimenti di ottimizzazione degli iperparametri sul modello ResNet-50, utilizzando Katib. Nota che c'è una cella all'inizio del blocco note in cui dichiarare i parametri:

87b9f6c98dc1823e.png

Nel riquadro a sinistra del blocco note, abilita Ottimizzazione HP con Katib per eseguire l'ottimizzazione degli iperparametri:

a518eba74d341139.png

Quindi, fai clic su Imposta Katib Job per configurare Katib:

f4e34fff6a93aa60.png

Definisci lo spazio di ricerca per ogni parametro e definisci un obiettivo:

cfc6b7bcdc685a02.png

Fai clic sul pulsante Compila ed esegui un job Katib:

f9c1ab0a6a3c5e8d.png

Guarda l'avanzamento dell'esperimento Katib:

f3514011876564db.png

Fai clic su Visualizza per vedere l'esperimento Katib:

ab2f5a5edd48e8dc.png

Fai clic su Fine per visualizzare le esecuzioni in Kubeflow Pipelines (KFP):

410a843b6f044a4b.png

Nella pagina dell'esperimento Katib vedrai le nuove prove:

a511dca519580133.png

Nella UI di KFP vedrai le nuove esecuzioni:

43dd34ee2b75018d.png

Vediamo cosa è successo. In precedenza, Kale ha generato un'esecuzione della pipeline da un blocco note, mentre ora sta creando più esecuzioni della pipeline, ciascuna delle quali viene alimentata con una diversa combinazione di argomenti.

Katib è il componente di Kubeflow per eseguire job di ottimizzazione degli iperparametri per uso generico. Katib non sa nulla dei job che sta effettivamente eseguendo (chiamati prove nel gergo Katib). A Kale interessa solo lo spazio di ricerca, l'algoritmo di ottimizzazione e l'obiettivo. Katib supporta l'esecuzione di job semplici (ovvero i pod) come prove, ma Kale implementa uno shim per fare in modo che le prove eseguano effettivamente le pipelines in Kubeflow Pipelines, quindi raccolgano le metriche dalle esecuzioni della pipeline.

Poiché l'esperimento Katib sta producendo prove, vedrai più prove nell'interfaccia utente di Katib:

3e854d3d4bb766c.png

E altre esecuzioni nell'interfaccia utente di KFP:

ffd30dcefa739962.png

Al termine dell'esperimento Katib, potrai visualizzare tutte le prove nella UI di Katib:

9096ae9caa77e42a.png

E tutte le esecuzioni nell'interfaccia utente di KFP:

7acc64dfee4f35a3.png

Se torni al blocco note, vedrai un pulsante informazioni accanto all'esperimento Katib all'interno del riquadro Kale:

95b092180d71dc80.png

Fai clic e vedrai il risultato migliore e i parametri che lo hanno prodotto:

3b0ce47e548e5afb.png

6. Esegui la pulizia

Elimina la VM MiniKF

Vai a Deployment Manager nella console di Google Cloud ed elimina il deployment minikf-on-gcp.

7. Complimenti

Complimenti, hai eseguito correttamente un flusso di lavoro di data science end-to-end con Kubeflow (MiniKF), Kale e Rok.

Passaggi successivi

Unisciti alla community Kubeflow:

Per approfondire