MLOps-Dockers e Kubernetes Essentials per un data scientist

Introduzione

Illustrerò le basi e gli elementi essenziali di Docker e Kubernetes per ingegneri MLOps / Data Scientist. Impareremo come dockerizzare una semplice app python ML e quindi distribuirla nel cluster Kubernetes. Docker e Kubernetes è un grande argomento ed è molto difficile coprire tutto qui. Se sei nuovo a docker e Kubernetes, prova a guardare i link ai video di YouTube che ho dato in fondo a questo articolo. In qualità di data scientist, hai creato un modello di machine learning, quindi hai creato un’app usando il framework Streamlit o Python Flask e ora vuoi distribuire l’app di Machine Learning. Qui ci concentreremo solo sul file docker e sul file YAML di distribuzione / servizio Kubernetes. L’ho distribuito in GCP-GKE.

Contenuto

  1. Flusso di lavoro per la distribuzione di docker e kubernetes.
  2. Cos’è Docker? Perché abbiamo bisogno di Docker? Nozioni di base su Docker.
  3. Come dockerizzare un’app ML?
  4. Altri argomenti in Docker.
  5. Cos’è Kubernetes? Perché abbiamo bisogno di Kubernetes?
  6. Dockers VS Kubernetes.
  7. Distribuire l’app ML nel cluster Kubernetes.
  8. Materiali di studio aggiuntivi

Flusso di lavoro per la distribuzione di docker e kubernetes:

immagine dell’autore

In questo articolo, entreremo nel dettaglio del

  • File Docker.
  • File Yaml di distribuzione Kubernetes.
  • File Yaml del servizio Kubernetes.

Questo articolo si basa sul mio precedente articolo

Qui ci immergiamo più a fondo in docker e kubernetes.

Cos'è Docker? Perché abbiamo bisogno di Docker? Nozioni di base su Docker.

Documentazione docker del credito immagine

Secondo la documentazione di Docker, Docker offre la possibilità di creare pacchetti ed eseguire un’applicazione in un ambiente vagamente isolato chiamato contenitore. L’isolamento e la sicurezza consentono di eseguire più contenitori contemporaneamente su un determinato host. I contenitori sono leggeri e contengono tutto il necessario per eseguire l’applicazione, quindi non è necessario fare affidamento su ciò che è attualmente installato sull’host. Puoi condividere facilmente i contenitori mentre lavori ed assicurarti che tutti quelli con cui condividi ottengano lo stesso contenitore che funziona allo stesso modo.

Docker fornisce strumenti e una piattaforma per gestire il ciclo di vita dei container:

  • Sviluppa la tua applicazione e i relativi componenti di supporto utilizzando i contenitori.
  • Il contenitore diventa l’unità per la distribuzione e il test dell’applicazione.
  • Quando si è pronti, distribuire l’applicazione nell’ambiente di produzione, come contenitore o servizio orchestrato. Questo funziona allo stesso modo indipendentemente dal fatto che l’ambiente di produzione sia un data center locale, un provider cloud o un ibrido dei due.
Docker.com del credito di immagine

Qual è la differenza tra Docker e le macchine virtuali?

Immagine per autore
Https://www.backblaze.com/blog/vm-vs-containers/ del credito di immagine
Scopri la differenza tra VM e Dockers nell’articolo seguente

 

Installare Docker:

    1. Installa docker su linux
    2. Installa docker su Mac OS
    3. Installa docker sul sistema operativo Windows

 

Strumenti Docker:

  1. Motore Docker
  2. Docker Desktop
  3. Docker Comporre
  4. Docker Hub

 

Docker parla di

  • Docker File
  • Immagini
  • Contenitori

 

File Docker:

