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

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

บทช่วยสอนนี้ใช้โมเดล Softmax Regression แบบธรรมดาที่แยกประเภทตัวเลขที่เขียนด้วยลายมือ มันคล้ายกับที่แนะนำใน บทช่วยสอน TensorFlow เกี่ยวกับการจำแนกรูปภาพโดยใช้ชุดข้อมูล Fashion MNIST มาก

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

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

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

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

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

สำหรับขั้นตอนการฝึก กราฟ TensorFlow จะเปิดตัวใน sess ชั่น TensorFlow โดยมีเทนเซอร์อินพุต (รูปภาพ) เป็น 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(
    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 จะสร้างไดเร็กทอรีหากไม่มีอยู่ ในตัวอย่าง เราเชื่อมอาร์กิวเมนต์บรรทัดคำสั่งและ 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 จัดเตรียม def utils ของลายเซ็น .. โดยเฉพาะในไฟล์ mnist_saved_model.py ดั้งเดิม เราใช้ signature_def_utils.build_signature_def() เพื่อสร้าง predict_signature และ classification_signature

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

    • 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 ที่กำหนดไว้ ที่นี่ เพื่อให้สร้างข้อมูลเทนเซอร์ได้อย่างง่ายดาย TensorFlow SavedModel API ยังมี utils.py พร้อมด้วย เอกสารประกอบ TensorFlow API ที่เกี่ยวข้อง

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