TensorFlow.js: একটি Python SavedModel কে TensorFlow.js ফরম্যাটে রূপান্তর করুন

১. ভূমিকা

তাহলে আপনি TensorFlow.js দিয়ে আপনার প্রথম পদক্ষেপ নিয়েছেন, আমাদের আগে থেকে তৈরি মডেলগুলো ব্যবহার করে দেখেছেন, অথবা হয়তো নিজের মডেলও তৈরি করেছেন – কিন্তু আপনি Python-এ কিছু অত্যাধুনিক গবেষণা প্রকাশিত হতে দেখেছেন এবং আপনি কৌতূহলী যে এটি ওয়েব ব্রাউজারে চলবে কিনা, যাতে আপনার সেই চমৎকার ধারণাটিকে একটি পরিমাপযোগ্য উপায়ে লক্ষ লক্ষ মানুষের কাছে বাস্তবে পরিণত করা যায়। ব্যাপারটা পরিচিত লাগছে? যদি তাই হয়, তাহলে এই কোডল্যাবটি আপনার জন্যই!

TensorFlow.js টিম একটি সুবিধাজনক টুল তৈরি করেছে, যার মাধ্যমে কমান্ড লাইন কনভার্টার ব্যবহার করে SavedModel ফরম্যাটে থাকা মডেলগুলোকে TensorFlow.js-এ রূপান্তর করা যায়। ফলে, আপনি ওয়েবের ব্যাপকতা ও পরিধির সাথে এই ধরনের মডেলগুলো ব্যবহার করার সুবিধা উপভোগ করতে পারবেন।

আপনি যা শিখবেন

এই কোড ল্যাবে আপনি শিখবেন কিভাবে TensorFlow.js কমান্ড লাইন কনভার্টার ব্যবহার করে পাইথন দ্বারা তৈরি একটি SavedModel-কে ওয়েব ব্রাউজারে ক্লায়েন্ট সাইডে এক্সিকিউশনের জন্য প্রয়োজনীয় model.json ফরম্যাটে পোর্ট করতে হয়।

বিশেষত:

  • কিভাবে একটি সহজ পাইথন এমএল মডেল তৈরি করে TensorFlow.js কনভার্টারের জন্য প্রয়োজনীয় ফরম্যাটে সংরক্ষণ করা যায়।
  • পাইথন থেকে এক্সপোর্ট করা SavedModel-এ TensorFlow.js কনভার্টারটি কীভাবে ইনস্টল এবং ব্যবহার করবেন।
  • রূপান্তর থেকে প্রাপ্ত ফাইলগুলো নিন এবং আপনার JS ওয়েব অ্যাপ্লিকেশনে ব্যবহার করুন।
  • কোনো সমস্যা হলে কী করতে হবে (সব মডেল রূপান্তর করা যাবে না) এবং আপনার কাছে কী কী বিকল্প আছে, তা বুঝে নিন।

ভাবুন তো, আপনি সদ্য প্রকাশিত কোনো গবেষণার মডেল বিশ্বজুড়ে লক্ষ লক্ষ JS ডেভেলপারের কাছে সহজলভ্য করে দিতে পারছেন। অথবা হয়তো আপনি নিজেই আপনার কোনো সৃষ্টিতে এটি ব্যবহার করবেন, যা ওয়েব ব্রাউজারে চালালে বিশ্বের যে কেউ এর অভিজ্ঞতা লাভ করতে পারবে, কারণ এর জন্য কোনো জটিল ডিপেন্ডেন্সি বা এনভায়রনমেন্ট সেটআপের প্রয়োজন নেই। হ্যাকিং শুরু করতে প্রস্তুত? চলুন শুরু করা যাক!

আপনি যা রূপান্তর করেন তা আমাদের সাথে শেয়ার করুন!

আজ আমরা যা শিখলাম তা ব্যবহার করে আপনি পাইথন থেকে আপনার পছন্দের কিছু মডেল রূপান্তর করার চেষ্টা করতে পারেন। যদি আপনি সফলভাবে তা করতে পারেন এবং মডেলটির কার্যকারিতার একটি কার্যকরী ডেমো ওয়েবসাইট তৈরি করতে পারেন, তবে আপনার প্রকল্পটি আমাদের টেনসরফ্লো ব্লগে বা ভবিষ্যতের শো অ্যান্ড টেল ইভেন্টগুলিতে প্রদর্শিত হওয়ার সুযোগ পেতে #MadeWithTFJS হ্যাশট্যাগ ব্যবহার করে সোশ্যাল মিডিয়ায় আমাদের ট্যাগ করুন। আমরা চাই আরও চমৎকার গবেষণা ওয়েবে স্থানান্তরিত হোক এবং এই দুর্দান্ত উদাহরণটির মতোই আরও বেশি সংখ্যক মানুষ এই ধরনের মডেলগুলিকে উদ্ভাবনী বা সৃজনশীল উপায়ে ব্যবহার করতে সক্ষম হোক।

২. TensorFlow.js বলতে কী বোঝায়?

1aee0ede85885520.png