In poche parole, il file docker

  • È un file di testo.
  • Contiene istruzioni dettagliate per creare l’immagine.
  • Docker utilizza queste istruzioni per creare questa immagine.
  • Docker fornisce anche alcuni come COPY, FROM, CMD, ecc.
  • Ci stiamo concentrando solo sull’app python.
  • Ogni Dockerfile deve iniziare con  l’istruzione  FROM. DALL’immagine di base.
  • COPIA – Questo comando copia i file dal sistema locale all’immagine Docker.
  • ENV viene utilizzato per definire le variabili di ambiente.
  • RUN indica a Docker quali comandi aggiuntivi eseguire. Ad esempio RUN pip install -r requirements.txt – Questo comando installa tutte le dipendenze o i pacchetti definiti nel nostro  file requirements.txt.
  • WORKDIR /mlapp – È simile al comando cd. Imposta la nostra directory di lavoro come /mlapp.
  • Esporre: esporre la porta su cui l’applicazione è in ascolto.
  • ENTRYPOINT [“python”] – Questo comando viene eseguito quando l’immagine viene eseguita come contenitore.
  • CMD [“app.py”] – Questo comando specifica il programma o il file che verrà eseguito quando il contenitore viene inizializzato.

 

Immagini Docker:

  • Le immagini sono modelli o progetti per i contenitori.
  • È solo LETTURA
  • Contiene tutte le istruzioni.
  • Ci sono immagini ufficiali su dockerhub.com.
  • Le immagini personalizzate possono essere create creando un file docker.

 

Contenitori Docker:

  • I contenitori sono le istanze dell’immagine docker.
  • È possibile creare più contenitori in base alla stessa immagine docker.
  • Il contenitore può essere creato utilizzando il comando docker run.
  • I contenitori sono READ e WRITE.

Dai un’occhiata ai comandi docker

Docker Cheatsheet

Come dockerizzare un'app PythonML?

App ML per la classificazione delle immagini Python:

Dockerizzeremo un’app di machine learning per la classificazione delle immagini Python e la distribuiremo nel cluster Kubernetes.

Informazioni sull’app:

  • Un’app di classificazione delle immagini multiclasse.
  • Tensorflow usato
  • Crea un’app Streamlit.
  • Docker + Kubernetes e distribuire nel cluster GCP Kubernetes.

Ci concentreremo sui passaggi successivi alla creazione dell’app Streamlit . Il flusso è come di seguito

Immagine dell’autore
Docker.com del credito di immagine

 

Struttura del file:

Immagine per Autore

Passi:

  • Creare il file docker.
  • Creare l’immagine docker.
  • Eseguire il push dell’immagine in un repository.
  • Estrarre l’immagine nel file di distribuzione di Kubernetes.
  • Esporre la porta utilizzando il servizio yaml.
  • Controllare se il pod(Container) è distribuito.

Questo è il nostro file docker per l’app di classificazione delle immagini.

Per ogni istruzione o comando dal Dockerfile, il generatore Docker genera un livello immagine e lo impila su quelli precedenti. Pertanto, l’immagine Docker risultante dal processo è semplicemente una pila di sola lettura di diversi livelli.

 

Passaggi del file Docker:

  • Immagine di base:
  1. La prima riga nel file docker è sempre l’immagine di base.
  2. Scegli sempre l’immagine ufficiale.
  3. Inoltre, la dimensione dell’immagine di base influisce sulla dimensione finale del contenitore.
  4. È meglio usare una piccola dimensione.
  5. Nel nostro caso, è un’applicazione python e abbiamo scelto — DA python: 3.7-slim. Le dimensioni saranno inferiori e avrà tutti i pacchetti importanti di cui abbiamo bisogno.
  • ESEGUI apt-get update: Utilizzando RUN apt-get update && apt-get install -y assicura che dockerfile installi le ultime versioni del pacchetto senza ulteriore codifica o intervento manuale.  Questa tecnica è nota come “cache-busting”.
  • Copia i file locali nell’app contenitore:
  1. Definisce $APP_HOME in ‘/app’.
  2. impostare la directory di lavoro nel contenitore-WORKDIR $APP_HOME.
  3. Ora copia i file locali nella directory di lavoro-COPY. . /
  4. RUN ls -la $APP_HOME/ -s sta per List, il comando ls viene utilizzato per visualizzare il contenuto della directory. Elenca una serie di informazioni su file e directory come autorizzazioni per i file, numero di collegamenti, nome del proprietario, gruppo di proprietari, dimensioni del file, ora dell’ultima modifica e nome del file / directory.

