Azure Machine Learning에서 MLflow로 Azure Databricks ML 실험 추적

MLflow는 기계 학습 실험의 수명 주기를 관리하기 위한 오픈 소스 라이브러리입니다. MLflow를 사용하여 Azure Databricks를 Azure Machine Learning과 통합하여 두 제품 모두에서 최상의 결과를 얻을 수 있습니다.

이 문서에서는 다음에 대해 알아봅니다.

필수 조건

예제 Notebook

Azure Databricks에서 모델 학습 및 Azure Machine Learning에 배포는 Azure Databricks에서 모델을 학습하고 Azure Machine Learning에 배포하는 방법을 보여 줍니다. 또한 Azure Databricks에서 MLflow 인스턴스를 사용하여 실험 및 모델을 추적하고, Azure Machine Learning을 배포에 활용하려는 경우 이를 처리하는 방법도 보여줍니다.

라이브러리 설치

클러스터에 라이브러리를 설치하려면 라이브러리 탭으로 이동하여 새로 설치를 선택합니다.

mlflow with azure databricks

패키지 필드에 azureml-mlflow를 입력한 다음, 설치를 선택합니다. 필요에 따라 이 단계를 반복하여 실험을 위한 클러스터에 다른 추가 패키지를 설치합니다.

Azure DB install mlflow library

MLflow를 사용하여 Azure Databricks 실행 추적

Azure Databricks는 두 가지 방법으로 MLflow를 사용하여 실험을 추적하도록 구성할 수 있습니다.

기본적으로 이중 추적은 Azure Databricks 작업 영역을 연결할 때 구성됩니다.

Azure Databricks 및 Azure Machine Learning의 이중 추적

ADB 작업 영역을 Azure Machine Learning 작업 영역에 연결하면 Azure Machine Learning 작업 영역 및 Azure Databricks 작업 영역에서 동시에 실험 데이터를 추적할 수 있습니다. 이를 이중 추적이라고 합니다.

Warning

Azure Machine Learning 작업 영역이 활성화된 프라이빗 링크의 이중 추적은 현재 지원되지 않습니다. 대신 Azure Machine Learning 작업 영역을 사용하여 단독 추적을 구성합니다.

Warning

현재 21Vianet에서 운영하는 Microsoft Azure에서는 이중 추적이 지원되지 않습니다. 대신 Azure Machine Learning 작업 영역을 사용하여 단독 추적을 구성합니다.

ADB 작업 영역을 신규 또는 기존 Azure Machine Learning 작업 영역에 연결하려면

  1. Azure 포털에 로그인합니다.
  2. ADB 작업 영역의 개요 페이지로 이동합니다.
  3. 오른쪽 아래에 있는 Azure Machine Learning 작업 영역 연결 단추를 선택합니다.

Link Azure DB and Azure Machine Learning workspaces

Azure Databricks 작업 영역을 Azure Machine Learning 작업 영역에 연결하면 MLflow 추적이 다음과 같은 모든 위치에서 자동으로 추적되도록 설정됩니다.

  • 연결된 Azure Machine Learning 작업 영역
  • 원래 ADB 작업 영역

Azure Databricks에서 원래 사용했던 것과 동일한 방식으로 MLflow를 사용할 수 있습니다. 다음 예제에서는 일반적으로 Azure Databricks에서 수행되고 일부 매개 변수 로깅을 시작하므로 실험 이름을 설정합니다.

import mlflow 

experimentName = "/Users/{user_name}/{experiment_folder}/{experiment_name}" 
mlflow.set_experiment(experimentName) 

with mlflow.start_run():
   mlflow.log_param('epochs', 20)
   pass

참고 항목

추적과 반대로 모델 레지스트리는 Azure Machine Learning 및 Azure Databricks에서 동시에 모델 등록을 지원하지 않습니다. 둘 중 하나만 사용해야 합니다. 자세한 내용은 MLflow를 사용하여 레지스트리에 모델 등록 섹션을 참조하세요.

Azure Machine Learning 작업 영역에서만 추적

중앙 위치에서 추적된 실험을 관리하려는 경우 Azure Machine Learning 작업 영역에서만 추적하도록 MLflow 추적을 설정할 수 있습니다. 이 구성은 Azure Machine Learning 배포 옵션을 사용하여 더 쉬운 배포 경로를 사용하도록 설정할 수 있다는 장점이 있습니다.

