संकलन कैशिंग

एंड्रॉइड 10 से, न्यूरल नेटवर्क्स एपीआई (एनएनपीआई) संकलन कलाकृतियों की कैशिंग का समर्थन करने के लिए फ़ंक्शन प्रदान करता है, जो ऐप शुरू होने पर संकलन के लिए उपयोग किए जाने वाले समय को कम कर देता है। इस कैशिंग कार्यक्षमता का उपयोग करके, ड्राइवर को कैश्ड फ़ाइलों को प्रबंधित या साफ़ करने की आवश्यकता नहीं है। यह एक वैकल्पिक सुविधा है जिसे एनएन एचएएल 1.2 के साथ लागू किया जा सकता है। इस फ़ंक्शन के बारे में अधिक जानकारी के लिए, ANeuralNetworksCompilation_setCaching देखें।

ड्राइवर एनएनएपीआई से स्वतंत्र संकलन कैशिंग भी लागू कर सकता है। इसे लागू किया जा सकता है चाहे एनएनएपीआई एनडीके और एचएएल कैशिंग सुविधाओं का उपयोग किया जाए या नहीं। AOSP एक निम्न-स्तरीय उपयोगिता लाइब्रेरी (एक कैशिंग इंजन) प्रदान करता है। अधिक जानकारी के लिए, कैशिंग इंजन लागू करना देखें।

कार्यप्रवाह सिंहावलोकन

यह अनुभाग लागू किए गए संकलन कैशिंग सुविधा के साथ सामान्य वर्कफ़्लो का वर्णन करता है।

कैश जानकारी प्रदान की गई और कैश हिट हुआ

  1. ऐप एक कैशिंग निर्देशिका और मॉडल के लिए अद्वितीय चेकसम पास करता है।
  2. एनएनएपीआई रनटाइम चेकसम, निष्पादन प्राथमिकता और विभाजन परिणाम के आधार पर कैश फ़ाइलों की तलाश करता है और फ़ाइलों को ढूंढता है।
  3. एनएनएपीआई कैश फ़ाइलों को खोलता है और prepareModelFromCache के साथ ड्राइवर को हैंडल भेजता है।
  4. ड्राइवर सीधे कैश फ़ाइलों से मॉडल तैयार करता है और तैयार मॉडल वापस कर देता है।

कैश जानकारी प्रदान की गई और कैश मिस हो गया

  1. ऐप मॉडल और कैशिंग निर्देशिका के लिए अद्वितीय चेकसम पास करता है।
  2. एनएनएपीआई रनटाइम चेकसम, निष्पादन प्राथमिकता और विभाजन परिणाम के आधार पर कैशिंग फ़ाइलों की तलाश करता है और कैश फ़ाइलों को नहीं ढूंढता है।
  3. एनएनएपीआई चेकसम, निष्पादन प्राथमिकता और विभाजन के आधार पर खाली कैश फ़ाइलें बनाता है, कैश फ़ाइलें खोलता है, और हैंडल और मॉडल को prepareModel_1_2 के साथ ड्राइवर को भेजता है।
  4. ड्राइवर मॉडल संकलित करता है, कैश फ़ाइलों में कैशिंग जानकारी लिखता है, और तैयार मॉडल लौटाता है।

कैश की जानकारी नहीं दी गई

  1. ऐप कोई कैशिंग जानकारी प्रदान किए बिना संकलन शुरू करता है।
  2. ऐप कैशिंग से संबंधित कुछ भी पास नहीं करता है।
  3. एनएनएपीआई रनटाइम prepareModel_1_2 के साथ मॉडल को ड्राइवर को भेजता है।
  4. ड्राइवर मॉडल संकलित करता है और तैयार मॉडल लौटाता है।

कैश जानकारी

ड्राइवर को प्रदान की जाने वाली कैशिंग जानकारी में एक टोकन और कैश फ़ाइल हैंडल शामिल होते हैं।

टोकन

टोकन Constant::BYTE_SIZE_OF_CACHE_TOKEN लंबाई का एक कैशिंग टोकन है जो तैयार मॉडल की पहचान करता है। कैश फ़ाइलों को prepareModel_1_2 के साथ सहेजते समय और तैयार मॉडल को prepareModelFromCache के साथ पुनर्प्राप्त करते समय समान टोकन प्रदान किया जाता है। ड्राइवर के ग्राहक को टकराव की कम दर वाला टोकन चुनना चाहिए। ड्राइवर सांकेतिक टक्कर का पता नहीं लगा पाता. टकराव के परिणामस्वरूप असफल निष्पादन या सफल निष्पादन होता है जो गलत आउटपुट मान उत्पन्न करता है।

कैश फ़ाइल हैंडल (दो प्रकार की कैश फ़ाइलें)

