TensorFlow ให้บริการด้วย Docker

หนึ่งในวิธีที่ง่ายที่สุดในการเริ่มต้นใช้งาน TensorFlow Serving คือการใช้ Docker

# Download the TensorFlow Serving Docker image and repo
docker pull tensorflow/serving
git clone https://github.com/tensorflow/serving # Location of demo models TESTDATA="$(pwd)/serving/tensorflow_serving/servables/tensorflow/testdata" # Start TensorFlow Serving container and open the REST API port docker run -t --rm -p 8501:8501 \ -v "$TESTDATA/saved_model_half_plus_two_cpu:/models/half_plus_two" \ -e MODEL_NAME=half_plus_two \ tensorflow/serving & # Query the model using the predict API curl -d '{"instances": [1.0, 2.0, 5.0]}' \ -X POST http://localhost:8501/v1/models/half_plus_two:predict
# Returns => { "predictions": [2.5, 3.0, 4.5] }

สำหรับจุดสิ้นสุดการให้บริการเพิ่มเติม โปรดดูที่ Client REST API

ติดตั้งนักเทียบท่า

คำแนะนำในการติดตั้งทั่วไปอยู่ ที่ไซต์ Docker แต่เราให้ลิงก์ด่วนบางส่วนไว้ที่นี่:

เสิร์ฟพร้อมกับนักเทียบท่า

กำลังดึงรูปภาพที่ให้บริการ

เมื่อคุณติดตั้ง Docker แล้ว คุณสามารถดึงอิมเมจ Docker ของ TensorFlow Serving ล่าสุดได้โดยการเรียกใช้:

docker pull tensorflow/serving

สิ่งนี้จะดึงอิมเมจ Docker ขั้นต่ำที่ติดตั้ง TensorFlow Serving ลงมา

ดู Docker Hub tensorflow/serving repo สำหรับรูปภาพเวอร์ชันอื่นๆ ที่คุณสามารถดึงได้

กำลังเรียกใช้รูปภาพที่ให้บริการ

รูปภาพที่ให้บริการ (ทั้ง CPU และ GPU) มีคุณสมบัติดังต่อไปนี้:

  • พอร์ต 8500 เปิดเผยสำหรับ gRPC
  • พอร์ต 8501 เปิดเผยสำหรับ REST API
  • ตัวแปรสภาพแวดล้อมเสริม MODEL_NAME (ค่าเริ่มต้นคือ model )
  • ตัวแปรสภาพแวดล้อมเสริม MODEL_BASE_PATH (ค่าเริ่มต้นคือ /models )

เมื่ออิมเมจที่ให้บริการรัน ModelServer มันจะรันดังนี้:

tensorflow_model_server --port=8500 --rest_api_port=8501 \
  --model_name=${MODEL_NAME} --model_base_path=${MODEL_BASE_PATH}/${MODEL_NAME}

หากต้องการให้บริการด้วย Docker คุณจะต้องมี:

  • พอร์ตที่เปิดอยู่บนโฮสต์ของคุณเพื่อให้บริการ
  • SavedModel ที่จะให้บริการ
  • ชื่อของโมเดลของคุณที่ลูกค้าของคุณจะอ้างถึง

สิ่งที่คุณจะทำคือ เรียกใช้คอนเทนเนอร์ Docker เผยแพร่ พอร์ตของคอนเทนเนอร์ไปยังพอร์ตของโฮสต์ของคุณ และติดตั้งเส้นทางของโฮสต์ของคุณไปยัง SavedModel ไปยังตำแหน่งที่คอนเทนเนอร์คาดหวังโมเดล

ลองดูตัวอย่าง:

docker run -p 8501:8501 \
  --mount type=bind,source=/path/to/my_model/,target=/models/my_model \
  -e MODEL_NAME=my_model -t tensorflow/serving

ในกรณีนี้ เราได้เริ่มต้นคอนเทนเนอร์ Docker เผยแพร่พอร์ต REST API 8501 ไปยังพอร์ต 8501 ของโฮสต์ของเรา และนำโมเดลที่เราตั้งชื่อว่า my_model และผูกเข้ากับพาธฐานโมเดลเริ่มต้น ( ${MODEL_BASE_PATH}/${MODEL_NAME} = /models/my_model ) สุดท้าย เราได้กรอกตัวแปรสภาพแวดล้อม MODEL_NAME ด้วย my_model และปล่อย MODEL_BASE_PATH ให้เป็นค่าเริ่มต้น

สิ่งนี้จะทำงานในคอนเทนเนอร์:

tensorflow_model_server --port=8500 --rest_api_port=8501 \
  --model_name=my_model --model_base_path=/models/my_model

