Tenere traccia degli esperimenti di Azure Databricks ML con MLflow e Azure Machine Learning

MLflow è una libreria open source per la gestione del ciclo di vita degli esperimenti di machine learning. È possibile usare MLflow per integrare Azure Databricks con Azure Machine Learning così da usare al meglio entrambi i prodotti.

Contenuto dell'articolo:

Prerequisiti

Notebook di esempio

In Training di modelli in Azure Databricks e distribuzione in Azure Machine Learning viene illustrato come eseguire il training di modelli in Azure Databricks e distribuirli in Azure Machine Learning. Viene spiegato inoltre come gestire i casi in cui si vuole anche tenere traccia degli esperimenti e dei modelli con l'istanza di MLflow in Azure Databricks e utilizzare Azure Machine Learning per la distribuzione.

Installare le librerie

Per installare le librerie nel cluster, passare alla scheda Librerie e selezionare Installa nuovo

mlflow with azure databricks

Nel campo Pacchetto digitare azureml-mlflow e quindi selezionare Installa. Ripetere questo passaggio, se necessario, per installare altri pacchetti aggiuntivi nel cluster per l'esperimento.

Azure DB install mlflow library

Tenere traccia delle esecuzioni di Azure Databricks con MLflow

È possibile configurare Azure Databricks per tenere traccia degli esperimenti con MLflow in due modi:

Per impostazione predefinita, viene configurato automaticamente il doppio rilevamento quando si collega l'area di lavoro di Azure Databricks.

Doppio rilevamento in Azure Databricks e Azure Machine Learning

Il collegamento dell'area di lavoro di Azure Databricks all'area di lavoro di Azure Machine Learning consente di tenere traccia dei dati degli esperimenti contemporaneamente nell'area di lavoro di Azure Machine Learning e in quella di Azure Databricks. In questo caso si parla di doppio rilevamento.

Avviso

Al momento, il doppio rilevamento non è supportato in Microsoft Azure gestito da 21Vianet. Configurare invece il rilevamento esclusivo con l'area di lavoro di Azure Machine Learning.

Per collegare l'area di lavoro di Azure Databricks a un'area di lavoro di Azure Machine Learning nuova o esistente:

  1. Accedi al portale di Azure.
  2. Passare alla pagina Panoramica dell'area di lavoro di Azure Databricks.
  3. Selezionare il pulsante Collega area di lavoro di Azure Machine Learning in basso a destra.

Link Azure DB and Azure Machine Learning workspaces

Dopo aver collegato l'area di lavoro di Azure Databricks all'area di lavoro di Azure Machine Learning, il rilevamento di MLflow viene impostato automaticamente per tutte le posizioni seguenti:

  • L'area di lavoro di Azure Machine Learning collegata.
  • L'area di lavoro di Azure Databricks originale.

È possibile usare MLflow in Azure Databricks nel modo consueto. L'esempio seguente imposta il nome dell'esperimento come avviene in genere in Azure Databricks e avvia la registrazione di alcuni parametri:

import mlflow 

experimentName = "/Users/{user_name}/{experiment_folder}/{experiment_name}" 
mlflow.set_experiment(experimentName) 

with mlflow.start_run():
   mlflow.log_param('epochs', 20)
   pass

Nota

Diversamente da quanto avviene con il rilevamento, i registri dei modelli non supportano la registrazione di modelli contemporaneamente in Azure Machine Learning e in Azure Databricks. È necessario scegliere una sola opzione. Per altre informazioni, leggere la sezione Registrazione di modelli nel registro con MLflow.

Rilevamento esclusivamente nell'area di lavoro di Azure Machine Learning

Se si preferisce gestire gli esperimenti in una posizione centralizzata, è possibile impostare il rilevamento di MLflow per tenere traccia esclusivamente nell'area di lavoro di Azure Machine Learning. Questa configurazione offre il vantaggio di abilitare un percorso più semplice per la distribuzione usando le opzioni di distribuzione di Azure Machine Learning.

È necessario configurare l'URI di rilevamento di MLflow in modo che punti esclusivamente ad Azure Machine Learning, come illustrato nell'esempio seguente:

