การแปลง TensorFlow RNN เป็น TensorFlow Lite

ภาพรวม

TensorFlow Lite รองรับการแปลงโมเดล TensorFlow RNN เป็นการดำเนินการ LSTM ที่ผสาน LSTM ของ TensorFlow Lite การดำเนินการที่ผสานเข้าด้วยกันมีไว้เพื่อเพิ่มประสิทธิภาพการใช้งานเคอร์เนลที่สำคัญ รวมถึงเพิ่มอินเทอร์เฟซในระดับที่สูงขึ้นเพื่อกำหนดการเปลี่ยนรูปแบบที่ซับซ้อน เช่น การวัดปริมาณ

เนื่องจากมี RNN API จำนวนมากใน TensorFlow แนวทางของเราจึงแบ่งเป็น 2 ส่วนดังนี้

  1. ให้การสนับสนุนในเครื่องสำหรับ TensorFlow RNN API มาตรฐาน เช่น Keras LSTM ซึ่งเป็นตัวเลือกที่แนะนำ
  2. ระบุอินเทอร์เฟซ ในโครงสร้างพื้นฐานของ Conversion การติดตั้งใช้งาน RNN ที่ผู้ใช้กำหนด เพื่อเสียบและแปลงเป็น TensorFlow Lite เราได้แสดงตัวอย่างแบบนอกกรอบของ Conversion ดังกล่าวโดยใช้อินเทอร์เฟซ RNN ของ LSTMCellSimple และ LayerNormalizedLSTMCellSimple ของ lingvo

API ตัวแปลง

ฟีเจอร์นี้เป็นส่วนหนึ่งของรุ่น TensorFlow 2.3 นอกจากนี้ยังดูผ่าน tf-nightly หรือจากส่วนหัวได้ด้วย

ฟังก์ชันการแปลงนี้จะใช้ได้เมื่อแปลงเป็น TensorFlow Lite ผ่าน SavedModel หรือจากโมเดล Keras โดยตรง ดูตัวอย่างการใช้งาน

จากโมเดลที่บันทึกไว้

# build a saved model. Here concrete_function is the exported function
# corresponding to the TensorFlow model containing one or more
# Keras LSTM layers.
saved_model, saved_model_dir = build_saved_model_lstm(...)
saved_model.save(saved_model_dir, save_format="tf", signatures=concrete_func)

# Convert the model.
converter = TFLiteConverter.from_saved_model(saved_model_dir)
tflite_model = converter.convert()

จากโมเดล Keras

# build a Keras model
keras_model = build_keras_lstm(...)

# Convert the model.
converter = TFLiteConverter.from_keras_model(keras_model)
tflite_model = converter.convert()

ตัวอย่าง

Keras LSTM ไปยัง TensorFlow Lite Colab แสดงการใช้งานตั้งแต่ต้นจนจบด้วยอินเทอร์พรีเตอร์ของ TensorFlow Lite

รองรับ API ของ TensorFlow RNN

เรารองรับการแปลง Keras LSTM เป็น TensorFlow Lite แบบพร้อมใช้งานทันที ดูรายละเอียดเกี่ยวกับวิธีการทำงานได้ที่อินเทอร์เฟซ Keras LSTM และตรรกะ Conversion ที่นี่

สิ่งสำคัญอีกอย่างก็คือการเน้นย้ำสัญญา LSTM ของ TensorFlow Lite ในส่วนที่เกี่ยวข้องกับคำนิยามของการดำเนินการของ Keras ดังนี้

  1. มิติข้อมูล 0 ของ Tensor อินพุตคือขนาดกลุ่ม
  2. มิติข้อมูล 0 ของ tensor recurrent_weight คือจำนวนเอาต์พุต
  3. เทนเนอร์ weight และ recurrent_kernel มีการสับเปลี่ยนกัน
  4. น้ำหนักสลับแกน recurrent_kernel และ bias เทเนอร์จะแบ่งออกเป็น Tensor ที่มีขนาดเท่ากัน 4 ตามมิติข้อมูล 0 ซึ่งสอดคล้องกับเกตอินพุต ลืมเกต เซลล์ และเกตเอาต์พุต

ผลิตภัณฑ์ย่อย Keras LSTM

เวลาหลัก