File dei requisiti:

Il nostro file dei requisiti per l’app di classificazione delle immagini python è sopra.

Perché abbiamo bisogno di un file Requirements.txt?

Perché usare i requisiti.txt in un’immagine Docker

C’è una domanda simile dell’anno scorso, ma non penso che le risposte siano ampiamente applicabili e non è accettata …

stackoverflow.com

RUN pip install -r requisiti.txt

requisiti.txt contiene tutti i pacchetti necessari di cui abbiamo bisogno per il modello ML. Quindi aggiungi l’installazione pip per installare tutti i pacchetti necessari di cui abbiamo bisogno come TensorFlow, Streamlit, NumPy, richieste, ecc.

L’ultimo è

# Esegui Streamlit all’avvio del contenitore

CMD [“streamlit”, “run”,”-server.enableCORS”,”false”,”imgwebapp.py”]

La linea CMD non viene eseguita quando l’immagine viene creata. Questo comando viene eseguito all’avvio dell’app contenitore.

Estrazione per ulteriori informazioni sul file docker

Riferimento Dockerfile

In questa pagina vengono descritti i comandi che è possibile utilizzare in un Dockerfile. Quando hai finito di leggere questa pagina, fai riferimento a …

docs.docker.com

Altri argomenti in Docker:

Gli altri argomenti in docker che dovresti sapere sono

Immagine per autore

 

Alcuni comandi importanti che usi sempre:

  • docker –version: utilizzato per identificare la versione attualmente installata di Docker nel sistema host
  • docker ps: utilizzato per elencare tutti i contenitori in esecuzione
  • immagini docker: utilizzate per elencare le immagini archiviate localmente
  • docker login: utilizzato per accedere al tuo account Dockerhub
  • docker push <nomeutente/nomeimmagine>: utilizzato per caricare un’immagine nel repository Dockerhub remoto
  • docker pull <imagename>: utilizzato per scaricare immagini da Dockerhub
  • docker build <path/to/docker/file>: utilizzato per generare un’immagine dal file Docker specificato
  • docker run -it -d <imagename>: utilizzato per creare un contenitore dall’immagine creata
  • docker stop <container ID>: utilizzato per arrestare l’esecuzione del contenitore definito
  • docker rm <container ID>: utilizzato per eliminare un contenitore arrestato
  • docker rmi <imageid>: utilizzato per eliminare l’ID immagine specificato dalla memoria locale.

Guarda questo video che parla della dockerizzazione di un’app Python con FastAPI

Video di docker.com

Cos'è Kubernetes? Perché abbiamo bisogno di Kubernetes?

Credito immagine – Documentazione Kubernetes
Credito al user@swiftonsecurity twitter

Kubernetes è un argomento importante e dovremmo sapere come distribuire l’app ml ed esporre il servizio. Vediamo cosa è importante per un data scientist.

  • Nei tempi precedenti le applicazioni vengono utilizzate per l’esecuzione su server fisici.
  • Quindi nelle macchine virtuali.
  • Ora nell’era del cloud le applicazioni vengono eseguite in contenitori.  Kubernetes è una piattaforma open source portatile, estensibile per la gestione di carichi di lavoro e servizi containerizzati, che facilita sia la configurazione dichiarativa che l’automazione.
  • Kubernetes è stato sviluppato da Google per gestire le proprie app interne e lo ha dato alla Cloud Native Computing Foundation (CNCF) nel 2014 come progetto open source.
  • Kubernetes è sviluppato in golang.
  • Il suo open-source https://github.com/kubernetes/kubernetes
  • È possibile creare il contenitore in docker e distribuirlo in Kubernetes. Kubernetes.
  • Kubernetes è la piattaforma utilizzata per distribuire e gestire le app native del cloud nel cloud o in locale.

 

