หน้านี้ได้รับการแปลโดย Cloud Translation API
Switch to English

ให้บริการโมเดล TensorFlow

บทช่วยสอนนี้แสดงวิธีใช้ส่วนประกอบ TensorFlow Serving เพื่อส่งออกโมเดล TensorFlow ที่ได้รับการฝึกฝนและใช้ tensorflow_model_server มาตรฐานเพื่อให้บริการ หากคุณคุ้นเคยกับ TensorFlow Serving แล้วและต้องการทราบข้อมูลเพิ่มเติมเกี่ยวกับการทำงานของเซิร์ฟเวอร์ภายในโปรดดู บทแนะนำขั้นสูง ของ TensorFlow Serving

บทช่วยสอนนี้ใช้รูปแบบการถดถอย Softmax อย่างง่ายที่แนะนำในบทช่วยสอน TensorFlow สำหรับการจัดประเภทภาพที่เขียนด้วยลายมือ (ข้อมูล MNIST) หากคุณไม่ทราบว่า TensorFlow หรือ MNIST คืออะไรโปรดดูบทแนะนำ MNIST สำหรับ ML Beginners

โค้ดสำหรับบทช่วยสอนนี้ประกอบด้วยสองส่วน:

  • ไฟล์ Python mnist_saved_model.py ที่ฝึกและส่งออกโมเดล

  • ไบนารี ModelServer ซึ่งสามารถติดตั้งได้โดยใช้ Apt หรือคอมไพล์จากไฟล์ C ++ ( main.cc ) TensorFlow Serving ModelServer ค้นพบโมเดลที่ส่งออกใหม่และเรียกใช้บริการ gRPC เพื่อให้บริการ

ก่อนเริ่มต้นให้ ติดตั้ง Docker ก่อน

ฝึกอบรมและส่งออกโมเดล TensorFlow

ดังที่คุณเห็นใน mnist_saved_model.py การฝึกอบรมจะทำในลักษณะเดียวกับใน บทแนะนำ MNIST สำหรับ ML Beginners กราฟ TensorFlow มีการเปิดตัวในเซสชั่น TensorFlow sess กับเมตริกซ์อินพุท (ภาพ) ขณะที่ x และเมตริกซ์เอาท์พุท (Softmax คะแนน) เป็น y

จากนั้นเราใช้ โมดูล SavedModelBuilder ของ TensorFlow เพื่อส่งออกโมเดล SavedModelBuilder บันทึก "สแนปชอต" ของโมเดลที่ได้รับการฝึกฝนไปยังหน่วยเก็บข้อมูลที่เชื่อถือได้เพื่อให้สามารถโหลดในภายหลังสำหรับการอนุมาน

สำหรับรายละเอียดเกี่ยวกับรูปแบบ SavedModel โปรดดูเอกสารที่ SavedModel README.md

จาก mnist_saved_model.py ต่อไปนี้เป็นข้อมูลโค้ดสั้น ๆ เพื่อแสดงให้เห็นกระบวนการทั่วไปในการบันทึกโมเดลลงในดิสก์

export_path_base = sys.argv[-1]
export_path = os.path.join(
      compat.as_bytes(export_path_base),
      compat.as_bytes(str(FLAGS.model_version)))
print('Exporting trained model to', export_path)
builder = tf.saved_model.builder.SavedModelBuilder(export_path)
builder.add_meta_graph_and_variables(
      sess, [tf.saved_model.tag_constants.SERVING],
      signature_def_map={
           'predict_images':
               prediction_signature,
           signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY:
               classification_signature,
      },
      main_op=tf.tables_initializer())
builder.save()

SavedModelBuilder.__init__ รับอาร์กิวเมนต์ต่อไปนี้:

  • export_path คือพา ธ ของเอ็กซ์พอร์ตไดเร็กทอรี

SavedModelBuilder จะสร้างไดเร็กทอรีหากไม่มีอยู่ ในตัวอย่างเราเชื่อมต่ออาร์กิวเมนต์บรรทัดคำสั่งและ FLAGS.model_version เพื่อรับไดเร็กทอรีเอ็กซ์พอร์ต FLAGS.model_version ระบุ เวอร์ชัน ของโมเดล คุณควรระบุค่าจำนวนเต็มให้มากขึ้นเมื่อเอ็กซ์พอร์ตเวอร์ชันที่ใหม่กว่าของโมเดลเดียวกัน แต่ละเวอร์ชันจะถูกส่งออกไปยังไดเรกทอรีย่อยที่แตกต่างกันภายใต้เส้นทางที่กำหนด

