본문 바로가기
프로젝트 일지/분모자

MLflow - Tracking using CLI

by 데브겸 2023. 3. 13.


지난번 포스트에서는 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 위에서 실습을 진행하고 있었다)

 

원문은 https://github.com/mlflow/mlflow/issues/7387

 

 

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")