다음을 통해 공유


빠른 시작: Azure Machine Learning 시작

적용 대상: Python SDK azure-ai-ml v2(현재)

이 자습서는 Azure Machine Learning Service에서 가장 많이 사용되는 기능 중 일부를 소개합니다. 여기서는 모델을 만들고, 등록하고, 배포합니다. 이 자습서는 Azure Machine Learning의 핵심 개념과 가장 일반적인 사용에 익숙해지는 데 도움이 됩니다.

확장 가능한 컴퓨팅 리소스에서 학습 작업을 실행한 다음 배포하고 마지막으로 배포를 테스트하는 방법을 알아봅니다.

데이터 준비를 처리하고 모델을 학습하고 등록하는 학습 스크립트를 만듭니다. 모델을 학습한 후에는 엔드포인트로 배포한 다음, 추론에 대한 엔드포인트를 호출합니다.

수행할 단계는 다음과 같습니다.

  • Azure Machine Learning 작업 영역에 대한 핸들 설정
  • 학습 스크립트 만들기
  • 확장 가능한 컴퓨팅 리소스인 컴퓨팅 클러스터 만들기
  • 적절한 작업 환경으로 구성된 컴퓨팅 클러스터에서 학습 스크립트를 실행할 명령 작업을 만들고 실행합니다.
  • 학습 스크립트의 출력 보기
  • 새로 학습된 모델을 엔드포인트로 배포
  • 유추를 위해 Azure Machine Learning 엔드포인트 호출

이 빠른 시작의 단계 개요를 보려면 이 동영상을 시청합니다.

필수 조건

  1. Azure Machine Learning을 사용하려면 작업 영역이 필요합니다. 작업 영역이 없으면 시작하는 데 필요한 리소스 만들기를 완료하여 작업 영역을 만들고 사용 방법에 대해 자세히 알아봅니다.

    Important

    Azure Machine Learning 작업 영역이 관리형 가상 네트워크로 구성된 경우 공용 Python 패키지 리포지토리에 대한 액세스를 허용하도록 아웃바운드 규칙을 추가해야 할 수 있습니다. 자세한 내용은 시나리오: 공용 기계 학습 패키지에 액세스합니다.

  2. 아직 열려 있지 않은 경우 스튜디오에 로그인하고 작업 영역을 선택합니다.

  3. 작업 영역에서 Notebook을 열거나 만듭니다.

    • 코드를 복사하여 셀에 붙여 넣으려면 새 Notebook을 만듭니다.
    • 또는 스튜디오의 샘플 섹션에서 tutorials/get-started-notebooks/quickstart.ipynb를 엽니다. 그런 다음 복제를 선택하여 Notebook을 파일에 추가합니다. 샘플 Notebook을 찾으려면 샘플 Notebook에서 학습을 참조 하세요.

커널을 설정하고 VS Code(Visual Studio Code)에서 엽니다.

  1. 아직 컴퓨팅 인스턴스가 없는 경우 열린 Notebook 위 상단 표시줄에서 컴퓨팅 인스턴스를 만듭니다.

    컴퓨팅 인스턴스를 만드는 방법을 보여 주는 스크린샷.

  2. 컴퓨팅 인스턴스가 중지된 경우 컴퓨팅 시작을 선택하고 실행될 때까지 기다립니다.

    스크린샷은 중지된 컴퓨팅 인스턴스를 시작하는 방법을 보여줍니다.

  3. 컴퓨팅 인스턴스가 실행될 때까지 기다립니다. 그런 다음 오른쪽 Python 3.10 - SDK v2위에 있는 커널이 .인지 확인합니다. 그렇지 않은 경우 드롭다운 목록을 사용하여 이 커널을 선택합니다.

    커널 설정 방법을 보여 주는 스크린샷.

    이 커널이 표시되지 않으면 컴퓨팅 인스턴스가 실행 중인지 확인합니다. 이 경우 전자 필기장 오른쪽 위에 있는 새로 고침 단추를 선택합니다.

  4. 인증이 필요하다는 배너가 표시되면 인증을 선택합니다.

  5. 여기서 Notebook을 실행하거나 Azure Machine Learning 리소스의 기능을 갖춘 전체 IDE(통합 개발 환경)를 위해 VS Code에서 열 수 있습니다. VS Code에서 열기를 선택한 다음 웹 또는 데스크톱 옵션을 선택합니다. 이러한 방식으로 시작하면 VS Code가 컴퓨팅 인스턴스, 커널 및 작업 영역 파일 시스템에 연결됩니다.

    VS Code에서 Notebook을 여는 방법을 보여주는 스크린샷

