Android 17 और इसके बाद के वर्शन में, न्यूरल प्रोसेसिंग यूनिट (एनपीयू) मैनेजर (com.android.npumanager) काम करता है. यह सिस्टम सेवाओं और ऐप्लिकेशन के वर्कलोड के लिए, एनपीयू संसाधनों के बंटवारे और शेड्यूल को मैनेज करता है. कस्टम वेंडर डेमॉन से Android प्लैटफ़ॉर्म पर संसाधन आर्बिट्रेशन को ट्रांसफ़र करके, एनपीयू मैनेजर अनुमान लगाने की क्षमता को बढ़ाता है, संसाधनों की कमी को रोकता है, थर्मल बाउंड्री को मैनेज करता है, और डिवाइस की परफ़ॉर्मेंस को बेहतर बनाता है.
बैकग्राउंड और प्रेरणा
एनपीयू मैनेजर से पहले, ऐप्लिकेशन और सिस्टम मॉड्यूल, सीधे तौर पर वेंडर ड्राइवर या मालिकाना हक वाली सेवाओं को वर्कलोड सबमिट करते थे. इस तरीके में कई समस्याएं थीं:
- संसाधनों के लिए ज़्यादा प्रतिस्पर्धा: मशीन लर्निंग के ज़्यादा वर्कलोड (जैसे कि लार्ज लैंग्वेज मॉडल (एलएलएम) इन्फ़रेंस इंजन या डिवाइस पर मौजूद विज़न सिस्टम) के लिए, एनपीयू के सीमित संसाधनों (जैसे कि एसआरएएम, वेट मेमोरी, और एक्ज़ीक्यूशन चैनल) के लिए, अन्य ज़्यादा प्राथमिकता वाले सिस्टम के साथ सीधे तौर पर प्रतिस्पर्धा की जाती है.
- सिस्टम में अस्थिरता: अगर हार्डवेयर की क्षमता से ज़्यादा काम किया जाता है, तो बिना तालमेल वाले वर्कलोड की वजह से, थर्मल थ्रॉटलिंग, मेमोरी पेज फ़ॉल्ट या लो मेमोरी किलर डेमॉन (एलएमकेडी) ट्रिगर हो सकता है.
- प्राथमिकता तय करने में समस्या: सिस्टम सर्वर, कॉन्टेक्स्ट में बदलाव होने पर एनपीयू की प्राथमिकता को अडजस्ट नहीं कर सकता. जैसे, बैकग्राउंड में कोई बड़ा मॉडल लोड हो रहा है, जबकि फ़ोरग्राउंड में कम समय में काम करने वाली कैमरा पाइपलाइन या उपयोगकर्ता की सहायता करने वाली सुविधा चालू है.
एनपीयू मैनेजर, इन चुनौतियों को हल करता है. यह सिस्टम-लेवल के मध्यस्थ के तौर पर काम करता है. यह मॉडल को लोड करने की प्रोसेस को कंट्रोल करता है. साथ ही, डिवाइस की मौजूदा स्थिति और ऐप्लिकेशन की स्थितियों के आधार पर, एक्ज़ीक्यूशन की प्राथमिकताओं को डाइनैमिक तरीके से अडजस्ट करता है.
सिस्टम आर्किटेक्चर
एनपीयू मैनेजर को सिस्टम सेवा के तौर पर लागू किया जाता है. इसे npu नाम दिया गया है और यह Android फ़्रेमवर्क में काम करता है. एनपीयू मैनेजर, शेड्यूलिंग की नीतियों के हाई-लेवल कोऑर्डिनेशन को वेंडर के ड्राइवर के लो-लेवल इंप्लीमेंटेशन से अलग करता है.
इस डायग्राम में, NPU Manager के एनवायरमेंट लेयर के बारे में बताया गया है:

पहली इमेज. एनपीयू मैनेजर एनवायरमेंट लेयर.
मुख्य कॉम्पोनेंट
- फ़्रेमवर्क एपीआई क्लाइंट (
android.npumanager.NpuManager): यह एंट्री पॉइंट है. इसका इस्तेमाल क्लाइंट, मॉडल लोड करने के लिए रिज़र्वेशन का अनुरोध करने के लिए करते हैं - सिस्टम सेवा (
npu): यह एक सिस्टम सेवा है, जो मॉडल लोड करने की अनुमतियों को कंट्रोल करती है. साथ ही, शेड्यूलिंग की प्राथमिकता से जुड़े नियमों के आधार पर, प्रीएम्पशन कमांड मैनेज करती है - एनपीयू शेड्यूलिंग एचएएल (
android.hardware.npu): यह एआईडीएल पर आधारित एक इंटरफ़ेस है. यह Android ऐप्लिकेशन की प्राथमिकताओं को फ़्रेमवर्क और ड्राइवर के बीच रिले करता है - वेंडर ड्राइवर: यह एक लो-लेवल ड्राइवर होता है. यह हार्डवेयर एक्ज़ीक्यूशन ब्लॉक को कंट्रोल करता है और लो-लेवल प्राथमिकता तय करने के तरीके लागू करता है
एसडीके और फ़्रेमवर्क एपीआई
लो-लेवल न्यूरल नेटवर्क लाइब्रेरी को कॉल करने या मॉडल फ़ाइलें लोड करने से पहले, फ़्रेमवर्क क्लाइंट को 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
यहां दिए गए कोड के उदाहरण में, 2 जीबी से ज़्यादा साइज़ की सीमा वाला 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);
एनपीयू संसाधन उपलब्ध होने पर, फ़्रेमवर्क इन इवेंट के साथ ModelLoadRequestCallback का इस्तेमाल करके जवाब देता है:
onCanLoadModel(request, status, listener): यह इवेंट तब ट्रिगर होता है, जब अनुरोध को मंज़ूरी मिल जाती है. क्लाइंट कोNpuManager.ModelLoadStatusListenerटोकन मिलता है. जब क्लाइंट, ड्राइवर की मेमोरी में मॉडल को पूरी तरह से लोड कर लेता है, तब उसेlistener.notifyModelLoaded(request)को कॉल करना होगा.onRequestUnloadModel(request)याonRequestUnloadModel(request, reason): यह तब ट्रिगर होता है, जब सिस्टम पर संसाधन का दबाव होता है. जैसे, फ़ोरग्राउंड का अनुरोध या तापमान में अचानक बढ़ोतरी. ऐसे में, क्लाइंट को अपना मॉडल रिलीज़ करना होता है. एनपीयू संसाधनों को वापस पाने के बाद, क्लाइंटlistener.notifyModelUnloaded(request)को कॉल करता है.onModelLoadRequestComplete(request, status): इससे क्लाइंट को अनुरोध के लाइफ़साइकल में हुए आखिरी बदलावों के बारे में पता चलता है. जैसे, अनुरोध रद्द करना.
क्लाइंट, cancelModelLoad(request) का इस्तेमाल करके, उन न्योतों को रद्द कर सकते हैं जिन्हें मंज़ूरी मिलनी बाकी है.
एचएएल और वेंडर इंटिग्रेशन
एनपीयू मैनेजर के साथ काम करने के लिए, डिवाइस के हिसाब से वेंडर के लागू किए गए सिस्टम को android.hardware.npu एआईडीएल सेवा इंटरफ़ेस के मुताबिक होना चाहिए.
शेड्यूल करने से जुड़ा कॉन्फ़िगरेशन
सिस्टम, 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 Manager प्राथमिकताएं तय करता है. उदाहरण के लिए, अगर कोई बैकग्राउंड ऐप्लिकेशन ज़्यादा प्राथमिकता वाला कोई काम सबमिट करता है, तो उसकी प्राथमिकता को कम कर दिया जाता है, ताकि फ़ोरग्राउंड ग्राफ़िक में कोई रुकावट न आए.
टास्क का स्टेटस और प्रोफ़ाइलिंग
वेंडर ड्राइवर को, मैनेजर को एनपीयू एक्ज़ीक्यूशन ग्रुप के लाइफ़साइकल की स्थिति के बारे में बताना होगा. 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: ज़्यादा प्राथमिकता वाले टास्क के लिए, कुछ समय के लिए निलंबित कर दिया गया है.
डिवाइस की तैयारी और टेस्टिंग
डिवाइस की स्थिति की पुष्टि करने से पहले, पक्का करें कि ये कॉन्फ़िगरेशन लागू हों.
ऐप्लिकेशन के एलान
जिन क्लाइंट को एनपीयू की शेड्यूलिंग को प्राथमिकता देनी है उन्हें अपने AndroidManifest.xml में एनपीयू हार्डवेयर की सुविधा के बारे में बताना होगा:
<uses-feature android:name="android.hardware.npu" android:required="false" />
पार्टनर के नए हार्डवेयर पर डिप्लॉय किए गए मॉडल के लिए, इंजन को ऑप्टिमाइज़ करने के लिए यह एलान करना ज़रूरी हो सकता है.
वीटीएस इंटिग्रेशन की जांच करना
एनपीयू एचएएल को लागू करने की पुष्टि, वीटीएस के फ़ंक्शनल टेस्ट से की जा सकती है. उदाहरण के लिए, VtsHalNpuSchedulingTargetTest.