कैश फ़ाइलें दो प्रकार की होती हैं डेटा कैश और मॉडल कैश

  • डेटा कैश: प्रीप्रोसेस्ड और रूपांतरित टेंसर बफ़र्स सहित निरंतर डेटा को कैशिंग करने के लिए उपयोग करें। डेटा कैश में संशोधन के परिणामस्वरूप निष्पादन समय पर खराब आउटपुट मान उत्पन्न करने से बुरा कोई प्रभाव नहीं होना चाहिए।
  • मॉडल कैश: डिवाइस के मूल बाइनरी प्रारूप में संकलित निष्पादन योग्य मशीन कोड जैसे सुरक्षा-संवेदनशील डेटा को कैशिंग करने के लिए उपयोग करें। मॉडल कैश में संशोधन ड्राइवर के निष्पादन व्यवहार को प्रभावित कर सकता है, और एक दुर्भावनापूर्ण क्लाइंट इसका उपयोग दी गई अनुमति से परे निष्पादित करने के लिए कर सकता है। इस प्रकार, कैश से मॉडल तैयार करने से पहले ड्राइवर को यह जांचना होगा कि मॉडल कैश दूषित है या नहीं। अधिक जानकारी के लिए सुरक्षा देखें.

ड्राइवर को यह तय करना होगा कि दो प्रकार की कैश फ़ाइलों के बीच कैश जानकारी कैसे वितरित की जाती है, और getNumberOfCacheFilesNeeded के साथ रिपोर्ट करें कि उसे प्रत्येक प्रकार के लिए कितनी कैश फ़ाइलों की आवश्यकता है।

एनएनएपीआई रनटाइम हमेशा पढ़ने और लिखने की अनुमति के साथ कैश फ़ाइल हैंडल खोलता है।

सुरक्षा

संकलन कैशिंग में, मॉडल कैश में सुरक्षा-संवेदनशील डेटा हो सकता है जैसे डिवाइस के मूल बाइनरी प्रारूप में संकलित निष्पादन योग्य मशीन कोड। यदि ठीक से संरक्षित नहीं किया गया है, तो मॉडल कैश में संशोधन ड्राइवर के निष्पादन व्यवहार को प्रभावित कर सकता है। क्योंकि कैश सामग्री ऐप निर्देशिका में संग्रहीत होती है, कैश फ़ाइलें क्लाइंट द्वारा संशोधित की जा सकती हैं। एक खराब क्लाइंट गलती से कैश को दूषित कर सकता है, और एक दुर्भावनापूर्ण क्लाइंट डिवाइस पर असत्यापित कोड को निष्पादित करने के लिए जानबूझकर इसका उपयोग कर सकता है। डिवाइस की विशेषताओं के आधार पर, यह एक सुरक्षा समस्या हो सकती है। इस प्रकार, कैश से मॉडल तैयार करने से पहले ड्राइवर को संभावित मॉडल कैश भ्रष्टाचार का पता लगाने में सक्षम होना चाहिए।

ऐसा करने का एक तरीका यह है कि ड्राइवर मॉडल कैश के टोकन से क्रिप्टोग्राफ़िक हैश तक एक मानचित्र बनाए रखे। संकलन को कैश में सहेजते समय ड्राइवर अपने मॉडल कैश के टोकन और हैश को संग्रहीत कर सकता है। कैश से संकलन पुनर्प्राप्त करते समय ड्राइवर रिकॉर्ड किए गए टोकन और हैश जोड़ी के साथ मॉडल कैश के नए हैश की जांच करता है। यह मैपिंग सिस्टम रीबूट के दौरान लगातार बनी रहनी चाहिए। मैपिंग मैनेजर को लागू करने के लिए ड्राइवर एंड्रॉइड कीस्टोर सेवा , 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 के आह्वान के दौरान फ़ाइल हैंडल को डुप्लिकेट करता है और बाद में कैश सामग्री को पढ़ता/अपडेट करता है।
  • किसी पठन या किसी अन्य लेखन के साथ-साथ होने वाले लेखन को रोकने के लिए सामान्य संकलन कॉल के बाहर फ़ाइल लॉकिंग तर्क लागू करता है।

एक कैशिंग इंजन लागू करें

एनएन एचएएल 1.2 संकलन कैशिंग इंटरफ़ेस के अलावा, आप frameworks/ml/nn/driver/cache निर्देशिका में एक कैशिंग उपयोगिता लाइब्रेरी भी पा सकते हैं। एनएनएपीआई कैशिंग सुविधाओं का उपयोग किए बिना संकलन कैशिंग लागू करने के लिए nnCache कैश उपनिर्देशिका में ड्राइवर के लिए लगातार स्टोरेज कोड होता है। संकलन कैशिंग का यह रूप एनएन एचएएल के किसी भी संस्करण के साथ कार्यान्वित किया जा सकता है। यदि ड्राइवर एचएएल इंटरफ़ेस से डिस्कनेक्ट किए गए कैशिंग को कार्यान्वित करना चुनता है, तो ड्राइवर कैश्ड कलाकृतियों को मुक्त करने के लिए ज़िम्मेदार है जब उनकी आवश्यकता नहीं रह जाती है।