VAN TOEPASSING OP:
Azure CLI ml extension v2 (current)
Python SDK azure-ai-ml v2 (current)
Azure Machine Learning biedt meerdere manieren om ML-trainingstaken in te dienen. In dit artikel leert u hoe u taken verzendt met behulp van de volgende methoden:
- Azure CLI-extensie voor machine learning: de
ml extensie, ook wel CLI v2 genoemd.
- Python SDK v2 voor Azure Machine Learning.
- REST API: de API waarop de CLI en SDK zijn gebouwd.
Vereisten
Als u de REST API-gegevens wilt gebruiken, hebt u het volgende nodig:
Een service-principal in uw werkruimte. Gebruik service-principalverificatie voor beheer-REST-aanvragen.
Een verificatietoken voor de service-principal. Volg de stappen in Een authenticatietoken voor de service-principal ophalen om dit token op te halen.
Het krulhulpprogramma . Het curl-programma is beschikbaar in de Windows-subsysteem voor Linux of een UNIX-distributie.
Aanbeveling
In PowerShell curl is dit een alias voor Invoke-WebRequest. De opdracht curl -d "key=val" -X POST uri wordt Invoke-WebRequest -Body "key=val" -Method POST -Uri uri.
Hoewel het mogelijk is om de REST API aan te roepen vanuit PowerShell, gaan de voorbeelden in dit artikel ervan uit dat u Bash gebruikt.
Het hulpprogramma jq voor het verwerken van JSON. Gebruik dit hulpprogramma om waarden te extraheren uit de JSON-documenten die REST API-aanroepen retourneren.
De opslagplaats met voorbeelden klonen
De codefragmenten in dit artikel zijn gebaseerd op voorbeelden in de GitHub-opslagplaats voor Azure Machine Learning-voorbeelden. Gebruik de volgende opdracht om de opslagplaats naar uw ontwikkelomgeving te klonen:
git clone --depth 1 https://github.com/Azure/azureml-examples
Aanbeveling
Gebruik --depth 1 om alleen de meest recente commit naar de repository te klonen, wat de tijd voor het voltooien van de operatie vermindert.
Voorbeeldtaak
In de voorbeelden in dit artikel wordt de irisbloemgegevensset gebruikt om een MLFlow-model te trainen.
Trainen in de cloud
Wanneer u in de cloud traint, moet u verbinding maken met uw Azure Machine Learning-werkruimte en een rekenresource selecteren om de trainingstaak uit te voeren.
1. Verbinding maken met de werkruimte
Aanbeveling
Gebruik de volgende tabbladen om de methode te selecteren die u wilt gebruiken om een model te trainen. Als u een tabblad selecteert, worden alle tabbladen in dit artikel automatisch naar hetzelfde tabblad overgeschakeld. U kunt op elk gewenst moment een ander tabblad selecteren.
Als u verbinding wilt maken met de werkruimte, hebt u id-parameters nodig: een abonnement, resourcegroep en werkruimtenaam. Gebruik deze gegevens in de MLClientazure.ai.ml naamruimte om een ingang te krijgen naar de vereiste Azure Machine Learning-werkruimte. Gebruik de standaardverificatie van Azure om te verifiëren. Voor meer informatie over het configureren van referenties en het maken van verbinding met een werkruimte, zie dit voorbeeld.
#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)
Wanneer u de Azure CLI gebruikt, hebt u id-parameters nodig: een abonnement, resourcegroep en werkruimtenaam. Hoewel u deze parameters voor elke opdracht kunt opgeven, kunt u ook de standaardwaarden instellen die alle opdrachten gebruiken. Gebruik de volgende opdrachten om standaardwaarden in te stellen. Vervang , <subscription ID>en <Azure Machine Learning workspace name> door <resource group>de waarden voor uw configuratie:
az account set --subscription <subscription ID>
az configure --defaults workspace=<Azure Machine Learning workspace name> group=<resource group>
De REST API-voorbeelden in dit artikel gebruiken$SUBSCRIPTION_ID, $RESOURCE_GROUPen $LOCATION$WORKSPACE tijdelijke aanduidingen. Vervang de tijdelijke aanduidingen als volgt door uw eigen waarden:
-
$SUBSCRIPTION_ID: uw Azure-abonnements-id.
-
$RESOURCE_GROUP: De Azure-resourcegroep die uw werkruimte bevat.
-
$LOCATION: De Azure-regio waar uw werkruimte zich bevindt.
-
$WORKSPACE: de naam van uw Azure Machine Learning-werkruimte.
-
$COMPUTE_NAME: De naam van uw Azure Machine Learning-rekencluster.
Beheer-REST vraagt een verificatietoken voor de service-principal aan. U kunt een token ophalen met de volgende opdracht. Het token wordt opgeslagen in de $TOKEN omgevingsvariabele:
TOKEN=$(az account get-access-token --query accessToken -o tsv)
De serviceprovider gebruikt het api-version argument om compatibiliteit te garanderen. Het api-version argument varieert van service tot service. Stel de API-versie in als een variabele voor toekomstige versies:
API_VERSION="2022-05-01"
Wanneer u traint met behulp van de REST API, moet u gegevens en trainingsscripts uploaden naar een opslagaccount waartoe de werkruimte toegang heeft. In het volgende voorbeeld worden de opslaggegevens voor uw werkruimte opgehaald en opgeslagen in variabelen, zodat u deze later kunt gebruiken:
# 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. Een rekenresource maken voor training
Een Azure Machine Learning-rekencluster is een volledig beheerde rekenresource die u kunt gebruiken om de trainingstaak uit te voeren. In de volgende voorbeelden maakt u een rekencluster met de naam cpu-cluster.
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"
}
}
}
}'
Aanbeveling
Hoewel de bewerking na een paar seconden een antwoord retourneert, geeft dit antwoord alleen aan dat de aanvraag voor het maken wordt geaccepteerd. Het kan enkele minuten duren voordat het cluster is gemaakt.
3. Verzend de trainingstaak
Als u dit script wilt uitvoeren, gebruikt u een command script dat zich onder ./sdk/python/jobs/single-step/lightgbm/iris/src/main.py Python-script bevindt. U verzendt de opdracht als een job naar Azure Machine Learning.
Notitie
Als u serverloze berekeningen wilt gebruiken, verwijdert compute="cpu-cluster" u deze code.
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
In de voorgaande voorbeelden hebt u het volgende geconfigureerd:
-
code - pad waar de code voor het uitvoeren van de opdracht zich bevindt.
-
command - opdracht die moet worden uitgevoerd.
-
environment - de omgeving die nodig is om het trainingsscript uit te voeren. In dit voorbeeld gebruikt u een gecureerde of kant-en-klare omgeving die wordt geleverd door Azure Machine Learning met de naam AzureML-lightgbm-3.2-ubuntu18.04-py37-cpu. Gebruik de nieuwste versie van deze omgeving met behulp van de @latest instructie. U kunt ook aangepaste omgevingen gebruiken door een basis-Docker-installatiekopieën op te geven en er een conda yaml bovenop op te geven.
-
inputs - woordenlijst van invoer met behulp van naam-waardeparen voor de opdracht. De sleutel is een naam voor de invoer binnen de context van de taak en de waarde is de invoerwaarde. Verwijs naar invoer in de command door de uitdrukking ${{inputs.<input_name>}} te gebruiken. Als u bestanden of mappen als invoer wilt gebruiken, gebruikt u de Input klasse. Zie SDK- en CLI v2-expressies voor meer informatie.
Zie de referentiedocumentatie voor meer informatie.
Wanneer u de taak verzendt, retourneert de service een URL naar de taakstatus in Azure Machine Learning Studio. Gebruik de gebruikersinterface van Studio om de voortgang van de taak weer te geven. U kunt ook de returned_job.status huidige status van de taak controleren.
Voor de az ml job create opdracht in dit voorbeeld is een YAML-taakdefinitiebestand vereist. Het bestand dat in dit voorbeeld wordt gebruikt, bevat de volgende inhoud:
Notitie
Als u serverloze berekeningen wilt gebruiken, verwijdert compute: azureml:cpu-cluster" u deze code.
$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.
In de voorgaande YAML hebt u het volgende geconfigureerd:
-
code - pad waar de code voor het uitvoeren van de opdracht zich bevindt.
-
command - opdracht die moet worden uitgevoerd.
-
inputs - woordenlijst van invoer met behulp van naam-waardeparen voor de opdracht. De sleutel is een naam voor de invoer binnen de context van de taak en de waarde is de invoerwaarde. Invoer wordt in de command gerefereerd door het gebruik van de ${{inputs.<input_name>}} expressie. Zie SDK- en CLI v2-expressies voor meer informatie.
-
environment - de omgeving die nodig is om het trainingsscript uit te voeren. In dit voorbeeld gebruikt u een gecureerde of kant-en-klare omgeving die wordt geleverd door Azure Machine Learning met de naam AzureML-lightgbm-3.3. Gebruik de nieuwste versie van deze omgeving met behulp van de @latest instructie. U kunt ook aangepaste omgevingen gebruiken door een basis-Docker-installatiekopieën op te geven en er een conda yaml bovenop op te geven.
Gebruik de volgende opdracht om de taak in te dienen. De uitvoerings-id (naam) van de trainingstaak wordt opgeslagen in de $run_id variabele:
run_id=$(az ml job create -f jobs/single-step/lightgbm/iris/job.yml --query name -o tsv)
Gebruik de opgeslagen uitvoerings-id om informatie over de taak te retourneren. Met --web de parameter wordt de Azure Machine Learning-studio webgebruikersinterface geopend, waar u kunt inzoomen op details van de taak:
az ml job show -n $run_id --web
Wanneer u een taak verzendt, moet u de trainingsscripts en -gegevens uploaden naar een cloudopslaglocatie waartoe uw Azure Machine Learning-werkruimte toegang heeft.
Gebruik de volgende Azure CLI-opdracht om het trainingsscript te uploaden. Met de opdracht geeft u de map op die de bestanden bevat die nodig zijn voor training, niet een afzonderlijk bestand. Als u in plaats daarvan REST wilt gebruiken om de gegevens te uploaden, raadpleegt u de Put Blob verwijzing.
az storage blob upload-batch -d $AZUREML_DEFAULT_CONTAINER/testjob -s cli/jobs/single-step/lightgbm/iris/src/ --account-name $AZURE_STORAGE_ACCOUNT
Maak een versiereferentie naar de trainingsgegevens. In dit voorbeeld bevinden de gegevens zich al in de cloud en bevinden ze zich op https://azuremlexamples.blob.core.windows.net/datasets/iris.csv. Zie Gegevens in Azure Machine Learning voor meer informatie over het verwijzen naar gegevens:
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\"
}
}"
Registreer een versie-verwijzing naar het trainingsscript voor gebruik met een taak. In dit voorbeeld is de scriptlocatie het standaardopslagaccount en de container waarnaar u in stap 1 hebt geüpload. De id van de trainingscode met versiebeheer wordt geretourneerd en opgeslagen in de $TRAIN_CODE variabele:
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')
Maak de omgeving die door het cluster wordt gebruikt om het trainingsscript uit te voeren. In dit voorbeeld gebruikt u een gecureerde of kant-en-klare omgeving die wordt geleverd door Azure Machine Learning met de naam AzureML-lightgbm-3.2-ubuntu18.04-py37-cpu. Met de volgende opdracht wordt een lijst met de omgevingsversies opgehaald, waarbij de nieuwste versie boven aan de verzameling staat.
jq wordt gebruikt om de id van de meest recente ([0]) versie op te halen, die vervolgens wordt opgeslagen in de $ENVIRONMENT variabele.
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)
Dien ten slotte de taak in. In het volgende voorbeeld ziet u hoe u de taak verzendt, verwijst naar de trainingscode-id, omgevings-id, URL voor de invoergegevens en de id van het rekencluster. De locatie van de taakuitvoer wordt opgeslagen in de $JOB_OUTPUT variabele:
Aanbeveling
De taaknaam moet uniek zijn. In dit voorbeeld uuidgen wordt gebruikt om een unieke waarde voor de naam te genereren.
Notitie
Als u serverloze berekeningen wilt gebruiken, verwijdert u de \"computeId\": regel in deze code.
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\"
}
}"
Het getrainde model registreren
In de volgende voorbeelden ziet u hoe u een model registreert in uw Azure Machine Learning-werkruimte.
Aanbeveling
De trainingstaak retourneert een name eigenschap. Gebruik deze naam als onderdeel van het pad naar het model.
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)
Aanbeveling
Gebruik de naam die is opgeslagen in de $run_id variabele als onderdeel van het pad naar het model.
az ml model create -n sklearn-iris-example -v 1 -p runs:/$run_id/model --type mlflow_model
Aanbeveling
Gebruik de naam die is opgeslagen in de $run_id variabele als onderdeel van het pad naar het model.
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\"
}
}"
Volgende stappen
Nu u een getraind model hebt, leert u hoe u het implementeert met behulp van een online-eindpunt.
Zie de GitHub-opslagplaats met Azure Machine Learning-voorbeelden voor meer voorbeelden.
Zie de volgende referentiedocumentatie voor meer informatie over de Azure CLI-opdrachten, Python SDK-klassen of REST API's die in dit artikel worden gebruikt: