बर्स्ट निष्पादन और तेज़ संदेश सूची

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

  1. एक्ज़ीक्यूशन के क्रम से पहले बर्स्ट ऑब्जेक्ट बनाया जाता है और उसे फ़्री कर दिया जाता है जब क्रम खत्म हो जाए. इस वजह से, बर्स्ट के दौरान ऑब्जेक्ट, ड्राइवर को बताता है कि उसे कितनी देर तक बेहतरीन परफ़ॉर्मेंस में रहना चाहिए राज्य.
  2. बर्स्ट ऑब्जेक्ट, एक्ज़ीक्यूशन के बीच संसाधनों को सुरक्षित रख सकता है. उदाहरण के लिए, ड्राइवर पहली बार एक्ज़ीक्यूशन करने पर मेमोरी ऑब्जेक्ट को मैप कर सकता है और मैपिंग को कैश मेमोरी में सेव कर सकता है को बर्स्ट ऑब्जेक्ट में डाल दिया जाता है, ताकि उसे बाद के एक्ज़ीक्यूशन में फिर से इस्तेमाल किया जा सके. कैश मेमोरी में सेव किया गया कोई भी संसाधन बर्स्ट ऑब्जेक्ट के नष्ट होने या NNAPI होने पर रिलीज़ हो सकता है रनटाइम, बर्स्ट ऑब्जेक्ट को बताता है कि अब संसाधन की ज़रूरत नहीं है.
  3. बर्स्ट ऑब्जेक्ट, तेज़ मैसेज की सूची (एफ़एमक्यू) का इस्तेमाल करें. यह काम कर सकता है इंतज़ार का समय कम करती है, क्योंकि FMQ HIDL को बायपास करके डेटा को सीधे शेयर की गई मेमोरी में ऐटॉमिक सर्कुलर FIFO के ज़रिए, एक और प्रक्रिया. कॉन्टेंट बनाने उपभोक्ता प्रक्रिया के लिए यह जानना ज़रूरी है कि वह किसी आइटम को बुक करना चाहता है और FIFO में मौजूद एलिमेंट की संख्या डालकर या FMQ के इवेंट का इंतज़ार करके फ़्लैग, जिस पर प्रोड्यूसर से सिग्नल मिलता है. यह इवेंट फ़्लैग तेज़ी से काम करता है यूज़रस्पेस म्यूटेक्स (futex).

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

क्योंकि बर्स्ट एक्ज़ीक्यूशन एक ही आर्ग्युमेंट पर काम करते हैं और एक ही तरह के नतीजे देते हैं एक्ज़ीक्यूशन पाथ के रूप में मिलता है, तो मौजूद एफ़एमक्यू को वही डेटा पास करना होगा जो और NNAPI सर्विस ड्राइवर से भी मिलता है. हालांकि, एफ़एमक्यू सिर्फ़ ट्रांसफ़र किए जा सकते हैं का इस्तेमाल किया जा सकता है. जटिल डेटा को ट्रांसफ़र करने के लिए, क्रम से लगाना ज़रूरी है साथ ही, सीधे एफ़एमक्यू में नेस्ट किए गए बफ़र (वेक्टर टाइप) को डीसीरियलाइज़ (पार्स) करना, और मांग पर मेमोरी पूल के हैंडल ट्रांसफ़र करने के लिए, HIDL कॉलबैक ऑब्जेक्ट. निर्माता FMQ की तरफ़ से, ग्राहक को अनुरोध या उसके नतीजे वाले मैसेज भेजे जाने चाहिए अगर सूची ब्लॉक कर रही है, तो MessageQueue::writeBlocking का इस्तेमाल करके या अगर सूची ब्लॉक नहीं कर रही है, तो MessageQueue::write का इस्तेमाल करें.

बर्स्ट इंटरफ़ेस

न्यूरल नेटवर्क एचएएल के लिए बर्स्ट इंटरफ़ेस यहां मिलते हैं hardware/interfaces/neuralnetworks/1.2/ और इनके बारे में नीचे बताया गया है. एनडीके में बर्स्ट इंटरफ़ेस के बारे में ज़्यादा जानकारी पाने के लिए लेयर, देखें frameworks/ml/nn/runtime/include/NeuralNetworks.h.

Type.hal

types.hal FMQ पर भेजे जाने वाले डेटा का टाइप बताता है.

  • FmqRequestDatum: एक्ज़ीक्यूशन Request की सीरीज़ के तौर पर दिखाया गया एक एलिमेंट ऑब्जेक्ट और MeasureTiming वैल्यू, जिसे तेज़ी से चलने वाले मैसेज में भेजा जाता है सूची.
  • FmqResultDatum: यहां दी गई वैल्यू को सीरियल के तौर पर दिखाने वाला एक एलिमेंट एक एक्ज़ीक्यूशन (ErrorStatus, OutputShapes, और Timing) है, जो यह मैसेज सूची में सबसे तेज़ मैसेज की सूची के ज़रिए दिखाया गया है.

आईबीर्स्टकॉन्टेक्स्ट.हेल

IBurstContext.hal न्यूरल नेटवर्क सेवा में मौजूद HIDL इंटरफ़ेस ऑब्जेक्ट के बारे में बताता है.

  • IBurstContext: बर्स्ट के संसाधनों को मैनेज करने के लिए कॉन्टेक्स्ट ऑब्जेक्ट.

आईबर्नस्टकॉलबैक.हैल

IBurstCallback.hal न्यूरल नेटवर्क्स से बनाए गए कॉलबैक के लिए, HIDL इंटरफ़ेस ऑब्जेक्ट तय करता है रनटाइम और इसका इस्तेमाल hidl_memory को वापस पाने के लिए, Neural Networks सेवा से किया जाता है स्लॉट आइडेंटिफ़ायर से जुड़े ऑब्जेक्ट.

  • IBurstCallback: मेमोरी ऑब्जेक्ट वापस पाने के लिए, किसी सेवा में कॉलबैक ऑब्जेक्ट का इस्तेमाल किया जाता है.

Iतैयार मॉडल.हेल

IPreparedModel.hal को HAL 1.2 में किसी ऐसे तरीके से बढ़ाया गया है जिससे एक IBurstContext ऑब्जेक्ट बनाया जा सकता है तैयार किया गया है.

  • configureExecutionBurst: यह नीति ऐसे बर्स्ट ऑब्जेक्ट को कॉन्फ़िगर करती है जिसका इस्तेमाल किसी तैयार किए गए डेटा पर एक से ज़्यादा अनुमान लागू करने के लिए किया जाता है तेज़ी से लगातार आगे बढ़ रहे हैं.

ड्राइवर को बर्स्ट एक्ज़ीक्यूट करने की सुविधा दें

किसी HIDL NNAPI सेवा में बर्स्ट ऑब्जेक्ट का समर्थन करने का सबसे आसान तरीका बर्स्ट उपयोगिता फ़ंक्शन ::android::nn::ExecutionBurstServer::create, जो कि इसमें मिला ExecutionBurstServer.h और libneuralnetworks_common और libneuralnetworks_util में पैकेज किया गया स्टैटिक लाइब्रेरी पर लागू होता है. इस फ़ैक्ट्री फ़ंक्शन में दो ओवरलोड हैं:

  • एक ओवरलोड, IPreparedModel ऑब्जेक्ट के लिए पॉइंटर स्वीकार करता है. यह उपयोगिता फ़ंक्शन, executeSynchronously पद्धति का उपयोग मॉडल को चलाने के लिए IPreparedModel ऑब्जेक्ट का इस्तेमाल करें.
  • एक ओवरलोड, पसंद के मुताबिक बनाया जा सकने वाला IBurstExecutorWithCache ऑब्जेक्ट स्वीकार करता है, इसका इस्तेमाल उन रिसॉर्स (जैसे कि hidl_memory मैपिंग) को कैश मेमोरी में सेव करने के लिए किया जा सकता है जो कई एक्ज़ीक्यूशन के लिए बना रहता है.

हर ओवरलोड, IBurstContext ऑब्जेक्ट दिखाता है (जो बर्स्ट को दिखाता है ऑब्जेक्ट) होता है, जिसमें खास तौर पर लिसनर थ्रेड को शामिल किया जाता है और उसे मैनेज किया जाता है. यह थ्रेड requestChannel एफ़एमक्यू से अनुरोध आता है, अनुमान लगाता है, फिर resultChannel एफ़एमक्यू के ज़रिए नतीजे दिखाता है. यह थ्रेड और अन्य सभी IBurstContext ऑब्जेक्ट में शामिल संसाधन अपने-आप रिलीज़ हो जाते हैं जब बर्स्ट का क्लाइंट IBurstContext का रेफ़रंस खो देता है.