หากเราต้องการเผยแพร่พอร์ต gRPC เราจะใช้ -p 8500:8500 คุณสามารถเปิดทั้งพอร์ต gRPC และ REST API พร้อมกัน หรือเลือกเปิดพอร์ตใดพอร์ตหนึ่งก็ได้

ผ่านการโต้แย้งเพิ่มเติม

tensorflow_model_server รองรับอาร์กิวเมนต์เพิ่มเติมมากมายที่คุณสามารถส่งไปยังคอนเทนเนอร์นักเทียบท่าที่ให้บริการได้ ตัวอย่างเช่น หากเราต้องการส่งไฟล์กำหนดค่าโมเดลแทนที่จะระบุชื่อโมเดล เราสามารถดำเนินการดังต่อไปนี้:

docker run -p 8500:8500 -p 8501:8501 \
  --mount type=bind,source=/path/to/my_model/,target=/models/my_model \
  --mount type=bind,source=/path/to/my/models.config,target=/models/models.config \
  -t tensorflow/serving --model_config_file=/models/models.config

วิธีการนี้ใช้ได้กับอาร์กิวเมนต์บรรทัดคำสั่งอื่นๆ ที่ tensorflow_model_server รองรับ

การสร้างภาพการให้บริการของคุณเอง

หากคุณต้องการรูปภาพที่ให้บริการซึ่งมีโมเดลของคุณอยู่ในคอนเทนเนอร์ คุณสามารถสร้างรูปภาพของคุณเองได้

ขั้นแรกให้รันอิมเมจที่ให้บริการเป็น daemon:

docker run -d --name serving_base tensorflow/serving

จากนั้น คัดลอก SavedModel ของคุณไปยังโฟลเดอร์โมเดลของคอนเทนเนอร์:

docker cp models/<my model> serving_base:/models/<my model>

