Training dei modelli in un ambiente di elaborazione serverless

SI APPLICA A:Estensione ML dell'interfaccia della riga di comando di Azure v2 (corrente)Python SDK azure-ai-ml v2 (corrente)

Non è più necessario creare e gestire l'ambiente di calcolo per eseguire il training dei modelli in modo scalabile. Il processo può invece essere inviato a un nuovo tipo di destinazione di calcolo, denominato ambiente di elaborazione serverless. L'ambiente di elaborazione serverless rappresenta il modo più semplice per eseguire il training di processi in Azure Machine Learning. Quello dell'elaborazione serverless è un ambiente di calcolo su richiesta completamente gestito. Azure Machine Learning crea, ridimensiona e gestisce automaticamente l'ambiente di calcolo. Grazie al training dei modelli con l'ambiente di elaborazione serverless, i professionisti di Machine Learning possono concentrarsi sulla creazione di modelli di Machine Learning e non devono essere istruiti sull'infrastruttura di calcolo o configurarla.

I professionisti di Machine Learning possono specificare le risorse necessarie per il processo. Azure Machine Learning gestisce l'infrastruttura di calcolo e fornisce l'isolamento network gestito riducendo il carico necessario.

Le aziende possono anche ridurre i costi specificando risorse ottimali per ogni processo. Gli amministratori IT possono comunque applicare il controllo specificando la quota dei core a livello di sottoscrizione e di area di lavoro e applicare i criteri di Azure.

È possibile usare l'ambiente di elaborazione serverless per ottimizzare i modelli nel catalogo modelli, ad esempio LLAMA 2. È possibile usare l'ambiente di elaborazione serverless per eseguire tutti i tipi di processi da Azure Machine Learning Studio, SDK e interfaccia della riga di comando. È possibile usare l'ambiente di elaborazione serverless anche per la creazione delle immagini di ambiente e per scenari di dashboard di intelligenza artificiale responsabile. I processi serverless usano la stessa quota della quota di calcolo di Azure Machine Learning. È possibile scegliere macchine virtuali di livello standard (dedicate) o spot (con priorità bassa). Nei processi serverless sono supportate sia l'identità gestita che l'identità utente. Il modello di fatturazione è uguale a quello dell'ambiente di calcolo di Azure Machine Learning.

Vantaggi dell'elaborazione serverless

  • Azure Machine Learning gestisce la creazione, la configurazione, il ridimensionamento, l'eliminazione, e l'applicazione di patch per l'infrastruttura di calcolo riducendo il sovraccarico di gestione.
  • Non è necessario conoscere l'ambiente di calcolo, i vari tipi di calcolo e le proprietà correlate.
  • Non è necessario creare ripetutamente cluster per ogni dimensione di macchina virtuale necessaria, in quanto è possibile usare le stesse impostazioni e replicarle per ogni area di lavoro.
  • È possibile ottimizzare i costi specificando le risorse esatte necessarie per ogni processo in fase di esecuzione in termini di tipo di istanza (dimensioni della macchina virtuale) e numero di istanze. È possibile monitorare le metriche di utilizzo del processo per ottimizzare le risorse necessarie.
  • È richiesto un minor numero di passaggi per eseguire un processo.
  • Per semplificare ulteriormente l'invio di processi, è possibile ignorare completamente le risorse. Azure Machine Learning usa il numero di istanze predefinito e sceglie un tipo di istanza (dimensioni della macchina virtuale) in base a fattori quali quota, costo, prestazioni e dimensioni del disco.
  • I tempi di attesa prima dell'avvio dell'esecuzione dei processi sono inferiori in alcuni casi.
  • L'identità utente e l'identità gestita assegnata dall'utente dell'area di lavoro è supportata per l'invio del processo.
  • Con l'isolamento network gestito è possibile semplificare e automatizzare la configurazione dell'isolamento rete. È supportata anche la rete virtuale del cliente.
  • L'amministratore può esercitare il controllo tramite quota e criteri di Azure.