TensorFlow.js হলো একটি ওপেন সোর্স মেশিন লার্নিং লাইব্রেরি যা জাভাস্ক্রিপ্ট যেখানে চলে, সেখানেই চালানো যায়। এটি পাইথনে লেখা মূল TensorFlow লাইব্রেরির উপর ভিত্তি করে তৈরি এবং এর লক্ষ্য হলো জাভাস্ক্রিপ্ট ইকোসিস্টেমের জন্য সেই ডেভেলপার অভিজ্ঞতা ও এপিআই-এর সেটটি পুনরায় তৈরি করা।

এটি কোথায় ব্যবহার করা যেতে পারে?

জাভাস্ক্রিপ্টের বহনযোগ্যতার কারণে, আপনি এখন একটিমাত্র ভাষায় কোড লিখে নিম্নলিখিত সমস্ত প্ল্যাটফর্মে সহজেই মেশিন লার্নিং করতে পারবেন:

  • ওয়েব ব্রাউজারে ক্লায়েন্ট সাইডে ভ্যানিলা জাভাস্ক্রিপ্ট ব্যবহার করে
  • সার্ভার সাইডে এবং এমনকি রাস্পবেরি পাই-এর মতো IoT ডিভাইসেও Node.js ব্যবহার করা হয়।
  • ইলেকট্রন ব্যবহার করে ডেস্কটপ অ্যাপ
  • React Native ব্যবহার করে নেটিভ মোবাইল অ্যাপ

সামঞ্জস্যতা নিশ্চিত করতে এবং সবকিছু দ্রুত চালু রাখতে, TensorFlow.js এই প্রতিটি পরিবেশের (যেমন সিপিইউ বা ওয়েবজিএল-এর মতো প্রকৃত হার্ডওয়্যার-ভিত্তিক পরিবেশ, যেখানে এটি চলতে পারে। এই প্রসঙ্গে "ব্যাকএন্ড" বলতে সার্ভার-সাইড পরিবেশ বোঝায় না - এক্সিকিউশনের জন্য ব্যাকএন্ডটি ক্লায়েন্ট-সাইডে ওয়েবজিএল-এও হতে পারে) মধ্যে একাধিক ব্যাকএন্ড সমর্থন করে। বর্তমানে TensorFlow.js যা সমর্থন করে:

  • ডিভাইসের গ্রাফিক্স কার্ডে (GPU) WebGL এক্সিকিউশন – GPU অ্যাক্সিলারেশনের মাধ্যমে বড় মডেল (আকারে ৩ মেগাবাইটের বেশি) চালানোর এটিই দ্রুততম উপায়।
  • সিপিইউ-তে ওয়েব অ্যাসেম্বলি (WASM) এক্সিকিউশন – উদাহরণস্বরূপ, পুরোনো প্রজন্মের মোবাইল ফোন সহ বিভিন্ন ডিভাইসে সিপিইউ-এর পারফরম্যান্স উন্নত করার জন্য। এটি ছোট মডেলগুলির (আকারে ৩ মেগাবাইটের কম) জন্য বেশি উপযোগী, যেগুলো গ্রাফিক্স প্রসেসরে কন্টেন্ট আপলোড করার ওভারহেডের কারণে WebGL-এর চেয়ে WASM ব্যবহার করে সিপিইউ-তে প্রকৃতপক্ষে আরও দ্রুত এক্সিকিউট হতে পারে।
  • সিপিইউ এক্সিকিউশন - অন্য কোনো এনভায়রনমেন্ট উপলব্ধ না থাকলে এটিই বিকল্প ব্যবস্থা। এই তিনটির মধ্যে এটি সবচেয়ে ধীরগতির, কিন্তু এটি আপনার জন্য সর্বদা প্রস্তুত থাকে।

দ্রষ্টব্য: আপনি কোন ডিভাইসে এটি চালাবেন তা জানা থাকলে, এই ব্যাকএন্ডগুলির মধ্যে একটিকে বাধ্যতামূলকভাবে ব্যবহার করার বিকল্প বেছে নিতে পারেন, অথবা এটি নির্দিষ্ট না করলে TensorFlow.js-কেই আপনার জন্য সিদ্ধান্ত নিতে দিতে পারেন।

ক্লায়েন্ট সাইডের সুপার পাওয়ার

ক্লায়েন্ট মেশিনের ওয়েব ব্রাউজারে TensorFlow.js চালানোর ফলে বেশ কিছু সুবিধা পাওয়া যেতে পারে, যা বিবেচনা করার মতো।

গোপনীয়তা

আপনি কোনো তৃতীয় পক্ষের ওয়েব সার্ভারে ডেটা না পাঠিয়েই ক্লায়েন্ট মেশিনে ডেটা প্রশিক্ষণ এবং শ্রেণীবদ্ধকরণ উভয়ই করতে পারেন। এমন কিছু পরিস্থিতি আসতে পারে যেখানে স্থানীয় আইন, যেমন উদাহরণস্বরূপ GDPR, মেনে চলার জন্য এটি একটি আবশ্যিক শর্ত হতে পারে, অথবা যখন ব্যবহারকারী এমন কোনো ডেটা প্রসেস করতে চান যা তিনি নিজের মেশিনে রাখতে চান এবং কোনো তৃতীয় পক্ষের কাছে পাঠাতে চান না।

গতি

যেহেতু আপনাকে কোনো রিমোট সার্ভারে ডেটা পাঠাতে হচ্ছে না, তাই ইনফারেন্স (ডেটা শ্রেণীবদ্ধ করার প্রক্রিয়া) আরও দ্রুত হতে পারে। আরও ভালো ব্যাপার হলো, ব্যবহারকারী অনুমতি দিলে আপনি ডিভাইসটির ক্যামেরা, মাইক্রোফোন, জিপিএস, অ্যাক্সেলেরোমিটার এবং আরও অনেক সেন্সরে সরাসরি অ্যাক্সেস পাবেন।

প্রসার এবং পরিধি

বিশ্বের যে কেউ এক ক্লিকেই আপনার পাঠানো লিঙ্কে ক্লিক করে, তাদের ব্রাউজারে ওয়েব পেজটি খুলতে এবং আপনার তৈরি করা জিনিসটি ব্যবহার করতে পারে। মেশিন লার্নিং সিস্টেমটি ব্যবহার করার জন্য CUDA ড্রাইভার এবং আরও অনেক কিছু সহ একটি জটিল সার্ভার-সাইড লিনাক্স সেটআপের কোনো প্রয়োজন নেই।

খরচ

সার্ভার না থাকার অর্থ হলো, আপনাকে শুধুমাত্র আপনার HTML, CSS, JS, এবং মডেল ফাইলগুলো হোস্ট করার জন্য একটি CDN-এর খরচ করতে হবে। একটি সার্ভারকে (সম্ভবত একটি গ্রাফিক্স কার্ডসহ) ২৪/৭ চালু রাখার চেয়ে একটি CDN-এর খরচ অনেক কম।

সার্ভার সাইডের বৈশিষ্ট্য

TensorFlow.js-এর Node.js সংস্করণ ব্যবহার করলে নিম্নলিখিত বৈশিষ্ট্যগুলো সক্ষম হয়।

সম্পূর্ণ CUDA সমর্থন

সার্ভার সাইডে, গ্রাফিক্স কার্ড অ্যাক্সিলারেশনের জন্য, আপনাকে অবশ্যই NVIDIA CUDA ড্রাইভার ইনস্টল করতে হবে যাতে TensorFlow গ্রাফিক্স কার্ডের সাথে কাজ করতে পারে (ব্রাউজারের মতো নয়, যেখানে WebGL ব্যবহৃত হয় - কোনো ইনস্টলের প্রয়োজন নেই)। তবে, সম্পূর্ণ CUDA সাপোর্টের মাধ্যমে আপনি গ্রাফিক্স কার্ডের নিম্ন-স্তরের ক্ষমতাগুলোকে পুরোপুরি কাজে লাগাতে পারবেন, যার ফলে ট্রেনিং এবং ইনফারেন্সের সময় দ্রুততর হয়। এর পারফরম্যান্স পাইথন TensorFlow ইমপ্লিমেন্টেশনের সমতুল্য, কারণ উভয়েরই একই C++ ব্যাকএন্ড রয়েছে।

মডেলের আকার

গবেষণার অত্যাধুনিক মডেলগুলোর জন্য, আপনাকে খুব বড় মডেল নিয়ে কাজ করতে হতে পারে, যা আকারে গিগাবাইট পর্যন্ত হতে পারে। প্রতি ব্রাউজার ট্যাবে মেমরি ব্যবহারের সীমাবদ্ধতার কারণে এই মডেলগুলো বর্তমানে ওয়েব ব্রাউজারে চালানো যায় না। এই ধরনের বড় মডেলগুলো দক্ষতার সাথে চালানোর জন্য প্রয়োজনীয় হার্ডওয়্যার স্পেসিফিকেশনসহ আপনার নিজের সার্ভারে Node.js ব্যবহার করতে পারেন।

আইওটি

রাস্পবেরি পাই-এর মতো জনপ্রিয় সিঙ্গেল বোর্ড কম্পিউটারে নোড.জেএস সমর্থিত, যার ফলে আপনি এই ধরনের ডিভাইসেও টেনসরফ্লো.জেএস মডেল চালাতে পারবেন।

গতি

নোড.জেএস জাভাস্ক্রিপ্টে লেখা, যার ফলে এটি জাস্ট-ইন-টাইম কম্পাইলেশনের সুবিধা পায়। এর মানে হলো, নোড.জেএস ব্যবহার করার সময় আপনি প্রায়শই পারফরম্যান্সে উন্নতি দেখতে পাবেন, কারণ এটি রানটাইমে অপ্টিমাইজ করা হয়, বিশেষ করে আপনার করা যেকোনো প্রিপ্রসেসিংয়ের জন্য। এর একটি চমৎকার উদাহরণ এই কেস স্টাডিতে দেখা যায়, যেখানে দেখানো হয়েছে কীভাবে হাগিং ফেস তাদের ন্যাচারাল ল্যাঙ্গুয়েজ প্রসেসিং মডেলের পারফরম্যান্স দ্বিগুণ বাড়াতে নোড.জেএস ব্যবহার করেছে।

এখন যেহেতু আপনি TensorFlow.js-এর মূল বিষয়গুলো, এটি কোথায় চালানো যায় এবং এর কিছু সুবিধা সম্পর্কে জেনেছেন, চলুন এটি দিয়ে দরকারি কিছু কাজ করা শুরু করা যাক!

