본문 바로가기

공부방/Upstage AI Lab 4기

학습일지 | MLOps에 대한 대략적인 소개

올 것이 왔다. 최대 난관이 찾아온 것 같다. 이름도 생소한 ML Ops가 뭔지, 강의 들으면 알겠지 했는데 들으면 들을수록 더 모르겠다.

두둥 ML Ops (수업 내용에 새로운 개념이나 처음 들어보는 단어가 너무 많아서 힘들었다. 동시에 그만큼 많이 배우기도..)

ML Ops는 머신러닝 모델을 개발하고 배포, 운영하는 전체적인 과정을 관리하는 영역이다. DS(데이터 사이언티스트를 부르는 것 같음. 보통 DS가 주피터 노트북으로 모델을 개발한다고. 하지만 이걸 곧바로 배포할 수는 없음)가 모델을 만들어서 올리면 그걸 가지고 운영을 시작하는 게 ML Ops의 영역이고, 이 분야는 새로 생긴지도 얼마 되지 않아 통일된 방법론(?)이나 툴이 존재하지 않는다. 백엔드와도 맞닿아 있는 부분. (난 백엔드에 대해 아무것도 모르는데)

지난 프로젝트에서, 데이터를 가지고 모델을 학습시켜서 모델이 특정 문제에 대해 값을 예측하도록 했다면. 이제는 이렇게 만든 모델을 좀더 훈련시키면서 업그레이드하고, 그 과정에서 나오는 여러 버전들을 관리하고, 저장하고, 모델을 분석하고, 배포하고, 데이터가 업데이트되면서 다시 모델을 훈련시키고, 피드백을 반영하는 것까지 하는 것이 ML Ops.

 

데이터 관리하기

인공지능 모델이 학습하는 데이터는 대용량일 확률이 높으니, 컴퓨터에 저장하는 것보다 클라우드 스토리지를 이용하면 좋다. 대표적인 클라우드 스토리지가 Amazon Simple Storage Service(S3), Google Cloud Storage, Microsoft Azure Blob Storage가 있다. 학습 데이터가 이미지셋이라고 치면, 이걸 클라우드에 저장해서 학습시키고, 그 과정에서 생겨난 모든 관련 파일들(Artifact)까지도 클라우드에 함께 저장할 수 있다.

*Artifact(아티팩트): ML에서는 모델 훈련 과정의 결과물. 학습된 모델의 가중치(모델이 학습한 파라미터 값들, 하이퍼파라미터, 전처리/후처리 스크립트, 평가 매트릭, 의존성 정보, 메타데이터, 설명 문서 등등)

이 외에 분산 파일 시스템을 사용할 수도 있음. 대규모 데이터면 데이터를 분산해서 저장하고 빠르게 연산시키기 위한 병렬 처리에 사용됨.. 이부분은 패스 - 데이터 웨어하우스, 데이터 레이크도 있음.

 

버전 관리하기

머신러닝 프로젝트의 버전 관리와 실험 추적을 위한 도구: DVC(Data Version Control), MLflow

DVC: 클라우드 스토리지와의 통합 (S3, Google Cloud Storage 등), Git과 밀접하게 통합, 데이터 중심의 프로젝트에 더 적합

MLflow: ML 라이브러리와의 통합 (scikit-learn, TensorFlow, PyTorch 등), 웹 UI, 모델 서빙 가능, 전반적인 ML 라이프사이클 관리에 적합.

모델을 등록하고, 버전을 지정해서 단계별로(스테이징 단계, 프로덕션 단계, 아카이빙 단계 등) 저장해둘 수 있어서 좋다.

 

MLflow 기본 사용법

pip install mlflow

먼저 인스톨을 한 뒤에,

#처음에는 이렇게 해도 됐는데 
mlflow.set_tracking_uri('http://127.0.0.1:5000')

#다음 날 다시 해보려니까 커맨드창에 아래를 쳐야 서버가 실행됐다. 
mlflow server --backend-store-uri file:///Users/alookso/mlops/mlruns

그리고 저 http로 들어가면 이런 화면이 뜬다(이전 기록이 남아있음)

example이라는 실험을 만들면 Experiments에 example이 추가된다.

exp = mlflow.set_experiment(experiment_name='example')
exp

 

이렇게 잘 생성이 됐으면, 이제 기록을 시작하고 모델을 돌려주면 된다. 모델 실행시키는 앞뒤로 mlflow.start_run()과 mlflow.end_run()만 붙여주면 됨.

mlflow.autolog() #기록시작

mlflow.start_run() #실험을 시작한다. 
#start_run 이후 모델을 불러오고, 실험하는 코드를 작성하면 됩니다. 

model = LogisticRegression(max_iter=0)
model.fit(X_train, y_train)
pred = model.predict(X_test)
accuracy = accuracy_score(y_test, pred)
print(f'정확도: {accuracy * 100}')

mlflow.end_run()

 

모델 배포하기

Flask, FastAPI 형태로 REST API를 만들면 좋은데, 그게 어렵다면? MLFlow의 모델 serving 기능을 활용할 수 있다. 이 방식은 모델을 API 형태로 제공하는데, 클라이언트가 API를 통해 데이터를 입력하면 그걸 모델에 넣고, 모델이 예측 결과를 API 응답으로 반환한다. 

 

이 외에 워크플로우 관리 도구

 

Apache Airflow: DAG(Directed Acyclic Graph)를 사용하여 복잡한 워크플로우를 관리

Kubeflow: Kubernetes 위에서 머신러닝 워크플로우를 자동화하기 위한 오픈 소스 플랫폼