Distribuire un modello personalizzato in un endpoint batch

Completato

Se si vuole distribuire un modello in un endpoint batch senza usare il formato del modello MLflow, è necessario creare lo script di assegnazione dei punteggi e l'ambiente.

Per distribuire un modello, è necessario aver già creato un endpoint. È quindi possibile distribuire il modello nell'endpoint.

Creare lo script di assegnazione dei punteggi

Lo script di assegnazione dei punteggi è un file che legge i nuovi dati, carica il modello ed esegue l'assegnazione dei punteggi.

Lo script di assegnazione dei punteggi deve includere due funzioni:

  • init(): chiamato una sola volta all'inizio del processo, quindi usare per qualsiasi preparazione costosa o comune, ad esempio il caricamento del modello.
  • run(): chiamato per ogni mini batch per eseguire l'assegnazione dei punteggi.

Il metodo run() deve restituire un dataframe pandas o una matrice/elenco.

Uno script di assegnazione dei punteggi può essere simile al seguente:

import os
import mlflow
import pandas as pd


def init():
    global model

    # get the path to the registered model file and load it
    model_path = os.path.join(os.environ["AZUREML_MODEL_DIR"], "model")
    model = mlflow.pyfunc.load(model_path)


def run(mini_batch):
    print(f"run method start: {__file__}, run({len(mini_batch)} files)")
    resultList = []

    for file_path in mini_batch:
        data = pd.read_csv(file_path)
        pred = model.predict(data)

        df = pd.DataFrame(pred, columns=["predictions"])
        df["file"] = os.path.basename(file_path)
        resultList.extend(df.values)

    return resultList

Esistono alcuni aspetti da notare dallo script di esempio:

  • AZUREML_MODEL_DIR è una variabile di ambiente che è possibile usare per individuare i file associati al modello.
  • Usare global variabile per rendere disponibili tutti gli asset necessari per assegnare un punteggio ai nuovi dati, ad esempio il modello caricato.
  • Le dimensioni del mini_batch sono definite nella configurazione della distribuzione. Se i file nel mini batch sono troppo grandi da elaborare, è necessario suddividere i file in file più piccoli.
  • Per impostazione predefinita, le stime verranno scritte in un unico file.

Suggerimento

Altre informazioni su come creare script di punteggio per distribuzioni batch.

Creare un ambiente

La distribuzione richiede un ambiente di esecuzione in cui eseguire lo script di assegnazione dei punteggi. Qualsiasi dipendenza richiesta dal codice deve essere inclusa nell'ambiente.

È possibile creare un ambiente con un'immagine Docker con dipendenze Conda o con un Dockerfile.

È anche necessario aggiungere la libreria azureml-core perché è necessaria per il funzionamento delle distribuzioni batch.

Per creare un ambiente usando un'immagine Docker di base, è possibile definire le dipendenze Conda in un file conda.yaml:

name: basic-env-cpu
channels:
  - conda-forge
dependencies:
  - python=3.8
  - pandas
  - pip
  - pip:
      - azureml-core
      - mlflow

Quindi, per creare l'ambiente, eseguire il codice seguente:

from azure.ai.ml.entities import Environment

env = Environment(
    image="mcr.microsoft.com/azureml/openmpi3.1.2-ubuntu18.04",
    conda_file="./src/conda-env.yml",
    name="deployment-environment",
    description="Environment created from a Docker image plus Conda environment.",
)
ml_client.environments.create_or_update(env)

Configurare e creare la distribuzione

Infine, è possibile configurare e creare la distribuzione con la classe BatchDeployment.

from azure.ai.ml.entities import BatchDeployment, BatchRetrySettings
from azure.ai.ml.constants import BatchDeploymentOutputAction

deployment = BatchDeployment(
    name="forecast-mlflow",
    description="A sales forecaster",
    endpoint_name=endpoint.name,
    model=model,
    compute="aml-cluster",
    code_path="./code",
    scoring_script="score.py",
    environment=env,
    instance_count=2,
    max_concurrency_per_instance=2,
    mini_batch_size=2,
    output_action=BatchDeploymentOutputAction.APPEND_ROW,
    output_file_name="predictions.csv",
    retry_settings=BatchRetrySettings(max_retries=3, timeout=300),
    logging_level="info",
)
ml_client.batch_deployments.begin_create_or_update(deployment)

Suggerimento

Esplorare la documentazione di riferimento per creare una distribuzione batch con Python SDK v2.