Come usare l'ambiente di elaborazione serverless

  • È possibile ottimizzare i modelli di base come LLAMA 2 usando i notebook come illustrato di seguito:

  • Quando si crea un cluster di elaborazione personalizzato, il nome del cluster viene usato nel processo di comando, ad esempio compute="cpu-cluster". Con l'ambiente serverless è possibile ignorare la creazione di un cluster di elaborazione e omettere il parametro compute, usando invece l'ambiente di elaborazione serverless. Quando non si specifica compute per un processo, questo viene eseguito nell'ambiente di elaborazione serverless. Omettere il nome di calcolo nei processi dell'interfaccia della riga di comando o dell'SDK per usare l'ambiente di elaborazione serverless nei tipi di processo seguenti e, facoltativamente, fornire le risorse necessarie per un processo in termini di numero e tipo di istanze:

    • Processi di comando, inclusi processi interattivi e training distribuito
    • Processi AutoML
    • Processi di sweeping
    • Processi in parallelo
  • Per i processi della pipeline tramite l'interfaccia della riga di comando usare default_compute: azureml:serverless per l'ambiente di calcolo predefinito a livello di pipeline. Per processi della pipeline con SDK usare default_compute="serverless". Vedere Processo della pipeline per un esempio.

  • Quando si invia un processo di training nello studio (anteprima), selezionare Serverless come tipo di ambiente di calcolo.

  • Quando si usa la finestra di progettazione di Azure Machine Learning, selezionare Serverless come ambiente di calcolo predefinito.

  • È possibile usare l'ambiente di elaborazione serverless per il dashboard di intelligenza artificiale responsabile:

Considerazioni sulle prestazioni

L'elaborazione serverless consente di velocizzare il training nei modi seguenti:

Quota insufficiente: quando si crea un cluster di elaborazione personalizzato, si è responsabili della definizione delle dimensioni della macchina virtuale e del numero di nodi da creare. Quando il processo viene eseguito, se la quota non è sufficiente per il cluster, il processo non riesce. L'ambiente di elaborazione serverless usa le informazioni sulla quota per selezionare le dimensioni della macchina virtuale appropriate per impostazione predefinita.

Ottimizzazione in fase di riduzione: quando un cluster di elaborazione è in fase di riduzione, un nuovo processo deve attendere la riduzione del numero di istanze prima di poterle aumentare di nuovo per essere eseguito. Con l'ambiente di calcolo serverless non è necessario attendere la riduzione e il processo può essere eseguito in un altro cluster/nodo (purché sia disponibile quota sufficiente).

Ottimizzazione in caso di cluster occupato: quando un processo è in esecuzione in un cluster di elaborazione e viene inviato un altro processo, il processo viene accodato dopo quello attualmente in esecuzione. Con l'ambiente di calcolo serverless si ottiene un altro nodo/cluster per avviare l'esecuzione del processo (purché sia disponibile quota sufficiente).

Obiettivo di vendita

Quando si invia il processo, per procedere è comunque necessaria una quota di calcolo di Azure Machine Learning sufficiente (sia quota a livello di area di lavoro che a livello di sottoscrizione). Le dimensioni predefinite delle macchine virtuali per i processi serverless sono selezionate in base a questa quota. Se si specificano valori personalizzati per dimensioni/famiglia delle macchine virtuali:

  • Se si ha una certa quota per dimensioni/famiglia delle macchine virtuali, che però non è sufficiente per il numero di istanze, viene visualizzato un errore. Nel messaggio di errore si consiglia di ridurre il numero di istanze a un numero valido in base al limite di quota o di richiedere un aumento della quota per la famiglia di macchine virtuali oppure di modificare le dimensioni delle macchina virtuali.
  • Se non si ha quota sufficiente per le dimensioni specificate delle macchine virtuali, viene visualizzato un errore. Nel messaggio di errore si consiglia di selezionare dimensioni diverse per le macchine virtuali per le quali non si ha quota sufficiente o di richiedere quota per questa famiglia di macchine virtuali.
  • Se si ha quota sufficiente per consentire alla famiglia di macchine virtuali di eseguire il processo serverless, ma altri processi usano la quota, viene visualizzato un messaggio che indica che il processo deve attendere in coda fino a quando non ci sarà quota disponibile.

