Deploy Image Recognition ด้วย TensorFlow Serving
วันนี้เราจะมาลองทำ Image Recognition API ด้วย TensorFlow Serving กัน ..และสร้าง client ในการเรียก prediction ไปที่ server ภายใน 15 นาที!!
โพสนี้ประกอบไปด้วย:
- Tensorflow Serving บน Docker
- ResNet: Image Recognition
- Inference Client ด้วย REST API
#1 Tensorflow Serving?
“TensorFlow Serving คือ High Performance Serving System สำหรับ Machine Learningที่ออกแบบมาเพื่อใช้งานบน Production”
ซึ่งเป็นตัวจัดการโมเดล inference ของ machine learning ที่ช่วยในการทำงานบน scale ที่ใหญ่ขึ้น โดยมี features ที่สามารถใช้ได้กับ use cases เหล่านี้:
- ต้องการรันหลายโมเดล หรือหลายโมเดลเวอร์ชั่นพร้อมกัน (ช่วนในการทำ experiments และ A/B testing)
- ปล่อย API endpoints ให้ฝั่ง client (ได้ทั้ง RPC และ HTTP protocol)
- ลด latency และการจัดการทรัพยากร GPU อย่างมีประสิทธิภาพ
Inference คือ การนำโมเดลที่ถูกเทรนแล้ว มาใช้สร้าง prediction กับข้อมูลใหม่ ๆ
#2 Deploy ResNet บน TensorFlow Serving
ในโพสนี้เราจะลอง deploy Pre-trained ResNet ซึ่งเป็น Image Recognition โมเดล ไปที่ TensorFlow Serving เพื่อทำ Inference กันครับ ประกอบไปด้วย 3 ขั้นตอนด้วยกันคือ: ResNet Model, Serving Server, และ Client
2.1 ResNet Model
เริ่มจากสร้าง folder ไว้เก็บโมเดล /tmp/resnet จากนั้นดาวน์โหลด resnet_v2_fp32_savedmodel ด้วย cURL และ extract ไฟล์ (TensorFlow Serving จะใช้ SavedModel format ในการโหลดโมเดล สามารถศึกษาวิธีการ export โมเดลเพิ่มเติมได้ครับ)
$ mkdir /tmp/resnet
$ curl -s https://storage.googleapis.com/download.tensorflow.org/models/official/20181001_resnet/savedmodels/resnet_v2_fp32_savedmodel_NHWC_jpg.tar.gz | tar --strip-components=2 -C /tmp/resnet -xvz
2.2 TensorFlow Serving with Docker
เมื่อได้ Pre-trained ResNet มาแล้ว ต่อไปคือรัน TensorFlow Serving server โดยวิธีที่ง่ายที่สุดคือใช้ผ่าน docker ซึ่งเพียงแค่รันไม่กี่ commands ก็ได้ทั้ง server และ API endpoints ให้เรียกใช้ได้ทันที
$ docker pull tensorflow/serving
$ docker run --rm -it -p 8501:8501 -v /tmp/resnet:/models/resnet -e MODEL_NAME=resnet tensorflow/serving
Docker run command นี้ประกอบไปด้วยอะไรบ้าง:
-p 8501:8501
: เปิดพอร์ต 8501 สำหรับ REST API (8500 สำหรับ gRPC)-v /tmp/resnet:/models/resnet
: mount directory ของ local (/tmp/resnet) ไปที่ container ในชื่อ /models/resnet-e MODEL_NAME=resnet
: กำหนดให้โหลดโมเดลชื่อ “resnet”
2.3 Inference Clients
ขั้นตอนสุดท้ายคือการทำโมเดล Inference โดยรัน client ในการเรียก REST API ไปที่ Serving server
$ curl -o /tmp/resnet/resnet_client.py https://raw.githubusercontent.com/tensorflow/serving/master/tensorflow_serving/example/resnet_client.py$ python /tmp/resnet/resnet_client.py
เท่านี้เราก็ได้ผลลัพธ์ prediction และค่า average latency อีกด้วย ซึ่งอยู่ที่ประมาณ 59 ms 👍
อธิบายโค้ดฝั่ง client กันนิดนึงว่าทำการส่ง request กันยังไง
ซึ่งอันนี้ผมเขียนสรุปให้ใหม่บน Jupyter notebook สามารถเข้าไปลองใช้ดูได้ที่ลิงก์นี้เลยครับ https://github.com/datawiz-thailand/projects/tree/master/tensorflow_serving
ส่ง JSON request เข้าไปที่ TensorFlow Serving server โดยได้ผลลัพธ์จาก response.json()[‘predictions’][0] คือ prediction ที่มีค่า confidence สูงสุดออกมาแสดง >> [pug, pug-dog]
ขอบคุณที่อ่านมาถึงจนจบครับ ถ้าชอบอย่าลืมกดแชร์และกดปรบมือให้ด้วยนะครับ อิอิ
อ้างอิง และอ่านเพิ่มเติมได้ครับ:
- ใช้ TensorRT เพื่อเพิ่มความเร็วครับ, Optimizing TensorFlow Serving Performance with NVIDIA TensorRT, Mar 5, 2019
- Serving ML Quickly with TensorFlow Serving and Docker, Nov 3, 2018
- How to deploy TensorFlow models to production using TF Serving, Jun 18, 2018
- How to deploy Machine Learning models with TensorFlow. Part 1 — make your model ready for serving, Jun 24, 2017
- Running your models in production with TensorFlow Serving, จาก Google AI Blog, Feb 16, 2016
- GitHub repo: https://github.com/tensorflow/serving
- Docker hub: https://hub.docker.com/r/tensorflow/serving
- Datawiz repo: https://github.com/datawiz-thailand/projects/tree/master/tensorflow_serving