5일동안 김인섭 강사님의 mlflow, fastapi, bertmodel 그리고 airflow의 활용법에 대한 강의를 들었다. 최근에 regression 머신러닝 경연대회를 진행한 후에 ML <regression>에 대한 전체적인 flow, feature engineering, 그리고 모델 학습 및 training을 직접 돌려보면서 정말 많이 배웠다고 생각했는데 이번 강의를 통해서 mlflow (머신머링 라이프사이클을 관리하는 플랫폼), fastapi (웹 어플을 빠르고 쉽게 만들 수 있는 python 기반 프레임워크), bert (google NLP model), airflow (data pipeline을 자동화하고 관리하는 워크플로우 플랫폼) 등 여러 프레임워크와 플랫폼들을 실습해보면서 또 다른 인사이트를 얻었다고 생각한다. Mlflow부터 하나하나씩 배웠던 코드들 및 내용등을 정리하는 시간을 가져볼까 한다.

- Mlflow란? 머신러닝 라이프사이클을 관리하는 데 도움을 주는 오픈 소스 플랫폼
- Mlflow의 구성요소 :
Mlflow Tracking: 실험을 기록하고 쿼리할수 있는 시스템, 기록 추적 및, 매트릭스, 파라미터, artifact logging할수 있음
Mlflow Projects: Packing format, 환경과 종속성을 포함한 프로젝트 사양 정의 가능
Mlflow Models: 일반적인 model packing format, 모델 배포를 지원
Mlflow Registry: 모델의 전체라이프사이클 을 관리할 수 있는 중앙 집중식 모델 저장소 (version control, comment 등 가능)
- Mlflow 설정하는 법
python3.10 -m venv .venv
.venv/Scripts/activate
pip install mlflow
mlflow ui
이렇게 하면 Mlflow Ui로 접속할 수 있다.
실습 예제 : wine 품질 예측 -> 와인 품질 데이터셋 (train, test)을 이용해 간단한 머신러닝 구축 : 와인의 다양한 특성(산도, pH 등)을 활용해서 와인의 품질을 예측하는 모델을 만듦.
1. Data Loading
import pandas as pd
train_data = pd.read_csv('wine_train.csv')
test_data = pd.read_csv('wine_test.csv')
print(train_data.head())
2. Model Training
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import mlflow
X_train = train_data.drop(['quality'], axis=1)
y_train = train_data['quality']
# Randomforest
model = RandomForestClassifier(n_estimators=100, random_state=42)
model.fit(X_train, y_train)
# 모델을 MLflow logging
mlflow.sklearn.log_model(model, "random_forest_model")
3. Prediction & Matrix logging
X_test = test_data.drop(['quality'], axis=1)
y_test = test_data['quality']
# predict
predictions = model.predict(X_test)
# logging
accuracy = accuracy_score(y_test, predictions)
mlflow.log_metric("accuracy", accuracy)
print(f"모델 정확도: {accuracy:.4f}")
보통 accuracy는 모델당 적정히 70-80 정도로 나오면 어느정도 만족한다고 한다. 경진대회에서도 너무나 train set에 많이 의존하여 학습하면 overfit이 날 가능성이 있기 때문에 90이상 나오면 overfit을 의심해봐야 한다고 한다.

- FastApi란 : Python 기반의 웹 프레임워크, 특히 API 개발에 최적화되어 있어 비동기 처리와 자동 문서화 기능 지원함
- FastApi 주요 특징 : 1. Data Type 체크 : pydantic 을 이용해서 데이터 타입 검증2. 비동기 처리 방식 : asyncio를 통해 비동기 방식동작 : async / await
- 동기 vs 비동기 : 동기 방식은 작업이 순차적으로 처리되는 반면, 비동기 방식은 여러 작업이 동시에 처리될 수 있음
ex) 스타벅스 커피 -> 점원이 한명이면 순차적 처리로 커피를 받아야함 or 점원이 여러명이면 여러명이서 coffee 만들기 가능
FastApi 비동기 처리 과정 실습 code :
main.py : 기본적인 라우팅 예제 포함 및 image_predict (이미지를 업로드 받아 예측을 수행하는 비동기 처리)하는 함수 정의
@app.get('/api/v1/predict')
async def image_predict(file: UploadFile = File(...)): # input: Image
raw_data = await file.read()
image_bytes_io = BytesIO(raw_data)
img = Image.open(image_bytes_io)
pred = predict(img)
return pred
model_loader.py : 이미지 분류를 위한 사전 학습된 모델을 불러오는 역할 > Tensorflow로 불러옴
import tensorflow as tf
def load_model():
model = tf.keras.applications.MobileNetV2(weights='imagenet')
print('MovileNetV2 model successfully loaded ...')
return model
model = load_model()
predict.py : model_loader.py 에서 학습된 모델을 사용해서 이미지 예측 로직 담고 있는 파일 > 데이터 전처리 과정 수행
from PIL.Image import Image # pip install pillow
import tensorflow as tf
import numpy as np
from model_loader import model
def predict(image: Image): # pydantic -> type check
# img => 규격화
image = np.asarray(image.resize((224, 224)))[..., :3] # Framework
print(f'Image first: {image}')
image = np.expand_dims(image, 0)
print(f'Image second: {image}')
image = image / 127.5 - 1.0 # Scaler => -1 ~ 1
print(f'Image third: {image}') # IO => 영상
results = tf.keras.applications.imagenet_utils.decode_predictions(
model.predict(image),
3
)
print(results)
return results

