หนึ่งในวิธีที่ง่ายที่สุดในการเริ่มต้นใช้งาน TensorFlow Serving คือการใช้ Docker
# Download the TensorFlow Serving Docker image and repodocker pull tensorflow/serving
git clone https://github.com/tensorflow/serving
# Location of demo modelsTESTDATA="$(pwd)/serving/tensorflow_serving/servables/tensorflow/testdata"
# Start TensorFlow Serving container and open the REST API portdocker 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 APIcurl -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 แต่เราให้ลิงก์ด่วนบางส่วนไว้ที่นี่:
- นักเทียบท่าสำหรับ macOS
- นักเทียบท่าสำหรับ Windows สำหรับ Windows 10 Pro หรือใหม่กว่า
- Docker Toolbox สำหรับ macOS เวอร์ชันเก่ากว่ามาก หรือ Windows เวอร์ชันก่อน Windows 10 Pro
เสิร์ฟพร้อมกับนักเทียบท่า
กำลังดึงรูปภาพที่ให้บริการ
เมื่อคุณติดตั้ง 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 คุณจะต้องมี:
- ไดรเวอร์ NVIDIA ที่ทันสมัยสำหรับระบบของคุณ
-
nvidia-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