โมเดลที่บันทึกไว้แบบใช้ซ้ำได้

การแนะนำ

TensorFlow Hub โฮสต์ SavedModels สำหรับ TensorFlow 2 รวมถึงเนื้อหาอื่นๆ สามารถโหลดกลับเข้าไปในโปรแกรม Python ได้ด้วย obj = hub.load(url) [ เรียนรู้เพิ่มเติม ] obj ที่ส่งคืนเป็นผลลัพธ์ของ tf.saved_model.load() (ดู คู่มือ SavedModel ของ TensorFlow) อ็อบเจ็กต์นี้สามารถมีแอตทริบิวต์ที่กำหนดเองได้ เช่น tf.functions, tf.Variables (กำหนดค่าเริ่มต้นจากค่าที่ได้รับการฝึกไว้ล่วงหน้า) ทรัพยากรอื่นๆ และอ็อบเจ็กต์ดังกล่าวแบบเรียกซ้ำเพิ่มเติม

หน้านี้อธิบายอินเทอร์เฟซที่จะนำไปใช้โดย obj ที่โหลด เพื่อนำ มาใช้ซ้ำ ในโปรแกรม TensorFlow Python SavedModels ที่สอดคล้องกับอินเทอร์เฟซนี้เรียกว่า Reusable SavedModels

การใช้ซ้ำหมายถึงการสร้างแบบจำลองที่ใหญ่ขึ้นรอบๆ obj รวมถึงความสามารถในการปรับแต่งอย่างละเอียด การปรับแต่งอย่างละเอียดหมายถึงการฝึกตุ้มน้ำหนักเพิ่มเติมใน obj ที่โหลดโดยเป็นส่วนหนึ่งของโมเดลโดยรอบ ฟังก์ชันการสูญเสียและตัวเพิ่มประสิทธิภาพถูกกำหนดโดยแบบจำลองโดยรอบ obj เพียงกำหนดการแมปของการเปิดใช้งานอินพุตกับเอาต์พุต ("การส่งต่อ") ซึ่งอาจรวมถึงเทคนิคต่างๆ เช่น การออกกลางคันหรือการทำให้เป็นมาตรฐานแบบแบตช์

ทีม TensorFlow Hub แนะนำให้ใช้อินเทอร์เฟซ Reusable SavedModel ใน SavedModels ทั้งหมดที่มีไว้เพื่อนำมาใช้ซ้ำในแง่ข้างต้น ยูทิลิตี้จำนวนมากจากไลบรารี tensorflow_hub โดยเฉพาะ hub.KerasLayer จำเป็นต้องมี SavedModels เพื่อนำไปใช้

ความสัมพันธ์กับ SignatureDefs

อินเทอร์เฟซนี้ในแง่ของ tf.functions และคุณสมบัติ TF2 อื่น ๆ แยกจากลายเซ็นของ SavedModel ซึ่งมีให้ใช้งานตั้งแต่ TF1 และยังคงใช้ใน TF2 สำหรับการอนุมาน (เช่น การปรับใช้ SavedModels กับ TF Serving หรือ TF Lite) ลายเซ็นสำหรับการอนุมานไม่ชัดเจนเพียงพอที่จะรองรับการปรับแต่งอย่างละเอียด และ tf.function มอบ Python API ที่เป็นธรรมชาติและชัดเจนยิ่งขึ้นสำหรับโมเดลที่นำกลับมาใช้ใหม่

ความสัมพันธ์กับไลบรารีการสร้างแบบจำลอง

SavedModel แบบใช้ซ้ำได้จะใช้เฉพาะ TensorFlow 2 ดั้งเดิมเท่านั้น โดยไม่ขึ้นอยู่กับไลบรารีการสร้างแบบจำลองใดๆ เช่น Keras หรือ Sonnet สิ่งนี้อำนวยความสะดวกในการนำมาใช้ซ้ำในไลบรารีการสร้างโมเดล โดยปราศจากการพึ่งพาโค้ดการสร้างโมเดลดั้งเดิม

จำเป็นต้องมีการปรับเปลี่ยนจำนวนหนึ่งในการโหลด Reusable SavedModels ลงในหรือบันทึกจากไลบรารีการสร้างโมเดลที่กำหนด สำหรับ Keras นั้น hub.KerasLayer จัดเตรียมการโหลด และการบันทึกในตัวของ Keras ในรูปแบบ SavedModel ได้รับการออกแบบใหม่สำหรับ TF2 โดยมีเป้าหมายในการจัดเตรียม superset ของอินเทอร์เฟซนี้ (ดู RFC ตั้งแต่เดือนพฤษภาคม 2019)

ความสัมพันธ์กับงาน "Common SavedModel APIs" เฉพาะงาน

คำจำกัดความของอินเทอร์เฟซในหน้านี้อนุญาตให้มีอินพุตและเอาต์พุตจำนวนและประเภทใดก็ได้ Common SavedModel API สำหรับ TF Hub ปรับปรุงอินเทอร์เฟซทั่วไปนี้ด้วยรูปแบบการใช้งานสำหรับงานเฉพาะเพื่อให้โมเดลสามารถใช้แทนกันได้ง่ายดาย

คำจำกัดความของอินเทอร์เฟซ

คุณสมบัติ

SavedModel ที่นำมาใช้ซ้ำได้คือ TensorFlow 2 SavedModel โดยที่ obj = tf.saved_model.load(...) ส่งคืนวัตถุที่มีคุณลักษณะดังต่อไปนี้

  • __call__ . ที่จำเป็น. tf.function ที่ใช้การคำนวณของโมเดล ("ส่งต่อ") ภายใต้ข้อกำหนดด้านล่าง

  • variables : รายการของวัตถุ tf.Variable แสดงรายการตัวแปรทั้งหมดที่ใช้โดยการเรียกใช้ __call__ ที่เป็นไปได้ รวมถึงทั้งตัวแปรที่ฝึกได้และไม่สามารถฝึกได้

    รายการนี้สามารถละเว้นได้หากว่างเปล่า

  • trainable_variables : รายการของอ็อบเจ็กต์ tf.Variable โดยที่ v.trainable เป็นจริงสำหรับองค์ประกอบทั้งหมด ตัวแปรเหล่านี้ต้องเป็นชุดย่อยของ variables ตัวแปรเหล่านี้เป็นตัวแปรที่ต้องฝึกฝนเมื่อทำการปรับวัตถุอย่างละเอียด ผู้สร้าง SavedModel อาจเลือกที่จะละเว้นตัวแปรบางตัวที่นี่ซึ่งแต่เดิมสามารถฝึกได้เพื่อระบุว่าไม่ควรแก้ไขสิ่งเหล่านี้ในระหว่างการปรับแต่งแบบละเอียด

    รายการนี้สามารถละเว้นได้หากว่างเปล่า โดยเฉพาะอย่างยิ่งหาก SavedModel ไม่รองรับการปรับแต่งอย่างละเอียด

  • regularization_losses : รายการ tf.functions โดยแต่ละรายการรับอินพุตเป็นศูนย์และส่งคืนเทนเซอร์สเกลาร์โฟลตตัวเดียว สำหรับการปรับแต่งอย่างละเอียด ขอแนะนำให้ผู้ใช้ SavedModel รวมสิ่งเหล่านี้เป็นเงื่อนไขการทำให้เป็นมาตรฐานเพิ่มเติมในการสูญเสีย (ในกรณีที่ง่ายที่สุดโดยไม่ต้องปรับขนาดเพิ่มเติม) โดยปกติแล้วสิ่งเหล่านี้จะใช้เพื่อแสดงตัวควบคุมน้ำหนักอย่างสม่ำเสมอ (หากไม่มีอินพุต tf.functions เหล่านี้จึงไม่สามารถแสดงตัวกำหนดกิจกรรมที่สม่ำเสมอได้)

    รายการนี้สามารถละเว้นได้หากว่างเปล่า โดยเฉพาะอย่างยิ่งหาก SavedModel ไม่รองรับการปรับแต่งอย่างละเอียดหรือไม่ต้องการกำหนดน้ำหนักให้เป็นมาตรฐาน

ฟังก์ชัน __call__

Restored SavedModel obj มีแอตทริบิวต์ obj.__call__ ที่เป็น tf.function ที่ได้รับการกู้คืน และอนุญาตให้เรียก obj ได้ดังต่อไปนี้

เรื่องย่อ (รหัสหลอก):

outputs = obj(inputs, trainable=..., **kwargs)

ข้อโต้แย้ง

ข้อโต้แย้งมีดังนี้

  • มีอาร์กิวเมนต์ที่จำเป็นหนึ่งตำแหน่งพร้อมชุดการเปิดใช้งานอินพุตของ SavedModel ประเภทของมันคือหนึ่งใน

    • เทนเซอร์ตัวเดียวสำหรับอินพุตตัวเดียว
    • รายการเทนเซอร์สำหรับลำดับอินพุตที่ไม่มีชื่อตามลำดับ
    • คำสั่งของเทนเซอร์ที่คีย์โดยชุดชื่ออินพุตเฉพาะ

    (การแก้ไขอินเทอร์เฟซนี้ในอนาคตอาจทำให้มีรังทั่วไปมากขึ้น) ผู้สร้าง SavedModel เลือกหนึ่งในนั้น รวมถึงรูปร่างเทนเซอร์และประเภท หากมีประโยชน์ ขนาดบางส่วนของรูปร่างไม่ควรกำหนดไว้ (โดยเฉพาะขนาดแบทช์)

  • อาจมี training อาร์กิวเมนต์คำหลักเสริมที่ยอมรับ Python boolean, True หรือ False ค่าเริ่มต้นคือ False หากแบบจำลองรองรับการปรับแต่งอย่างละเอียด และหากการคำนวณแตกต่างกันระหว่างทั้งสอง (เช่น ในการออกกลางคันและการทำให้เป็นมาตรฐานแบบแบตช์) ความแตกต่างนั้นจะถูกนำมาใช้กับอาร์กิวเมนต์นี้ มิฉะนั้นอาร์กิวเมนต์นี้อาจหายไป

    ไม่จำเป็นว่า __call__ จะต้องยอมรับข้อโต้แย้ง training ที่มีค่าเทนเซอร์ ผู้โทรจะต้องใช้ tf.cond() หากจำเป็นในการจัดส่งระหว่างกัน

  • ผู้สร้าง SavedModel อาจเลือกที่จะยอมรับ kwargs ที่เป็นตัวเลือกเพิ่มเติมของชื่อเฉพาะ

    • สำหรับอาร์กิวเมนต์ที่มีค่าเทนเซอร์ ผู้สร้าง SavedModel จะกำหนดประเภทและรูปร่างที่อนุญาต tf.function ยอมรับค่าเริ่มต้นของ Python ในอาร์กิวเมนต์ที่ติดตามด้วยอินพุต tf.TensorSpec อาร์กิวเมนต์ดังกล่าวสามารถใช้เพื่ออนุญาตการปรับแต่งไฮเปอร์พารามิเตอร์ตัวเลขที่เกี่ยวข้องกับ __call__ (เช่น อัตราการออกกลางคัน)

    • สำหรับอาร์กิวเมนต์ที่มีค่า Python ผู้สร้าง SavedModel จะกำหนดค่าที่อนุญาต อาร์กิวเมนต์ดังกล่าวสามารถใช้เป็นแฟล็กเพื่อสร้างตัวเลือกที่ไม่ต่อเนื่องในฟังก์ชันการติดตาม (แต่ระวังการระเบิดของร่องรอยแบบผสมผสาน)

