ภาพรวม
LiteRT รองรับการแปลงโมเดล TensorFlow RNN เป็นของ LiteRT Fused LSTM การดำเนินการ Fused มีไว้สำหรับเพิ่มประสิทธิภาพสูงสุด การใช้งานเคอร์เนลที่สำคัญ รวมถึงช่วยให้ สำหรับกำหนดการแปลงที่ซับซ้อน เช่น การวัดปริมาณ
เนื่องจาก RNN API ใน TensorFlow นั้นมีหลายรูปแบบ แนวทางของเราจึง 2 พับ:
- ให้การรองรับในตัวสำหรับ TensorFlow RNN API มาตรฐาน เช่น Keras LSTM ซึ่งเป็นตัวเลือกที่แนะนำ
- สร้างอินเทอร์เฟซ ในโครงสร้างพื้นฐานของ Conversion สำหรับ การติดตั้งใช้งาน RNN ที่ผู้ใช้กำหนดเพื่อเสียบและแปลงเป็น การอ่านเขียน เรามีตัวอย่าง 2 แบบซึ่งพร้อมใช้งานทันทีสำหรับ Conversion โดยใช้ lingvo LSTMCellSimple และ LayerNormalizedLSTMCellSimple อินเทอร์เฟซ RNN
API ของตัวแปลง
ฟีเจอร์นี้เป็นส่วนหนึ่งของรุ่น TensorFlow 2.3 และมีให้บริการผ่าน tf-nightly pip หรือจากส่วนหัว
ฟังก์ชันการแปลงนี้ใช้งานได้เมื่อแปลงเป็น LiteRT ผ่าน SaveModel หรือจากโมเดล 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 เป็น LiteRT Colab แสดงภาพการใช้งานตั้งแต่ต้นจนจบด้วยล่าม LiteRT
รองรับ API ของ TensorFlow RNNs
การแปลง Keras LSTM (แนะนำ)
เรารองรับการแปลง Keras LSTM เป็น LiteRT ทันทีที่แกะกล่อง สำหรับ รายละเอียดเกี่ยวกับวิธีการทำงาน โปรดดูที่ อินเทอร์เฟซ Keras LSTM และในตรรกะ Conversion ที่นี่
สิ่งสำคัญอีกอย่างคือ เน้นย้ำสัญญา LSTM ของ LiteRT ตาม คำจำกัดความของการดำเนินการ Keras
- มิติข้อมูล 0 ของ tensor ของอินพุตคือขนาดกลุ่ม
- มิติข้อมูล 0 ของ tensor ของ recurrent_weight คือจำนวนของ เอาต์พุต
- เทนเซอร์ weight และ recurrent_kernel จะสลับกัน
- น้ำหนักที่มีการสลับ, recurrent_kernel ที่มีการสลับตำแหน่ง และ Tensor คือ bias แบ่งออกเป็น 4 Tensor ที่มีขนาดเท่ากันตามมิติข้อมูล 0 ซึ่งสอดคล้องกับ อินพุตเกต, ลืมเกต, เซลล์ และเกตเอาต์พุต
ตัวแปร Keras LSTM
เวลาหลัก
ผู้ใช้อาจเลือกหลักเวลาหรือไม่สำคัญก็ได้ Keras LSTM เพิ่มช่วงเวลาสำคัญ ในแอตทริบิวต์ def ของฟังก์ชัน สำหรับ LSTM ลำดับแบบทิศทางเดียว เรา สามารถจับคู่กับ unidirecional_sequence_lstm แอตทริบิวต์หลักตามเวลา
LSTM แบบ 2 ทิศทาง
LSTM แบบ 2 ทิศทางสามารถใช้งานกับเลเยอร์ Keras LSTM 2 เลเยอร์ โดยเลเยอร์หนึ่งสำหรับ ไปข้างหน้าและอีก 1 ช่องสำหรับย้อนหลัง ดูตัวอย่าง ที่นี่ เมื่อเราเห็นแอตทริบิวต์ go_backward เราจะจำค่านั้นว่าเป็น LSTM แบบย้อนหลัง จากนั้น เราจับกลุ่มไปข้างหน้าและ LSTM แบบย้อนหลังด้วยกัน นี่คืองานที่ต้องทำในอนาคต ปัจจุบัน ซึ่งจะทำให้เกิดการดำเนินการ UnidirectionalSequenceLSTM ใน LiteRT โมเดล
ตัวอย่าง Conversion LSTM ที่ผู้ใช้กำหนด
LiteRT ยังมอบวิธีแปลง LSTM ที่ผู้ใช้กำหนด การนำไปใช้งานจริง เราใช้ LSTM ของ Lingvo เป็นตัวอย่างของ ที่มีการนำไปใช้ โปรดดูรายละเอียดที่ อินเทอร์เฟซ lingvo.LSTMCellSimple และตรรกะ Conversion ที่นี่ เรายังได้ยกตัวอย่างคำจำกัดความ Lingvo อีกรายการหนึ่งของ Lingvo ไว้ใน อินเทอร์เฟซ lingvo.LayerStandardizedLSTMCellSimple และตรรกะ Conversion ที่นี่
"นำ TensorFlow RNN ของคุณเองมาไว้ใน LiteRT
หากอินเทอร์เฟซ RNN ของผู้ใช้แตกต่างจากอินเทอร์เฟซมาตรฐานที่รองรับ มีตัวเลือก 2 รายการดังนี้
ตัวเลือกที่ 1: เขียนโค้ดอะแดปเตอร์ใน TensorFlow Python เพื่อปรับอินเทอร์เฟซ RNN ไปยังอินเทอร์เฟซ Keras RNN ซึ่งหมายถึง tf.function ที่มี tf_Implements Anchor ใน ฟังก์ชันของอินเทอร์เฟซ RNN ที่สร้างขึ้น ซึ่งเหมือนกับฟังก์ชันที่สร้างโดย เลเยอร์ Keras LSTM หลังจากนั้น API Conversion เดียวกับที่ใช้สำหรับ Keras LSTM จึงจะใช้งานได้
ตัวเลือกที่ 2: หากทำไม่ได้ข้างต้น (เช่น Keras LSTM ขาดบางส่วน ฟังก์ชันที่ใช้อยู่ในปัจจุบันโดยการดำเนินการ Fused LSTM ของ LiteRT เช่น การทำให้เลเยอร์เป็นมาตรฐาน) จากนั้นขยายตัวแปลง LiteRT ด้วยการเขียน โค้ด Conversion ที่กำหนดเองและนำไปเสียบกับฟังก์ชันเตรียมการคอมโพสิต MLIR-pass ที่นี่ อินเทอร์เฟซของฟังก์ชันควรได้รับการจัดการเหมือนกับสัญญา API และ มีอาร์กิวเมนต์ที่จำเป็นต่อการแปลงเป็น Fused LiteRT LSTM การดำเนินการต่างๆ เช่น อินพุต การให้น้ำหนักพิเศษ น้ำหนัก การฉายภาพ การปรับเลเยอร์มาตรฐาน ฯลฯ เหมาะสมสำหรับ tensor ที่ส่งผ่านเป็นอาร์กิวเมนต์ของฟังก์ชันนี้เพื่อให้รู้ว่า อันดับ (เช่น RankedTensorType ใน MLIR) วิธีนี้จะช่วยให้เขียนได้ง่ายขึ้น เป็นโค้ด Conversion ที่สามารถคาดเดา Tensor เหล่านี้เป็น RankedTensorType และช่วย แปลงร่างเป็น Tensor จัดอันดับที่สอดคล้องกับ Fused LiteRT ตัวถูกดำเนินการของโอเปอเรเตอร์
ตัวอย่างที่สมบูรณ์ของขั้นตอน Conversion ดังกล่าวคือ LSTMCellSimple ของ Lingvo ไปยัง Conversion LiteRT
คำจำกัดความของ LSTMCellSimple ใน Lingvo ที่นี่ โมเดลที่ฝึกด้วยเซลล์ LSTM นี้สามารถแปลงเป็น LiteRT ได้โดยใช้ ดังต่อไปนี้:
- รวมการใช้ LSTMCellSimple ทั้งหมดไว้ใน tf.function ด้วย tf_APPLYs ที่มีป้ายกํากับดังกล่าว (เช่น lingvo.LSTMCellSimple จะเป็น ชื่อคำอธิบายประกอบที่ดีที่นี่) ตรวจสอบว่า tf.function ที่สร้างขึ้น ตรงกับอินเทอร์เฟซของฟังก์ชันที่คาดไว้ในโค้ด Conversion ช่วงเวลานี้ เป็นสัญญาระหว่างผู้สร้างโมเดลที่เพิ่มคำอธิบายประกอบและ โค้ด Conversion
ขยายบัตรผ่านเตรียมความพร้อมสำหรับฟังก์ชันแบบผสมเพื่อเสียบการดำเนินการคอมโพสิตที่กำหนดเอง เป็น LiteRT Fused LSTM op Conversion โปรดดู LSTMCellSimple โค้ด Conversion
สัญญาการแปลง:
น้ำหนักและ Tensor สำหรับเส้นโครงจะสลับสับเปลี่ยน
ค่า {input, recurrent} ถึง {cell, Input gate, ไม่มี gate, output gate} จะแยกออกโดยการแบ่ง Tensor น้ำหนักที่มีการสลับตำแหน่ง
{bias} ไปยัง {bias} ดึงข้อมูลโดยการแบ่ง Tensor การให้น้ำหนักพิเศษ
เส้นโครงแยกออกโดยการแบ่ง Tensor การฉายภาพที่มีการสลับตำแหน่ง
Conversion ที่คล้ายกันนี้เขียนขึ้นสำหรับ LayerNormalizedLSTMCellSimple เท่านั้น
โครงสร้างพื้นฐาน Conversion LiteRT ส่วนที่เหลือ รวมถึง บัตรผ่าน MLIR รวมทั้งการส่งออกไปยัง LiteRT Flatbuffer ที่ใช้ซ้ำได้
ปัญหาที่ทราบ/ข้อจำกัด
- ปัจจุบันรองรับเฉพาะการแปลง Keras LSTM แบบไม่เก็บสถานะ (ค่าเริ่มต้น ใน Keras) การแปลง Keras LSTM แบบเก็บสถานะเป็นงานที่ทำในอนาคต
- คุณยังคงสามารถสร้างแบบจำลองเลเยอร์ Keras LSTM แบบเก็บสถานะโดยใช้ เลเยอร์ Keras LSTM แบบไม่เก็บสถานะที่สำคัญและจัดการรัฐอย่างชัดเจน โปรแกรมผู้ใช้ โปรแกรม TensorFlow ดังกล่าวยังแปลงเป็น LiteRT โดยใช้คุณลักษณะที่มีคำอธิบายที่นี่
- ขณะนี้ LSTM แบบ 2 ทิศทางมีรูปแบบเป็น UnidirectionalSequenceLSTM 2 รายการ ใน LiteRT ส่วนนี้จะถูกแทนที่ด้วย การดำเนินการ BidirectionalSequenceLSTM