Distribuire e assegnare punteggi a un modello di Machine Learning con endpoint online gestito usando Python SDK v2 (anteprima)

SI APPLICA A: Python SDK azure-ai-ml v2 (anteprima)

Importante

L'SDK v2 è attualmente disponibile in anteprima pubblica. La versione di anteprima viene messa a disposizione senza contratto di servizio e non è consigliata per i carichi di lavoro di produzione. Alcune funzionalità potrebbero non essere supportate o potrebbero presentare funzionalità limitate. Per altre informazioni, vedere Condizioni supplementari per l'utilizzo delle anteprime di Microsoft Azure.

Questo articolo illustra come distribuire il modello di Machine Learning nell'endpoint online gestito e ottenere stime. Si inizierà distribuendo un modello nel computer locale per eseguire il debug di eventuali errori e quindi verrà distribuito e testato in Azure.

Prerequisiti

  • Se non si ha una sottoscrizione di Azure, creare un account gratuito prima di iniziare. Provare la versione gratuita o a pagamento di Azure Machine Learning.
  • Azure Machine Learning SDK v2 per Python.
  • È necessario avere un gruppo di risorse di Azure e l'utente (o l'entità servizio usata) deve avere accesso collaboratore.
  • È necessario disporre di un'area di lavoro Azure Machine Learning.
  • Per eseguire la distribuzione in locale, è necessario installare il motore Docker nel computer locale. È consigliabile usare questa opzione, quindi è più semplice eseguire il debug dei problemi.

Clonare il repository degli esempi

Per eseguire gli esempi di training, clonare prima di tutto il repository degli esempi e passare alla sdk directory :

git clone --depth 1 https://github.com/Azure/azureml-examples
cd azureml-examples/sdk

Suggerimento

Usare --depth 1 per clonare solo il commit più recente nel repository, riducendo il tempo necessario per completare l'operazione.

Connessione all'area di lavoro di Azure Machine Learning

L'area di lavoro è la risorsa di primo livello per Azure Machine Learning, fornendo una posizione centralizzata per lavorare con tutti gli artefatti creati quando si usa Azure Machine Learning. In questa sezione ci si connetterà all'area di lavoro in cui verranno eseguite le attività di distribuzione.

  1. Importare le librerie necessarie:

    # import required libraries
    from azure.ai.ml import MLClient
    from azure.ai.ml.entities import (
        ManagedOnlineEndpoint,
        ManagedOnlineDeployment,
        Model,
        Environment,
        CodeConfiguration,
    )
    from azure.identity import DefaultAzureCredential
    
  2. Configurare i dettagli dell'area di lavoro e ottenere un handle per l'area di lavoro:

    Per connettersi a un'area di lavoro, sono necessari parametri di identificatore, ovvero una sottoscrizione, un gruppo di risorse e un nome dell'area di lavoro. Questi dettagli verranno usati in MLClient da azure.ai.ml per ottenere un handle per l'area di lavoro Azure Machine Learning richiesta. Questo esempio usa l'autenticazione predefinita di Azure.

    # enter details of your AzureML workspace
    subscription_id = "<SUBSCRIPTION_ID>"
    resource_group = "<RESOURCE_GROUP>"
    workspace = "<AZUREML_WORKSPACE_NAME>"
    
    # get a handle to the workspace
    ml_client = MLClient(
        DefaultAzureCredential(), subscription_id, resource_group, workspace
    )
    

Creare un endpoint locale e una distribuzione

Nota

