다음을 통해 공유


MLflow로 메트릭, 매개 변수 및 파일 로그

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

Azure Machine Learning은 MLflow 추적을 사용한 로깅 및 추적 실험을 지원합니다. MLflow를 사용하여 컴퓨터에서 로컬로 또는 클라우드 환경에서 모델, 메트릭, 매개 변수 및 아티팩트를 로그할 수 있습니다.

Important

Azure Machine Learning SDK v1과 달리 Python용 Azure Machine Learning SDK(v2)에는 로깅 기능이 없습니다. 이전에 Azure Machine Learning SDK v1을 사용했다면 실험 추적을 위해 MLflow 활용하는 것이 좋습니다. 구체적인 지침은 SDK v1에서 MLflow로 로깅 마이그레이션을 참조하세요.

로그는 오류 및 경고를 진단하거나 매개 변수 및 모델 성능과 같은 성능 메트릭을 추적하는 데 도움이 됩니다. 이 문서에서는 다음 시나리오에서 로깅을 사용하도록 설정하는 방법에 대해 설명합니다.

  • 작업을 제출할 때 메트릭, 매개 변수 및 모델을 로그합니다.
  • 대화형으로 학습할 때 추적이 실행됩니다.
  • 메트릭을 비동기적으로 기록합니다.
  • 학습에 대한 진단 정보를 봅니다.

이 문서에서는 모델 학습 프로세스를 모니터링하는 방법을 보여 줍니다. 할당량, 완료된 학습 작업 또는 완료된 모델 배포와 같이 Azure Machine Learning의 리소스 사용량 및 이벤트를 모니터링하는 데 관심이 있는 경우 Azure Machine Learning 모니터링을 참조하세요.

필수 조건

  • Azure Machine Learning 작업 영역이 있어야 합니다. 작업 영역이 없으면 작업 영역 리소스 만들기를 참조하세요.

  • mlflowazureml-mlflow 패키지가 설치되어 있어야 합니다. 그렇지 않은 경우 다음 명령을 사용하여 개발 환경에 설치합니다.

    pip install mlflow azureml-mlflow
    

    참고 항목

    메트릭의 비동기 로깅을 위해서는 MLflow 버전 2.8.0+ 및 azureml-mlflow 버전 1.55+가 있어야 합니다.

  • 원격 추적(Azure Machine Learning 외부에서 실행되는 실험 추적)을 수행하는 경우 실험을 추적하도록 MLflow를 구성합니다. 자세한 내용은 Azure Machine Learning용 MLflow 구성을 참조하세요.

  • MLflow를 사용하여 Azure Machine Learning의 실험에서 메트릭, 매개 변수, 아티팩트 및 모델을 기록하려면 스크립트에서 MLflow를 가져오기만 하면 됩니다.

    import mlflow
    

실험 구성

MLflow는 실험에서 정보를 구성하고 실행합니다(Azure Machine Learning에서는 실행을 작업이라고 함). 코드를 실행하는 방법에 따라 구성하는 방법에 몇 가지 차이점이 있습니다.

Jupyter Notebook에서와 같이 대화형으로 학습하는 경우 다음 패턴을 사용합니다.

  1. 활성 실험을 만들거나 설정합니다.
  2. 작업을 시작합니다.
  3. 로깅 메서드를 사용하여 메트릭 및 기타 정보를 기록합니다.
  4. 작업을 종료합니다.

예를 들어 다음 코드 조각은 실험을 구성한 다음, 작업 중에 로그합니다.

import mlflow
# Set the experiment
mlflow.set_experiment("mlflow-experiment")

# Start the run
mlflow_run = mlflow.start_run()
# Log metrics or other information
mlflow.log_metric('mymetric', 1)
# End run 
mlflow.end_run()

기술적으로 새로운 실행이 존재하지 않고 로깅 API를 호출하는 경우 새 실행이 생성되므로 start_run()을 호출할 필요가 없습니다. 이 경우 mlflow.active_run()을 사용하여 현재 사용 중인 실행을 검색할 수 있습니다. 자세한 내용은 mlflow.active_run()을 참조하세요.

컨텍스트 관리자 패러다임을 사용할 수도 있습니다.

import mlflow
mlflow.set_experiment("mlflow-experiment")