다음 예제에 나와 있는 것처럼 Azure Machine Learning만 가리키도록 MLflow 추적 URI를 구성해야 합니다.

추적 URI 구성

  1. 작업 영역의 추적 URI를 가져옵니다.

    적용 대상:Azure CLI ml 확장 v2(현재)

    1. 다음과 같이 작업 영역에 로그인하고 구성합니다.

      az account set --subscription <subscription>
      az configure --defaults workspace=<workspace> group=<resource-group> location=<location> 
      
    2. az ml workspace 명령을 사용하여 추적 URI를 가져올 수 있습니다.

      az ml workspace show --query mlflow_tracking_uri
      
  2. 추적 URI 구성:

    그런 다음, 메서드 set_tracking_uri()는 MLflow 추적 URI로 해당 URI를 가리킵니다.

    import mlflow
    
    mlflow.set_tracking_uri(mlflow_tracking_uri)
    

    Azure Databricks 클러스터, Azure Synapse Analytics 클러스터 등과 같은 공유 환경에서 작업하는 경우 클러스터 수준에서 MLFLOW_TRACKING_URI 환경 변수를 설정하여 세션별로 수행하지 않고 클러스터에서 실행되는 모든 세션에 대해 Azure Machine Learning을 가리키도록 MLflow 추적 URI를 자동으로 구성하는 것이 유용합니다.

    Configure the environment variables in an Azure Databricks cluster

    환경 변수가 구성되면 해당 클러스터에서 실행 중인 모든 실험이 Azure Machine Learning에서 추적됩니다.

인증 구성

추적이 구성되면 연결된 작업 영역에서 인증을 수행하는 방법도 구성해야 합니다. 기본적으로 MLflow용 Azure Machine Learning 플러그 인은 기본 브라우저를 열고 자격 증명을 묻는 메시지를 표시하여 대화형 인증을 수행합니다. Azure Machine Learning 작업 영역에서 MLflow에 대한 인증을 구성하는 추가 방법은 Azure Machine Learning용 MLflow 구성: 인증 구성을 참조하세요.

세션에 연결된 사용자가 있는 대화형 작업의 경우 대화형 인증을 사용할 수 있으므로 추가 작업이 필요하지 않습니다.

Warning

대화형 브라우저 인증은 자격 증명을 묻는 메시지를 표시할 때 코드 실행을 차단합니다. 학습 작업과 같은 무인 환경에서의 인증에는 적합한 옵션이 아닙니다. 다른 인증 모드를 구성하는 것이 좋습니다.

무인 실행이 필요한 시나리오의 경우 Azure Machine Learning과 통신하도록 서비스 주체를 구성해야 합니다.

import os

os.environ["AZURE_TENANT_ID"] = "<AZURE_TENANT_ID>"
os.environ["AZURE_CLIENT_ID"] = "<AZURE_CLIENT_ID>"
os.environ["AZURE_CLIENT_SECRET"] = "<AZURE_CLIENT_SECRET>"

공유 환경에서 작업할 때 컴퓨팅에서 이러한 환경 변수를 구성하는 것이 좋습니다. 가능한 경우 Azure Key Vault 인스턴스에서 비밀로 관리하는 것이 좋습니다. 예를 들어 Azure Databricks에서는 다음과 같이 클러스터 구성의 환경 변수에서 비밀을 사용할 수 있습니다. AZURE_CLIENT_SECRET={{secrets/<scope-name>/<secret-name>}} Azure Databricks에서 비밀을 수행하는 방법은 환경 변수에서 비밀 참조를 참조하거나 플랫폼에서 유사한 설명서를 참조하세요.

Azure Machine Learning에서 실험의 이름

MLflow가 Azure Machine Learning 작업 영역에서만 실험을 추적하도록 구성된 경우 실험의 명명 규칙은 Azure Machine Learning이 사용하는 규칙을 따라야 합니다. Azure Databricks에서 실험의 이름은 실험이 저장되는 경로를 사용하여 지정됩니다(예: /Users/alice@contoso.com/iris-classifier). 그러나 Azure Machine Learning에서는 실험 이름을 직접 제공해야 합니다. 이전 예제와 마찬가지로 동일한 실험에 iris-classifier라는 이름이 직접 지정됩니다.

