มีคำถาม? เชื่อมต่อกับชุมชนที่ฟอรัม TensorFlow เยี่ยมชมฟอรัม

รุ่นที่บันทึกไว้จาก TF Hub ใน TensorFlow 2

รูปแบบ SavedModel ของ TensorFlow 2 เป็นวิธีที่แนะนำในการแบ่งปันโมเดลและชิ้นส่วนโมเดลที่ผ่านการฝึกอบรมมาแล้วบน TensorFlow Hub แทนที่ รูปแบบ TF1 Hub ที่ เก่ากว่าและมาพร้อมกับชุด API ใหม่

หน้านี้อธิบายถึงวิธีการนำ TF2 SavedModels กลับมาใช้ใหม่ในโปรแกรม TensorFlow 2 ด้วย hub.load() ระดับต่ำและ hub.KerasLayer wrapper (โดยทั่วไปแล้ว hub.KerasLayer จะรวมกับtf.keras.layers อื่น ๆ เพื่อสร้างโมเดล Keras หรือ model_fn ของเครื่องมือประมาณการ TF2) API เหล่านี้ยังสามารถโหลดโมเดลเดิมในรูปแบบ TF1 Hub ภายในขีด จำกัด โปรดดู คู่มือความเข้ากันได้

ผู้ใช้ TensorFlow 1 สามารถอัปเดตเป็น TF 1.15 จากนั้นใช้ API เดียวกัน TF1 เวอร์ชันเก่าไม่ทำงาน

ใช้ SavedModels จาก TF Hub

การใช้ SavedModel ใน Keras

Keras เป็น API ระดับสูงของ TensorFlow สำหรับการสร้างแบบจำลองการเรียนรู้เชิงลึกโดยการเขียนออบเจ็กต์ Keras Layer ไลบรารี tensorflow_hub จัดเตรียมคลาส hub.KerasLayer ที่เริ่มต้นด้วย URL (หรือเส้นทางระบบไฟล์) ของ SavedModel จากนั้นจัดเตรียมการคำนวณจาก SavedModel รวมถึงน้ำหนักที่ฝึกไว้ล่วงหน้า

นี่คือตัวอย่างของการใช้การฝังข้อความที่ผ่านการฝึกอบรมมาแล้ว:

import tensorflow as tf
import tensorflow_hub as hub

hub_url = "https://tfhub.dev/google/nnlm-en-dim128/2"
embed = hub.KerasLayer(hub_url)
embeddings = embed(["A long sentence.", "single-word", "http://example.com"])
print(embeddings.shape, embeddings.dtype)

จากสิ่งนี้ตัวจำแนกข้อความสามารถสร้างได้ด้วยวิธี Keras ตามปกติ:

model = tf.keras.Sequential([
    embed,
    tf.keras.layers.Dense(16, activation="relu"),
    tf.keras.layers.Dense(1, activation="sigmoid"),
])

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

โมเดลน้ำหนักใน hub.KerasLayer ถูกตั้งค่าเป็นไม่สามารถฝึกได้ตามค่าเริ่มต้น ดูหัวข้อการปรับแต่งอย่างละเอียดด้านล่างสำหรับวิธีการเปลี่ยนแปลง น้ำหนักจะใช้ร่วมกันระหว่างแอปพลิเคชันทั้งหมดของออบเจ็กต์เลเยอร์เดียวกันตามปกติใน Keras

การใช้ SavedModel ในเครื่องมือประมาณการ

ผู้ใช้ Estimator API ของ TensorFlow สำหรับการฝึกอบรมแบบกระจายสามารถใช้ SavedModels จาก TF Hub โดยเขียน model_fn ในรูปแบบของ hub.KerasLayer ท่ามกลางtf.keras.layers

เบื้องหลัง: การดาวน์โหลดและแคชรุ่นที่บันทึกไว้