Important

이 자습서의 나머지 부분에는 자습서 Notebook의 셀이 포함되어 있습니다. 새 전자 필기장을 복사하여 붙여넣거나 복제한 경우 지금 전자 필기장으로 전환합니다.

작업 영역에 대한 핸들 만들기

코드를 살펴보기 전에 작업 영역을 참조할 수 있는 방법이 필요합니다. 작업 영역은 Azure Machine Learning의 최상위 리소스로, Azure Machine Learning을 사용할 때 만든 모든 아티팩트를 사용할 수 있는 중앙 집중식 환경을 제공합니다.

작업 영역 핸들에 대해 ml_client를 만듭니다. 그런 다음, ml_client를 사용하여 리소스와 작업을 관리합니다.

다음 셀에 구독 ID, 리소스 그룹 이름 및 작업 영역 이름을 입력합니다. 이러한 값을 찾으려면 다음을 수행합니다.

  1. 오른쪽 위 Azure Machine Learning 스튜디오 도구 모음에서 작업 영역 이름을 선택합니다.
  2. 작업 영역, 리소스 그룹 및 구독 ID의 값을 코드에 복사합니다.
  3. 하나의 값을 복사하고 해당 영역을 닫고 붙여넣은 후 다음 값으로 돌아와야 합니다.

스크린샷: 도구 모음의 오른쪽 위에서 코드에 대한 자격 증명을 찾습니다.

from azure.ai.ml import MLClient
from azure.identity import DefaultAzureCredential

# authenticate
credential = DefaultAzureCredential()

SUBSCRIPTION = "<SUBSCRIPTION_ID>"
RESOURCE_GROUP = "<RESOURCE_GROUP>"
WS_NAME = "<AML_WORKSPACE_NAME>"
# Get a handle to the workspace
ml_client = MLClient(
    credential=credential,
    subscription_id=SUBSCRIPTION,
    resource_group_name=RESOURCE_GROUP,
    workspace_name=WS_NAME,
)

참고 항목

MLClient를 만들면 작업 영역에 연결되지 않습니다. 클라이언트 초기화는 지연되어 처음 호출이 필요할 때까지 기다립니다(이는 다음 코드 셀에서 발생합니다).

# Verify that the handle works correctly.
# If you ge an error here, modify your SUBSCRIPTION, RESOURCE_GROUP, and WS_NAME in the previous cell.
ws = ml_client.workspaces.get(WS_NAME)
print(ws.location, ":", ws.resource_group)

학습 스크립트 만들기

먼저 학습 스크립트인 main.py Python 파일을 만들어 보겠습니다.

우선 스크립트의 원본 폴더를 만듭니다.

import os

train_src_dir = "./src"
os.makedirs(train_src_dir, exist_ok=True)

이 스크립트는 데이터의 전처리를 처리하여 테스트 및 학습 데이터로 분할합니다. 그런 다음, 이 데이터를 사용하여 트리 기반 모델을 학습시키고 출력 모델을 반환합니다.

MLFlow는 파이프라인 실행 중에 매개 변수와 메트릭을 기록하는 데 사용됩니다.

아래 셀은 IPython 매직을 사용하여 방금 만든 디렉터리에 학습 스크립트를 씁니다.

%%writefile {train_src_dir}/main.py
import os
import argparse
import pandas as pd
import mlflow
import mlflow.sklearn
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.metrics import classification_report
from sklearn.model_selection import train_test_split

