체계적인 실험관리 #2 AI 플랫폼에서 유연하게 연동하고 정확하게 재현하기
체계적인 실험관리 #2 AI 플랫폼에서 유연하게 연동하고 정확하게 재현하기
안녕하세요. 마키나락스 솔루션 아키텍트 전종섭입니다. 마키나락스는 창업 초기부터 다양한 산업의 문제를 AI로 해결하기 위해 다수의 프로젝트를 진행했습니다. 프로젝트 초기에는 문제를 풀기 위한 AI 모델을 만드는 데 집중을 하고 이후에는 개발된 AI 모델들을 실제 현장에 적용해 지속적인 성능을 유지하는 작업에 몰입했는데요. 이 과정에서 MLOps의 필요성을 느꼈습니다. 처음에는 내부 프로젝트를 위한 AI 플랫폼으로 사용하려고 개발했습니다. 그러다 AI로 문제를 풀고자 하는 모든 기업에도 AI 모델 운영이 실적용에 큰 걸림돌이라고 생각해 2022년 제품으로 출시했습니다.
마키나락스 AI 플랫폼 Runway 개발 초기에는 AI 모델 ‘운영’에 집중해 다양한 기능을 배포했는데요. 최근에는 모델의 운영과 더불어 AI 모델 ‘개발’을 잘할 수 있는 기능을 개발하고 있습니다. 그 중심에는 ‘실험 관리’ 기능들이 있습니다. 실험 관리 기능 또한 마키나락스가 산업 현장의 문제를 AI로 풀면서 경험한 과정이 바탕이 됐습니다. 🔗체계적인 실험관리 첫 번째 포스팅에서 에너지 기업과 성분 예측 AI 프로젝트를 수행하며 체계화한 실험 관리 방식을 소개했는데요. 이번 포스팅에서는 Runway에 마키나락스의 실험 관리 노하우가 어떤 기능으로 구현됐고 어떻게 수행할 수 있는지 설명하려고 합니다. 기존에 사용하던 툴과 유연하게 실험을 연동하고 정확한 실험 재현이 가능한 AI 플랫폼을 찾고 있던 분들에게 도움이 되길 바랍니다.
1. 유연하게 연동되는 실험 저장 기능
1) 프로젝트 용 mlflow 서버 관리
MLflow는 실험 관리를 위한 대표적인 오픈소스 툴 중 하나입니다. 오픈소스인 만큼 다양한 사람들의 기여를 통해 머신러닝 생태계에 맞춰 계속해서 발전하고 있습니다. 다만 MLflow는 권한 관리의 어려움과 experiment에서 run으로 이루어지는 layer 깊이의 한계 등으로 인해 팀 전체 혹은 전사적으로 사용하기에는 불편한 점도 있습니다. 이러한 부분들은 MLflow 프로젝트에서 개발 요청이 있었지만 managed 서비스가 아니기 때문에 개발 로드맵에도 반영되지 않습니다.
Runway에서는 이 문제를 해결하기 위해 프로젝트 단위의 MLflow를 도입했습니다. 프로젝트는 권한이 있는 유저만 접근이 가능하게 하고 각 프로젝트에서 사용하려는 외부 MLflow를 연결하거나 프로젝트에서 MLflow 서버를 호스팅해서 해당 프로젝트에서만 사용할 수 있도록 제공합니다.
2) Dataset versioning
Runway에서는 사용하는 데이터셋의 버전을 관리할 수 있도록 제공합니다. 아래 화면처럼 설정된 데이터셋 버전들은 추후 개발 서버에서 쉽게 사용이 가능하도록 연결됩니다.
Runway에서는 Juypterlab과 ssh connection을 통한 vscode 및 pycharm을 지원합니다. 각각의 개발 도구에서는 Link GUI와 Runway SDK를 통해 프로젝트에 업로드된 데이터셋에 접근할 수 있습니다. 혹은 attach 되어 있는 volume의 경로를 통해 직접 이용할 수도 있습니다. 프로젝트에서 제공되는 데이터셋들은 실험 중에 생기는 오염을 방지하기 위해서 read-only로만 제공됩니다.
3) Git 서버 연결하기
Runway의 모델 개발툴에서는 파이프라인을 통해 소스코드 간의 선후 관계를 설정할 수 있습니다. 이를 통해 파이프라인 내에서 소스코드가 설정되어 있는 git remote 서버와 변화가 있을 때 확인할 수 있도록 제공하고 있습니다.
Runway에서 개발 완료 후 remote 서버에 변경 사항을 반영한 후 파이프라인을 업로드하면 다음과 같이 git sha 값을 확인할 수 있습니다.
이는 추후 파이프라인의 변경 사항이 무엇이었는지 빠르게 확인할 수 있습니다.
4) MLflow 실험 관리
프로젝트에서 호스팅한 MLflow에 로깅하는 방법은 기존 MLflow 사용성과 같습니다. 이때 MLflow에 로깅하기 위한 사전 정보들은 개발 서버의 환경 변수로 지정되어 있기 때문에 추가적인 설정 없이 바로 프로젝트의 MLflow에 로깅할 수 있습니다.
import mlflow
regr.fit(X_train, y_train, eval_set=[(X_valid, y_valid)])
y_pred = regr.predict(X_valid)
mae = mean_absolute_error(y_pred, y_valid)
mse = mean_squared_error(y_pred, y_valid)
mlflow.log_params(params)
mlflow.log_metric("valid_mae", mae)
mlflow.log_metric("valid_mse", mse)
print(mse)
이렇게 작성된 코드가 실행되면 Runway의 Experiment 화면에서 확인할 수 있습니다.
호스팅된 MLflow에서도 같은 내용을 확인할 수 있습니다.
각 run의 내용을 확인할 수도 있습니다.
Runway에서 제공하는 Experiment 탭에서는 추후 모델을 서빙할 때 필요한 입출력의 스키마 정보를 추가로 제공합니다.
2. 정확하게 재현되는 실험 재현 기능
1) 재현을 위해서 필요한 것
머신러닝 개발 과정에서 실험 재현은 중요합니다. 좋은 성능이 나오는 경우가 있었는데 이를 재현하지 못하면 다시 탐색해야 하는 경우가 발생합니다. 또한 데이터 오염 등의 이유로 실험의 결과가 잘못된 경우도 존재합니다.
하나의 실험 즉 하나의 AI 모델을 만들기 위해서는 아래 4가지의 조합이 필요합니다.
MLflow에서도 코드, 파라미터, 사용한 데이터, 패키지 모두 로깅할 수 있는 기능들을 제공합니다. source code version, tagging, parameter 등이 대표적인 기능입니다. 하지만 MLflow는 사용자가 직접 필요한 정보를 입력해야 하는 번거로움이 있습니다. 만약 하나의 정보라도 누락한다면 재현에 어려움이 있습니다.
특히 패키지의 경우 requirements.txt
등을 사용해도 이를 다시 이미지로 빌드 하거나 패키지를 설치하는 데 있어서 시간이 소요됩니다. 또한, 리눅스의 apt 패키지에 의존적인 패키지의 경우에는 설치 환경이 동일하지 않아서 재현이 안되는 경우도 있습니다. 이러한 부분을 해결하는 방법으로 많이 쓰이는 방법이 도커로 대표되는 컨테이너입니다. 다만 이 방법은 실행 시점 이후 패키지의 변화가 있을 때 이를 확인할 수 없다는 단점이 있습니다.
Runway에서는 이 모든 과정을 자동화해 관리합니다. 개발이 완료된 코드가 파이프라인으로 업로드 되면 재현을 위해 필요한 소스코드 및 파라미터와 같은 정보와 재현을 위해 필요한 환경을 구성한 이미지를 자동으로 저장합니다. 파이썬 혹은 리눅스 apt 패키지의 변화가 있는 경우를 감지해 해당 환경을 commit을 해 새로운 이미지로 관리합니다. 이는 휴먼 에러를 최소화해 실험의 재현성을 확보합니다.
2) 파이프라인 파라미터
개발 서버에서 작성이 완료된 파이프라인은 Runway 파이프라인에 업로드할 수 있습니다. 이러한 파이프라인은 설정되어 있는 Link parameter를 변화시켜 여러 실험을 수행할 수 있도록 도와줍니다. 보통의 파이프라인 파라미터는 위에서 설명한 것과 같이 3가지 부분으로 구성됩니다. 첫 번째는 학습에 사용하는 데이터셋, 두 번째는 모델의 아키텍쳐를 구성하는 파라미터, 마지막으로 학습을 위한 파라미터들입니다.
이렇게 설정된 파라미터들은 GUI 를 통해 쉽게 변경해 여러 실험을 수행할 수 있습니다.
3) Runway에서의 실험 재현
Runway에서 어떻게 실험이 정확하게 재현되는지 화면을 통해 자세하게 설명하겠습니다. 먼저, 업로드된 파이프라인의 파라미터를 변경해 실행할 수 있습니다.
실행이 완료된 실험의 상세 목록을 확인하면 어떤 파이프라인의 run인지 확인할 수 있습니다.
해당 링크를 누르게 되면 실행한 파이프라인 run으로 이동할 수 있습니다.
해당 run에서는 파이프라인 실행에 사용한 파라미터를 확인할 수 있습니다.
이 때 open with link를 클릭하면 사용했던 파이프라인 코드와 파라미터를 개발 환경에서 확인할 수 있습니다.
개발 환경에서 실험했던 내용을 재현해 볼 수 있습니다.
3. 실제 산업 현장에서 작동하는 MLOps
이 포스팅은 보는 많은 분들이 실험 관리에 대해서는 공감하지만 실험 재현은 다소 낯설 수 있습니다. 마키나락스가 실험 재현을 강조하는 이유가 있습니다. 저희는 다양한 프로젝트를 수행하고 개발된 모델들을 실제 산업 현장에 배포를 해본 경험이 많이 있는데요. 이때 AI 모델의 성능이 지속적으로 유지된다면 재현이 필요 없으나 실제 현장에서는 학습 데이터 때 보지 못한 패턴의 데이터들이 생성됩니다. 이때 실험 재현이 필요하고 중요성이 강조됩니다.
예를 들어서 발전량을 예측하는 모델을 만들었는데 여태 보지 못했던 데이터 패턴으로 인해 발전량이 음수로 예측하는 경우가 생깁니다. 이러한 문제는 모델 자체를 수정하거나 예측값에 post-processing에서 0 이하의 값은 0으로 처리하는 등의 수정이 필요합니다. 이때 어떤 방법이 적절한지는 다시 실험을 수행해야 알 수 있으며, 이를 위해서는 기존에 배포되어 있던 실험의 환경을 재현하고 이 위에서 수행해야 합니다. 물론 발생한 문제를 해결하기 위해서 따로 모델을 만들어서 inference graph 등으로 해결할 수 있지만 이는 코드의 복잡성을 높일 수 있기 때문에 신중한 선택이 필요합니다.
정리해 보자면 배포된 모델의 문제가 발생했을 때 원인을 빠르게 파악하고 이 문제를 해결한 모델을 재배포하는 것이 실제 현장에서는 매우 중요합니다. 특히 이 시간이 길어질수록 서비스 혹은 모델에 대한 신뢰도가 낮아지기 때문에 빠르게 실험을 재현할 수 있어야 합니다. 마키나락스는 실제 산업 현장의 요구를 반영해 Runway에서 단 하나의 버튼으로 실험을 재현할 수 있도록 제공하고 있습니다. 마키나락스에서는 이 외에도 다양한 산업 현장 경험에서 얻은 인사이트를 Runway에 반영하고 있습니다. Runway의 업데이트 내용은 🔗What`s New 페이지에 꾸준히 업로드되고 있는데요. 더 자세한 Runway 기능이나 MLOps 관련 상담은 아래 배너를 통해 언제든 편하게 문의해 주세요.