Configurare l'URI di rilevamento

  1. Ottenere l'URI di rilevamento per l'area di lavoro:

    SI APPLICA A:Estensione ML dell'interfaccia della riga di comando di Azure v2 (corrente)

    1. Accedere e configurare l'area di lavoro:

      az account set --subscription <subscription>
      az configure --defaults workspace=<workspace> group=<resource-group> location=<location> 
      
    2. È possibile ottenere l'URI di rilevamento usando il comando az ml workspace:

      az ml workspace show --query mlflow_tracking_uri
      
  2. Configurazione dell'URI di rilevamento:

    Il metodo set_tracking_uri() quindi punta l'URI di rilevamento di MLflow a tale URI.

    import mlflow
    
    mlflow.set_tracking_uri(mlflow_tracking_uri)
    

    Suggerimento

    Quando si usano ambienti condivisi, ad esempio un cluster di Azure Databricks, un cluster di Azure Synapse Analytics o un cluster simile, è utile impostare la variabile di ambiente MLFLOW_TRACKING_URI a livello di cluster per configurare automaticamente l'URI di rilevamento di MLflow in modo che punti ad Azure Machine Learning per tutte le sessioni in esecuzione nel cluster anziché per ogni sessione.

    Configure the environment variables in an Azure Databricks cluster

    Dopo aver configurato la variabile di ambiente, il rilevamento di qualsiasi esperimento in esecuzione in tale cluster verrà eseguito in Azure Machine Learning.

Configurare l'autenticazione

Dopo aver configurato il rilevamento, è necessario configurare anche la modalità di esecuzione dell'autenticazione nell'area di lavoro associata. Per impostazione predefinita, il plug-in di Azure Machine Learning per MLflow eseguirà l'autenticazione interattiva aprendo il browser predefinito per richiedere le credenziali. Per informazioni su altre modalità per configurare l'autenticazione per MLflow nelle aree di lavoro di Azure Machine Learning, vedere Configurare MLflow per Azure Machine Learning: Configurare l'autenticazione.

Per i processi interattivi in cui è presente un utente connesso alla sessione, è possibile basarsi sull'autenticazione interattiva e quindi non è necessaria alcuna azione.

Avviso

L'autenticazione con Browser interattivo blocca l'esecuzione del codice quando vengono richieste le credenziali. Non è un'opzione adatta per l'autenticazione in ambienti automatici come i processi di training. È consigliabile configurare un'altra modalità di autenticazione.

Per gli scenari in cui è richiesta l'esecuzione automatica, è necessario configurare un'entità servizio per comunicare con Azure Machine Learning.

import os

os.environ["AZURE_TENANT_ID"] = "<AZURE_TENANT_ID>"
os.environ["AZURE_CLIENT_ID"] = "<AZURE_CLIENT_ID>"
os.environ["AZURE_CLIENT_SECRET"] = "<AZURE_CLIENT_SECRET>"

Suggerimento

Quando si lavora in ambienti condivisi, è consigliabile configurare queste variabili di ambiente nell'ambiente di calcolo. Come procedura consigliata, gestirle come segreti in un'istanza di Azure Key Vault quando possibile. Ad esempio, in Azure Databricks è possibile usare segreti nelle variabili di ambiente come indicato di seguito nella configurazione del cluster: AZURE_CLIENT_SECRET={{secrets/<scope-name>/<secret-name>}}. Vedere Fare riferimento a un segreto in una variabile di ambiente per informazioni su come eseguire questa operazione in Azure Databricks o fare riferimento a una documentazione simile nella piattaforma in uso.

Nomi degli esperimenti in Azure Machine Learning

Quando MLflow è configurato per tenere traccia esclusivamente degli esperimenti nell'area di lavoro di Azure Machine Learning, la convenzione di denominazione per gli esperimenti deve seguire quella usata da Azure Machine Learning. In Azure Databricks, gli esperimenti vengono denominati usando il percorso in cui l'esperimento viene salvato, ad esempio /Users/alice@contoso.com/iris-classifier. In Azure Machine Learning, tuttavia, è necessario specificare direttamente il nome dell'esperimento. Come nell'esempio precedente, la denominazione per lo stesso esperimento sarebbe direttamente iris-classifier:

mlflow.set_experiment(experiment_name="experiment-name")