# Start the run, log metrics, end the run
with mlflow.start_run() as run:
    # Run started when context manager is entered, and ended when context manager exits
    mlflow.log_metric('mymetric', 1)
    mlflow.log_metric('anothermetric',1)
    pass

mlflow.start_run을 사용하여 새 실행을 시작할 때 매개 변수 run_name을 지정하면 Azure Machine Learning 사용자 인터페이스에서 실행 이름으로 변환되어 더 빠르게 실행을 식별하는 데 도움이 됩니다.

with mlflow.start_run(run_name="iris-classifier-random-forest") as run:
    mlflow.log_metric('mymetric', 1)
    mlflow.log_metric('anothermetric',1)

MLflow 로깅 API에 대한 자세한 내용은 MLflow 참조를 참조하세요.

로그 매개 변수

MLflow는 실험에 사용되는 로깅 매개 변수를 지원합니다. 매개 변수는 모든 형식이 될 수 있으며 다음 구문을 사용하여 로그할 수 있습니다.

mlflow.log_param("num_epochs", 20)

MLflow는 또한 사전을 사용하여 모든 매개 변수를 표시하여 여러 매개 변수를 로그하는 편리한 방법을 제공합니다. 여러 프레임워크는 사전을 사용하여 모델에 매개 변수를 전달할 수도 있으므로 실험에서 이를 로그하는 편리한 방법입니다.

params = {
    "num_epochs": 20,
    "dropout_rate": .6,
    "objective": "binary_crossentropy"
}

mlflow.log_params(params)

메트릭 로깅

매개 변수가 아닌 메트릭은 항상 숫자이며 동기 또는 비동기적으로 기록할 수 있습니다. 메트릭이 기록되면 호출 반환 시 즉시 사용할 수 있습니다. 다음 표에서는 특정 숫자 형식을 로그하는 방법을 설명합니다.

로그된 값 예제 코드 주의
숫자 값 로그(int 또는 float) mlflow.log_metric("my_metric", 1)
시간 경과에 따른 숫자 값 로그(int 또는 float) mlflow.log_metric("my_metric", 1, step=1) 매개 변수 step을 사용하여 메트릭 값을 로그하는 단계를 나타냅니다. 모든 정수가 될 수 있습니다. 기본값은 0입니다.
부울 값 로그 mlflow.log_metric("my_metric", 0) 0 = True, 1 = False

Important

성능 고려 사항: 여러 메트릭(또는 동일한 메트릭에 대해 여러 값)을 로그해야 하는 경우 루프에서 mlflow.log_metric을 호출하지 마세요. 더 나은 성능은 mlflow.log_metric("metric1", 9.42, synchronous=False)과 함께 비동기 로깅을 사용하거나 메트릭 배치를 로깅하여 달성할 수 있습니다.

메트릭을 비동기적으로 기록

MLflow를 사용하면 비동기 방식으로 메트릭을 로깅할 수도 있습니다. 비동기 메트릭 로깅은 수십 개의 컴퓨팅 노드가 포함된 대규모 학습 작업이 실행 중이고 메트릭을 동시에 기록하려고 하는 경우에 특히 유용합니다. 소수의 노드가 많은 수의 메트릭을 기록하려고 할 때도 유용합니다.

비동기 메트릭 로깅을 사용하면 백 엔드 서비스에서 메트릭이 구체화될 때까지 기다리지 않고 즉시 메트릭을 로깅할 수 있습니다. 이 방식은 수십만 개의 메트릭 값을 기록하는 대규모 학습 루틴으로 크기 조정되며 권장되는 방식입니다.

MLflow는 기본적으로 메트릭을 동기적으로 기록하지만 언제든지 이 동작을 변경할 수 있습니다.

import mlflow

mlflow.config.enable_async_logging()

환경 변수를 사용하여 동일한 속성을 설정할 수 있습니다.

export MLFLOW_ENABLE_ASYNC_LOGGING=True

특정 메트릭을 비동기적으로 기록하려면 평소와 같이 MLflow 로깅 API를 사용하되 추가 매개 변수 synchronous=False을 추가합니다.

import mlflow

with mlflow.start_run():
    # (...)
    mlflow.log_metric("metric1", 9.42, synchronous=False)
    # (...)

log_metric(synchronous=False)를 사용하는 경우 작업이 승인되면 제어가 자동으로 호출자에게 반환됩니다. 그러나 해당 값을 즉시 읽을 수는 없습니다. 메트릭의 비동기 로깅은 순서를 보장하며 로깅된 시점의 타임스탬프와 함께 유지됩니다.

