SI APPLICA A:
Estensione ML dell'interfaccia della riga di comando di Azure v2 (corrente)
Python SDK azure-ai-ml v2 (corrente)
Azure Machine Learning offre diversi modi per inviare processi di training di Machine Learning. In questo articolo si apprenderà come inviare processi usando i metodi seguenti:
- Estensione dell'interfaccia della riga di comando di Azure per l'apprendimento automatico: l'estensione
ml
, detta anche interfaccia della riga di comando v2.
- Python SDK v2 per Azure Machine Learning.
- API REST: API su cui si basano l'interfaccia della riga di comando e l'SDK.
Prerequisiti
Per usare le informazioni sull'SDK, installare SDK v2 per Python di Azure Machine Learning.
Per usare le informazioni sull'API REST, sono necessari gli elementi seguenti:
Un'entità servizio nell'area di lavoro. Le richieste amministrative REST usano l'autenticazione dell'entità servizio.
un token di autenticazione dell'entità servizio. Per recuperare questo token, seguire la procedura descritta in Recuperare un token di autenticazione dell'entità servizio.
L'utilità curl. Il programma curl è disponibile nel sottosistema Windows per Linux o in qualsiasi distribuzione UNIX.
Suggerimento
In PowerShell curl
è un alias per Invoke-WebRequest
e curl -d "key=val" -X POST uri
diventa Invoke-WebRequest -Body "key=val" -Method POST -Uri uri
.
Anche se è possibile chiamare l'API REST da PowerShell, gli esempi in questo articolo presuppongono l'uso di Bash.
Utilità jq per l'elaborazione JSON. Questa utilità viene usata per estrarre valori dai documenti JSON restituiti dalle chiamate API REST.
Clonare il repository di esempi
I frammenti di codice in questo articolo sono basati su esempi compresi nel repository GitHub degli esempi di Azure Machine Learning. Per clonare il repository nell'ambiente di sviluppo, usare il comando seguente:
git clone --depth 1 https://github.com/Azure/azureml-examples
Suggerimento
Usare --depth 1
per clonare solo il commit più recente nel repository, riducendo il tempo necessario per completare l'operazione.
Processo di esempio
Gli esempi in questo articolo usano il set di dati dei fiori iris per eseguire il training di un modello MLFlow.
Eseguire il training nel cloud
Quando si esegue il training nel cloud, è necessario connettersi all'area di lavoro di Azure Machine Learning e selezionare una risorsa di calcolo che verrà usata per eseguire il processo di training.
1. Connettersi all'area di lavoro
Suggerimento
Usare le schede seguenti per selezionare il metodo da usare per eseguire il training di un modello. Se si seleziona una scheda, tutte le schede di questo articolo verranno automaticamente visualizzate nella stessa scheda. È possibile selezionare un'altra scheda in qualsiasi momento.
Per connettersi all’area di lavoro, occorrono i parametri identificatore, ovvero una sottoscrizione, un gruppo di risorse e un nome dell’area di lavoro. Questi dettagli verranno usati in MLClient
dallo spazio dei nomi azure.ai.ml
per ottenere un handle per l'area di lavoro di Azure Machine Learning necessaria. Per eseguire l'autenticazione, usare l'autenticazione di Azure predefinita. Per altre informazioni su come configurare le credenziali e connettersi a un'area di lavoro, vedere questo esempio.
#import required libraries
from azure.ai.ml import MLClient
from azure.identity import DefaultAzureCredential
#Enter details of your Azure Machine Learning workspace
subscription_id = '<SUBSCRIPTION_ID>'
resource_group = '<RESOURCE_GROUP>'
workspace = '<AZUREML_WORKSPACE_NAME>'
#connect to the workspace
ml_client = MLClient(DefaultAzureCredential(), subscription_id, resource_group, workspace)
Quando si usa l'interfaccia della riga di comando di Azure, sono necessari i parametri di identificatore, ovvero una sottoscrizione, un gruppo di risorse e un nome dell'area di lavoro. Sebbene sia possibile specificare questi parametri per ogni comando, è anche possibile definire le impostazioni predefinite che verranno usate per tutti i comandi. Usare i comandi seguenti per impostare i valori predefiniti. Sostituire <subscription ID>
, <Azure Machine Learning workspace name>
e <resource group>
con i valori per la configurazione:
az account set --subscription <subscription ID>
az configure --defaults workspace=<Azure Machine Learning workspace name> group=<resource group>
Gli esempi di API REST in questo articolo usano i segnaposto $SUBSCRIPTION_ID
, $RESOURCE_GROUP
, $LOCATION
e $WORKSPACE
. Sostituire i segnaposto con i valori desiderati come segue:
-
$SUBSCRIPTION_ID
: ID sottoscrizione di Azure.
-
$RESOURCE_GROUP
: il gruppo di risorse di Azure che contiene l'area di lavoro.
-
$LOCATION
: l'area di Azure in cui si trova l'area di lavoro.
-
$WORKSPACE
: il nome dell'area di lavoro di Azure Machine Learning.
-
$COMPUTE_NAME
: il nome del cluster di elaborazione di Azure Machine Learning.
REST amministrativo richiede un token di autenticazione dell'entità servizio. È possibile recuperare un token con il seguente comando. Il token viene archiviato nella variabile di ambiente $TOKEN
:
TOKEN=$(az account get-access-token --query accessToken -o tsv)
Il provider di servizi usa l'argomento api-version
per garantire la compatibilità. L'argomento api-version
varia da servizio a servizio. Impostare la versione dell'API come variabile per adattarla a versioni future:
API_VERSION="2022-05-01"
Quando si esegue il training usando l'API REST, i dati e gli script di training devono essere caricati in un account di archiviazione a cui l'area di lavoro può accedere. L'esempio seguente ottiene le informazioni di archiviazione per l'area di lavoro e le salva in variabili in modo da poterle usare in un secondo momento:
# Get values for storage account
response=$(curl --location --request GET "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/datastores?api-version=$API_VERSION&isDefault=true" \
--header "Authorization: Bearer $TOKEN")
AZUREML_DEFAULT_DATASTORE=$(echo $response | jq -r '.value[0].name')
AZUREML_DEFAULT_CONTAINER=$(echo $response | jq -r '.value[0].properties.containerName')
export AZURE_STORAGE_ACCOUNT=$(echo $response | jq -r '.value[0].properties.accountName')
2. Creare una risorsa di calcolo per il training
Un cluster di elaborazione di Azure Machine Learning è una risorsa di calcolo completamente gestita che può essere usata per eseguire il processo di training. Negli esempi seguenti viene creato un cluster di calcolo denominato cpu-compute
.
from azure.ai.ml.entities import AmlCompute
# specify aml compute name.
cpu_compute_target = "cpu-cluster"
try:
ml_client.compute.get(cpu_compute_target)
except Exception:
print("Creating a new cpu compute target...")
compute = AmlCompute(
name=cpu_compute_target, size="STANDARD_D2_V2", min_instances=0, max_instances=4
)
ml_client.compute.begin_create_or_update(compute).result()
az ml compute create -n cpu-cluster --type amlcompute --min-instances 0 --max-instances 4
curl -X PUT \
"https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/computes/$COMPUTE_NAME?api-version=$API_VERSION" \
-H "Authorization:Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"location": "'$LOCATION'",
"properties": {
"computeType": "AmlCompute",
"properties": {
"vmSize": "Standard_D2_V2",
"vmPriority": "Dedicated",
"scaleSettings": {
"maxNodeCount": 4,
"minNodeCount": 0,
"nodeIdleTimeBeforeScaleDown": "PT30M"
}
}
}
}'
Suggerimento
Mentre viene restituita una risposta dopo alcuni secondi, ciò indica solo che la richiesta di creazione è stata accettata. Il completamento della creazione del cluster può richiedere alcuni minuti.
3. Inviare il processo di training
Per eseguire questo script, si userà un oggetto command
che esegue lo script Python main.py situato in ./sdk/python/jobs/single-step/lightgbm/iris/src/. Il comando verrà eseguito inviandolo come job
ad Azure Machine Learning.
from azure.ai.ml import command, Input
# define the command
command_job = command(
code="./src",
command="python main.py --iris-csv ${{inputs.iris_csv}} --learning-rate ${{inputs.learning_rate}} --boosting ${{inputs.boosting}}",
environment="AzureML-lightgbm-3.2-ubuntu18.04-py37-cpu@latest",
inputs={
"iris_csv": Input(
type="uri_file",
path="https://azuremlexamples.blob.core.windows.net/datasets/iris.csv",
),
"learning_rate": 0.9,
"boosting": "gbdt",
},
compute="cpu-cluster",
)
# submit the command
returned_job = ml_client.jobs.create_or_update(command_job)
# get a URL for the status of the job
returned_job.studio_url
Negli esempi precedenti sono stati configurati:
-
code
: percorso in cui si trova il codice per l’esecuzione del comando
-
command
: comando che deve essere eseguito
-
environment
: ambiente necessario per eseguire lo script del training. In questo esempio viene usato un ambiente curato o pronto fornito da Azure Machine Learning e denominato AzureML-lightgbm-3.2-ubuntu18.04-py37-cpu
. Viene usata la versione più recente di questo ambiente usando la direttiva @latest
. È anche possibile usare ambienti personalizzati specificando un'immagine Docker di base assieme a un yaml Conda.
-
inputs
: dizionario di input con coppie nome-valore per il comando. La chiave è un nome per l'input nel contesto del processo e il valore è il valore di input. Agli input viene fatto riferimento in command
usando l'espressione ${{inputs.<input_name>}}
. Per usare file o cartelle come input, è possibile usare la classe Input
. Per altre informazioni, vedere Espressioni SDK e dell'interfaccia della riga di comando v2.
Per altre informazioni, vedere la documentazione di riferimento.
Quando si invia il processo, viene restituito un URL allo stato del processo in studio di Azure Machine Learning. Usare l'interfaccia utente di Studio per visualizzare lo stato di avanzamento del processo. È anche possibile usare returned_job.status
per verificare lo stato corrente del processo.
Il comando az ml job create
usato in questo esempio richiede un file di definizione del processo YAML. Il contenuto del file usato in questo esempio è:
Nota
Per usare il calcolo serverless, eliminare compute: azureml:cpu-cluster"
in questo codice.
$schema: https://azuremlschemas.azureedge.net/latest/commandJob.schema.json
code: src
command: >-
python main.py
--iris-csv ${{inputs.iris_csv}}
inputs:
iris_csv:
type: uri_file
path: https://azuremlexamples.blob.core.windows.net/datasets/iris.csv
environment: azureml:AzureML-lightgbm-3.3@latest
compute: azureml:cpu-cluster
display_name: lightgbm-iris-example
experiment_name: lightgbm-iris-example
description: Train a LightGBM model on the Iris dataset.
Nell'esempio precedente, sono stati configurati:
-
code
: percorso in cui si trova il codice per l’esecuzione del comando
-
command
: comando che deve essere eseguito
-
inputs
: dizionario di input con coppie nome-valore per il comando. La chiave è un nome per l'input nel contesto del processo e il valore è il valore di input. Agli input viene fatto riferimento in command
usando l'espressione ${{inputs.<input_name>}}
. Per altre informazioni, vedere Espressioni SDK e dell'interfaccia della riga di comando v2.
-
environment
: ambiente necessario per eseguire lo script del training. In questo esempio viene usato un ambiente curato o pronto fornito da Azure Machine Learning e denominato AzureML-lightgbm-3.3
. Viene usata la versione più recente di questo ambiente usando la direttiva @latest
. È anche possibile usare ambienti personalizzati specificando un'immagine Docker di base assieme a un yaml Conda.
Per inviare il processo, usare il comando seguente. L'ID di esecuzione (nome) del processo di training viene archiviato nella variabile $run_id
:
run_id=$(az ml job create -f jobs/single-step/lightgbm/iris/job.yml --query name -o tsv)
È possibile usare l'ID esecuzione archiviato per restituire informazioni sul processo. Il parametro --web
apre l'interfaccia utente Web dello studio di Azure Machine Learning in cui è possibile esaminare i dettagli del processo:
az ml job show -n $run_id --web
Come parte dell'invio di processi, gli script di training e i dati devono essere caricati in un percorso di archiviazione nel cloud a cui l'area di lavoro di Azure Machine Learning può accedere.
Usare il comando seguente dell'interfaccia della riga di comando di Azure per caricare lo script di training. Il comando specifica la directory che contiene i file necessari per il training, non un singolo file. Se invece si vuole usare REST per caricare i dati, vedere il riferimento Put Blob:
az storage blob upload-batch -d $AZUREML_DEFAULT_CONTAINER/testjob -s cli/jobs/single-step/lightgbm/iris/src/ --account-name $AZURE_STORAGE_ACCOUNT
Creare un riferimento con controllo delle versioni ai dati di training. In questo esempio, i dati sono già presenti nel cloud e si trovano in https://azuremlexamples.blob.core.windows.net/datasets/iris.csv
. Per altre informazioni sul riferimento ai dati, vedere Dati in Azure Machine Learning:
DATA_VERSION=$RANDOM
curl --location --request PUT "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/data/iris-data/versions/$DATA_VERSION?api-version=$API_VERSION" \
--header "Authorization: Bearer $TOKEN" \
--header "Content-Type: application/json" \
--data-raw "{
\"properties\": {
\"description\": \"Iris dataset\",
\"dataType\": \"uri_file\",
\"dataUri\": \"https://azuremlexamples.blob.core.windows.net/datasets/iris.csv\"
}
}"
Registrare un riferimento con controllo delle versioni allo script di training da usare con un processo. In questo esempio, il percorso dello script sono l'account di archiviazione predefinito e il contenitore caricati nel passaggio 1. L'ID del codice di training con controllo delle versioni viene restituito e archiviato nella variabile $TRAIN_CODE
:
TRAIN_CODE=$(curl --location --request PUT "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/codes/train-lightgbm/versions/1?api-version=$API_VERSION" \
--header "Authorization: Bearer $TOKEN" \
--header "Content-Type: application/json" \
--data-raw "{
\"properties\": {
\"description\": \"Train code\",
\"codeUri\": \"https://$AZURE_STORAGE_ACCOUNT.blob.core.windows.net/$AZUREML_DEFAULT_CONTAINER/testjob\"
}
}" | jq -r '.id')
Creare l'ambiente che verrà usato dal cluster per eseguire lo script di training. In questo esempio viene usato un ambiente curato o pronto fornito da Azure Machine Learning e denominato AzureML-lightgbm-3.2-ubuntu18.04-py37-cpu
. Il comando seguente recupera un elenco delle versioni dell'ambiente, ordinate dalla più recente alla meno recente.
jq
viene usato per recuperare l'ID della versione più recente ([0]
), che viene quindi archiviata nella variabile $ENVIRONMENT
.
ENVIRONMENT=$(curl --location --request GET "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/environments/AzureML-lightgbm-3.2-ubuntu18.04-py37-cpu?api-version=$API_VERSION" --header "Authorization: Bearer $TOKEN" | jq -r .id)
Infine, inviare il processo. L'esempio seguente illustra come inviare il processo, fare riferimento all'ID del codice di training, all'ID ambiente, all'URL per i dati di input e all'ID del cluster di elaborazione. Il percorso di output del processo verrà archiviato nella variabile $JOB_OUTPUT
:
Suggerimento
Il nome del processo deve essere univoco. In questo esempio, viene usato uuidgen
per generare un valore univoco per il nome.
run_id=$(uuidgen)
curl --location --request PUT "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/jobs/$run_id?api-version=$API_VERSION" \
--header "Authorization: Bearer $TOKEN" \
--header "Content-Type: application/json" \
--data-raw "{
\"properties\": {
\"jobType\": \"Command\",
\"codeId\": \"$TRAIN_CODE\",
\"command\": \"python main.py --iris-csv \$AZURE_ML_INPUT_iris\",
\"environmentId\": \"$ENVIRONMENT\",
\"inputs\": {
\"iris\": {
\"jobInputType\": \"uri_file\",
\"uri\": \"https://azuremlexamples.blob.core.windows.net/datasets/iris.csv\"
}
},
\"experimentName\": \"lightgbm-iris\",
\"computeId\": \"/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/computes/$COMPUTE_NAME\"
}
}"
Registrare il modello sottoposto a training
Gli esempi seguenti illustrano come registrare un modello nell'area di lavoro di Azure Machine Learning.
Suggerimento
La proprietà name
restituita dal processo di training viene utilizzata come parte del percorso del modello.
from azure.ai.ml.entities import Model
from azure.ai.ml.constants import AssetTypes
run_model = Model(
path="azureml://jobs/{}/outputs/artifacts/paths/model/".format(returned_job.name),
name="run-model-example",
description="Model created from run.",
type=AssetTypes.MLFLOW_MODEL
)
ml_client.models.create_or_update(run_model)
Suggerimento
Il nome (archiviato nella variabile $run_id
) viene usato come parte del percorso del modello.
az ml model create -n sklearn-iris-example -v 1 -p runs:/$run_id/model --type mlflow_model
Suggerimento
Il nome (archiviato nella variabile $run_id
) viene usato come parte del percorso del modello.
curl --location --request PUT "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/models/sklearn/versions/1?api-version=$API_VERSION" \
--header "Authorization: Bearer $TOKEN" \
--header "Content-Type: application/json" \
--data-raw "{
\"properties\": {
\"modelType\": \"mlflow_model\",
\"modelUri\":\"runs:/$run_id/model\"
}
}"
Passaggi successivi
Dopo aver creato un modello sottoposto a training, vedere come distribuirlo usando un endpoint online.
Per altri esempi, vedere il repository GitHub degli esempi di Azure Machine Learning.
Per altre informazioni sui comandi dell'interfaccia della riga di comando di Azure, sulle classi Python SDK o sulle API REST usate in questo articolo, vedere la documentazione di riferimento seguente: