안녕하세요, 이번 포스팅에서는 이전 포스팅 마지막에 언급드렸던 Toy Project WorkFlow 중,
MLFlow 부분을 다뤄보려 합니다.
1. MLFlow 란?
: MLFLow 는 End-toEnd machine learning lifecycle을 관리하는 오픈소스 플랫폼 입니다.
- 모든 기계 학습 라이브러리 및 프로그래밍 언어와 함께 사용 가능
- 공식문서
01. MLFlow 파이프라인
: MLFlow 의 전반적인 파이프라인을 도식화하면 아래와 같은 파이프라인으로 설명할 수 있습니다.
일반적인 프로세스와 동일하게,
처음은 데이터 처리과정으로 Data Pipeline으로 구성되어 있습니다.
다음으로는 모델을 생성하고 평가하여 모델의 성능을 확인을 하는데요 제일 중요한 부분은 이 다음입니다.
Tracking 부분이 사실상 이러한 lifecycle을 관리하는 플랫폼의 가장 강력한 기능이라 할 수 있는데요.
이에 관해서는 아래에서 다시 설명드리겠습니다.
02. 주요 컴포넌트
MLFlow 를 구성하는 주요 컴포넌트는 Tracking ,Projects, Models, Model Registry 로
총 4개로 구성되어 있습니다.
지금부터 각 컴포넌트에 대해 간략하게 설명드리겠습니다.
1. MLFlow Tracking
: 기계 학습 코드를 실행할 때 파라미터, 코드 버전, 메트릭 및 결과 파일을 기록합니다.
- 파라미터와 결과를 비교하기 위해 실험 결과를 저장
- 결과를 시각화하기 위한 API 및 UI도 제공
2. MLFlow Projects
: 머신러닝 코드를 재사용하고 재현 가능한 형태로 패키징합니다.
패키징의 장점
- 어떤 플랫폼에서도 재현가능하도록 지원합니다.
- 포장된 형태를 다른 데이터 사이언티스트가 사용하거나 프로덕션에 반영 할 수 있습니다.
- 프로젝트를 실행하기 위한 API와 명령줄 도구가 포함되어 있어 프로젝트를 워크플로우로 연결할 수 있는 기능 제공합니다.
3. MLFlow Models
: 머신러닝 모델을 패키징하고 서빙할 수 있는 표준화 방법을 제공합니다.
- 동일한 모델을 AWS, Apache Spark 등으로 쉽게 배치할 수 있도록 지원
- 다양한 다운스트림 도구(ex. REST API 를 통한 실시간 제공 또는 Apache Spark의 추론) 에서 사용할 수 있는 기계 학습 모델을 패키징하기 위한 표준 형식
- 다양한 다운스트림 도구에서 이해할 수 있는 다양한 “특성” 으로 모델을 저장할 수 있는 규칙을 정의
- 다양한 ML 라이브러리에서 모델을 관리하고 배포, Serving, 추론
4. MLFlow Model Registry
: MLFlow 모델의 전체 수명 주기를 공동으로 관리하기 위한 중앙 집중식 모델 스토어, API 및 UI 모음 입니다.
- 모델 계보(MLFlow 실험 및 실행이 모델을 생성함)
- 모델 버전 관리
- 단계 전환(ex. staging → production) 및 주석을 제공
2. MLFlow Tracking의 필요성
MLFlow 가 무엇인지, 어떤 컴포넌트들을 가지고 있는지에 대해 간략하게 알아봤는데요.
그렇담 이러한 MLFlow 의 Tracking 기능이 왜 강력한 것이고 필요할까요?
이 질문에 대한 답을 하기 위해 하나의 프로젝트 예시를 들어보겠습니다.
Q & A 와 summary 가 가능한 LLM 챗봇을 만드는 프로젝트를 진행 중이라고 가정해봅시다.
우리는 LLM 의 성능을 향상 시키기 위해 모델도 바꿔가며 실험할 수도 있고 각각의 조건들을 아래와 같이 다양하게 조합하여 실험을 진행할 수 있습니다.
프로젝트 예시: Q & A 및 Summary LLM
위와 같이 여러 실험 조건들을 변경하며 실험하게 되면 각 실험조건에 따른 결과를 기록하고 비교해야합니다.
하지만 수 많은 조건들로 실험을 반복하며 발생하는 결과 및 변경되는 파라미터 값들을 일일히 기록해야 하는 상황은 결국 그 수가 늘어나고 많아질 수록 현실적으로 어려울 것입니다.
한 예로 prompt 관련 실험을 진행한다고 가정하고 해당 Q & A 를 아래의 구글 시트에다 정리한다고 가정해봅시다.
위와 같이 구글 시트로 실험을 정리하다 보면 우리는 다음과 같은 문제점을 느낄 수 있습니다.
- 매번 실험 후 기록을 정리할 때 모두 적어야하는 번거로움
- 실험 횟수가 적을 땐 상관없으나 많아질 경우 정리의 어려움
- 빅쿼리와 같은 db tool에 적재할 수는 있으나 ui 를 통한 시각화에 있어 불편함이 존재
→ 시각화 좋은 UI 를 이용하여 자동화 하는 방법의 필요성이 느껴지게 되겠죠?
MLFlow 의 장점 중 하나로 이를 해결할 수 있습니다.
MLFlow의 Tracking 은 실제 학습에 사용한 모델의 파라미터와 사용된 데이터를 기록하여 해당 모델로 평가한 지표를 시각화가 가능합니다.
시각화를 위한 지표와 방식은 개발자가 직접 지정해 줄 수 있으므로, 수치화된 데이터로 사용할 수도 있고 LLM과 같은 모델성능 비교에 있어 prompt 비교도 구글 시트 처럼 직접 작성할 필요 없이 차트로 정리되어 볼 수 있습니다.
[MLFlow Tracking 예시]
3. MLFlow Tracking
이제 앞서 언급했던 MLFlow Tracking에 대해 좀 더 알아보겠습니다.
MLFlow Tracking 은 runs(실행) 의 개념을 사용합니다.
- 각 실행은 아래와 같은 정보를 기록합니다.
- Code Version
- 실행에 사용된 git commit hash 값. (MLFlow Project에 의해 실행 시 기록)
- Start & End Time
- 실행 시작과 종료 시간
- Source
- 실행을 시작할 파일의 이름 또는 MLFlow 프로젝트에서 실행할 경우 실행에 대한 프로젝트 이름 및 진입점
- Parameters
- 코드의 입력으로 선택한 Key-Value 입력 파라미터
- Key, Value 모두 문자열 값
- Metrics
- 키 값(숫자) 메트릭으로 각 메트릭(loss, accuracy와 같은 값) 은 실행 과정에서 업데이트 될 수 있음
- ex. 모델의 손실 함수가 수렴되는 방식을 추적하기 위해
- MLFlow는 메트릭의 전체 기록을 기록하고 시각화 기능 지원
- 키 값(숫자) 메트릭으로 각 메트릭(loss, accuracy와 같은 값) 은 실행 과정에서 업데이트 될 수 있음
- Artifacts
- 데이터, 모델들을 포함한 파일 형태
- 이미지(ex. PNG, JPG) , 모델(ex. 피클링된 학슴 모델) 및 데이터 파일(ex. Parquet file)을 아티팩트로 기록 가능
- Tags and Notes
- 추가적인 정보를 기입할 수 있는 용도
- 각 실험에 대한 추가적인 정보나 태그를 추가하는 방식으로 사용
- Code Version
4. MLFlow Projects
또한 MLFlow 에는 Projects 라는 컴포넌트가 있습니다.
이는 다양한 환경에서 동일한 결과를 재현하기 위해 제공하는 독립 실행형 학습 코드 프로젝트를 의미합니다.
- 모든 머신러닝 학습 코드를 특별한 라이브러리 종속 항목, 구성, 학습, 테스트 데이터와 함께 묶는 것
- MLProject 라는 이름의 파일로 관리
- 프로젝트의 코드, 환경 정보 등이 모두 들어가 있어 이 파일을 사용하여 동일한 환경의 재실행이 가능
5. MLFlow Models
다음으로 MLFlow Models에 대해서 알아보겠습니다.
MLFlow 에서는 M개의 프레임워크를 N개의 여러 배포환경에 맵핑하는 문제를 해결하기 위해 MLFlow Model 이란
추상화 모델을 사용합니다.
- 구성요소
- 패키징 포맷
- MLmodel 파일이 포함된 특정 디렉토리 구조
- 학습코드가 아닌 직렬화된 모델 아티팩트를 포함합니다.
- 재현성을 위한 의존성 항목 집합
- 다른 환경에서도 동일하게 사용할 수 있도록 프로젝트의 의존성 항목의 집합이 포함됩니다.
- ex. conda 환경 등이 명시됨
- 유틸리티 API
- 모델 직렬화를 위한 생성, 저장, 로드등을 위한 유틸리티
mlflow.<model\_flavor>.save\_model()
mlflow.<model\_flavor>.log\_model()
mlflow.<model\_flavor>.load\_model()
- 모델 직렬화를 위한 생성, 저장, 로드등을 위한 유틸리티
- 배포 API
- 모든 MLFlow 모델을 다양한 서비스에 생성하고 배포하는 API
- CLI / Python / R / Java 지원
- 패키징 포맷
- 저장 포맷
- MLFlow Model은 루트에 있는 ML Model 파일과 함께 임의의 파일을 포함하는 디렉터리
- 머신러닝 모델의 여러 특징을 정의할 수 있는 정보가 포함되어 있음
- Flavor
- 배포 도구가 모델을 이해하는데 사용할 수 있는 규칙
- 각 도구를 각 라이브러리와 통합하지 않고도 모든 ML 라이브러리의 모델과 함께 작동하는 도구를 작성할 수 있다.
- Python, sklearn, pytorch 등 여러 라이브러리들을 지원
- flavor 을 사용하여 파이프라인을 통해 모델을 서빙하기 위한 형태로 만들거나, 모델 자체를 로드할 수 있음
import mlflow
if __name__ == "__main__":
model_uri = "runs:/acef0808fb6b4ca0b611d0293f2ea12e/models/gpt-4-0613"
loaded_model = mlflow.langchain.load_model(model_uri)
print(loaded_model({"query": "객체가 뭐야?"}))
> {'query': '객체가 뭐야?', 'result': '객체는 속성과 기능을 갖춘 것을 말합니다. 우리가 흔히 볼 수 있는 모든 유 무형의 대상으로, 이들은 속성과 기능(메서드)을 갖추고 있습니다. 이러한 속성과 기능은 클래스로 정의되며, 이런 속성과 기능을 갖춘 객체 중 실제로 존재하는 것을 인스턴스라고 합니다.'}
- Artifacts에 저장한 모델을 사용하는 예시
6. MLFlow Model Registry
마지막으로 모델의 저장소 역할을 하는 MLFlow Model Registry에 대해 알아보겠습니다.
- Model Registry에 저장된 모델은 어디서든 쉽게 불러와 사용할 수 있다는 장점이 있습니다.
- 주요 개념
- Model
- MlFlow Model 은
mlflow.<model\_flavr>.log\_model()
api를 사용하여 생성된 실험 또는 실행에서 생성된다. - 이렇게 모델로 생성되어야 Model Registry에 등록할 수 있음
- MlFlow Model 은
- Registered Model (등록된 모델)
- 등록된 모델은 고유한 이름을 가지며 버전과 스테이지 변환과 관련된 단계, 모델 계보, 기타 메타데이터 등이 포함됨
- Model Version
- 각 등록된 모델은 하나 이상의 버전을 가지고 있음
- 새로운 모델이 추가되면 버전 1로 등록이되며, 동일한 모델명을 가진 모델이 추가되면 새로운 버전으로 기존 버전에 1이 더해져 등록됨
- Model Stage
- 각 개별 모델 버전은 주어진 시간에 하나의 스테이지에 할당될 수 있음
- MLflow는 스테이징, 프로덕션, 아카이브의 세 단계 버전을 제공한다.
- Annotation and Descriptions
- 알고리즘 설명, 사용된 데이터 세트 또는 방법론과 같은 팀에 유용한 설명 및 관련 정보를 포함하여 Markdown 을 사용하여 최상위 모델 및 각 버전에 개별적으로 주석을 추가할 수 있다.
- Model
7. MLFlow Project vs MLFlow Model
앞서 설명했던 4 개의 컴포넌트 중 Project 와 Model에 대해 비교하여 설명하면 다음과 같습니다.
MLFlow Project
- 재사용 가능한 데이터 사인언스 코드의 패키징을 위한 표준 포맷
- 디스크립터 파일 또는 단순한 규칙을 사용하여 종속성과 코드 실행방법을 지정
- 데이터를 전처리하고 모델을 훈련하는 워크플로우가 있는 경우 이를 MLProject 파일에 명세하여 패키징이 가능
- 코드, 데이터 및 환경 설정을 포함하는 기계 학습 프로젝트의 논리적 단위
- 반복가능하고 재현 가능한 학습과 추론을 위한 프로젝트 디렉터리 구조를 정의
- 일반적으로 Project Directory 에는 코드 파일, 학습에 사용되는 데이터 파일, 모델을 빌드하고 학습시키는데 필요한 환경 설정 파일등이 포함
💡 각 Project는 단순히 코드 또는 Git repository가 있는 디렉토리
MLFlow Model
- 머신 러닝 모델을 다양한 방식으로 패키징하는 규칙과 이를 배포하는데 도움이 되는 다양한 도구를 제공
- 기계 학습 모델을 패키징하고 관리하는 데 사용되는 표준 형식
- 모델 아티팩트와 모델 메타데이터로 구성
- 모델 아티팩트
- 학습된 모델 자체를 나타내며, 여러 형식(flavor)으로 저장될 수 있음
- 각 flavor는 다른 하위 도구에서 모델을 이해하고 실행할 수 있도록 지원
- TensorFlow, PytTorch, Scikit-learn 등과 같은 다양한 머신 러닝 라이브러리와 배포 환경에서 사용할 수 있는 형식으로 변환할 수 있음
💡 각 모델은 임의의 파일과 모델을 사용할 수 있는 여러 Flavors을 나열하는 디스크립션 파일을 포함하는
디렉토리로 저장
8. 실습
실습은 크게 두 카테고리로 나누어서 설명드릴 예정입니다.
첫 번째, sklearn을 이용한 MLFlow
두 번째, llm을 이용한 MLFlow
이번 실습에서 사용된 특정 모듈에 대한 버전 정보는 다음과 같습니다.
mlflow==2.7.1
bentoml==1.1.5
자세할 실습 코드에 대한 설명은 다음 포스팅에 이어서 소개하겠습니다.
Reference
- https://sonseungha.tistory.com/690?category=1085022
- https://velog.io/@ifelifelse/MLflow
- https://zzsza.github.io/mlops/2019/01/16/mlflow-basic/
- https://dailyheumsi.tistory.com/261
- https://pseudolab.github.io/mlflow_튜토리얼/
- https://mlflow.org/docs/latest/tracking.html
- https://mlflow.org/docs/latest/cli.html?highlight=env
- https://github.com/devinlife/mlflow-demo/blob/main/Dockerfile
'MLOps' 카테고리의 다른 글
마지막 글또를 시작하며.. (3) | 2024.10.13 |
---|---|
BentoML 에 대해 들어보셨나요? (0) | 2024.03.03 |
MLOps - WorkFlow2: MLFlow 실습 (0) | 2024.01.21 |
머신러닝? ops? 이제는 MLOps 다! (2) | 2023.12.10 |