TensorFlow RNN'yi TensorFlow Lite'a dönüştürme

Genel bakış

TensorFlow Lite, TensorFlow RNN modellerini TensorFlow Lite'ın birleştirilmiş LSTM işlemlerine dönüştürmeyi destekler. Çok kaynaklı işlemler, temel çekirdek uygulamalarının performansını en üst düzeye çıkarmanın yanı sıra niceliklendirme gibi karmaşık dönüşümleri tanımlamak için daha yüksek düzeyde bir arayüz sağlar.

TensorFlow'da RNN API'lerinin birçok varyantı olduğundan yaklaşımımız iki aşamadan oluşmaktadır:

  1. Keras LSTM gibi standart TensorFlow RNN API'leri için yerel destek sağlayın. Bu, önerilen seçenektir.
  2. RNN uygulamalarının dahil edilip TensorFlow Lite'a dönüştürülmesi için dönüşüm altyapısına bir arayüz sağlayın. Lingvo’nun LSTMCellSimple ve LayerNormalizedLSTMCellSimple RNN arayüzlerini kullanarak bu tür dönüştürmelerle ilgili birkaç örnek sunuyoruz.

Dönüştürücü API'sı

Bu özellik TensorFlow 2.3 sürümünün bir parçasıdır. tf-nightly pip'ten veya head ile de alınabilir.

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

Kayıtlı 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'a Colab, TensorFlow Lite yorumlayıcısıyla uçtan uca kullanımı gösterir.

Desteklenen TensorFlow RNN'leri API'leri

Keras LSTM'nin kullanıma hazır olarak TensorFlow Lite'a dönüştürülmesini destekliyoruz. Bunun işleyiş şekliyle ilgili ayrıntılar için lütfen Keras LSTM arayüzü ve buradaki dönüşüm mantığı sayfasına bakın.

Ayrıca, Keras işlem tanımı açısından TensorFlow Lite’ın LSTM sözleşmesini vurgulamak da önemlidir:

  1. input tensörünün boyutu 0, grup boyutudur.
  2. recurrent_weight tensörünün boyutu 0, çıkış sayısıdır.
  3. weight ve recurrent_kernel tensörleri ters yuvarlanır.
  4. Devrik ağırlık, ters çevrilmiş recurrent_kernel ve bias tensörleri, 0 boyutu boyunca 4 eşit boyutlu tensöre bölünür. Bunlar giriş kapısı, unutma kapısı, hücre ve çıkış kapısına karşılık gelir.

Keras LSTM Varyantları

Ana dönem

Kullanıcılar büyük zamanı veya "zaman öncelikli değil"i tercih edebilir. Keras LSTM, işlev def özelliklerine zaman önemli bir özelliği ekler. Tek Yönlü dizi LSTM için basitçe unidirecional_sequence_lstm'in time ana özelliğini eşleyebiliriz.

Çift Yönlü LSTM

Çift yönlü LSTM, biri ileri ve diğeri için olmak üzere iki Keras LSTM katmanıyla uygulanabilir. Buradaki örneklere bakın. go_backward özelliğini gördüğümüzde, bu özelliği geriye doğru LSTM olarak tanırız, ardından ileri ve geri LSTM özelliğini birlikte gruplandırırız. Bu, gelecekteki çalışmalardır. Şu anda bu işlem, TensorFlow Lite modelinde iki UnidirectionalSequenceLSTM işlemi oluşturmaktadır.

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

TensorFlow Lite, kullanıcı tanımlı LSTM uygulamalarını dönüştürmek için de bir yol sunar. Burada, bunun nasıl uygulanabileceğine dair bir örnek olarak Lingvo’nun LSTM'sini kullanıyoruz. Ayrıntılar için lütfen lingvo.LSTMCellSimple arayüzüne ve buradaki dönüşüm mantığına bakın. Ayrıca, lingvo.LayerNormalizedLSTMCellSimple arayüzündeki başka bir Lingvo LSTM tanımı ve dönüşüm mantığı için burada bir örnek de bulabilirsiniz.

"Bring your own TensorFlow RNN" to TensorFlow Lite

Bir kullanıcının RNN arayüzü standart desteklenen arayüzlerden farklıysa birkaç seçeneğiniz vardır:

