CLI를 통해 모델 학습(v2)(미리 보기)

Azure CLI 확장인 Azure Machine Learning CLI(v2)를 사용하면 추적 및 감사 가능한 모델 수명 주기를 통해 Azure 컴퓨팅을 스케일 업 및 아웃하는 동시에 모델 학습 프로세스를 가속화할 수 있습니다.

기계 학습 모델을 학습시키는 과정은 반복 프로세스입니다. 최신 도구를 사용하면 더 많은 모델에 더 많은 데이터를 전보다 훨씬 더 빠르게 학습시킬 수 있습니다. 하이퍼 매개 변수 튜닝과 알고리즘 선택 같은 이전의 지루한 수동 프로세스가 자동화되는 경우가 많습니다. Azure Machine Learning CLI(v2)를 사용하면 하이퍼스페이스 스윕을 통해 작업 영역에서 작업(및 모델)을 추적하고, 고성능 Azure 컴퓨팅에서 확장하고, 분산 학습을 활용하여 스케일 아웃할 수 있습니다.

중요

이 기능은 현재 공개 미리 보기로 제공됩니다. 이 미리 보기 버전은 서비스 수준 계약 없이 제공되며 프로덕션 워크로드에는 사용하지 않는 것이 좋습니다. 특정 기능이 지원되지 않거나 기능이 제한될 수 있습니다. 자세한 내용은 Microsoft Azure Preview에 대한 추가 사용 약관을 참조하세요.

사전 요구 사항

작업 YAML에 대한 스키마 유효성 검사 및 자동 완성 기능을 갖춘 개발 환경의 경우 Visual Studio Code 및 Azure Machine Learning 확장을사용합니다.

예제 리포지토리 복제

학습 예제를 실행하려면 먼저 예제 리포지토리를 복제하고 cli 디렉터리로 변경합니다.

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

를 사용하면 --depth 1 리포지토리에 대한 최신 커밋만 복제되어 작업을 완료하는 시간이 줄어듭니다.

컴퓨팅 만들기

명령줄에서 Azure Machine Learning 컴퓨팅 클러스터를 만들 수 있습니다. 예를 들어 다음 명령은 cpu-cluster라는 클러스터 하나와 gpu-cluster라는 클러스터 하나를 만듭니다.

az ml compute create -n cpu-cluster --type amlcompute --min-instances 0 --max-instances 8
az ml compute create -n gpu-cluster --type amlcompute --min-instances 0 --max-instances 4 --size Standard_NC12

이 시점에서는 컴퓨팅에 대한 요금이 청구되지 않으며 cpu-clustergpu-cluster 작업이 제출될 때까지 0개 노드로 유지됩니다. AmlCompute의 비용을 관리하고 최적화하는 방법에 대해 자세히 알아보세요.

이 문서의 다음 예제 작업은 cpu-cluster 또는 gpu-cluster 중 하나를 사용합니다. 필요에 따라 이 문서 전체의 예제 작업에서 이러한 이름을 클러스터의 이름으로 조정합니다. 컴퓨팅 만들기 옵션에 대한 자세한 내용을 보려면 az ml compute create -h를 사용하세요.

Hello World

Azure Machine Learning CLI(v2)에서 작업은 YAML 형식으로 작성됩니다. 작업은 다음을 집계합니다.

  • 실행할 버전
  • 실행 방법
  • 실행 위치

"hello world" 작업에는 세 항목이 모두 있습니다.

$schema: https://azuremlschemas.azureedge.net/latest/commandJob.schema.json
command: echo "hello world"
environment:
  image: python:latest
compute: azureml:cpu-cluster

경고

Python은 작업에 사용되는 환경에 설치해야 합니다. apt-get update -y && apt-get install python3 -y필요한 경우 Dockerfile에서 를 실행하여 설치하거나 Python이 이미 설치된 기본 이미지에서 파생합니다.

$schema:전체 예제에서는 Azure Machine Learning 확장명 를 사용하여 $schema:YAML 파일을 제작하는 경우 스키마 유효성 검사 및 자동 완성을 허용합니다.

다음을 실행할 수 있습니다.

az ml job create -f jobs/basics/hello-world.yml --web

--web매개 변수는 기본 웹 브라우저를 사용하여 Azure Machine Learning Studio에서 작업을 열려고 시도합니다. --stream매개 변수를 사용하여 로그를 콘솔로 스트리밍하고 추가 명령을 차단할 수 있습니다.

만들기 또는 업데이트 시 값 재정의

YAML 작업 사양 값은 작업을 만들거나 업데이트할 때 를 사용하여 --set 재정의할 수 있습니다. 예:

az ml job create -f jobs/basics/hello-world.yml \
  --set environment.image="python:3.8" \
  --web

작업 이름

