Day: January 4, 2019

  • การสร้าง RESTful API สำหรับใช้งานจริง ง่าย ๆ ด้วย Flask และ Waitress

    จาก From LAB to Production – จาก Machine Learning Model สู่ Flask RESTful ซึ่งได้นำ Machine Learning แบบ Statistical Approach อย่าง Logistic Regression ที่สร้างโมเดล และ Train กับข้อมูลเรียบร้อยแล้ว (บนเครื่อง Development) จากนั้น ได้นำโมเดลออกมาใช้งาน โดยใช้ วิธีการ Serialization ด้วย joblib ในภาษา Python ได้เป็นไฟล์ออกมา แล้วจึงนำไปใช้เพื่อใช้ในการทำนาย (predict) ชนิดของดอก Iris บนเครื่อง Production โดยรับ Input จากผู้ใช้ผ่าน HTTP Protocol ทั้ง GET/POST ที่ TCP/5000

    ตัวอย่างดังกล่าว ยังเป็นเพียงการ “ทดสอบ” แต่ในบทความนี้ จะเป็นวิธีการ ซึ่งนำไปสู่การใช้งานจริง ๆ ซึ่ง Flask แนะนำให้ใช้งานกับ “waitress” (น่าจะเลียนแบบจาก Server) ซึ่งเป็น WSGI (Web Server Gateway Interface) อีกตัวหนึ่ง ใช้งานง่าย เพราะไม่ต้องติดตั้ง Apache/Nginx เลย

    ติดตั้ง waitress

    pip install waitress

    predict.py

    from flask import Flask, request, jsonify
    from flask_restful import Resource, Api, reqparse
    from flask_cors import CORS
    
    app = Flask(__name__)
    # Enable CORS
    CORS(app)
    
    @app.route("/predict", methods=["POST"])
    def predict():
    	result = 0
    	if request.method == "POST":    		
    		input_value = request.form["input_value"]
    		# ประมวลผล
    		# ...
    		# ตัวอย่างเช่น รับค่ามา แล้ว คูณ 2
    		result=input_value * 2
    		# ###
    	return jsonify(
    		prediction=result
    	),201

    ไฟล์ predict.py เป็นตัวอย่าง python ซึ่งรับค่า input_value จาก HTML form ผ่าน POST method เข้ามา ที่ /predict ซึ่งเขียนด้วย Flask ที่จะไปเรียกใช้ฟังก์ชั่น prediction() แล้วก็ทำการคำนวณที่ต้องการ จากนั้น ตอบค่ากลับไปเป็น JSON ด้วยฟังก์ชั่น jsonify โดยสามารถกำหนด key ชื่อ prediction และ value เป็น result ที่คำนวณได้ และแจ้ง Response Code เป็น 201

    waitress_server.py

    from waitress import serve
    import predict
    serve(predict.app, host='0.0.0.0', port=8080)

    ไฟล์ waitress_server.py ก็เพียงแค่ import serve จาก waitress ที่ติดตั้งไป และ import predict ซึ่งก็คือไฟล์ predict.py ข้างต้น (อยู่ในไดเรคทอรีเดียวกัน) จากนั้น ก็เรียก predict.app โดยรับได้จากทุก IP (0.0.0.0) ที่ TCP port 8080

    วิธีใช้งาน

    ก็แค่เปิด Command Prompt (ตัวอย่างนี้ทำบน Windows Server) แล้วใช้คำสั่ง

    python waitress_server.py

    จากนั้น ก็พัฒนา web application หรือ จะใช้ postman ทดสอบติดต่อเข้ามาก็ได้ ที่ http://server-ip-address:8080/predict แล้ว POST ข้อมูลเข้ามา ก็จะได้ผลลัพธ์กลับไปเป็น JSON

    หวังว่าจะเป็นประโยชน์ครับ