mlflow.set_experiment(experiment_name="experiment-name")

추적 매개 변수, 메트릭 및 아티팩트

Azure Databricks에서 원래 사용했던 것과 동일한 방식으로 MLflow를 사용할 수 있습니다. 자세한 내용은 메트릭 및 로그 파일 로그 및 보기를 참조하세요.

MLflow를 사용하여 모델 로그

모델이 학습되면 mlflow.<model_flavor>.log_model() 메서드를 사용하여 추적 서버에 모델을 로그할 수 있습니다. <model_flavor>는 모델과 연결된 프레임워크를 나타냅니다. 지원되는 모델 종류에 대해 알아봅니다. 다음 예제에서는 Spark 라이브러리 MLLib로 만든 모델이 등록됩니다.

mlflow.spark.log_model(model, artifact_path = "model")

여기서 짚고 넘어가야 할 부분은 spark 버전은 Spark 클러스터에서 모델을 학습시키지 않지만 사용된 학습 프레임워크 때문에 Spark와 TensorFlow를 사용하여 모델을 완벽하게 학습시킬 수 있으므로 tensorflow 버전을 사용하는 것입니다.

모델은 추적 중인 실행 내부에 로그됩니다. 즉, Azure Databricks 및 Azure Machine Learning(기본값)에서 또는 Azure Machine Learning에서 단독으로 모델을 사용할 수 있습니다(이를 가리키도록 추적 URI를 구성한 경우).

Important

여기서는 registered_model_name 매개 변수가 지정되지 않았습니다. 이러한 매개 변수의 의미 및 레지스트리 작동 방식에 대한 자세한 내용은 MLflow를 사용하여 레지스트리에 모델 등록 섹션을 참조하세요.

MLflow를 사용하여 레지스트리에 모델 등록

추적과 반대로 모델 레지스트리는 Azure Databricks 및 Azure Machine Learning에서 동시에 작동할 수 없습니다. 둘 중 하나만 사용해야 합니다. 기본적으로 Azure Databricks 작업 영역이 모델 레지스트리에 사용됩니다. Azure Machine Learning 작업 영역에서만 추적하도록 MLflow 추적 설정을 선택하지 않은 경우 모델 레지스트리는 Azure Machine Learning 작업 영역입니다.

그리고 기본 구성을 사용하는 경우 다음 줄은 Azure Databricks 및 Azure Machine Learning 모두의 해당 실행 내에 모델을 로그하지만 Azure Databricks에만 모델을 등록합니다.

mlflow.spark.log_model(model, artifact_path = "model", 
                       registered_model_name = 'model_name')  
  • 이름이 있는 등록 모델이 없는 경우 이 메서드는 새 모델을 등록하고, 버전 1을 만들고, ModelVersion MLflow 개체를 반환합니다.

  • 이름이 있는 등록 모델이 이미 있는 경우 이 메서드는 새 모델 버전을 만들고 버전 개체를 반환합니다.

MLflow에서 Azure Machine Learning 레지스트리 사용

Azure Databricks 대신 Azure Machine Learning 모델 레지스트리를 사용하려는 경우 Azure Machine Learning 작업 영역에서만 추적하도록 MLflow 추적을 설정하는 것이 좋습니다. 이렇게 하면 모델이 등록되는 위치의 모호성이 제거되고 복잡성이 단순화됩니다.

그러나 이중 추적 기능을 계속 사용하되 모델을 Azure Machine Learning에 등록하려면 MLflow 모델 레지스트리 URI를 구성하여 모델 레지스트리에 Azure Machine Learning을 사용하도록 MLflow에 지시할 수 있습니다. 이 URI는 MLflow 추적 URI와 정확히 동일한 형식 및 값을 사용합니다.

mlflow.set_registry_uri(azureml_mlflow_uri)

참고 항목

azureml_mlflow_uri 값은 Azure Machine Learning 작업 영역에서만 추적하도록 MLflow 추적 설정에서 설명한 것과 동일한 방식으로 가져왔습니다.

이 시나리오에 대한 전체 예제는 Azure Databricks에서 모델을 학습시키고 Azure Machine Learning에 배포 예제를 참조하세요.