ฟังก์ชัน __call__ ที่กู้คืนจะต้องจัดเตรียมการติดตามสำหรับชุดอาร์กิวเมนต์ที่อนุญาตทั้งหมด training พลิกระหว่าง True และ False จะต้องไม่เปลี่ยนการอนุญาตของการโต้แย้ง

ผลลัพธ์

outputs จากการเรียก obj อาจเป็นได้

  • เทนเซอร์ตัวเดียวสำหรับเอาต์พุตตัวเดียว
  • รายการเทนเซอร์สำหรับลำดับเอาต์พุตที่ไม่มีชื่อตามลำดับ
  • คำสั่งของ Tensors ที่คีย์โดยชุดชื่อเอาต์พุตเฉพาะ

(การแก้ไขอินเทอร์เฟซนี้ในอนาคตอาจทำให้มีรังทั่วไปมากขึ้น) ประเภทการส่งคืนอาจแตกต่างกันไปขึ้นอยู่กับ kwargs ที่มีค่า Python สิ่งนี้ทำให้แฟล็กสร้างเอาต์พุตพิเศษได้ ผู้สร้าง SavedModel กำหนดประเภทและรูปร่างของเอาต์พุตและการพึ่งพาอินพุต

ชื่อที่เรียกได้

SavedModel แบบใช้ซ้ำได้สามารถจัดเตรียมชิ้นส่วนโมเดลได้หลายชิ้นตามที่อธิบายไว้ข้างต้น โดยการใส่ลงในอ็อบเจ็กต์ย่อยที่มีชื่อ เช่น obj.foo , obj.bar และอื่นๆ แต่ละวัตถุย่อยจัดเตรียมวิธีการ __call__ และคุณลักษณะที่สนับสนุนเกี่ยวกับตัวแปร ฯลฯ เฉพาะสำหรับชิ้นส่วนโมเดลนั้น สำหรับตัวอย่างข้างต้น จะมี obj.foo.__call__ , obj.foo.variables และอื่นๆ

โปรดทราบว่าอินเทอร์เฟซนี้ ไม่ ครอบคลุมวิธีการเพิ่ม tf.function เปล่าโดยตรงเป็น tf.foo

ผู้ใช้ Reusable SavedModels ได้รับการคาดหวังให้จัดการการซ้อนระดับเดียวเท่านั้น ( obj.bar แต่ไม่ใช่ obj.bar.baz ) (การแก้ไขอินเทอร์เฟซนี้ในอนาคตอาจทำให้มีการซ้อนได้ลึกขึ้น และอาจยกเว้นข้อกำหนดที่วัตถุระดับบนสุดสามารถเรียกได้เอง)

คำกล่าวปิดท้าย

ความสัมพันธ์กับ API ในกระบวนการ

เอกสารนี้อธิบายอินเทอร์เฟซของคลาส Python ซึ่งประกอบด้วยพื้นฐาน เช่น tf.function และ tf.Variable ที่สามารถไปกลับได้ผ่านการทำให้เป็นอนุกรมผ่าน tf.saved_model.save() และ tf.saved_model.load() อย่างไรก็ตาม อินเทอร์เฟซมีอยู่แล้วบนออบเจ็กต์ต้นฉบับที่ส่งต่อไปยัง tf.saved_model.save() การปรับให้เข้ากับอินเทอร์เฟซนั้นทำให้สามารถแลกเปลี่ยนชิ้นส่วนโมเดลผ่าน API การสร้างโมเดลภายในโปรแกรม TensorFlow เดียว