및 이외의 대부분의 az ml jobcreatelist--name/-n 명령에는 스튜디오에서 작업의 이름 또는 "실행 ID"인 가 필요합니다. 작업 영역별로 고유해야 하며 만드는 동안 작업의 속성을 직접 설정해서는 안 name 됩니다. Azure Machine Learning 설정되지 않은 경우 작업 이름에 대해 임의 GUID를 생성합니다. 이 GUID는 CLI에서 작업 만들기의 출력에서 가져오거나 스튜디오 및 MLflow API에서 "실행 ID" 속성을 복사하여 가져올 수 있습니다.

스크립트 및 CI/CD 흐름에서 작업을 자동화하려면 를 추가하여 출력을 쿼리하고 제거하여 작업을 만들 때 작업의 이름을 캡처할 수 --query name -o tsv 있습니다. 세부 사항은 셸에 따라 다르지만 Bash의 경우 다음과 같습니다.

run_id=$(az ml job create -f jobs/basics/hello-world.yml --query name -o tsv)

그런 다음 $run_id , 또는 와 같은 후속 명령에서 updateshowstream 사용합니다.

az ml job show -n $run_id --web

작업 구성

작업을 구성하려면 표시 이름, 실험 이름, 설명 및 태그를 설정할 수 있습니다. 설명은 스튜디오에서 Markdown 구문을 지원합니다. 이러한 속성은 작업을 만든 후 변경이 가능합니다. 전체 예제:

$schema: https://azuremlschemas.azureedge.net/latest/commandJob.schema.json
command: echo "hello world"
environment:
  image: python:latest
compute: azureml:cpu-cluster
tags:
  hello: world
display_name: hello-world-example
experiment_name: hello-world-example
description: |
  # Azure Machine Learning "hello world" job

  This is a "hello world" job running in the cloud via Azure Machine Learning!

  ## Description

  Markdown is supported in the studio for job descriptions! You can edit the description there or via CLI.

이 작업을 실행할 수 있습니다. 여기서 이러한 속성은 스튜디오에 즉시 표시됩니다.

az ml job create -f jobs/basics/hello-world-org.yml --web

를 사용하면 --set 작업을 만든 후 변경 가능한 값을 업데이트할 수 있습니다.

az ml job update -n $run_id --set \
  display_name="updated display name" \
  experiment_name="updated experiment name" \
  description="updated description"  \
  tags.hello="updated tag"

환경 변수

작업에서 사용할 환경 변수를 설정할 수 있습니다.

$schema: https://azuremlschemas.azureedge.net/latest/commandJob.schema.json
command: echo $hello_env_var
environment:
  image: python:latest
compute: azureml:cpu-cluster
environment_variables:
  hello_env_var: "hello world"

다음 작업을 실행할 수 있습니다.

az ml job create -f jobs/basics/hello-world-env-var.yml --web

경고

에서 inputs 인수를 매개 변수화하는 데 를 사용해야 command 합니다. 입력 및 출력을 참조하세요.

모델 및 소스 코드 추적

프로덕션 기계 학습 모델은 감사 가능해야 합니다(재현할 수 없는 경우). 지정된 모델의 소스 코드를 추적하는 것이 중요합니다. Azure Machine Learning 소스 코드의 스냅샷을 만들어 작업과 함께 유지합니다. 또한 Git 리포지토리에서 작업을 실행하는 경우 원본 리포지토리 및 커밋이 유지됩니다.

예제 리포지토리를 따라 실행 중인 경우 원본 리포지토리를 확인하고 지금까지 실행된 작업 중 하나에서 스튜디오에서 커밋할 수 있습니다.

소스 코드 디렉터리에 대한 경로로 값을 사용하여 작업에서 키를 지정할 수 code.local_path 있습니다. 디렉터리 스냅샷이 생성되고 작업과 함께 업로드됩니다. 디렉터리 내용은 작업의 작업 디렉터리에서 직접 사용할 수 있습니다.

경고

소스 코드에는 모델 학습을 위한 대용량 데이터 입력이 포함되지 않아야 합니다. 대신 데이터 입력을 사용합니다. 소스 코드 .gitignore 디렉터리에서 파일을 사용하여 스냅샷에서 파일을 제외할 수 있습니다. 스냅샷 크기에 대한 제한은 300MB 또는 2000개 파일입니다.

코드를 지정하는 작업을 살펴보겠습니다.

$schema: https://azuremlschemas.azureedge.net/latest/commandJob.schema.json
command: >-
  pip install mlflow azureml-mlflow
  &&
  python hello-mlflow.py
code:
  local_path: src
environment:
  image: python:3.8
compute: azureml:cpu-cluster

Python 스크립트는 로컬 소스 코드 디렉터리에 있습니다. 그런 다음 명령을 python 호출하여 스크립트를 실행합니다. 다른 프로그래밍 언어에도 동일한 패턴을 적용할 수 있습니다.

경고

