Android 10 से, Neural Networks API (NNAPI)
आपकी मदद करने के लिए, फ़ंक्शन उपलब्ध कराता है
कंपाइलेशन आर्टफ़ैक्ट को कैश मेमोरी में सेव करने की सुविधा. इससे, कंपाइलेशन में लगने वाला समय कम होता है
शुरू होता है. कैश मेमोरी में सेव करने की इस सुविधा का इस्तेमाल करने पर, ड्राइवर ये काम नहीं करता
कैश मेमोरी में सेव की गई फ़ाइलों को मैनेज या साफ़ करने की ज़रूरत होती है. यह एक वैकल्पिक सुविधा है, जो
को NN HAL 1.2 के साथ लागू किया जा सकता है. इस फ़ंक्शन के बारे में ज़्यादा जानकारी पाने के लिए,
देखें
ANeuralNetworksCompilation_setCaching
.
ड्राइवर, NNAPI के बिना भी कंपाइलेशन कैश मेमोरी लागू कर सकता है. चाहे NNAPI NDK और HAL की कैश मेमोरी की सुविधाओं का इस्तेमाल किया गया हो या नहीं, इसे लागू किया जा सकता है. AOSP, एक लो-लेवल यूटिलिटी लाइब्रेरी (कैश मेमोरी का इंजन) उपलब्ध कराता है. ज़्यादा के लिए जानकारी के लिए, कैशिंग इंजन लागू करना देखें.
वर्कफ़्लो के बारे में खास जानकारी
इस सेक्शन में, कंपाइलेशन कैश मेमोरी की सुविधा के साथ सामान्य वर्कफ़्लो के बारे में बताया गया है लागू किया गया.
कैश मेमोरी में सेव किए गए डेटा की जानकारी और कैश मेमोरी में डेटा का हिट
- ऐप्लिकेशन, कैश मेमोरी में सेव करने की डायरेक्ट्री और मॉडल के लिए यूनीक चेकसम पास करता हो.
- NNAPI रनटाइम, चेकसम के आधार पर कैश फ़ाइलों को खोजता है, एक्ज़ीक्यूशन प्राथमिकता, और विभाजन के नतीजे के आधार पर फ़ाइलें ढूंढता है.
- NNAPI, कैश फ़ाइलों को खोलता है और हैंडल को ड्राइवर को भेजता है
के साथ
prepareModelFromCache
. - ड्राइवर, कैश मेमोरी फ़ाइलों से सीधे मॉडल तैयार करता है और तैयार किया गया मॉडल दिखाता है.
कैश मेमोरी में सेव किए गए डेटा की जानकारी और कैश मेमोरी में डेटा न होना
- ऐप्लिकेशन, मॉडल के हिसाब से एक चेकसम और कैश मेमोरी में सेव करता है डायरेक्ट्री.
- NNAPI रनटाइम, कैश मेमोरी में सेव की गई फ़ाइलों को चेकसम, प्रोसेस करने की प्राथमिकता, और पार्टिशन करने के नतीजे के आधार पर खोजता है. हालांकि, उसे कैश मेमोरी में सेव की गई फ़ाइलें नहीं मिलती हैं.
- NNAPI चेकसम के आधार पर खाली कैश फ़ाइलें बनाता है,
प्राथमिकता से कॉपी करने की सुविधा देता है और पार्टीशन करता है, जिससे कैश मेमोरी में सेव की गई
फ़ाइलें खुलती हैं, और
ड्राइवर के लिए, हैंडल और मॉडल
prepareModel_1_2
. - ड्राइवर, मॉडल को कंपाइल करता है, कैश मेमोरी में सेव करने की जानकारी को कैश फ़ाइलों में लिखता है, और तैयार मॉडल दिखाता है.
कैश मेमोरी की जानकारी नहीं दी गई है
- ऐप्लिकेशन, कैश मेमोरी की जानकारी दिए बिना ही कंपाइलेशन की सुविधा शुरू करता है.
- ऐप्लिकेशन, कैश मेमोरी में सेव करने से जुड़ी कोई भी जानकारी पास नहीं करता.
- NNAPI रनटाइम, मॉडल को ड्राइवर को इस डिवाइस से पास करता है:
prepareModel_1_2
. - ड्राइवर, मॉडल को कंपाइल करता है और तैयार किए गए मॉडल को लौटाता है.
कैश मेमोरी की जानकारी
ड्राइवर को कैश मेमोरी में सेव करने की जानकारी में, टोकन और कैश मेमोरी में सेव की गई फ़ाइल के हैंडल शामिल होते हैं.
टोकन
टोकन, Constant::BYTE_SIZE_OF_CACHE_TOKEN
लंबाई का कैश मेमोरी में सेव किया जाने वाला टोकन होता है. इससे, तैयार किए गए मॉडल की पहचान की जाती है. prepareModel_1_2
की मदद से कैश मेमोरी फ़ाइलें सेव करने और prepareModelFromCache
की मदद से तैयार किया गया मॉडल वापस पाने पर, एक ही टोकन दिया जाता है. ड्राइवर के क्लाइंट को
टक्कर की कम दर. ड्राइवर को टोकन टक्कर होने का पता नहीं चला. टक्कर
के नतीजे के तौर पर, प्रक्रिया पूरी नहीं हो पाती या काम नहीं करती
गलत आउटपुट मान.
कैश फ़ाइल हैंडल (दो तरह की कैश फ़ाइलें)
कैश मेमोरी में सेव की जाने वाली फ़ाइलें दो तरह की होती हैं: डेटा कैश और मॉडल कैश.
- डेटा कैश मेमोरी: इसका इस्तेमाल, पहले से प्रोसेस किए गए और पहले से प्रोसेस किए गए डेटा, दोनों को कैश मेमोरी में सेव करने के लिए किया जाता है टेंसर बफ़र में बदलाव किया गया. डेटा कैश में बदलाव नहीं करना चाहिए लागू होने के दौरान, खराब आउटपुट वैल्यू जनरेट करने की तुलना में ज़्यादा खराब नतीजे मिलते हैं समय.
- मॉडल कैश मेमोरी: इसका इस्तेमाल, सुरक्षा से जुड़े संवेदनशील डेटा को कैश मेमोरी में सेव करने के लिए किया जाता है. जैसे, डिवाइस के नेटिव बाइनरी फ़ॉर्मैट में, इकट्ठा किए गए और चलाए जा सकने वाले मशीन कोड को कैश मेमोरी में सेव करना. ऐप्लिकेशन मॉडल कैश में बदलाव करने से ड्राइवर के काम करने के तरीके पर असर पड़ सकता है है और नुकसान पहुंचाने वाला क्लाइंट इसका इस्तेमाल करके आगे के काम कर सकता है. अनुमति दी गई है. इसलिए, ड्राइवर को यह जांच करनी होगी कि मॉडल कैश मेमोरी कैश मेमोरी से मॉडल तैयार करने से पहले गड़बड़ी हुई है. ज़्यादा जानकारी के लिए, सुरक्षा देखें.
ड्राइवर को यह तय करना होगा कि कैश मेमोरी की जानकारी, कैश मेमोरी की दो तरह की फ़ाइलों के बीच कैसे बांटी जाए. साथ ही, getNumberOfCacheFilesNeeded
की मदद से यह भी बताना होगा कि हर तरह की कैश मेमोरी फ़ाइल के लिए, उसे कितनी कैश मेमोरी फ़ाइलों की ज़रूरत है.
NNAPI रनटाइम, कैश मेमोरी फ़ाइल हैंडल को हमेशा पढ़ने और लिखने की अनुमति के साथ खोलता है.
सुरक्षा
कंपाइलेशन कैश मेमोरी में, मॉडल की कैश मेमोरी में सुरक्षा के लिए संवेदनशील डेटा हो सकता है, जैसे कि इकट्ठा करने की सुविधा देता है. अगर मॉडल कैश मेमोरी को सही तरीके से सुरक्षित नहीं किया जाता है, तो उसमें बदलाव करने से ड्राइवर के काम करने के तरीके पर असर पड़ सकता है. क्योंकि कैश मेमोरी को ऐप्लिकेशन में सेव किया जाता है कैश फ़ाइलों को क्लाइंट से बदला जा सकता है. गड़बड़ी वाला क्लाइंट, गलती से कैश मेमोरी को खराब कर सकता है. साथ ही, नुकसान पहुंचाने वाला क्लाइंट, डिवाइस पर बिना पुष्टि किए गए कोड को चलाने के लिए, जान-बूझकर इसका इस्तेमाल कर सकता है. डिवाइस की विशेषताओं के आधार पर, यह सुरक्षा से जुड़ी समस्या हो सकती है. इसलिए, कैश मेमोरी से मॉडल तैयार करने से पहले, ड्राइवर को मॉडल कैश मेमोरी में होने वाले संभावित नुकसान का पता लगाना चाहिए.
ऐसा करने का एक तरीका यह है कि ड्राइवर, टोकन से लेकर मैप तक
मॉडल कैश का क्रिप्टोग्राफ़िक हैश. ड्राइवर, टोकन को सेव कर सकता है और
कैश मेमोरी में कंपाइलेशन सेव करते समय, इसके मॉडल कैश की हैशिंग का इस्तेमाल करें. कैश मेमोरी से कंपाइलेशन को वापस लाने के दौरान, ड्राइवर मॉडल कैश मेमोरी के नए हैश की जांच, रिकॉर्ड किए गए टोकन और हैश पेयर के साथ करता है. यह मैपिंग सभी जगहों पर एक जैसी रहनी चाहिए
सिस्टम को फिर से चालू करता है. ड्राइवर
Android कीस्टोर सेवा, यूटिलिटी लाइब्रेरी
framework/ml/nn/driver/cache
,
या मैपिंग मैनेजर को लागू करने के लिए किसी दूसरे तरीके का इस्तेमाल किया जा सकता है. ड्राइवर के अपडेट होने पर, इस मैपिंग मैनेजर को फिर से शुरू किया जाना चाहिए, ताकि पिछले वर्शन की कैश मेमोरी फ़ाइलों को तैयार करने से रोका जा सके.
समीक्षा के समय से लेकर इस्तेमाल के समय (TOCTOU) के हमलों से बचने के लिए, ड्राइवर को फ़ाइल में सेव करने से पहले, रिकॉर्ड किए गए हैश का हिसाब लगाना होगा. साथ ही, फ़ाइल के कॉन्टेंट को इंटरनल बफ़र में कॉपी करने के बाद, नए हैश का हिसाब लगाना होगा.
यह सैंपल कोड, इस लॉजिक को लागू करने का तरीका बताता है.
bool saveToCache(const sp<V1_2::IPreparedModel> preparedModel,
const hidl_vec<hidl_handle>& modelFds, const hidl_vec<hidl_handle>& dataFds,
const HidlToken& token) {
// Serialize the prepared model to internal buffers.
auto buffers = serialize(preparedModel);
// This implementation detail is important: the cache hash must be computed from internal
// buffers instead of cache files to prevent time-of-check to time-of-use (TOCTOU) attacks.
auto hash = computeHash(buffers);
// Store the {token, hash} pair to a mapping manager that is persistent across reboots.
CacheManager::get()->store(token, hash);
// Write the cache contents from internal buffers to cache files.
return writeToFds(buffers, modelFds, dataFds);
}
sp<V1_2::IPreparedModel> prepareFromCache(const hidl_vec<hidl_handle>& modelFds,
const hidl_vec<hidl_handle>& dataFds,
const HidlToken& token) {
// Copy the cache contents from cache files to internal buffers.
auto buffers = readFromFds(modelFds, dataFds);
// This implementation detail is important: the cache hash must be computed from internal
// buffers instead of cache files to prevent time-of-check to time-of-use (TOCTOU) attacks.
auto hash = computeHash(buffers);
// Validate the {token, hash} pair by a mapping manager that is persistent across reboots.
if (CacheManager::get()->validate(token, hash)) {
// Retrieve the prepared model from internal buffers.
return deserialize<V1_2::IPreparedModel>(buffers);
} else {
return nullptr;
}
}
बेहतर इस्तेमाल के उदाहरण
इस्तेमाल के कुछ बेहतर उदाहरणों में, कंपाइलेशन कॉल के बाद ड्राइवर को कैश मेमोरी के कॉन्टेंट को ऐक्सेस करने की ज़रूरत होती है (रीड या राइट). इस्तेमाल के उदाहरणों में ये शामिल हैं:
- सटीक समय पर कंपाइलेशन: कंपाइलेशन तब तक रुका रहेगा, जब तक: का इस्तेमाल करें.
- कई चरणों में कंपाइल करना: शुरुआत में तेज़ी से कंपाइल किया जाता है और बाद में, इस्तेमाल की फ़्रीक्वेंसी के आधार पर, ऑप्टिमाइज़ किया गया कंपाइल किया जाता है. हालांकि, ऐसा करना ज़रूरी नहीं है.
कंपाइलेशन कॉल के बाद, कैश मेमोरी में मौजूद कॉन्टेंट को ऐक्सेस करने (पढ़ें या लिखें) के लिए, पक्का करें कि ड्राइवर:
prepareModel_1_2
याprepareModelFromCache
को शुरू करने के दौरान, फ़ाइल हैंडल की डुप्लीकेट कॉपी बनाता है. साथ ही, बाद में कैश मेमोरी में मौजूद कॉन्टेंट को पढ़ता/अपडेट करता है.- सामान्य कंपाइलेशन कॉल के अलावा, फ़ाइल लॉक करने का लॉजिक लागू करें ताकि किसी रीड या किसी अन्य टेक्स्ट के साथ लिखने पर रोक लगाई जा सके.
कैश मेमोरी में सेव करने वाला इंजन लागू करना
NN HAL 1.2 कंपाइलेशन कैश मेमोरी इंटरफ़ेस के अलावा, आपको frameworks/ml/nn/driver/cache
डायरेक्ट्री में कैश मेमोरी की लाइब्रेरी भी मिल सकती है. कॉन्टेंट बनाने
nnCache
सबडायरेक्ट्री में, लागू करने के लिए ड्राइवर के लिए परसिस्टेंट स्टोरेज कोड होता है
NNAPI कैश मेमोरी में सेव करने की सुविधाओं का इस्तेमाल किए बिना, कंपाइलेशन कैश मेमोरी में सेव करता है. इस तरह का
कंपाइलेशन कैश मेमोरी को NN HAL के किसी भी वर्शन के साथ लागू किया जा सकता है. अगर
ड्राइवर, एचएएल इंटरफ़ेस से डिसकनेक्ट की गई कैश मेमोरी को लागू करने का विकल्प चुनता है,
ड्राइवर है
यह कैश मेमोरी में सेव किए गए आर्टफ़ैक्ट की ज़रूरत न होने पर उन्हें खाली करने के लिए ज़िम्मेदार है.