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

Genel Bakış

LiteRT, TensorFlow RNN modellerinin LiteRT'nin birleştirilmiş LSTM işlemlerine dönüştürülmesini destekler. Birleştirilmiş işlemler, temel çekirdek uygulamalarının performansını en üst düzeye çıkarmak ve nicemleme gibi karmaşık dönüşümleri tanımlamak için daha yüksek düzeyde bir arayüz sağlamak amacıyla kullanılır.

TensorFlow'da çok sayıda RNN API'si varyantı olduğundan yaklaşımımız iki yönlüdür:

  1. Keras LSTM gibi standart TensorFlow RNN API'leri için yerel destek sunar. Bu, önerilen seçenektir.
  2. Kullanıcı tanımlı RNN uygulamalarının LiteRT'ye bağlanıp dönüştürülmesi için dönüşüm altyapısına bir arayüz sağlayın. Bu tür bir dönüşümün, lingvo'nun LSTMCellSimple ve LayerNormalizedLSTMCellSimple RNN arayüzlerini kullanarak yapıldığına dair birkaç hazır örnek sunuyoruz.

Converter API

Bu özellik, TensorFlow 2.3 sürümünde yer almaktadır. Ayrıca tf-nightly pip'i veya head'i kullanarak da kullanılabilir.

Bu dönüştürme işlevi, SavedModel aracılığıyla veya doğrudan Keras modelinden LiteRT'ye dönüştürülürken kullanılabilir. Örnek kullanımları inceleyin.

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 yorumlayıcısıyla uçtan uca kullanımı gösterir.

Desteklenen TensorFlow RNN API'leri

Keras LSTM'nin LiteRT'ye hazır dönüşümünü destekliyoruz. Bu işlemin işleyiş şekliyle ilgili ayrıntılar için lütfen Keras LSTM arayüzü ve dönüştürme mantığına buradan bakın.

Ayrıca, Keras işlem tanımıyla ilgili olarak LiteRT'nin LSTM sözleşmesini vurgulamak da önemlidir:

  1. Giriş tensörünün 0 boyutu, toplu iş boyutudur.
  2. recurrent_weight tensörünün 0. boyutu, çıkış sayısıdır.
  3. weight ve recurrent_kernel tensörleri transpoze edilir.
  4. Transpoze edilmiş ağırlık, transpoze edilmiş recurrent_kernel ve bias tensörleri, 0 boyutu boyunca eşit boyutlu 4 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ı

Time major

Kullanıcılar, zaman öncelikli veya zaman öncelikli olmayan bir seçenek belirleyebilir. Keras LSTM, işlev tanımı özelliklerine zamana göre öncelikli bir özellik ekler. Tek yönlü sıralı LSTM için, tek yönlü sıralı LSTM'nin zamana göre öncelikli özelliğini eşleyebiliriz.

Çift Yönlü LSTM

Çift yönlü LSTM, biri ileri, diğeri geri olmak üzere iki Keras LSTM katmanıyla uygulanabilir. Örnekleri burada bulabilirsiniz. go_backward özelliği görüldüğünde bunu geriye doğru LSTM olarak tanırız ve ileri ile geriye doğru LSTM'yi birlikte gruplandırırız. Bu, gelecekte yapılacak bir çalışmadır. Şu anda bu işlem, LiteRT modelinde iki UnidirectionalSequenceLSTM işlemi oluşturur.

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

LiteRT, 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'si kullanılmaktadır. Ayrıntılar için lütfen lingvo.LSTMCellSimple arayüzüne ve dönüşüm mantığına buradan bakın. Ayrıca, lingvo.LayerNormalizedLSTMCellSimple arayüzündeki Lingvo'nun LSTM tanımlarından birinin ve dönüşüm mantığının örneğini burada bulabilirsiniz.

LiteRT'ye "Kendi TensorFlow RNN'nizi getirin"

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