이 문서에 표시된 작업의 "hello" 제품군은 데모용이며 권장 모범 사례를 반드시 따르는 것은 아닙니다. 또는 를 사용하여 && 시퀀스에서 많은 명령을 실행하는 것은 권장되지 않습니다. 대신 소스 코드 디렉터리에 있는 스크립트 파일에 명령을 작성하고 에서 스크립트를 호출하는 것이 command 좋습니다. 를 통해 위에 표시된 대로 에 대한 의존성 commandpip install 설치는 권장되지 않습니다. 대신 모든 작업 의존성 을 환경의 일부로 지정해야 합니다. 자세한 내용은 CLI(v2)를 사용하여 환경을 관리하는 방법을 참조하세요.

MLflow를 통해 모델 추적

모델을 계속 진행하는 동안 데이터 과학자는 모델 매개 변수 및 학습 메트릭을 추적할 수 있어야 합니다. Azure Machine Learning MLflow 추적과 통합되어 모델, 아티팩트, 메트릭 및 매개 변수를 작업에 로깅할 수 있습니다. Python 스크립트에서 MLflow를 사용하려면 import mlflowmlflow.log_* 학습 코드에서 또는 mlflow.autolog() API를 추가하고 호출합니다.

경고

mlflowazureml-mlflow 패키지는 MLflow 추적 기능을 위해 Python 환경에 설치해야 합니다.

이러한 mlflow.autolog() 호출은 널리 사용 되는 많은 프레임 워크에서 지원 되며 대부분의 로깅 작업을 담당 합니다.

를 사용 하 여 mlflow 매개 변수, 메트릭 및 아티팩트를 기록 하는 위의 작업에서 호출 된 Python 스크립트를 살펴보겠습니다.

# imports
import os
import mlflow

from random import random

# define functions
def main():
    mlflow.log_param("hello_param", "world")
    mlflow.log_metric("hello_metric", random())
    os.system(f"echo 'hello world' > helloworld.txt")
    mlflow.log_artifact("helloworld.txt")


# run functions
if __name__ == "__main__":
    # run main function
    main()

Azure Machine Learning를 통해 클라우드에서이 작업을 실행할 수 있습니다 .이 작업을 추적 하 고 감사할 수 있습니다.

az ml job create -f jobs/basics/hello-mlflow.yml --web

MLflow를 사용 하 여 메트릭 쿼리

작업을 실행 한 후에는 작업의 실행 결과와 기록 된 메트릭을 쿼리 하는 것이 좋습니다. Python은 CLI 보다이 작업에 더 적합 합니다. 를 통해 실행 및 해당 메트릭을 쿼리하고 mlflow Pandas 데이터 프레임과 같은 친숙 한 개체를 분석에 로드할 수 있습니다.

먼저 Azure Machine Learning 작업 영역에 대 한 mlflow 추적 URI를 검색 합니다.

az ml workspace show --query mlflow_tracking_uri -o tsv

mlflow.set_tracking_uri(<YOUR_TRACKING_URI>)MLflow를 가져온 Python 환경에서이 명령의 출력을 사용 합니다. mlflow 호출은 이제 Azure Machine Learning 작업 영역에 있는 작업에 해당 합니다.

입력 및 출력

작업에는 일반적으로 입력 및 출력이 있습니다. 입력은 모델 매개 변수 일 수 있습니다 .이 매개 변수는 하이퍼 매개 변수 최적화를 위해 스윕 될 수도 있고 계산 대상으로 탑재 되거나 다운로드 되는 클라우드 데이터 입력 일 수도 있습니다. 출력 (메트릭 무시)은 기본 출력 또는 명명 된 데이터 출력에 쓰거나 복사할 수 있는 아티팩트입니다.

리터럴 입력

리터럴 입력은 명령에서 직접 확인 됩니다. 리터럴 입력을 사용 하도록 "hello 세계" 작업을 수정할 수 있습니다.

$schema: https://azuremlschemas.azureedge.net/latest/commandJob.schema.json
command: >-
  echo ${{inputs.hello_string}}
  &&
  echo ${{inputs.hello_number}}
environment:
  image: python:latest
inputs:
  hello_string: "hello world"
  hello_number: 42
compute: azureml:cpu-cluster

이 작업을 실행할 수 있습니다.

az ml job create -f jobs/basics/hello-world-input.yml --web

--set를 사용 하 여 입력을 재정의할 수 있습니다.

az ml job create -f jobs/basics/hello-world-input.yml --set \
  inputs.hello_string="hello there" \
  inputs.hello_number=24 \
  --web

모델 학습에서 하이퍼 매개 변수 스윕에 대 한 작업에 대 한 리터럴 입력 을 검색 공간 입력으로 변환할 수 있습니다.

검색 공간 입력

스윕 작업의 경우 리터럴 입력을 선택할 수 있는 검색 공간을 지정할 수 있습니다. 검색 공간 입력에 대 한 전체 옵션 범위는 스윕 작업 YAML 구문 참조를 참조 하세요.

경고