৩. আপনার সিস্টেম সেট আপ করা

এই টিউটোরিয়ালের জন্য আমরা উবুন্টু ব্যবহার করব – এটি একটি জনপ্রিয় লিনাক্স ডিস্ট্রিবিউশন যা অনেকেই ব্যবহার করেন এবং আপনি যদি ক্লাউড-ভিত্তিক ভার্চুয়াল মেশিনে এটি অনুসরণ করতে চান, তবে এটি গুগল ক্লাউড কম্পিউট ইঞ্জিনে একটি বেস ইমেজ হিসেবেও উপলব্ধ।

এই লেখাটি লেখার সময় , একটি নতুন ভ্যানিলা কম্পিউট ইঞ্জিন ইনস্ট্যান্স তৈরি করার জন্য আমরা উবুন্টু 18.04.4 LTS-এর ইমেজটি বেছে নিতে পারি, এবং আমরা এটিই ব্যবহার করব। আপনি অবশ্যই আপনার নিজের মেশিন, বা চাইলে অন্য কোনো অপারেটিং সিস্টেমও ব্যবহার করতে পারেন, কিন্তু সিস্টেমভেদে ইনস্টলেশনের নির্দেশাবলী এবং নির্ভরতা ভিন্ন হতে পারে।

TensorFlow (পাইথন সংস্করণ) ইনস্টল করা

এখন, যেহেতু আপনি সম্ভবত আপনার খুঁজে পাওয়া বা তৈরি করতে যাওয়া কোনো বিদ্যমান পাইথন-ভিত্তিক মডেল রূপান্তর করার চেষ্টা করছেন, তাই পাইথন থেকে একটি "SavedModel" ফাইল এক্সপোর্ট করার আগে, যদি "SavedModel" ফাইলটি আগে থেকেই ডাউনলোডের জন্য উপলব্ধ না থাকে, তাহলে আপনার ইনস্ট্যান্সে TensorFlow-এর পাইথন সংস্করণটি সেটআপ করা থাকতে হবে।

উপরে তৈরি করা আপনার ক্লাউড মেশিনে SSH-এর মাধ্যমে লগইন করুন এবং তারপর টার্মিনাল উইন্ডোতে নিম্নলিখিতটি টাইপ করুন:

টার্মিনাল উইন্ডো:

sudo apt update
sudo apt-get install python3

এর মাধ্যমে নিশ্চিত করতে হবে যে আপনার মেশিনে পাইথন ৩ ইনস্টল করা আছে। টেনসরফ্লো ব্যবহার করার জন্য পাইথন ৩.৪ বা তার উচ্চতর সংস্করণ ইনস্টল করা আবশ্যক।

সঠিক সংস্করণ ইনস্টল করা হয়েছে কিনা তা যাচাই করতে, নিম্নলিখিতটি টাইপ করুন:

টার্মিনাল উইন্ডো:

python3 --version

আপনি Python 3.6.9 এর মতো ভার্সন নম্বর নির্দেশকারী একটি আউটপুট দেখতে পাবেন। যদি এটি সঠিকভাবে প্রিন্ট হয় এবং এর মান ৩.৪-এর বেশি হয়, তাহলে আমরা পরবর্তী ধাপে যেতে প্রস্তুত।

এরপরে আমরা পাইথন ৩-এর জন্য PIP (যা পাইথনের প্যাকেজ ম্যানেজার) ইনস্টল করব এবং তারপর এটি আপডেট করব। টাইপ করুন:

টার্মিনাল উইন্ডো:

sudo apt install python3-pip
pip3 install --upgrade pip

আবার আমরা pip3 ইনস্টলেশন যাচাই করতে পারি এর মাধ্যমে:

টার্মিনাল উইন্ডো:

pip3 --version

এই লেখাটি লেখার সময় আমরা দেখতে পাচ্ছি যে, এই কমান্ডটি চালানোর পর টার্মিনালে pip 20.2.3 প্রিন্ট হয়েছে।

TensorFlow ইনস্টল করার আগে, 'setuptools' পাইথন প্যাকেজটির ভার্সন 41.0.0 বা তার বেশি হওয়া প্রয়োজন। এটি সর্বশেষ ভার্সনে আপডেট করা হয়েছে কিনা তা নিশ্চিত করতে নিম্নলিখিত কমান্ডটি চালান:

টার্মিনাল উইন্ডো:

pip3 install -U setuptools

অবশেষে, আমরা এখন পাইথনের জন্য টেনসরফ্লো ইনস্টল করতে পারি:

টার্মিনাল উইন্ডো:

pip3 install tensorflow

এটি সম্পন্ন হতে কিছুটা সময় লাগতে পারে, তাই অনুগ্রহ করে এর সম্পাদন শেষ হওয়া পর্যন্ত অপেক্ষা করুন।

চলুন দেখে নেওয়া যাক TensorFlow সঠিকভাবে ইনস্টল হয়েছে কিনা। আপনার বর্তমান ডিরেক্টরিতে test.py নামে একটি পাইথন ফাইল তৈরি করুন:

টার্মিনাল উইন্ডো:

nano test.py