การใช้ SavedModel จาก TensorFlow Hub (หรือเซิร์ฟเวอร์ HTTPS อื่น ๆ ที่ใช้โปรโตคอลการ โฮสต์ ) จะดาวน์โหลดและคลายการบีบอัดไปยังระบบไฟล์ภายในหากยังไม่มีอยู่ สามารถตั้งค่าตัวแปรสภาพแวดล้อม TFHUB_CACHE_DIR เพื่อแทนที่ตำแหน่งชั่วคราวเริ่มต้นสำหรับการแคช SavedModels ที่ดาวน์โหลดและไม่บีบอัด โปรดดูรายละเอียดใน การแคช

การใช้ SavedModel ใน TensorFlow ระดับต่ำ

ฟังก์ชั่น hub.load(handle) การดาวน์โหลดและการ decompresses SavedModel (ถ้า handle อยู่แล้วเส้นทางระบบแฟ้ม) แล้วส่งกลับผลของการโหลดกับ TensorFlow ในตัวฟังก์ชั่น tf.saved_model.load() ดังนั้น hub.load() สามารถจัดการกับ SavedModel ที่ถูกต้อง (ไม่เหมือนกับ hub.Module รุ่นก่อน hub.Module สำหรับ TF1)

หัวข้อขั้นสูง: สิ่งที่คาดหวังจาก SavedModel หลังจากโหลด

