Konwersja RNN z TensorFlow na LiteRT

Omówienie

LiteRT obsługuje konwertowanie modeli TensorFlow RNN na modele LiteRT scalone operacje LSTM. Operacje scalone mają na celu maksymalizację wydajności i jej bazowych implementacji jądra, a także zapewniają wyższy poziom do definiowania złożonych przekształceń, takich jak kwantyzacja.

Ponieważ w TensorFlow istnieje wiele wariantów interfejsów API RNN, nasze podejście w 2 sekcjach:

  1. Zapewnia natywną obsługę standardowych interfejsów API TensorFlow RNN, takich jak Keras LSTM. Jest to zalecana opcja.
  2. Udostępnij interfejs infrastruktury konwersji dla zdefiniowane przez użytkownika implementacje RNN, które należy podłączyć i przekonwertować na LiteRT. Udostępniamy kilka gotowych przykładów takich konwersji za pomocą narzędzia Lingvo LSTMCellSimple oraz LayerNormalizedLSTMCellSimple Interfejsy RNN.

Interfejs API konwertera

Ta funkcja jest dostępna w wersji TensorFlow 2.3. Jest ona również dostępna w tf-night i na głowie.

Ta funkcja konwersji jest dostępna po przejściu na LiteRT za pomocą obiektu SavedModel lub bezpośrednio z modelu Keras. Zobacz przykładowe przypadki użycia.

Z zapisanego modelu

# 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()

Z modelu Keras

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

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

Przykład

Keras LSTM na LiteRT Colab ilustruje pełne wykorzystanie z użyciem interpretera LiteRT.

Obsługiwane interfejsy API TensorFlow RNN

Umożliwiamy bezpośrednią konwersję Keras LSTM na LiteRT. Dla: jak to działa, zapoznaj się z Interfejs Kes LSTM i logikę konwersji tutaj.

Ważne jest również, aby podkreślić umowę LSTM LiteRT z uwzględnieniem: zgodnie z definicją operacji Keras:

  1. Wymiar 0 tensora wejściowego to rozmiar wsadu.
  2. Wymiar 0 tensora recurrent_weight to liczba dane wyjściowe.
  3. Transponowane są tensory weight i recurrent_kernel.
  4. Waga transponowanej, transponowane tensory recurrent_kernel i bias to: podzieloną na 4 tensory o równych rozmiarach wzdłuż wymiaru 0. Odpowiadają one bramka wejściowa, bramka przypomnienia, komórka i bramka wyjściowe.

Keras LSTM

Czas studiów

Użytkownicy mogą wybrać termin „ważny” lub „brak czasu wielkiego”. Keras LSTM ma teraz dużo czasu w atrybutach funkcji def. W przypadku sekwencji jednokierunkowej LSTM możesz po prostu zmapować na unidirecional_sequence_lstm time głównym.

Dwukierunkowa funkcja LSTM

Dwukierunkowe LSTM można zaimplementować z użyciem dwóch warstw Keras LSTM, po jednej do przodu, a drugi do tyłu – zobacz przykłady tutaj. Atrybut go_backward wskazuje, że jest to atrybut wsteczny LSTM, a następnie grupujemy LSTM do tyłu. Jest to rozwiązanie w przyszłości. Obecnie tworzy dwie operacje UnidirectionalSequenceLSTM w LiteRT model atrybucji.

Przykłady konwersji LSTM zdefiniowanych przez użytkownika

LiteRT zapewnia również sposób konwertowania LSTM zdefiniowanego przez użytkownika implementacji. Używamy LSTM firmy Lingvo jako przykładu . Szczegółowe informacje znajdziesz tutaj: Interfejs lingvo.LSTMCellSimple i logikę konwersji, tutaj. Podajemy też przykład innej definicji LSTM firmy Lingvo w Interfejs lingvo.LayerNormalizedLSTMCellSimple i jej logikę konwersji tutaj.

Użyj własnego TensorFlow RNN do LiteRT

Jeśli interfejs RNN użytkownika różni się od standardowego, masz kilka opcji:

Opcja 1. Napisz kod adaptera w języku Python TensorFlow, aby dostosować interfejs RNN do interfejsu Keras RNN. Oznacza to, że tf.function z adnotacja tf_implements dotycząca funkcji interfejsu RNN, która jest identyczna z funkcją wygenerowaną przez powłokę Keras LSTM. Później ten sam interfejs API konwersji był używany w przypadku Keras LSTM będzie działać.

Opcja 2: jeśli nie jest to możliwe (np. w Keraście LSTM brakuje niektórych funkcji, które są obecnie udostępniane w ramach połączonych funkcji LSTM LiteRT, takich jak normalizacji warstwy), a następnie rozszerz konwerter LiteRT, zapisując go niestandardowy kod konwersji i umieścić go w funkcjach złożonych MLIR-pass tutaj. Interfejs funkcji powinien być traktowany jak kontrakt interfejsu API i powinien zawierają argumenty potrzebne do przekonwertowania na utrwalony język LiteRT LSTM tj. dane wejściowe, odchylenia, wagi, rzutowanie, normalizację warstwy itp. jest preferowane, jeśli tensory przekazywane jako argumenty do tej funkcji mają znane ranking (np. „rankingedTensorType” w MLIR). Dzięki temu pisanie jest znacznie łatwiejsze kodu konwersji, który może przyjąć te tensory jako typ obiektu RankedTensorType i pomóc przekształcaj je do tensorów rankingowych odpowiadających połączonemu LiteRT operandy operatora.

Pełnym przykładem tego procesu konwersji jest aplikacja LSTMCellSimple na potrzeby firmy Lingvo, Konwersja LiteRT.

Zdefiniowano LSTMCellSimple w Lingvo tutaj. Modele wytrenowane z użyciem tej komórki LSTM można przekonwertować na format LiteRT jako następujące:

  1. Umieść wszystkie zastosowania LSTMCellSimple w tf.function za pomocą tf_implements adnotacji, która jest odpowiednio oznaczona (np. lingvo.LSTMCellSimple to dobrą nazwę adnotacji). Upewnij się, że wygenerowana funkcja tf.function pasuje do interfejsu funkcji oczekiwanej w kodzie konwersji. Ten to umowa między autorem modelu dodającym adnotację kodu konwersji.
  2. Rozszerz kartę „Prepare-composite-functions”, aby podłączyć niestandardowe działanie złożone. na konwersję LSTM z użyciem LiteRT. Zobacz LSTMCellSimple kodu konwersji.

    Umowa o przekształcenie:

  3. Transponowane są tensory wagi i rzutowania.

  4. Komórka {input, recurrent} do {cell, typ bramki, bramka zapominająca, dane wyjściowe gate} są wyodrębniane przez wycinanie transponowanego tensora wagi.

  5. Od {bias} do {bias} to wyodrębnione przez przecięcie tensora odchylenia.

  6. Odwzorowanie jest wyodrębniane przez wycinanie tensora rzutu transponowanego.

  7. Podobna konwersja jest zapisywana dla: LayerNormalizedLSTMCellSimple.

  8. Pozostała część infrastruktury konwersji LiteRT, w tym Zaliczenia MLIR jak również ostateczny eksport do płaskiego bufora LiteRT może być ponownie użyte.

Znane problemy/ograniczenia

  1. Obecnie dostępna jest tylko konwertowanie bezstanowego Keras LSTM (domyślnie w środowisku Keras). Konwersja stanowej Keras LSTM to przyszłość.
  2. Nadal można modelować stanową warstwę Keras LSTM za pomocą bazowej, bezstanowej warstwy Keras LSTM i zarządzania stanem wprost program użytkownika. Taki program w TensorFlow można nadal przekonwertować na LiteRT przy użyciu opisanej tutaj funkcji.
  3. Dwukierunkowy LSTM jest obecnie modelowany jako 2 jednokierunkoweSequenceLSTM i operacji w skali LiteRT. Zostanie on zastąpiony jednym BidirectionalSequenceLSTM op.