ন্যানো (nano) চালু হয়ে গেলে, ইনস্টল করা টেনসরফ্লো (TensorFlow)-এর ভার্সন প্রিন্ট করার জন্য আমরা কিছু পাইথন কোড লিখতে পারি:

test.py:

import tensorflow as tf
print(tf.__version__)

ডিস্কে পরিবর্তনগুলো লেখার জন্য CTRL + O চাপুন এবং তারপর ন্যানো এডিটর থেকে বের হওয়ার জন্য CTRL + X চাপুন।

এখন আমরা এই পাইথন ফাইলটি রান করে স্ক্রিনে TensorFlow-এর ভার্সনটি দেখতে পারি:

টার্মিনাল উইন্ডো:

python3 test.py

এই প্রতিবেদন লেখার সময় আমরা দেখতে পাচ্ছি যে, আমাদের ইনস্টল করা TensorFlow Python ভার্সনটির জন্য কনসোলে 2.3.1 প্রিন্ট হয়েছে।

৪. পাইথন মডেল তৈরি করা

এই কোডল্যাবের পরবর্তী ধাপে একটি সাধারণ পাইথন মডেল তৈরি করে দেখানো হবে, যার মাধ্যমে আমরা প্রশিক্ষিত মডেলটিকে "SavedModel" ফরম্যাটে সংরক্ষণ করতে পারব এবং পরবর্তীতে আমাদের TensorFlow.js কমান্ড লাইন কনভার্টারের সাথে ব্যবহার করতে পারব। আপনি যে কোনো পাইথন মডেল রূপান্তর করার চেষ্টা করুন না কেন, মূলনীতিটি একই রকম হবে, কিন্তু আমরা এই কোডটি সহজ রাখব যাতে সবাই বুঝতে পারে।

চলুন, প্রথম বিভাগে তৈরি করা আমাদের test.py ফাইলটি সম্পাদনা করি এবং কোডটি নিম্নরূপভাবে আপডেট করি:

test.py:

import tensorflow as tf
print(tf.__version__)

# Import NumPy - package for working with arrays in Python.
import numpy as np

# Import useful keras functions - this is similar to the
# TensorFlow.js Layers API functionality.
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense

# Create a new dense layer with 1 unit, and input shape of [1].
layer0 = Dense(units=1, input_shape=[1])
model = Sequential([layer0])

# Compile the model using stochastic gradient descent as optimiser
# and the mean squared error loss function.
model.compile(optimizer='sgd', loss='mean_absolute_error')

# Provide some training data! Here we are using some fictional data 
# for house square footage and house price (which is simply 1000x the 
# square footage) which our model must learn for itself.
xs = np.array([800.0, 850.0, 900.0, 950.0, 980.0, 1000.0, 1050.0, 1075.0, 1100.0, 1150.0, 1200.0, 1250.0, 1300.0, 1400.0, 1500.0, 1600.0, 1700.0, 1800.0, 1900.0, 2000.0], dtype=float)

ys = np.array([800000.0, 850000.0, 900000.0, 950000.0, 980000.0, 1000000.0, 1050000.0, 1075000.0, 1100000.0, 1150000.0, 1200000.0,  1250000.0, 1300000.0, 1400000.0, 1500000.0, 1600000.0, 1700000.0, 1800000.0, 1900000.0, 2000000.0], dtype=float)

# Train the model for 500 epochs.
model.fit(xs, ys, epochs=500, verbose=0)

# Test the trained model on a test input value
print(model.predict([1200.0]))

# Save the model we just trained to the "SavedModel" format to the
# same directory our test.py file is located.
tf.saved_model.save(model, './')

এই কোডটি আমাদের প্রদত্ত x (ইনপুট) এবং y (আউটপুট)-এর মধ্যে সম্পর্ক অনুমান করতে শেখানোর জন্য একটি অত্যন্ত সরল লিনিয়ার রিগ্রেশন মডেলকে প্রশিক্ষণ দেবে। এরপর আমরা প্রশিক্ষিত মডেলটিকে ডিস্কে সংরক্ষণ করব। প্রতিটি লাইন কী কাজ করে, সে সম্পর্কে আরও বিস্তারিত জানতে ইনলাইন কমেন্টগুলো দেখুন।

এই প্রোগ্রামটি ( python3 test.py কমান্ডটি) চালানোর পর যদি আমরা আমাদের ডিরেক্টরি পরীক্ষা করি, তাহলে আমরা আমাদের বর্তমান ডিরেক্টরিতে কিছু নতুন ফাইল এবং ফোল্ডার তৈরি হতে দেখব:

  • test.py
  • সংরক্ষিত_মডেল.পিবি
  • সম্পদ
  • ভেরিয়েবল

এই মডেলটিকে ব্রাউজারে চালানোর জন্য রূপান্তর করতে TensorFlow.js কনভার্টারের প্রয়োজনীয় ফাইলগুলো আমরা এখন তৈরি করে ফেলেছি!

৫. সংরক্ষিত মডেলকে TensorFlow.js ফরম্যাটে রূপান্তর করা

TensorFlow.js কনভার্টার ইনস্টল করুন

কনভার্টারটি ইনস্টল করতে, নিম্নলিখিত কমান্ডটি চালান:

টার্মিনাল উইন্ডো:

pip3 install tensorflowjs

