TensorFlow RNN'yi LiteRT'e dönüştürme

Genel Bakış

LiteRT, TensorFlow RNN modellerinin LiteRT'e dönüştürülmesini destekler çok kaynaklı LSTM işlemleri. Birleştirilmiş işlemler, test etmenin yanı sıra, daha yüksek seviyede bir güvenlik düzeyi dönüştürme gibi karmaşık dönüşümleri tanımlamak için kullanılan arayüzdür.

TensorFlow'da RNN API'lerinin çok sayıda varyantı olduğundan yaklaşımımız iki katlı:

  1. Keras LSTM gibi standart TensorFlow RNN API'leri için yerel destek sağlayın. Bu, önerilen seçenektir.
  2. Şunun için dönüşüm altyapısına bir arayüz sağlayın: takmak ve dönüştürmek için kullanıcı tanımlı RNN uygulamaları LiteRT. Size, Google'da ve sektör genelinde lingvo'nun LSTMCellSimple ve LayerNormalizedLSTMCellSimple RNN arayüzleridir.

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-night pip ya da kafadan.

Bu dönüştürme işlevi, LiteRT'e dönüştürme sırasında kullanılabilir veya doğrudan Keras modeli üzerinden ilişkilendirme yapabilirsiniz. Ö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 LiteRT'ye Colab , LiteRT çevirmeni ile uçtan uca kullanımı gösterir.

Desteklenen TensorFlow RNN API'leri

Keras LSTM'nin kullanıma hazır olarak LiteRT'e dönüştürülmesini destekliyoruz. Örneğin, daha fazla bilgi için lütfen Keras LSTM arayüzü ve dönüşüm mantığı burada bulabilirsiniz.

Ayrıca, LiteRT'in LSTM sözleşmesinin imzasını şöyle bir açıklama yapabilirsiniz:

  1. input tensörünün 0 boyutu grup boyutudur.
  2. recurrent_weight tensörünün 0 boyutu, çıktı.
  3. weight ve recurrent_kernel tensörlerinin yeri değiştirilir.
  4. Devrik ağırlık, ters çevrilen recurrent_kernel ve bias tensörleri 0 boyutu boyunca eşit boyutlu 4 tensöre bölün. Bunlar giriş kapısı, unutma kapısı, hücre ve çıkış kapısı.

Keras LSTM Çeşitleri

Ana dönem

Kullanıcılar "zamanlı" veya "zamanlı" farkın olmadığını seçebilirler. Keras LSTM, zaman çizelgesi özelliğini kullanabilirsiniz. Tek Yönlü dizi LSTM için unidirecional_sequence_lstm's ile eşleyebilir zaman ana özelliği hakkında daha fazla bilgi edinin.

Çift Yönlü LSTM

Çift yönlü LSTM, biri 2 adet Keras LSTM katmanı olmak üzere ileri ve biri geri için, örneklere bakın burada bulabilirsiniz. go_backward özelliğini gördüğümüzde, bunu geriye LSTM olarak anlayıp farklı gruplardaki birlikte kullanır. Bu, ileride yapılacak bir çalışma. Şu anda, Bu, LiteRT içinde iki UnidirectionalSequenceLSTM işlemi oluşturur modeli.

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

LiteRT, kullanıcı tanımlı LSTM'yi dönüştürmek için de bir yol sağlar hakkında bilgi edindiniz. Burada Lingvo'nun LSTM'sini kullanarak bunların mobil cihazlarda nasıl yardımcı olur. Ayrıntılar için lütfen lingvo.LSTMCellSimple arayüzü ve dönüşüm mantığı burada bulabilirsiniz. Lingvo'nun LSTM tanımları için başka bir örnek de lingvo.layerNormalizedLSTMCellSimple arayüzü ve dönüşüm mantığı burada bulabilirsiniz.

LiteRT'te "Kendi TensorFlow RNN'nizi getirin"

Bir kullanıcının RNN arayüzü, desteklenen standart arayüzden farklıysa birkaç seçenek vardır:

1. Seçenek: RNN arayüzünü uyarlamak için TensorFlow python'da adaptör kodu yazma kolayca oluşturabilirsiniz. Bu, tf_implements ek açıklaması tarafından oluşturulan RNN arayüzünün işlevine katmanını kullandı. Bundan sonra, Keras LSTM için kullanılan dönüşüm API'sinin aynısı çalışır.

2.Seçenek: Yukarıdaki yöntem mümkün değilse (ör. Keras LSTM'de şu anda LiteRT'in çok kaynaklı LSTM op'su tarafından sunulan işlevler katman normalleştirmesi) açın, ardından bir kod yazarak LiteRT dönüştürücüsünü genişletin. özel dönüşüm kodunu kullanıp "birleştirme-hazırlama-işlevlerine" MLIR-pass burada bulabilirsiniz. İşlevin arayüzü, API sözleşmesi gibi değerlendirilmelidir. çok kaynaklı LiteRT LSTM'ye dönüştürmek için gereken bağımsız değişkenleri içeren işlemleri (ör. giriş, yanlılık, ağırlıklar, projeksiyon, katman normalleştirmesi vb.) bu işleve bağımsız değişken olarak iletilen tensörlerin, sıra (ör. MLIR'de SortedTensorType) olur. Bu sayede, sistemle ilgili gibi bir dönüşüm kodu vardır. Bu tensörlerin SortedTensorType olarak bunları kaynaşmış LiteRT'e karşılık gelen sıralı tensörlere dönüştürür. işlecinin işlenenleri arasında yer alır.

Bu dönüşüm akışının eksiksiz bir örneği, Lingvo'nun LSTMCellSimple'dır. LiteRT dönüşümü.

Lingvo'daki LSTMCell Simple tanımlandı burada bulabilirsiniz. Bu LSTM hücresiyle eğitilen modeller, aşağıdaki gibi LiteRT'e dönüştürülebilir: şöyle olur:

  1. LSTMCellSimple'ın tüm kullanımlarını bir tf.fonksiyonda tf_implements ile sarmalama ek açıklama (örneğin, lingvo.LSTMCellSimple iyi bir ek açıklama adı buraya yazın). Oluşturulan tf.Function'ın dönüşüm kodunda beklenen işlevin arayüzüyle eşleşir. Bu model yazarı ile ek açıklamayı ekleyen ve dönüşüm kodu.
  2. Özel bileşik bir operasyon bağlamak için kompozit hazırlama fonksiyonları geçişini genişletme LSTM op dönüşümüne Görüntüleyin LSTMCellSimple dönüşüm kodu.

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

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

  4. {input, recurrent} - {cell, enter gate, yüzme kapısı, çıkış gate}, ters çevrilmiş ağırlık tensörü dilimlenerek ayıklanır.

  5. {bias} ile {bias} şunlardır: önyargı tensörü dilimlere ayrılarak ayıklanır.

  6. Projeksiyon, ters çevrilmiş projeksiyon tensörünün dilimlenmesiyle çıkarılır.

  7. Benzer dönüşüm aşağıdaki hesap için yazılmıştır: LayerNormalizedLSTMCellSimple.

  8. Tüm LiteRT dönüşüm altyapısının geri kalanı, MLIR kartları LiteRT sabit arabelleğine yapılan son dışa aktarım işlemi de yeniden kullanıldı.

Bilinen sorunlar/sınırlamalar

  1. Şu anda yalnızca durum bilgisiz Keras LSTM'yi (varsayılan) için geçerli değildir). Durum bilgili Keras LSTM dönüşümü, gelecekteki bir çalışmadır.
  2. Ayrıca, durum bilgisiz Keras LSTM katmanını temel alarak ve durumu açıkça geri dönelim. Bu tür bir TensorFlow programı hâlâ LiteRT aracını kullanabilirsiniz.
  3. İki yönlü LSTM şu anda iki UnidirectionalSequenceLSTM olarak modelleniyor devam ediyoruz. Bu, tek bir BidirectionalSequenceLSTM op.