다음을 통해 공유


MLflow 및 Azure Machine Learning을 사용하여 ML 모델 추적

적용 대상: Python SDK azureml v1

이 문서에서는 MLflow 추적을 사용하도록 설정하여 MLflow 실험의 백 엔드로 Azure Machine Learning을 연결하는 방법을 알아봅니다.

MLflow는 기계 학습 실험의 수명 주기를 관리하기 위한 오픈 소스 라이브러리입니다. MLflow 추적은 실험 환경에 관계없이(컴퓨터에서 로컬로, 원격 컴퓨팅 대상, 가상 머신 또는 Azure Databricks 클러스터에서) 학습 실행 메트릭과 모델 아티팩트를 로깅하고 추적하는 MLflow의 구성 요소입니다.

지원되는 모든 MLflow 및 Azure Machine Learning 기능(MLflow Project 지원(미리 보기) 및 모델 배포 포함)에 대해서는 MLflow 및 Azure Machine Learning을 참조하세요.

Azure Databricks 또는 Azure Synapse Analytics에서 실행되는 실험을 추적하려면 전용 문서 MLflow 및 Azure Machine Learning을 사용하여 Azure Databricks ML 실험 추적 또는 MLflow 및 Azure Machine Learning을 사용하여 Azure Synapse Analytics ML 실험 추적을 참조하세요.

참고 항목

이 문서의 정보는 주로 모델 학습 프로세스를 모니터링하려는 데이터 과학자와 개발자를 위한 것입니다. 할당량, 완료된 학습 작업 또는 완료된 모델 배포와 같이 Azure Machine Learning의 리소스 사용 및 이벤트를 모니터링하는 데 관심이 있는 관리자는 Azure Machine Learning 모니터링을 참조하세요.

필수 조건

로컬 컴퓨터 또는 원격 컴퓨팅에서 실행 추적

Azure Machine Learning과 함께 MLflow을 사용하여 추적하면 로컬 컴퓨터에서 실행의 로깅된 메트릭 및 아티팩트 실행을 Azure Machine Learning 작업 영역에 저장할 수 있습니다.

추적 환경 설정

Azure Machine Learning 컴퓨팅(이제부터 "로컬 컴퓨팅"이라고 함)에서 실행되지 않는 실행을 추적하려면 로컬 컴퓨팅이 Azure Machine Learning MLflow 추적 URI를 가리켜야 합니다.

참고 항목

Azure Compute(Azure Notebooks, Azure Compute 인스턴스 또는 Compute 클러스터에서 호스트되는 Jupyter Notebooks)에서 실행하는 경우 추적 URI를 구성할 필요가 없습니다. 자동으로 구성됩니다.

적용 대상: Python SDK azureml v1

Python용 Azure Machine Learning SDK v1을 사용하여 Azure Machine Learning MLflow 추적 URI를 가져올 수 있습니다. azureml-sdk 라이브러리가 사용하는 클러스터에 설치되어 있는지 확인합니다. 다음 샘플에서는 작업 영역과 연결된 고유한 MLFLow 추적 URI를 가져옵니다. 그런 다음, 메서드 set_tracking_uri()는 MLflow 추적 URI로 해당 URI를 가리킵니다.

  1. 작업 영역 구성 파일 사용:

    from azureml.core import Workspace
    import mlflow
    
    ws = Workspace.from_config()
    mlflow.set_tracking_uri(ws.get_mlflow_tracking_uri())
    

    작업 영역 구성 파일은 다음을 수행하여 다운로드할 수 있습니다.

    1. Azure Machine Learning 스튜디오로 이동합니다.
    2. 페이지의 오른쪽 위 모서리를 클릭하고 구성 파일을 다운로드합니다.
    3. config.json 파일을 작업 중인 동일한 디렉터리에 저장합니다.
  2. 구독 ID, 리소스 그룹 이름 및 작업 영역 이름 사용:

    from azureml.core import Workspace
    import mlflow
    
    #Enter details of your Azure Machine Learning workspace
    subscription_id = '<SUBSCRIPTION_ID>'
    resource_group = '<RESOURCE_GROUP>'
    workspace_name = '<AZUREML_WORKSPACE_NAME>'
    
    ws = Workspace.get(name=workspace_name,
                       subscription_id=subscription_id,
                       resource_group=resource_group)
    
    mlflow.set_tracking_uri(ws.get_mlflow_tracking_uri())
    

실험 이름 설정

모든 MLflow 실행은 활성 실험에 기록됩니다. 기본적으로 실행은 자동으로 만들어지는 Default라는 실험에 로그됩니다. 작업하려는 실험을 구성하려면 MLflow 명령 mlflow.set_experiment()를 사용합니다.