সেটা তো সহজ ছিল।

ধরে নিচ্ছি আমরা উপরে দেখানো উইজার্ড ভার্সনটির পরিবর্তে কমান্ড লাইন কনভার্টার ( tensorflowjs_converter ) ব্যবহার করছি, সেক্ষেত্রে আমরা এইমাত্র তৈরি করা সেভ করা মডেলটিকে কনভার্ট করার জন্য নিম্নলিখিত কমান্ডটি কল করতে পারি এবং কনভার্টারটিতে প্যারামিটারগুলো স্পষ্টভাবে পাস করতে পারি:

টার্মিনাল উইন্ডো:

tensorflowjs_converter \
    --input_format=keras_saved_model \
    ./ \
    ./predict_houses_tfjs

এখানে কী হচ্ছে? প্রথমে আমরা এইমাত্র ইনস্টল করা tensorflowjs_converter বাইনারিটিকে কল করছি এবং নির্দিষ্ট করে দিচ্ছি যে আমরা একটি keras-এ সেভ করা মডেলকে কনভার্ট করার চেষ্টা করছি।

আমাদের উপরের উদাহরণ কোডে আপনি লক্ষ্য করবেন যে আমরা keras ইম্পোর্ট করেছি এবং আমাদের মডেল তৈরি করার জন্য এর উচ্চ স্তরের লেয়ার API-গুলো ব্যবহার করেছি। আপনি যদি আপনার পাইথন কোডে keras ব্যবহার না করে থাকেন, তাহলে আপনাকে একটি ভিন্ন ইনপুট ফরম্যাট ব্যবহার করতে হতে পারে:

  • কেরাস - কেরাস ফরম্যাট লোড করতে (HDF5 ফাইল টাইপ)
  • tf_saved_model - কেরাসের পরিবর্তে টেনসরফ্লো কোর এপিআই ব্যবহার করে এমন মডেল লোড করার জন্য।
  • tf_frozen_model - ফ্রোজেন ওয়েটযুক্ত একটি মডেল লোড করার জন্য।
  • tf_hub - টেনসরফ্লো হাব থেকে তৈরি করা মডেল লোড করার জন্য।

আপনি এখানে এই অন্যান্য ফরম্যাটগুলো সম্পর্কে আরও জানতে পারবেন।

পরবর্তী দুটি প্যারামিটার নির্দিষ্ট করে দেয় যে সংরক্ষিত মডেলটি কোন ফোল্ডারে থাকবে - আমাদের উপরের ডেমোতে আমরা বর্তমান ডিরেক্টরিটি নির্দিষ্ট করেছি, এবং সবশেষে আমরা নির্দিষ্ট করি যে আমাদের রূপান্তরিত ডেটা কোন ডিরেক্টরিতে আউটপুট করতে চাই, যা আমরা উপরে বর্তমান ডিরেক্টরির অন্তর্গত " predict_houses_tfjs " নামক একটি ফোল্ডার হিসেবে নির্দিষ্ট করেছি।

উপরের কমান্ডটি চালালে বর্তমান ডিরেক্টরিতে predict_houses_tfjs নামে একটি নতুন ফোল্ডার তৈরি হয়, যার মধ্যে থাকে :

  • মডেল.json
  • Group1-shard1of1.bin

ওয়েব ব্রাউজারে মডেলটি চালানোর জন্য এই ফাইলগুলো আমাদের প্রয়োজন। ফাইলগুলো সংরক্ষণ করুন, কারণ আমরা পরবর্তী অংশে এগুলো ব্যবহার করব।

৬. ব্রাউজারে আমাদের রূপান্তরিত মডেলটি ব্যবহার করা

রূপান্তরিত ফাইলগুলি হোস্ট করুন

প্রথমে আমাদের তৈরি করা model.json এবং *.bin ফাইলগুলো একটি ওয়েব সার্ভারে রাখতে হবে, যাতে আমরা আমাদের ওয়েব পেজ থেকে সেগুলোতে অ্যাক্সেস করতে পারি। এই ডেমোর জন্য আমরা Glitch.com ব্যবহার করব, যাতে আপনার জন্য বিষয়টি অনুসরণ করা সহজ হয়। তবে, আপনার যদি ওয়েব ইঞ্জিনিয়ারিংয়ের অভিজ্ঞতা থাকে, তাহলে এর পরিবর্তে আপনি আপনার বর্তমান উবুন্টু সার্ভার ইনস্ট্যান্সে একটি সাধারণ http সার্ভার চালু করেও কাজটি করতে পারেন। সিদ্ধান্ত আপনার।

