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

หนึ่งในวิธีที่ง่ายที่สุดในการเริ่มต้นใช้ TensorFlow การแสดงอยู่กับ หาง

# 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] }

สำหรับจุดสิ้นสุดการให้บริการเพิ่มเติมให้ดู ไคลเอ็นต์ REST API

ติดตั้ง Docker

คำแนะนำการติดตั้งทั่วไป บนเว็บไซต์หาง แต่เราจะให้การเชื่อมโยงบางอย่างที่นี่:

เสิร์ฟพร้อม Docker

ดึงภาพเสิร์ฟ

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

docker pull tensorflow/serving

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

ดูหาง Hub tensorflow / ให้บริการ 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 run -p 8501:8501 \
  --mount type=bind,source=/path/to/my_model/,target=/models/my_model \
  -e MODEL_NAME=my_model -t tensorflow/serving

ในกรณีนี้เราได้เริ่มต้นภาชนะหางตีพิมพ์พอร์ต 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 ของคุณไปยังโฟลเดอร์ model ของคอนเทนเนอร์:

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

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

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

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

docker pull tensorflow/serving

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

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

เพื่อให้ได้โมเดลนี้ ขั้นแรกให้โคลน repo TensorFlow Serving

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 และแมปโมเดลที่ต้องการจากโฮสต์ของเราไปยังตำแหน่งที่คาดว่าจะมีโมเดลในคอนเทนเนอร์ นอกจากนี้เรายังส่งชื่อของแบบจำลองเป็นตัวแปรสภาพแวดล้อม ซึ่งจะมีความสำคัญเมื่อเราสืบค้นแบบจำลอง

หากต้องการสอบถามโมเดลโดยใช้ 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] }

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

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

ติดตั้ง nvidia-docker

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

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

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

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

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

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

docker pull tensorflow/serving:latest-gpu

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

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

เพื่อให้ได้โมเดลนี้ ขั้นแรกให้โคลน repo TensorFlow Serving

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 ...

หากต้องการสอบถามโมเดลโดยใช้ 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

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

การพัฒนาด้วย Docker

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