Skip to content

Latest commit

 

History

History
229 lines (179 loc) · 5.33 KB

5-2. Machine Learning with Docker K8S.md

File metadata and controls

229 lines (179 loc) · 5.33 KB

ML with Docker & Kubernetes

  • MPG 데이터를 이용하여 차량의 연비를 예측하는 Machine Learning 모델 훈련
    • 미국 자동차 제조회사들의 자동차의 연비,구동방식 등을 조사한 데이터
  • Docker 및 Kubernetes를 사용한 배포
    • ML 모델을 Docker image 로 생성하여 Kubernetes Cluster에 띄우기
  • Flask 를 이용하여, External IP로 결과값 Request
    • Feature 값을 JSON body형식으로 전송

깃허브 링크 (https://github.com/DamianoPark/Cloud_Architecture_Note/tree/master/practice/MilesPerGallonPrediction)

Requirement

    1. Google Cloud SDK
    • Path 추가 하기 bin folder of the SDK:
    • export PATH="/Applications/google-cloud-sdk/bin"
    1. Docker & kubectl 다운로드
    1. Google Kubernetes Cluster 생성

Sample Project 만들어보기

Train Model - Random Forest 사용

  • 라이브러리 불러오기
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestRegressor
import joblib

from core.clean_data import CleanData
from core.predict_data import PredictData
from core.load_data import LoadData

core 클래스에는 데이터 전처리 및 예측, 데이터 불러오기 파이썬 파일이 포함되어 있음

loader = LoadData()
cleaner = CleanData()
predicter = PredictData()  

df = loader.load_dataset_as_df()
df = cleaner.clear_question_marks(df)

예측에 필요한 column을 제외한 df 를 생성, ?로 되어있는 결측치 제거

  • Train Test Split
y = df['mpg']
X = cleaner.drop_unused_columns(df)

X_train, X_test, y_train, y_test = train_test_split(
                                    X, y, 
                                    test_size=0.2, 
                                    random_state=42
                                   )
  • Fit & Predict
rf = RandomForestRegressor()
rf.fit(X_train, y_train)

pred = predicter.predict(X_test, rf)
score = predicter.score_r2(y_test)
  • Train 값을 피클 형태로 저장
joblib.dump(rf, "models/rf_model.pkl")

Flask 를 이용하여 예측 값 반환하기

from core.clean_data import CleanData
from core.predict_data import PredictData
from core.load_data import LoadData
from flask import Flask, jsonify, request

app = Flask(__name__)

loader = LoadData()
cleaner = CleanData()
model = loader.load_model_from_path('./models/rf_model.pkl')
predicter = PredictData(model)

@app.route("/", methods=['POST'])
def do_prediction():
    json = request.get_json()
    df = loader.json_to_df(json)
    df = cleaner.clear_question_marks(df)
    X = cleaner.drop_car_name(df)

    prediction = predicter.predict(X)
    return jsonify(prediction[0])

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=5000)

Docker & Kubernetes 이용해 배포

  • Dockerfile 생성
FROM python:3.7

WORKDIR /app

RUN pip install pandas scikit-learn flask gunicorn

ADD ./core ./core
ADD ./models ./models
ADD main.py main.py

EXPOSE 5000

CMD [ "gunicorn", "--bind", "0.0.0.0:5000", "main:app" ]

이미지에 build 에 필요한 정보를 Docker File로 만들기

도커 이미지 build & push

  • 도커 이미지 build & push 를 간편히 하기 위해 스크립트 작성
    • sh build_push_image.sh
#!/bin/bash
ADDRESS=gcr.io
PROJECT_ID=[프로젝트 ID]
REPOSITORY=[이미지 name]
VERSION=[원하는 version]

docker build -t ${PROJECT_ID}:${VERSION} .
ID="$(docker images | grep ${REPOSITORY} | head -n 1 | awk '{print $3}')"

docker tag ${ID} $ADDRESS/${PROJECT_ID}/${REPOSITORY}:${VERSION}

docker push $ADDRESS/${PROJECT_ID}/${REPOSITORY}:${VERSION}

Kubernetes 배포하기

  • Deployment YAML 파일
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mpg
  labels:
    app: mpg
spec:
  replicas: 3
  selector:
    matchLabels:
      app: mpg
  template:
    metadata:
      labels:
        app: mpg
    spec:
      containers:
      - name: auto
        image: gcr.io/macro-authority-266522/auto:0.17
        imagePullPolicy: Always
        ports:
        - containerPort: 5000

3개의 Replica Set 과 Port 번호 5000으로 설정

  • Flask 에서 설정한 포트와 동일하게 설정*
kubectl apply -f deployment.yml

서비스 만들기

  • service YAML 파일
apiVersion: v1
kind: Service
metadata:
  name: mlfromscratch
spec:
  type: LoadBalancer
  selector:
    app: mpg
  ports:
  - protocol: TCP
    port: 80
    targetPort: 5000

mlfromscratch 라는 이름과 로드밸런서 타입을 갖는 서비스를 생성해줍니다.

kubectl apply -f service.yml
  • 외부 IP 확인하기
kubectl get service

위의 명령어를 통해 External - IP 확인

어플리케이션에 예측값 Request 하기

  • POSTMAN 등의 프로그램을 통해 , 위에서 확인한 외부 IP 주소에 차량의 연비를 예측값을 반환하도록 Request 하기

  • JSON Body

{
    "cylinders": 8,
    "displacement": 307.0,
    "horsepower": 130.0,
    "weight": 3504,
    "acceleration": 12.0,
    "model_year": 70,
    "origin": 1,
    "car_name": "chevrolet chevelle malibu"
}

결과값 예시 위 내용의 실습은 MLfromScratch 를 한글로 재구성 하였습니다.