스윕 작업은 현재 파이프라인 작업에서 지원 되지 않습니다.

인수를 사용 하 고 임의의 메트릭을 기록 하는 간단한 Python 스크립트를 사용 하 여 개념을 살펴보겠습니다.

# imports
import os
import mlflow
import argparse

from random import random

# define functions
def main(args):
    # print inputs
    print(f"A: {args.A}")
    print(f"B: {args.B}")
    print(f"C: {args.C}")

    # log inputs as parameters
    mlflow.log_param("A", args.A)
    mlflow.log_param("B", args.B)
    mlflow.log_param("C", args.C)

    # log a random metric
    mlflow.log_metric("random_metric", random())


def parse_args():
    # setup arg parser
    parser = argparse.ArgumentParser()

    # add arguments
    parser.add_argument("--A", type=float, default=0.5)
    parser.add_argument("--B", type=str, default="hello world")
    parser.add_argument("--C", type=float, default=1.0)

    # parse args
    args = parser.parse_args()

    # return args
    return args


# run script
if __name__ == "__main__":
    # parse args
    args = parse_args()

    # run main function
    main(args)

그리고 해당 스윕 작업을 만듭니다.

$schema: https://azuremlschemas.azureedge.net/latest/sweepJob.schema.json
type: sweep
trial:
  command: >-
    pip install mlflow azureml-mlflow
    &&
    python hello-sweep.py
    --A ${{inputs.A}}
    --B ${{search_space.B}}
    --C ${{search_space.C}}
  code:
    local_path: src
  environment:
    image: python:3.8
inputs:
  A: 0.5
compute: azureml:cpu-cluster
sampling_algorithm: random
search_space:
  B:
    type: choice
    values: ["hello", "world", "hello world"]
  C:
    type: uniform
    min_value: 0.1
    max_value: 1.0
objective:
  goal: minimize
  primary_metric: random_metric
limits:
  max_total_trials: 4
  max_concurrent_trials: 2
  timeout: 3600
display_name: hello-sweep-example
experiment_name: hello-sweep-example
description: Hello sweep job example.

다음을 실행 합니다.

az ml job create -f jobs/basics/hello-sweep.yml --web

데이터 입력

데이터 입력은 작업 계산의 로컬 파일 시스템에 있는 경로로 확인 됩니다. 에서 blob 컨테이너에 공개적으로 호스트 되는 클래식 Iri 데이터 집합을 살펴보겠습니다 https://azuremlexamples.blob.core.windows.net/datasets/iris.csv .

Iri CSV 파일에 대 한 경로를 인수로 사용 하는 Python 스크립트를 작성 하 고, 데이터 프레임로 읽어 오고, 처음 5 개 줄을 인쇄 하 고, 디렉터리에 저장할 수 있습니다 outputs .

# imports
import os
import argparse

import pandas as pd

# define functions
def main(args):
    # read in data
    df = pd.read_csv(args.iris_csv)

    # print first 5 lines
    print(df.head())

    # ensure outputs directory exists
    os.makedirs("outputs", exist_ok=True)

    # save data to outputs
    df.to_csv("outputs/iris.csv", index=False)


def parse_args():
    # setup arg parser
    parser = argparse.ArgumentParser()

    # add arguments
    parser.add_argument("--iris-csv", type=str)

    # parse args
    args = parser.parse_args()

    # return args
    return args


# run script
if __name__ == "__main__":
    # parse args
    args = parse_args()

    # run main function
    main(args)

Azure storage URI 입력을 지정 하 여 로컬 파일 시스템에 데이터를 탑재 하거나 다운로드할 수 있습니다. 단일 파일을 지정할 수 있습니다.

$schema: https://azuremlschemas.azureedge.net/latest/commandJob.schema.json
command: >-
  echo "--iris-csv: ${{inputs.iris_csv}}"
  &&
  pip install pandas
  &&
  python hello-iris.py
  --iris-csv ${{inputs.iris_csv}}
code:
  local_path: src
inputs:
  iris_csv: 
    file: https://azuremlexamples.blob.core.windows.net/datasets/iris.csv
environment:
  image: python:latest
compute: azureml:cpu-cluster

실행합니다.

az ml job create -f jobs/basics/hello-iris-file.yml --web

또는 전체 폴더를 지정 합니다.

$schema: https://azuremlschemas.azureedge.net/latest/commandJob.schema.json
command: >-
  ls ${{inputs.data_dir}}
  &&
  echo "--iris-csv: ${{inputs.data_dir}}/iris.csv"
  &&
  pip install pandas
  &&
  python hello-iris.py
  --iris-csv ${{inputs.data_dir}}/iris.csv
code:
  local_path: src
inputs:
  data_dir: 
    folder: wasbs://datasets@azuremlexamples.blob.core.windows.net/
environment:
  image: python:latest
compute: azureml:cpu-cluster

실행합니다.

az ml job create -f jobs/basics/hello-iris-folder.yml --web