1. seçenek: RNN arayüzünü Keras RNN arayüzüne uyarlamak için TensorFlow Python'da bağdaştırıcı kodu yazın. Bu, Keras LSTM katmanı tarafından oluşturulanla aynı olan, oluşturulan RNN arayüzünün işlevinde tf_implements ek açıklaması bulunan bir tf.function anlamına gelir. Bundan sonra, Keras LSTM için kullanılan aynı Conversion API çalışır.

2.seçenek: Yukarıdaki işlem mümkün değilse (ör. Keras LSTM, LiteRT'nin birleştirilmiş LSTM op'u tarafından şu anda kullanıma sunulan bazı işlevleri, katman normalleştirme gibi, içermiyorsa) özel dönüştürme kodu yazarak LiteRT dönüştürücüyü genişletin ve burada prepare-composite-functions MLIR geçişine bağlayın. İşlevin arayüzü bir API sözleşmesi gibi ele alınmalı ve birleştirilmiş LiteRT LSTM işlemlerine dönüştürmek için gereken bağımsız değişkenleri (ör. giriş, önyargı, ağırlıklar, projeksiyon, katman normalleştirme vb.) içermelidir. Bu işleve bağımsız değişken olarak iletilen tensörlerin bilinen bir sıralamaya (ör. MLIR'deki RankedTensorType) sahip olması tercih edilir. Bu sayede, bu tensörleri RankedTensorType olarak kabul edebilen bir dönüşüm kodu yazmak çok daha kolay hale gelir ve bu tensörlerin, birleştirilmiş LiteRT 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 bir dönüşüm akışının tam örneği, Lingvo'nun LSTMCellSimple'dan LiteRT'ye dönüşümüdür.

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

  1. LSTMCellSimple'ın tüm kullanımlarını, bu şekilde etiketlenmiş bir tf_implements notuyla (ör. lingvo.LSTMCellSimple burada iyi bir not adı olur) bir tf.function içine alın. Oluşturulan tf.function'ın, dönüştürme kodunda beklenen işlevin arayüzüyle eşleştiğinden emin olun. Bu, açıklamayı ekleyen model yazarı ile dönüştürme kodu arasındaki bir sözleşmedir.
  2. Özel bir bileşik işlemi LiteRT ile birleştirilmiş LSTM işlemi dönüşümüne bağlamak için prepare-composite-functions geçişini genişletin. LSTMCellSimple dönüşüm kodunu inceleyin.

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

  3. Ağırlık ve projeksiyon tensörleri transpoze edilir.

  4. {input, recurrent} ile {cell, input gate, forget gate, output gate} arasındaki ilişki, transpoze edilmiş ağırlık tensörünün dilimlenmesiyle çıkarılır.

  5. {bias} arasındaki {bias}, bias tensörü dilimlenerek çıkarılır.

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

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

  8. LiteRT düz arabellek için tanımlanan tüm MLIR geçişleri ve son dışa aktarma dahil olmak üzere LiteRT dönüşüm altyapısının geri kalanı yeniden kullanılabilir.

Bilinen sorunlar/sınırlamalar

  1. Şu anda yalnızca durum bilgisi olmayan Keras LSTM'yi (Keras'taki varsayılan davranış) dönüştürme desteği vardır. Durumlu Keras LSTM dönüştürme, gelecekteki bir çalışmadır.
  2. Durumlu Keras LSTM katmanını, temel alınan durumsuz Keras LSTM katmanını kullanarak ve durumu kullanıcı programında açıkça yöneterek modellemek hâlâ mümkündür. Bu tür bir TensorFlow programı, burada açıklanan özellik kullanılarak LiteRT'ye dönüştürülebilir.
  3. Çift yönlü LSTM şu anda LiteRT'de iki UnidirectionalSequenceLSTM işlemi olarak modellenmektedir. Bu, tek bir BidirectionalSequenceLSTM işlemiyle değiştirilecek.