TensorFlow RNN'nin TensorFlow Lite'a dönüştürülmesi

Genel Bakış

TensorFlow Lite, TensorFlow RNN modellerinin TensorFlow Lite'ın birleştirilmiş LSTM işlemlerine dönüştürülmesini destekler. Birleştirilmiş işlemler, temeldeki çekirdek uygulamalarının performansını en üst düzeye çıkarmanın yanı sıra niceleme gibi karmaşık dönüşümleri tanımlamak için daha yüksek düzeyde bir arayüz sağlamak için mevcuttur.

TensorFlow'da RNN API'lerinin birçok çeşidi bulunduğundan yaklaşımımız iki yönlü olmuştur:

  1. Keras LSTM gibi standart TensorFlow RNN API'leri için yerel destek sağlayın. Bu önerilen seçenektir.
  2. Kullanıcı tanımlı RNN uygulamalarının takılıp TensorFlow Lite'a dönüştürülmesi için dönüştürme altyapısına bir arayüz sağlayın. Lingvo'nun LSTMCellSimple ve LayerNormalizedLSTMCellSimple RNN arayüzlerini kullanarak bu tür dönüşümün kullanıma hazır birkaç örneğini sunuyoruz.

Dönüştürücü API'si

Bu özellik TensorFlow 2.3 sürümünün bir parçasıdır. Ayrıca tf-nightly pip aracılığıyla veya kafadan da temin edilebilir.

Bu dönüştürme işlevi, SavedModel aracılığıyla veya doğrudan Keras modelinden TensorFlow Lite'a dönüştürme sırasında kullanılabilir. Örnek kullanımlara bakın.

Kaydedilen modelden

# 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 modelinden

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

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

Örnek

Keras LSTM'den TensorFlow Lite Colab'a, TensorFlow Lite yorumlayıcısının uçtan uca kullanımını göstermektedir.

TensorFlow RNN API'leri desteklenir

Keras LSTM'nin TensorFlow Lite'a kullanıma hazır dönüşümünü destekliyoruz. Bunun nasıl çalıştığına ilişkin ayrıntılar için lütfen Keras LSTM arayüzüne bakın. ve buradaki dönüşüm mantığına.

Ayrıca Keras operasyon tanımına göre TensorFlow Lite'ın LSTM sözleşmesini vurgulamak da önemlidir:

  1. Giriş tensörünün 0 boyutu parti boyutudur.
  2. Tekrarlayan_ağırlık tensörünün 0 boyutu, çıkışların sayısıdır.
  3. Ağırlık ve recurrent_kernel tensörleri yer değiştirir.
  4. Aktarılan ağırlık, aktarılan recurrent_kernel ve öngerilim tensörleri 0 boyutu boyunca 4 eşit boyutlu tensöre bölünür. Bunlar giriş kapısına, unutma kapısına, hücreye ve çıkış kapısına karşılık gelir.

Keras LSTM Çeşitleri

Zaman ana dal

Kullanıcılar zaman ana dalını veya zaman ana dalını seçmeyebilir. Keras LSTM, function def özniteliklerine bir ana zaman özniteliği ekler. Tek yönlü dizi LSTM için, unidirecional_sequence_lstm'nin zaman ana niteliğini basitçe eşleyebiliriz.

Çift Yönlü LSTM

Çift yönlü LSTM, biri ileri ve diğeri geri olmak üzere iki Keras LSTM katmanıyla uygulanabilir; buradaki örneklere bakın. go_backward niteliğini gördüğümüzde onu geriye dönük LSTM olarak tanırız, ardından ileri ve geri LSTM'yi birlikte gruplandırırız. Bu gelecekteki bir çalışmadır. Şu anda bu, TensorFlow Lite modelinde iki Uni DirectionSequenceLSTM işlemi oluşturmaktadır.

Kullanıcı tanımlı LSTM dönüşüm örnekleri

TensorFlow Lite ayrıca kullanıcı tanımlı LSTM uygulamalarını dönüştürmenin bir yolunu da sağlar. Burada bunun nasıl uygulanabileceğinin bir örneği olarak Lingvo'nun LSTM'sini kullanıyoruz. Ayrıntılar için lütfen buradaki lingvo.LSTMCellSimple arayüzüne ve dönüştürme mantığına bakın. Ayrıca Lingvo.LayerNormalizedLSTMCellSimple arayüzünde Lingvo'nun başka bir LSTM tanımına örnek ve dönüşüm mantığını burada sunuyoruz.

TensorFlow Lite'a "Kendi TensorFlow RNN'nizi getirin"

Bir kullanıcının RNN arayüzü standart olarak desteklenenlerden farklıysa birkaç seçenek vardır:

