Chuyển đổi từ TensorFlow RNN thành LiteRT

Tổng quan

LiteRT hỗ trợ việc chuyển đổi các mô hình RNN của TensorFlow sang LiteRT hoạt động LSTM kết hợp. Có các toán tử kết hợp để tối đa hoá hiệu suất của cách triển khai nhân cơ bản của mình, cũng như cung cấp cấp độ cao hơn để xác định các phép 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, phương pháp của chúng tôi hai màn hình:

  1. Cung cấp dịch vụ hỗ trợ riêng cho các API RNN tiêu chuẩn của TensorFlow, chẳng hạn như Keras LSTM. Đây là lựa chọn được đề xuất.
  2. Cung cấp giao diện vào cơ sở hạ tầng chuyển đổi cho phương pháp triển khai RNN do người dùng xác định để kết nối và chuyển đổi thành LiteRT. Chúng tôi cung cấp một vài ví dụ có sẵn về những trường hợp đó bằng ngôn ngữ lập trình lingvo LSTMCellSimpleLayerNormalizedLSTMCellSimple Giao diện RNN.

API trình chuyển đổi

Tính năng này nằm trong bản phát hành TensorFlow 2.3. Nền tảng này cũng có sẵn thông qua tf mỗi đêm hoặc từ đầu.

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.

Từ người 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 sang LiteRT Colab minh hoạ hoạt động sử dụng từ đầu đến cuối bằng trình thông dịch LiteRT.

Các API RNN của TensorFlow được hỗ trợ

Chúng tôi hỗ trợ chuyển đổi ngay lập tức Keras LSTM sang LiteRT. Cho thông tin về cách thức hoạt động của quy trình này, vui lòng tham khảo Giao diện Kers LSTM và logic chuyển đổi tại đây.

Một điểm quan trọng nữa là làm nổi bật hợp đồng LSTM của LiteRT vào định nghĩa toán tử Keras:

  1. Kích thước 0 của tensor đầu vào là kích thước lô.
  2. Kích thước 0 của tensor recurrent_weight là số đầu ra.
  3. Các tensor weightrecurrent_kernel được chuyển vị.
  4. Các tensor trọng số được hoán vị, recurrent_kernel và bias được hoán vị là thành 4 tensor có cùng kích thước dọc theo chiều số 0. Các giá trị này tương ứng với cổng đầu vào, xoá cổng, mạng di động và cổng đầu ra.

Biến thể Keras LSTM

Chính thời gian

Người dùng có thể chọn quan trọng về thời gian hoặc không có thời gian quan trọng. Keras LSTM thêm một giá trị lớn về thời gian trong các thuộc tính hàm def. Đối với LSTM chuỗi một chiều, chúng tôi có thể chỉ cần ánh xạ đến thuộc tính thời gian chính.

LSTM hai chiều

LSTM hai chiều có thể được triển khai bằng hai lớp Keras LSTM, một cho tiến và một để lùi lại, xem ví dụ tại đây. Sau khi thấy thuộc tính go_backward, chúng tôi nhận ra thuộc tính này là LSTM ngược, sau đó chúng ta sẽ nhóm về phía trước & LSTM lùi lại cùng nhau. Đây là dự án sắp tới. Hiện tại, thao tác này sẽ tạo ra hai thao tác UnidirectionalSequenceLSTM trong LiteRT mô hình.

Ví dụ về lượt chuyển đổi ứng dụng kém an toàn do người dùng xác định

LiteRT cũng cung cấp cách chuyển đổi LSTM do người dùng xác định thực tế. Ở đây, chúng tôi sử dụng LSTM của Lingvo làm ví dụ về cách có thể triển khai. Để 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ụ về các định nghĩa khác của Lingvo về LSTM trong Giao diện lingvo.LayerNormalizedLSTMCellSimple và logic chuyển đổi tại đây.

"Sử dụng TensorFlow RNN 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 giao diện RNN được hỗ trợ tiêu chuẩn, thì có một vài lựa chọn:

Cách 1: Viết mã bộ chuyển đổi trong TensorFlow python để điều chỉnh giao diện RNN đến giao diện Keras RNN. Tức là một hàm tf.function có tf_implementations chú thích trên chức năng của giao diện RNN đã tạo giống hệt với chức năng được tạo bởi lớp Keras LSTM. Sau đó, cùng một API chuyển đổi được dùng cho Keras LSTM sẽ mang lại hiệu quả.

Cách 2: Nếu không thực hiện được cách trên (ví dụ: Keras LSTM thiếu một số hiện đang được sử dụng bởi chức năng LSTM kết hợp của LiteRT như chuẩn hoá lớp), sau đó mở rộng bộ chuyển đổi LiteRT bằng cách ghi mã chuyển đổi tuỳ chỉnh và nhập mã đó vào các hàm chuẩn bị tổng hợp MLIR-pass tại đây. Giao diện của hàm phải được xem như một hợp đồng API và nên chứa các đối số cần thiết để chuyển đổi thành LiteRT LSTM kết hợp các thao tác – ví dụ: đầu vào, độ chệch, trọng số, phép chiếu, chuẩn hoá lớp, v.v. Nó nên ưu tiên các tensor được truyền dưới dạng đối số cho hàm này để biết hạng (ví dụ: Xếp hạngTensorType trong MLIR). Thao tác này giúp việc viết dễ dàng hơn mã chuyển đổi có thể giả định các tensor này là Xếp hạngTensorType và giúp biến đổi chúng thành các tensor được xếp hạng tương ứng với LiteRT kết hợp toán hạng của toán tử.

Một ví dụ hoàn chỉnh về luồng chuyển đổi này là LSTMCellSimple của Lingvo Chuyển đổi LiteRT.

Định nghĩa LSTMCellSimple trong Lingvo tại đây. Các mô hình được huấn luyện bằng ô LSTM này có thể được chuyển đổi sang LiteRT dưới dạng sau:

  1. Gói tất cả các lần sử dụng LSTMCellSimple trong một tf.function với một tf_implementations được gắn nhãn như vậy (ví dụ: lingvo.LSTMCellSimple sẽ là tên chú thích phù hợp ở đây). Đảm bảo hàm tf.function đã được tạo khớp với giao diện của hàm được mong đợi trong mã chuyển đổi. Chiến dịch này là hợp đồng giữa tác giả mô hình thêm chú thích và mã chuyển đổi.
  2. Mở rộng thẻ các hàm chuẩn bị-composite để cắm vào một hoạt động kết hợp tuỳ chỉnh thành chuyển đổi hoạt động LSTM kết hợp LiteRT. Xem LSTMCellSimple mã chuyển đổi.

    Hợp đồng chuyển đổi:

  3. Các tensor trọng sốhình chiếu được chuyển vị.

  4. {input, recurrent} đến {cell, input gate, xoá cổng, output gate} được trích xuất bằng cách cắt lát của tensor trọng số hoán vị.

  5. {bias} đến {bias} là được trích xuất bằng cách cắt lát tensor thiên vị.

  6. Phép chiếu được trích xuất bằng cách cắt lát của tensor phép chiếu hoán vị.

  7. Lượt chuyển đổi tương tự được viết cho LayerNormalizedLSTMCellSimple.

  8. Phần còn lại của cơ sở hạ tầng chuyển đổi LiteRT, bao gồm tất cả Thẻ và vé MLIR cũng như lần xuất cuối cùng sang bộ đệm phẳng LiteRT có thể được xác định trước. sử dụng lại.

Các vấn đề/giới hạn đã biết

  1. Hiện chỉ hỗ trợ chuyển đổi Keras LSTM không có trạng thái (mặc định) trong Keras). Việc chuyển đổi LSTM trạng thái Keras là công việc trong tương lai.
  2. Vẫn có thể mô hình hoá một lớp Keras LSTM có trạng thái bằng cách sử dụng lớp Keras LSTM không có trạng thái cơ bản và quản lý trạng thái một cách rõ ràng trong chương trình người dùng. Một chương trình TensorFlow như vậy vẫn có thể được chuyển đổi thành LiteRT sử dụng tính năng được mô tả ở đây.
  3. LSTM hai chiều hiện được mô hình hoá là hai đơn hướngSequenceLSTM trong LiteRT. Tên này sẽ được thay thế bằng một BidirectionalSequenceLSTM hoạt động