Tổng quat
TensorFlow Lite hỗ trợ chuyển đổi các mô hình TensorFlow RNN sang các hoạt động LSTM hợp nhất của TensorFlow Lite. Các hoạt động hợp nhất tồn tại để tối đa hóa hiệu suất của các triển khai nhân cơ bản của chúng, cũng như cung cấp giao diện cấp cao hơn để xác định các phép biến đổi phức tạp như lượng tử hóa.
Vì có nhiều biến thể của API RNN trong TensorFlow, nên cách tiếp cận của chúng tôi đã có hai lần:
- Cung cấp hỗ trợ riêng cho các API TensorFlow RNN tiêu chuẩn như Keras LSTM. Đây là tùy chọn được đề nghị.
- Cung cấp giao diện vào cơ sở hạ tầng chuyển đổi để triển khai RNN do người dùng xác định để cắm vào và được chuyển đổi sang TensorFlow Lite. Chúng tôi cung cấp một vài ví dụ điển hình về việc chuyển đổi như vậy bằng cách sử dụng giao diện LSTMCellSimple và LayerNormalizedLSTMCellSimple RNN của lingvo.
API chuyển đổi
Tính năng này là một phần của bản phát hành TensorFlow 2.3. Nó cũng có sẵn thông qua tf-pip hàng đêm hoặc từ đầu.
Chức năng chuyển đổi này khả dụng khi chuyển đổi sang TensorFlow Lite thông qua SavedModel hoặc trực tiếp từ mô hình Keras. Xem cách sử dụng ví dụ.
Từ mô hình đã 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 TensorFlow Lite Colab minh họa cách sử dụng từ đầu đến cuối với trình thông dịch TensorFlow Lite.
Các API TensorFlow RNNs được hỗ trợ
Chuyển đổi Keras LSTM (khuyến nghị)
Chúng tôi hỗ trợ chuyển đổi ngay từ đầu Keras LSTM sang TensorFlow Lite. Để biết chi tiết về cách thức hoạt động, vui lòng tham khảo giao diện Keras LSTM và logic chuyển đổi ở đây .
Cũng quan trọng là làm nổi bật hợp đồng LSTM của TensorFlow Lite liên quan đến định nghĩa hoạt động của Keras:
- Kích thước 0 của tensor đầu vào là kích thước lô.
- Thứ nguyên 0 của tensor recurrent_ weight là số đầu ra.
- Trọng lượng và độ căng recurrent_kernel được hoán vị.
- Trọng lượng chuyển đổi, recurrent_kernel chuyển vị và các tensor thiên vị được chia thành 4 tensor có kích thước bằng nhau dọc theo kích thước 0. Chúng tương ứng với cổng đầu vào, cổng quên, ô và cổng đầu ra .
Keras LSTM biến thể
Chuyên ngành thời gian
Người dùng có thể chọn thời gian chính hoặc không có thời gian chính. Keras LSTM thêm một thuộc tính thời gian chính trong các thuộc tính hàm def. Đối với LSTM chuỗi đơn hướng, chúng ta có thể chỉ cần ánh xạ tới thuộc tính chính thời gian của unidirecional_sequence_lstm.
LSTM hai chiều
LSTM hai chiều có thể được triển khai với hai lớp Keras LSTM, một lớp tiến và một lớp lùi, xem ví dụ tại đây . Khi chúng tôi thấy thuộc tính go_backward, chúng tôi nhận ra nó là LSTM lùi, sau đó chúng tôi nhóm LSTM tiến và lùi lại với nhau. Đây là công việc trong tương lai. Hiện tại, điều này tạo ra hai hoạt động UnidirectionalSequenceLSTM trong mô hình TensorFlow Lite.
Ví dụ về chuyển đổi LSTM do người dùng xác định
TensorFlow Lite cũng cung cấp một cách để chuyển đổi việc triển khai LSTM do người dùng xác định. Ở đây chúng tôi sử dụng LSTM của Lingvo làm ví dụ về cách có thể thực hiện điều đó. Để biết 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ụ cho một định nghĩa LSTM khác của Lingvo trong giao diện lingvo.LayerNormalizedLSTMCellSimple và logic chuyển đổi của nó tại đây .
“Mang TensorFlow RNN của riêng bạn” đến TensorFlow Lite
Nếu giao diện RNN của người dùng khác với giao diện được hỗ trợ tiêu chuẩn, có một số tùy chọn:
Tùy chọn 1: Viết mã bộ điều hợp trong TensorFlow python để điều chỉnh giao diện RNN thành giao diện Keras RNN. Điều này có nghĩa là chức năng tf. với chú thích tf_implements trên chức năng của giao diện RNN được tạo giống với chức năng được tạo bởi lớp Keras LSTM. Sau đó, API chuyển đổi tương tự được sử dụng cho Keras LSTM sẽ hoạt động.
Tùy chọn 2: Nếu ở trên không thực hiện được (ví dụ: Keras LSTM thiếu một số chức năng hiện được hiển thị bởi LSTM hợp nhất của TensorFlow Lite như chuẩn hóa lớp), thì hãy mở rộng trình chuyển đổi TensorFlow Lite bằng cách viết mã chuyển đổi tùy chỉnh và cắm nó vào phần chuẩn bị -composite-functions MLIR-pass here . Giao diện của hàm 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 hoạt động TensorFlow Lite LSTM được hợp nhất - tức là đầu vào, thiên vị, trọng số, phép chiếu, chuẩn hóa lớp, v.v. Tốt hơn cho các tensors được truyền làm đối số cho điều này chức năng để có thứ hạng đã biết (tức là Loại kiểm duyệt được xếp hạng trong MLIR). Điều này làm cho việc viết mã chuyển đổi dễ dàng hơn nhiều có thể giả định các tensor này là LoạiTensorType 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ử TensorFlow Lite được hợp nhất.
Một ví dụ đầy đủ về luồng chuyển đổi đó là chuyển đổi LSTMCellSimple sang TensorFlow Lite của Lingvo.
LSTMCellSimple trong Lingvo được định nghĩa ở đây . Các mô hình được đào tạo với ô LSTM này có thể được chuyển đổi thành TensorFlow Lite như sau:
- Kết hợp tất cả việc sử dụng LSTMCellSimple trong một chức năng tf. với chú thích tf_implements được gắn nhãn như vậy (ví dụ: lingvo.LSTMCellSimple sẽ là một tên chú thích tốt ở đây). Đảm bảo rằng hàm tf. được tạo khớp với giao diện của hàm được mong đợi trong mã chuyển đổi. Đây là hợp đồng giữa tác giả mô hình thêm chú thích và mã chuyển đổi.
Mở rộng thẻ chuẩn bị-tổng hợp-chức năng để cắm một tùy chọn kết hợp tùy chỉnh để chuyển đổi op LSTM được kết hợp TensorFlow Lite. Xem mã chuyển đổi LSTMCellSimple .
Hợp đồng chuyển đổi:
Trọng lượng và lực căng hình chiếu được hoán vị.
{Input, recurrent} đến {ô, cổng đầu vào, cổng quên, cổng đầu ra} được trích xuất bằng cách cắt khối căng trọng số đã chuyển vị.
{Bias} thành {ô, cổng đầu vào, cổng quên, cổng đầu ra} được trích xuất bằng cách cắt hàng phân vị.
Phép chiếu được trích xuất bằng cách cắt khối chiếu chuyển vị.
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 TensorFlow Lite, bao gồm tất cả các đường chuyền MLIR được xác định cũng như lần xuất cuối cùng sang bộ đệm phẳng TensorFlow Lite có thể được sử dụng lại.
Các vấn đề / hạn chế đã biết
- Hiện tại chỉ hỗ trợ chuyển đổi Keras LSTM không trạng thái (hành vi mặc định trong Keras). Chuyển đổi Stateful Keras LSTM là công việc trong tương lai.
- Vẫn có thể lập mô hình lớp Keras LSTM trạng thái bằng cách sử dụng lớp Keras LSTM không trạng thái bên dướ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. Chương trình TensorFlow như vậy vẫn có thể được chuyển đổi thành TensorFlow Lite bằng cách sử dụng tính năng được mô tả ở đây.
- LSTM hai chiều hiện được mô hình hóa dưới dạng hai hoạt động UnidirectionalSequenceLSTM trong TensorFlow Lite. Điều này sẽ được thay thế bằng một op BidirectionalSequenceLSTM duy nhất.