Important

synchronous=False을 사용하더라도 Azure Machine Learning은 메트릭의 순서를 보장합니다.

특정 값이 백엔드에서 유지될 때까지 기다려야 하는 경우 다음 예제와 같이 반환된 지표 작업을 사용하여 대기할 수 있습니다.

import mlflow

with mlflow.start_run():
    # (...)
    run_operation = mlflow.log_metric("metric1", 9.42, synchronous=False)
    # (...)
    run_operation.wait()
    # (...)

다음 예제와 같이 한 번에 하나의 메트릭을 비동기적으로 기록하거나 메트릭 일괄 처리를 기록할 수 있습니다.

import mlflow
import time
from mlflow.entities import Metric

with mlflow.start_run() as current_run:
    mlflow_client = mlflow.tracking.MlflowClient()

    metrics = {"metric-0": 3.14, "metric-1": 6.28}
    timestamp = int(time.time() * 1000)
    metrics_arr = [Metric(key, value, timestamp, 0) for key, value in metrics.items()]

    run_operation = mlflow_client.log_batch(
        run_id=current_run.info.run_id,
        metrics=metrics_arr,
        synchronous=False,
    )

wait() 작업은 메트릭 일괄 처리를 로깅할 때도 사용할 수 있습니다.

run_operation.wait()

메트릭 값에 즉시 액세스할 필요가 없는 경우 루틴에서 wait()을(를) 호출할 필요가 없습니다. Azure Machine Learning은 작업이 완료될 때 자동으로 대기하여 보류 중인 메트릭이 있는지 확인합니다. Azure Machine Learning에서 작업이 완료될 때까지 모든 메트릭이 유지되도록 보장됩니다.

곡선 또는 값 목록 로그

곡선(또는 숫자 값 목록)은 동일한 메트릭을 여러 번 로그하여 MLflow로 로그할 수 있습니다. 다음 예에서는 수행 방법을 보여 줍니다.

list_to_log = [1, 2, 3, 2, 1, 2, 3, 2, 1]
from mlflow.entities import Metric
from mlflow.tracking import MlflowClient
import time

client = MlflowClient()
client.log_batch(mlflow.active_run().info.run_id, 
                 metrics=[Metric(key="sample_list", value=val, timestamp=int(time.time() * 1000), step=0) for val in list_to_log])

이미지 로그

MLflow는 이미지를 로그하는 두 가지 방법을 지원합니다. 두 방법 모두 지정된 이미지를 실행 내부의 아티팩트로 유지합니다.

로그된 값 예제 코드 주의
numpy 메트릭 또는 PIL 이미지 개체 로그 mlflow.log_image(img, "figure.png") imgnumpy.ndarray 또는 PIL.Image.Image의 인스턴스여야 합니다. figure.png는 실행 내부에서 생성되는 아티팩트의 이름입니다. 기존 파일일 필요는 없습니다.
로그 matplotlib 플롯 또는 이미지 파일 mlflow.log_figure(fig, "figure.png") figure.png는 실행 내부에서 생성되는 아티팩트의 이름입니다. 기존 파일일 필요는 없습니다.

로그 파일

일반적으로 MLflow의 파일을 아티팩트라고 합니다. Mlflow에서 여러 가지 방법으로 아티팩트를 기록할 수 있습니다.