คุณสามารถเพิ่ม meta graph และตัวแปรให้กับ builder โดยใช้ SavedModelBuilder.add_meta_graph_and_variables() โดยมีอาร์กิวเมนต์ดังนี้

  • sess คือเซสชัน TensorFlow ที่เก็บโมเดลที่ผ่านการฝึกอบรมที่คุณกำลังส่งออก

  • tags คือชุดของแท็กที่ใช้บันทึกเมตากราฟ ในกรณีนี้เนื่องจากเราตั้งใจจะใช้กราฟในการแสดงผลเราจึงใช้แท็ก serve จากค่าคงที่ของแท็ก SavedModel ที่กำหนดไว้ล่วงหน้า สำหรับรายละเอียดเพิ่มเติมโปรดดู tag_constants.py และ เอกสาร TensorFlow API ที่เกี่ยวข้อง

  • signature_def_map ระบุแมปของคีย์ที่ผู้ใช้ให้มาสำหรับ ลายเซ็น ไปยัง tensorflow :: SignatureDef เพื่อเพิ่มลงในเมตากราฟ ลายเซ็นระบุชนิดของโมเดลที่กำลังส่งออกและเทนเซอร์อินพุต / เอาท์พุตที่จะผูกไว้เมื่อรันการอนุมาน

    คีย์ลายเซ็นพิเศษ serving_default ระบุลายเซ็นการให้บริการเริ่มต้น ดีฟอลต์ที่ให้บริการคีย์ def ลายเซ็นพร้อมกับค่าคงที่อื่น ๆ ที่เกี่ยวข้องกับลายเซ็นถูกกำหนดให้เป็นส่วนหนึ่งของค่าคงที่ของลายเซ็นที่บันทึกไว้ สำหรับรายละเอียดเพิ่มเติมโปรดดู signature_constants.py และ เอกสาร TensorFlow 1.0 API ที่ เกี่ยวข้อง

    นอกจากนี้เพื่อช่วยในการสร้าง Signature defs ได้อย่างง่ายดาย SavedModel API มียูทิลิตี้ def ลายเซ็น โดยเฉพาะในไฟล์ mnist_saved_model.py ดั้งเดิมเราใช้ signature_def_utils.build_signature_def() เพื่อสร้างการ predict_signature signature_def_utils.build_signature_def() และการ classification_signature

    เป็นตัวอย่างสำหรับการกำหนดค่าการ predict_signature util รับอาร์กิวเมนต์ต่อไปนี้:

    • inputs={'images': tensor_info_x} ระบุข้อมูลอินพุตเทนเซอร์

    • outputs={'scores': tensor_info_y} ระบุข้อมูลคะแนนเทนเซอร์

    • method_name เป็นวิธีการที่ใช้สำหรับการอนุมาน สำหรับคำขอ Prediction ควรตั้งค่าเป็น tensorflow/serving/predict สำหรับชื่อเมธอดอื่นโปรดดู signature_constants.py และ เอกสาร TensorFlow 1.0 API ที่ เกี่ยวข้อง

โปรดสังเกตว่า tensor_info_x และ tensor_info_y มีโครงสร้างของบัฟเฟอร์โปรโตคอล tensorflow::TensorInfo กำหนดไว้ ที่นี่ เพื่อสร้างข้อมูลเทนเซอร์ได้อย่างง่ายดาย TensorFlow SavedModel API ยังมี utils.py พร้อมด้วย เอกสาร TensorFlow 1.0 API ที่ เกี่ยวข้อง

นอกจากนี้โปรดทราบว่า images และ scores เป็นชื่อแทนเทนเซอร์ อาจเป็นสตริงเฉพาะอะไรก็ได้ที่คุณต้องการและจะกลายเป็นชื่อตรรกะของเทนเซอร์ x และ y ที่คุณอ้างถึงสำหรับการเชื่อมเทนเซอร์เมื่อส่งคำขอการคาดคะเนในภายหลัง