Quando si visualizza i dati relativi a utilizzo e quota nel portale di Azure, è possibile osservare il nome "Serverless" per vedere tutte le quote usate dai processi serverless.

Supporto delle identità e pass-through delle credenziali

  • Pass-through delle credenziali utente: l'ambiente di elaborazione serverless supporta completamente il pass-through delle credenziali utente. Per l'accesso allo spazio di archiviazione viene usato il token utente dell'utente che invia il processo. Queste credenziali provengono da Microsoft Entra ID.

    from azure.ai.ml import command
    from azure.ai.ml import MLClient     # Handle to the workspace
    from azure.identity import DefaultAzureCredential     # Authentication package
    from azure.ai.ml.entities import ResourceConfiguration
    from azure.ai.ml.entities import UserIdentityConfiguration 
    
    credential = DefaultAzureCredential()
    # Get a handle to the workspace. You can find the info on the workspace tab on ml.azure.com
    ml_client = MLClient(
        credential=credential,
        subscription_id="<Azure subscription id>", 
        resource_group_name="<Azure resource group>",
        workspace_name="<Azure Machine Learning Workspace>",
    )
    job = command(
        command="echo 'hello world'",
        environment="AzureML-sklearn-1.0-ubuntu20.04-py38-cpu@latest",
            identity=UserIdentityConfiguration(),
    )
    # submit the command job
    ml_client.create_or_update(job)
    
  • Identità gestita assegnata dall'utente : quando si ha un'area di lavoro configurata con l'identità gestita assegnata dall'utente, è possibile usare tale identità con il processo serverless per l'accesso allo spazio di archiviazione.

    from azure.ai.ml import command
    from azure.ai.ml import MLClient     # Handle to the workspace
    from azure.identity import DefaultAzureCredential    # Authentication package
    from azure.ai.ml.entities import ResourceConfiguration
    from azure.ai.ml.entities import ManagedIdentityConfiguration
    
    credential = DefaultAzureCredential()
    # Get a handle to the workspace. You can find the info on the workspace tab on ml.azure.com
    ml_client = MLClient(
        credential=credential,
        subscription_id="<Azure subscription id>", 
        resource_group_name="<Azure resource group>",
        workspace_name="<Azure Machine Learning Workspace>",
    )
    job = command(
        command="echo 'hello world'",
        environment="AzureML-sklearn-1.0-ubuntu20.04-py38-cpu@latest",
            identity= ManagedIdentityConfiguration(),
    )
    # submit the command job
    ml_client.create_or_update(job)
    
    

Per informazioni su come collegare l'identità gestita assegnata dall'utente, vedere Collegare un'identità gestita assegnata dall'utente.

Configurare le proprietà per processi di comando

Se non viene specificata alcuna destinazione di calcolo per i processi di comando, sweeping e AutoML, per impostazione predefinita l'ambiente di calcolo diventa un ambiente di elaborazione serverless. Ad esempio, per questo processo di comando:

from azure.ai.ml import command
from azure.ai.ml import command 
from azure.ai.ml import MLClient # Handle to the workspace
from azure.identity import DefaultAzureCredential # Authentication package

credential = DefaultAzureCredential()
# Get a handle to the workspace. You can find the info on the workspace tab on ml.azure.com
ml_client = MLClient(
    credential=credential,
    subscription_id="<Azure subscription id>", 
    resource_group_name="<Azure resource group>",
    workspace_name="<Azure Machine Learning Workspace>",
)
job = command(
    command="echo 'hello world'",
    environment="AzureML-sklearn-1.0-ubuntu20.04-py38-cpu@latest",
)
# submit the command job
ml_client.create_or_update(job)