experiment_name = 'experiment_with_mlflow'
mlflow.set_experiment(experiment_name)

Azure Machine Learning SDK를 사용하여 작업을 제출할 때 experiment_name 속성을 사용하여 실험 이름을 설정할 수 있습니다. 학습 스크립트에서 구성할 필요가 없습니다.

학습 실행 시작

MLflow 실험 이름을 설정한 후 start_run()을 사용하여 학습 실행을 시작할 수 있습니다. 그런 다음 log_metric()을 사용하여 MLflow 로깅 API를 활성화하고 학습 실행 메트릭 로깅을 시작합니다.

import os
from random import random

with mlflow.start_run() as mlflow_run:
    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")

MLflow를 사용하여 실행 시 메트릭, 매개 변수 및 아티팩트를 로그하는 방법에 대한 자세한 내용은 메트릭을 로그하고 보는 방법을 참조하세요.

Azure Machine Learning에서 실행되는 실행 추적

적용 대상: Python SDK azureml v1

원격 실행(작업)을 사용하면 보다 강력하고 반복적인 방식으로 모델을 학습할 수 있습니다. 또한 Machine Learning 컴퓨팅 클러스터와 같은 더 강력한 컴퓨팅을 활용할 수 있습니다. 다양한 컴퓨팅 옵션에 대해 알아보려면 모델 학습에 컴퓨팅 대상 사용을 참조하세요.

실행을 제출할 때 Azure Machine Learning은 실행이 실행 중인 작업 영역에서 작동하도록 MLflow를 자동으로 구성합니다. 즉, MLflow 추적 URI를 구성할 필요가 없습니다. 또한 실험 제출의 세부 정보를 기반으로 실험의 이름이 자동으로 지정됩니다.

Important

Azure Machine Learning에 학습 작업을 제출할 때 이미 구성되어 있으므로 학습 논리에서 MLflow 추적 URI를 구성할 필요가 없습니다. 학습 루틴에서도 실험 이름을 구성할 필요가 없습니다.

학습 루틴 만들기

먼저 src 하위 디렉터리를 만들고 src 하위 디렉터리의 train.py 파일에 학습 코드를 포함하는 파일을 만들어야 합니다. train.py를 포함하여 모든 학습 코드는 src 하위 디렉터리로 이동합니다.

학습 코드는 Azure Machine Learning 예제 리포지토리의 이 MLflow 예제에서 가져옵니다.

이 코드를 파일에 복사합니다.

# 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에 실험을 제출하려면 Python을 사용해야 합니다. Notebook 또는 Python 파일에서 Environment 클래스를 사용하여 컴퓨팅 및 학습 실행 환경을 구성합니다.

from azureml.core import Environment
from azureml.core.conda_dependencies import CondaDependencies

env = Environment(name="mlflow-env")

# Specify conda dependencies with scikit-learn and temporary pointers to mlflow extensions
cd = CondaDependencies.create(
    conda_packages=["scikit-learn", "matplotlib"],
    pip_packages=["azureml-mlflow", "pandas", "numpy"]
    )

env.python.conda_dependencies = cd

그런 다음, 컴퓨팅 대상으로 원격 컴퓨팅을 사용하여 ScriptRunConfig를 구성합니다.

from azureml.core import ScriptRunConfig

src = ScriptRunConfig(source_directory="src",
                      script=training_script,
                      compute_target="<COMPUTE_NAME>",
                      environment=env)

이 컴퓨팅 및 학습 실행 구성에서 Experiment.submit() 메서드를 사용하여 실행을 제출합니다. 이 메서드는 자동으로 MLflow 추적 URI를 설정하고 MLflow에서 작업 영역으로 로깅을 보냅니다.

from azureml.core import Experiment
from azureml.core import Workspace
ws = Workspace.from_config()

experiment_name = "experiment_with_mlflow"
exp = Experiment(workspace=ws, name=experiment_name)

run = exp.submit(src)

작업 영역에서 메트릭 및 아티팩트 보기

MLflow 로깅의 메트릭과 아티팩트는 작업 영역에 추적됩니다. 언제든지 이들을 보려면 작업 영역으로 이동하여 Azure Machine Learning 스튜디오의 작업 영역에서 이름으로 실험을 찾습니다. 또는 아래 코드를 실행합니다.

MLflow get_run()을 사용하여 실행 메트릭을 검색합니다.

from mlflow.tracking import MlflowClient

