[MLOps] Flask

GisangLee·2023년 3월 25일
0

ML

목록 보기
135/141

1. 플라스크 설치

$ conda create -n flask-tutorial python=3.0

$ conda activate flask-tutorial

$ pip install Flask


2. Hello World with Flask

  • app.py 생성 및 아래 코드 작성
from flask import Flask


app = Flask(__name__)


@app.route("/")
def hello_world():
    return "<p>Hello World</p>"


if __name__ == "__main__":
    # 디버그 모드로 실행, 모든 IP에서 접근 허용, 포트 6000번 허용
    app.run(debug=True, host="0.0.0.0", port=8090)

3. 모델 학습 저장

  • train.py
import os
import pickle

from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, classification_report
from sklearn.model_selection import train_test_split

RANDOM_SEED = 1234

# STEP 1) data load
data = load_iris()

# STEP 2) data split
X = data['data']
y = data['target']

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3,
                                                    random_state=RANDOM_SEED)

# STEP 3) train model
model = RandomForestClassifier(n_estimators=300, random_state=RANDOM_SEED)
model.fit(X_train, y_train)

# STEP 4) evaluate model
print(f"Accuracy :  {accuracy_score(y_test, model.predict(X_test))}")
print(classification_report(y_test, model.predict(X_test)))

# STEP 5) save model to ./build/model.pkl
os.makedirs("./build", exist_ok=True)
pickle.dump(model, open('./build/model.pkl', 'wb'))

  • build 디렉토리 안에 model.pkl이 생성된 것을 확인
$ cd build

$ ls -a
# model.pkl

4. 모델 파일을 load하여 flask 서버에 연결

POST /predict API

  • app.py
import pickle

import numpy as np
from flask import Flask, jsonify, request

# 지난 시간에 학습한 모델 파일을 불러옵니다.
model = pickle.load(open('./build/model.pkl', 'rb'))

# Flask Server 를 구현합니다.
app = Flask(__name__)


# POST /predict 라는 API 를 구현합니다.
@app.route('/predict', methods=['POST'])
def make_predict():
    # API Request Body 를 python dictionary object 로 변환합니다.
    request_body = request.get_json(force=True)

    # request body 를 model 의 형식에 맞게 변환합니다.
    X_test = [request_body['sepal_length'], request_body['sepal_width'], request_body['petal_length'], request_body['petal_width']]
    X_test = np.array(X_test)
    X_test = X_test.reshape(1, -1)

    # model 의 predict 함수를 호출하여, prediction 값을 구합니다.
    y_test = model.predict(X_test)

    # prediction 값을 json 화합니다.
    response_body = jsonify(result=y_test.tolist())

    # predict 결과를 담아 API Response Body 를 return 합니다.
    return response_body


if __name__ == '__main__':
    app.run(port=8090, debug=True)

5. API 테스트

$ python app.py
  • 서버가 열리면 POST /predict API를 요청하여 결과 반환 값 확인
$ curl -X POST "Content-Type:application/json" --data '{"sepal_length": 5.9, "sepal_width": 3.0, "petal_length": 5.1, "petal_width": 1.8}' http://localhost:8090/predict

  • 0, 1, 2 중의 하나의 type으로 classification 하게 된다.
profile
포폴 및 이력서 : https://gisanglee.github.io/web-porfolio/

0개의 댓글