개인 데이터

데이터 저장소를 통해 Azure Machine Learning에 연결 된 Azure Blob Storage 또는 Azure Data Lake Storage의 개인 데이터에 대해서는 입력 데이터 형식의 Azure Machine Learning uri를 사용할 수 있습니다 azureml://datastores/<DATASTORE_NAME>/paths/<PATH_TO_DATA> . 예를 들어, 데이터 저장소에 해당 하는 Blob 컨테이너에 있는 라는 디렉터리에 Iri CSV를 업로드 하는 경우 /example-data/workspaceblobstore 데이터 저장소에서 해당 파일을 사용 하도록 이전 작업을 수정할 수 있습니다.

경고

에서 같은 위치에 Iri CSV를 복사 하지 않은 경우 이러한 작업을 실행할 수 없습니다 workspaceblobstore .

$schema: https://azuremlschemas.azureedge.net/latest/commandJob.schema.json
command: >-
  echo "--iris-csv: ${{inputs.iris_csv}}"
  &&
  pip install pandas
  &&
  python hello-iris.py
  --iris-csv ${{inputs.iris_csv}}
code:
  local_path: src
inputs:
  iris_csv: 
    file: azureml://datastores/workspaceblobstore/paths/example-data/iris.csv
environment:
  image: python:latest
compute: azureml:cpu-cluster

또는 전체 디렉터리:

$schema: https://azuremlschemas.azureedge.net/latest/commandJob.schema.json
command: >-
  ls ${{inputs.data_dir}}
  &&
  echo "--iris-csv: ${{inputs.data_dir}}/iris.csv"
  &&
  pip install pandas
  &&
  python hello-iris.py
  --iris-csv ${{inputs.data_dir}}/iris.csv
code:
  local_path: src
inputs:
  data_dir: 
    folder: azureml://datastores/workspaceblobstore/paths/example-data/
    mode: rw_mount
environment:
  image: python:latest
compute: azureml:cpu-cluster

기본 출력

./outputs./logs 디렉터리는 Azure Machine Learning에서 별도로 처리합니다. 작업 중에 이러한 디렉터리에 파일을 작성 하는 경우 이러한 파일은 작업이 완료 된 후에도 계속 액세스할 수 있도록 작업에 업로드 됩니다. ./outputs 폴더는 작업이 종료될 때 업로드되는 반면, ./logs에 기록된 파일은 실시간으로 업로드됩니다. 작업 중에 TensorBoard 로그와 같은 로그를 스트리밍하려면 후자를 사용합니다.

"Hello 세계" 작업을 다음으로 인쇄 하는 대신 기본 출력 디렉터리의 파일로 출력 하도록 수정할 수 있습니다 stdout .

$schema: https://azuremlschemas.azureedge.net/latest/commandJob.schema.json
command: echo "hello world" > ./outputs/helloworld.txt
environment:
  image: python:latest
compute: azureml:cpu-cluster

이 작업을 실행할 수 있습니다.

az ml job create -f jobs/basics/hello-world-output.yml --web

다음 디렉터리에 있는 로그를 다운로드 합니다 helloworld.txt<RUN_ID>/outputs/ .

az ml job download -n $run_id

데이터 출력

명명 된 데이터 출력을 지정할 수 있습니다. 이렇게 하면 기본 데이터 저장소에 디렉터리가 생성 되 고 기본적으로 읽기/쓰기가 탑재 됩니다.

이전 "hello 세계" 작업을 수정 하 여 명명 된 데이터 출력에 쓸 수 있습니다.

$schema: https://azuremlschemas.azureedge.net/latest/commandJob.schema.json
command: echo "hello world" > ${{outputs.hello_output}}/helloworld.txt
outputs:
  hello_output:
environment:
  image: python
compute: azureml:cpu-cluster

Hello 파이프라인

파이프라인 작업은 여러 작업을 병렬로 또는 순차적으로 실행할 수 있습니다. 파이프라인의 단계 간에 입/출력 종속성이 있으면 종속 단계가 완료 된 후에 실행 됩니다.

"Hello 세계" 작업을 두 개의 작업으로 분할할 수 있습니다.

$schema: https://azuremlschemas.azureedge.net/latest/pipelineJob.schema.json
type: pipeline
jobs:
  hello_job:
    command: echo "hello"
    environment:
      image: python:latest
    compute: azureml:cpu-cluster
  world_job:
    command: echo "world"
    environment:
      image: python
    compute: azureml:cpu-cluster

다음을 실행 합니다.

az ml job create -f jobs/basics/hello-pipeline.yml --web

"Hello" 및 "세계" 작업은 계산 대상에 사용 가능한 리소스가 있으면 각각 병렬로 실행 됩니다.

파이프라인의 단계 간에 데이터를 전달 하려면 "hello" 작업에서 데이터 출력을 정의 하 고 이전 출력을 참조 하는 "세계" 작업에서 해당 입력을 정의 합니다.

