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

จัดทุกอย่างให้เป็นระเบียบอยู่เสมอด้วยคอลเล็กชัน บันทึกและจัดหมวดหมู่เนื้อหาตามค่ากำหนดของคุณ

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

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

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

  • ไฟล์หลาม, mnist_saved_model.py ที่รถไฟและการส่งออกรูปแบบ

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

ก่อนที่จะเริ่มต้นก่อน การติดตั้งหาง

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

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

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

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

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

export_path_base = sys.argv[-1]
export_path = os.path.join(
    tf.compat.as_bytes(export_path_base),
    tf.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.compat.v1.saved_model.tag_constants.SERVING],
    signature_def_map={
        'predict_images':
            prediction_signature,
        tf.compat.v1.saved_model.signature_constants
            .DEFAULT_SERVING_SIGNATURE_DEF_KEY:
            classification_signature,
    },
    main_op=tf.compat.v1.tables_initializer(),
    strip_default_attrs=True)
builder.save()

SavedModelBuilder.__init__ เตะโต้แย้งต่อไปนี้:

  • export_path เป็นเส้นทางของไดเรกทอรีการส่งออก

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

คุณสามารถเพิ่มเมตากราฟและตัวแปรที่จะสร้างโดยใช้ SavedModelBuilder.add_meta_graph_and_variables() มีข้อโต้แย้งต่อไปนี้:

  • sess คือเซสชั่น TensorFlow ที่ถือรูปแบบการฝึกอบรมคุณกำลังส่งออก

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

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

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

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

    เป็นตัวอย่างสำหรับวิธีการที่ predict_signature กำหนด util จะเกิดข้อโต้แย้งต่อไปนี้:

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

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

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

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

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

ตัวอย่างเช่นถ้า x หมายถึงเมตริกซ์ที่มีชื่อ 'long_tensor_name_foo และ y หมายถึงเมตริกซ์ที่มีชื่อ 'generated_tensor_name_bar' builder จะเก็บเมตริกซ์ชื่อตรรกะที่จะชื่อจริงของการทำแผนที่ ( 'ภาพ' -> 'long_tensor_name_foo') และ (' คะแนน ' -> 'generated_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 เป็นอันดับ tensorflow :: SavedModel ประกอบด้วยคำจำกัดความของกราฟอย่างน้อยหนึ่งรายการของแบบจำลอง ตลอดจนข้อมูลเมตาของแบบจำลอง เช่น ลายเซ็น

  • 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 ภาพแรก นี่เป็นการยืนยันว่าเซิร์ฟเวอร์โหลดและรันโมเดลที่ฝึกได้สำเร็จ!