ผู้ใช้อาจเลือกว่าใช้เวลามากที่สุดหรือไม่ให้กำหนดเวลาเลยก็ได้ Keras LSTM เพิ่มแอตทริบิวต์ของเวลาในแอตทริบิวต์ def สำหรับฟังก์ชันเป็นหลัก สำหรับ LSTM ของลำดับแบบทิศทางเดียว เราเพียงแค่แมปกับแอตทริบิวต์หลักเวลาของ unidirecional_sequence_lstm

LSTM แบบ 2 ทิศทาง

LSTM แบบ 2 ทิศทางนำมาใช้ได้ด้วยเลเยอร์ Keras LSTM 2 เลเยอร์ โดยเลเยอร์หนึ่งสำหรับไปข้างหน้าและอีกเลเยอร์สำหรับย้อนกลับ ดูตัวอย่างที่นี่ เมื่อเห็นแอตทริบิวต์ go_backward เราจะทราบว่าเป็น LSTM ย้อนหลัง จากนั้นจึงจัดกลุ่ม LSTM ไปข้างหน้าและถอยหลัง นี่คืองานในอนาคต ปัจจุบันการดำเนินการนี้จะสร้างการดำเนินการ UnidirectionalSequenceLSTM จำนวน 2 รายการในโมเดล TensorFlow Lite

ตัวอย่าง Conversion LSTM ที่ผู้ใช้กำหนด

TensorFlow Lite ยังมอบวิธีแปลงการใช้งาน LSTM ที่ผู้ใช้กำหนดอีกด้วย เราใช้ LSTM ของ Lingvo เป็นตัวอย่างในการนำไปใช้ โปรดดูรายละเอียดที่อินเทอร์เฟซ lingvo.LSTMCellSimple และตรรกะ Conversion ที่นี่ นอกจากนี้ เรายังแสดงตัวอย่างคําจํากัดความ LSTM ของ Lingvo ในอินเทอร์เฟซ lingvo.LayerStandardizedLSTMCellSimple และตรรกะ Conversion ของอินเทอร์เฟซที่นี่ด้วย

"นำ TensorFlow RNN ของคุณเอง" ไปยัง TensorFlow Lite

หากอินเทอร์เฟซ RNN ของผู้ใช้แตกต่างจากอินเทอร์เฟซมาตรฐานที่รองรับ คุณมี 2 ตัวเลือกดังนี้

ตัวเลือกที่ 1: เขียนโค้ดอะแดปเตอร์ใน TensorFlow Python เพื่อปรับอินเทอร์เฟซ RNN ให้กับอินเทอร์เฟซ Keras RNN ซึ่งหมายถึง tf.function ที่มี tf_Implements คำอธิบายประกอบ ในฟังก์ชันของอินเทอร์เฟซ RNN ที่สร้างขึ้น ซึ่งเหมือนกับฟังก์ชันที่เลเยอร์ Keras LSTM สร้างขึ้น หลังจากนั้น Conversion API เดียวกับที่ใช้สำหรับ Keras LSTM จะใช้งานได้

ตัวเลือกที่ 2: หากดำเนินการข้างต้นไม่ได้ (เช่น Keras LSTM ไม่มีฟังก์ชันบางอย่างที่ Fused LSTM รวมของ TensorFlow Lite ใช้อยู่เหมือนการปรับเลเยอร์ให้เป็นมาตรฐาน) ให้ขยายตัวแปลง TensorFlow Lite โดยเขียนโค้ด Conversion ที่กำหนดเองแล้วเสียบลงในฟังก์ชันย้อนกลับ MLIR-Pass ที่นี่ อินเทอร์เฟซของฟังก์ชันควรปฏิบัติเหมือนกับสัญญา API และควรมีอาร์กิวเมนต์ที่จำเป็นในการแปลงเป็นการดำเนินการ TensorFlow Lite LSTM ที่รวมกัน เช่น อินพุต การให้น้ำหนักพิเศษ น้ำหนัก การฉายภาพ การทำให้เลเยอร์เป็นมาตรฐาน ฯลฯ แนะนำให้ใช้กับ Tensor ที่ส่งผ่านเป็นอาร์กิวเมนต์สำหรับฟังก์ชันนี้เพื่อให้ทราบถึงอันดับ (เช่น RankedTensorType ใน MLIR) ซึ่งช่วยให้เขียนโค้ด Conversion ที่ถือว่า Tensor เหล่านี้เป็น RankedTensorType ง่ายขึ้นมาก และช่วยเปลี่ยนรูปแบบเป็น Tensor อันดับที่สอดคล้องกับโอเปอแรนด์ของโอเปอเรเตอร์ TensorFlow Lite ที่รวมกัน