$schema: https://azuremlschemas.azureedge.net/latest/pipelineJob.schema.json
type: pipeline
jobs:
  hello_job:
    command: echo "hello" && echo "world" > ${{outputs.world_output}}/world.txt
    environment:
      image: python:latest
    compute: azureml:cpu-cluster
    outputs:
      world_output:
  world_job:
    command: cat ${{inputs.world_input}}/world.txt
    environment:
      image: python:latest
    compute: azureml:cpu-cluster
    inputs:
      world_input: ${{jobs.hello_job.outputs.world_output}}

다음을 실행 합니다.

az ml job create -f jobs/basics/hello-pipeline-io.yml --web

이번에는 "hello" 작업이 완료 된 후 "세계" 작업이 실행 됩니다.

파이프라인의 작업 간에 공통 설정이 중복 되지 않게 하려면 작업 외부에서 설정할 수 있습니다.

$schema: https://azuremlschemas.azureedge.net/latest/pipelineJob.schema.json
type: pipeline
compute: azureml:cpu-cluster
settings:
  environment:
    image: python:latest
jobs:
  hello_job:
    command: echo "hello"
  world_job:
    command: echo "world"

다음을 실행할 수 있습니다.

az ml job create -f jobs/basics/hello-pipeline-settings.yml --web

개별 작업에 대 한 해당 설정은 파이프라인 작업의 일반 설정을 재정의 합니다. 지금 까지의 개념은 "A", "B" 및 "C" 작업을 사용 하 여 3 단계 파이프라인 작업으로 결합할 수 있습니다. "C" 작업에는 "B" 작업에 대 한 데이터 종속성이 있으며 "A" 작업은 독립적으로 실행 될 수 있습니다. 또한 "A" 작업은 개별적으로 설정 된 환경을 사용 하 고 해당 입력 중 하나를 최상위 수준 파이프라인 작업 입력에 바인딩합니다.

$schema: https://azuremlschemas.azureedge.net/latest/pipelineJob.schema.json
type: pipeline
compute: azureml:cpu-cluster
settings:
  environment:
    image: python:latest
inputs:
  hello_string_top_level_input: "hello world"
jobs:
  A:
    command: echo hello ${{inputs.hello_string}}
    environment:
      image: python:3.9
    inputs:
      hello_string: ${{inputs.hello_string_top_level_input}}
  B:
    command: echo "world" >> ${{outputs.world_output}}/world.txt
    outputs:
      world_output:
  C:
    command: echo ${{inputs.world_input}}/world.txt
    inputs:
      world_input: ${{jobs.B.outputs.world_output}}

다음을 실행할 수 있습니다.

az ml job create -f jobs/basics/hello-pipeline-abc.yml --web

모델 학습

이 시점에서 모델은 아직 학습 되지 않았습니다. sklearnMLflow 추적을 사용 하 여 Python 스크립트에 일부 코드를 추가 하 여 IRI CSV에서 모델을 학습 하겠습니다.

# imports
import os
import mlflow
import argparse

import pandas as pd

from sklearn.svm import SVC
from sklearn.model_selection import train_test_split

# define functions
def main(args):
    # enable auto logging
    mlflow.autolog()

    # setup parameters
    params = {
        "C": args.C,
        "kernel": args.kernel,
        "degree": args.degree,
        "gamma": args.gamma,
        "coef0": args.coef0,
        "shrinking": args.shrinking,
        "probability": args.probability,
        "tol": args.tol,
        "cache_size": args.cache_size,
        "class_weight": args.class_weight,
        "verbose": args.verbose,
        "max_iter": args.max_iter,
        "decision_function_shape": args.decision_function_shape,
        "break_ties": args.break_ties,
        "random_state": args.random_state,
    }

    # read in data
    df = pd.read_csv(args.iris_csv)

    # process data
    X_train, X_test, y_train, y_test = process_data(df, args.random_state)

    # train model
    model = train_model(params, X_train, X_test, y_train, y_test)


def process_data(df, random_state):
    # split dataframe into X and y
    X = df.drop(["species"], axis=1)
    y = df["species"]

    # train/test split
    X_train, X_test, y_train, y_test = train_test_split(
        X, y, test_size=0.2, random_state=random_state
    )

    # return split data
    return X_train, X_test, y_train, y_test


def train_model(params, X_train, X_test, y_train, y_test):
    # train model
    model = SVC(**params)
    model = model.fit(X_train, y_train)

    # return model
    return model


