AI

<8일차> Mlflow, FastApi, Bertmodel, Airflow ...

giirin 2024. 9. 25. 19:09

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 솔루션을 구축하는 방법을 탐구해 나갈것이다.