Seçenek 1: RNN arayüzünü Keras RNN arayüzüne uyarlamak için adaptör kodunu TensorFlow python'a yazın. Bu, oluşturulan RNN arayüzünün işlevinde Keras LSTM katmanı tarafından oluşturulanla aynı olan tf_implements ek açıklamasına sahip bir tf.function anlamına gelir. Bundan sonra Keras LSTM için kullanılan dönüşüm API'sinin aynısı çalışacaktır.

Seçenek 2: Yukarıdakiler mümkün değilse (örneğin Keras LSTM'de, TensorFlow Lite'ın kaynaştırılmış LSTM op benzeri katman normalleştirmesi tarafından şu anda açığa çıkan bazı işlevler eksikse), özel dönüşüm kodu yazarak TensorFlow Lite dönüştürücüsünü genişletin ve hazırlığa takın. -bileşik işlevler MLIR- buraya geçer. Fonksiyonun arayüzü bir API sözleşmesi gibi ele alınmalı ve birleştirilmiş TensorFlow Lite LSTM işlemlerine dönüştürmek için gereken argümanları (yani giriş, önyargı, ağırlıklar, projeksiyon, katman normalizasyonu vb.) içermelidir. Buna argüman olarak iletilen tensörler için tercih edilir. işlevin bilinen bir sıralamaya sahip olması gerekir (yani MLIR'de RantTensorType). Bu, bu tensörleri DereceliTensorType olarak kabul edebilen dönüşüm kodunun yazılmasını çok daha kolay hale getirir ve bunların, birleştirilmiş TensorFlow Lite operatörünün işlenenlerine karşılık gelen sıralı tensörlere dönüştürülmesine yardımcı olur.

Bu tür dönüşüm akışının tam bir örneği, Lingvo'nun LSTMCellSimple'dan TensorFlow Lite'a dönüşümüdür.

Lingvo'daki LSTMCellSimple burada tanımlanır. Bu LSTM hücresiyle eğitilen modeller TensorFlow Lite'a aşağıdaki şekilde dönüştürülebilir:

  1. LSTMCellSimple'ın tüm kullanımlarını, bu şekilde etiketlenmiş bir tf_implements ek açıklamasıyla bir tf.function içine sarın (örneğin, lingvo.LSTMCellSimple burada iyi bir ek açıklama adı olabilir). Oluşturulan tf.function'ın, dönüştürme kodunda beklenen işlevin arayüzüyle eşleştiğinden emin olun. Bu, ek açıklamayı ve dönüştürme kodunu ekleyen model yazarı arasında yapılan bir sözleşmedir.
  2. Bileşik hazırlama işlevleri geçişini, özel bir bileşik op'u TensorFlow Lite kaynaşık LSTM op dönüşümüne bağlamak için genişletin. Bkz. LSTMCellSimple dönüşüm kodu.

    Dönüşüm sözleşmesi:

  3. Ağırlık ve projeksiyon tensörleri yer değiştirir.

  4. {Hücre , giriş kapısı, unutma kapısı, çıkış kapısı} için {giriş, yinelenen}, aktarılan ağırlık tensörünün dilimlenmesiyle çıkarılır.

  5. {hücre, giriş kapısı, unutma kapısı, çıkış kapısı} için {önyargı }, öngerilim tensörünün dilimlenmesiyle çıkarılır.

  6. Projeksiyon, transpoze projeksiyon tensörünün dilimlenmesiyle çıkarılır.

  7. Benzer dönüşüm LayerNormalizedLSTMCellSimple için de yazılmıştır.

  8. Tanımlanan tüm MLIR geçişlerinin yanı sıra TensorFlow Lite düz ara belleğe son aktarım da dahil olmak üzere TensorFlow Lite dönüştürme altyapısının geri kalanı yeniden kullanılabilir.

Bilinen sorunlar/kısıtlamalar

  1. Şu anda yalnızca durum bilgisi olmayan Keras LSTM'yi dönüştürme desteği bulunmaktadır (Keras'ta varsayılan davranış). Durum bilgisi olan Keras LSTM dönüşümü gelecekteki bir çalışmadır.
  2. Durum bilgisi olan bir Keras LSTM katmanını, temeldeki durum bilgisi olmayan Keras LSTM katmanını kullanarak modellemek ve durumu kullanıcı programında açıkça yönetmek hala mümkündür. Böyle bir TensorFlow programı, burada açıklanan özellik kullanılarak TensorFlow Lite'a dönüştürülebilir.
  3. Çift Yönlü LSTM şu anda TensorFlow Lite'ta iki Tek Yönlü Sıra LSTM işlemi olarak modellenmiştir. Bu, tek bir BidireksiyonelSekansLSTM işlemiyle değiştirilecektir.