def parse_args():
    # setup arg parser
    parser = argparse.ArgumentParser()

    # add arguments
    parser.add_argument("--iris-csv", type=str)
    parser.add_argument("--C", type=float, default=1.0)
    parser.add_argument("--kernel", type=str, default="rbf")
    parser.add_argument("--degree", type=int, default=3)
    parser.add_argument("--gamma", type=str, default="scale")
    parser.add_argument("--coef0", type=float, default=0)
    parser.add_argument("--shrinking", type=bool, default=False)
    parser.add_argument("--probability", type=bool, default=False)
    parser.add_argument("--tol", type=float, default=1e-3)
    parser.add_argument("--cache_size", type=float, default=1024)
    parser.add_argument("--class_weight", type=dict, default=None)
    parser.add_argument("--verbose", type=bool, default=False)
    parser.add_argument("--max_iter", type=int, default=-1)
    parser.add_argument("--decision_function_shape", type=str, default="ovr")
    parser.add_argument("--break_ties", type=bool, default=False)
    parser.add_argument("--random_state", type=int, default=42)

    # parse args
    args = parser.parse_args()

    # return args
    return args


# run script
if __name__ == "__main__":
    # parse args
    args = parse_args()

    # run main function
    main(args)

Scikit 프레임 워크는 autologging에 대해 MLflow에서 지원 되므로 mlflow.autolog() 스크립트의 단일 호출은 모든 모델 매개 변수, 학습 메트릭, 모델 아티팩트 및 몇 가지 추가 아티팩트 (이 경우 혼동 행렬 이미지)를 기록 합니다.

클라우드에서이를 실행 하려면를 작업으로 지정 합니다.

$schema: https://azuremlschemas.azureedge.net/latest/commandJob.schema.json
code: 
  local_path: src
command: >-
  python main.py 
  --iris-csv ${{inputs.iris_csv}}
  --C ${{inputs.C}}
  --kernel ${{inputs.kernel}}
  --coef0 ${{inputs.coef0}}
inputs:
  iris_csv: 
    file: wasbs://datasets@azuremlexamples.blob.core.windows.net/iris.csv
  C: 0.8
  kernel: "rbf"
  coef0: 0.1
environment: azureml:AzureML-sklearn-0.24-ubuntu18.04-py37-cpu:9
compute: azureml:cpu-cluster
display_name: sklearn-iris-example
experiment_name: sklearn-iris-example
description: Train a scikit-learn SVM on the Iris dataset.

다음을 실행 합니다.

az ml job create -f jobs/single-step/scikit-learn/iris/job.yml --web

모델을 등록 하려면 출력을 다운로드 하 고 로컬 디렉터리에서 모델을 만들 수 있습니다.

az ml job download -n $run_id
az ml model create -n sklearn-iris-example -l $run_id/model/

하이퍼 매개 변수 스윕

하이퍼 매개 변수를 통해 스윕 되도록 이전 작업을 수정할 수 있습니다.

$schema: https://azuremlschemas.azureedge.net/latest/sweepJob.schema.json
type: sweep
trial:
  code: 
    local_path: src
  command: >-
    python main.py 
    --iris-csv ${{inputs.iris_csv}}
    --C ${{search_space.C}}
    --kernel ${{search_space.kernel}}
    --coef0 ${{search_space.coef0}}
  environment: azureml:AzureML-sklearn-0.24-ubuntu18.04-py37-cpu:9
inputs:
  iris_csv: 
    file: wasbs://datasets@azuremlexamples.blob.core.windows.net/iris.csv
compute: azureml:cpu-cluster
sampling_algorithm: random
search_space:
  C:
    type: uniform
    min_value: 0.5
    max_value: 0.9
  kernel:
    type: choice
    values: ["rbf", "linear", "poly"]
  coef0:
    type: uniform
    min_value: 0.1
    max_value: 1
objective:
  goal: minimize
  primary_metric: training_f1_score
limits:
  max_total_trials: 20
  max_concurrent_trials: 10
  timeout: 7200
display_name: sklearn-iris-sweep-example
experiment_name: sklearn-iris-sweep-example
description: Sweep hyperparemeters for training a scikit-learn SVM on the Iris dataset.

다음을 실행 합니다.

az ml job create -f jobs/single-step/scikit-learn/iris/job-sweep.yml --web

스튜디오에서 "자식 실행" 탭을 확인 하 여 진행률을 모니터링 하 고 매개 변수 차트를 봅니다.

스윕 옵션에 대 한 자세한 내용은 스윕 작업 YAML 구문 참조를 참조 하세요.

분산 학습

Azure Machine Learning은 PyTorch, TensorFlow 및 MPI 기반 분산 교육을 지원 합니다. 자세한 내용은 작업 YAML 구문 참조 명령의 distributed 섹션 을 참조 하세요.

예를 들어 distributed PyTorch를 사용 하 여 CIFAR 데이터 집합에서 CNN (신경망)을 학습할 수 있습니다. 전체 스크립트는 예제 리포지토리에서 사용할 수 있습니다.

의 CIFAR-10 데이터 집합은 torchvision 디렉터리를 포함 하는 디렉터리를 입력으로 예상 합니다 cifar-10-batches-py . 압축 된 소스를 다운로드 하 고 로컬 디렉터리에 추출할 수 있습니다.