ขึ้นอยู่กับเนื้อหาของ SavedModel ผลลัพธ์ของ obj = hub.load(...) สามารถเรียกใช้ได้หลายวิธี (ตามที่อธิบายไว้ในรายละเอียดที่มากขึ้นใน คู่มือ SavedModel ของ TensorFlow :

  • ลายเซ็นการให้บริการของ SavedModel (ถ้ามี) จะแสดงเป็นพจนานุกรมของฟังก์ชันที่เป็นรูปธรรมและสามารถเรียกได้เช่น tensors_out = obj.signatures["serving_default"](**tensors_in) โดยมีพจนานุกรมของเทนเซอร์ที่คีย์โดยอินพุตและเอาต์พุตตามลำดับ ชื่อและอยู่ภายใต้ข้อ จำกัด ของรูปร่างและประเภทของลายเซ็น

  • @tf.function -decorated ของอ็อบเจ็กต์ที่บันทึกไว้ (ถ้ามี) จะถูกเรียกคืนเป็นอ็อบเจ็กต์ tf.function ที่สามารถเรียกใช้โดยการรวมกันทั้งหมดของอาร์กิวเมนต์ Tensor และ non-Tensor ซึ่งมีการ ติดตาม tf.function ก่อนบันทึก โดยเฉพาะอย่างยิ่งถ้ามี obj.__call__ เมธอดที่มีร่องรอยที่เหมาะสม obj เองสามารถเรียกได้เหมือนฟังก์ชัน Python ตัวอย่างง่ายๆอาจมีลักษณะเช่น output_tensor = obj(input_tensor, training=False)

สิ่งนี้ทำให้เสรีภาพอย่างมากในอินเทอร์เฟซที่ SavedModels สามารถนำไปใช้ได้ อินเทอร์เฟซ SavedModels แบบใช้ซ้ำได้ สำหรับ obj สร้างข้อตกลงเช่นรหัสไคลเอ็นต์รวมถึงอะแด็ปเตอร์เช่น hub.KerasLayer รู้วิธีใช้ SavedModel

SavedModels บางรุ่นอาจไม่เป็นไปตามแบบแผนนั้นโดยเฉพาะโมเดลทั้งหมดที่ไม่ได้ตั้งใจให้ใช้ซ้ำในโมเดลขนาดใหญ่และเพียงแค่ให้ลายเซ็นการให้บริการ

ตัวแปรที่ฝึกอบรมได้ใน SavedModel จะถูกโหลดซ้ำเป็นแบบtf.GradientTape และtf.GradientTape จะเฝ้าดูtf.GradientTape เหล่านี้ตามค่าเริ่มต้น ดูหัวข้อการปรับแต่งอย่างละเอียดด้านล่างสำหรับคำเตือนบางประการและพิจารณาหลีกเลี่ยงสิ่งนี้เพื่อเริ่มต้น แม้ว่าคุณจะต้องการปรับแต่งอย่างละเอียด แต่คุณอาจต้องการดูว่า obj.trainable_variables แนะนำให้ฝึกซ้ำเฉพาะส่วนย่อยของตัวแปรที่ฝึกได้ในตอนแรกหรือไม่

การสร้าง SavedModels สำหรับ TF Hub

ภาพรวม

SavedModel เป็นรูปแบบการทำให้เป็นอนุกรมมาตรฐานของ TensorFlow สำหรับโมเดลที่ผ่านการฝึกอบรมหรือชิ้นส่วนโมเดล มันจัดเก็บน้ำหนักที่ได้รับการฝึกฝนของโมเดลพร้อมกับการดำเนินการ TensorFlow ที่แน่นอนเพื่อทำการคำนวณ สามารถใช้งานได้อย่างอิสระจากรหัสที่สร้างขึ้น โดยเฉพาะอย่างยิ่งสามารถใช้ซ้ำได้ใน API การสร้างโมเดลระดับสูงต่างๆเช่น Keras เนื่องจากการดำเนินการ TensorFlow เป็นภาษาพื้นฐานทั่วไป

ประหยัดจาก Keras

เริ่มต้นด้วย TensorFlow 2, tf.keras.Model.save() และ tf.keras.models.save_model() เริ่มต้นเป็นรูปแบบ SavedModel (ไม่ใช่ HDF5) ผลลัพธ์ที่บันทึกไว้ที่สามารถใช้กับ hub.load() , hub.KerasLayer และอะแด็ปเตอร์ที่คล้ายกันสำหรับ API ระดับสูงอื่น ๆ เมื่อพร้อมใช้งาน

ในการแบ่งปัน Keras Model ที่สมบูรณ์เพียงบันทึกด้วย include_optimizer=False

ในการแบ่งปันชิ้นส่วนของ Keras Model ให้สร้างชิ้นส่วนนั้นเป็น Model ในตัวเองจากนั้นบันทึกสิ่งนั้น คุณสามารถวางโค้ดแบบนั้นได้ตั้งแต่เริ่มต้น ....

piece_to_share = tf.keras.Model(...)
full_model = tf.keras.Sequential([piece_to_share, ...])
full_model.fit(...)
piece_to_share.save(...)

... หรือตัดชิ้นส่วนออกเพื่อแบ่งปันตามความเป็นจริง (หากสอดคล้องกับการแบ่งชั้นของแบบจำลองเต็มรูปแบบของคุณ):

full_model = tf.keras.Model(...)
sharing_input = full_model.get_layer(...).get_output_at(0)
sharing_output = full_model.get_layer(...).get_output_at(0)
piece_to_share = tf.keras.Model(sharing_input, sharing_output)
piece_to_share.save(..., include_optimizer=False)

TensorFlow Models บน GitHub ใช้แนวทางเดิมสำหรับ BERT (ดูที่ nlp / tools / export_tfhub_lib.py โปรดสังเกตการแบ่งระหว่าง core_model สำหรับการส่งออกและ pretrainer สำหรับการกู้คืนจุดตรวจ) และแนวทางหลังสำหรับ ResNet (ดู vision / image_classification / tfhub_export py ).

ประหยัดจาก TensorFlow ระดับต่ำ

สิ่งนี้ต้องการความคุ้นเคยเป็นอย่างดีกับ คู่มือ SavedModel ของ TensorFlow

หากคุณต้องการให้มากกว่าแค่ลายเซ็นที่ให้บริการคุณควรใช้ อินเทอร์เฟซที่บันทึกไว้ใช้ซ้ำ ได้ แนวคิดนี้มีลักษณะดังนี้

class MyMulModel(tf.train.Checkpoint):
  def __init__(self, v_init):
    super().__init__()
    self.v = tf.Variable(v_init)
    self.variables = [self.v]
    self.trainable_variables = [self.v]
    self.regularization_losses = [
        tf.function(input_signature=[])(lambda: 0.001 * self.v**2),
    ]

  @tf.function(input_signature=[tf.TensorSpec(shape=None, dtype=tf.float32)])
  def __call__(self, inputs):
    return tf.multiply(inputs, self.v)

tf.saved_model.save(MyMulModel(2.0), "/tmp/my_mul")

layer = hub.KerasLayer("/tmp/my_mul")
print(layer([10., 20.]))  # [20., 40.]
layer.trainable = True
print(layer.trainable_weights)  # [2.]
print(layer.losses)  # 0.004

ปรับจูน

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

การปรับละเอียดจะเปลี่ยนพารามิเตอร์โมเดล "ต่อเนื่อง" ที่ได้รับการฝึกฝน จะไม่เปลี่ยนการแปลงแบบฮาร์ดโค้ดเช่นการป้อนข้อความโทเค็นและโทเค็นการแมปกับรายการที่เกี่ยวข้องในเมทริกซ์การฝัง

สำหรับผู้บริโภคที่บันทึกไว้

การสร้าง hub.KerasLayer เช่น

layer = hub.KerasLayer(..., trainable=True)

เปิดใช้งานการปรับแต่งของ SavedModel ที่โหลดโดยเลเยอร์ มันเพิ่มน้ำหนักที่สามารถฝึกได้และตัวควบคุมน้ำหนักที่ประกาศใน SavedModel ไปยังโมเดล Keras และรันการคำนวณของ SavedModel ในโหมดการฝึกอบรม (นึกถึงการออกกลางคันเป็นต้น)

Colab การจัดประเภทรูปภาพ ประกอบด้วยตัวอย่าง end-to-end ที่มีการปรับแต่งเพิ่มเติม

ส่งออกผลการปรับแต่งอย่างละเอียดอีกครั้ง

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

loaded_obj = hub.load("https://tfhub.dev/...")
hub_layer = hub.KerasLayer(loaded_obj, trainable=True, ...)

model = keras.Sequential([..., hub_layer, ...])
model.compile(...)
model.fit(...)

export_module_dir = os.path.join(os.getcwd(), "finetuned_model_export")
tf.saved_model.save(loaded_obj, export_module_dir)

สำหรับผู้สร้าง SavedModel

เมื่อสร้าง SavedModel สำหรับแชร์บน TensorFlow Hub ให้คิดล่วงหน้าว่าผู้บริโภคควรปรับแต่งมันอย่างไรและให้คำแนะนำในเอกสารประกอบ

การบันทึกจาก Keras Model ควรทำให้กลไกทั้งหมดของการปรับแต่งทำงานอย่างละเอียด (การลดการสูญเสียการกำหนดน้ำหนักการกำหนดตัวแปรที่ __call__ training=True การติดตาม __call__ สำหรับทั้ง training=True และ training=False ฯลฯ )

เลือกอินเทอร์เฟซแบบจำลองที่เล่นได้ดีกับโฟลว์การไล่ระดับสีเช่นบันทึกเอาต์พุตแทนความน่าจะเป็นแบบซอฟต์แม็กซ์หรือการคาดคะเนระดับบนสุด

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

ตัวกำหนดน้ำหนักในแต่ละชั้นจะถูกบันทึกไว้ (ด้วยค่าสัมประสิทธิ์ความแข็งแรงของการทำให้เป็นมาตรฐาน) แต่การทำให้เป็นมาตรฐานน้ำหนักจากภายในเครื่องมือเพิ่มประสิทธิภาพ (เช่น tf.keras.optimizers.Ftrl.l1_regularization_strength=...) แนะนำผู้บริโภคที่บันทึกไว้ของคุณตามลำดับ