Documentazione Kubernetes di credito immagine

  • Il cluster Kubernetes è una raccolta di macchine come server fisici, laptop, macchine virtuali, ecc. I computer in un cluster Kubernetes sono, normalmente, denominati nodi. Esistono 2 tipi di nodi: nodi master e nodi di lavoro.
  • Il nodo master contiene il piano di controllo ed è costituito dai seguenti:
  1. Api Server: questa è l’unica parte del cluster in cui si interagisce.
  2. Scheduler-decide in quali nodi i pod devono essere impiegati.
  3. Archivia: tutti i dati del cluster vengono archiviati in questo archivio.
  4. Cloud controller: cloud-controller-manager esegue solo controller specifici per il provider cloud. Se si esegue Kubernetes in locale o in un ambiente di apprendimento all’interno del PROPRIO PC, il cluster non dispone di un gestore di controller cloud.

 

I nodi di lavoro eseguono due servizi principali, ovvero:

  • Kubelet
  • Runtime del contenitore

Kubelet:agente che viene eseguito su ogni nodo del cluster. Si assicura che i contenitori siano in esecuzione in un Pod. Il kubelet prende una serie di PodSpecs che vengono forniti attraverso vari meccanismi e garantisce che i contenitori descritti in quei PodSpecs siano in esecuzione e sani. Il kubelet non gestisce i contenitori che non sono stati creati da Kubernetes.

Runtime contenitore: il runtime contenitore è il software responsabile dell’esecuzione dei contenitori.

La maggior parte dei provider di servizi cloud ha ospitato Kubernetes Services. Alcuni dei più popolari includono:

Immagine dell’autore

Controlla questo articolo – Come l’US Air Force ha schierato Kubernetes su un F16 in 45 giorni.

Perché Kubernetes sta diventando così popolare?

Fumetto Kubernetes

Perché i VC stanno scommettendo in grande su Kubernetes?

Dockers VS Kubernetes:

Immagine di VM author-source

Distribuire l'app ML nel cluster Kubernetes:

Ecco di nuovo i passaggi generali:

  1. Creare il modello di machine learning usando Tensorflow.
  2. Crea un’app ML usando il framework Streamlit.
  3. Creare un file docker e l’immagine.
  4. Eseguire il push dell’immagine in un Registro di sistema.
  5. In Kubernetes creare un pod. Il pod è solo un involucro che contiene il contenitore.
  6. Distribuire il pod ed esporre la porta del servizio.

La distribuzione può essere eseguita in 2 modi.

  • Approccio dichiarativo-Utilizzo di YAML
  •  Approccio imperativo-CLI — Kubectl

Per saperne di più sugli approcci dichiarativi e imperativi, controlla il seguente StackOverflow

 

Cos’è Pod?

  • Secondo la documentazione di Google Cloud, i Pod sono gli oggetti distribuibili più piccoli e di base in Kubernetes. Un Pod rappresenta una singola istanza di un processo in esecuzione nel cluster.
  • I pod contengono uno o più contenitori, ad esempio i contenitori Docker. Quando un pod esegue più contenitori, questi vengono gestiti come un’unica entità e condividono le risorse del pod. In genere, l’esecuzione di più contenitori in un singolo Pod è un caso d’uso avanzato. Possiamo concentrarci solo su un singolo contenitore pod.
  • I pod contengono anche risorse di rete e di archiviazione condivise per i relativi contenitori.
  • Ai pod vengono assegnati automaticamente indirizzi IP univoci.
  • In docker, è il contenitore e in Kubernetes è pod.
  • Il pod è un involucro del contenitore.
