From LAB to Production – จาก Machine Learning Model สู่ Flask RESTful

จาก Kaggle – วิธีการใช้ Logistic Regression บนข้อมูล Iris เราได้ Model มาแล้ว แต่ จะนำสู่ Production ได้อย่างไร ?

ใน Python มี Object Serialization ทำให้สามารถเก็บ Object ที่สร้างขึ้น ไปไว้ในไฟล์ ซึ่ง มีให้ใช้หลายตัว ได้แก่

  1. pickle
  2. cpickle
  3. joblib

มีคนทำการทดสอบความเร็ว พบว่า cpickle เร็วสุด (https://stackoverflow.com/questions/12615525/what-are-the-different-use-cases-of-joblib-versus-pickle) แต่ในที่นี้ จะใช้ joblib เพราะน่าจะเหมาะกับงานที่ต้องมีการ Load Data ขนาดใหญ่ ใช้งานร่วมกันหลาย Process (เท่าที่เข้าใจครับ)

การสร้างไฟล์ .pkl บน kaggle ดังนี้

  1. เพิ่มคำสั่งต่อไปนี้ แล้ว กดปุ่ม commit and run ด้านบนขวา
    from sklearn.externals import joblib
    joblib.dump(model, 'myiris.pkl')
  2. กดปุ่ม รูป << ด้าน ซ้ายบน เพื่อกลับไป หน้า Kernel ของเรา คลิกที่ Output จะเห็นไฟล์ ที่เพิ่งสร้าง ให้คลิก Download ไปเก็บไว้ใน Folder ที่จะใช้งาน Productioin

ต่อไป จะเป็นขั้นตอนการติดตั้ง และการใช้ Flask ซึ่งเป็น Python Microframework  และ ใช้ Flask RESTful เพื่อสร้าง REST API

  1. ใช้คำสั่งต่อไปนี้ ติดตั้ง flask และ flask-resetful
    pip install flask flask-restful
  2. จากนั้น เข้าไปใน folder ที่เราวางไฟล์ myiris.pkl ไว้ แล้ว สร้างไฟล์ iris.py มี Code ดังนี้
    from flask import Flask, request
    from flask_restful import Resource, Api, reqparse
    from sklearn.externals import joblib
    import pandas as pd
    #from sklearn.linear_model import LogisticRegression
    
    app = Flask(__name__)
    api = Api(app)
    
    # Model
    model = joblib.load('myiris.pkl')
    class Iris(Resource):
        def get(self):        
            return { "greeting":"Hello From IRIS Dataset"}
        def post(self):
            parser = reqparse.RequestParser()
            parser.add_argument('sl')
            parser.add_argument('sw')
            parser.add_argument('pl')
            parser.add_argument('pw')
            args = parser.parse_args()        
            x = pd.DataFrame([[ args['sl'],args['sw'], args['pl'],args['pw'] ]] ,\
                columns=['sepal_length', 'sepal_width', 'petal_length', 'petal_width'])
            result = model.predict(x)
            return {"result": result[0]}, 201
    api.add_resource(Iris, "/iris")
    app.run(debug=True)
    
  3. จากนั้น ไปที่ Command Prompt พิมพ์คำสั่งต่อไปนี้ เพื่อเรียก Flask ขึ้นมาทำงาน โดยรับ Request ที่ Port 5000
    python iris.py

    ได้ผลดังนี้

  4. หากใช้ Web Browser ติดต่อไปยัง http://localhost:5000/iris จะได้ผลดังนี้
  5. แต่ถ้าใช้ Postman ติดต่อไปยัง http://localhost:5000/iris แล้วส่งตัวแปร ความกว้าง ความยาว ของกลีบดอก ผ่าน POST ไป จะได้ผลการ Classification มาว่าเป็น Species อะไร ดังนี้
  6. จากตัวอย่างนี้ แสดงให้เห็นว่า เราสามารถสร้าง Model จากข้อมูลขนาดใหญ่ แล้วนำออกมาเป็น Pickle แล้วใช้ Flask RESTFul เพื่อรับ Request แล้วตอบกลับเป็น ผลการ Classification ได้ หรือ Prediction ต่าง ๆ ได้

เดี๋ยวค่อยมาลงรายละเอียดเรื่อง วิธีการใช้งาน Flask และ การใช้ Machine Learning แบบต่าง ๆ กัน