TensorFlow RNN রূপান্তর LiteRT

ওভারভিউ

LiteRT TensorFlow RNN মডেলকে LiteRT-এর ফিউজড LSTM অপারেশনে রূপান্তর করতে সমর্থন করে। মিশ্রিত ক্রিয়াকলাপগুলি তাদের অন্তর্নিহিত কার্নেল বাস্তবায়নের কর্মক্ষমতা সর্বাধিক করার জন্য বিদ্যমান, সেইসাথে কোয়ান্টাইজেশনের মতো জটিল রূপান্তরগুলিকে সংজ্ঞায়িত করার জন্য একটি উচ্চ স্তরের ইন্টারফেস প্রদান করে।

যেহেতু টেনসরফ্লোতে RNN API-এর অনেকগুলি রূপ রয়েছে, তাই আমাদের দৃষ্টিভঙ্গি দ্বিগুণ হয়েছে:

  1. কেরাস LSTM-এর মতো স্ট্যান্ডার্ড TensorFlow RNN API-এর জন্য নেটিভ সমর্থন প্রদান করুন। এটি প্রস্তাবিত বিকল্প।
  2. প্লাগ ইন করতে এবং LiteRT তে রূপান্তরিত করার জন্য ব্যবহারকারী-সংজ্ঞায়িত RNN বাস্তবায়নের জন্য রূপান্তর পরিকাঠামোতে একটি ইন্টারফেস প্রদান করুন। আমরা lingvo এর LSTMCellSimple এবং LayerNormalizedLSTMCellSimple RNN ইন্টারফেস ব্যবহার করে এই ধরনের রূপান্তরের কয়েকটি আউট অফ বক্স উদাহরণ প্রদান করি।

কনভার্টার API

বৈশিষ্ট্যটি টেনসরফ্লো 2.3 রিলিজের অংশ। এটি টিএফ-নাইটলি পিপ বা মাথা থেকেও পাওয়া যায়।

একটি SavedModel এর মাধ্যমে বা সরাসরি Keras মডেল থেকে LiteRT এ রূপান্তর করার সময় এই রূপান্তর কার্যকারিতা উপলব্ধ। উদাহরণ ব্যবহার দেখুন.

সংরক্ষিত মডেল থেকে

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

কেরাস মডেল থেকে

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

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

উদাহরণ

কেরাস LSTM থেকে LiteRT Colab পর্যন্ত LiteRT ইন্টারপ্রেটারের মাধ্যমে শেষ থেকে শেষ পর্যন্ত ব্যবহার করা যায়।

TensorFlow RNNs API সমর্থিত

আমরা কেরাস LSTM-কে LiteRT-এ রূপান্তরিত করাকে সমর্থন করি। এটি কিভাবে কাজ করে তার বিস্তারিত জানার জন্য অনুগ্রহ করে কেরাস LSTM ইন্টারফেস দেখুন এবং এখানে রূপান্তর যুক্তিতে।

কেরাস অপারেশন সংজ্ঞার সাথে সাপেক্ষে LiteRT এর LSTM চুক্তি হাইলাইট করাও গুরুত্বপূর্ণ:

  1. ইনপুট টেনসরের মাত্রা 0 হল ব্যাচের আকার।
  2. recurrent_weight tensor এর মাত্রা 0 হল আউটপুট সংখ্যা।
  3. ওজন এবং recurrent_kernel tensors transposed হয়.
  4. ট্রান্সপোজড ওয়েট, ট্রান্সপোজড রিকারেন্ট_কারনেল এবং বায়াস টেনসরগুলি 0 ডাইমেনশন বরাবর 4টি সমান আকারের টেনসরে বিভক্ত। এগুলি ইনপুট গেট, ভুলে গেট, সেল এবং আউটপুট গেটের সাথে মিলে যায়।

Keras LSTM ভেরিয়েন্ট

সময় প্রধান

ব্যবহারকারীরা টাইম-মেজর বা টাইম-মেজর না বেছে নিতে পারেন। Keras LSTM ফাংশন def বৈশিষ্ট্যগুলিতে একটি সময়-প্রধান বৈশিষ্ট্য যোগ করে। ইউনিডাইরেশনাল সিকোয়েন্স LSTM-এর জন্য, আমরা unidirecional_sequence_lstm-এর সময় প্রধান অ্যাট্রিবিউটে ম্যাপ করতে পারি।