Immagine dell’Autore

 

Come distribuire un pod in un cluster Kubernetes?

  • Creare il file di configurazione in YAML.
  • Inviare il file al server API.
  • Verificare il file YAML di configurazione.
  • L’Utilità di pianificazione distribuisce il POD nel cluster.

Ulteriori informazioni sulla distribuzione

immagine per l’autore

 

File di distribuzione del pod

  • Abbiamo già creato l’immagine e poi l’abbiamo inviata a un registro. In questo caso, lo abbiamo inserito nel registro GCP.
  • Ora dobbiamo solo eseguire la distribuzione ed esporre la porta.
  • La riga 1-apiVersion è obbligatoria e stiamo usando apps/V1.
  • La linea 2-Kind è obbligatoria e stiamo usando la distribuzione.
  • Linea 3 e 4-metadati – Solo il nome della distribuzione.
  • Linea 5-Qui le specifiche — i dettagli di configurazione partono da questa linea.
  • La distribuzione riguarda il numero di pod desiderati (repliche) e come distribuire il pod.
  • Qui dico che ho bisogno di 2 repliche.
  • In Kubernetes, dobbiamo capire:
  1. Stato corrente – È lo stato presente.
  2. Stato desiderato: è la data desiderata desiderata
  3. YAML Config File-contiene la configurazione dello stato desiderato.
  4. Kubernetes si assicura che lo stato desiderato venga mantenuto per tutto il tempo.
  5. In questo esempio, ho menzionato che le repliche hanno 2. Quindi Kubernetes manterrà 2 repliche-Pod tutto il tempo.
  • Il selettore line 7-Spec indica le etichette che i pod dovrebbero avere.
  • Riga 16-Nome contenitore.
  • Riga 17-Posizione dell’immagine del contenitore. In questo, è memorizzato nel registro GCP.
  • Linea 19-Porta container 8501.
  • Ora usa Kubectl e distribuisci il file YAML di distribuzione.

$ kubectl apply -f deploy.yml

Inoltre, controllare lo stato della distribuzione

$ kubectl get deploy imgclass

$ kubectl descrivere deploy imgclass

$ kubectl ottenere rs

Il prossimo passo è mappare il porto.

Servizio -Porta di esposizione

  • La riga 1-apiversion è obbligatoria e stiamo usando v1.
  • Il tipo di linea 2 è obbligatorio e stiamo utilizzando il servizio.
  • Riga 3-metadati: solo il nome dell’imageclassifier del servizio.
  • La riga 4- spec-contiene i dettagli di configurazione.
  • Qui stiamo mappando la porta container 8501 alla porta 80.
  • Questo servizio è in ascolto sulla porta 80 e invia il traffico al Pod sulla porta 8501.

 

Distribuire il file YAML

 

$ kubectl applicare -f service.yml

Dettagli del servizio

 

$kubectl ottenere svc imageclassfier

Distribuzione vs servizio

Materiali di studio aggiuntivi:

Penso che sia meglio imparare

  • Comandi Linux di base
  • YAML ·
  • Architettura e comandi Docker.
  • Kubernetes da una visualizzazione per sviluppatori di applicazioni.

 

Trucchi :

Comandi Linux

 

Conclusione:

Penso che Kubernetes stia guadagnando popolarità e sia utilizzato da molte aziende. Per l’orchestrazione dei container, Kubernetes è lo strumento predefinito utilizzato dalla maggior parte delle aziende. È bene imparare docker e Kubernetes se hai intenzione di lavorare come Data Scientist o Machine learning engineer. Non esitate a connettervi con me su LinkedIn.

 

Articolo originale di Senthil E

MLOps End-To-End Machine Learning Pipeline-CICD | by Senthil E | Analytics Vidhya | Medium

Share:

Contenuti
Torna in alto