Introduzione
Pipeline, Deployment e MLOps sono concetti molto importanti per i data scientist di oggi. Costruire un modello in Notebook non basta. Per molte aziende è sempre più centrale distribuire pipeline e gestire processi end-to-end seguendo le best practice MLOps. Questo tutorial tratta vari concetti chiave come Pipeline, CI/CD, API, Container, Docker, Kubernetes. Imparerai anche a conoscere framework e librerie MLOps in Python. Infine, il tutorial mostra un'implementazione end-to-end: containerizzare un'applicazione web di ML basata su Flask e distribuirla sul cloud Microsoft Azure.
Concetti chiave
MLOps
MLOps sta per Machine Learning Operations. MLOps si concentra sul semplificare il processo di messa in produzione dei modelli di machine learning, e poi sulla loro manutenzione e monitoraggio. MLOps è una funzione collaborativa, spesso composta da data scientist, ML engineer e DevOps engineer. La parola MLOps è la fusione di due ambiti diversi: il machine learning e il DevOps dell'ingegneria del software.
MLOps può comprendere tutto, dalla data pipeline alla produzione del modello di machine learning. In alcuni contesti, vedrai che l'MLOps è applicato solo al deployment del modello di machine learning, ma troverai anche aziende che implementano l'MLOps in molte aree dello sviluppo del ciclo di vita dell'ML, tra cui Exploratory Data Analysis (EDA), Data Preprocessing, Model Training, ecc.
Se all'inizio l'MLOps era un insieme di best practice, sta lentamente evolvendo in un approccio autonomo alla gestione del ciclo di vita dell'ML. MLOps si applica all'intero ciclo di vita: dall'integrazione con la generazione del modello (software development lifecycle e continuous integration/continuous delivery), all'orchestrazione e al deployment, fino a health, diagnostica, governance e metriche di business.

Perché MLOps?
Ci sono molti obiettivi che le aziende vogliono raggiungere grazie all'MLOps. I più comuni sono:
- Automazione
- Scalabilità
- Riproducibilità
- Monitoraggio
- Governance
MLOps vs DevOps
DevOps è un approccio iterativo per portare applicazioni software in produzione. MLOps riprende gli stessi principi per portare modelli di machine learning in produzione. Sia in DevOps sia in MLOps, l'obiettivo finale è una qualità superiore e un maggiore controllo delle applicazioni software/modelli di ML.
CI/CD: continuous integration, continuous delivery e continuous deployment.
La CI/CD è una pratica derivata dal DevOps e si riferisce a un processo continuo di individuazione dei problemi, rivalutazione e aggiornamento automatico dei modelli di machine learning. I concetti principali attribuiti alla CI/CD sono continuous integration, continuous delivery e continuous deployment. Automatizza la pipeline di machine learning (build, test e deploy) e riduce notevolmente la necessità di interventi manuali da parte dei data scientist, rendendo il processo efficiente, veloce e meno soggetto a errori umani.

Pipeline
Una pipeline di machine learning è un modo per controllare e automatizzare il flusso di lavoro necessario a produrre un modello di machine learning. Le pipeline di machine learning sono composte da più passaggi sequenziali che vanno dall'estrazione e preparazione dei dati fino al training e al deployment del modello.
Le pipeline di machine learning sono iterative, perché ogni passaggio viene ripetuto per migliorare continuamente l'accuratezza del modello e raggiungere l'obiettivo finale.

Il termine Pipeline è usato in generale per descrivere una sequenza indipendente di passaggi organizzati per raggiungere un certo obiettivo. Questo obiettivo può riguardare il machine learning o meno. Le Machine Learning Pipeline sono molto diffuse, ma non sono l'unico tipo di pipeline esistente. Le Data Orchestration Pipeline sono un altro esempio. Secondo la documentazione Microsoft, ci sono tre scenari:

Deployment
Il deployment dei modelli (o delle pipeline) di machine learning è il processo con cui si rendono i modelli disponibili in produzione, affinché applicazioni web, software aziendali (ERP) e API possano consumare il modello addestrato fornendo nuovi dati e ottenere le predizioni.
In breve, il Deployment nel Machine Learning è il metodo con cui integri un modello di ML in un ambiente di produzione esistente per prendere decisioni operative basate sui dati. È l'ultima fase del ciclo di vita del machine learning.
Di solito il termine Deployment del Modello di Machine Learning è usato per descrivere il deployment dell'intera Pipeline di ML, in cui il modello è solo uno dei componenti della Pipeline.