- Bert란 : Bidirectional Encoder Representations from Transformers
Google에서 개발한 자연어 처리 모델 (NLP) - Bert의 특징 : 텍스트 문맥을 양방향으로 이해할 수 있음 < 이전 NLP 모델과 비교할때 큰 장점
1. 양방향 모델 : 여태 nlp 모델은 왼쪽에서 오른쪽이나 오른쪽에서 왼쪽으로 문장을 이해했는데 bert는 양방향
2. Transformer 구조 : parallel 처리 가능, 긴 문장 처리에 효율적 > RNN 기반 모델 - Bert 모델 생성 과정 (TinyBert 사용)
1. 데이터 Sample
from datasets import Dataset
data = pd.read_csv('https://raw.githubusercontent.com/laxmimerit/All-CSV-ML-Data-Files-Download/master/IMDB-Dataset.csv')
dataset = Dataset.from_pandas(data)
dataset = dataset.train_test_split(test_size=0.3)
dataset
2. 데이터 전처리 Sample
from transformers import BertTokenizer
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
inputs = tokenizer("Sample text.", return_tensors="pt")
3. Model 로드, 초기화 >> TinyBert
from transformers import BertForSequenceClassification
model = BertForSequenceClassification.from_pretrained('bert-base-uncased')
model.train()
4. 모델 train
from transformers import Trainer, TrainingArguments
training_args = TrainingArguments(
output_dir='./results',
num_train_epochs=3,
per_device_train_batch_size=16,
per_device_eval_batch_size=64,
warmup_steps=500,
weight_decay=0.01,
logging_dir='./logs',
logging_steps=10,
)
trainer = Trainer(
model=model,
args=training_args,
train_dataset=train_dataset,
eval_dataset=eval_dataset
)
trainer.train()
- Bert Model Deploy 과정
1. Dockerfile -> package & 환경설정
FROM python:3.8-slim
WORKDIR /app
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "app.py"]
2. docker-compose.yml 파일 수정
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
3. 모델 배포
- EC2 instance 생성 후에 docker container 실행
docker-compose up -d
- S3 bucker 사용 <model, data upload>
aws s3 cp model.pkl s3://your-bucket-name/model.pkl
- model service 시작
from fastapi import FastAPI
from model_loader import load_model
app = FastAPI()
model = load_model()
@app.post("/predict")
def predict(data: DataModel):
# 모델 예측
return {"prediction": model.predict(data)}

- Airflow란 : 데이터 파이프라인(workflow)를 관리하고 자동화하는 플랫폼, 복잡한 데이터를 처리하는 워크플로우를 쉽게 scheduling and monitoring
- Airflow의 특징:
1. Scheduling : DAG(directed acyclic graph) 구조를 사용하여 각 작업을 특정 순서에 따라 실행시킴 < 의존성 up
2. Monitoring: Web UI를 통해 작업 상태 모니터링 가능 <성공, 실패, 진행중인지 직관적으로 확인 가능>
3. Scalability: 확장성이 뛰어남, 소규모부터 대규모 프로젝트까지 워크플로우 처리 가능 - Airflow 설치 과정 > 매우 간단함
pip install apache-airflow
- Airflow 구성 파일 : airflow.cfg
[core]
# Airflow 홈 디렉토리 설정
airflow_home = /Users/inseop/Desktop/mlops-project/04.AirFlow
# 기본 DAG 실행 간격
dags_are_paused_at_creation = True
[webserver]
# 웹서버 호스트 설정
web_server_host = 0.0.0.0
# 웹서버 포트 설정
web_server_port = 8080
- Airflow Database 설정
초기화 및 웹서버 설정 및 시작
airflow db init
airflow webserver -p 8080
이번 포스트에는 머신러닝과 데이터 엔지니어링 분야에서 자주 사용되는 네 가지 주요 도구, MLflow, Airflow, FastAPI, 그리고 BERT에 대해 요약하였다. 이 도구들은 각각의 영역에서 강력한 기능을 제공하며, 서로 조합하여 사용하면 더욱 효과적인 데이터 파이프라인과 머신러닝 모델을 구축할 수 있다.
MLflow는 모델 실험과 배포를 체계적으로 관리할 수 있도록 도와주며, Airflow는 복잡한 데이터 파이프라인을 자동화하고 스케줄링할 수 있는 강력한 플랫폼이다. FastAPI는 경량의 고성능 웹 프레임워크로, RESTful API를 통해 머신러닝 모델을 쉽게 배포할 수 있는 환경을 제공한다. 마지막으로 BERT는 자연어 처리 작업에서 뛰어난 성능을 발휘하는 사전 학습된 모델로, 다양한 NLP 애플리케이션에 적용할 수 있다.
강의를 들으면서 이 네 가지 도구를 잘 활용하면, 데이터의 수집부터 처리, 모델 학습과 배포까지 모든 과정을 효율적으로 관리할 수 있을 것 같단 생각이 들었다. 앞으로도 이 도구들을 조합하여 더 나은 데이터 파이프라인과 AI 솔루션을 구축하는 방법을 탐구해 나갈것이다.
'AI' 카테고리의 다른 글
<10,11일차> Computer vision / 경진대회 진행 (0) | 2024.11.08 |
---|---|
<9일차> MLops Project... (2) | 2024.10.11 |
<7일차> ML 경진대회 : Regression Wrap up (5) | 2024.09.20 |
<6일차> LLM Project : 스포츠 규정에 관하여 답하는 QA Engine 개발 (3) | 2024.08.27 |
<5일차> Statistics (0) | 2024.08.23 |