이 포스트에서는 mlflow에 대해 무엇을 하는데 쓸 수 있는 툴들인지 간단하게 설명 하고
앞으로 몇몇 포스트를 추가하여 차근 차근 그 사용법을 좀 더 자세히 기록하고자 한다.
mlflow doc: https://www.mlflow.org/docs/latest/index.html
mlflow 사용 배경
2021년 부터 딥러닝 모델 학습 중 관찰 하고 싶은 metric 을 로깅 하기 위해 mlflow를 사용 하기 시작했다. 그 이전엔 tensorboard를 사용했지만 서로 다른 문제를 풀기 위한 모델들의 학습 결과를 깔끔하게 분리해 관리하기에 불편함을 느껴 대안을 찾던 중 ui가 나름 마음에 들고 학습 메트릭 로깅부터 모델 저장 관리 까지 전체적인 life cycle관리가 가능하다는 이유에서 mlflow 를 선택했다. 물론 지금 당장은 무료 라는 사실 또한 굉장히 중요한 선택 요인이었다.
mlflow에서는 experiment, run이라는 개념이 존재해서 서로 다른 문제를 풀기 위한 모델들의 학습 결과를 깔끔하게 분리해 관리 할 수 있다. 하나의 experiment는 여러개의 run을 가질수 있다.
나의 경우 이 두 가지를 다음과 같은 목적에 따라 사용한다.
1. experiment: 어떤 문제를 풀고자 하는가에 해당. 예를 들어 object detection 문제와 segmentation 문제가 있다고 할 때 이 둘을 서로 다른 experiment로 나누어 관리 한다. 왜냐 하면 두 문제를 풀기 위해 수만은 모델들을 테스트 할텐데 segmentation 모델과 objectdetection 모델을 서로 같은 metric으로 비교할 일은 없으니 같은 문제를 풀기위해 실험한 것들끼리만 experiment로 묶어서 관리한다.
아래 api가 관련 되어있다. 각각
mlflow.create_experiment(): 새로운 experiment 생성
mlflow.set_experiment(): 이미 존재하는 experiment를 active로 설정
mlflow.get_experiment_by_name(exp_name): exp_name 이라는 이름의 experiment가 있는 지 검색해서 있으면 리턴
2. run: 하나의 experiment, 즉 하나의 목적을 달성하기 이 위해 하이퍼 파라미터를 바꾸어 테스트 하거나 모델을 바꾸어 테스트 할 경우 서로 모델의 성능 비교. 또는 하이퍼 파라미터 변경에 따른 동일 모델의 성능을 비교할 경우 각각의 경우에 구분가능한 이름을 붙여 관리할 목적으로 사용.
아래 api가 관련있다.
mlflow.start_run(run_name=name): name라는 run을 생성해 학습 메트릭, 파라미터 등 관련 인자를 관리
mlflow.end_run(): 현재 실행되고있는 run을 종료
아래에서 설명 할 mlflow ui 를 이용해 웹에서 Fig 1. 과 같은 화면이 나타난다.
Fig 1의 좌측 상단 mlflow 라는 글자 아래 Experiment 라는 글이 있고 그 아래 default, segmentation, object detection 이라는 3개가 있는데 각각은 서로 다른 목적 가지는 테스크를 구분하기 위해 사용했다.
Fig 1.의 중앙 부분은 object detection 테스크 하위에서 실행 된 run을 보여주는데 Run Name 이라는 섹션에 보면 od_test, od_test2 라는 이름의 run들이 실행 된 것을 볼수 있다. 행 별로 각 run 에서 로깅된 metric, parameter 등을 확인 할 수 있다.
주로사용 하는 mlflow 기능
mlflow에서 내가 가장 자주 사용 하는 기능은 학습 중 관잘하고 싶은 메트릭을 로깅 하고 시각화 하는 mlflow tracking 과 mlflow ui이다. (최근엔 model registry 기능을 사용해 배포 모델 버전 관리도 하기 시작했다.)
mlflow tracking 은 모델 학습시 사용된 파라미터 로깅, 코드 버전, metrics, 모델, 체크 포인트 등을 로깅할 수 있는 API 와 로깅된 값을들 웹으로 편리하게 볼수 있는 UI 기능을 제공한다.
파라미터와 메트릭, 모델등을 로깅 하기 위해서는 간단히 아래 처럼 api 를 사용 할수 있다. (아래 코드는 이렇게 사용 할 수 있다고 예를 든 것이므로 실제 적용 할때는 기존에 있는 experiment의 하위에 run생성할 경우 등등을 고려해 구현해서 사용해야 한다.)
import mlflow
# 로깅하고자 하는 대상들이 저장될 위치를 지정
mlflow.set_tracking_uri("file:///home/mlrun_logs")
experiment_id = mlflow.create_experiment('실험이름') #새로운 실험생성
experiment = mlflow.get_experiment(experiment_id)
self.run = mlflow.start_run(run_name = run_name, experiment_id=experiment.experiment_id)
# 'initial_lr'은 key 이고 init_lr은 해당 키에 대응 하는 실제 값
mlflow.log_param('initial_lr', init_lr)
for i in range(max_epoch):
loss = model(input)
mlflow.log_metric('loss', loss) # 'loss' 는 key 이고 loss는 값
#아래는 모델을 로깅하는 방식으로 첫번째 인자는 model 또는 torch.jit.script 로 변환된 모델
#두번 째 인자는 모델을 저장할 위치
mlflow.pytorch.log_model(model, 'path_to_model_save_location')
로깅한 값들을 보고 싶으면 mlflow ui 명령을 terminal 에서 실행 하면 된다.
예를 들어 로깅 하고자 하는 값들이 /home/mlrun_logs 에 저장되었다면 아래 처럼 mlflow ui 명령을 입력하면 된다.
mlflow ui -p 9999 -h 0.0.0.0 --backend-store-uri /home/mlrun_logs
위 명령에서 -p 9999 는 mlflow ui가 9999 번 포트에서 서빙되게 설정하는 것이고 -h 0.0.0.0은 외부에서 mlflow ui 웹에 접속 가능 하게 하기 위함이다. 이렇게 -h 0.0.0.0 옵션을 넣어 실행하면 mlflow ui 가 원격 서버에서 실행중이어도 '원격서버ip:9999' 를 크롬, 파이어 폭스등의 주소창에 입력해서 mlflow ui 웹에 접속이 가능 하다.
아래는 mlflow ui 화면 이다. Run Name이 od_test 인 행을 보면 mlflow.log_metric으로 로깅한 값들은 Metric 섹션에 나타나고 mlflow.log_param으로 로깅한 값들은 Parameters 섹션에 나타난다. 깔끔해 보기가 편리하다.
run들 사이의 비교를 하고 싶으면 아래 그림 Fig 3 와 같이 비교하고 싶은 run들을 체크하고 활성화된 compare 버튼을 누르면 효과 적으로 비교 할 수 있다.
비교 기능을 이용 하면 아래 그림 Fig 4와 같이 서로다른 run들의 metric 변화를 그래프로 비교 할 수도 있다.
-끝-