1. Seçenek: RNN arayüzünü Keras RNN arayüzüne uyarlamak için TensorFlow python'unda adaptör kodu yazın. Yani, 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 yer alır. Bunun ardından, Keras LSTM için kullanılan dönüşüm API'sinin aynısı çalışacaktır.

2.Seçenek: Yukarıdakiler mümkün değilse (ör. Keras LSTM'de, TensorFlow Lite'ın çok kaynaklı LSTM op gibi katman normalleştirmesi tarafından kullanıma sunulan bazı işlevler eksikse) özel dönüşüm kodu yazıp TensorFlow Lite dönüştürücüsünü genişletin ve buraya hazırlayın. İşlevin arayüzü, API sözleşmesi gibi ele alınmalı ve çok yoğun TensorFlow Lite LSTM işlemlerine (yani giriş, önyargı, ağırlıklar, projeksiyon, katman normalleştirmesi vb.) dönüştürmek için gereken bağımsız değişkenleri içermelidir. Bu işleve bağımsız değişken olarak aktarılan tensörlerin bilinen sıralamaya (ör. MLIR'de RankedTensorType) sahip olması tercih edilir. Bu da, bu tensörleri RankedTensorType olarak varsayabilecek dönüşüm kodu yazmayı ve bunların, çok kaynaklı TensorFlow Lite operatörünün işlenenlerine karşılık gelen sıralı tensörlere dönüştürülmesini kolaylaştırır.

Lingvo’nun LSTMCellSimple'dan TensorFlow Lite'a dönüşüm akışı bu türden bir dönüşüm akışının eksiksiz örneğidir.

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

  1. LSTMCellSimple'ın tüm kullanımlarını bir tf.function içinde, bu şekilde etiketlenmiş bir tf_applys ek açıklamasıyla sarmalayın (ör. lingvo.LSTMCellSimple burada iyi bir ek açıklama adı olur). Oluşturulan tf.function'ın, dönüşüm kodunda beklenen işlevin arayüzüyle eşleştiğinden emin olun. Bu, ek açıklama ile dönüşüm kodunu ekleyen model yazarı arasında yapılan bir sözleşmedir.
  2. Hazırlama-kompozit işlevleri geçişini, TensorFlow Lite ile kaynaşmış LSTM işlem dönüşümüne özel bir bileşik bağlamak için genişletin. LSTMCellSimple dönüşüm koduna bakın.

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

  3. Ağırlık ve projeksiyon tensörleri ters ters çevrilir.

  4. {input, recurrent} ila {cell, giriş kapısı, unutma kapısı, çıkış kapısı} arası değer, ters çevrilmiş ağırlık tensörü dilimlenerek ayıklanır.

  5. {bias} ile {cell, Input gate, bırakarak gate, çıkış kapısı} arasındaki değerler, ağırlık tensörü dilimlerle ayıklanarak çıkarılır.

  6. Projeksiyon, ters çevrilmiş proje tensörünün dilim kullanılarak ayıklanır.

  7. LayerNormalizedLSTMCellSimple için benzer bir dönüşüm yazılır.

  8. Tanımlanan tüm MLIR geçişlerinin yanı sıra TensorFlow Lite düz arabelleğe yapılan nihai dışa aktarma işlemi dahil, TensorFlow Lite dönüşüm altyapısının geri kalanı yeniden kullanılabilir.

Bilinen sorunlar/sınırlamalar

  1. Şu anda yalnızca durum bilgisiz Keras LSTM (Keras'ta varsayılan davranış) dönüştürme desteği sunulmaktadır. Durum bilgili Keras LSTM dönüşümü gelecekte yapılacak çalışmalardır.
  2. Temel durum bilgisiz Keras LSTM katmanını kullanarak ve durumu kullanıcı programında açıkça yönetmek üzere durum bilgili bir Keras LSTM katmanı modellemek yine de mümkündür. Böyle bir TensorFlow programı, burada açıklanan özellik kullanılarak yine de TensorFlow Lite'a dönüştürülebilir.
  3. Çift yönlü LSTM, şu anda TensorFlow Lite'ta iki UnidirectionalSequenceLSTM işlemi olarak modellenmektedir. Bu, tek bir BidirectionalSequenceLSTM işlem ile değiştirilecektir.