สุดท้าย คอมมิตคอนเทนเนอร์ที่ให้บริการโมเดลของคุณโดยเปลี่ยน MODEL_NAME ให้ตรงกับชื่อโมเดลของคุณ ` ':

docker commit --change "ENV MODEL_NAME <my model>" serving_base <my container>

ตอนนี้คุณสามารถหยุด serving_base ได้แล้ว

docker kill serving_base

สิ่งนี้จะทำให้คุณมีอิมเมจ Docker ชื่อ <my container> ซึ่งคุณสามารถปรับใช้และจะโหลดโมเดลของคุณเพื่อให้บริการเมื่อเริ่มต้นระบบ

ตัวอย่างการเสิร์ฟ

มาดูตัวอย่างเต็มที่เราโหลด SavedModel และเรียกมันโดยใช้ REST API ขั้นแรกให้ดึงรูปภาพที่ให้บริการ:

docker pull tensorflow/serving

สิ่งนี้จะดึงอิมเมจ TensorFlow Serving ล่าสุดที่ติดตั้ง ModelServer

ต่อไป เราจะใช้โมเดลของเล่นที่เรียกว่า Half Plus Two ซึ่งสร้าง 0.5 * x + 2 สำหรับค่า x ที่เราเตรียมไว้สำหรับการทำนาย

หากต้องการรับโมเดลนี้ ให้โคลน repo ที่ให้บริการ TensorFlow ก่อน

mkdir -p /tmp/tfserving
cd /tmp/tfserving
git clone https://github.com/tensorflow/serving

จากนั้น เรียกใช้คอนเทนเนอร์ TensorFlow Serving โดยชี้ไปที่โมเดลนี้ และเปิดพอร์ต REST API (8501):

docker run -p 8501:8501 \
  --mount type=bind,\
source=/tmp/tfserving/serving/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_cpu,\
target=/models/half_plus_two \
  -e MODEL_NAME=half_plus_two -t tensorflow/serving &

สิ่งนี้จะเรียกใช้คอนเทนเนอร์นักเทียบท่าและเปิดใช้งาน TensorFlow Serving Model Server เชื่อมโยงพอร์ต REST API 8501 และแมปโมเดลที่เราต้องการจากโฮสต์ของเราไปยังตำแหน่งที่คาดหวังโมเดลในคอนเทนเนอร์ นอกจากนี้เรายังส่งชื่อของโมเดลเป็นตัวแปรสภาพแวดล้อม ซึ่งจะมีความสำคัญเมื่อเราสืบค้นโมเดล

หากต้องการสอบถามโมเดลโดยใช้ Predict API คุณสามารถเรียกใช้ได้

curl -d '{"instances": [1.0, 2.0, 5.0]}' \
  -X POST http://localhost:8501/v1/models/half_plus_two:predict

สิ่งนี้ควรส่งคืนชุดของค่า:

{ "predictions": [2.5, 3.0, 4.5] }

ข้อมูลเพิ่มเติมเกี่ยวกับการใช้ RESTful API สามารถพบได้ ที่นี่

ให้บริการด้วย Docker โดยใช้ GPU ของคุณ

ติดตั้ง nvidia-docker

ก่อนที่จะให้บริการด้วย GPU นอกเหนือจาก การติดตั้ง Docker คุณจะต้องมี:

กำลังเรียกใช้อิมเมจการแสดง GPU

การเรียกใช้อิมเมจที่ให้บริการ GPU นั้นเหมือนกับการรันอิมเมจ CPU สำหรับรายละเอียดเพิ่มเติม โปรดดูที่ การเรียกใช้อิมเมจที่แสดง

ตัวอย่างการให้บริการ GPU

มาดูตัวอย่างฉบับเต็มที่เราโหลดโมเดลที่มี Ops ที่ผูกกับ GPU และเรียกมันโดยใช้ REST API

ขั้นแรกให้ติดตั้ง nvidia-docker ถัดไป คุณสามารถดึงอิมเมจนักเทียบท่า GPU ของ TensorFlow Serving ล่าสุดได้โดยการเรียกใช้:

docker pull tensorflow/serving:latest-gpu

สิ่งนี้จะดึงอิมเมจ Docker ขั้นต่ำลงมาด้วย ModelServer ที่สร้างขึ้นเพื่อทำงานบน GPU ที่ติดตั้งไว้

ต่อไป เราจะใช้โมเดลของเล่นที่เรียกว่า Half Plus Two ซึ่งสร้าง 0.5 * x + 2 สำหรับค่า x ที่เราเตรียมไว้สำหรับการทำนาย โมเดลนี้จะมีการผูกการทำงานกับอุปกรณ์ GPU และจะไม่ทำงานบน CPU

หากต้องการรับโมเดลนี้ ให้โคลน repo ที่ให้บริการ TensorFlow ก่อน

mkdir -p /tmp/tfserving
cd /tmp/tfserving
git clone https://github.com/tensorflow/serving

จากนั้น เรียกใช้คอนเทนเนอร์ TensorFlow Serving โดยชี้ไปที่โมเดลนี้ และเปิดพอร์ต REST API (8501):

docker run --gpus all -p 8501:8501 \
--mount type=bind,\
source=/tmp/tfserving/serving/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_gpu,\
target=/models/half_plus_two \
  -e MODEL_NAME=half_plus_two -t tensorflow/serving:latest-gpu &

สิ่งนี้จะเรียกใช้คอนเทนเนอร์นักเทียบท่า เปิดใช้งาน TensorFlow Serving Model Server ผูกพอร์ต REST API 8501 และแมปโมเดลที่ต้องการจากโฮสต์ของเราไปยังตำแหน่งที่คาดหวังโมเดลในคอนเทนเนอร์ นอกจากนี้เรายังส่งชื่อของโมเดลเป็นตัวแปรสภาพแวดล้อม ซึ่งจะมีความสำคัญเมื่อเราสืบค้นโมเดล

เคล็ดลับ: ก่อนที่จะสอบถามโมเดล โปรดรอจนกว่าคุณจะเห็นข้อความดังต่อไปนี้ ซึ่งระบุว่าเซิร์ฟเวอร์พร้อมที่จะรับคำขอ:

2018-07-27 00:07:20.773693: I tensorflow_serving/model_servers/main.cc:333]
Exporting HTTP/REST API at:localhost:8501 ...

หากต้องการสอบถามโมเดลโดยใช้ Predict API คุณสามารถเรียกใช้ได้

curl -d '{"instances": [1.0, 2.0, 5.0]}' \
  -X POST http://localhost:8501/v1/models/half_plus_two:predict

สิ่งนี้ควรส่งคืนชุดของค่า:

{ "predictions": [2.5, 3.0, 4.5] }

เคล็ดลับ: การพยายามเรียกใช้โมเดล GPU บนเครื่องที่ไม่มี GPU หรือไม่มีโครงสร้าง GPU ที่ใช้งานได้ของ TensorFlow Model Server จะส่งผลให้เกิดข้อผิดพลาดที่มีลักษณะดังนี้:

Cannot assign a device for operation 'a': Operation was explicitly assigned to /device:GPU:0

ข้อมูลเพิ่มเติมเกี่ยวกับการใช้ RESTful API สามารถพบได้ ที่นี่

การพัฒนาด้วยนักเทียบท่า

สำหรับคำแนะนำเกี่ยวกับวิธีสร้างและพัฒนา Tensorflow Serving โปรดดู คู่มือการพัฒนาด้วย Docker