Rilevamento di parametri, metriche e artefatti

È possibile usare MLflow in Azure Databricks nel modo consueto. Per informazioni dettagliate, vedere Registrare e visualizzare metriche e file di log.

Registrazione di modelli con MLflow

Dopo avere eseguito il training del modello, è possibile registrarlo nel server di rilevamento con il metodo mlflow.<model_flavor>.log_model(). <model_flavor> si riferisce al framework associato al modello. Leggere le informazioni sulle versioni di modelli supportate. Nell'esempio seguente viene registrato un modello creato con la libreria Spark MLLib:

mlflow.spark.log_model(model, artifact_path = "model")

È importante notare che la versione spark non corrisponde al fatto che si stia eseguendo il training di un modello in un cluster Spark, ma dipende dal framework di training usato (è possibile eseguire il training di un modello usando TensorFlow con Spark e in questo caso la versione da usare sarebbe tensorflow).

I modelli vengono registrati all'interno dell'esecuzione monitorata. Ciò significa che i modelli sono disponibili sia in Azure Databricks che in Azure Machine Learning (impostazione predefinita) oppure esclusivamente in Azure Machine Learning se è stato configurato l'URI di rilevamento in modo che punti a questa soluzione.

Importante

Si noti che in questo caso il parametro registered_model_name non è stato specificato. Leggere la sezione Registrazione di modelli nel registro con MLflow per altri dettagli sulle implicazioni di tale parametro e sul funzionamento del registro.

Registrazione di modelli nel registro con MLflow

Diversamente da quanto avviene con il rilevamento, i registri dei modelli non funzionano contemporaneamente in Azure Databricks e Azure Machine Learning. È necessario scegliere una sola opzione. Per impostazione predefinita, per i registri dei modelli viene usata l'area di lavoro di Azure Databricks; a meno che non si sia scelto di impostare il rilevamento di MLflow per tenere traccia esclusivamente nell'area di lavoro di Azure Machine Learning e in questo caso il registro dei modelli è l'area di lavoro di Azure Machine Learning.

Considerando quindi che si stia usando la configurazione predefinita, la riga seguente terrà traccia di un modello all'interno delle esecuzioni corrispondenti di Azure Databricks e Azure Machine Learning, ma lo registrerà solo in Azure Databricks:

mlflow.spark.log_model(model, artifact_path = "model", 
                       registered_model_name = 'model_name')  
  • Se non esiste un modello registrato con il nome specifico, il metodo registrerà un nuovo modello, creerà la versione 1 e restituirà un oggetto ModelVersion di MLflow.

  • Se esiste già un modello registrato con il nome specifico, il metodo creerà una nuova versione del modello e restituirà l'oggetto versione.

Uso del registro di Azure Machine Learning con MLflow

Se si vuole usare il registro dei modelli di Azure Machine Learning invece di Azure Databricks, è consigliabile impostare il rilevamento di MLflow per tenere traccia esclusivamente nell'area di lavoro di Azure Machine Learning. In questo modo si evita l'ambiguità della posizione in cui i modelli vengono registrati e diminuisce quindi la complessità.

Se tuttavia si desidera continuare a usare le funzionalità di doppio rilevamento ma registrare i modelli in Azure Machine Learning, è possibile indicare a MLflow di usare Azure Machine Learning per i registri dei modelli configurando l'URI del registro dei modelli di MLflow. Questo URI ha esattamente lo stesso formato e valore dell'URI di rilevamento di MLflow.

mlflow.set_registry_uri(azureml_mlflow_uri)

Nota

Il valore di azureml_mlflow_uri è stato ottenuto nel modo illustrato in Impostare il rilevamento di MLflow per tenere traccia esclusivamente nell'area di lavoro di Azure Machine Learning

Per un esempio completo di questo scenario, vedere l'esempio in Training di modelli in Azure Databricks e distribuzione in Azure Machine Learning.

Distribuzione e utilizzo di modelli registrati in Azure Machine Learning

