Deploy Image Recognition ด้วย TensorFlow Serving

Poom Wettayakorn
DATAWIZ
Published in
3 min readAug 28, 2019

วันนี้เราจะมาลองทำ 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 กับข้อมูลใหม่ ๆ

ภาพความแตกต่างระหว่าง Deep Learning Training และ Inference, โดย Nivida

#2 Deploy ResNet บน TensorFlow Serving

ในโพสนี้เราจะลอง deploy Pre-trained ResNet ซึ่งเป็น Image Recognition โมเดล ไปที่ TensorFlow Serving เพื่อทำ Inference กันครับ ประกอบไปด้วย 3 ขั้นตอนด้วยกันคือ: ResNet Model, Serving Server, และ Client

ภาพรวมการทำงานของ TensorFlow Serving ที่จัดการเรื่องการทำโมเดล Inference ระหว่าง client และ server, จาก Google AI Blog

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
ตัวอย่าง command outputs จากขั้นตอนดาวน์โหลด ResNet โมเดล

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
ตัวอย่าง command outputs จากขั้นตอนการรัน TensorFlow Serving Docker

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
ตัวอย่าง command outputs จากขั้นตอนการรัน resnet_client.py

เท่านี้เราก็ได้ผลลัพธ์ prediction และค่า average latency อีกด้วย ซึ่งอยู่ที่ประมาณ 59 ms 👍

อธิบายโค้ดฝั่ง client กันนิดนึงว่าทำการส่ง request กันยังไง

ซึ่งอันนี้ผมเขียนสรุปให้ใหม่บน Jupyter notebook สามารถเข้าไปลองใช้ดูได้ที่ลิงก์นี้เลยครับ https://github.com/datawiz-thailand/projects/tree/master/tensorflow_serving

ใส่ Server URL และ API Endpoint จากนั้น download รูปภาพจาก Image URL ด้วย requests.get ซึ่งจะได้เป็น image buffer content ออกมา
เลยเขียนโค้ดให้มัน decode รูปภาพออกมานิดหน่อยเพื่อทำการ visualize
นี่คือรูปที่เรากำลังจะเทสนั่นเอง
สร้าง JSON request โดย encode รูปภาพเป็น base64 format
JSON response ผลลัพธ์ จากการ predict

ส่ง JSON request เข้าไปที่ TensorFlow Serving server โดยได้ผลลัพธ์จาก response.json()[‘predictions’][0] คือ prediction ที่มีค่า confidence สูงสุดออกมาแสดง >> [pug, pug-dog]

ขอบคุณที่อ่านมาถึงจนจบครับ ถ้าชอบอย่าลืมกดแชร์และกดปรบมือให้ด้วยนะครับ อิอิ

อ้างอิง และอ่านเพิ่มเติมได้ครับ:

--

--