Per impostazione predefinita l'ambiente di calcolo diventa un ambiente di elaborazione serverless con:

  • Nodo singolo per questo processo. Il numero predefinito di nodi è basato sul tipo di processo. Vedere le sezioni seguenti per altri tipi di processo.
  • Macchina virtuale CPU, determinata in base a quota, prestazioni, costi e dimensioni del disco.
  • Macchine virtuali dedicate
  • Località dell'area di lavoro

È possibile eseguire l'override di queste impostazioni predefinite. Se si vuole specificare il tipo di macchina virtuale o il numero di nodi per l'ambiente di elaborazione serverless, aggiungere resources al processo:

  • instance_type per scegliere una macchina virtuale specifica. Usare questo parametro se si vuole indicare una specifica dimensione della macchina virtuale CPU/GPU.

  • instance_count per specificare il numero di nodi.

    from azure.ai.ml import command 
    from azure.ai.ml import MLClient # Handle to the workspace
    from azure.identity import DefaultAzureCredential # Authentication package
    from azure.ai.ml.entities import JobResourceConfiguration 
    
    credential = DefaultAzureCredential()
    # Get a handle to the workspace. You can find the info on the workspace tab on ml.azure.com
    ml_client = MLClient(
        credential=credential,
        subscription_id="<Azure subscription id>", 
        resource_group_name="<Azure resource group>",
        workspace_name="<Azure Machine Learning Workspace>",
    )
    job = command(
        command="echo 'hello world'",
        environment="AzureML-sklearn-1.0-ubuntu20.04-py38-cpu@latest",
        resources = JobResourceConfiguration(instance_type="Standard_NC24", instance_count=4)
    )
    # submit the command job
    ml_client.create_or_update(job)
    
  • Per cambiare il livello di processo, usare queue_settings per scegliere tra macchine virtuali dedicate (job_tier: Standard) e con priorità bassa (jobtier: Spot).

    from azure.ai.ml import command
    from azure.ai.ml import MLClient    # Handle to the workspace
    from azure.identity import DefaultAzureCredential    # Authentication package
    credential = DefaultAzureCredential()
    # Get a handle to the workspace. You can find the info on the workspace tab on ml.azure.com
    ml_client = MLClient(
        credential=credential,
        subscription_id="<Azure subscription id>", 
        resource_group_name="<Azure resource group>",
        workspace_name="<Azure Machine Learning Workspace>",
    )
    job = command(
        command="echo 'hello world'",
        environment="AzureML-sklearn-1.0-ubuntu20.04-py38-cpu@latest",
        queue_settings={
          "job_tier": "spot"  
        }
    )
    # submit the command job
    ml_client.create_or_update(job)
    

Esempio per tutti i cambi con processi di comando

Ecco un esempio di tutti i campi specificati, inclusa l'identità da usare nel processo. Non è necessario specificare le impostazioni di rete virtuale dal momento che l'isolamento network gestito a livello di area di lavoro viene usato automaticamente.

from azure.ai.ml import command
from azure.ai.ml import MLClient      # Handle to the workspace
from azure.identity import DefaultAzureCredential     # Authentication package
from azure.ai.ml.entities import ResourceConfiguration
from azure.ai.ml.entities import UserIdentityConfiguration 

credential = DefaultAzureCredential()
# Get a handle to the workspace. You can find the info on the workspace tab on ml.azure.com
ml_client = MLClient(
    credential=credential,
    subscription_id="<Azure subscription id>", 
    resource_group_name="<Azure resource group>",
    workspace_name="<Azure Machine Learning Workspace>",
)
job = command(
    command="echo 'hello world'",
    environment="AzureML-sklearn-1.0-ubuntu20.04-py38-cpu@latest",
         identity=UserIdentityConfiguration(),
    queue_settings={
      "job_tier": "Standard"  
    }
)
job.resources = ResourceConfiguration(instance_type="Standard_E4s_v3", instance_count=1)
# submit the command job
ml_client.create_or_update(job)