দ্বিমুখী LSTM

দ্বিমুখী LSTM দুটি Keras LSTM স্তরের সাথে প্রয়োগ করা যেতে পারে, একটি ফরোয়ার্ডের জন্য এবং একটি পিছনের জন্য, এখানে উদাহরণ দেখুন। একবার আমরা go_backward বৈশিষ্ট্যটি দেখতে পেলে, আমরা এটিকে পশ্চাৎপদ LSTM হিসাবে চিনতে পারি, তারপরে আমরা এগিয়ে এবং পিছনের দিকের LSTM একসাথে করি। এটি ভবিষ্যতের কাজ। বর্তমানে, এটি LiteRT মডেলে দুটি UnidirectionalSequenceLSTM অপারেশন তৈরি করে।

ব্যবহারকারী-সংজ্ঞায়িত LSTM রূপান্তর উদাহরণ

LiteRT ব্যবহারকারীর সংজ্ঞায়িত LSTM বাস্তবায়ন রূপান্তর করার একটি উপায় প্রদান করে। এখানে আমরা Lingvo এর LSTM ব্যবহার করি কিভাবে এটি বাস্তবায়ন করা যায় তার উদাহরণ হিসেবে। বিস্তারিত জানার জন্য অনুগ্রহ করে এখানে lingvo.LSTMCellSimple ইন্টারফেস এবং রূপান্তর যুক্তি দেখুন। এছাড়াও আমরা এখানে lingvo.LayerNormalizedLSTMCellSimple ইন্টারফেস এবং এর রূপান্তর যুক্তিতে Lingvo-এর LSTM সংজ্ঞাগুলির একটি উদাহরণ প্রদান করি।

LiteRT-এ “আপনার নিজস্ব TensorFlow RNN নিয়ে আসুন”

যদি একজন ব্যবহারকারীর RNN ইন্টারফেস স্ট্যান্ডার্ড সমর্থিত ইন্টারফেস থেকে আলাদা হয়, তবে কয়েকটি বিকল্প রয়েছে:

বিকল্প 1: কেরাস আরএনএন ইন্টারফেসে RNN ইন্টারফেসকে মানিয়ে নিতে TensorFlow পাইথনে অ্যাডাপ্টার কোড লিখুন। এর মানে জেনারেট করা RNN ইন্টারফেসের ফাংশনে tf_implements টীকা সহ একটি tf.function যা কেরাস LSTM স্তর দ্বারা উত্পন্ন একের সাথে অভিন্ন। এর পরে, Keras LSTM এর জন্য ব্যবহৃত একই রূপান্তর API কাজ করবে।

বিকল্প 2: যদি উপরেরটি সম্ভব না হয় (যেমন কেরাস LSTM-এর কিছু কার্যকারিতা অনুপস্থিত থাকে যা বর্তমানে LiteRT-এর ফিউজড LSTM op যেমন লেয়ার নরমালাইজেশন দ্বারা উন্মোচিত হয়েছে), তাহলে কাস্টম রূপান্তর কোড লিখে LiteRT রূপান্তরকারীকে প্রসারিত করুন এবং এটিকে প্রস্তুত-কম্পোজিট-এ প্লাগ করুন। এখানে MLIR-পাস ফাংশন। ফাংশনের ইন্টারফেসটিকে একটি API চুক্তির মতো বিবেচনা করা উচিত এবং এতে ফিউজড LiteRT LSTM অপারেশনে রূপান্তর করার জন্য প্রয়োজনীয় আর্গুমেন্ট থাকা উচিত - যেমন ইনপুট, পক্ষপাত, ওজন, প্রক্ষেপণ, স্তর স্বাভাবিককরণ ইত্যাদি। পরিচিত র‍্যাঙ্ক থাকতে (অর্থাৎ MLIR-এ RankedTensorType)। এটি রূপান্তর কোড লেখার কাজটিকে আরও সহজ করে তোলে যা এই টেনসরগুলিকে RankedTensorType হিসাবে ধরে নিতে পারে এবং তাদের ফিউজড LiteRT অপারেটরের অপারেন্ডের সাথে সম্পর্কিত র‌্যাঙ্কড টেনসরগুলিতে রূপান্তর করতে সহায়তা করে।