def main():
    """Main function of the script."""

    # input and output arguments
    parser = argparse.ArgumentParser()
    parser.add_argument("--data", type=str, help="path to input data")
    parser.add_argument("--test_train_ratio", type=float, required=False, default=0.25)
    parser.add_argument("--n_estimators", required=False, default=100, type=int)
    parser.add_argument("--learning_rate", required=False, default=0.1, type=float)
    parser.add_argument("--registered_model_name", type=str, help="model name")
    args = parser.parse_args()
   
    # Start Logging
    mlflow.start_run()

    # enable autologging
    mlflow.sklearn.autolog()

    ###################
    #<prepare the data>
    ###################
    print(" ".join(f"{k}={v}" for k, v in vars(args).items()))

    print("input data:", args.data)
    
    credit_df = pd.read_csv(args.data, header=1, index_col=0)

    mlflow.log_metric("num_samples", credit_df.shape[0])
    mlflow.log_metric("num_features", credit_df.shape[1] - 1)

    train_df, test_df = train_test_split(
        credit_df,
        test_size=args.test_train_ratio,
    )
    ####################
    #</prepare the data>
    ####################

    ##################
    #<train the model>
    ##################
    # Extracting the label column
    y_train = train_df.pop("default payment next month")

    # convert the dataframe values to array
    X_train = train_df.values

    # Extracting the label column
    y_test = test_df.pop("default payment next month")

    # convert the dataframe values to array
    X_test = test_df.values

    print(f"Training with data of shape {X_train.shape}")

    clf = GradientBoostingClassifier(
        n_estimators=args.n_estimators, learning_rate=args.learning_rate
    )
    clf.fit(X_train, y_train)

    y_pred = clf.predict(X_test)

    print(classification_report(y_test, y_pred))
    ###################
    #</train the model>
    ###################

    ##########################
    #<save and register model>
    ##########################
    # Registering the model to the workspace
    print("Registering the model via MLFlow")

    # pin numpy
    conda_env = {
        'name': 'mlflow-env',
        'channels': ['conda-forge'],
        'dependencies': [
            'python=3.10.15',
            'pip<=21.3.1',
            {
                'pip': [
                    'mlflow==2.17.0',
                    'cloudpickle==2.2.1',
                    'pandas==1.5.3',
                    'psutil==5.8.0',
                    'scikit-learn==1.5.2',
                    'numpy==1.26.4',
                ]
            }
        ],
    }

    mlflow.sklearn.log_model(
        sk_model=clf,
        registered_model_name=args.registered_model_name,
        artifact_path=args.registered_model_name,
        conda_env=conda_env,
    )

    # Saving the model to a file
    mlflow.sklearn.save_model(
        sk_model=clf,
        path=os.path.join(args.registered_model_name, "trained_model"),
    )
    ###########################
    #</save and register model>
    ###########################
    
    # Stop Logging
    mlflow.end_run()

if __name__ == "__main__":
    main()

이 스크립트에서 볼 수 있듯이 모델이 학습되면 모델 파일이 저장되고 작업 영역에 등록됩니다. 이제 엔드포인트를 유추할 때 등록된 모델을 사용할 수 있습니다.

파일에서 새 폴더와 스크립트를 보려면 새로 고침을 선택해야 할 수도 있습니다.

새로 고침 아이콘을 보여 주는 스크린샷.

명령 구성

이제 원하는 작업을 수행할 수 있는 스크립트와 스크립트를 실행하는 컴퓨팅 클러스터가 있으므로 명령줄 작업을 실행할 수 있는 범용 명령을 사용합니다. 이 명령줄 작업은 시스템 명령을 직접 호출하거나 스크립트를 실행할 수 있습니다.

여기서는 입력 데이터, 분할 비율, 학습 속도 및 등록된 모델 이름을 지정하는 입력 변수를 만듭니다. 명령 스크립트는 다음을 수행합니다.

  • 학습 스크립트에 필요한 소프트웨어와 런타임 라이브러리를 정의하는 환경을 사용합니다. Azure Machine Learning은 일반적인 교육 및 유추 시나리오에 유용한 많은 큐레이팅된 환경 또는 바로 사용 가능한 환경을 제공합니다. 여기서는 다음 환경 중 하나를 사용합니다. 자습서: Azure Machine Learning에서 모델 학습에서는 사용자 지정 환경을 만드는 방법을 알아봅니다.
  • 명령줄 작업 자체를 구성합니다. 이 경우에는 python main.py입니다. 입력/출력은 ${{ ... }} 표기법을 통해 명령에서 액세스할 수 있습니다.
  • 이 샘플에서는 인터넷에 있는 파일의 데이터에 액세스합니다.
  • 컴퓨팅 리소스가 지정되지 않았기 때문에 스크립트는 자동으로 생성되는 서버리스 컴퓨팅 클러스터에서 실행됩니다.
from azure.ai.ml import command
from azure.ai.ml import Input

registered_model_name = "credit_defaults_model"

