적용 대상:
Azure CLI ml 확장 v2(현재)
Python SDK azure-ai-ml v2(현재)
Azure Machine Learning은 ML 학습 작업을 제출하는 여러 가지 방법을 제공합니다. 이 문서에서는 다음 방법을 사용하여 작업을 제출하는 방법을 알아봅니다.
- 기계 학습용 Azure CLI 확장: CLI v2라고도 하는
ml
확장입니다.
- Azure Machine Learning용 Python SDK v2.
- REST API: CLI 및 SDK가 빌드된 API입니다.
필수 구성 요소
REST API 정보를 사용하려면 다음 항목이 필요합니다.
작업 영역의 서비스 주체. 관리 REST 요청은 서비스 사용자 인증을 사용합니다.
서비스 주체 인증 토큰.
서비스 사용자 인증 토큰 검색의 단계에 따라 이 토큰을 검색하세요.
curl 유틸리티. curl 프로그램은 Linux용 Windows 하위 시스템 또는 모든 UNIX 배포판에서 사용할 수 있습니다.
팁
PowerShell에서 curl
은 Invoke-WebRequest
의 별칭이며 curl -d "key=val" -X POST uri
는 Invoke-WebRequest -Body "key=val" -Method POST -Uri uri
가 됩니다.
PowerShell에서 REST API를 호출할 수 있지만 이 문서의 예에서는 Bash를 사용한다고 가정합니다.
JSON 처리를 위한 jq 유틸리티. 이 유틸리티는 REST API 호출에서 반환되는 JSON 문서에서 값을 추출하는 데 사용됩니다.
예제 리포지토리 복제
이 문서의 코드 조각은 Azure Machine Learning 예제 GitHub 리포지토리의 예제를 기반으로 합니다. 리포지토리를 개발 환경에 복제하려면 다음 명령을 사용합니다.
git clone --depth 1 https://github.com/Azure/azureml-examples
팁
--depth 1
을 사용하여 최신 커밋만 리포지토리에 복제하여 작업을 완료하는 데 걸리는 시간을 줄입니다.
예제 작업
이 문서의 예에서는 붓꽃 데이터 세트를 사용하여 MLFlow 모델을 학습합니다.
클라우드에서 학습
클라우드에서 학습할 때 Azure Machine Learning 작업 영역에 연결하고 학습 작업을 실행하는 데 사용할 컴퓨팅 리소스를 선택해야 합니다.
1. 작업 영역에 연결
팁
아래 탭을 사용하여 모델 학습에 사용할 방법을 선택합니다. 탭을 선택하면 이 문서의 모든 탭이 동일한 탭으로 자동 전환됩니다. 언제든지 다른 탭을 선택할 수 있습니다.
작업 영역에 연결하려면 구독, 리소스 그룹 및 작업 영역 이름과 같은 식별자 매개 변수가 필요합니다.
MLClient
네임스페이스의 azure.ai.ml
에서 이러한 세부 정보를 사용하여 필요한 Azure Machine Learning 작업 영역에 대한 핸들을 가져옵니다. 인증하려면 기본 Azure 인증을 사용합니다. 자격 증명을 구성하고 작업 영역에 연결하는 방법에 대한 자세한 내용은 이 예를 확인합니다.
#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)
Azure CLI를 사용하는 경우 구독, 리소스 그룹 및 작업 영역 이름과 같은 식별자 매개 변수가 필요합니다. 각 명령에 대해 이러한 매개 변수를 지정할 수 있지만 모든 명령에 사용할 기본값을 설정할 수도 있습니다. 다음 명령을 사용하여 기본값을 설정합니다.
<subscription ID>
, <Azure Machine Learning workspace name>
및 <resource group>
을 구성 값으로 바꿉니다.
az account set --subscription <subscription ID>
az configure --defaults workspace=<Azure Machine Learning workspace name> group=<resource group>
이 문서의 REST API 예는 $SUBSCRIPTION_ID
, $RESOURCE_GROUP
, $LOCATION
및 $WORKSPACE
자리 표시자를 사용합니다. 다음과 같이 자리 표시자를 고유한 값으로 바꿉니다.
-
$SUBSCRIPTION_ID
: Azure 구독 ID입니다.
-
$RESOURCE_GROUP
: 작업 영역을 포함하는 Azure 리소스 그룹입니다.
-
$LOCATION
: 작업 영역이 있는 Azure 지역입니다.
-
$WORKSPACE
: Azure Machine Learning 작업 영역의 이름입니다.
-
$COMPUTE_NAME
: Azure Machine Learning 컴퓨팅 클러스터의 이름입니다.
관리 REST는 서비스 사용자 인증 토큰을 요청합니다. 다음 명령을 사용하여 토큰을 검색할 수 있습니다. 토큰은 $TOKEN
환경 변수에 저장됩니다.
TOKEN=$(az account get-access-token --query accessToken -o tsv)
서비스 공급자는 api-version
인수를 사용하여 호환성을 보장합니다.
api-version
인수는 서비스마다 다릅니다. 이후 버전을 수용할 수 있도록 API 버전을 변수로 설정합니다.
API_VERSION="2022-05-01"
REST API를 사용하여 학습하는 경우 작업 영역에서 액세스할 수 있는 스토리지 계정에 데이터 및 학습 스크립트를 업로드해야 합니다. 다음 예에서는 작업 영역에 대한 스토리지 정보를 가져오고 나중에 사용할 수 있도록 변수에 저장합니다.
# 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. 학습용 컴퓨팅 리소스 만들기
Azure Machine Learning 컴퓨팅 클러스터는 학습 작업을 실행하는 데 사용할 수 있는 완전 관리형 컴퓨팅 리소스입니다. 다음 예에서는 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"
}
}
}
}'
팁
몇 초 후에 응답이 반환되지만 이는 만들기 요청이 수락되었음을 나타냅니다. 클러스터 만들기를 완료하는 데 몇 분 정도 걸릴 수 있습니다.
3. 학습 작업 제출
이 스크립트를 실행하려면 ./sdk/python/jobs/single-step/lightgbm/iris/src/ 아래에 있는 main.py Python 스크립트를 실행하는 command
를 사용합니다. 명령은 Azure Machine Learning에 job
으로 제출하여 실행됩니다.
참고 항목
서버리스 컴퓨팅을 사용하려면 이 코드에서 compute="cpu-cluster"
를 삭제합니다.
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
위의 예에서는 다음을 구성했습니다.
-
code
- 명령을 실행할 코드가 있는 경로
-
command
- 실행해야 하는 명령
-
environment
- 학습 스크립트를 실행하는 데 필요한 환경입니다. 이 예에서는 AzureML-lightgbm-3.2-ubuntu18.04-py37-cpu
라는 Azure Machine Learning에서 제공하는 큐레이트되거나 미리 만들어진 환경을 사용합니다.
@latest
지시문을 사용하여 이 환경의 최신 버전을 사용합니다. 기본 Docker 이미지를 지정하고 그 위에 conda yaml을 지정하여 사용자 지정 환경을 사용할 수도 있습니다.
-
inputs
- 명령에 대한 이름 값 쌍을 사용하는 입력 사전. 키는 작업의 컨텍스트 내에서 입력에 대한 이름이고 값은 입력 값입니다. 입력은 command
식을 사용하여 ${{inputs.<input_name>}}
에서 참조됩니다. 파일 또는 폴더를 입력으로 사용하려면 Input
클래스를 사용할 수 있습니다. 자세한 내용은 SDK 및 CLI v2 식을 참조하세요.
자세한 내용은 참조 설명서를 참조하세요.
작업을 제출하면 URL이 Azure Machine Learning 스튜디오의 작업 상태로 반환됩니다. 스튜디오 UI를 사용하여 작업 진행 상황을 확인합니다.
returned_job.status
를 사용하여 작업의 현재 상태를 확인할 수도 있습니다.
이 예에서 사용된 az ml job create
명령에는 YAML 작업 정의 파일이 필요합니다. 이 예에서 사용된 파일의 콘텐츠는 다음과 같습니다.
참고 항목
서버리스 컴퓨팅을 사용하려면 이 코드에서 compute: azureml:cpu-cluster"
를 삭제합니다.
$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.
위에서 다음을 구성했습니다.
-
code
- 명령을 실행할 코드가 있는 경로
-
command
- 실행해야 하는 명령
-
inputs
- 명령에 대한 이름 값 쌍을 사용하는 입력 사전. 키는 작업의 컨텍스트 내에서 입력에 대한 이름이고 값은 입력 값입니다. 입력은 command
식을 사용하여 ${{inputs.<input_name>}}
에서 참조됩니다. 자세한 내용은 SDK 및 CLI v2 식을 참조하세요.
-
environment
- 학습 스크립트를 실행하는 데 필요한 환경입니다. 이 예에서는 AzureML-lightgbm-3.3
라는 Azure Machine Learning에서 제공하는 큐레이트되거나 미리 만들어진 환경을 사용합니다.
@latest
지시문을 사용하여 이 환경의 최신 버전을 사용합니다. 기본 Docker 이미지를 지정하고 그 위에 conda yaml을 지정하여 사용자 지정 환경을 사용할 수도 있습니다.
작업을 제출하려면 다음 명령을 사용합니다. 학습 작업의 실행 ID(이름)는 $run_id
변수에 저장됩니다.
run_id=$(az ml job create -f jobs/single-step/lightgbm/iris/job.yml --query name -o tsv)
저장된 실행 ID를 사용하여 작업에 대한 정보를 반환할 수 있습니다.
--web
매개 변수는 작업에 대한 세부 정보를 드릴할 수 있는 Azure Machine Learning 스튜디오 웹 UI를 엽니다.
az ml job show -n $run_id --web
작업 제출의 일부로 학습 스크립트 및 데이터를 Azure Machine Learning 작업 영역에서 액세스할 수 있는 클라우드 스토리지 위치에 업로드해야 합니다.
다음 Azure CLI 명령을 사용하여 학습 스크립트를 업로드합니다. 이 명령은 개별 파일이 아닌 학습에 필요한 파일이 포함된 디렉터리를 지정합니다. 대신 REST를 사용하여 데이터를 업로드하려면 Blob 배치 참조를 확인합니다.
az storage blob upload-batch -d $AZUREML_DEFAULT_CONTAINER/testjob -s cli/jobs/single-step/lightgbm/iris/src/ --account-name $AZURE_STORAGE_ACCOUNT
학습 데이터에 대한 버전이 지정된 참조를 만듭니다. 이 예에서 데이터는 이미 클라우드에 있으며 https://azuremlexamples.blob.core.windows.net/datasets/iris.csv
에 있습니다. 데이터 참조에 대한 자세한 내용은 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\"
}
}"
작업에 사용할 학습 스크립트에 대한 버전이 지정된 참조를 등록합니다. 이 예에서 스크립트 위치는 1단계에서 업로드한 기본 스토리지 계정 및 컨테이너입니다. 버전이 지정된 학습 코드의 ID가 반환되고 $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')
클러스터가 학습 스크립트를 실행하는 데 사용할 환경을 만듭니다. 이 예에서는 AzureML-lightgbm-3.2-ubuntu18.04-py37-cpu
라는 Azure Machine Learning에서 제공하는 큐레이트되거나 미리 만들어진 환경을 사용합니다. 다음 명령은 최신 버전이 컬렉션의 맨 위에 있는 환경 버전 목록을 검색합니다.
jq
는 [0]
변수에 저장되는 최신($ENVIRONMENT
) 버전의 ID를 검색하는 데 사용됩니다.
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)
마지막으로 작업을 제출합니다. 다음 예에서는 작업을 제출하는 방법, 학습 코드 ID, 환경 ID, 입력 데이터의 URL 및 컴퓨팅 클러스터의 ID를 참조하는 방법을 보여 줍니다. 작업 출력 위치는 $JOB_OUTPUT
변수에 저장됩니다.
팁
작업 이름은 고유해야 합니다. 이 예에서 uuidgen
은 이름에 대한 고유한 값을 생성하는 데 사용됩니다.
참고 항목
서버리스 컴퓨팅을 사용하려면 이 코드에서 \"computeId\":
줄을 삭제합니다.
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\"
}
}"
학습된 모델 등록
다음 예에서는 Azure Machine Learning 작업 영역에서 모델을 등록하는 방법을 보여 줍니다.
팁
학습 작업에서 반환된 name
속성은 모델 경로의 일부로 사용됩니다.
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)
팁
이름($run_id
변수에 저장됨)은 모델 경로의 일부로 사용됩니다.
az ml model create -n sklearn-iris-example -v 1 -p runs:/$run_id/model --type mlflow_model
팁
이름($run_id
변수에 저장됨)은 모델 경로의 일부로 사용됩니다.
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\"
}
}"
다음 단계
학습된 모델이 있으므로 온라인 엔드포인트를 사용하여 모델을 배포하는 방법에 대해 알아봅니다.
더 많은 예는 Azure Machine Learning 예 GitHub 리포지토리를 참조하세요.
이 문서에서 사용된 Azure CLI 명령, Python SDK 클래스 또는 REST API에 대한 자세한 내용은 다음 참조 설명서를 참조하세요.