এই ধরনের রূপান্তর প্রবাহের একটি সম্পূর্ণ উদাহরণ হল Lingvo-এর LSTMCellSimple থেকে LiteRT রূপান্তর।

লিংভোতে LSTMCellSimple এখানে সংজ্ঞায়িত করা হয়েছে। এই LSTM সেলের সাথে প্রশিক্ষিত মডেলগুলিকে নিম্নরূপ LiteRT তে রূপান্তর করা যেতে পারে:

  1. LSTMCellSimple-এর সমস্ত ব্যবহারকে একটি tf.function-এ একটি tf_implements টীকা দিয়ে লেবেল করুন (যেমন lingvo.LSTMCellSimple এখানে একটি ভাল টীকা নাম হবে)। নিশ্চিত করুন যে tf.function তৈরি হয়েছে সেটি রূপান্তর কোডে প্রত্যাশিত ফাংশনের ইন্টারফেসের সাথে মেলে। এটি মডেল লেখকের মধ্যে একটি চুক্তি যা টীকা এবং রূপান্তর কোড যোগ করে।
  2. LiteRT ফিউজড LSTM অপ কনভার্সনে একটি কাস্টম কম্পোজিট অপ প্লাগ ইন করতে প্রস্তুতি-কম্পোজিট-ফাংশন পাস প্রসারিত করুন। LSTMCell সরল রূপান্তর কোড দেখুন।

    রূপান্তর চুক্তি:

  3. ওজন এবং অভিক্ষেপ টেনসর স্থানান্তরিত হয়।

  4. ট্রান্সপোজড ওয়েট টেনসর স্লাইস করে {ইনপুট, রিকারেন্ট} থেকে {সেল, ইনপুট গেট, ভুলে গেট, আউটপুট গেট} বের করা হয়।

  5. {বায়াস} থেকে {সেল, ইনপুট গেট, ভুলে গেট, আউটপুট গেট} বায়াস টেনসরকে স্লাইস করে বের করা হয়।

  6. ট্রান্সপোজড প্রজেকশন টেনসর স্লাইস করে প্রজেকশন বের করা হয়।

  7. অনুরূপ রূপান্তর LayerNormalizedLSTMCellSimple- এর জন্য লেখা হয়েছে।

  8. বাকি LiteRT রূপান্তর পরিকাঠামো, সমস্ত MLIR পাস সংজ্ঞায়িত সেইসাথে LiteRT ফ্ল্যাটবাফারে চূড়ান্ত রপ্তানি পুনঃব্যবহার করা যেতে পারে।

পরিচিত সমস্যা/সীমাবদ্ধতা

  1. বর্তমানে শুধুমাত্র স্টেটলেস কেরাস এলএসটিএম (কেরাসে ডিফল্ট আচরণ) রূপান্তরের জন্য সমর্থন রয়েছে। স্টেটফুল কেরাস এলএসটিএম রূপান্তর ভবিষ্যতের কাজ।
  2. অন্তর্নিহিত স্টেটলেস কেরাস LSTM লেয়ার ব্যবহার করে একটি স্টেটফুল কেরাস LSTM লেয়ার মডেল করা এবং ইউজার প্রোগ্রামে স্টেটকে স্পষ্টভাবে পরিচালনা করা এখনও সম্ভব। এই ধরনের একটি TensorFlow প্রোগ্রাম এখনও এখানে বর্ণিত বৈশিষ্ট্য ব্যবহার করে LiteRT তে রূপান্তর করা যেতে পারে।
  3. দ্বিমুখী LSTM বর্তমানে LiteRT-তে দুটি UnidirectionalSequenceLSTM অপারেশন হিসাবে মডেল করা হয়েছে। এটি একটি একক BidirectionalSequenceLSTM op দিয়ে প্রতিস্থাপিত হবে।