গ্লিচে ফাইল আপলোড করা

  1. Glitch.com- এ সাইন ইন করুন
  2. আমাদের বয়লারপ্লেট TensorFlow.js প্রজেক্টটি ক্লোন করতে এই লিঙ্কটি ব্যবহার করুন। এতে ব্যবহারের জন্য প্রস্তুত একটি স্কেলেটন html, css, এবং js ফাইল রয়েছে, যেগুলো আমাদের জন্য TensorFlow.js লাইব্রেরি ইম্পোর্ট করে দেয়।
  3. বাম দিকের প্যানেলে থাকা 'assets' ফোল্ডারটিতে ক্লিক করুন।
  4. 'আপলোড অ্যান অ্যাসেট'-এ ক্লিক করুন এবং এই ফোল্ডারে আপলোড করার জন্য group1-shard1of1.bin ফাইলটি নির্বাচন করুন। আপলোড হয়ে গেলে এটি দেখতে এইরকম হবে: 25a2251c7f165184.png
  5. আপনি এইমাত্র আপলোড করা group1-shard1of1.bin ফাইলটিতে ক্লিক করলে এর অবস্থানের URL-টি কপি করতে পারবেন। এখন দেখানো অনুযায়ী এই পাথটি কপি করুন: 92ded8d46442c404.png
  6. এখন আপনার লোকাল মেশিনে আপনার পছন্দের টেক্সট এডিটর ব্যবহার করে model.json সম্পাদনা করুন এবং CTRL+F ব্যবহার করে group1-shard1of1.bin ফাইলটি খুঁজুন, যেটি এর মধ্যেই কোথাও উল্লেখ করা থাকবে।

এই ফাইলের নামটি ধাপ ৫ থেকে কপি করা ইউআরএল দিয়ে প্রতিস্থাপন করুন, কিন্তু কপি করা পাথটির শুরুতে থাকা https://cdn.glitch.com/ অংশটি মুছে দিন, যা গ্লিচ তৈরি করে।

সম্পাদনা করার পর এটি দেখতে অনেকটা এইরকম হবে (লক্ষ্য করুন, শুরুর সার্ভার পাথটি সরিয়ে দেওয়া হয়েছে, ফলে শুধুমাত্র আপলোড হওয়া ফাইলের নামটি রাখা হয়েছে): d5a338f2dc1f31d4.png ৭. এখন এই সম্পাদিত model.json ফাইলটি সেভ করুন এবং অ্যাসেটস-এ ক্লিক করে "আপলোড অ্যান অ্যাসেট" বোতামে ক্লিক করে গ্লিচ-এ আপলোড করুন (এটি গুরুত্বপূর্ণ) । আপনি যদি ফিজিক্যাল বোতামটি ব্যবহার না করে ড্র্যাগ অ্যান্ড ড্রপ করেন, তাহলে এটি CDN-এ আপলোড না হয়ে একটি সম্পাদনাযোগ্য ফাইল হিসাবে আপলোড হবে, যা একই ফোল্ডারে থাকবে না এবং TensorFlow.js যখন কোনো নির্দিষ্ট মডেলের বাইনারি ফাইল ডাউনলোড করার চেষ্টা করে, তখন রিলেটিভ পাথ ধরে নেওয়া হয়। আপনি যদি এটি সঠিকভাবে করে থাকেন, তাহলে assets ফোল্ডারে এইরকম ২টি ফাইল দেখতে পাবেন: 51a6dbd5d3097ffc.png

চমৎকার! আমরা এখন ব্রাউজারে আসল কোডের সাথে আমাদের সংরক্ষিত ফাইলগুলো ব্যবহার করার জন্য প্রস্তুত।

মডেল লোড করা হচ্ছে

এখন যেহেতু আমরা আমাদের রূপান্তরিত ফাইলগুলো হোস্ট করেছি, আমরা এই ফাইলগুলো লোড করতে এবং ভবিষ্যদ্বাণী করার জন্য এগুলো ব্যবহার করতে একটি সাধারণ ওয়েবপেজ লিখতে পারি। Glitch প্রজেক্ট ফোল্ডারে থাকা script.js খুলুন এবং আপনার Glitch-এ আপলোড করা model.json ফাইলের জন্য তৈরি করা Glitch.com লিঙ্কের দিকে নির্দেশ করতে const MODEL_URL পরিবর্তন করার পর, এই ফাইলের বিষয়বস্তু নিম্নলিখিত কোড দিয়ে প্রতিস্থাপন করুন:

script.js:

// Grab a reference to our status text element on the web page.
// Initially we print out the loaded version of TFJS.
const status = document.getElementById('status');
status.innerText = 'Loaded TensorFlow.js - version: ' + tf.version.tfjs;

// Specify location of our Model.json file we uploaded to the Glitch.com CDN.
const MODEL_URL = YOUR MODEL.JSON URL HERE! CHANGE THIS!';
// Specify a test value we wish to use in our prediction.
// Here we use 950, so we expect the result to be close to 950,000.
const TEST_VALUE = 950.0

// Create an asynchronous function.
async function run() {
    // Load the model from the CDN.
    const model = await tf.loadLayersModel(MODEL_URL);

    // Print out the architecture of the loaded model.
    // This is useful to see that it matches what we built in Python.
    console.log(model.summary());

    // Create a 1 dimensional tensor with our test value.
    const input = tf.tensor1d([TEST_VALUE]);

    // Actually make the prediction.
    const result = model.predict(input);

    // Grab the result of prediction using dataSync method
    // which ensures we do this synchronously.
    status.innerText = 'Input of ' + TEST_VALUE + 
        'sqft predicted as $' + result.dataSync()[0];
}

// Call our function to start the prediction!
run();

MODEL_URL কনস্ট্যান্টটি পরিবর্তন করে আপনার model.json পাথে নির্দেশ করার পর উপরের কোডটি চালালে নিচে দেখানো আউটপুটটি পাওয়া যাবে।

