간략히, Azure Databricks에서 MLOps를 구현한 케이스를 리뷰하고, 실제 구현 코드를 살펴보기 위한 포스팅.
Azure Databricks MLOps 코드는 아래 Github Repository의 내용으로 리뷰
Azure Databricks와 MLOps
Azure Databricks는 Spark 코어를 사용해 훌륭한 머신러닝 분산 트레이닝 과정을 수행할 수 있으며, MLflow를 활용해 머신러닝 프로젝트의 전체 라이프사이클을 관리할 수 있다. AzureML로 여러 MLOps 프로젝트를 진행하였으며, Databricks에서는 이런 MLOps를 어떻게 구축하는지 실제 코드와 실행 패턴을 살펴보고 리뷰한다.
Databricks MLOps 아키텍처
머신러닝 Training 아키텍처와 Batch scoring 아키텍처로 구성된다. Batch scoring 부분은 Training이 완료된 머신러닝 모델을 MLflow Model Registry로부터 가져와 진행하게 된다.
MLOps 경험이 있다면 알겠지만, 어플리케이션 개발자와 협업해 시너지를 내기 위한 CI(일부만 존재)/CD 부분이나 Serving 모듈이 없다. 일반적으로 Databricks-Spark을 이용하는 Batch scoring이 목표이지 실시간 Serving이 목표가 아니기 때문이다. 이부분을 염두에 두고 리뷰하자.
Azure Databricks MLOps 실행
진행하면서 여러 오류로 시행착오가 있었다. 관련 부분도 문서에 추가해 두었다.
특이하게 대부분의 코드를 make로 bash를 모듈화 했으며, 코드 배포는 Python wheel package로 만들어 처리한다. Databricks가 권장하는 방안인지 정확치 않다.
Repository Clone 및 make 수행
전체 과정은 모두 WSL의 Ubuntu에서 수행했다.
- github repository clone 수행
git clone https://github.com/Azure-Samples/azure-databricks-mlops-mlflow.git
- make 수행
Python 3.8+ Conda 환경을 하나 생성하고 수행하였다. 혹시 make 과정에서 matplotlib 이 없다는 오류가 나오면 "pip install matplotlib" 으로 추가하고 다시 수행한다.
cd azure-databricks-mlops-mlflow make install make dist
추가적으로, make test하면 flake8 lint 및 coverage로 unit test를 수행한다.
Azure resource 생성 - ARM template
Azure ARM template script를 제공해 스크립트로 설치한다. az cli 설치 관련해서는 아래 링크를 참조한다.
개발자 커뮤니티 SQLER.com - Azure cli - command line interface 명령줄 인터페이스 도구를 쓰는 이유와 방법
ARM template 파일은 "ml_ops/deployment/arm_templates/databricks_and_storage.json" 경로에 위치한다.
# azure에 interactive login수행 az login # resource group 생성 # az group create --name <리소스그룹이름> --location <지역> az group create --name rg-dbmlops02 --location koreacentral # ARM script를 이용해 리소스 배포 az deployment group create --resource-group rg-dbmlops02 --template-file ./ml_ops/deployment/arm_templates/databricks_and_storage.json
Databricks cli로 설정 수행
- Databricks cli 설치
Databricks CLI - Azure Databricks | Microsoft Docs 문서를 참조해 아래 명령으로 Databricks cli를 설치한다.
pip install databricks-cli
Databricks에서 PAT(Personal Access Token)를 생성해 잘 기록해 둔다.
Authentication using Azure Databricks personal access tokens - Azure Databricks | Microsoft Docs
- Authentication을 수행
# Databricks URI와 PAT를 입력 make databricks-authenticate
Azure에서 ARM Template 스크립트로 생성한 Databricks에 접속하면 Databricks Workspace URI를 볼 수 있다. 아래와 같은 패턴이다.
- https://adb-XXXXXXXXXXX.azuredatabricks.net/
PAT는 조금 전에 생성한 PAT를 입력한다.
- Databricks init 과정 수행
make databricks-init
수행하면, Databricks에 Cluster, Workspace, Experiment, secret scope 등을 구성한다.
참고: jq가 없을 경우 오류가 발생한다.
/bin/bash: line 10: jq: command not found
jq가 없을 경우 아래 명령으로 설치하고 수행한다. (Ubuntu 기준)
sudo curl -L -o /usr/bin/jq https://github.com/stedolan/jq/releases/download/jq-1.6/jq-linux64 sudo chmod +x /usr/bin/jq
jq 프로젝트 Github의 Release에 여러 OS용 버전이 제공된다. 자신의 OS에 맞는 jq를 설치한다.
저장소 - Azure Data Lake Storage Gen2 구성
ARM Template 스크립트로 생성한 리소스 그룹의 Storage를 열고, Storage account name과 key를 가져와 명령 실행에 사용한다.
Storage account name과 key를 확인하는 방법은 아래 문서 참조.
Manage account access keys - Azure Storage | Microsoft Docs
- Blob storage에 "diabetes" container 생성 cli 명령
az storage container create -n diabetes --account-name <STORAGE_ACCOUNT_NAME> --account-key <STORAGE_ACCOUNT_KEY>
조금 전 확인한 Name과 Key를 입력해 수행한다.
- Diabetes container에 파일 업로드 cli 명령
data_batch_input.csv 파일과 data_raw.csv 파일 두개를 diabetes container에 업로드한다.
az storage blob upload \ --account-name <STORAGE_ACCOUNT_NAME> \ --account-key <STORAGE_ACCOUNT_KEY> \ --container-name diabetes \ --name data_batch_input.csv \ --file ./ml_data/data_batch_input.csv az storage blob upload \ --account-name <STORAGE_ACCOUNT_NAME> \ --account-key <STORAGE_ACCOUNT_KEY> \ --container-name diabetes \ --name data_raw.csv \ --file ./ml_data/data_raw.csv
- Databricks에 storage account "shared key"(storage account key와 같다)를 secret scope에 추가
make databricks-secrets-put
storage account key를 입력한다.
- Application Insight Key 추가
어플리케이션 로깅에 사용될 Application Insight Key(Instrumental Key)를 추가한다.
Azure 리소스 그룹을 확인하면, ARM Template 스크립트로 자동 생성된 Application Insight이 있다. 이곳에서 Instrumental Key를 볼 수 있다.
make databricks-add-app-insights-key
Azure Databricks로 코드 배포 후 머신러닝 Training / Scoring 수행
- 생성했던 패키지 코드를 Azure Databricks로 배포
make deploy
- Databricks에서 training 작업 수행
make run-diabetes-model-training
명령을 수행하면, 수행 중인 run의 링크가 나온다. 또는 Azure Databricks Workspace의 Experiment에서 Run을 볼 수 있다.
MLOps orchestration으로 수행되는 diabetes training 코드는 이곳에서 확인할 수 있다.
- Databricks에서 batch scoring 작업 수행
make run-diabetes-batch-scoring
마찬가지로, scoring 과정 수행 중인 run을 볼 수 있다. 위의 training 과정이 완료된 후 수행해야 한다. Batch scoring 코드는 이곳에서 볼 수 있다.
Data scientist를 위한 MLOps - CI/CD 없음
이렇게 간략히, Azure Databricks MLOps 프로젝트를 살펴보았다.
Data scientist 입장에서 좋은 흐름과 MLOps 과정을 진행하지만, 어플리케이션 개발팀과 함께 시너지를 내어 model과 코드를 배포하는 과정이 아닌, 일반적인 batch scoring을 목표로 하는 코드이다. 그렇다 보니, 개발자와 협업이 필요한 CI/CD 부분과 model serving을 위한 deployment 부분이 없다.
Batch scroing 아키텍처 - Training이 완료되어 MLflow Model Registry에 publish된 모델을 Load해 Batch Scoring을 수행한다.
다음 포스팅에서는 다른 Databricks MLOps repository를 살펴보고, Azure Databricks와 MLflow를 활용해 serving까지 진행하는 코드를 살펴보도록 하겠다.
참고자료
개발자 커뮤니티 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 배포