Azure Machine Learning에서 등록된 모델 배포 및 사용

MLflow를 통해 Azure Machine Learning Service에 등록된 모델을 다음과 같이 사용할 수 있습니다.

  • Azure Machine Learning 엔드포인트(실시간 및 일괄 처리): 이 배포를 사용하면 ACI(Azure Container Instances), AKS(Azure Kubernetes) 또는 Managed Inference 엔드포인트에서 실시간 및 일괄 처리 유추 모두에 Azure Machine Learning 배포 기능을 활용할 수 있습니다.

  • 스트리밍 또는 일괄 처리 파이프라인의 Azure Databricks Notebook에서 사용할 수 있는 MLFlow 모델 개체 또는 Pandas UDF.

Azure Machine Learning 엔드포인트에 모델 배포

azureml-mlflow 플러그 인을 활용하여 Azure Machine Learning 작업 영역에 모델을 배포할 수 있습니다. 다양한 대상에 모델을 배포하는 방법에 대한 자세한 내용은 MLflow 모델을 배포하는 방법 페이지를 참조하세요.

Important

모델을 배포하려면 Azure Machine Learning 레지스트리에 등록해야 합니다. 모델이 Azure Databricks 내의 MLflow 인스턴스에 등록된 경우 Azure Machine Learning에 다시 등록해야 합니다. 이 경우 Azure Databricks에서 모델을 학습시키고 Azure Machine Learning에 배포 예제를 확인하세요.

UDF를 사용한 일괄 처리 채점을 위해 ADB에 모델 배포

일괄 처리 점수 매기기를 위해 Azure Databricks 클러스터를 선택할 수 있습니다. Mlflow를 활용하여 연결된 레지스트리에서 모델을 확인할 수 있습니다. 일반적으로 다음 두 가지 방법 중 하나를 사용합니다.

  • 모델을 Spark 라이브러리(예: MLLib)로 학습 및 빌드한 경우 mlflow.pyfunc.spark_udf를 사용하여 모델을 로드하고 이를 Spark Pandas UDF로 사용하여 새 데이터의 점수를 매깁니다.
  • 모델이 Spark 라이브러리를 사용하여 학습되거나 빌드되지 않은 경우 mlflow.pyfunc.load_model 또는 mlflow.<flavor>.load_model을 사용하여 클러스터 드라이버에 모델을 로드합니다. 이러한 방식으로 클러스터에서 수행하려는 모든 병렬화 또는 작업 배포는 사용자가 오케스트레이션해야 합니다. 또한 MLflow는 모델을 실행하는 데 필요한 라이브러리를 설치하지 않습니다. 이러한 라이브러리는 클러스터를 실행하기 전에 클러스터에 설치해야 합니다.

다음 예제에서는 uci-heart-classifier라는 레지스트리에서 모델을 로드하고 이를 Spark Pandas UDF로 사용하여 새 데이터의 점수를 매기는 방법을 보여 줍니다.

from pyspark.sql.types import ArrayType, FloatType 

model_name = "uci-heart-classifier"
model_uri = "models:/"+model_name+"/latest"

#Create a Spark UDF for the MLFlow model 
pyfunc_udf = mlflow.pyfunc.spark_udf(spark, model_uri) 

레지스트리에서 모델을 참조하는 더 많은 방법은 레지스트리에서 모델 로드를 확인하세요.

모델이 로드되면 다음을 사용하여 새 데이터의 점수를 매길 수 있습니다.

#Load Scoring Data into Spark Dataframe 
scoreDf = spark.table({table_name}).where({required_conditions}) 

#Make Prediction 
preds = (scoreDf 
           .withColumn('target_column_name', pyfunc_udf('Input_column1', 'Input_column2', ' Input_column3', …)) 
        ) 

display(preds) 

리소스 정리

Azure Databricks 작업 영역을 유지하려 하지만 더 이상 Azure Machine Learning 작업 영역이 필요하지 않은 경우 Azure Machine Learning 작업 영역을 삭제할 수 있습니다. 이 작업을 수행하면 Azure Databricks 작업 영역과 Azure Machine Learning 작업 영역의 연결이 해제됩니다.

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

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

    Delete in the Azure portal

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

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

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

다음 단계