c5e8457213058ec3.png

যদি আমরা ওয়েব ব্রাউজারের কনসোলটি পরিদর্শন করি (ব্রাউজারে ডেভেলপার টুলস আনতে F12 চাপুন), তাহলে আমরা লোড হওয়া মডেলটির মডেল বিবরণও দেখতে পাব, যা প্রিন্ট করে:

35e79d70dbd66f27.png

এই কোডল্যাবের শুরুতে আমাদের পাইথন কোডের সাথে এটি তুলনা করে আমরা নিশ্চিত হতে পারি যে এটি সেই একই নেটওয়ার্ক যা আমরা ১টি ডেন্স ইনপুট এবং ১টি নোড সহ ১টি ডেন্স লেয়ার দিয়ে তৈরি করেছিলাম।

অভিনন্দন! আপনি এইমাত্র একটি রূপান্তরিত পাইথন প্রশিক্ষিত মডেল ওয়েব ব্রাউজারে চালালেন!

৭. যে মডেলগুলো রূপান্তর হয় না

এমন সময় আসবে যখন আরও জটিল মডেল, যেগুলো কম্পাইল হয়ে কম প্রচলিত অপারেশন ব্যবহার করে, সেগুলোকে রূপান্তরের জন্য সমর্থন করা হবে না। TensorFlow.js-এর ব্রাউজার-ভিত্তিক সংস্করণটি হলো TensorFlow-এর একটি সম্পূর্ণ নতুন সংস্করণ এবং সেই কারণে আমরা বর্তমানে TensorFlow C++ API-এর সমস্ত লো-লেভেল অপারেশন (যার সংখ্যা হাজার হাজার) সমর্থন করি না — যদিও সময়ের সাথে সাথে আমাদের অগ্রগতির সাথে এবং কোর অপারেশনগুলো আরও স্থিতিশীল হওয়ার সাথে সাথে আরও অপারেশন যুক্ত করা হচ্ছে।

এই লেখাটি লেখার সময়, TensorFlow Python-এর এমনই একটি ফাংশন হলো linalg.diag , যা সেভডমডেল হিসেবে এক্সপোর্ট করার সময় একটি অসমর্থিত অপ তৈরি করে। যদি আমরা পাইথনে এমন একটি সেভডমডেল রূপান্তর করার চেষ্টা করি যা এটি ব্যবহার করে (যদিও পাইথন এর উৎপাদিত অপগুলো সমর্থন করে), তাহলে আমরা নীচের ছবির মতো একটি ত্রুটি দেখতে পাব:

5df94fc652393e00.png

এখানে লাল রঙে হাইলাইট করা অবস্থায় আমরা দেখতে পাচ্ছি যে, linalg.diag কলটি কম্পাইল হয়ে MatrixDiagV3 নামের একটি অপ তৈরি করেছে, যা এই কোডল্যাবটি লেখার সময় ওয়েব ব্রাউজারে TensorFlow.js দ্বারা সমর্থিত নয়।

কী করতে হবে?

আপনার কাছে দুটি বিকল্প আছে।

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

৮. অভিনন্দন

অভিনন্দন, আপনি ওয়েব ব্রাউজারে TensorFlow.js-এর মাধ্যমে পাইথন মডেল ব্যবহার করার প্রথম পদক্ষেপ নিয়েছেন!

পুনরালোচনা

এই কোড ল্যাবে আমরা শিখেছি কীভাবে:

  1. পাইথন ভিত্তিক টেনসরফ্লো ইনস্টল করার জন্য আমাদের লিনাক্স পরিবেশ প্রস্তুত করুন।
  2. একটি পাইথন 'SavedModel' রপ্তানি করুন
  3. TensorFlow.js কমান্ড লাইন কনভার্টারটি ইনস্টল করুন
  4. প্রয়োজনীয় ক্লায়েন্ট সাইড ফাইলগুলো তৈরি করতে TensorFlow.js কমান্ড লাইন কনভার্টারটি ব্যবহার করুন।
  5. তৈরি করা ফাইলগুলো বাস্তব ওয়েব অ্যাপ্লিকেশনে ব্যবহার করুন
  6. যে মডেলগুলো রূপান্তরিত হবে না, সেগুলো চিহ্নিত করুন এবং ভবিষ্যতে সেগুলোকে রূপান্তরিত করার জন্য কী বাস্তবায়ন করতে হবে তা নির্ধারণ করুন।

এরপর কী?

#MadeWithTFJS ব্যবহার করে আপনার তৈরি করা যেকোনো কিছুতে আমাদের ট্যাগ করতে ভুলবেন না, তাহলে সোশ্যাল মিডিয়ায় ফিচার হওয়ার বা ভবিষ্যতের TensorFlow ইভেন্টগুলিতে প্রদর্শিত হওয়ার সুযোগ পাবেন। আপনি কী রূপান্তর করে ক্লায়েন্ট সাইডে ব্রাউজারে ব্যবহার করেন, তা দেখতে আমরা খুবই আগ্রহী!

আরও গভীরে যাওয়ার জন্য TensorFlow.js-এর আরও কোডল্যাব রয়েছে।

যাচাই করার জন্য ওয়েবসাইটগুলি