# Use MlFlow to retrieve the run that was just completed
client = MlflowClient()
run_id = mlflow_run.info.run_id
finished_mlflow_run = MlflowClient().get_run(run_id)

metrics = finished_mlflow_run.data.metrics
tags = finished_mlflow_run.data.tags
params = finished_mlflow_run.data.params

print(metrics,tags,params)

실행의 아티팩트를 보려면 MlFlowClient.list_artifacts()를 사용할 수 있습니다.

client.list_artifacts(run_id)

현재 디렉터리에 아티팩트를 다운로드하려면 MLFlowClient.download_artifacts()를 사용할 수 있습니다.

client.download_artifacts(run_id, "helloworld.txt", ".")

MLflow를 사용하여 Azure Machine Learning에서 실험 및 실행에서 정보를 검색하는 방법에 대한 자세한 내용은 MLflow로 실험 및 실행 관리를 참조하세요.

비교 및 쿼리

다음 코드를 사용하여 Azure Machine Learning 작업 영역에서 모든 MLflow 실행을 비교하고 쿼리합니다. MLflow를 사용하여 실행을 쿼리하는 방법에 대해 자세히 알아보세요.

from mlflow.entities import ViewType

all_experiments = [exp.experiment_id for exp in MlflowClient().list_experiments()]
query = "metrics.hello_metric > 0"
runs = mlflow.search_runs(experiment_ids=all_experiments, filter_string=query, run_view_type=ViewType.ALL)

runs.head(10)

자동 로깅

Azure Machine Learning 및 MLFlow를 사용하면 사용자는 모델을 학습할 때 메트릭, 모델 매개 변수 및 모델 아티팩트를 자동으로 기록할 수 있습니다. 널리 사용되는 다양한 기계 학습 라이브러리가 지원됩니다.

자동 로깅을 사용하도록 설정하려면 학습 코드 앞에 다음 코드를 삽입합니다.

mlflow.autolog()

MLflow를 사용한 자동 로깅에 대해 자세히 알아봅니다.

모델 관리

MLflow 모델 레지스트리를 지원하는 Azure Machine Learning 모델 레지스트리를 통해 모델을 등록하고 추적합니다. Azure Machine Learning 모델은 MLflow 모델 스키마에 맞게 조정되어 다양한 워크플로에서 이러한 모델을 쉽게 내보내고 가져올 수 있습니다. 실행 ID와 같은 MLflow 관련 메타데이터도 추적 가능성을 위해 등록된 모델로 추적됩니다. 사용자는 학습 실행을 제출하고 MLflow 실행에서 생성된 모델을 등록 및 배포할 수 있습니다.

프로덕션 준비 모델을 한 단계로 배포하고 등록하려면 MLflow 모델 배포 및 등록을 참조하세요.

실행에서 모델을 등록하고 보려면 다음 단계를 사용합니다.

  1. 실행이 완료되면 register_model() 메서드를 호출합니다.

    # the model folder produced from a run is registered. This includes the MLmodel file, model.pkl and the conda.yaml.
    model_path = "model"
    model_uri = 'runs:/{}/{}'.format(run_id, model_path) 
    mlflow.register_model(model_uri,"registered_model_name")
    
  2. Azure Machine Learning 스튜디오를 사용하여 작업 영역에서 등록된 모델을 봅니다.

    다음 예제에서 등록된 모델 my-model에는 MLflow 추적 메타데이터 태그가 지정되어 있습니다.

    register-mlflow-model

  3. 아티팩트 탭을 선택하여 MLflow 모델 스키마(conda.yaml, MLmodel, model.pkl)와 일치하는 모든 모델 파일을 확인합니다.

    model-schema

  4. MLmodel을 선택하여 실행을 통해 생성된 MLmodel 파일을 확인합니다.

    MLmodel-schema

리소스 정리

작업 영역에서 기록된 메트릭과 아티팩트를 사용하지 않으려는 경우에는 개별적으로 삭제할 수 있는 기능을 현재 사용할 수 없습니다. 대신, 스토리지 계정 및 작업 영역을 포함하는 리소스 그룹을 삭제하여 요금이 발생하지 않도록 합니다.

  1. Azure Portal 맨 왼쪽에서 리소스 그룹을 선택합니다.

    Azure Portal에서 삭제

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

  3. 리소스 그룹 삭제를 선택합니다.

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

예제 Notebook

Azure Machine Learning Notebook을 사용한 MLflow는 이 문서에 나와 있는 개념에 따라 시연하고 확장합니다. 커뮤니티 기반 리포지토리인 AzureML 예도 참조하세요.

다음 단계