job = command(
    inputs=dict(
        data=Input(
            type="uri_file",
            path="https://azuremlexamples.blob.core.windows.net/datasets/credit_card/default_of_credit_card_clients.csv",
        ),
        test_train_ratio=0.2,
        learning_rate=0.25,
        registered_model_name=registered_model_name,
    ),
    code="./src/",  # location of source code
    command="python main.py --data ${{inputs.data}} --test_train_ratio ${{inputs.test_train_ratio}} --learning_rate ${{inputs.learning_rate}} --registered_model_name ${{inputs.registered_model_name}}",
    environment="azureml://registries/azureml/environments/sklearn-1.5/labels/latest",
    display_name="credit_default_prediction",
)

작업 제출

이제 Azure Machine Learning에서 실행할 작업을 제출할 차례입니다. 이번에는 ml_client에서 create_or_update를 사용합니다.

ml_client.create_or_update(job)

작업 출력 보기 및 작업 완료 대기

이전 셀의 출력에서 링크를 선택하여 Azure Machine Learning 스튜디오에서 작업을 봅니다.

이 작업의 출력은 Azure Machine Learning 스튜디오에서 다음과 같습니다. 메트릭, 출력 등과 같은 다양한 세부 정보를 보려면 탭을 탐색합니다. 작업이 완료되면 학습의 결과로 작업 영역에 모델을 등록합니다.

작업 개요 페이지를 보여 주는 스크린샷.

Important

계속하려면 이 Notebook으로 돌아가기 전에 작업 상태가 완료될 때까지 기다립니다. 이 작업을 실행하는 데 2~3분이 걸립니다. 컴퓨팅 클러스터가 0개 노드로 축소되었고 사용자 지정 환경이 아직 빌드 중인 경우 더 오래 걸릴 수 있습니다(최대 10분).

모델을 온라인 엔드포인트로 배포

이제 Azure 클라우드(online endpoint)에서 기계 학습 모델을 웹 서비스로 배포합니다.

기계 학습 서비스를 배포하려면 등록한 모델을 사용합니다.

새 온라인 엔드포인트 만들기

이제 등록된 모델이 있으므로 온라인 엔드포인트를 만들 차례입니다. 엔드포인트 이름은 전체 Azure 지역에서 고유해야 합니다. 이 자습서에서는 UUID을(를) 사용하여 고유한 이름을 만듭니다.

import uuid

# Creating a unique name for the endpoint
online_endpoint_name = "credit-endpoint-" + str(uuid.uuid4())[:8]

엔드포인트 만들기:

# Expect the endpoint creation to take a few minutes
from azure.ai.ml.entities import (
    ManagedOnlineEndpoint,
    ManagedOnlineDeployment,
    Model,
    Environment,
)

# create an online endpoint
endpoint = ManagedOnlineEndpoint(
    name=online_endpoint_name,
    description="this is an online endpoint",
    auth_mode="key",
    tags={
        "training_dataset": "credit_defaults",
        "model_type": "sklearn.GradientBoostingClassifier",
    },
)

endpoint = ml_client.online_endpoints.begin_create_or_update(endpoint).result()

print(f"Endpoint {endpoint.name} provisioning state: {endpoint.provisioning_state}")

참고 항목

엔드포인트 만들기에는 몇 분 정도 걸릴 것으로 예상됩니다.

엔드포인트가 만들어지면 아래와 같이 검색할 수 있습니다.

endpoint = ml_client.online_endpoints.get(name=online_endpoint_name)

print(
    f'Endpoint "{endpoint.name}" with provisioning state "{endpoint.provisioning_state}" is retrieved'
)

엔드포인트에 모델 배포

엔드포인트가 만들어지면 항목 스크립트를 사용하여 모델을 배포합니다. 각 엔드포인트에 여러 배포가 있을 수 있습니다. 이러한 배포에 대한 직접 트래픽은 규칙을 사용하여 지정할 수 있습니다. 여기서는 수신 트래픽의 100%를 처리하는 단일 배포를 만듭니다. 임의적인 배포의 색 이름(예: 파란색, 녹색, 빨간색)을 선택했습니다.

Azure Machine Learning 스튜디오의 모델 페이지에서 등록된 모델의 최신 버전을 확인할 수 있습니다. 또는 아래 코드는 사용할 최신 버전 번호를 검색합니다.

# Let's pick the latest version of the model
latest_model_version = max(
    [int(m.version) for m in ml_client.models.list(name=registered_model_name)]
)
print(f'Latest model is version "{latest_model_version}" ')

