সংক্ষিপ্ত বিবরণ
LiterRT TensorFlow RNN মডেলগুলিকে LiterRT-এর ফিউজড LSTM অপারেশনে রূপান্তর করতে সহায়তা করে। ফিউজড অপারেশনগুলি তাদের অন্তর্নিহিত কার্নেল বাস্তবায়নের কর্মক্ষমতা সর্বাধিক করার জন্য বিদ্যমান, পাশাপাশি কোয়ান্টিজেশনের মতো জটিল রূপান্তরগুলি সংজ্ঞায়িত করার জন্য একটি উচ্চ স্তরের ইন্টারফেস প্রদান করে।
যেহেতু TensorFlow-তে RNN API-এর অনেকগুলি রূপ রয়েছে, তাই আমাদের পদ্ধতি দুটি ধরণের:
- Keras LSTM এর মতো স্ট্যান্ডার্ড TensorFlow RNN API-এর জন্য নেটিভ সাপোর্ট প্রদান করুন। এটি প্রস্তাবিত বিকল্প।
- ব্যবহারকারী-সংজ্ঞায়িত RNN বাস্তবায়নগুলিকে প্লাগ ইন করতে এবং LiterRT-তে রূপান্তরিত করতে রূপান্তর পরিকাঠামোতে একটি ইন্টারফেস প্রদান করুন। আমরা lingvo-এর LSTMCellSimple এবং LayerNormalizedLSTMCellSimple RNN ইন্টারফেস ব্যবহার করে এই ধরনের রূপান্তরের কয়েকটি আউট অফ বক্স উদাহরণ প্রদান করি।
কনভার্টার এপিআই
এই বৈশিষ্ট্যটি TensorFlow 2.3 রিলিজের অংশ। এটি tf-nightly pip অথবা head থেকেও পাওয়া যায়।
SavedModel এর মাধ্যমে অথবা সরাসরি Keras মডেল থেকে LiterRT তে রূপান্তর করার সময় এই রূপান্তর কার্যকারিতা উপলব্ধ। উদাহরণ ব্যবহার দেখুন।
সংরক্ষিত মডেল থেকে
# 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()
উদাহরণ
Keras LSTM থেকে LiterRT Colab LiterRT ইন্টারপ্রেটারের সাহায্যে শেষ থেকে শেষ ব্যবহার ব্যাখ্যা করে।
TensorFlow RNNs API সমর্থিত
কেরাস এলএসটিএম রূপান্তর (প্রস্তাবিত)
আমরা Keras LSTM-কে LiterRT-তে রূপান্তর করার জন্য সমর্থন করি। এটি কীভাবে কাজ করে তার বিস্তারিত জানার জন্য দয়া করে Keras LSTM ইন্টারফেসটি দেখুন। এবং এখানে রূপান্তর যুক্তি সম্পর্কে।
কেরাস অপারেশন সংজ্ঞার সাথে সম্পর্কিত LiterRT এর LSTM চুক্তিটি তুলে ধরাও গুরুত্বপূর্ণ:
- ইনপুট টেনসরের মাত্রা 0 হল ব্যাচের আকার।
- পুনরাবৃত্ত_ওজন টেনসরের মাত্রা 0 হল আউটপুটের সংখ্যা।
- ওজন এবং পুনরাবৃত্ত_কার্নেল টেনসরগুলি স্থানান্তরিত হয়।
- ট্রান্সপোজড ওয়েট, ট্রান্সপোজড রিকারেন্ট_কার্নেল এবং বায়াস টেনসরগুলিকে 0 মাত্রা বরাবর 4টি সমান আকারের টেনসরে বিভক্ত করা হয়েছে। এগুলি ইনপুট গেট, ফরগেট গেট, সেল এবং আউটপুট গেটের সাথে মিলে যায়।
কেরাস এলএসটিএম ভেরিয়েন্ট
সময় প্রধান
ব্যবহারকারীরা টাইম-মেজর বা টাইম-মেজর না বেছে নিতে পারেন। Keras LSTM ফাংশন def অ্যাট্রিবিউটে একটি টাইম-মেজর অ্যাট্রিবিউট যোগ করে। Unidirectional sequence LSTM এর জন্য, আমরা কেবল unidirecional_sequence_lstm এর টাইম মেজর অ্যাট্রিবিউটে ম্যাপ করতে পারি।
দ্বিমুখী LSTM
দ্বিমুখী LSTM দুটি Keras LSTM স্তর দিয়ে বাস্তবায়িত করা যেতে পারে, একটি ফরোয়ার্ডের জন্য এবং একটি ব্যাকওয়ার্ডের জন্য, এখানে উদাহরণ দেখুন। একবার আমরা go_backward বৈশিষ্ট্যটি দেখতে পেলে, আমরা এটিকে ব্যাকওয়ার্ড LSTM হিসাবে চিনতে পারি, তারপর আমরা ফরোয়ার্ড এবং ব্যাকওয়ার্ড LSTM একসাথে গ্রুপ করি। এটি ভবিষ্যতের কাজ। বর্তমানে, এটি LiterRT মডেলে দুটি UnidirectionalSequenceLSTM অপারেশন তৈরি করে।
ব্যবহারকারী-সংজ্ঞায়িত LSTM রূপান্তর উদাহরণ
LiterRT ব্যবহারকারী-নির্ধারিত LSTM বাস্তবায়ন রূপান্তর করার একটি উপায়ও প্রদান করে। এখানে আমরা Lingvo-এর LSTM ব্যবহার করি, এটি কীভাবে বাস্তবায়ন করা যায় তার উদাহরণ হিসেবে। বিস্তারিত জানার জন্য অনুগ্রহ করে lingvo.LSTMCellSimple ইন্টারফেস এবং রূপান্তর যুক্তি দেখুন । আমরা lingvo.LayerNormalizedLSTMCellSimple ইন্টারফেসে Lingvo-এর আরেকটি LSTM সংজ্ঞা এবং এর রূপান্তর যুক্তির জন্য একটি উদাহরণও প্রদান করি ।
LiterRT-তে "আপনার নিজস্ব TensorFlow RNN আনুন"
যদি কোনও ব্যবহারকারীর RNN ইন্টারফেস স্ট্যান্ডার্ড সমর্থিত ইন্টারফেস থেকে আলাদা হয়, তাহলে কয়েকটি বিকল্প রয়েছে:
বিকল্প ১: Keras RNN ইন্টারফেসের সাথে RNN ইন্টারফেসকে অভিযোজিত করার জন্য TensorFlow python-এ অ্যাডাপ্টার কোড লিখুন। এর অর্থ হল জেনারেটেড RNN ইন্টারফেসের ফাংশনে tf_implements অ্যানোটেশন সহ একটি tf.function যা Keras LSTM লেয়ার দ্বারা জেনারেট করা ফাংশনের অনুরূপ। এর পরে, Keras LSTM-এর জন্য ব্যবহৃত একই রূপান্তর API কাজ করবে।
বিকল্প ২: যদি উপরেরটি সম্ভব না হয় (যেমন Keras LSTM-এ কিছু কার্যকারিতা অনুপস্থিত থাকে যা বর্তমানে LiterRT-এর ফিউজড LSTM অপের মতো লেয়ার নরমালাইজেশন দ্বারা প্রকাশিত হচ্ছে), তাহলে কাস্টম রূপান্তর কোড লিখে LiterRT কনভার্টারটি প্রসারিত করুন এবং এটিকে এখানে prepare-composite-functions MLIR-pass-এ প্লাগ করুন। ফাংশনের ইন্টারফেসটিকে একটি API চুক্তির মতো বিবেচনা করা উচিত এবং এতে ফিউজড LiterT LSTM অপারেশনে রূপান্তর করার জন্য প্রয়োজনীয় আর্গুমেন্ট থাকা উচিত - যেমন ইনপুট, বায়াস, ওজন, প্রক্ষেপণ, লেয়ার নরমালাইজেশন ইত্যাদি। এই ফাংশনে আর্গুমেন্ট হিসাবে পাস করা টেনসরগুলির জন্য পরিচিত র্যাঙ্ক থাকা বাঞ্ছনীয় (অর্থাৎ MLIR-এ RankedTensorType)। এটি রূপান্তর কোড লেখা অনেক সহজ করে তোলে যা এই টেনসরগুলিকে RankedTensorType হিসাবে ধরে নিতে পারে এবং ফিউজড LiterRT অপারেটরের অপারেন্ডগুলির সাথে সম্পর্কিত র্যাঙ্কড টেনসরগুলিতে রূপান্তর করতে সহায়তা করে।
এই ধরনের রূপান্তর প্রবাহের একটি সম্পূর্ণ উদাহরণ হল Lingvo-এর LSTMCellSimple to LiterRT রূপান্তর।
Lingvo-তে LSTMCellSimple এখানে সংজ্ঞায়িত করা হয়েছে। এই LSTM সেল দিয়ে প্রশিক্ষিত মডেলগুলিকে নিম্নরূপ LiterRT-তে রূপান্তর করা যেতে পারে:
- LSTMCellSimple এর সকল ব্যবহার একটি tf.function-এ একটি tf_implements অ্যানোটেশন দিয়ে মুড়ে দিন যা এইভাবে লেবেল করা আছে (যেমন lingvo.LSTMCellSimple এখানে একটি ভালো অ্যানোটেশন নাম হবে)। নিশ্চিত করুন যে তৈরি হওয়া tf.function রূপান্তর কোডে প্রত্যাশিত ফাংশনের ইন্টারফেসের সাথে মেলে। এটি মডেল লেখকের মধ্যে একটি চুক্তি যা অ্যানোটেশন এবং রূপান্তর কোড যোগ করে।
একটি কাস্টম কম্পোজিট অপ প্লাগ ইন করার জন্য prepare-composite-functions পাসটি LiterRT ফিউজড LSTM অপ রূপান্তরে প্রসারিত করুন। LSTMCellSimple রূপান্তর কোড দেখুন।
রূপান্তর চুক্তি:
ওজন এবং প্রক্ষেপণ টেনসরগুলিকে স্থানান্তরিত করা হয়।
ট্রান্সপোজড ওয়েট টেনসর কেটে {সেল, ইনপুট গেট, ফরগেট গেট, আউটপুট গেট} থেকে {ইনপুট, রিকারেন্ট} বের করা হয়।
{সেল, ইনপুট গেট, ফরগেট গেট, আউটপুট গেট} এর {বায়াস} বায়াস টেনসর কেটে বের করা হয়।
ট্রান্সপোজড প্রজেকশন টেনসর কেটে প্রজেকশনটি বের করা হয়।
LayerNormalizedLSTMCellSimple এর জন্যও একই রকম রূপান্তর লেখা হয়েছে।
LiterRT রূপান্তর পরিকাঠামোর বাকি অংশ, যার মধ্যে সমস্ত MLIR পাস সংজ্ঞায়িত করা হয়েছে এবং LiterRT flatbuffer-এ চূড়ান্ত রপ্তানিও পুনঃব্যবহার করা যেতে পারে।
জ্ঞাত সমস্যা/সীমাবদ্ধতা
- বর্তমানে শুধুমাত্র স্টেটলেস কেরাস LSTM রূপান্তরের জন্য সমর্থন রয়েছে (কেরাসে ডিফল্ট আচরণ)। স্টেটফুল কেরাস LSTM রূপান্তর ভবিষ্যতের কাজ।
- ব্যবহারকারী প্রোগ্রামে স্পষ্টভাবে স্টেট পরিচালনা করে এবং অন্তর্নিহিত স্টেটলেস কেরাস এলএসটিএম স্তর ব্যবহার করে একটি স্টেটফুল কেরাস এলএসটিএম স্তর মডেল করা এখনও সম্ভব। এখানে বর্ণিত বৈশিষ্ট্যটি ব্যবহার করে এই ধরণের টেনসরফ্লো প্রোগ্রাম এখনও LiterRT তে রূপান্তর করা যেতে পারে।
- LiterRT-তে বর্তমানে দ্বিমুখী LSTM-কে দুটি UnidirectionalSequenceLSTM অপারেশন হিসেবে মডেল করা হয়েছে। এটি একটি একক দ্বিমুখী SequenceLSTM অপারেশন দিয়ে প্রতিস্থাপিত হবে।