Distribuire un modello personalizzato in un endpoint batch
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
globalvariabile per rendere disponibili tutti gli asset necessari per assegnare un punteggio ai nuovi dati, ad esempio il modello caricato. - Le dimensioni del
mini_batchsono 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.