최신 버전의 모델을 배포합니다.

# picking the model to deploy. Here we use the latest version of our registered model
model = ml_client.models.get(name=registered_model_name, version=latest_model_version)

# Expect this deployment to take approximately 6 to 8 minutes.
# create an online deployment.
# if you run into an out of quota error, change the instance_type to a comparable VM that is available.
# Learn more on https://azure.microsoft.com/pricing/details/machine-learning/.
blue_deployment = ManagedOnlineDeployment(
    name="blue",
    endpoint_name=online_endpoint_name,
    model=model,
    instance_type="Standard_DS3_v2",
    instance_count=1,
)

blue_deployment = ml_client.begin_create_or_update(blue_deployment).result()

참고 항목

이 배포에는 약 6~8분이 소요될 것으로 예상됩니다.

배포가 완료되면 테스트할 준비가 된 것입니다.

샘플 쿼리를 사용하여 테스트

모델이 엔드포인트에 배포되면 모델을 사용하여 유추를 실행할 수 있습니다.

스코어 스크립트의 run 메서드에서 예상한 디자인에 따라 샘플 요청 파일을 작성합니다.

deploy_dir = "./deploy"
os.makedirs(deploy_dir, exist_ok=True)
%%writefile {deploy_dir}/sample-request.json
{
  "input_data": {
    "columns": [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22],
    "index": [0, 1],
    "data": [
            [20000,2,2,1,24,2,2,-1,-1,-2,-2,3913,3102,689,0,0,0,0,689,0,0,0,0],
            [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, 9, 8]
        ]
  }
}
# test the blue deployment with some sample data
ml_client.online_endpoints.invoke(
    endpoint_name=online_endpoint_name,
    request_file="./deploy/sample-request.json",
    deployment_name="blue",
)

리소스 정리

엔드포인트를 사용하지 않으려면 엔드포인트를 삭제하여 리소스 사용을 중지합니다. 엔드포인트를 삭제하기 전에 다른 배포에서 엔드포인트를 사용하고 있지 않은지 확인합니다.

참고 항목

전체 삭제에는 약 20분 정도 소요됩니다.

ml_client.online_endpoints.begin_delete(name=online_endpoint_name)

컴퓨팅 인스턴스 중지

지금 사용하지 않으려면 컴퓨팅 인스턴스를 중지합니다.

  1. 스튜디오의 왼쪽 탐색 영역에서 컴퓨팅을 선택합니다.
  2. 맨 위 탭에서 컴퓨팅 인스턴스를 선택합니다.
  3. 목록에서 컴퓨팅 인스턴스를 선택합니다.
  4. 맨 위의 도구 모음에서 중지를 선택합니다.

모든 리소스 삭제

Important

사용자가 만든 리소스는 다른 Azure Machine Learning 자습서 및 방법 문서의 필수 구성 요소로 사용할 수 있습니다.

사용자가 만든 리소스를 사용하지 않으려면 요금이 발생하지 않도록 해당 리소스를 삭제합니다.

  1. Azure Portal의 검색 상자에 리소스 그룹을 입력하고 결과에서 선택합니다.

  2. 목록에서 만든 리소스 그룹을 선택합니다.

  3. 개요 페이지에서 리소스 그룹 삭제를 선택합니다.

    Azure Portal에서 리소스 그룹을 삭제하기 위해 선택한 항목의 스크린샷

  4. 리소스 그룹 이름을 입력합니다. 그런 다음 삭제를 선택합니다.

다음 단계

이제 모델 학습 및 배포와 관련된 내용을 알았으니 다음 자습서에서 프로세스에 대해 자세히 알아봅니다.

자습서 설명
Azure Machine Learning에서 데이터 업로드, 액세스 및 탐색 대용량 데이터를 클라우드에 저장하고 Notebooks 및 스크립트에서 검색
클라우드 워크스테이션에서 모델 개발 기계 학습 모델 프로토타이핑 및 개발 시작
Azure Machine Learning에서 모델 학습 모델 학습에 대한 세부 정보 살펴보기
모델을 온라인 엔드포인트로 배포 모델 배포에 대한 세부 정보를 살펴봅니다.
프로덕션 기계 학습 파이프라인 만들기 전체 기계 학습 작업을 다단계 워크플로로 분할합니다.