I modelli registrati nel servizio Azure Machine Learning con MLflow possono essere utilizzati come:

  • Un endpoint di Azure Machine Learning (in tempo reale e batch): questa distribuzione consente di sfruttare le funzionalità di distribuzione di Azure Machine Learning sia per l'inferenza in tempo reale che batch in Istanze di Azure Container (ACI), nel servizio Azure Kubernetes o negli endpoint di inferenza gestiti.

  • Oggetti modello di MLflow o funzioni definite dall'utente Pandas, che è possibile usare nei notebook di Azure Databricks in pipeline di streaming o batch.

Distribuire modelli in endpoint di Azure Machine Learning

È possibile sfruttare il plug-in azureml-mlflow per distribuire un modello nell'area di lavoro di Azure Machine Learning. Per informazioni dettagliate su come distribuire i modelli nelle diverse destinazioni, vedere la pagina Come distribuire modelli di MLflow.

Importante

Affinché sia possibile distribuirli, i modelli devono essere registrati nel registro di Azure Machine Learning. Se i modelli vengono registrati nell'istanza di MLflow all'interno di Azure Databricks, sarà necessario registrarli di nuovo in Azure Machine Learning. In questo caso, vedere l'esempio in Training di modelli in Azure Databricks e distribuzione in Azure Machine Learning

Distribuire modelli in Azure Databricks per l'assegnazione dei punteggi in batch usando funzioni definite dall'utente

È possibile scegliere i cluster di Azure Databricks per l'assegnazione dei punteggi in batch. Utilizzando MLflow, è possibile risolvere qualsiasi modello dal registro a cui si è connessi. In genere si userà uno dei due metodi seguenti:

  • Se il modello è stato sottoposto a training e compilato con librerie Spark (ad esempio MLLib), usare mlflow.pyfunc.spark_udf per caricare un modello e usarlo come funzione definita dall'utente Pandas Spark per assegnare punteggi ai nuovi dati.
  • Se il modello non è stato sottoposto a training o compilato con librerie Spark, usare mlflow.pyfunc.load_model o mlflow.<flavor>.load_model per caricare il modello nel driver del cluster. Si noti che in questo modo qualsiasi distribuzione di lavoro o parallelizzazione che si vuole eseguire nel cluster dovrà essere orchestrata dall'utente. Si noti anche che MLflow non installa alcuna libreria necessaria per l'esecuzione del modello. Tali librerie devono essere installate nel cluster prima dell'esecuzione.

L'esempio seguente illustra come caricare un modello dal registro denominato uci-heart-classifier e usarlo come funzione definita dall'utente Pandas Spark per assegnare un punteggio ai nuovi dati.

from pyspark.sql.types import ArrayType, FloatType 

model_name = "uci-heart-classifier"
model_uri = "models:/"+model_name+"/latest"

#Create a Spark UDF for the MLFlow model 
pyfunc_udf = mlflow.pyfunc.spark_udf(spark, model_uri) 

Suggerimento

Per informazioni su altri modi per fare riferimento ai modelli dal registro, vedere Caricamento di modelli dal registro.

Una volta caricato il modello, è possibile usarlo per assegnare un punteggio ai nuovi dati:

#Load Scoring Data into Spark Dataframe 
scoreDf = spark.table({table_name}).where({required_conditions}) 

#Make Prediction 
preds = (scoreDf 
           .withColumn('target_column_name', pyfunc_udf('Input_column1', 'Input_column2', ' Input_column3', …)) 
        ) 

display(preds) 

Pulire le risorse

Se si desidera mantenere l'area di lavoro di Azure Databricks, ma l'area di lavoro di Azure Machine Learning non è più necessaria, è possibile eliminare quest'ultima. Questa azione comporta lo scollegamento dell'area di lavoro di Azure Databricks e dell'area di lavoro di Azure Machine Learning.

Se non si prevede di usare le metriche e gli artefatti registrati nell'area di lavoro, al momento non è possibile eliminarli singolarmente. Eliminare invece il gruppo di risorse che contiene l'account di archiviazione e l'area di lavoro, in modo che non vengano addebitati costi:

  1. Nel portale di Azure fare clic su Gruppi di risorse all'estrema sinistra.

    Delete in the Azure portal

  2. Nell'elenco selezionare il gruppo di risorse creato.

  3. Selezionare Elimina gruppo di risorse.

  4. Immettere il nome del gruppo di risorse. Quindi seleziona Elimina.

Passaggi successivi