Android 17 ও এর পরবর্তী যেকোনও ভার্সনে নিউরাল প্রসেসিং
ইউনিট (NPU) ম্যানেজার (com.android.npumanager) কাজ করে, যা সিস্টেম পরিষেবা ও অ্যাপ্লিকেশন
ওয়ার্কলোড জুড়ে NPU রিসোর্সের অ্যালোকেশন
ও শিডিউলিং কোঅর্ডিনেট করে। কাস্টম ভেন্ডর ডেমনের থেকে রিসোর্স আরবিট্রেশনকে
Android প্ল্যাটফর্মে সরিয়ে নিয়ে, NPU ম্যানেজার প্রেডিক্টেবিলিটি বাড়ায়, রিসোর্স
স্টারভেশন প্রতিরোধ করে, থার্মাল বাউন্ডারি ম্যানেজ করে এবং সামগ্রিক ডিভাইস পারফর্ম্যান্স উন্নত করে।
পটভূমি ও অনুপ্রেরণা
NPU ম্যানেজার আসার আগে, অ্যাপ ও সিস্টেম মডিউল সরাসরি ভেন্ডর ড্রাইভার বা প্রোপ্রাইটরি পরিষেবায় ওয়ার্কলোড জমা দিত। এই পদ্ধতিতে কিছু অসুবিধা দেখা যায়:
- অদক্ষ রিসোর্স প্রতিযোগিতা: ভারী মেশিন লার্নিং ওয়ার্কলোড (যেমন লার্জ ল্যাঙ্গুয়েজ মডেল (LLM) ইনফারেন্স ইঞ্জিন বা অন-ডিভাইস ভিশন সিস্টেম) সীমিত NPU রিসোর্সের জন্য (যেমন SRAM, ওয়েট মেমরি ও এক্সিকিউশন চ্যানেল) অন্যান্য হাই-প্রPriority সিস্টেমের সাথে সরাসরি প্রতিযোগিতা করে।
- সিস্টেমের অস্থিরতা: আনকোঅর্ডিনেটেড ওয়ার্কলোড থার্মাল থ্রটলিং, মেমরি পেজ ফল্ট বা লো মেমরি কিলার ডেমনের (LMKD) মতো সমস্যা তৈরি করতে পারে, যদি চাহিদা হার্ডওয়্যারের ক্ষমতাকে ছাড়িয়ে যায়।
- অদক্ষ অগ্রাধিকার: সিস্টেম সার্ভার প্রসঙ্গ পরিবর্তনের প্রতিক্রিয়া হিসাবে NPU অগ্রাধিকার অ্যাডজাস্ট করতে পারে না, যেমন ব্যাকগ্রাউন্ড টাস্ক একটি বিশাল মডেল লোড করে যখন একটি লেটেন্সি-সংবেদনশীল ক্যামেরা পাইপলাইন বা ব্যবহারকারী সহকারী ফোরগ্রাউন্ডে সক্রিয় থাকে।
NPU ম্যানেজার সিস্টেম-লেভেল আরবিটার হিসেবে কাজ করে এইসব সমস্যার সমাধান করে। এটি মডেল লোডিং গেট করে এবং বর্তমান ডিভাইসের স্বাস্থ্য ও অ্যাপের অবস্থার উপর ভিত্তি করে ডায়নামিকালি এক্সিকিউশন প্রায়োরিটি অ্যাডজাস্ট করে।
সিস্টেম আর্কিটেকচার
NPU ম্যানেজারকে npu নামের একটি সিস্টেম সার্ভিস হিসেবে প্রয়োগ করা হয় যা Android ফ্রেমওয়ার্কের মধ্যে
রান করে। NPU ম্যানেজার, লো-লেভেল ভেন্ডর ড্রাইভার ইমপ্লিমেন্টেশন থেকে
শিডিউলিং নীতির হাই-লেভেল কোঅর্ডিনেশনকে আলাদা করে।
নিচের ডায়াগ্রামে NPU ম্যানেজার এনভায়রনমেন্ট লেয়ার দেখানো হয়েছে:

ছবি ১. NPU ম্যানেজার এনভায়রনমেন্ট লেয়ার।
প্রধান অংশ
- ফ্রেমওয়ার্ক API ক্লায়েন্ট (
android.npumanager.NpuManager): মডেল লোড রিজার্ভেশনের অনুরোধ করার জন্য ক্লায়েন্টদের দ্বারা ব্যবহৃত এন্ট্রি পয়েন্ট - সিস্টেম পরিষেবা (
npu): একটি সিস্টেম পরিষেবা যা মডেল লোড করার অনুমোদন দেয় এবং শিডিউলিংয়ের অগ্রাধিকার সংক্রান্ত নিয়মের উপর ভিত্তি করে প্রিএম্পশন কমান্ড ম্যানেজ করে - NPU শিডিউলিং HAL (
android.hardware.npu): AIDL-ভিত্তিক ইন্টারফেস যা Android অ্যাপের অগ্রাধিকার ফ্রেমওয়ার্ক ও ড্রাইভারের মধ্যে কলব্যাক রিলে করে - ভেন্ডর ড্রাইভার: একটি লো-লেভেল ড্রাইভার যা হার্ডওয়্যার এক্সিকিউশন ব্লক নিয়ন্ত্রণ করে এবং লো-লেভেল প্রায়োরিটাইজেশন মেকানিজম প্রয়োগ করে
SDK ও ফ্রেমওয়ার্ক API
লো-লেভেল নিউরাল নেটওয়ার্ক লাইব্রেরি কল করা বা মডেল ফাইল লোড করার আগে,
ফ্রেমওয়ার্ক ক্লায়েন্টদের অবশ্যই NpuManager পরিষেবার সাথে ইন্টার্যাক্ট করতে হবে। এটি করতে,
ক্লায়েন্ট প্রথমে মডেল লোড করার অনুরোধ জানায়, তারপরে সেই অনুরোধ ও
অনুমোদন ফ্লো কার্যকর করে।
মডেল লোড করার অনুরোধ
ModelLoadRequest-এর মাধ্যমে মডেল লোড করার অনুরোধ দেখানো হয়। এই অবজেক্টে এগুলি রয়েছে:
- অনন্য অনুরোধ আইডি
- মডেলের আনুমানিক সাইজ ক্লাস, যেমন
NPU_MODEL_SIZE_LESS_THAN_1GBঅথবাNPU_MODEL_SIZE_GREATER_THAN_2G - উদ্দিষ্ট অগ্রাধিকার, যেমন
NPU_MODEL_PRIORITY_BACKGROUND,NPU_MODEL_PRIORITY_NORMALবাNPU_MODEL_PRIORITY_OPPORTUNISTIC
নিচের কোডের উদাহরণে ২ জিবির চেয়ে বেশি
সাইজের সীমা এবং সাধারণ এক্সিকিউশন প্রায়োরিটি সহ ModelLoadRequest তৈরি করা হয়েছে:
ModelLoadRequest request = new ModelLoadRequest.Builder(requestId)
.setSize(NPU_MODEL_SIZE_GREATER_THAN_2G)
.setPriority(NPU_MODEL_PRIORITY_NORMAL)
.build();
অনুরোধ ও অনুমোদনের ফ্লো
ক্লায়েন্টরা requestCanLoadModel অ্যাসিঙ্ক্রোনাসভাবে ইনভোক করে:
npuManager.requestCanLoadModel(request, callback, executor);
NPU রিসোর্স উপলভ্য হলে, ফ্রেমওয়ার্ক নিম্নলিখিত ইভেন্ট সহ
ModelLoadRequestCallback ব্যবহার করে উত্তর দেয়:
onCanLoadModel(request, status, listener): অনুরোধ অনুমোদন করা হলে ফায়ার করা হয়। ক্লায়েন্ট একটিNpuManager.ModelLoadStatusListenerটোকেন পায়। ড্রাইভার মেমরিতে ক্লায়েন্ট মডেলটি সম্পূর্ণ লোড করার পরে, এটিকে অবশ্যইlistener.notifyModelLoaded(request)কল করতে হবে।onRequestUnloadModel(request)বাonRequestUnloadModel(request, reason): সিস্টেম রিসোর্স প্রেসার (যেমন, ইনকামিং ফোরগ্রাউন্ড অনুরোধ বা থার্মাল স্পাইক) অনুভব করলে এবং ক্লায়েন্টকে তার মডেল রিলিজ করতে হলে ফায়ার করা হয়। NPU রিসোর্স রিক্লেম করার পরে, ক্লায়েন্ট কল করেlistener.notifyModelUnloaded(request)।onModelLoadRequestComplete(request, status): ক্লায়েন্টকে চূড়ান্ত অনুরোধের লাইফসাইকেলে হওয়া পরিবর্তন, যেমন বাতিল করা, সম্পর্কে জানায়।
ক্লায়েন্ট cancelModelLoad(request) ব্যবহার করে বাকি থাকা আমন্ত্রণ বাতিল করতে পারবেন।
HAL ও ভেন্ডর ইন্টিগ্রেশন
NPU Manager-কে সাপোর্ট করতে, ডিভাইস-নির্দিষ্ট ভেন্ডর ইমপ্লিমেন্টেশনকে অবশ্যই android.hardware.npu AIDL পরিষেবা ইন্টারফেসের সাথে সামঞ্জস্যপূর্ণ হতে হবে।
শিডিউলিং কনফিগারেশন
SchedulingConfig AIDL
ব্যবহার করে সিস্টেম অ্যাপ প্রায়োরিটি রিলে করেSchedulingConfig AIDL স্ট্রাকচার যা
IScheduling.aidl-এ সংজ্ঞায়িত করা আছে:
package android.hardware.npu;
@VintfStability
parcelable SchedulingConfig {
int minPriority;
int maxPriority;
int uid;
int appPriority;
boolean hasDirectAccess;
boolean canAttributeOtherUid;
}
এই স্ট্রাকচার ব্যবহার করে, NPU ম্যানেজার অগ্রাধিকারের অ্যালাইনমেন্ট কোঅর্ডিনেট করে। যেমন, কোনও ব্যাকগ্রাউন্ড অ্যাপ যদি খুব বেশি অগ্রাধিকারযুক্ত কোনও জব জমা দেয়, তাহলে অগ্রাধিকার নিচের দিকে অ্যাডজাস্ট করা হয়, যাতে ফোরগ্রাউন্ড গ্রাফিক্সের সাথে ইন্টারফেয়ার না হয়।
টাস্কের স্ট্যাটাস ও প্রোফাইলিং
ভেন্ডর ড্রাইভারদের অবশ্যই ম্যানেজারকে NPU এক্সিকিউশন গ্রুপের লাইফসাইকেল স্ট্যাটাস সম্পর্কে রিপোর্ট করতে হবে।
WorkInfo টাস্ক ট্র্যাক করে (যা
WorkInfo.aidl-এ উল্লেখ করা আছে):
package android.hardware.npu;
import android.hardware.npu.NpuUuid;
@VintfStability
parcelable WorkInfo {
int id;
@nullable NpuUuid groupId;
int uid;
int debugPid;
int originalUid;
@nullable String debugFeatureId;
int jobPriority;
int effectivePriority;
long timestampMs;
int deviceNumber;
}
ইভেন্ট ডিবাউন্সিং
শিডিউলিং ফ্রেমওয়ার্ক, শিডিউলিং কলব্যাক রেজিস্ট্রেশনের মধ্যে
debounce_duration_ms প্যারামিটার ব্যবহার করে ইভেন্ট ডিবাউন্সিং কাজ করে।
এটি লগ ফ্লাডিং এড়ায় এবং দ্রুত বিজ্ঞপ্তি পাঠানো বন্ধ করে, যেমন,
রিপিট করা মডেলের জন্য পরপর শুরু ও শেষ হওয়ার ইভেন্ট।
কলব্যাক লাইফসাইকেল স্টেটগুলি নিচে উল্লেখ করা হয়েছে:
onWorkRequested: ভেন্ডর পরিষেবা ওয়ার্কলোড সারিবদ্ধ করেছে।onWorkStarted: ওয়ার্কলোড এক্সিকিউশন শুরু হয়।NPU_START_REASON_INITIAL: প্রথম এক্সিকিউশন রান।NPU_START_REASON_RESUMED: প্রি-এমপশনের পরে এক্সিকিউশন আবার শুরু হয়েছে।
onWorkEnded: ওয়ার্কলোড এক্সিকিউশন শেষ হয়েছে।NPU_END_REASON_COMPLETED: রান সম্পূর্ণ হয়েছে।NPU_END_REASON_CANCELLED_USER: ক্লায়েন্ট বাতিল করেছেন।NPU_END_REASON_CANCELLED_SYSTEM: সিস্টেম নীতি অনুযায়ী প্রি-এম্পট করা হয়েছে।NPU_END_REASON_FAILED: এক্সিকিউশন সংক্রান্ত সমস্যা বা ড্রাইভার কাজ করছে না।NPU_END_REASON_PAUSED: বেশি অগ্রাধিকারযুক্ত টাস্কের জন্য সাময়িকভাবে সাসপেন্ড করা হয়েছে।
ডিভাইস রেডি করা ও পরীক্ষা করা
ডিভাইসের অবস্থা যাচাই করার আগে এইসব কনফিগারেশন ঠিক আছে কিনা তা নিশ্চিত করুন।
অ্যাপ্লিকেশন সংক্রান্ত ঘোষণা
যেসব ক্লায়েন্ট NPU শিডিউলিং অগ্রাধিকার চায়, তাদের AndroidManifest.xml-এ NPU হার্ডওয়্যার
ফিচার ঘোষণা করতে হবে:
<uses-feature android:name="android.hardware.npu" android:required="false" />
পার্টনার হার্ডওয়্যারের নতুন জেনারেশনে ডিপ্লয় করা মডেলের জন্য, এই ঘোষণা অপ্টিমাল ইঞ্জিন তৈরির জন্য প্রয়োজন হতে পারে।
VTS ইন্টিগ্রেশন টেস্টিং
NPU HAL প্রয়োগ VTS ফাংশনাল টেস্টের মাধ্যমে যাচাই করা যেতে পারে, যেমন
VtsHalNpuSchedulingTargetTest।