Come puoi vedere nell'esempio sopra, questa pipeline comprende un modello di Regressione Logistica. Ci sono diversi passaggi che devono essere eseguiti prima che inizi il training, come l'imputazione dei valori mancanti, la codifica One-Hot, lo scaling e l'Analisi delle Componenti Principali (PCA).
Application Programming Interface (API)
L'Application Programming Interface (API) è un intermediario software che consente a due applicazioni di comunicare tra loro. In parole semplici, un'API è un contratto tra due applicazioni: se il software utente fornisce un input in un formato predefinito, l'API restituirà il risultato all'utente. In altre parole, l'API è un end-point dove ospiti i modelli di machine learning addestrati (o le pipeline) per l'uso. In pratica si presenta così:

Container
Ti è mai capitato che il tuo codice Python (o di un altro linguaggio) funzioni sul tuo computer ma, quando un amico prova a eseguire esattamente lo stesso codice, non funziona? Se il tuo amico ripete gli stessi passaggi, dovrebbe ottenere gli stessi risultati, giusto? La risposta semplice è che l'ambiente Python del tuo amico è diverso dal tuo.
Cosa include un ambiente?
Python (o qualsiasi altro linguaggio che hai usato) e tutte le librerie e dipendenze utilizzate per costruire quell'applicazione.
Se riusciamo in qualche modo a creare un ambiente trasferibile su altre macchine (ad esempio il computer del tuo amico o un fornitore cloud come Microsoft Azure, AWS o GCP), possiamo riprodurre i risultati ovunque. Un container è un tipo di software che impacchetta un'applicazione e tutte le sue dipendenze, in modo che l'applicazione possa essere eseguita in modo affidabile da un ambiente di calcolo a un altro.
Il modo più intuitivo per capire i container nella data science è pensare ai container su una nave. L'obiettivo è isolare il contenuto di un container dagli altri per evitare che si mescoli. È esattamente ciò per cui si usano i container nella data science.
Ora che abbiamo capito la metafora dei container, vediamo opzioni alternative per creare un ambiente isolato per la nostra applicazione. Una semplice alternativa è avere una macchina separata per ciascuna applicazione.
Usare una macchina separata è semplice, ma non supera i vantaggi dei container: mantenere più macchine per ogni applicazione è costoso, difficile da gestire e poco scalabile. In breve, non è pratico in molti scenari reali.
Un'altra alternativa per creare un ambiente isolato sono le macchine virtuali. Anche qui i container sono preferibili, perché richiedono meno risorse, sono molto portabili e si avviano più velocemente.

Riesci a individuare le differenze tra Macchine Virtuali e Container? Quando usi i container, non servono sistemi operativi guest. Immagina 10 applicazioni in esecuzione su una macchina virtuale: servirebbero 10 sistemi operativi guest, contro nessuno nel caso dei container.
Docker
Docker è un'azienda che fornisce software (chiamato anch'esso Docker) che permette di creare, eseguire e gestire container. Sebbene i container di Docker siano i più comuni, esistono anche alternative meno note come LXD e LXC che offrono soluzioni a container.
Docker è uno strumento progettato per semplificare la creazione, il deployment e l'esecuzione delle applicazioni tramite container. I container vengono utilizzati per impacchettare un'applicazione con tutti i componenti necessari, come librerie e altre dipendenze, e distribuirla come un unico pacchetto.