로그된 값 예제 코드 주의
텍스트 파일에 텍스트 로그 mlflow.log_text("text string", "notes.txt") 텍스트는 이름이 notes.txt인 텍스트 파일의 실행 내부에 유지됩니다.
사전을 JSON 및 YAML 파일로 로그 mlflow.log_dict(dictionary, "file.yaml" dictionary는 JSON 또는 YAML 파일로 유지하려는 모든 구조를 포함하는 사전 개체입니다.
이미 존재하는 사소한 파일을 로그합니다. mlflow.log_artifact("path/to/file.pkl") 파일은 항상 실행 루트에 로그됩니다. artifact_path가 제공되면 파일은 해당 매개 변수에 표시된 대로 폴더에 로그됩니다.
기존 폴더의 모든 아티팩트 로그 mlflow.log_artifacts("path/to/folder") 폴더 구조는 실행에 복사되지만 표시된 루트 폴더는 포함되지 않습니다.

대용량 파일을 기록하거나log_model, 파일 log_artifact 업로드가 완료되기 전에 시간 제한 오류가 발생할 수 있습니다. 환경 변수 AZUREML_ARTIFACTS_DEFAULT_TIMEOUT를 조정하여 시간 제한 값을 늘리는 것이 좋습니다. 기본값은 300(초)입니다.

모델 로그

MLflow는 지정된 모델이 작동하는 데 필요한 모든 아티팩트를 패키지하는 방법으로 "모델" 개념을 도입합니다. MLflow의 모델은 모델을 생성하는 데 사용된 프레임워크에 따라 항상 임의의 수의 파일이 있는 폴더입니다. 모델 로깅은 모델의 모든 요소를 단일 엔터티로 추적하여 등록한 다음 배포할 수 있는 이점이 있습니다. 또한 MLflow 모델은 코드 없는 배포의 이점을 누리며 Studio에서 책임 있는 AI 대시보드와 함께 사용할 수 있습니다. 자세한 내용은 아티팩트에서 MLflow 모델로 문서를 참조하세요.

학습 실행에서 모델을 저장하려면 작업 중인 프레임워크에 대한 log_model() API를 사용합니다. 예: mlflow.sklearn.log_model(). 자세한 내용은 MLflow 모델 로깅을 참조하세요. 기존 모델을 MLflow로 마이그레이션하려면 사용자 지정 모델을 MLflow로 변환을 참조하세요.

큰 모델을 로그할 때 오류 Failed to flush the queue within 300 seconds가 표시될 수 있습니다. 일반적으로 모델 아티팩트 업로드가 완료되기 전에 작업 시간이 초과됨을 나타냅니다. 환경 변수 AZUREML_ARTIFACTS_DEFAULT_TIMEOUT를 조정하여 시간 제한 값을 늘리는 것이 좋습니다.

자동 로깅

Azure Machine Learning 및 MLflow를 사용하면 사용자는 모델을 학습시킬 때 메트릭, 모델 매개 변수 및 모델 아티팩트를 자동으로 기록할 수 있습니다. 각 프레임워크는 자동으로 추적할 항목을 결정합니다. 널리 사용되는 다양한 기계 학습 라이브러리가 지원됩니다. MLflow를 사용한 자동 로깅에 대해 자세히 알아봅니다.

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

mlflow.autolog()

autolog를 사용하여 자동으로 로그되는 항목을 제어할 수 있습니다. 예를 들어, mlflow.autolog(log_models=False)를 지정하면 MLflow는 모델을 제외한 모든 것을 로그합니다. 이러한 제어는 모델을 수동으로 로그하지만 여전히 메트릭 및 매개 변수의 자동 로깅을 즐기는 경우에 유용합니다. 또한 학습된 모델이 특정 경계를 벗어나는 경우 일부 프레임워크는 모델의 자동 로깅을 사용하지 않도록 설정할 수 있습니다. 이러한 동작은 사용된 버전에 따라 다르며 이 경우 해당 설명서를 보는 것이 좋습니다.

MLflow를 사용하여 작업 또는 실행에 대한 정보 보기

MLflow.entities.Run 개체를 통해 MLflow를 사용하여 기록된 정보를 볼 수 있습니다.

import mlflow

run = mlflow.get_run(run_id="<RUN_ID>")

실행 개체의 데이터 필드에서 실행에 대한 메트릭, 매개 변수 및 태그를 볼 수 있습니다.

metrics = run.data.metrics
params = run.data.params
tags = run.data.tags

참고 항목

mlflow.get_run 또는 mlflow.search_runs에서 반환된 메트릭 사전은 지정된 메트릭 이름에 대해 가장 최근에 로그된 값만 반환합니다. 예를 들어 iteration이라는 메트릭을 값 1, 2, 3, 4로 여러 번 로그하는 경우 run.data.metrics['iteration']을 호출할 때 4만 반환됩니다.

특정 메트릭 이름에 대해 로깅된 모든 메트릭을 가져오려면 실행에서 매개 변수 및 메트릭 가져오기 예제에 설명된 대로 MlFlowClient.get_metric_history()를 사용하면 됩니다.

MLflow는 여러 실행에서 동시에 메트릭 및 매개 변수를 검색할 수 있으므로 여러 평가판에서 빠르게 비교할 수 있습니다. 자세히 알아보려면 MLflow로 실험 및 실행 쿼리 및 비교를 참조하세요.

MLflow는 실행에 의해 로그된 모든 아티팩트를 쿼리할 수 있습니다. 아티팩트는 실행 개체 자체를 사용하여 액세스할 수 없으며 대신 MLflow 클라이언트를 사용해야 합니다.

client = mlflow.tracking.MlflowClient()
client.list_artifacts("<RUN_ID>")

이 방법은 실행에 기록된 모든 아티팩트를 나열하지만 아티팩트 저장소(Azure Machine Learning 스토리지)에 저장된 상태로 유지됩니다. 이들 중 하나를 다운로드하려면 download_artifact 메서드를 사용합니다.

file_path = client.download_artifacts("<RUN_ID>", path="feature_importance_weight.png")

자세한 내용은 메트릭, 매개 변수, 아티팩트 및 모델 가져오기를 참조하세요.

스튜디오에서 작업 또는 실행에 대한 정보 보기

Azure Machine Learning 스튜디오에서 로그된 메트릭을 비롯한 완료된 작업 기록을 찾아볼 수 있습니다.

작업 탭으로 이동합니다. 실험에서 작업 영역의 모든 작업을 보려면 모든 작업 탭을 선택합니다. 위쪽 메뉴 모음에서 실험 필터를 적용하여 특정 실험에 대한 작업을 드릴다운할 수 있습니다. 관심 있는 작업을 선택하여 세부 정보 보기로 들어간 다음, 메트릭 탭을 선택합니다.

로그된 메트릭을 선택하여 오른쪽에 차트를 렌더링합니다. 부드러운 색을 적용하거나, 색을 변경하거나, 단일 그래프에 여러 메트릭을 표시하여 차트를 사용자 지정할 수 있습니다. 레이아웃의 크기를 조정하고 원하는 대로 다시 정렬할 수도 있습니다. 원하는 보기를 만든 후에는 나중에 사용할 수 있도록 저장하고 직접 링크를 사용하여 팀원과 공유할 수 있습니다.

메트릭 보기의 스크린샷.

진단 로그 보기 및 다운로드

로그 파일은 Azure Machine Learning 워크로드를 디버그하는 데 필수적인 리소스입니다. 학습 작업을 제출한 후 특정 실행으로 드릴다운하여 해당 로그 및 출력을 봅니다.

  1. 작업 탭으로 이동합니다.
  2. 특정 실행에 대한 runID를 선택합니다.
  3. 페이지 맨 위에서 출력 및 로그를 선택합니다.
  4. 모두 다운로드를 선택하여 모든 로그를 zip 폴더로 다운로드합니다.
  5. 개별 로그 파일, 다운로드를 차례로 선택하여 개별 로그 파일을 다운로드할 수도 있습니다.

실행에 대한 출력 및 로그 섹션의 스크린샷

user_logs 폴더

이 폴더에는 사용자가 생성한 로그에 대한 정보가 포함되어 있습니다. 이 폴더는 기본적으로 열려 있으며 std_log.txt 로그가 선택됩니다. std_log.txt는 코드의 로그(예: print 문)가 표시되는 위치입니다. 이 파일에는 컨트롤 스크립트 및 학습 스크립트의 stdout 로그와 stderr 로그가 프로세스당 하나씩 포함됩니다. 대부분의 경우 여기에서 로그를 모니터링합니다.

system_logs 폴더

이 폴더에는 Azure Machine Learning에서 생성한 로그가 포함되며 기본적으로 닫힙니다. 시스템에서 생성된 로그는 런타임의 작업 단계에 따라 다른 폴더로 그룹화됩니다.

기타 폴더

다중 컴퓨팅 클러스터에서 학습하는 작업의 경우 IP 노드마다 로그가 있습니다. 각 노드의 구조는 단일 노드 작업과 동일합니다. 전체 실행, stderr 및 stdout 로그에 대한 로그 폴더가 하나 더 있습니다.

Azure Machine Learning은 학습 작업을 실행하는 AutoML이나 Docker 컨테이너와 같이 학습 중에 다양한 원본의 정보를 기록합니다. 이러한 로그는 대부분 문서화되지 않습니다. 문제가 발생하여 Microsoft 지원에 문의하는 경우 이러한 로그를 사용하여 문제를 해결할 수 있습니다.