이번 시간에는 지난 포스트에 이어, MLflow로 Reuable(재사용 가능한) Project를 구성하고 이를 다른 workspace 에서 Reproduce(재현)하는 방안을 진행한다.
개발자 커뮤니티 SQLER.com - Azure Databricks - MLflow를 이용한 머신러닝(1)
개발자 커뮤니티 SQLER.com - Azure Databricks - MLflow를 이용한 머신러닝(2) - Tracking
개발자 커뮤니티 SQLER.com - Azure Databricks - MLflow를 이용한 머신러닝(3) - Project
개발자 커뮤니티 SQLER.com - Azure Databricks - MLflow를 이용한 머신러닝(4) - Model Registry
개발자 커뮤니티 SQLER.com - Azure Databricks - MLflow를 이용한 머신러닝(5) - Model 배포
Azure Databricks - MLflow를 이용한 머신러닝(3) - Project
Run MLflow Projects on Azure Databricks - Azure Databricks | Microsoft Docs 문서의 내용을 참조.
이 포스팅에서 사용되는 전체 코드는 아래 github 리포지토리에서 확인 가능.
CloudBreadPaPa/pyspark-basic: pyspark basic self-study repo (github.com)
Databricks MLflow 실행 준비
이 과정은 이미 누군가 다른 Data Scientist가 이미 머신러닝 트레이닝을 위한 MLflow 코드를 모두 생성한 상태에서 진행하는 것으로 가정한다. 우선 MLflow project 실행을 하고, MLflow 리포지토리의 코드 구조와 내용을 살펴볼 것이다.
Databricks MLflow project 수행을 위한 MLflow 패키지 설치
아래 흐름은 WSL의 Ubuntu bash에서 실행했다. 적절히 Conda 환경을 하나 만들었으며 아래 명령을 수행해 mlflow 패키지를 설치한다.
pip install mlflow
Databricks MLflow cli 설치
Databricks cli 설치는 Databricks CLI - Azure Databricks | Microsoft Docs 링크에서 확인 가능하다.
아래의 pip 명령으로 databricks cli를 설치한다.
pip install databricks-cli
Azure Databricks PAT(Personal Access Token) 토큰 생성
Interactive 방식이 아닌 프로그래밍적인 방식으로 Databricks에 접근하기 위해 인증키를 생성해야 한다. 이 인증키를 Databricks PAT(Personal Access Token) 이라고 부른다. Azure Databricks에서 필요한 PAT는 아래 링크에서 확인 가능하다.
Authentication using Azure Databricks personal access tokens - Azure Databricks | Microsoft Docs
간략히, Setting - User Setting - Access Token - Generate New Token을 수행하면 된다.
이렇게 PAT 생성을 완료한다.
Azure Databricks에서 생성한 token을 environment variable에 추가
bash에서 environment variable을 추가한다.
export DATABRICKS_AAD_TOKEN=<Azure-AD-token>
나는 이후에도 여러 번 사용될 것 같아 "~/.bashrc"에 추가하고 bash 설정을 Reload(source ~/.bashrc) 했다.
Databricks PAT 를 이용한 cli 인증 설정
AAD(Azure Active Directory)인증과 PAT 인증이 있는데, PAT 방식을 수행한다. 아래 명령으로 PAT 인증을 설정한다.
databricks configure --token
바로 이어서 "Databricks Host (should begin with https://):" 이렇게 Databricks host를 묻는다. host명을 넣는다.
내 경우에는 host 이름이 "https://adb-xxxxxxxxxxxxxx.10.azuredatabricks.net"이었다.
실행이 완료되면 설정 정보가 ~/.databrickscfg에 저장된다.
참고로, AAD token 인증은 "databricks configure --aad-token" 명령을 수행한다.
MLflow project 실행
이제 databricks 접근을 위한 설정이 모두 완료되었다. 하지만, project 실행을 위해 몇 가지 작업이 더 필요하다.
MLflow project 실행을 위한 cluster-spec.json 파일 생성
다른 개발자나 Data scientist가 생성한 머신러닝 코드를 내 Workspace에서 실행하라면, 나의 Workspace에 Compute 환경이 필요하다. 어떤 Spark 버전을 사용할 것이며, worker node의 개수나 work node의 크기를 나의 환경에 맞춰 설정해 project 실행 시 자동화해 넣어야 한다. 이 과정이 cluster-spec.json 파일을 만드는 과정이다.
"cluster-spec.json"을 아래와 같이 생성해 저장했다.
{ "spark_version": "9.1.x-scala2.12", "num_workers": 1, "node_type_id": "Standard_DS3_v2" }
코드가 필요하다면 pyspark-basic/cluster-spec.json at main · CloudBreadPaPa/pyspark-basic (github.com) 에서 볼 수 있다.
Databricks 워크스페이스에서 experiment 생성
MLflow를 실행할 Experiment를 Databricks에서 experiment를 생성한다. Workspace 메뉴에서 Create > MLflow Experiment를 수행해 Name부분만 적절히 넣는다. 생성하면, "Experiment ID"가 나온다. 이 ID "번호"를 잘 기록해 둔다.
Tracking URI 환경변수 추가
Environment variable을 추가한다. bash에서 수행하거나, "~/.bashrc"에 추가하고 설정을 다시 reload한다.
export MLFLOW_TRACKING_URI=databricks
MLflow 실행
이제 최종 MLflow project 실행 명령을 수행한다. 필요한 파일들은 pyspark-basic/mlflow-project at main · CloudBreadPaPa/pyspark-basic (github.com) repository에 올려 두었다.
명령 실행 시, 위에서 생성한 "cluster-spec.json" 위치에 유의하고, 마지막 experiment-id 파라미터는 위에서 기록해둔 ID "번호"를 넣는다.
mlflow run https://github.com/CloudBreadPaPa/pyspark-basic#mlflow-project/sklearn_elasticnet_wine -v main -b databricks --backend-config cluster-spec.json --experiment-id 816153742079119
에러 발생 #1
mlflow.exceptions.RestException: INVALID_PARAMETER_VALUE: experiment_id parameter must be a long, found 'ID81615xxxxxxxx
마지막 Experiment ID 파라미터는 숫자만 들어가야 한다. 오류가 발생하면 확인하고 Experiment ID "번호"를 넣는다.
에러 발생 #2
AttributeError: 'IterableList' object has no attribute 'origin/master'
-v 옵션으로 branch를 설정한다. 아마도 기본이 master branch인것 같다.
Can't use `mlflow run` with git branch feature · Issue #2933 · mlflow/mlflow (github.com)
위의 설정을 수행하고 github의 repo에 올려 놓은 코드를 mlflow로 나의 workspace에서 실행할 수 있었다.
2021/10/08 06:48:51 INFO mlflow.projects.utils: === Fetching project from https://github.com/CloudBreadPaPa/pyspark-basic#mlflow-project/sklearn_elasticnet_wine into /tmp/tmpmhu5euc5 ===
2021/10/08 06:48:57 INFO mlflow.projects.databricks: === Uploading project to DBFS path /dbfs/mlflow-experiments/816153742079119/projects-code/84ed65ffdf90dc74f1fee7a4d3cb58bc7f6843fab2ef7bb5a16152b7ffdd5da4.tar.gz ===
2021/10/08 06:48:57 INFO mlflow.projects.databricks: === Finished uploading project to /dbfs/mlflow-experiments/816153742079119/projects-code/84ed65ffdf90dc74f1fee7a4d3cb58bc7f6843fab2ef7bb5a16152b7ffdd5da4.tar.gz ===
2021/10/08 06:48:57 INFO mlflow.projects.databricks: === Running entry point main of project https://github.com/CloudBreadPaPa/pyspark-basic#mlflow-project/sklearn_elasticnet_wine on Databricks ===
2021/10/08 06:48:58 INFO mlflow.projects.databricks: === Launched MLflow run as Databricks job run with ID 36. Getting run status page URL... ===
2021/10/08 06:48:58 INFO mlflow.projects.databricks: === Check the run's status at https://adb-xxxxxxxx.10.azuredatabricks.net/?o=xxxxxxxxxxx#job/45/run/1 ===
수행하면 이런 결과를 확인할 수 있다. 맨 마지막 라인의 링크를 보면 현재 Run을 바로 Job으로 확인 가능하다.
아래와 같은 화면을 볼 수 있다.
Experiment를 확인하면, 이렇게 Run이 완료되고 로깅된 것을 확인할 수 있다.
MLflow 코드 구조
이렇게 기본적인 MLflow Project실행 패턴을 확인했다. 간략히 databricks를 위한 mlflow cli를 구성하고 cli 명령을 수행해 Reusable(재사용 가능한) Project를 구성하고 이를 Reproduce(재현)하는 방안을 진행한다.
그렇다면, 이제 MLflow Project 코드들을 살펴보자. "Reusable" MLflow Project 코드는 아래 경로에 위치하고, 우리는 이 코드들을 이용해 project를 수행했다.
conda.yaml 파일
Conda Environment 설정 파일. MLflow는 Project를 실행할 때 이 Conda 설정을 이용한다.
name: tutorial channels: - conda-forge dependencies: - python=3.6 - pip - pip: - scikit-learn==0.23.2 - mlflow>=1.0 - pandas
MLproject 파일
MLflow project의 설정을 저장한다.
name: tutorial conda_env: conda.yaml entry_points: main: parameters: alpha: {type: float, default: 0.5} l1_ratio: {type: float, default: 0.1} command: "python train.py {alpha} {l1_ratio}"
".py" 또는 ".sh" 파일
이 파일이 MLflow project의 entry point(진입포인트)가 될 수 있다. 명령 수행 시 파라미터 세트를 설정하면, MLflow는 개별 파라미터를 "--key" 파라미터로 전달할 수 있다.
train.py 파일
리포지토리 코드의 "train.py" 파일은 익숙한 wine quality 데이터를 이용하는 머신러닝 예제이다. MLproject를 통해 시작된다. train.py 내부에서는 아래와 같이 argument를 받아서 처리한다.
... alpha = float(sys.argv[1]) if len(sys.argv) > 1 else 0.5 l1_ratio = float(sys.argv[2]) if len(sys.argv) > 2 else 0.5 ...
지난 포스팅에서 진행한 MLflow tracking - logging을 이용해 parameter와 metric을 로깅한다. 이어서, MLflow model registration을 수행한다.
mlflow.log_param("alpha", alpha) mlflow.log_param("l1_ratio", l1_ratio) mlflow.log_metric("rmse", rmse) mlflow.log_metric("r2", r2) mlflow.log_metric("mae", mae) # Model registry does not work with file store if tracking_url_type_store != "file": # Register the model # There are other ways to use the Model Registry, which depends on the use case, # please refer to the doc for more information: # https://mlflow.org/docs/latest/model-registry.html#api-workflow mlflow.sklearn.log_model(lr, "model", registered_model_name="ElasticnetWineModel") else: mlflow.sklearn.log_model(lr, "model")
이렇게 MLproject, conda.yaml, train.py가 유기적으로 조합되어 Databricks의 머신러닝 프로젝트를 Reusable 하게 구성할 수 있게 된다.
이 컨셉은 잘 기억해 둘 필요가 있다.
Databricks는 3대 클라우드를 모두 지원한다. Azure, AWS, GCP 모두 Databricks를 지원하며, de facto standard 수준의 Spark 기술과 분산 병렬 처리 기술을 리딩하고 있으며, 회사 구조를 보면 웬만한 tech 기업 수준의 규모를 넘어서는 공룡(스타트업) 기업이다.
Databricks raises $1.6B at $38B valuation as it blasts past $600M ARR | TechCrunch
MLflow는 기업의 머신러닝 도입에서 훌륭한 "portability"를 제공한다. Kubernetes처럼. 필요하다면, 클라우드 벤더 독립적으로 코드를 재사용해 머신러닝 트레이닝 과정을 수행 가능하다. 각각의 클라우드 벤더들 역시 MLaaS 서비스로 Azure는 AzureML, AWS에서는 SageMaker, GCP는 Vertex AI를 제공하며 각각의 Cloud dependency와 편의성을 빠르게 높이고 있다.
MLaaS 에서 클라우드 벤더 독립적인 portability 제공에 이 MLflow project가 그 중심적인 역할을 수행하는 것은 더 말할 필요가 없겠다. Databricks & MLOps에서 사용되는 부분은 이후에 포스팅을 진행하면서 정리 예정.
참고링크
개발자 커뮤니티 SQLER.com - Azure Databricks - MLflow를 이용한 머신러닝(1)
개발자 커뮤니티 SQLER.com - Azure Databricks - MLflow를 이용한 머신러닝(2) - Tracking
개발자 커뮤니티 SQLER.com - Azure Databricks - MLflow를 이용한 머신러닝(3) - Project
개발자 커뮤니티 SQLER.com - Azure Databricks - MLflow를 이용한 머신러닝(4) - Model Registry
개발자 커뮤니티 SQLER.com - Azure Databricks - MLflow를 이용한 머신러닝(5) - Model 배포
Run MLflow Projects on Azure Databricks - Azure Databricks | Microsoft Docs
Databricks CLI - Azure Databricks | Microsoft Docs
Authentication using Azure Databricks personal access tokens - Azure Databricks | Microsoft Docs
mlflow/mlflow: Open source platform for the machine learning lifecycle (github.com)
Command-Line Interface — MLflow 1.20.2 documentation