mkdir data
wget "https://azuremlexamples.blob.core.windows.net/datasets/cifar-10-python.tar.gz"
tar -xvzf cifar-10-python.tar.gz -C data

그런 다음 기본 데이터 저장소에 업로드 되는 로컬 디렉터리에서 Azure Machine Learning 데이터 집합을 만듭니다.

az ml dataset create --name cifar-10-example --version 1 --set local_path=data

필요에 따라 로컬 파일 및 디렉터리를 제거 합니다.

rm cifar-10-python.tar.gz
rm -r data

데이터 집합 (파일만)은 dataset 데이터 입력의 키를 사용 하 여 작업에서 참조 될 수 있습니다. 형식은 이며,이는 azureml:<DATASET_NAME>:<DATASET_VERSION> 생성 된 CIFAR 데이터 집합의 경우 azureml:cifar-10-example:1 입니다.

데이터 집합을 준비 하면 distributed PyTorch 작업을 작성 하 여 모델을 학습 시킬 수 있습니다.

$schema: https://azuremlschemas.azureedge.net/latest/commandJob.schema.json
code: 
  local_path: src
command: >-
  python train.py 
  --epochs ${{inputs.epochs}}
  --learning-rate ${{inputs.learning_rate}}
  --data-dir ${{inputs.cifar}}
inputs:
  epochs: 1
  learning_rate: 0.2
  cifar:
    dataset: azureml:cifar-10-example:1
environment: azureml:AzureML-pytorch-1.9-ubuntu18.04-py37-cuda11-gpu:6
compute: azureml:gpu-cluster
distribution:
  type: pytorch 
  process_count_per_instance: 2
resources:
  instance_count: 2
display_name: pytorch-cifar-distributed-example
experiment_name: pytorch-cifar-distributed-example
description: Train a basic convolutional neural network (CNN) with PyTorch on the CIFAR-10 dataset, distributed via PyTorch.

다음을 실행 합니다.

az ml job create -f jobs/single-step/pytorch/cifar-distributed/job.yml --web

학습 파이프라인 빌드

위의 CIFAR-10 예제는 파이프라인 작업으로 변환 됩니다. 이전 작업은 파이프라인에서 오케스트레이션을 위한 세 개의 작업으로 분할할 수 있습니다.

  • Bash 스크립트를 실행하여 다운로드하고 추출하는 "get-data" cifar-10-batches-py
  • 분산 PyTorch를 사용하여 데이터를 받아 모델을 학습하는 "train-model"
  • "eval-model" - 데이터 및 학습된 모델을 사용하여 정확도 평가

"train-model" 및 "eval-model"은 모두 "get-data" 작업의 출력에 종속됩니다. 또한 "eval-model"은 "train-model" 작업의 출력에 종속됩니다. 따라서 세 개의 작업이 순차적으로 실행됩니다.

파이프라인 작업 내에서 다음 세 작업을 오케스트레이션할 수 있습니다.

$schema: https://azuremlschemas.azureedge.net/latest/pipelineJob.schema.json
type: pipeline
display_name: cifar-10-pipeline-example
experiment_name: cifar-10-pipeline-example
jobs:
  get-data:
    command: bash main.sh ${{outputs.cifar}}
    code:
      local_path: src/get-data
    environment:
      image: python:latest
    compute: azureml:cpu-cluster
    outputs:
      cifar:
  train-model:
    command: >-
      python main.py
      --data-dir ${{inputs.cifar}}
      --epochs ${{inputs.epochs}}
      --model-dir ${{outputs.model_dir}}
    code:
      local_path: src/train-model
    inputs:
      epochs: 1
      cifar: ${{jobs.get-data.outputs.cifar}}
    outputs:
      model_dir:
    environment: azureml:AzureML-pytorch-1.9-ubuntu18.04-py37-cuda11-gpu:6
    compute: azureml:gpu-cluster
    distribution:
      type: pytorch
      process_count_per_instance: 2
    resources:
      instance_count: 2
  eval-model:
    command: >-
      python main.py
      --data-dir ${{inputs.cifar}}
      --model-dir ${{inputs.model_dir}}/model
    code:
      local_path: src/eval-model
    environment: azureml:AzureML-pytorch-1.9-ubuntu18.04-py37-cuda11-gpu:6
    compute: azureml:gpu-cluster
    distribution:
      type: pytorch
      process_count_per_instance: 2
    resources:
      instance_count: 1
    inputs:
      cifar: ${{jobs.get-data.outputs.cifar}}
      model_dir: ${{jobs.train-model.outputs.model_dir}}

실행합니다.

az ml job create -f jobs/pipelines/cifar-10/job.yml --web

Pipelines 재사용 가능한 구성 요소를 사용하여 작성할 수도 있습니다. 자세한 내용은 Azure Machine Learning CLI(미리 보기)를 사용하여 구성 요소 기반 기계 학습 파이프라인 만들기 및 실행을 참조하세요.

다음 단계