প্লাগ-অ্যান্ড-প্লে AI-এর সুবিধা এবং কাস্টম মডেলের নমনীয়তার মধ্যে বেছে নেওয়া বন্ধ করুন—আপনি মেগাবাইট বাইনারি ব্লোট যোগ না করেই একটি একক, আল্ট্রা-লিন অ্যাপে দুটিই ডিপ্লয় করতে পারেন।
এই সেশনে, আমরা দেখাব যে কীভাবে একটি Android অ্যাপে এই একই ডুয়াল-স্ট্যাক আর্কিটেকচার তৈরি করা যায়। আপনি দেখতে পাবেন যে কীভাবে আপনার কাস্টম কম্পিউটার ভিশন বা অডিও ওয়ার্কলোডের জন্য Play পরিষেবায় LiteRT স্ট্যান্ডঅ্যালোন সহ রেডি-টু-ইউজ ক্লাসিক্যাল ML টাস্কের (যেমন, ডকুমেন্ট স্ক্যান) জন্য ML Kit-এর সুবিধা নেওয়া যায়। আমরা গভীরভাবে দেখব যে কীভাবে দুটি ইমপ্লিমেন্টেশন পাথ আধুনিক LiteRT রানটাইম ব্যবহার করার জন্য একসাথে কাজ করে, যা আপনার অ্যাপকে CPU এবং GPU-তে নির্বিঘ্ন, হার্ডওয়্যার-অ্যাক্সিলারেটেড পারফর্ম্যান্স প্রদান করে এবং কার্যত জিরো-বাইট ডাউনলোড ফুটপ্রিন্ট সহ কাজ করে।
ডেভেলপারদের জন্য গুরুত্বপূর্ণ বিষয়:
-অতুলনীয় পারফর্ম্যান্স: ইউনিফায়েড CompiledModel API ব্যবহার করে টার্নকী ও কাস্টম মডেল, দুটিই অটোমেটিক হার্ডওয়্যার-অ্যাক্সিলারেটেড হয়।
-মাইক্রো-APK: ML Kit এবং LiteRT রানটাইম, দুটিই Play পরিষেবায় অফলোড করে আপনার অ্যাপের ডাউনলোড সাইজ নাটকীয়ভাবে কমিয়ে দিন।
-হাইব্রিড ইন্টিগ্রেশন: রিসোর্স কনফ্লিক্ট ছাড়াই প্রোডাকশনে পাশাপাশি একাধিক ML ওয়ার্কফ্লো চালানোর ক্ষেত্রে দক্ষতা অর্জন করুন।
play-services-litert-এ আপডেট করা, এনভায়রনমেন্ট পেতে LiteRt.initialize কল করা এবং এটি CompiledModel.create-এ পাস করার মতো বিষয় অন্তর্ভুক্ত।ট্রান্সস্ক্রিপ্ট করা
শুভ সন্ধ্যা।
আমরা আলোচনা শুরু করতে চলেছি।
তাই, বর্তমানে লোকজন যখন "অন-ডিভাইস AI" বলেন, তখন তারা প্রায়শই LLM-এর কথা বলেন।
আজকে এর আগে, আপনি Gemini Nano সম্পর্কে অনেক আলোচনা দেখেছেন যা ML Kit, Firebase এবং Google-এর অন্যান্য অনেক প্রোডাক্টের সাথে কভার করা হয়েছে।
এই সেশনটি অন্য অর্ধেক সম্পর্কে: ক্লাসিক্যাল ML এবং আপনি নিজে যে মডেলটি নিয়ে এসেছেন।
আপনি সম্ভবত আজ এটি কয়েকবার ব্যবহার করেছেন, এমনকি আপনি তা জানেনও না।
আপনার এমন কোনও অ্যাপ ব্যবহার করার কথা ভাবুন যেখানে আপনি ব্যাকগ্রাউন্ড অস্পষ্ট করেছেন বা বারকোড স্ক্যানার ব্যবহার করেছেন বা কোনও ধরনের ছবি এডিট করেছেন।
এর বেশিরভাগই ক্লাসিক্যাল ML-এ করা হয়েছে এবং সাধারণত অন-ডিভাইসেও চলে।
এবং আপনি যদি কখনও নিজের অ্যাপ বা APK-তে এইসব ফিচারের কোনও একটি যোগ করে থাকেন, তাহলে আপনি প্রায়ই এই ট্রেড-অফ করেছেন: আমি কি মূলত একটি টার্নকি API ব্যবহার করব, নাকি আমি নিজের মডেল নিয়ে আসব?
আমার অ্যাপের সাইজের উপর কী প্রভাব পড়তে চলেছে, তাই তো?
আজ, আপনি দেখতে পাবেন যে আপনাকে টার্নকি বা আপনার নিজস্ব মডেল আনার মধ্যে বেছে নিতে হবে না।
আপনি আসলে একটি লিন রানটাইম দিয়ে দুটিই করতে পারবেন।
আমার নাম চিন্তন পারিখ।
আমি LiteRT-এর প্রোডাক্ট ম্যানেজার এবং আমার সাথে আছেন Android ML পরিষেবার ইঞ্জিনিয়ারিং লিড ফার্গাস।
হাই,
এবং শেষে, আপনি দেখতে পাবেন যে কীভাবে আপনি একটি অ্যাপ তৈরি করতে পারেন যা প্রতিটি ক্যামেরা ফ্রেমে দুটি মডেল চালায়, প্রতি সেকেন্ডে প্রায় ৩০টি ফ্রেমে।
সুতরাং, এই আলোচনার চারটি অংশ রয়েছে।
প্রথম অংশে আমরা Google-এর অন-ডিভাইস AI সলিউশন সম্পর্কে কথা বলব যা ক্লাসিক্যাল ML, অর্থাৎ ML Kit এবং LiteRT-এর উপর ফোকাস করে।
দ্বিতীয়ত, আমরা LiteRT এবং Play পরিষেবায় নতুন কী আছে তা নিয়ে আলোচনা করব।
এছাড়াও, এটি LiteRT থেকে নতুন CompiledModel API এবং আমরা যেসব ডিভাইস সাপোর্ট করি সেগুলি কভার করবে।
তিন, কীভাবে নতুন অ্যাপ তৈরি করতে হয় তা আমরা আপনাকে দেখাব।
ফার্গাস ML Kit ও কাস্টম মডেল ব্যবহার করে একটি APK-এর মধ্যে অ্যাপ তৈরি করার পদ্ধতি দেখাবেন।
আর শেষে, আমরা আপনাকে দেখাব যে কীভাবে Agent Mode ব্যবহার করে আগে থেকে থাকা অ্যাপ আপগ্রেড করতে হয়।
এছাড়াও, আপনি এই এজেন্টের সাহায্যে একটি নতুন অ্যাপের স্ক্যাফোল্ড তৈরি করতে পারেন।
ঠিক আছে।
তাহলে প্রথমে, LiteRT কী তা দিয়ে শুরু করা যাক?
LiteRT হল আপনার নিজস্ব মডেলের জন্য Google-এর অন-ডিভাইস ইনফারেন্স রানটাইম।
আপনি আগে TensorFlow Lite ব্যবহার করে থাকলে, এটি একই .tflite ফাইল ফর্ম্যাট ব্যবহার করে।
এটি পারফর্ম্যান্সের জন্য রি-ইঞ্জিনিয়ার করা হয়েছে এবং মাল্টি-ফ্রেমওয়ার্কও সাপোর্ট করে।
এর অর্থ হল, আপনি PyTorch, TensorFlow এবং এমনকি JAX থেকে মডেল নিয়ে আসতে পারেন যাতে LiteRT-এর জন্য ফ্ল্যাট বাফার ফর্ম্যাটে এটিকে কম করা যায়।
এখন, ২০২২ সাল থেকে, Google Play পরিষেবায় TensorFlow Lite হল কাস্টম মডেলের জন্য Android-এর অফিসিয়াল অন-ডিভাইস রানটাইম।
আজ এটি একটি বড় আপগ্রেড পেয়েছে এবং এই আলোচনার বেশিরভাগই সেই সম্পর্কে হতে চলেছে।
আপগ্রেড করার ফলে লেটেস্ট LiteRT CompiledModel API পাওয়া যাবে, যার মধ্যে নতুন উন্নত GPU ইনফারেন্স অন্তর্ভুক্ত যা ১.৪ গুণ দ্রুত কাজ করবে এবং আপনাকে অনেক ছোট APK সাইজে আরও ছোট অ্যাপ তৈরি করতে দেবে।
তাহলে, Play পরিষেবার মাধ্যমে এটি কেন ডেলিভার করা হয়?
এর কিছু সুবিধা আছে এবং এটি অবশ্যই একটি বড় অসন্তোষের কারণ যা আমি অনেক আলোচনায় দেখছি যেখানে অ্যাপের সাইজ এবং APK ব্লট একটি বাস্তব চ্যালেঞ্জ হয়ে উঠছে, তাই না?
তাই, আপনাকে একটি ছোট রানটাইম দেয়।
রানটাইম আপনার APK-তে নেই, তাই আপনি থিন ক্লায়েন্টের উপর নির্ভর করেন এবং এটি আপনার APK-কে প্রায় ৮ এমবি ছোট করে তোলে।
দ্বিতীয় সুবিধাটি হল দক্ষতা।
আপনার কাছে রানটাইমের একটি কপি আছে, তাই LiteRT রানটাইম সব অ্যাপ জুড়ে শেয়ার করা হয়।
তাই, আপনার কাছে অনেক অ্যাপ থাকলে, সেগুলি প্রতিটি ৮ এমবি করে স্টোরেজ বাঁচাতে পারে।
আপনি ডিস্ক স্টোরেজে খালি জায়গা বাঁচাতে চাইলে এবং আরও হালকা অ্যাপ চাইলে, এটি খুব দ্রুত যোগ হয়ে যায়।
দ্বিতীয়ত, এটি রক্ষণাবেক্ষণ করা হয়।
Google ত্রুটি সমাধান করে, এটি GPU ড্রাইভারের সমস্যাগুলি সমাধান করে যা আপনাকে করতে হবে না এবং অন্য কোনও নিরাপত্তা আপডেটও অটোমেটিক আপডেটের মাধ্যমে আসে।
এবং আমি যেমন উল্লেখ করেছি, GPU আরও দ্রুত, তাই আপনি ১.৪ গুণ দ্রুত GPU পাবেন এবং আমরা সেই বিষয়ে আরও বিস্তারিত আলোচনা করব।
এবং কভারেজের দৃষ্টিকোণ থেকে, আমরা পুরনো Android ডিভাইসে শিপ করতে পারি।
Play পরিষেবায় LiteRT, ২০১৬ সালের Android 7 পর্যন্ত সব ভার্সনে কাজ করে।
এবং Fergus আপনাকে দেখাবে যে, আমরা অন্যান্য নতুন ডিভাইসেও এই সুবিধা নিয়ে আসছি।
সুতরাং, এটি হল ডেলিভারি ভেহিকল এবং আসুন পরবর্তী ধাপ, রানটাইম সম্পর্কে কথা বলি।
তাই, LiteRT নতুন নয় এবং এটি পরীক্ষামূলকও নয়।
TensorFlow Lite এবং LiteRT বর্তমানে ২৫০,০০০-এর বেশি অ্যাপে রান করে।
এছাড়াও, এটি বর্তমানে ৩.৮ বিলিয়নেরও বেশি ডিভাইসে চলে।
তাই, আপনি হয়ত এমন অনেক অ্যাপ ব্যবহার করছেন, যেগুলি এই সিস্টেমের মাধ্যমে চলে, কিন্তু আপনি তা জানেন না।
এবং এটি প্রতিদিন এক ট্রিলিয়নেরও বেশি ইনফারেন্সের সমান, তাই না?
সেই স্কেলে, আমরা অবশ্যই প্রতিটি অদ্ভুত চিপসেট সমস্যার সম্মুখীন হয়েছি, আমরা ROM সমস্যা বা GPU ড্রাইভার সমস্যা সমাধান করতে পেরেছি এবং শুধুমাত্র আপনার জন্য আমাদের কাছে একটি সমাধান আছে।
LiteRT হল এমন একটি টুল যা Google তার ফ্ল্যাগশিপ অ্যাপ, বিভিন্ন অ্যাপ, প্ল্যাটফর্ম এবং এমনকি একাধিক ডিভাইসেও রান করে।
YouTube Short এফেক্ট, Meet ব্যাকগ্রাউন্ড সেগমেন্টেশন, ফটো আনব্লার হল এমন কিছু উদাহরণ যেখানে রিয়েল-টাইম ভিডিও এবং হেভি ইমেজ মডেল সবই LiteRT-তে চলে।
এটিও অত্যন্ত গুরুত্বপূর্ণ কারণ ব্যবহারকারীর জন্য ইউজ কেসকে আকর্ষণীয় ও এনগেজিং করে তোলা অত্যন্ত কঠিন, তাই না?
সুতরাং, এটি একই রানটাইম যা আমরা এই ফ্ল্যাগশিপ ফিচারগুলির জন্য হার্ডেন করেছি এবং এটিই আপনি Play পরিষেবার মাধ্যমে পান।
তাই, অন-ডিভাইস AI কেন ব্যবহার করা উচিত সেই বিষয়েও আলোচনা করা যাক।
লেটেন্সি, গোপনীয়তা, অফলাইনে কাজ করা বা কম খরচ হওয়া, এগুলির মধ্যে কোনওটি আপনার কাছে গুরুত্বপূর্ণ হলে, এটি অফলাইনে চালান, তাই তো?
আরও অনেক কারণ থাকতে পারে, তবে এগুলি হল সবচেয়ে স্পষ্ট কিছু কারণ যা আমরা অন-ডিভাইসে চালানোর জন্য শুনেছি।
এছাড়াও, অন-ডিভাইস রান করা সবসময় ফ্রি হয় না।
এতে কিছু সূক্ষ্ম পার্থক্য ও চ্যালেঞ্জ আছে।
তাই, আমরা এই চ্যালেঞ্জগুলির মধ্যে কিছু নিয়ে আলোচনা করব এবং আপনার জন্য একটি পথও তৈরি করব, ঠিক আছে?
তাহলে, পারফর্ম্যান্স: আপনি যেমন দেখেছেন, আগের অ্যাপের কিছু উদাহরণ, লেটেন্সি এবং মেমরি বাজেট সবসময় টাইট থাকে, তাই না?
রিয়েল-টাইম ভিডিও ও অডিওর জন্য অত্যন্ত দক্ষ হতে হবে।
এমনকি সাধারণ ইন্টার্যাক্টিভ ফিচারও দ্রুত কাজ করতে হবে।
অন্যথায়, ব্যবহারকারীরা আপনার অ্যাপের সাথে কতটা জুড়ে আছেন তা আপনি জানতে পারবেন না।
হার্ডওয়্যারের বৈচিত্র্য: বিভিন্ন CPU কনফিগারেশন, GPU কনফিগারেশন সহ শত শত SoC আছে।
আপনি এই সবকিছুর জন্য কোড লিখতে পারবেন না, তাই তো?
এর মধ্যে যেকোনও একটির সমাধান আপনি কীভাবে করবেন?
APK সাইজ: নেটিভ রানটাইম বান্ডেল করার ফলে প্রতিটি ডাউনলোডের সাইজও বড় হয়ে যায় যা আপনার কনভার্সন রেটকে প্রভাবিত করতে পারে।
কাস্টমাইজেশন: মডেল ট্রেনিং, কোয়ালিটি, মডেল সাইজ, এগুলি সবই ডেপ্লয় করার আগে অত্যন্ত গুরুত্বপূর্ণ হতে চলেছে।
তাই, ডিভাইসে কাজ করে এমন দুর্দান্ত অ্যাপ তৈরি করা কঠিন হতে পারে।
কিন্তু এই সব পরিস্থিতিতে, আমরা চাই যে প্ল্যাটফর্মটি আপনার জন্য কাজ করুক, তাই না?
এইসব চ্যালেঞ্জের সমাধান করতে Google-এর অন-ডিভাইস পোর্টফোলিও রয়েছে এবং আমরা এর পরে সেই বিষয়ে আলোচনা করব।
তাহলে, আজ আমরা দুটি সহজ সমাধানের উপর ফোকাস করব, তাই তো?
Play পরিষেবার মাধ্যমে অন-ডিভাইস AI যোগ করার দুটি সহজ উপায় আছে।
পাথ ১ হল ML Kit ব্যবহার করে টার্নকী পাথ, তাই তো?
এগুলি হল ব্যবহার করার জন্য প্রস্তুত ভিশন, ভাষা API, সীমিত ML দক্ষতার প্রয়োজন, অনেক মডেল প্রদান করা হয় এবং সবকটি Play পরিষেবার মাধ্যমে ডেলিভার করা হয়।
পরবর্তী স্লাইডে আমরা এই ধরনের কিছু উদাহরণও দেখব।
কাস্টম পাথ, এটি LiteRT-এর মাধ্যমে।
LiteRT আপনাকে নিজের মডেল নিয়ে আসতে এবং সিপিইউ (CPU), জিপিইউ (GPU)-তে রান করতে দেয়।
রানটাইমও Play পরিষেবা থেকে আসে।
তাই, এটি আপনার-- তাই, আপনি এটি আপনার APK-তে বান্ডেল করেন না।
এগুলি কোনও একটির মধ্যে সীমাবদ্ধ নয়।
তারা সবসময় একসাথে আরও ভালো কাজ করতে পারে।
আর ঠিক সেটাই আমরা আজ আগামী কয়েক মিনিটের মধ্যে তৈরি করব।
তবে, প্রথমে ML Kit-এ কী কী আছে তা জেনে নেওয়া যাক।
ML Kit-এ কী কী সুবিধা পাওয়া যায় তা এখানে দেওয়া হল।
তাই, আপনি যদি ইতিমধ্যেই মনে করেন যে এইসব ক্ষমতার মধ্যে কিছু আপনার প্রয়োজন পূরণ করে, তাহলে এটি একটি দুর্দান্ত সূচনা পয়েন্ট এবং আপনি ইতিমধ্যেই একটি হেড স্টার্ট পেয়েছেন।
আমাদের কাছে ভিশন, বারকোড, ডকুমেন্ট, টেক্সট, পোজ, এই ধরনের অনেক ক্ষমতা, ট্রান্সলেশনের মতো ল্যাঙ্গুয়েজ API, স্মার্ট রিপ্লাই এবং এমনকি এন্টিটি এক্সট্র্যাকশনের কভারেজ আছে, তাই না?
মূল বিষয় হল, এই ভিশন, ভাষা API-এর অনেকগুলিই LiteRT-এর মাধ্যমে ব্যাকগ্রাউন্ডে রান করে।
তাই, ML Kit যদি আপনার প্রয়োজন পূরণ করে, তাহলে আপনি এখান থেকে শুরু করতে পারেন।
আর যখন তা হয় না, তখন আপনার কাছে নিজের মডেল নিয়ে আসার সুযোগ থাকে।
আর এখানে মূল পয়েন্ট হল: মেশিন লার্নিং কিট এবং আপনার কাস্টম মডেল দুটি রানটাইম হতে যাচ্ছে না, ঠিক, যেমন আমি উল্লেখ করেছি।
এগুলি একই LiteRT-তে নিয়ে যাওয়া দুটি সামনের দরজার মতো কাজ করবে যা ব্যাকগ্রাউন্ডে চলবে।
তাই, LiteRT হল রানটাইম যা এই দুটি ক্ষমতাকেই অর্কেস্ট্রেট করবে।
তাই, আপনার অ্যাপ যদি আগে থেকেই ML Kit-এর জন্য Play Store ব্যবহার করে, তাহলে সেটি ব্যবহার করুন।
অন্যথায়, আমরা LiteRT পাথও চেক করব।
তাই, LiteRT-তে নতুন কী আছে তাও জেনে নেওয়া যাক।
আমি যেমন বলেছি, LiteRT হল TensorFlow Lite-এর একটি বিবর্তন, তাই না?
তাই, সবচেয়ে বড় উন্নতি হল আমাদের কাছে আরও দ্রুত GPU আছে।
আরও দ্রুত GPU, OpenCL, OpenGL-কে সাপোর্ট করে এবং Metal ব্যাকএন্ডের জন্য ক্রস-প্ল্যাটফর্ম সাপোর্টও রয়েছে।
তাই, আপনি অবশ্যই প্রয়োজন অনুযায়ী একাধিক প্ল্যাটফর্মের জন্য এটি ব্যবহার করতে পারবেন।
এটি আরও সহজ।
CPU, GPU ও NPU অ্যাক্সিলারেশনের জন্য আমাদের একটি ইউনিফায়েড ওয়ার্কফ্লো আছে।
CPU এবং GPU বর্তমানে Play পরিষেবায় রয়েছে, যেখানে NPU আজ LiteRT-এর মাধ্যমে বান্ডেল করা হয়েছে এবং এটি বর্তমানে প্রসেস করা হচ্ছে।
তাহলে, আগে প্রতিটি অ্যাক্সিলারেটর মানে আলাদা ডেলিগেট সেট-আপ, তাই তো?
আপনাকে এখন এটি একবারই করতে হবে।
তাই, CPU-তে অটোমেটিক ফল ব্যাক সহ একটি API আছে এবং আপনাকে ডেডিকেটেড-ডেলিগেটেড সেট-আপ করতে হবে না।
এবং আপনি শুধু অ্যাক্সিলারেটর কল করতে পারেন যা এটিকে আরও সহজভাবে এবং কম কোড সহ ম্যানেজ করতে পারে।
এটি শক্তিশালীও, আমি যেমন উল্লেখ করেছি, একই মডেল একাধিক প্ল্যাটফর্মে চলে।
This is going to be critical, the flexibility part of it.
তাই .tflite ফর্ম্যাট একই থাকে।
আপনার আগে থেকে কোনও অ্যাপ থাকলে, আপনি এখনও এই ফর্ম্যাট ব্যবহার করতে পারবেন।
আপনি নতুন অ্যাপ তৈরি করলে, এই ফাইলের ফরম্যাট আবার ব্যবহার করতে পারবেন।
এছাড়াও, আরেকটি মজার বিষয় হল, আমরা ইন্টারপ্রেটার API-কে সাপোর্ট করি, যা আগে TensorFlow Lite-এ ছিল।
তাই আপনি যদি ধাপে ধাপে মাইগ্রেট করতে চান, তাহলে ইন্টারপ্রেটার API অন্তর্ভুক্ত করা হয়েছে, এটি নতুন LiteRT-এরও অংশ, তাই এটি আপনার জন্য মাইগ্রেট করা সহজ করে তোলে।
তাহলে এটাই হল রানটাইম।
এটি দিয়ে আপনি কী তৈরি করতে পারবেন সেই বিষয়ে আলোচনা করা যাক।
তাই, Android অ্যাপ আজ কী তৈরি করছে তা এখানে দেওয়া হল।
ক্যামেরা এফেক্ট, ফটো এডিটিং, স্মার্ট টাইপিং, গেম ও অবতার, সব কিছু, তাই তো?
এইসব অ্যাপের মধ্যে অনেক অ্যাপের রিয়েল-টাইম ক্ষমতা প্রয়োজন হবে।
GPU সরাসরি ক্যামেরা থেকে ফ্রেম পাঠাচ্ছে, তাই জিনিসগুলি দ্রুত এবং রিয়েল-টাইমে পাওয়া গুরুত্বপূর্ণ হবে।
এইসব ফটো এডিটিং মডেলের মধ্যে কিছু মডেলের সাইজও বড় হচ্ছে।
এবং AR/VR ক্ষমতার ক্ষেত্রেও একই কথা প্রযোজ্য, যা আপনি চশমা সহ কিছু ডেমোতে দেখেছেন, তাদের মধ্যে অনেকগুলিই ব্যাকগ্রাউন্ডে LiteRT রান করে।
এটি এখন Google-এর ফ্ল্যাগশিপ ফিচারের পিছনে এবং Play পরিষেবাতেও একই রানটাইম, তাই আপনি আপনার APK-তে কিছু বান্ডিল না করেই এই সব কিছু পাবেন।
এখন আমরা কেন একটি অ্যাপ তৈরি করছি না এবং ফার্গাস আমাদের দেখাবে কীভাবে।
তাহলে সেটাই করা যাক।
ধন্যবাদ, চিন্তন।
তাই, Google Play পরিষেবায় LiteRT-তে নতুন কী আছে সেই সম্পর্কে আমি একটু কথা বলতে চলেছি।
তাই আমরা তৈরি করার ঠিক আগে, আরও একটি খবর, আপনি যা দেখেছেন তা এখন শুধু ফোনের বাইরেও চলে, Play পরিষেবায় LiteRT, Wear OS এবং Android Automotive OS-এও উপলভ্য।
তাই আপনি নিজের স্মার্টওয়াচ বা পরে থাকা যায় এমন অন্যান্য ডিভাইসে অথবা গাড়িতে অন-ডিভাইস মডেল চালাতে পারবেন।
আগে আপনার ফোনে এমন অ্যাপ ব্যবহার করা যেত যা Wear-এর কম্প্যানিয়ন অ্যাপ হিসেবে কাজ করত, কিন্তু এখন আপনি পরে থাকা যায় এমন ডিভাইসেই এটি চালাতে পারবেন এবং Android Automotive-এর ক্ষেত্রেও একই সুবিধা পাবেন।
এবং তাই আপনার কাছে একই API, একই .tflite মডেল, কিন্তু আরও সারফেস আছে।
প্রতিটি ফর্ম ফ্যাক্টরের জন্য আলাদা করে ইমপ্লিমেন্ট করার প্রয়োজন নেই, আপনি এইসব আলাদা আলাদা ডিভাইসের জন্য একই ইমপ্লিমেন্টেশন ব্যবহার করতে পারবেন।
এবং তারপরে Play পরিষেবা ডিস্ট্রিবিউশন প্যারাডাইমের সৌন্দর্য হল যে আমরা আসলে এটিকে পুরনো ডিভাইসে চালানোর জন্য ব্যাকপোর্ট করতে পারি।
তাই Android Automotive OS-এর জন্য, আমরা Android 11 পর্যন্ত পুরনো ভার্সনে কাজ করি, যা ২০২০ সালে রিলিজ করা হয়েছে এবং Wear OS-এর জন্য, আমরা Wear OS 4 এবং তার পরবর্তী ভার্সনে কাজ করি।
ঠিক আছে।
তাই, এখন আমি দুটি ভিন্ন পথ সম্পর্কে কথা বলতে যাচ্ছি, একটি নতুন অ্যাপ তৈরি করা এবং একটি বিদ্যমান অ্যাপ আপগ্রেড করা।
বাকি আলোচনাতে এই বিষয়েই কথা হবে।
তাই, আমি একটি উদাহরণ অ্যাপ দিয়ে শুরু করব যা LiteRT-এ চলা কাস্টম GPU মডেলের সাথে ML Kit-এর ব্যবহারকে একত্রিত করে।
এবং তারপরে আগে থেকে আছে এমন অ্যাপ আপগ্রেড করার জন্য তিনটি ছোট পরিবর্তন করতে হবে, ডিপেন্ডেন্সি আপডেট করার জন্য Gradle পরিবর্তন, Play পরিষেবায় LiteRT চালু করার জন্য init পরিবর্তন এবং তারপরে Interpreter API থেকে CompiledModel API-তে পরিবর্তন।
তবে আমরা প্রথমে নতুন অ্যাপটি করব, কারণ আপনি কিসে আপগ্রেড করছেন তা দেখার পরে আপগ্রেড করার বিষয়টি আরও বেশি অর্থপূর্ণ হয়।
তাহলে, নতুন অ্যাপ তৈরি করছেন।
আমরা এই অ্যাপটি তৈরি করতে চলেছি।
এতে লাইভ ক্যামেরা ভিউ থাকবে, যেখানে আপনাকে স্পষ্ট দেখাবে এবং ব্যাকগ্রাউন্ডে একটি শৈল্পিক স্টাইল থাকবে।
তাই, আমরা ক্যামেরা ফ্রেম নিতে চলেছি।
ক্যামেরা ফ্রেম থেকে পাওয়া ছবি, আমরা ML Kit সেলফি সেগমেন্টেশনের মাধ্যমে স্ট্রিম করতে চলেছি।
এটি আগে থেকে থাকা ML Kit টার্নকী API-এর মধ্যে একটি।
এবং এটি একটি ফোরগ্রাউন্ড মাস্ক তৈরি করবে যা মূলত বলবে যে ছবির কোন পিক্সেলগুলি ছবির ব্যক্তির সাথে সম্পর্কিত।
তারপর আমরা আমাদের কাস্টম মডেল ব্যবহার করব, যা স্টাইল ট্রান্সফার টাইপ মডেলের মতো, এটি কোনও ছবিতে স্টাইল প্রয়োগ করবে।
আর আমরা সেটা পুরো ক্যামেরা ফ্রেমে প্রয়োগ করতে চলেছি, তবে আমরা আসলে শুধু ব্যাকগ্রাউন্ডের অংশ নিয়েই চিন্তিত, কারণ শেষ পর্যন্ত আমরা আসল ক্যামেরা ফ্রেম ও মাস্ক এবং স্টাইল ব্যাকগ্রাউন্ড নেব এবং একটু সহজ লজিক দিয়ে সেগুলি একত্রিত করব, যাতে আমাদের কাছে একটি কম্পোজিট ফ্রেম থাকে যেখানে আমরা সাবজেক্ট রেখেছি এবং ব্যাকগ্রাউন্ডে স্টাইল আছে।
তাই, আমরা টার্ন-কী API যেখানে আছে সেখানে ব্যবহার করতে চাই এবং কাস্টম API যেখানে আমাদের অ্যাপকে আলাদা করে সেখানে ব্যবহার করতে চাই।
তাহলে, এটি হল প্রথম অংশ যেখানে আমরা ML Kit সেলফি সেগমেন্টেশন API ইনভোক করি।
// 1. Configure and create segmenter client
val segmenter = Segmentation.getClient(
SelfieSegmenterOptions.Builder()
.setDetectorMode(
SelfieSegmenterOptions.STREAM_MODE)
.build())
// 2. Prepare image & run inference
fun processFrame(mediaImage: Image) {
val image = InputImage.fromMediaImage(
mediaImage, /* rotationDegrees= */ 0)
segmenter.process(image)
.addOnSuccessListener { mask -> … }
}তাহলে, এটি সাধারণ API-এর মতোই, তাই তো?
এটি Android ডেভেলপারদের জন্য অত্যন্ত গুরুত্বপূর্ণ।
আপনি API ডকুমেন্টেশন দেখতে পারেন অথবা Gemini-কে আপনার জন্য এটি তৈরি করতে বলতে পারেন।
তবে, আপনি জানেন, এটি বেশ সহজ।
আপনি একটি ক্লায়েন্ট তৈরি করেন এবং ক্লায়েন্ট তৈরি করার সময় কিছু বিকল্প পাস করেন।
এই ক্ষেত্রে, আমরা স্ট্রিমিং মোড নির্দিষ্ট করছি যাতে আমরা ভিডিও ফ্রেমের একটি স্ট্রিম প্রসেস করতে পারি।
এবং তারপরে, সেখানে একটি আপনি এই প্রসেস মেথডকে কল করেন, এবং সেখান থেকে কলব্যাকটি সেলফি সেগমেন্টেশন দ্বারা গণনা করা মাস্কটি পেতে চলেছে যা ফেরত দেওয়া হয়েছে।
এবং ইনপুট হল ক্যামেরা থেকে পাওয়া ছবি।
এবং এই সমস্ত API অ্যাপ্লিকেশন-লেভেল টাইপ ব্যবহার করে, র টেনসর নয়, তাই আপনি সত্যিই খুব উচ্চ স্তরে প্রোগ্রামিং করছেন এবং এটি সত্যিই সহজ।
সেই জন্য, দ্বিতীয় অংশ, কাস্টম মডেল, আমরা PyTorch মডেল ব্যবহার করব।
আমার মনে হয় চিন্তন Kaggle বা Hugging Face-এর মতো কোনও জায়গা থেকে এটি পেয়েছে…
ডানে।
হ্যাঁ, এবং অথবা আপনি নিজেরটা কনভার্ট করতে পারেন, আপনি জানেন।
আপনি নিজের মডেল তৈরি করতে পারবেন।
ফিরে যাচ্ছি।
হ্যাঁ, এই ধরনের স্ট্যাক দেখতে এরকম হয়।
আপনি PyTorch মডেল নিয়ে সেটি কনভার্ট ও কোয়ান্টাইজ করতে পারেন এবং তারপরে LiteRT মডেল পাবেন।
তারপর আপনি নিজের অ্যাপের মাধ্যমে আপনার পছন্দমতো সেটি ডিস্ট্রিবিউট করেন।
এটি অ্যাপের অংশ হিসেবে অ্যাসেট হিসেবে বান্ডেল করা যেতে পারে বা আলাদাভাবে ডাউনলোড করা যেতে পারে।
যেকোনও একটি উপায় কাজ করবে।
এবং তারপর এটি Play পরিষেবায় LiteRT রানটাইমের উপরে বসে।
এবং তারপরে, CPU-তে অপ্টিমাইজ করার জন্য CPU কার্নেল আছে এবং ML Drift হল GPU অ্যাক্সিলারেটরের নাম।
হ্যাঁ, আমি যেমন বলেছি, আপনি TFLite মডেল পাবেন, আপনি নিজে মডেলটিকে ট্রেনিং দিতে পারেন, একটি বিদ্যমান মডেল খুঁজে নিতে পারেন, যেকোনও উপায়ে এটি কাজ করে।
PyTorch থেকে কনভার্ট করার জন্য Python-এর মাত্র কয়েকটি লাইন প্রয়োজন।
import litert_torch
model = my_models.Stylizer().eval()
# Convert with torch.export under the hood
edge_model = litert_torch.convert(
model, sample_inputs)
edge_model.export("stylizer_f32.tflite")তাই, আপনি pip-এর মাধ্যমে LiteRT-Torch ইনস্টল করেন, litert_torch.convert কল করেন, এটিকে কিছু sample_inputs পাস করেন যা র্যান্ডম ইনপুট হতে পারে এবং আপনি একটি TFLite ফাইল এক্সপোর্ট করেন।
আপনি ai-edge-torch-এর সাথে পরিচিত হলে, জেনে রাখুন যে LiteRT-Torch হল ai-edge-torch-এর নতুন নাম।
এবং তারপর কোয়ান্টাইজেশন, আবার, খুব সহজ।
# Python
# previously ai_edge_quantizer
from litert_quantizer import quantizer, recipe
qt = quantizer.Quantizer("stylizer_f32.tflite")
# int8 weights, float activations
qt.load_quantization_recipe(
recipe.dynamic_wi8_afp32())
qt.quantize().export_model("stylizer_int8.tflite")আপনি LiteRT Quantizer থেকে কোয়ান্টাইজার ও রেসিপি ইমপোর্ট করেন।
আপনি যখন কোয়ান্টাইজার তৈরি করেন, তখন আপনি আসল ফ্লোটিং-পয়েন্ট মডেল পাস করেন, আপনি একটি রেসিপি পাস করেন যা GPU-এর জন্য আমরা সাজেস্ট করি, যা ৮-বিট ইন্টিজার ওয়েট ব্যবহার করে, কিন্তু অ্যাক্টিভেশনগুলিকে ৩২-বিট ফ্লোটিং পয়েন্ট হিসেবে রাখে।
তারপর, আপনি শুধু কোয়ান্টাইজ কল করুন এবং তারপর আউটপুট মডেল সেভ করতে export_model করুন।
এটি একটি কোয়ান্টাইজড মডেল হবে যা আপনি রান করতে পারবেন এবং এর ওয়েট অনেক কম হবে এবং এটি আরও দক্ষতার সাথে এক্সিকিউট হবে।
ঠিক আছে, তাহলে হ্যাঁ, CompiledModel API-এর GPU-তে এটি সত্যিই উজ্জ্বল।
তাই, চিন্তন যেমন উল্লেখ করেছেন, আপনি জানেন, লিগ্যাসি TFLite GPU-তে উল্লেখযোগ্য স্পিড আপ।
মডেল অনুযায়ী সঠিক সংখ্যা কিছুটা আলাদা হতে পারে, তবে ১.৪ গুণ হল এমন একটি সংখ্যা যা আপনি যুক্তিসঙ্গতভাবে আশা করতে পারেন।
CPU ইনফারেন্সের থেকে ১০ গুণ বেশি দ্রুত, তাই এটি একটি বড় জয়, তাই না?
আপনি যদি মো- আপনাদের মধ্যে বেশিরভাগই যারা আজ মডেল ব্যবহার করছেন তারা সম্ভবত সেগুলি CPU-তে চালাচ্ছেন এবং GPU থেকে আপনি পেতে পারেন এমন পারফরম্যান্সের মতো ফ্যাক্টর মিস করছেন।
তাই, এটি একটি আসল ইনসেনটিভ।
কী কারণে এটি দ্রুত কাজ করে?
ঠিক আছে, তাই আমরা অনেক কিছু সাপোর্ট করি, যেমন, অ্যাসিঙ্ক্রোনাস এক্সিকিউশন যাতে আপনি একটি AHardwareBuffer নিতে পারেন এবং সরাসরি সেটি পাস করতে পারেন বা সেই ক্যামেরা রেন্ডার পাইপলাইন থেকে একটি OpenGL বাফার, সরাসরি একটি টেনসর বাফারে পাস করতে পারেন।
জিরো-কপি অপ্টিমাইজ জিরো-কপি আমরা সাপোর্ট করি, তাই মূলত আপনি যখন জিনিসগুলি প্রসেস করার চেষ্টা করছেন, আপনি জানেন, কম-লেটেন্সি বাজেটের সাথে যেমন আপনাকে প্রতিটি ফ্রেম প্রসেস করতে হবে, আপনি জানেন, কয়েক দশ মিলিসেকেন্ড, তারপর এমনকি সহজভাবে একটি মেমরি বাফার কপি করা একটি নন-ট্রিভিয়াল ওভারহেড হতে পারে।
তাই, রিয়েল-টাইম প্রয়োজনীয়তা অনেক বেশি এমন অ্যাপ্লিকেশনের জন্য আপনি জিরো-কপি অপ্টিমাইজেশন ব্যবহার করতে চাইলে, আমরা তা সাপোর্ট করি।
এবং তারপরে, যেমন, যেমন চিন্তন উল্লেখ করেছেন, এটি OpenGL, OpenCL এবং Metal-এর জন্য সহায়তা সহ ক্রস-প্ল্যাটফর্ম, GPU ব্যাক এন্ড হিসাবে।
সবশেষে, ML Drift অপ্টিমাইজার হল ওপেন-সোর্স।
এটি Apache লাইসেন্সের অধীনে উপলভ্য।
Google সম্প্রতি এটি ওপেন-সোর্স করেছে।
ঠিক আছে, তারপর, এই হল, এই হল অ্যাপ কোড।
// Kotlin
// Build once, off the main thread.
private val model: CompiledModel =
CompiledModel.create(
context.assets,
"stylizer_int8.tflite",
// Simple GPU setup!
CompiledModel.Options(Accelerator.GPU),
environment
)
// Reuse buffers across frames.
private val inputBuffers = model.createInputBuffers()
private val outputBuffers = model.createOutputBuffers()
fun stylize(input: FloatArray): FloatArray {
inputBuffers[0].writeFloat(input)
model.run(inputBuffers, outputBuffers) // sync
return outputBuffers[0].readFloat()
}আপনি দেখতেই পাচ্ছেন, এটি বেশ ছোট এবং সহজ।
তাই, আপনি একবার মডেল তৈরি করেন এবং তারপর প্রতিটি ফ্রেমে এটি আবার ব্যবহার করেন।
তাই, .tflite ফাইলে CompiledModel.createটি পাস আছে।
আপনি শুধু উল্লেখ করুন যে আপনি GPU-তে রান করতে চান এবং তারপরে ইনপুট ও outputBuffers তৈরি করুন।
তারপর, মূল লুপে, যেখানে আপনি আসলে প্রতিটি ফ্রেম প্রসেস করছেন, আপনি ইনপুট, আউটপুট পাস করে এই model.run কল করেন।
inputBuffers-এ লেখার পরে, model.run-এ কল করুন এবং তারপর outputBuffers থেকে পড়ুন।
ঠিক আছে।
হ্যাঁ, এবং তারপরে, আপনি যদি সেখানে GPU উল্লেখ করেন, তাহলে এটি GPU-তে রান করবে।
আপনি সেখানে CPU ও GPU উল্লেখ করলে, এটি GPU চালানোর চেষ্টা করবে।
কোনও কারণে GPU উপলভ্য না থাকলে, এটি CPU-তে ফিরে যাবে।
তাই, কিছু ক্ষেত্রে, আপনার অ্যাপের জন্য CPU ফলব্যাক যথেষ্ট দক্ষ নাও হতে পারে এবং তখনই আপনি ঠিক সেভাবে GPU নির্দিষ্ট করতে চান।
সাধারণত, আপনি CPU ফলব্যাক করতে চান।
ঠিক আছে।
তাই, আমরা এটি বান্ডেল করা LiteRT-এর সাথে তৈরি করেছি, যা এখনও Play পরিষেবা ব্যবহার করছে না।
তাহলে, Play পরিষেবায় LiteRT কীভাবে ব্যবহার করতে হয় তা আপনাকে দেখাই।
সুতরাং, তিনটি পরিবর্তন আছে: প্রথমটি হল নির্ভরতা পরিবর্তন।
// Easier with CompiledModel API: 3 steps
// 1. app/build.gradle: replace litert with play-services-litert
- implementation 'com.google.ai.edge.litert:litert:...'
+ implementation 'com.google.android.gms:play-services-litert:17.0.0' // also pulls in litert-apiআপনি শুধু আপনার Gradle ফাইলে বা অন্য কোথাও, আপনি যে বিল্ড সিস্টেমই ব্যবহার করছেন না কেন, অন্য যেখানেই আপনি Maven প্যাকেজ ডিপেন্ডেন্সি নির্দিষ্ট করেছেন, সেখানে এটি পরিবর্তন করতে হবে।
এবং আপনি litert ডিপেন্ডেন্সি বা পুরনো TensorFlow Lite Maven প্যাকেজ ডিপেন্ডেন্সি সরিয়ে দিয়ে সেগুলির পরিবর্তে play-services-litert ব্যবহার করেন।
এটি litert-api প্যাকেজও ডাউনলোড করে।
এখন, আপনি যদি এমন একটি মিডল লেয়ার লেখেন যা শুধু LiteRT-এর উপর নির্ভর করতে চায়, কিন্তু রান টাইম অ্যাপ থেকে আসছে নাকি Play পরিষেবা থেকে আসছে তা নিয়ে সত্যিই চিন্তা করে না, তাহলে আপনি শুধু LiteRT API-এর উপর নির্ভর করতে পারেন এবং ইনপুট প্যারামিটার হিসেবে একটি এনভায়রনমেন্ট নিতে পারেন।
তাই, দ্বিতীয় ধাপ হল পরিবেশ সংক্রান্ত প্যারামিটার।
সেখানেই আপনি ডিপেন্ডেন্সি ইনজেকশন প্রদান করেন, মূলত, আপনি যে Play পরিষেবা LiteRT ব্যবহার করছেন বা করতে চান তা নির্দিষ্ট করার জন্য।
তাই, আপনি gms.litert.LiteRt ইমপোর্ট করেন এবং আপনার Android অ্যাক্টিভিটি, অর্থাৎ কনটেক্সট পাস করে ইনিশিয়ালাইজ ফাংশন কল করেন।
// 2. Initialize the LiteRT Environment from Play services (context = your Activity)
- val environment = Environment.create(...)
+ import com.google.android.gms.litert.LiteRt
+ val environment = LiteRt.initialize(context).await()
// 3. Pass environment whenever you call CompiledModel.create
// That's it! The rest of your app uses the normal CompiledModel APIs from litert-api.এবং এটি একটি অ্যাসিঙ্ক্রোনাস জিনিস, তাই আপনাকে .await কল করতে হবে বা বাকিটা কলব্যাকের উপর ভিত্তি করে করতে হবে।
এবং তারপরে, অবশেষে, আপনি একবার সেই এনভায়রনমেন্ট পেয়ে গেলে, আপনি যখনই CompiledModel.create-কে কল করবেন তখনই সেই এনভায়রনমেন্ট পাস করবেন।
এবং এর ফলে এটি Play পরিষেবা থেকে Play পরিষেবা LiteRT রানটাইম ব্যবহার করবে।
আর তাই, এটাই।
অর্থাৎ, আপনার অ্যাপের বাকি অংশ LiteRT API থেকে ঠিক একই LiteRT CompiledModel API ব্যবহার করে।
Play পরিষেবা ব্যবহার করার জন্য আপনার বাকি ইনফারেন্স কোড পরিবর্তন হয় না।
এবং আপনি আসলে সেই মাইগ্রেশন ইনক্রিমেন্টাল হিসেবে করতে পারবেন।
আপনাকে একবারে সব করতে হবে না, আপনি একবারে একটি কম্পোনেন্ট মাইগ্রেট করতে পারবেন।
আপনার কাছে কোনও বড় অ্যাপ থাকলে, LiteRT ব্যবহার করছে এমন প্রতিটি কম্পোনেন্ট মাইগ্রেট করা যুক্তিযুক্ত এবং তারপরে আপনি একবারে একটি মাইগ্রেট করতে পারবেন, একবারে একটি পরীক্ষা করতে পারবেন।
তবে, বান্ডেল করা রানটাইমের উপর শেষ নির্ভরতা সরিয়ে দিলে তবেই আপনি সাইজ উইন ও স্পেস সেভিংসের সুবিধা পাবেন।
আর, আপনি যদি তা করেন, তাহলে অন্য সতর্কতা হল যে Play পরিষেবায় LiteRT এবং বান্ডেল করা LiteRT-এর মধ্যে অবজেক্ট মিক্স করা উচিত নয়।
তাই, আপনি যদি-- আপনি যদি Play পরিষেবায় LiteRT থেকে টেনসর বা কম্পাইল করা মডেল বা ইন্টারপ্রেটার পান, তাহলে সেগুলি বান্ডেল করা LiteRT-তে পাস করবেন না বা এর উল্টোটাও করবেন না।
তবে, এগুলি মিশিয়ে ব্যবহার করলে কোনও সমস্যা হয় না।
ঠিক আছে।
সুতরাং, এটি ছিল একটি নতুন অ্যাপ তৈরি করা।
এখন আমি আগে থেকে থাকা অ্যাপ কীভাবে আপগ্রেড করতে হয় সেই সম্পর্কে বলব।
তাই, আপনার কাছে আগে থেকেই এমন অ্যাপ থাকতে পারে যা ইন্টারপ্রেটার API ব্যবহার করছে।
এটি হল এটি হল আমরা যাকে পুরনো TFLite API বলি যা ছিল যা ইন্টারপ্রেটারকে প্রধান ক্লাস হিসেবে ব্যবহার করে।
সুতরাং, এটি হল Interpreter API ব্যবহার করে বাঁদিকে দেখানো কোড এবং তারপরে ডানদিকে আপনি নতুন CompiledModel API কোড দেখতে পাবেন।
// Dependencies (Gradle):
// play-services-tflite-java and/or litert (bundled)
// Init
TfLite.initialize(context).await()
// Load
val interpreterOptions =
InterpreterApi.Options().apply {
runtime = TfLiteRuntime.FROM_SYSTEM_ONLY
}
val interpreter =
InterpreterApi.create(modelFile, interpreterOptions)
// Prepare inputs/outputs
val inputs = …
val outputs = …
// Execute
interpreter.run(inputs, outputs)// Dependencies (Gradle):
// play-services-litert
// Init
val environment =
LiteRt.initialize(context).await()
// Load
val modelOptions = CompiledModel.Options(Accelerator.CPU)
val model =
CompiledModel.create(modelPath, modelOptions, environment)
// Prepare inputs/outputs
val inputBuffers = model.createInputBuffers()
val outputBuffers = model.createOutputBuffers()
// Execute
model.run(inputBuffers, outputBuffersসুতরাং, আপনি শুধু TfLite.initialize থেকে LiteRt.initialize-এ পরিবর্তন করছেন এবং এটি এখন একটি এনভায়রনমেন্ট রিটার্ন করে।
তারপর আপনি CompiledModel.create-এ এনভায়রনমেন্ট পাস করেন।
তাই, এটি একটি ছোট পরিবর্তন, APK-এর সাইজ বাড়েনি।
এবং আপনি দেখতে পাবেন, পরবর্তী স্লাইডে, আমরা আপনাকে দেখাব কীভাবে GPU-এর মাধ্যমে এটি করতে হয় এবং এটি আরও একটি বিকল্প।
তাহলে, GPU চালু করার জন্য এই অতিরিক্ত কোডটি আপনার প্রয়োজন।
// Dependencies (Gradle):
// play-services-tflite-java and/or litert (bundled)
// Init
val initOptions = TfLiteInitializationOptions.builder()
.setEnableGpuDelegateSupport(true).build()
TfLite.initialize(context, initOptions).await()
val useGpu =
TfLiteGpu.isGpuDelegateAvailable(context).await()
// Load
val interpreterOptions =
InterpreterApi.Options().apply {
runtime = TfLiteRuntime.FROM_SYSTEM_ONLY
}
if (useGpu) {
interpreterOptions.addDelegateFactory(
GpuDelegateFactory());
}
val interpreter =
InterpreterApi.create(modelFile, interpreterOptions)
// Prepare inputs/outputs
val inputs = …
val outputs = …
// Execute
interpreter.run(inputs, outputs)// Dependencies (Gradle):
// play-services-litert
// Init
val initOptions = LiteRtInitializationOptions.builder()
.setEnableGpu(true).build()
val environment = LiteRt.initialize(context, initOptions).await()
// Load
val modelOptions =
CompiledModel.Options(Accelerator.CPU, Accelerator.GPU)
val model =
CompiledModel.create(modelPath, modelOptions, environment)
// Prepare inputs/outputs
val inputBuffers = model.createInputBuffers()
val outputBuffers = model.createOutputBuffers()
// Execute
model.run(inputBuffers, outputBuffers)আপনি দেখতে পাচ্ছেন, GPU চালু করার জন্য নতুন API-এর কোডটি একটু সহজ-- হ্যাঁ, আগের কোডের চেয়ে সহজ।
তাই, LiteRT ইনিশিয়ালাইজেশন বিকল্পে setEnableGpu-এ প্রথম কল যা আপনি LiteRt.initialize-এ পাস করেন, তার ফলে GPU অ্যাক্সিলারেটরের কোড আপনার অ্যাপে লোড হবে।
তারপর, আপনি যখন modelOptions তৈরি করেন এবং CompiledModel.create-এ পাস করেন, তখন আপনি নির্দিষ্ট করেন যে কোনও নির্দিষ্ট মডেলের জন্য কোন অ্যাক্সিলারেটর ব্যবহার করা হবে, আপনি অন্য মডেলটি শুধুমাত্র GPU-তে চালাতে চান, নাকি CPU ফলব্যাক সহ GPU-তে, নাকি শুধুমাত্র CPU-তে।
ঠিক আছে।
হ্যাঁ, আপনি দেখতেই পাচ্ছেন, নতুন API-এর মাধ্যমে GPU চালু করা অনেক সহজ।
তাহলে, আপনি আসলে কী সুবিধা পাবেন?
চিন্তন আপনাকে বলবে।
ঠিক আছে।
ঠিক আছে, ধন্যবাদ ফার্গাস।
তাহলে, এই সমস্ত কিছু থেকে আমরা কী পাই, সেই সম্পর্কে কথা বলা যাক, তাই না?
মনে আছে, আমরা বলেছিলাম যে একটি অ্যাপ তৈরি করব, তাই আসুন দেখা যাক আমরা আসলে কী তৈরি করেছি, ঠিক আছে?
যাই হোক, এটি আমি এবং আমরা এখানে যা করেছি তা হল, আমাকে খুঁজে পেতে ML Kit ব্যবহার করেছি, তাই ML Kit-এর মতো টার্নকী API-এর মাধ্যমে সেগমেন্টেশন করা হচ্ছে।
তাই, আমি শুধু সেখানে আমার মাথা খুঁজে পাচ্ছি।
তারপর, ব্যাকগ্রাউন্ড আঁকার জন্য LiteRT, স্টাইল ট্রান্সফারের মতো অন্য একটি মডেলের স্টাইল ব্যবহার করে।
আর অন্যান্য সুবিধাগুলি যেমন আমরা উল্লেখ করেছি, আপনি স্পেস সেভিংসে প্রায় ৮ এমবি পাবেন, আপনার কাছে এখন একটি রানটাইম আছে যা আপনার সমস্ত অ্যাপের মধ্যে ব্যবহার করা হয়, বা অন্তত এখানে শেয়ার করা হয়েছে এবং আপনি অটোমেটিক আপডেট পাবেন এবং আপনার কাছে একটি দ্রুত GPU আছে যা আপনাকে সমৃদ্ধ ব্যবহারকারীর অভিজ্ঞতার জন্য রিয়েল-টাইম হতে হবে এমন কিছুতে প্রতি সেকেন্ডে প্রায় ৩০ ফ্রেম দেয়।
এছাড়াও, ভাল বিষয় হল, আপনাকে এইসব কাজ ম্যানুয়ালি করতে হবে না।
এছাড়াও, Android-এ আমরা নতুন একটি স্কিল লঞ্চ করেছি, মূলত আমরা Android LiteRT স্কিল প্রকাশ করেছি যা আপনার অন-ডিভাইস ML-কে কয়েক মিনিটের মধ্যে আপগ্রেড করে, তাই তো?
তাই, আপনি এর মাধ্যমে কয়েকটি কাজ করতে পারবেন: আপনি আগে থেকে থাকা অ্যাপ আপগ্রেড করতে পারবেন, নতুন অ্যাপ স্ক্যাফোল্ড করতে পারবেন, এছাড়াও এই নতুন Play পরিষেবা ইন্টিগ্রেশন ব্যবহার করার জন্য আপনার অ্যাপ আপগ্রেড করতে পারবেন।
সুতরাং, এই সমস্ত কিছু উপলভ্য।
লিঙ্কটি স্লাইডে আছে, এটি GitHub-এও আছে এবং এটি আমাদের ডকুমেন্টেশন এবং আমাদের ব্লগেও দেখানো হবে।
এবং হ্যাঁ, তাই এটি এমন যেকোনও ব্যক্তির জন্য উপযোগী হওয়া উচিত যিনি শীঘ্রই পরিবর্তন করতে চাইছেন।
তাহলে, ফার্গাস আমাদের বলবেন যে এর পরে কী হতে চলেছে।
তাই, আমরা LiteRT-এর মাধ্যমে অন-ডিভাইস AI-এর জন্য প্রতিশ্রুতিবদ্ধ।
আমরা GPU অ্যাক্সিলারেশন এবং মডেল কভারেজ উন্নত করার জন্য উল্লেখযোগ্যভাবে বিনিয়োগ করা চালিয়ে যাচ্ছি এবং LiteRT 2.x-এর জন্য নিয়মিত আপডেট প্রদান করা চালিয়ে যাচ্ছি, ওপেন সোর্স বান্ডিল করা LiteRT এবং Play পরিষেবা LiteRT Maven প্যাকেজ, অর্থাৎ Play পরিষেবায় LiteRT, উভয়ের জন্যই।
এছাড়াও, আমরা ব্যাকওয়ার্ড কম্প্যাটিবিলিটি প্রদান করা চালিয়ে যাব।
Play পরিষেবা রানটাইম পুরনো SDK দিয়ে তৈরি অ্যাপকে সাপোর্ট করা চালিয়ে যাবে।
হ্যাঁ।
আপনি জানেন যে এটি আমাদের ব্যবহারকারীদের জন্য সত্যিই গুরুত্বপূর্ণ, এটি আমাদের কাছে সত্যিই গুরুত্বপূর্ণ।
LiteRT 1.x SDK-এর ক্ষেত্রে, সেগুলি এখন রক্ষণাবেক্ষণ মোডে রয়েছে, তাই শুধুমাত্র গুরুত্বপূর্ণ নিরাপত্তা সংক্রান্ত সমস্যার সমাধান করা হয়।
আর NNAPI, যা আমরা ২০২৪ সালে বন্ধ করে দিয়েছিলাম, তা সরিয়ে দেওয়া হচ্ছে এবং ২০২৭ থেকে এটি সরিয়ে দেওয়া শুরু হতে পারে।
তাই, আপনি NNAPI ব্যবহার করলে, বান্ডেল করা LiteRT-এর সাথে GPU অ্যাক্সিলারেশন বা NPU অ্যাক্সিলারেশন ব্যবহার করার জন্য সেগুলি পরিবর্তন করুন।
ঠিক আছে।
হ্যাঁ।
তাই, যত তাড়াতাড়ি আপনি 2.x এবং CompiledModel-এ চলে যাবেন, পরে আপনাকে তত কম কাজ করতে হবে।
তাহলে, তিনটি জিনিস মনে রাখতে হবে।
তাই, তৈরি করুন।
ML Kit দিয়ে শুরু করুন এবং এটি যদি আপনার প্রয়োজন পূরণ করে, তাহলে তো খুবই ভালো।
কিন্তু তা না হলে, আপনার কাস্টম মডেলের জন্য LiteRT ব্যবহার করুন।
APK সেভিংস ও শেয়ার করা রানটাইমের জন্য Google Play পরিষেবায় LiteRT-তে আপগ্রেড করুন।
আরও দ্রুত ও সহজে GPU ইনফারেন্সের জন্য CompiledModel API ব্যবহার করার কথা বিবেচনা করুন।
হ্যাঁ।
AI Edge-এ আমাদের LiteRT ডকুমেন্টেশন সাইটে সবকিছু ডকুমেন্ট করা আছে, URL-টি ঠিক সেখানেই রয়েছে।
তাহলে, হ্যাঁ।
আমাদের সাথে যোগ দেওয়ার জন্য ধন্যবাদ, এবং আমরা দেখতে চাই-- আপনারা কী তৈরি করেন তা দেখার জন্য অপেক্ষা করছি।
// 1. Configure and create segmenter client
val segmenter = Segmentation.getClient(
SelfieSegmenterOptions.Builder()
.setDetectorMode(
SelfieSegmenterOptions.STREAM_MODE)
.build())
// 2. Prepare image & run inference
fun processFrame(mediaImage: Image) {
val image = InputImage.fromMediaImage(
mediaImage, /* rotationDegrees= */ 0)
segmenter.process(image)
.addOnSuccessListener { mask -> … }
}import litert_torch
model = my_models.Stylizer().eval()
# Convert with torch.export under the hood
edge_model = litert_torch.convert(
model, sample_inputs)
edge_model.export("stylizer_f32.tflite")# Python
# previously ai_edge_quantizer
from litert_quantizer import quantizer, recipe
qt = quantizer.Quantizer("stylizer_f32.tflite")
# int8 weights, float activations
qt.load_quantization_recipe(
recipe.dynamic_wi8_afp32())
qt.quantize().export_model("stylizer_int8.tflite")// Kotlin
// Build once, off the main thread.
private val model: CompiledModel =
CompiledModel.create(
context.assets,
"stylizer_int8.tflite",
// Simple GPU setup!
CompiledModel.Options(Accelerator.GPU),
environment
)
// Reuse buffers across frames.
private val inputBuffers = model.createInputBuffers()
private val outputBuffers = model.createOutputBuffers()
fun stylize(input: FloatArray): FloatArray {
inputBuffers[0].writeFloat(input)
model.run(inputBuffers, outputBuffers) // sync
return outputBuffers[0].readFloat()
}// Easier with CompiledModel API: 3 steps
// 1. app/build.gradle: replace litert with play-services-litert
- implementation 'com.google.ai.edge.litert:litert:...'
+ implementation 'com.google.android.gms:play-services-litert:17.0.0' // also pulls in litert-api// 2. Initialize the LiteRT Environment from Play services (context = your Activity)
- val environment = Environment.create(...)
+ import com.google.android.gms.litert.LiteRt
+ val environment = LiteRt.initialize(context).await()
// 3. Pass environment whenever you call CompiledModel.create
// That's it! The rest of your app uses the normal CompiledModel APIs from litert-api.// Dependencies (Gradle):
// play-services-tflite-java and/or litert (bundled)
// Init
TfLite.initialize(context).await()
// Load
val interpreterOptions =
InterpreterApi.Options().apply {
runtime = TfLiteRuntime.FROM_SYSTEM_ONLY
}
val interpreter =
InterpreterApi.create(modelFile, interpreterOptions)
// Prepare inputs/outputs
val inputs = …
val outputs = …
// Execute
interpreter.run(inputs, outputs)// Dependencies (Gradle):
// play-services-litert
// Init
val environment =
LiteRt.initialize(context).await()
// Load
val modelOptions = CompiledModel.Options(Accelerator.CPU)
val model =
CompiledModel.create(modelPath, modelOptions, environment)
// Prepare inputs/outputs
val inputBuffers = model.createInputBuffers()
val outputBuffers = model.createOutputBuffers()
// Execute
model.run(inputBuffers, outputBuffers// Dependencies (Gradle):
// play-services-tflite-java and/or litert (bundled)
// Init
val initOptions = TfLiteInitializationOptions.builder()
.setEnableGpuDelegateSupport(true).build()
TfLite.initialize(context, initOptions).await()
val useGpu =
TfLiteGpu.isGpuDelegateAvailable(context).await()
// Load
val interpreterOptions =
InterpreterApi.Options().apply {
runtime = TfLiteRuntime.FROM_SYSTEM_ONLY
}
if (useGpu) {
interpreterOptions.addDelegateFactory(
GpuDelegateFactory());
}
val interpreter =
InterpreterApi.create(modelFile, interpreterOptions)
// Prepare inputs/outputs
val inputs = …
val outputs = …
// Execute
interpreter.run(inputs, outputs)// Dependencies (Gradle):
// play-services-litert
// Init
val initOptions = LiteRtInitializationOptions.builder()
.setEnableGpu(true).build()
val environment = LiteRt.initialize(context, initOptions).await()
// Load
val modelOptions =
CompiledModel.Options(Accelerator.CPU, Accelerator.GPU)
val model =
CompiledModel.create(modelPath, modelOptions, environment)
// Prepare inputs/outputs
val inputBuffers = model.createInputBuffers()
val outputBuffers = model.createOutputBuffers()
// Execute
model.run(inputBuffers, outputBuffers)