ตัวอย่างที่สมบูรณ์ของขั้นตอน Conversion ดังกล่าวก็คือการแปลง LSTMCellSimple ไปยัง TensorFlow Lite ของ Lingvo

ดู LSTMCellSimple ใน Lingvo ได้ที่นี่ โมเดลที่ฝึกด้วยเซลล์ LSTM นี้จะแปลงเป็น TensorFlow Lite ได้ดังนี้

  1. ตัดการใช้ LSTMCellSimple ทั้งหมดลงใน tf.function ด้วย tf_usages คำอธิบายประกอบที่มีป้ายกำกับเช่นนี้ (เช่น lingvo.LSTMCellSimple จะเป็นชื่อคำอธิบายประกอบที่ดีสำหรับที่นี่) ตรวจสอบว่า tf.function ที่สร้างขึ้นนั้นตรงกับอินเทอร์เฟซของฟังก์ชันที่คาดไว้ในโค้ด Conversion นี่คือสัญญาระหว่างผู้สร้างโมเดลที่เพิ่มคำอธิบายประกอบและโค้ด Conversion
  2. ขยายการส่งผ่าน Pre-Composite-Function เพื่อใส่คอมโพสิตที่กำหนดเอง ซึ่งตรงกันข้ามกับ TensorFlow Lite ที่รวม LSTM เข้าด้วยกันเป็น Opin ไว้ ดูโค้ด Conversion LSTMCellSimple

    สัญญา Conversion:

  3. น้ำหนัก และแสดงการฉายภาพ เทนเซอร์จะถูกสับเปลี่ยนกัน

  4. ระบบจะแยก {input, recurrent} ไปยัง {cell, Input gate, lost gate, export gate} ด้วยการแบ่ง tensor น้ำหนักแบบสับเปลี่ยน

  5. การดึง {bias} ถึง {cell, Input gate, คาดการณ์ gate, export gate} ถูกแยกออกด้วยการแบ่ง tensor การให้น้ำหนักพิเศษ

  6. การฉายภาพจะแยกออกมาด้วยการตัด Tensor การฉายภาพสลับกัน

  7. ระบบเขียน Conversion ที่คล้ายกันสำหรับ LayerNormalizedLSTMCellSimple

  8. โครงสร้างพื้นฐานของ Conversion อื่นๆ ของ TensorFlow Lite รวมถึงการส่ง MLIR ทั้งหมดที่ระบุ รวมถึงการส่งออกขั้นสุดท้ายไปยังแฟลตบัฟเฟอร์ TensorFlow Lite จะนำมาใช้ซ้ำได้

ปัญหา/ข้อจำกัดที่ทราบ

  1. ปัจจุบันรองรับเฉพาะการแปลง Keras LSTM แบบไม่เก็บสถานะ (ลักษณะการทำงานเริ่มต้นใน Keras) การแปลง Keras LSTM แบบเก็บสถานะเป็นการทำงานในอนาคต
  2. คุณยังคงสามารถสร้างโมเดลเลเยอร์ Keras LSTM แบบเก็บสถานะได้โดยใช้เลเยอร์ Keras LSTM ที่ไม่มีสถานะ และจัดการสถานะอย่างชัดเจนในโปรแกรมผู้ใช้ โปรแกรม TensorFlow ดังกล่าวจะยังคงแปลงเป็น TensorFlow Lite ได้โดยใช้ฟีเจอร์ที่อธิบายในที่นี้
  3. ปัจจุบัน LSTM แบบ 2 ทิศทางได้รับการประมาณเป็นการดำเนินการ UnidirectionalSequenceLSTM 2 รายการใน TensorFlow Lite ซึ่งจะถูกแทนที่ด้วยตัวเลือก BidirectionalSequenceLSTM แบบเดี่ยว