지난번 포스트에서는 MLflow가 어떤 툴인지, MLflow의 Tracking 기능을 어떻게 사용하는지 대략적으로 알아보았다. Tacking의 경우 Python 스크립트 파일 안에서 .log_param 혹은 autolog를 사용하는 방법 위주로 보았다.
이번에는 CLI를 사용하여 조금 더 정교하고 명시적으로 Tracking 기능을 사용하는 방법에 대해서 알아본다.
1. Experiment 생성
지난번 포스트에서는 mlflow로 log할 것들을 표기(혹은 autolog를 사용)하고 스크립트 파일을 단순실행, 그 결과 '0'이라는 experiment id가 자동 생성 후 그 아래에 run이 기록되는 방식으로 진행하였다.
하지만 그렇게 할 경우 experiment에 대한 기록 및 관리가 더 힘들어진다는 단점이 있다. 내가 원하는 이름으로 experiment를 생성하고, 또 여러 experiment들이 있을 때 이 run이 어떤 experiment 아래에서 이루어져야 하는지 관리하는 등등의 작업들이 필요한 것이다.
이를 위해 가장 먼저 CLI 환경에서 experiment를 생성한다
# experiment 생성
mlflow experiments create -n {experiment이름}
# experiment rename
mlflow experiments rename -x {experiment-id} --new-name {새로운이름}
우선 my-experiment로 실험 이름을 설정, experiment를 생성했다
그 후 명령을 내린 폴더를 확인해보면 mlruns 폴더가 생성된 것을 볼 수 있다
새로 만든 폴더이다보니 아직 mlruns 안에 실행 정보가 없다. (1은 my-experiment의 실험 id)
experiment를 생성한 폴더에서 새로운 폴더(필자의 경우 example)를 만들고 mlflow example 중에서 sklearn_logistic_regression에 있는 파일들 복붙. MLproject 파일의 name만 폴더 이름으로 살짝 수정해준다
# MLproject
name: example
python_env: python_env.yaml
entry_points:
main:
command: "python train.py"
#python_env.yaml
python: "3.8"
build_dependencies:
- pip
dependencies:
- mlflow>=1.0
- scipy
- scikit-learn
#train.py
import numpy as np
from sklearn.linear_model import LogisticRegression
import mlflow
from mlflow.models import infer_signature
import mlflow.sklearn
if __name__ == "__main__":
X = np.array([-2, -1, 0, 1, 2, 1]).reshape(-1, 1)
y = np.array([0, 0, 1, 1, 1, 0])
lr = LogisticRegression()
lr.fit(X, y)
score = lr.score(X, y)
print("Score: %s" % score)
mlflow.log_metric("score", score)
predictions = lr.predict(X)
signature = infer_signature(X, predictions)
mlflow.sklearn.log_model(lr, "model", signature=signature)
print("Model saved in run %s" % mlflow.active_run().info.run_uuid)
2. Run 실행
상위 폴더로 가서 CLI로 Run을 실행
-> example 폴더 안에 있는 MLproject, pytho_env.yaml, train.py가 하나의 종합세트라고 생각하고 실행해보면 좋을듯
-> MLproject 파일을 봐도 entrypoints로 comman 'python train.py'가 있으니까
mlflow run example --experiment-id 1 --env-manager=local
--experiment-id로 experiment-id를 지정하는 방법과
--experiment-name으로 실험의 이름으로 지정하는 방법이 있다. (이번의 경우 my-experiment)
주의할 것은 MLflow Project with virtualenv environment manager를 돌리기 위해선 반드시 pyenv가 요구된다. 따라서 pyenv를 사용하거나, 그걸 원하지 않는다면 --env-manager=local 옵션을 사용해야 한다. (나의 경우 conda 위에서 실습을 진행하고 있었다)
tree를 확인해보면 1 아래에 실행이 잘 기록된 것을 확인할 수 있다
조금 더 정교하게 제어하고 싶다면...
mlflow에서는 mlflow.client 모듈을 통해 조금 더 정교하게 experiment와 run을 관리할 수 있도록 지원!
from mlflow.tracking import MlflowClient
client = MlflowClient()
experiments = (
client.search_experiments()
) # returns a list of mlflow.entities.Experiment
run = client.create_run(experiments[0].experiment_id) # returns mlflow.entities.Run
client.log_param(run.info.run_id, "hello", "world")
client.set_terminated(run.info.run_id)
client.set_tag(run.info.run_id, "tag_key", "tag_value")
'프로젝트 일지 > 분모자' 카테고리의 다른 글
MLflow - Tracking Servers (0) | 2023.07.23 |
---|---|
FastAPI: 데이터베이스 연결의 이해 (0) | 2023.06.23 |
MLflow - MLflow 개요 & Tracking 기초 (with python) (2) | 2023.03.07 |