- 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)
-
- Google Cloud SDK
- Path 추가 하기 bin folder of the SDK:
export PATH="/Applications/google-cloud-sdk/bin"
-
- Docker & kubectl 다운로드
-
- Google Kubernetes Cluster 생성
- 라이브러리 불러오기
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")
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)
- 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 를 간편히 하기 위해 스크립트 작성
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}
- 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 확인
-
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 를 한글로 재구성 하였습니다.