Ridimensionare l'hype
In fin dei conti, Docker è solo un file con alcune righe di istruzioni, salvato nella cartella del tuo progetto con il nome "Dockerfile".
Un altro modo per pensare ai file Docker è considerarli come ricette inventate nella tua cucina. Quando le condividi e qualcuno segue esattamente le stesse istruzioni, ottiene lo stesso piatto. Allo stesso modo, puoi condividere i tuoi file Docker con altre persone, che potranno creare immagini ed eseguire container basati su quel particolare Dockerfile.
Kubernetes
Sviluppato da Google nel 2014, Kubernetes è un potente sistema open-source per gestire applicazioni containerizzate. In parole semplici, Kubernetes è un sistema per eseguire e coordinare applicazioni containerizzate su un cluster di macchine. È una piattaforma progettata per gestire completamente il ciclo di vita delle applicazioni containerizzate.
Funzionalità
- Load Balancing: distribuisce automaticamente il carico tra i container.
- Scalabilità: scala automaticamente in su o in giù aggiungendo o rimuovendo container quando la domanda cambia, ad esempio nelle ore di punta o nei weekend e festivi.
- Storage: mantiene lo storage coerente con più istanze di un'applicazione.
Perché ti serve Kubernetes se hai Docker?
Immagina uno scenario in cui devi eseguire più container Docker, su più macchine, per supportare un'applicazione di ML a livello enterprise con carichi variabili giorno e notte. Per quanto possa sembrare semplice, farlo manualmente è molto lavoro.
Devi avviare i container giusti al momento giusto, capire come possano comunicare tra loro, gestire l'archiviazione e affrontare container o hardware guasti. Questo è il problema che Kubernetes risolve, permettendo a un gran numero di container di lavorare insieme in armonia e riducendo l'onere operativo.
Google Kubernetes Engine è un'implementazione dell'open-source Kubernetes di Google su Google Cloud Platform. Altre alternative popolari a GKE sono Amazon ECS e Microsoft Azure Kubernetes Service.
Ripasso veloce dei termini:
- Un Container è un tipo di software che impacchetta un'applicazione e tutte le sue dipendenze affinché l'applicazione giri in modo affidabile da un ambiente di calcolo a un altro.
- Docker è il software usato per creare e gestire i container.
- Kubernetes è un sistema open-source per gestire applicazioni containerizzate in un ambiente cluster.

Framework e librerie MLOps in Python
MLflow
MLflow è una piattaforma open-source per gestire il ciclo di vita dell'ML, inclusi sperimentazione, riproducibilità, deployment e un registro centralizzato dei modelli. MLflow offre attualmente MLflow Tracking, MLflow Projects, MLflow Models e Model Registry.
Metaflow
Metaflow è una libreria Python pensata per le persone, che aiuta scienziati e ingegneri a costruire e gestire progetti di data science reali. Metaflow è stata sviluppata originariamente in Netflix per aumentare la produttività dei data scientist che lavorano su un'ampia varietà di progetti, dalla statistica classica al deep learning all'avanguardia. Metaflow fornisce un'API unificata allo stack infrastrutturale richiesto per eseguire progetti di data science, dal prototipo alla produzione.
Kubeflow
Kubeflow è una piattaforma open-source per il machine learning, progettata per consentire alle pipeline di ML di orchestrare workflow complessi in esecuzione su Kubernetes. Kubeflow si basa sul metodo interno di Google per distribuire modelli TensorFlow chiamato TensorFlow Extended.
Kedro
Kedro è un framework Python open-source per creare codice di data science riproducibile, manutenibile e modulare. Riprende concetti dalle best practice dell'ingegneria del software e li applica al codice di machine learning; tra i concetti applicati ci sono modularità, separazione delle responsabilità e versionamento.
FastAPI
FastAPI è un framework web per sviluppare API RESTful in Python. FastAPI si basa su Pydantic e sulle type hints per validare, serializzare e deserializzare i dati e genera automaticamente documenti OpenAPI.
ZenML
ZenML è un framework MLOps open-source ed estensibile per creare pipeline di machine learning pronte per la produzione. Pensato per i data scientist, ha una sintassi semplice e flessibile, è indipendente dal cloud e dagli strumenti, e offre interfacce/astrazioni mirate ai workflow di ML.
Esempio: sviluppo end-to-end della pipeline, deployment e MLOps
Impostazione del problema
Un'assicurazione vuole migliorare il forecasting dei flussi di cassa prevedendo meglio i costi a carico del paziente, utilizzando metriche demografiche e di rischio sanitario di base al momento del ricovero.