Per eseguire la distribuzione in locale, è necessario installare il motore Docker . Il motore Docker deve essere in esecuzione. Il motore Docker viene in genere avviato all'avvio del computer. In caso contrario, è possibile risolvere i problemi del motore Docker.

  1. Creare un endpoint locale:

    L'obiettivo di una distribuzione di endpoint locale è convalidare ed eseguire il debug del codice e della configurazione prima di eseguire la distribuzione in Azure. La distribuzione locale presenta le limitazioni seguenti:

    • Gli endpoint locali non supportano regole di traffico, autenticazione o impostazioni probe.
    • Gli endpoint locali supportano una sola distribuzione per endpoint.
    # Creating a local endpoint
    import datetime
    
    local_endpoint_name = "local-" + datetime.datetime.now().strftime("%m%d%H%M%f")
    
    # create an online endpoint
    endpoint = ManagedOnlineEndpoint(
        name=local_endpoint_name, description="this is a sample local endpoint"
    )
    
    ml_client.online_endpoints.begin_create_or_update(endpoint, local=True)
    
  2. Creare una distribuzione locale:

    L'esempio contiene tutti i file necessari per distribuire un modello in un endpoint online. Per distribuire un modello, è necessario disporre di:

    • File del modello (o il nome e la versione di un modello già registrato nell'area di lavoro). Nell'esempio è presente un modello scikit-learn che esegue la regressione.
    • Codice necessario per assegnare un punteggio al modello. In questo caso, è disponibile un file di score.py.
    • Ambiente in cui viene eseguito il modello. Come si vedrà, l'ambiente potrebbe essere un'immagine Docker con dipendenze Conda o un Dockerfile.
    • Impostazioni per specificare il tipo di istanza e la capacità di ridimensionamento.

    Aspetti chiave della distribuzione

    • name - Nome della distribuzione.
    • endpoint_name - Nome dell'endpoint in cui creare la distribuzione.
    • model - Modello da usare per la distribuzione. Questo valore può essere un riferimento a un modello con controllo delle versioni esistente nell'area di lavoro o a una specifica del modello inline.
    • environment - Ambiente da usare per la distribuzione. Questo valore può essere un riferimento a un ambiente con controllo delle versioni esistente nell'area di lavoro o a una specifica dell'ambiente inline.
    • code_configuration : la configurazione per il codice sorgente e lo script di assegnazione dei punteggi
      • path- Percorso della directory del codice sorgente per l'assegnazione del punteggio al modello
      • scoring_script - Percorso relativo al file di assegnazione dei punteggi nella directory del codice sorgente
    • instance_type - Dimensioni della macchina virtuale da usare per la distribuzione. Per l'elenco delle dimensioni supportate, vedere Elenco di SKU degli endpoint online gestiti.
    • instance_count - Numero di istanze da usare per la distribuzione
    model = Model(path="../model-1/model/sklearn_regression_model.pkl")
    env = Environment(
        conda_file="../model-1/environment/conda.yml",
        image="mcr.microsoft.com/azureml/openmpi3.1.2-ubuntu18.04:20210727.v1",
    )
    
    blue_deployment = ManagedOnlineDeployment(
        name="blue",
        endpoint_name=local_endpoint_name,
        model=model,
        environment=env,
        code_configuration=CodeConfiguration(
            code="../model-1/onlinescoring", scoring_script="score.py"
        ),
        instance_type="Standard_F2s_v2",
        instance_count=1,
    )
    
    ml_client.online_deployments.begin_create_or_update(
        deployment=blue_deployment, local=True
    )
    

Verificare che la distribuzione locale sia riuscita

  1. Controllare lo stato per verificare se il modello è stato distribuito senza errori:

    ml_client.online_endpoints.get(name=local_endpoint_name, local=True)
    
  2. Ottenere i log:

    ml_client.online_deployments.get_logs(
        name="blue", endpoint_name=local_endpoint_name, local=True, lines=50
    )
    

Richiamare l'endpoint locale

Richiamare l'endpoint per assegnare un punteggio al modello usando il comando convenience invoke e il passaggio di parametri di query archiviati in un file JSON

ml_client.online_endpoints.invoke(
    endpoint_name=local_endpoint_name,
    request_file="../model-1/sample-request.json",
    local=True,
)

Distribuire l'endpoint online in Azure

Distribuire quindi l'endpoint online in Azure.

  1. Configurare l'endpoint online:

    Suggerimento

    • endpoint_name: nome dell'endpoint. Deve essere univoco nell'area di Azure. Per altre informazioni sulle regole di denominazione, vedere Limiti degli endpoint online gestiti.
    • auth_mode : usare key per l'autenticazione basata su chiave. Usare aml_token per l'autenticazione basata su token di Azure Machine Learning. Un key oggetto non scade, ma aml_token scade. Per altre informazioni sull'autenticazione, vedere Eseguire l'autenticazione a un endpoint online.
    • Facoltativamente, è possibile aggiungere descrizione, tag all'endpoint.
    # Creating a unique endpoint name with current datetime to avoid conflicts
    import datetime
    
    online_endpoint_name = "endpoint-" + datetime.datetime.now().strftime("%m%d%H%M%f")
    
    # create an online endpoint
    endpoint = ManagedOnlineEndpoint(
        name=online_endpoint_name,
        description="this is a sample online endpoint",
        auth_mode="key",
        tags={"foo": "bar"},
    )
    
  2. Creare l'endpoint:

    Usando l'elemento MLClient creato in precedenza, verrà creato l'endpoint nell'area di lavoro. Questo comando avvierà la creazione dell'endpoint e restituirà una risposta di conferma durante la creazione dell'endpoint.

    ml_client.begin_create_or_update(endpoint)
    
  3. Configurare la distribuzione online:

    Una distribuzione è un set di risorse necessarie per ospitare il modello che esegue l'inferenza effettiva. Verrà creata una distribuzione per l'endpoint usando la ManagedOnlineDeployment classe .

    model = Model(path="../model-1/model/sklearn_regression_model.pkl")
    env = Environment(
        conda_file="../model-1/environment/conda.yml",
        image="mcr.microsoft.com/azureml/openmpi3.1.2-ubuntu18.04:20210727.v1",
    )
    
    blue_deployment = ManagedOnlineDeployment(
        name="blue",
        endpoint_name=online_endpoint_name,
        model=model,
        environment=env,
        code_configuration=CodeConfiguration(
            code="../model-1/onlinescoring", scoring_script="score.py"
        ),
        instance_type="Standard_F2s_v2",
        instance_count=1,
    )
    
  4. Creare la distribuzione:

    Usando il MLClient creato in precedenza, verrà creata la distribuzione nell'area di lavoro. Questo comando avvia la creazione della distribuzione e restituisce una risposta di conferma durante la creazione della distribuzione.

    ml_client.begin_create_or_update(blue_deployment)
    
    # blue deployment takes 100 traffic
    endpoint.traffic = {"blue": 100}
    ml_client.begin_create_or_update(endpoint)
    

Testare l'endpoint con dati di esempio

Usando l'oggetto MLClient creato in precedenza, si otterrà un handle per l'endpoint. L'endpoint può essere richiamato usando il invoke comando con i parametri seguenti:

  • endpoint_name - Nome dell'endpoint
  • request_file - File con dati di richiesta
  • deployment_name - Nome della distribuzione specifica da testare in un endpoint

Verrà inviata una richiesta di esempio usando un file JSON .

# test the blue deployment with some sample data
ml_client.online_endpoints.invoke(
    endpoint_name=online_endpoint_name,
    deployment_name="blue",
    request_file="../model-1/sample-request.json",
)

Gestione di endpoint e distribuzioni

  1. Ottenere i dettagli dell'endpoint:

    # Get the details for online endpoint
    endpoint = ml_client.online_endpoints.get(name=online_endpoint_name)
    
    # existing traffic details
    print(endpoint.traffic)
    
    # Get the scoring URI
    print(endpoint.scoring_uri)
    
  2. Ottenere i log per la nuova distribuzione:

    Ottenere i log per la distribuzione verde e verificare in base alle esigenze

    ml_client.online_deployments.get_logs(
        name="blue", endpoint_name=online_endpoint_name, lines=50
    )
    

Eliminare l'endpoint

ml_client.online_endpoints.begin_delete(name=online_endpoint_name)

Passaggi successivi

Provare questi passaggi successivi per informazioni su come usare Azure Machine Learning SDK (v2) per Python: