Distribuire un modello in Azure Machine Learning

Completato

Come illustrato nell'unità precedente, è possibile distribuire un modello in diversi tipi di destinazioni di calcolo, tra cui calcolo locale, un'istanza di contenitore di Azure (ACI), un cluster del servizio Azure Kubernetes (AKS) o un modulo di Internet delle cose (IoT). Azure Machine Learning usa i contenitori come meccanismo di distribuzione, creando un pacchetto del modello e del codice per usarlo come immagine che può essere distribuita in un contenitore nella destinazione di calcolo scelta.

Per distribuire un modello come servizio Web di inferenza, è necessario eseguire le attività seguenti:

  1. Registrare un modello sottoposto a training.
  2. Definire una configurazione dell'inferenza.
  3. Definire una configurazione della distribuzione.
  4. Distribuire il modello.

1. Registrare un modello sottoposto a training

Dopo aver eseguito correttamente il training di un modello, occorre registrarlo nell'area di lavoro di Azure Machine Learning. Il servizio in tempo reale sarà quindi in grado di caricare il modello quando richiesto.

Per registrare un modello da un file locale, è possibile usare il metodo register dell'oggetto Model, come illustrato di seguito:

from azureml.core import Model

model = Model.register(workspace=ws, 
                       model_name='nyc-taxi-fare',
                       model_path='model.pkl', # local path
                       description='Model to predict taxi fares in NYC.')

2. Definire una configurazione dell'inferenza

Il modello verrà distribuito come un servizio costituito da:

  • Uno script per caricare il modello e restituire stime per i dati inviati.
  • Un ambiente in cui verrà eseguito lo script.

È pertanto necessario definire lo script e l'ambiente per il servizio.

Creazione di uno script di immissione

Creare lo script di immissione (detto anche script di assegnazione dei punteggi) per il servizio come file Python (con estensione py). Deve includere due funzioni:

  • init(): chiamata durante l'inizializzazione del servizio.
  • run(raw_data): chiamata quando vengono inviati nuovi dati al servizio.

In genere, si usa la funzione init per caricare il modello dal registro dei modelli e la funzione run per generare le stime dai dati di input. Lo script di esempio seguente mostra questo schema:

import json
import joblib
import numpy as np
from azureml.core.model import Model

# Called when the service is loaded
def init():
    global model
    # Get the path to the registered model file and load it
    model_path = Model.get_model_path('nyc-taxi-fare')
    model = joblib.load(model_path)

# Called when a request is received
def run(raw_data):
    # Get the input data as a numpy array
    data = np.array(json.loads(raw_data)['data'])
    # Get a prediction from the model
    predictions = model.predict(data)
    # Return the predictions as any JSON serializable format
    return predictions.tolist()

Creazione di un ambiente

Gli ambienti di Azure Machine Learning sono un incapsulamento dell'ambiente in cui si verifica il training di Machine Learning. Definiscono pacchetti Python, variabili di ambiente, impostazioni Docker e altri attributi in modo dichiarativo. Il frammento di codice seguente mostra un esempio di come è possibile creare un ambiente per la distribuzione:

from azureml.core import Environment
from azureml.core.environment import CondaDependencies

my_env_name="nyc-taxi-env"
myenv = Environment.get(workspace=ws, name='AzureML-Minimal').clone(my_env_name)
conda_dep = CondaDependencies()
conda_dep.add_pip_package("numpy==1.18.1")
conda_dep.add_pip_package("pandas==1.1.5")
conda_dep.add_pip_package("joblib==0.14.1")
conda_dep.add_pip_package("scikit-learn==0.24.1")
conda_dep.add_pip_package("sklearn-pandas==2.1.0")
myenv.python.conda_dependencies=conda_dep

Combinazione dello script e dell'ambiente in un InferenceConfig

Dopo avere creato lo script di immissione e l'ambiente, è possibile combinarli in un oggetto InferenceConfig per il servizio, come illustrato di seguito:

from azureml.core.model import InferenceConfig

from azureml.core.model import InferenceConfig
inference_config = InferenceConfig(entry_script='score.py', 
                                   source_directory='.', 
                                   environment=myenv)

3. Definire una configurazione della distribuzione

Ora che si dispone dello script di immissione e dell'ambiente, è necessario configurare la risorsa di calcolo in cui verrà distribuito il servizio. Se si intende eseguire la distribuzione in un cluster del servizio Azure Kubernetes, è necessario creare il cluster e una destinazione di calcolo prima di procedere con la distribuzione:

from azureml.core.compute import ComputeTarget, AksCompute

cluster_name = 'aks-cluster'
compute_config = AksCompute.provisioning_configuration(location='eastus')
production_cluster = ComputeTarget.create(ws, cluster_name, compute_config)
production_cluster.wait_for_completion(show_output=True)

Una volta creata la destinazione di calcolo, è possibile definire la configurazione della distribuzione, che imposta la specifica di calcolo specifica della destinazione per la distribuzione in contenitori:

from azureml.core.webservice import AksWebservice

deploy_config = AksWebservice.deploy_configuration(cpu_cores = 1,
                                                   memory_gb = 1)

Il codice per configurare una distribuzione ACI è simile, ad eccezione del fatto che non è necessario creare in modo esplicito una destinazione di calcolo ACI e occorre usare la classe deploy_configuration dello spazio dei nomi azureml.core.webservice.AciWebservice. Analogamente, è possibile usare lo spazio dei nomi azureml.core.webservice.LocalWebservice per configurare un servizio locale basato su Docker.

4. Distribuire il modello

Una volta preparata tutta la configurazione, è possibile distribuire il modello. Il modo più semplice per farlo consiste nel chiamare il metodo deploy della classe Model, come indicato di seguito:

from azureml.core.model import Model

service = Model.deploy(workspace=ws,
                       name = 'nyc-taxi-service',
                       models = [model],
                       inference_config = inference_config,
                       deployment_config = deploy_config,
                       deployment_target = production_cluster)
service.wait_for_deployment(show_output = True)

Per servizi locali o ACI è possibile omettere il parametro deployment_target (o impostarlo su None).

Nota

Altre informazioni: per altre informazioni sulla distribuzione di modelli con Azure Machine Learning, vedere Distribuire modelli con Azure Machine Learning nella documentazione.