ตัวอย่างเช่นถ้า x อ้างถึงเทนเซอร์ที่มีชื่อ 'long_tensor_name_foo' และ y หมายถึงเทนเซอร์ที่มีชื่อ 'created_tensor_name_bar' ตัว builder จะเก็บชื่อตรรกะของเทนเซอร์ไว้ในการแมปชื่อจริง ('images' -> 'long_tensor_name_foo') และ ('คะแนน '->' created_tensor_name_bar ') สิ่งนี้ช่วยให้ผู้ใช้อ้างถึงเทนเซอร์เหล่านี้ด้วยชื่อตรรกะเมื่อรันการอนุมาน

ไปวิ่งกันเลย!

ขั้นแรกหากคุณยังไม่ได้ดำเนินการให้โคลนที่เก็บนี้ลงในเครื่องของคุณ:

git clone https://github.com/tensorflow/serving.git
cd serving

ล้างไดเร็กทอรีการส่งออกหากมีอยู่แล้ว:

rm -rf /tmp/mnist

ตอนนี้มาฝึกโมเดล:

tools/run_in_docker.sh python tensorflow_serving/example/mnist_saved_model.py \
  /tmp/mnist

สิ่งนี้ควรทำให้ได้ผลลัพธ์ที่มีลักษณะดังนี้:

Training model...

...

Done training!
Exporting trained model to models/mnist
Done exporting!

ตอนนี้มาดูที่ไดเรกทอรีการส่งออก

$ ls /tmp/mnist
1

ดังที่ได้กล่าวมาแล้วจะมีการสร้างไดเร็กทอรีย่อยสำหรับการเอ็กซ์พอร์ตแต่ละเวอร์ชันของโมเดล FLAGS.model_version มีค่าดีฟอลต์เป็น 1 ดังนั้นจึงสร้างไดเร็กทอรีย่อย 1 เกี่ยวข้อง

$ ls /tmp/mnist/1
saved_model.pb variables

ไดเร็กทอรีย่อยแต่ละเวอร์ชันมีไฟล์ต่อไปนี้:

  • saved_model.pb เป็น serialized tensorflow :: SavedModel ประกอบด้วยคำจำกัดความของกราฟอย่างน้อย 1 รายการรวมถึงข้อมูลเมตาของแบบจำลองเช่นลายเซ็น

  • variables คือไฟล์ที่เก็บตัวแปรอนุกรมของกราฟ

ด้วยเหตุนี้โมเดล TensorFlow ของคุณจะถูกส่งออกและพร้อมที่จะโหลด!

โหลดโมเดลที่ส่งออกด้วย TensorFlow ModelServer มาตรฐาน

ใช้ Docker ที่ให้บริการอิมเมจเพื่อโหลดโมเดลสำหรับการแสดงผลได้อย่างง่ายดาย:

docker run -p 8500:8500 \
--mount type=bind,source=/tmp/mnist,target=/models/mnist \
-e MODEL_NAME=mnist -t tensorflow/serving &

ทดสอบเซิร์ฟเวอร์

เราสามารถใช้ยูทิลิตี้ mnist_client ที่ ให้มาเพื่อทดสอบเซิร์ฟเวอร์ ไคลเอนต์ดาวน์โหลดข้อมูลการทดสอบ MNIST ส่งเป็นคำร้องขอไปยังเซิร์ฟเวอร์และคำนวณอัตราข้อผิดพลาดในการอนุมาน

tools/run_in_docker.sh python tensorflow_serving/example/mnist_client.py \
  --num_tests=1000 --server=127.0.0.1:8500

สิ่งนี้ควรส่งออกเป็นบางอย่างเช่น

    ...
    Inference error rate: 11.13%

เราคาดว่าจะมีความแม่นยำประมาณ 90% สำหรับรุ่น Softmax ที่ได้รับการฝึกฝนและเราได้รับอัตราข้อผิดพลาดในการอนุมาน 11% สำหรับภาพทดสอบ 1,000 ภาพแรก นี่เป็นการยืนยันว่าเซิร์ฟเวอร์โหลดและรันโมเดลที่ฝึกฝนสำเร็จ!