Tổng quan
LiteRT hỗ trợ chuyển đổi các mô hình RNN của TensorFlow thành các thao tác LSTM hợp nhất của LiteRT. Các hoạt động kết hợp tồn tại để tối đa hoá hiệu suất của các triển khai kernel cơ bản, cũng như cung cấp giao diện cấp cao hơn để xác định các biến đổi phức tạp như lượng tử hoá.
Vì có nhiều biến thể của API RNN trong TensorFlow, nên chúng tôi có hai cách tiếp cận:
- Cung cấp khả năng hỗ trợ gốc cho các API RNN TensorFlow tiêu chuẩn, chẳng hạn như Keras LSTM. Đây là lựa chọn nên dùng.
- Cung cấp một giao diện vào cơ sở hạ tầng chuyển đổi cho các triển khai RNN do người dùng xác định để cắm và chuyển đổi thành LiteRT. Chúng tôi cung cấp một vài ví dụ có sẵn về lượt chuyển đổi như vậy bằng cách sử dụng LSTMCellSimple và LayerNormalizedLSTMCellSimple của lingvo.
Converter API
Tính năng này là một phần của bản phát hành TensorFlow 2.3. Bạn cũng có thể tải phiên bản này thông qua pip tf-nightly hoặc từ phiên bản mới nhất.
Chức năng chuyển đổi này có sẵn khi chuyển đổi sang LiteRT thông qua SavedModel hoặc trực tiếp từ mô hình Keras. Xem ví dụ về cách sử dụng.
Dựa trên mẫu đã lưu
# 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()
Từ mô hình Keras
# build a Keras model
keras_model = build_keras_lstm(...)
# Convert the model.
converter = TFLiteConverter.from_keras_model(keras_model)
tflite_model = converter.convert()
Ví dụ:
Keras LSTM to LiteRT Colab minh hoạ cách sử dụng từ đầu đến cuối với trình thông dịch LiteRT.
Hỗ trợ các API RNN của TensorFlow
Chuyển đổi LSTM Keras (nên dùng)
Chúng tôi hỗ trợ chuyển đổi Keras LSTM sang LiteRT mà không cần phải làm gì thêm. Để biết thông tin chi tiết về cách hoạt động của tính năng này, vui lòng tham khảo giao diện LSTM Keras và logic chuyển đổi tại đây.
Điều quan trọng nữa là làm nổi bật hợp đồng LSTM của LiteRT liên quan đến định nghĩa hoạt động Keras:
- Phương diện 0 của tensor đầu vào là kích thước lô.
- Chiều 0 của tenxơ recurrent_weight là số lượng đầu ra.
- Các tensor weight và recurrent_kernel được chuyển vị.
- Trọng số được chuyển vị, recurrent_kernel được chuyển vị và các tensor bias được chia thành 4 tensor có kích thước bằng nhau dọc theo chiều 0. Các thành phần này tương ứng với cổng đầu vào, cổng quên, ô và cổng đầu ra.
Các biến thể LSTM của Keras
Time major
Người dùng có thể chọn chế độ ưu tiên thời gian hoặc không ưu tiên thời gian. Keras LSTM thêm một thuộc tính chính về thời gian vào các thuộc tính định nghĩa hàm. Đối với LSTM chuỗi một chiều, chúng ta chỉ cần liên kết với thuộc tính chính về thời gian của unidirecional_sequence_lstm.
LSTM hai chiều
Bạn có thể triển khai LSTM hai chiều bằng hai lớp LSTM Keras, một lớp cho hướng tiến và một lớp cho hướng lùi, hãy xem các ví dụ tại đây. Sau khi thấy thuộc tính go_backward, chúng tôi nhận ra đó là LSTM ngược, sau đó chúng tôi sẽ nhóm LSTM xuôi và ngược lại với nhau. Đây là công việc trong tương lai. Hiện tại, thao tác này sẽ tạo ra 2 thao tác UnidirectionalSequenceLSTM trong mô hình LiteRT.
Ví dụ về lượt chuyển đổi LSTM do người dùng xác định
LiteRT cũng cung cấp một cách để chuyển đổi các triển khai LSTM do người dùng xác định. Ở đây, chúng ta sử dụng LSTM của Lingvo làm ví dụ về cách triển khai. Để biết thông tin chi tiết, vui lòng tham khảo giao diện lingvo.LSTMCellSimple và logic chuyển đổi tại đây. Chúng tôi cũng cung cấp một ví dụ về định nghĩa LSTM khác của Lingvo trong giao diện lingvo.LayerNormalizedLSTMCellSimple và logic chuyển đổi của giao diện này tại đây.
"Đưa RNN TensorFlow của riêng bạn" vào LiteRT
Nếu giao diện RNN của người dùng khác với các giao diện được hỗ trợ tiêu chuẩn, thì có một số lựa chọn:
Lựa chọn 1: Viết mã bộ điều hợp trong TensorFlow Python để điều chỉnh giao diện RNN cho phù hợp với giao diện RNN của Keras. Điều này có nghĩa là tf.function có chú giải tf_implements trên hàm của giao diện RNN đã tạo, giống hệt với hàm do lớp LSTM Keras tạo. Sau đó, cùng một API chuyển đổi được dùng cho Keras LSTM sẽ hoạt động.
Lựa chọn 2: Nếu không thể thực hiện lựa chọn trên (ví dụ: LSTM Keras thiếu một số chức năng mà thao tác LSTM kết hợp của LiteRT hiện đang hiển thị, chẳng hạn như chuẩn hoá lớp), hãy mở rộng trình chuyển đổi LiteRT bằng cách viết mã chuyển đổi tuỳ chỉnh và cắm mã đó vào MLIR-pass prepare-composite-functions tại đây. Giao diện của hàm này phải được coi như một hợp đồng API và phải chứa các đối số cần thiết để chuyển đổi thành các thao tác LSTM LiteRT kết hợp – tức là đầu vào, độ lệch, trọng số, phép chiếu, chuẩn hoá lớp, v.v. Tốt nhất là các tensor được truyền dưới dạng đối số cho hàm này phải có thứ hạng đã biết (tức là RankedTensorType trong MLIR). Điều này giúp bạn dễ dàng viết mã chuyển đổi có thể giả định các tensor này dưới dạng RankedTensorType và giúp chuyển đổi chúng thành các tensor được xếp hạng tương ứng với các toán hạng của toán tử LiteRT hợp nhất.
Một ví dụ hoàn chỉnh về quy trình chuyển đổi như vậy là quy trình chuyển đổi LSTMCellSimple của Lingvo sang LiteRT.
LSTMCellSimple trong Lingvo được xác định tại đây. Bạn có thể chuyển đổi các mô hình được huấn luyện bằng ô LSTM này thành LiteRT như sau:
- Bao bọc tất cả các lần sử dụng LSTMCellSimple trong tf.function bằng chú giải tf_implements được gắn nhãn như vậy (ví dụ: lingvo.LSTMCellSimple sẽ là một tên chú giải phù hợp ở đây). Đảm bảo rằng tf.function được tạo khớp với giao diện của hàm dự kiến trong mã chuyển đổi. Đây là một hợp đồng giữa tác giả mô hình thêm chú thích và mã chuyển đổi.
Mở rộng giai đoạn prepare-composite-functions để cắm một thao tác kết hợp tuỳ chỉnh vào quá trình chuyển đổi thao tác LSTM kết hợp LiteRT. Xem mã chuyển đổi LSTMCellSimple.
Hợp đồng chuyển đổi:
Tensor trọng số và phép chiếu được chuyển vị.
{input, recurrent} thành {cell, input gate, forget gate, output gate} được trích xuất bằng cách cắt tensor trọng số được chuyển vị.
{bias} đến {cell, input gate, forget gate, output gate} được trích xuất bằng cách cắt tensor thiên kiến.
Phép chiếu được trích xuất bằng cách cắt tensor phép chiếu được chuyển vị.
Lượt chuyển đổi tương tự được viết cho LayerNormalizedLSTMCellSimple.
Phần còn lại của cơ sở hạ tầng chuyển đổi LiteRT, bao gồm tất cả các truyền MLIR được xác định cũng như hoạt động xuất cuối cùng sang flatbuffer LiteRT đều có thể được sử dụng lại.
Các vấn đề/hạn chế đã biết
- Hiện tại, chỉ có hỗ trợ chuyển đổi LSTM Keras không trạng thái (hành vi mặc định trong Keras). Việc chuyển đổi LSTM Keras có trạng thái là công việc trong tương lai.
- Bạn vẫn có thể mô hình hoá một lớp LSTM Keras có trạng thái bằng cách sử dụng lớp LSTM Keras cơ bản không trạng thái và quản lý trạng thái một cách rõ ràng trong chương trình người dùng. Bạn vẫn có thể chuyển đổi chương trình TensorFlow như vậy sang LiteRT bằng tính năng được mô tả ở đây.
- Bidirectional LSTM hiện được mô hình hoá dưới dạng 2 thao tác UnidirectionalSequenceLSTM trong LiteRT. Thao tác này sẽ được thay thế bằng một thao tác BidirectionalSequenceLSTM duy nhất.