इसके अलावा, अपने हिसाब से IBurstContext को लागू किया जा सकता है यह समझता है कि requestChannel पर मैसेज कैसे भेजें और कैसे पाएं और resultChannel एफ़एमक्यू, IPreparedModel::configureExecutionBurst को भेजे गए.

बर्स्ट यूटिलिटी फ़ंक्शन इनमें पाए जाते हैं ExecutionBurstServer.h.

/**
 * Create automated context to manage FMQ-based executions.
 *
 * This function is intended to be used by a service to automatically:
 * 1) Receive data from a provided FMQ
 * 2) Execute a model with the given information
 * 3) Send the result to the created FMQ
 *
 * @param callback Callback used to retrieve memories corresponding to
 *     unrecognized slots.
 * @param requestChannel Input FMQ channel through which the client passes the
 *     request to the service.
 * @param resultChannel Output FMQ channel from which the client can retrieve
 *     the result of the execution.
 * @param executorWithCache Object which maintains a local cache of the
 *     memory pools and executes using the cached memory pools.
 * @result IBurstContext Handle to the burst context.
 */
static sp<ExecutionBurstServer> create(
        const sp<IBurstCallback>& callback, const FmqRequestDescriptor& requestChannel,
        const FmqResultDescriptor& resultChannel,
        std::shared_ptr<IBurstExecutorWithCache> executorWithCache);

/**
 * Create automated context to manage FMQ-based executions.
 *
 * This function is intended to be used by a service to automatically:
 * 1) Receive data from a provided FMQ
 * 2) Execute a model with the given information
 * 3) Send the result to the created FMQ
 *
 * @param callback Callback used to retrieve memories corresponding to
 *     unrecognized slots.
 * @param requestChannel Input FMQ channel through which the client passes the
 *     request to the service.
 * @param resultChannel Output FMQ channel from which the client can retrieve
 *     the result of the execution.
 * @param preparedModel PreparedModel that the burst object was created from.
 *     IPreparedModel::executeSynchronously will be used to perform the
 *     execution.
 * @result IBurstContext Handle to the burst context.
 */
  static sp<ExecutionBurstServer> create(const sp<IBurstCallback>& callback,
                                         const FmqRequestDescriptor& requestChannel,
                                         const FmqResultDescriptor& resultChannel,
                                         IPreparedModel* preparedModel);

इसमें बर्स्ट इंटरफ़ेस को लागू करने के बारे में बताया गया है न्यूरल नेटवर्क सैंपल ड्राइवर यहां frameworks/ml/nn/driver/sample/SampleDriver.cpp.

Return<void> SamplePreparedModel::configureExecutionBurst(
        const sp<V1_2::IBurstCallback>& callback,
        const MQDescriptorSync<V1_2::FmqRequestDatum>& requestChannel,
        const MQDescriptorSync<V1_2::FmqResultDatum>& resultChannel,
        configureExecutionBurst_cb cb) {
    NNTRACE_FULL(NNTRACE_LAYER_DRIVER, NNTRACE_PHASE_EXECUTION,
                 "SampleDriver::configureExecutionBurst");
    // Alternatively, the burst could be configured via:
    // const sp<V1_2::IBurstContext> burst =
    //         ExecutionBurstServer::create(callback, requestChannel,
    //                                      resultChannel, this);
    //
    // However, this alternative representation does not include a memory map
    // caching optimization, and adds overhead.
    const std::shared_ptr<BurstExecutorWithCache> executorWithCache =
            std::make_shared<BurstExecutorWithCache>(mModel, mDriver, mPoolInfos);
    const sp<V1_2::IBurstContext> burst = ExecutionBurstServer::create(
            callback, requestChannel, resultChannel, executorWithCache);
    if (burst == nullptr) {
        cb(ErrorStatus::GENERAL_FAILURE, {});
    } else {
        cb(ErrorStatus::NONE, burst);
    }
    return Void();
}