Il nostro obiettivo è costruire e distribuire un'applicazione web in cui le informazioni demografiche e sanitarie di un paziente vengono inserite in un form web, che restituisce poi un importo di spesa previsto. Per farlo eseguiremo i seguenti passaggi:
- Addestrare e sviluppare una pipeline di machine learning per il deployment (modello di regressione lineare semplice).
- Costruire una web app usando il framework Flask. Userà la pipeline di ML addestrata per generare predizioni su nuovi punti dati in tempo reale (il codice front-end non è il focus di questo tutorial).
- Creare un'immagine e un container Docker.
- Pubblicare il container su Azure Container Registry (ACR).
- Distribuire la web app nel container pubblicandola su ACR. Una volta distribuita, sarà pubblicamente disponibile e accessibile tramite un URL web.
Pipeline di Machine Learning
Userò PyCaret in Python per addestrare e sviluppare una pipeline di machine learning che sarà utilizzata come parte della nostra web app. Puoi usare qualsiasi framework preferisci, perché i passaggi successivi non dipendono da questo.
# load dataset
from pycaret.datasets import get_data
insurance = get_data('insurance')
# init environment
from pycaret.regression import *
r1 = setup(insurance, target = 'charges', session_id = 123,
normalize = True,
polynomial_features = True, trigonometry_features = True,
feature_interaction=True,
bin_numeric_features= ['age', 'bmi'])
# train a model
lr = create_model('lr')
# save pipeline/model
save_model(lr, model_name = 'c:/username/pycaret-deployment-azure/deployment_28042020')
Quando salvi un modello in PyCaret, viene creata l'intera pipeline di trasformazione, in base alla configurazione definita nella funzione setup. Tutte le interdipendenze vengono orchestrate automaticamente. Ecco la pipeline e il modello salvati nella variabile 'deployment_28042020':

Applicazione web front-end
Questo tutorial non è incentrato sulla creazione di un'app Flask. Ne parliamo solo per completezza. Ora che la nostra pipeline di machine learning è pronta, ci serve un'applicazione web che possa leggere la pipeline addestrata per prevedere nuovi punti dati. Questa applicazione ha due parti:
- Front-end (progettato in HTML)
- Back-end (sviluppato con Flask)
Ecco come appare il front-end:

Il front-end di questa applicazione è semplice HTML con un po' di CSS. Se vuoi vedere il codice, consulta questo repo. Ora che abbiamo un'app web pienamente funzionante, possiamo iniziare a containerizzare l'applicazione con Docker.
Back-end dell'applicazione
Il back-end dell'applicazione è un file Python chiamato app.py. È costruito usando il framework Flask.
from flask import Flask,request, url_for, redirect, render_template, jsonify
from pycaret.regression import *
import pandas as pd
import pickle
import numpy as np
app = Flask(__name__)
model = load_model('deployment_28042020')
cols = ['age', 'sex', 'bmi', 'children', 'smoker', 'region']
@app.route('/')
def home():
return render_template("home.html")
@app.route('/predict',methods=['POST'])
def predict():
int_features = [x for x in request.form.values()]
final = np.array(int_features)
data_unseen = pd.DataFrame([final], columns = cols)
prediction = predict_model(model, data=data_unseen, round = 0)
prediction = int(prediction.Label[0])
return render_template('home.html',pred='Expected Bill will be {}'.format(prediction))
@app.route('/predict_api',methods=['POST'])
def predict_api():
data = request.get_json(force=True)
data_unseen = pd.DataFrame([data])
prediction = predict_model(model, data=data_unseen)
output = prediction.Label[0]
return jsonify(output)
if __name__ == '__main__':
app.run(debug=True)
Container Docker
Se usi Windows dovrai installare Docker per Windows. Se usi Ubuntu, Docker è fornito di default e non serve installazione.
Il primo passo per containerizzare la tua applicazione è scrivere un Dockerfile nella stessa cartella/directory in cui risiede l'applicazione. Un Dockerfile è semplicemente un file con un insieme di istruzioni. Il Dockerfile per questo progetto è così:
FROM python:3.7
RUN pip install virtualenv
ENV VIRTUAL_ENV=/venv
RUN virtualenv venv -p python3
ENV PATH="VIRTUAL_ENV/bin:$PATH"
WORKDIR /app
ADD . /app
# install dependencies
RUN pip install -r requirements.txt
# expose port
EXPOSE 5000
# run application
CMD ["python", "app.py"]
Dockerfile è case-sensitive e deve trovarsi nella cartella del progetto insieme agli altri file. Un Dockerfile non ha estensione e può essere creato con qualsiasi editor. Noi abbiamo usato Visual Studio Code per crearlo.
Deployment sul cloud
Dopo aver configurato correttamente il Dockerfile, scriveremo alcuni comandi per creare un'immagine Docker da questo file, ma prima ci serve un servizio per ospitare quell'immagine. In questo esempio useremo Microsoft Azure per ospitare la nostra applicazione.
Azure Container Registry
Se non hai un account Microsoft Azure o non l'hai mai usato, puoi registrarti gratuitamente. Quando ti registri per la prima volta ottieni un credito gratuito per i primi 30 giorni. Puoi usare quel credito per creare e distribuire una web app su Azure. Dopo esserti registrato, segui questi passaggi:
- Accedi su https://portal.azure.com
- Clicca su Crea una risorsa
- Cerca Container Registry e clicca su Crea
- Seleziona Subscription, Resource group e Registry name (nel nostro caso: pycaret.azurecr.io è il nostro registry name)

