이번 포스팅에서는 AzureML(Azure Machine Learning, 이하 AzureML)에 대해서 소개하고 간략히 코드로 training을 수행.
(2) AzureML - Azure Machine Learning 이란 무엇인가?
공식 가이드 내용 먼저 살펴보자.
Azure Machine Learning is a cloud service for accelerating and managing the machine learning project lifecycle. Machine learning professionals, data scientists, and engineers can use it in their day-to-day workflows: Train and deploy models, and manage MLOps.
What is Azure Machine Learning? - Azure Machine Learning | Microsoft Docs
AzureML은 머신러닝 프로젝트 라이프사이클을 빠르게 구현하고 관리하기 위한 클라우드 서비스이다.
머신러닝 전문가와 data scientist, 개발자가 자신의 업무 workflow에 적용할 수 있고, 머신러닝 모델 트레이닝, 모델 배포, MLOps 관리에 적용 가능하다.
만약 처음 이런 MLaaS와 MLOps를 접한다면 잘 감이 잡히지 않을 수 있다. 차근차근 코드를 통해 살펴보고, 이후 MLOps 내용까지 진행 예정.
최초 환경 구성
여러가지 방법이 있다. "AzureML Studio의 노트북을 이용해라, DSVM이 좋다", 등등.
이 문서에서는 아무 구성도 되지 않은 WSL ubuntu에서 최초 conda 환경부터 차근차근 구성하고 notebook을 실행해 AzureML을 바닥부터 수행하는 것을 목표로 진행한다.
만약 conda나 기본 머신러닝에 대한 강좌가 필요하다면, 아래 강좌를 참고.
개발자 커뮤니티 SQLER.com - Python 무료 강좌 - 기초, 중급, 머신러닝(2021년 1월 업데이트)
Python, notebook 환경 설정
아래 명령을 수행해 conda 환경을 생성하고, AzureML에 필요한 package들을 구성한다.
conda create -n azureml python=3.8 conda activate azureml conda install jupyter pip install sklearn pip install seaborn # 개인적인 선호. 여러 NumPy, Pandas 등의 package들을 자동 설치해 준다. pip install azureml-core pip install azureml-opendatasets
환경 구성 참고 링크
Install the Azure Machine Learning SDK for Python - Azure Machine Learning Python | Microsoft Docs
위 문서에서는 azureml-core 설치 후 구성이 진행된다, 추가 구성이 필요할 경우 포스트에서 진행하고, "azureml-sdk"를 설치하는 것도 한 방법이다.
Azure 포털에서 AzureML 리소스 생성
Quickstart: Create workspace resources - Azure Machine Learning | Microsoft Docs
이렇게 포털에서 AzureML workspace를 생성 가능. 물론 Azure cli나 AzureML Python SDK, terraform도 가능하다.
예제 노트북 코드 repository clone수행
AzureML tutorial code clone 수행
git clone https://github.com/Azure/MachineLearningNotebooks.git
Jupyter notebook을 실행
jupyter notebook # 또는, 특정 port 및 외부 IP 접근을 허용할 경우 - OS차원에서 방화벽 오픈 확인. jupyter notebook --ip=0.0.0.0 --port=8080
Clone된 repository에서 노트북은 이 노트북을 열고 진행한다.
tutorials/create-first-ml-experiment/tutorial-1st-experiment-sdk-train.ipynb
AzureML Workspace 연결 구성
대부분의 예제와 노트북이 이미 AzureML workspace가 생성되어 있고, write_config()가 완료된 상태에서 시작한다.
그래서 대부분 "ws = Workspace.from_config()" 이렇게 처리되어 있다. 즉, 우리도 최초 한번 write_config()를 수행해야 한다.
우리는 이미 위에서 AzureML workspace를 생성하였다. 다음 코드로 ws.write_config() 을 수행하면 된다.
# 일반적인 workspace 접근 방안 from azureml.core import Workspace subscription_id = '<subscription-id>' resource_group = '<resource-group>' workspace_name = '<workspace-name>' ws = Workspace( subscription_id=subscription_id, resource_group=resource_group, workspace_name=workspace_name ) ws.write_config('~/')
write_config('~/')를 home 디렉토리로 구성하면, 이후 다른 디렉토리에 config를 구성하였더라도, 자동으로 from_config()를 수행하면, 상위 디렉토리로 올라가면서 config를 찾아 읽는다. AzureML config 파일은 "~/.azureml/config.json" 파일로 저장된다.
만약, 다른 tenent의 구독(다른 AD 디렉토리의 구독)에 로그인하려면, 아래처럼, 추가 설정이 필요하다.
# 다른 tenent에 속한 구독의 AzureML에 연결할 경우 from azureml.core.authentication import InteractiveLoginAuthentication interactive_auth = InteractiveLoginAuthentication(tenant_id="my-tenant-id") ws = Workspace(subscription_id="my-subscription-id", resource_group="my-ml-rg", workspace_name="my-ml-workspace", auth=interactive_auth)
이외에도 Service Principal을 이용하는 로그인 등 다양한 방법이 있다. 관련 내용은 다양한 AzureML workspace 인증 방안 노트북을 참조한다.
노트북의 코드 수행
Workspace 설정
workspace가 무엇인지 지금은 중요치 않다. AzureML의 인스턴스라고 생각하고 우선 코드를 수행하자. 이렇게 workspace를 설정한다.
from azureml.core import Workspace ws = Workspace.from_config()
Experiment 생성
Experiment는 AzureML에서 머신러닝 작업을 수행할 근간이 되는 구조이다. "diabetes-experiment" 이름으로 생성하자.
from azureml.core import Experiment experiment = Experiment(workspace=ws, name="diabetes-experiment")
데이터셋 로드 - diabetes 데이터셋이다.
# opendatasets module 오류가 발생하면 bash 쉘에서 pip install azureml-opendatasets 수행 from azureml.opendatasets import Diabetes from sklearn.model_selection import train_test_split x_df = Diabetes.get_tabular_dataset().to_pandas_dataframe().dropna() y_df = x_df.pop("Y") X_train, X_test, y_train, y_test = train_test_split(x_df, y_df, test_size=0.2, random_state=66)
트레이닝 수행
여러 alpha 값을 파라미터로 이용해 여러 번 트레이닝을 수행한다. 이때, "run" object를 생성하고 logging, 모델 업로드 등의 작업을 수행한다. run object 처리 부분 외에는 일반적인 regression ML 작업과 다르지 않다.
from sklearn.linear_model import Ridge from sklearn.metrics import mean_squared_error # ImportError: cannot import name 'joblib' from 'sklearn.externals' 오류가 발생하면 "import joblib" 으로 수정. from sklearn.externals import joblib import math alphas = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0] for alpha in alphas: run = experiment.start_logging() run.log("alpha_value", alpha) model = Ridge(alpha=alpha) model.fit(X=X_train, y=y_train) y_pred = model.predict(X=X_test) rmse = math.sqrt(mean_squared_error(y_true=y_test, y_pred=y_pred)) run.log("rmse", rmse) model_name = "model_alpha_" + str(alpha) + ".pkl" filename = "outputs/" + model_name joblib.dump(value=model, filename=filename) run.upload_file(name=model_name, path_or_stream=filename) run.complete()
sklean의 ridge 모델에 관심이 있다면, 아래 링크 참조.
sklearn.linear_model.Ridge — scikit-learn 1.0 documentation
트레이닝 결과 확인
experiment
실행하면, 현재 작업 중인 experiment를 AzureML studio 포털에서 볼 수 있다.
Regression 모델이고, RMSE metric을 체크한다. alpha 값에 따라 각각 다른 rmse 결과가 출력된다.
개별 run을 확인하면, 각각 run의 상세한 정보와 run의 출력 로그 및 생성된 파일들을 볼 수 있다.
가장 성능이 좋은 모델(best model) 확인
minimum_rmse_runid = None minimum_rmse = None for run in experiment.get_runs(): run_metrics = run.get_metrics() run_details = run.get_details() # each logged metric becomes a key in this returned dict run_rmse = run_metrics["rmse"] run_id = run_details["runId"] if minimum_rmse is None: minimum_rmse = run_rmse minimum_rmse_runid = run_id else: if run_rmse < minimum_rmse: minimum_rmse = run_rmse minimum_rmse_runid = run_id print("Best run_id: " + minimum_rmse_runid) print("Best run_id rmse: " + str(minimum_rmse))
가장 성능이 좋은 모델의 run 정보를 가져오고, 파일들을 출력. 이어서, 피클 파일을 다운로드 한다.
from azureml.core import Run best_run = Run(experiment=experiment, run_id=minimum_rmse_runid) print(best_run.get_file_names()) best_run.download_file(name="model_alpha_0.1.pkl")
수행하고, 노트북의 파일리스트를 체크하면, pkl 파일이 다운로드 된 것을 확인 가능하다.
이렇게 첫 AzureML 노트북을 수행했다. 우선 workspace를 생성하고, 머신러닝 트레이닝 코드를 훌륭하게 AzureML과 연동해 수행하였다. Workspace, Experiment, Run, Compute 등의 여러 object들은 다음 포스트에서 차근차근 진행 예정.
참고링크
개발자 커뮤니티 SQLER.com - MLaaS - (1) 12가지의 머신러닝을 먼저 도입한 기업들의 고민
개발자 커뮤니티 SQLER.com - 2021년 머신러닝과 인공지능(AI) 트렌드 - MLaaS (서비스로의 머신러닝)
개발자 커뮤니티 SQLER.com - Python 무료 강좌 - 기초, 중급, 머신러닝(2021년 1월 업데이트)
What is Azure Machine Learning? - Azure Machine Learning | Microsoft Docs
Azure Machine Learning SDK for Python - Azure Machine Learning Python | Microsoft Docs
Set up Python development environment - Azure Machine Learning | Microsoft Docs