mlflow를 사용하다 아래와 같은 에러가 발생했다. 

 

 log-parameter failed with exception HTTPConnectionPool(host='localhost', port=5000): Max retries exceeds with url: api/2.0/mlflow/runs/log-parameter (Caused by ResponseError('too many 500 error responses')) 

 

에러가 발생한 시점은 mlflow를 로컬 파일 시스템에서 사용하다

mlflow server와 mysql server를 연동 시켜 사용하려고 시스템을 구축한 직후 이다. 

 

시스템 구축에 사용된 mlflow 와 mysql 버전은 아래와 같다.

mysql server version: 8.0.28

mlflow version: 1.24

 Error

Fig 1. Error

 

 

기존 환경: 

mlflow를 아래 Fig 2와 같이 로컬 환경에서 사용

Fig 2. mlflow on localhost (mlflow 홈페이지에서 참조)

 

문제 발생 환경

총 3개의 docker container(mysql_server, mlflow_server, model_train_server)를 docker-compose로 실행하여

mysql server를 mlflow server의 backend-store-uri 로 사용 하는 아래 그림 Fig 3. 과 같이 시스템을 구축하는 과정에서 발생

Fig 3. mlflow with remote tracking server, backend and artifact stores

원인 & 해결

위 에러는 mlflow.log_param() 이 실행되는 도중에 발생했다. 딥러닝 모델을 학습할 때 사용 된 하이퍼 파라미터와 모델 configuration 을 기록 하기 위해 log_param을 사용 하고 있었다. 

문제는 모델 configuration 을 표현 하는 dictionary 로 key가 꽤 많고 value도 꽤 많은, 

즉 사이즈가 큰 dict를 serialize해tj log_param으로 기록 하려고 시도하는 과정에서 발생한 것으로 보인다. 

 

나의 경우 해결 방법이 간단했는데 log_param으로 기록 하던 값들 중 dictionary로 그룹화 되어 사이즈가 큰편에 속하는 것 값들은 mlflow.log_dict 으로 artifact로 저장하고 string이나 int, float등의 단일 값들을 log_param으로 기록 하는 것으로 해결했다. 

 

다만, 기존 환경인 mlflow on localhost에서는 문제가 발생하지 않은 것으로 보아 log_param() 메서드가 serialize 한 값을 urllib를 이용해 보낼수 있는 크기에 상하선이 있는것 같은데 이상한선이 어떤 값인지는 확인해 보지 않았다. 

 

 

'Common' 카테고리의 다른 글

[git error] fatal: unable to fork  (0) 2022.06.19
[mlflow & mysql] restore backend store  (0) 2022.05.24
ubuntu swap memory 설정  (0) 2022.05.12
[mlflow ] mlflow 소개와 사용 이유 (1/3)  (0) 2022.03.18
[docker] docker root dir 변경  (0) 2022.02.08

이 포스트에서는 mlflow에 대해 무엇을 하는데 쓸 수 있는 툴들인지 간단하게 설명 하고

앞으로 몇몇 포스트를 추가하여 차근 차근 그 사용법을 좀 더 자세히 기록하고자 한다.

 

mlflow doc: https://www.mlflow.org/docs/latest/index.html

 

MLflow Documentation — MLflow 1.24.0 documentation

© MLflow Project, a Series of LF Projects, LLC. All rights reserved.

www.mlflow.org

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 등을 확인 할 수 있다.

 

Fig 1. Experiment와 run의 개념 이해를 돕기 위한 예제

주로사용 하는 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 섹션에 나타난다.  깔끔해 보기가 편리하다.

 

Fig 2.

 

run들 사이의 비교를 하고 싶으면 아래 그림 Fig 3 와 같이 비교하고 싶은 run들을 체크하고 활성화된 compare 버튼을 누르면 효과 적으로 비교 할 수 있다. 

Fig 3. compare 기능

비교 기능을 이용 하면 아래 그림 Fig 4와 같이 서로다른 run들의 metric 변화를 그래프로 비교 할 수도 있다.

Fig 4. comapre 기능을 이용해 서로 다른 run의 metric을 graph로 비교

-끝-

+ Recent posts