Una volta creato un registry, il primo passo è creare un'immagine Docker usando la riga di comando. Vai nella cartella del progetto ed esegui il seguente comando:
docker build -t pycaret.azurecr.io/pycaret-insurance:latest .

- pycaret.azurecr.io è il nome del registry che ottieni quando crei una risorsa sul portale Azure
- pycaret-insurance è il nome dell'immagine e latest è il tag; possono essere ciò che preferisci
Eseguire un container dall'immagine Docker
Ora che l'immagine è stata creata, eseguiremo un container in locale e testeremo l'applicazione prima di inviarla su Azure Container Registry. Per eseguire il container in locale, esegui il seguente comando:
docker run -d -p 5000:5000 pycaret.azurecr.io/pycaret-insurance
Puoi vedere l'app in azione andando su localhost:5000 nel tuo browser. Dovrebbe aprirsi una web app.

Se vedi questo, significa che l'applicazione è ora in esecuzione sulla tua macchina locale e non resta che portarla sul cloud. Per il deployment su Azure, continua a leggere:
Autenticare le credenziali Azure
Un ultimo passaggio prima di poter caricare il container su ACR è autenticare le credenziali Azure sulla tua macchina locale. Esegui il seguente comando nella riga di comando:
docker login pycaret.azurecr.io
Ti verranno richiesti username e password. L'username è il nome del tuo registry (in questo esempio l'username è "pycaret"). Puoi trovare la password nelle access keys della risorsa Azure Container Registry che hai creato.

Push del container su Azure Container Registry
Ora che ti sei autenticato su ACR, puoi fare il push del container creato eseguendo il seguente comando:
docker push pycaret.azurecr.io/pycaret-insurance:latest
A seconda delle dimensioni del container, il comando di push può richiedere del tempo per trasferire il container sul cloud.
Web Application
Per creare una web app su Azure, segui questi passaggi:
- Accedi al portale Azure
- Clicca su Crea una risorsa
- Cerca Web App e clicca su Crea
- Collega l'immagine ACR alla tua applicazione


L'applicazione è ora in esecuzione su Azure Web Services.

Conclusione
L'MLOps aiuta a garantire che i modelli distribuiti siano ben mantenuti, performanti come previsto e privi di effetti negativi sul business. Questo ruolo è cruciale per proteggere l'azienda dai rischi dovuti al drift dei modelli nel tempo o a modelli distribuiti ma non mantenuti o non monitorati.
L'MLOps ha guidato la classifica dei lavori emergenti di LinkedIn, con una crescita di 9,8 volte in cinque anni.
Puoi dare un'occhiata allo Skill Track MLOps Fundamentals su DataCamp, che copre l'intero ciclo di vita di un'applicazione di machine learning, dal reperimento dei requisiti di business alla fase di design, sviluppo, deployment, operatività e manutenzione. Datacamp ha anche un ottimo corso Understanding Data Engineering. Iscriviti oggi per scoprire come i data engineer preparano il terreno che rende possibile la data science, senza bisogno di scrivere codice.