Per altri esempi di training con ambiente di elaborazione serverless, vedere:

Processo AutoML

Non è necessario specificare l'ambiente di calcolo per i processi AutoML. Facoltativamente, è possibile specificare le risorse. Se il numero di istanze non viene specificato, per impostazione predefinita viene impostato in base ai parametri max_concurrent_trials e max_nodes. Se si invia una classificazione immagini AutoML o un'attività NLP senza tipo di istanza, le dimensioni delle macchine virtuali GPU vengono selezionate automaticamente. È possibile inviare un processo AutoML tramite interfacce della riga di comando, SDK o lo studio. Per inviare processi AutoML con ambiente di elaborazione serverless nello studio, abilitare la funzionalità per inviare un processo di training nello studio (anteprima) nel pannello di anteprima.

Per specificare il tipo o il numero di istanze, usare la classe ResourceConfiguration.

# Create the AutoML classification job with the related factory-function.
from azure.ai.ml.entities import ResourceConfiguration 

classification_job = automl.classification(
    experiment_name=exp_name,
    training_data=my_training_data_input,
    target_column_name="y",
    primary_metric="accuracy",
    n_cross_validations=5,
    enable_model_explainability=True,
    tags={"my_custom_tag": "My custom value"},
)

# Limits are all optional
classification_job.set_limits(
    timeout_minutes=600,
    trial_timeout_minutes=20,
    max_trials=max_trials,
    # max_concurrent_trials = 4,
    # max_cores_per_trial: -1,
    enable_early_termination=True,
)

# Training properties are optional
classification_job.set_training(
    blocked_training_algorithms=[ClassificationModels.LOGISTIC_REGRESSION],
    enable_onnx_compatible_models=True,
)

# Serverless compute resources used to run the job
classification_job.resources = 
ResourceConfiguration(instance_type="Standard_E4s_v3", instance_count=6)

Processo della pipeline

Per un processo della pipeline, specificare "serverless" come tipo di calcolo predefinito per usare l'ambiente di elaborazione serverless.

# Construct pipeline
@pipeline()
def pipeline_with_components_from_yaml(
    training_input,
    test_input,
    training_max_epochs=20,
    training_learning_rate=1.8,
    learning_rate_schedule="time-based",
):
    """E2E dummy train-score-eval pipeline with components defined via yaml."""
    # Call component obj as function: apply given inputs & parameters to create a node in pipeline
    train_with_sample_data = train_model(
        training_data=training_input,
        max_epochs=training_max_epochs,
        learning_rate=training_learning_rate,
        learning_rate_schedule=learning_rate_schedule,
    )

    score_with_sample_data = score_data(
        model_input=train_with_sample_data.outputs.model_output, test_data=test_input
    )
    score_with_sample_data.outputs.score_output.mode = "upload"

    eval_with_sample_data = eval_model(
        scoring_result=score_with_sample_data.outputs.score_output
    )

    # Return: pipeline outputs
    return {
        "trained_model": train_with_sample_data.outputs.model_output,
        "scored_data": score_with_sample_data.outputs.score_output,
        "evaluation_report": eval_with_sample_data.outputs.eval_output,
    }


pipeline_job = pipeline_with_components_from_yaml(
    training_input=Input(type="uri_folder", path=parent_dir + "/data/"),
    test_input=Input(type="uri_folder", path=parent_dir + "/data/"),
    training_max_epochs=20,
    training_learning_rate=1.8,
    learning_rate_schedule="time-based",
)

# set pipeline to use serverless compute
pipeline_job.settings.default_compute = "serverless"

È anche possibile impostare l'ambiente di elaborazione serverless come ambiente di calcolo predefinito nella finestra di progettazione.

Passaggi successivi

Per altri esempi di training con ambiente di elaborazione serverless, vedere: