वेंडर एक्सटेंशन

Neural Networks API (NNAPI) के वेंडर एक्सटेंशन, इन देशों में शुरू किए गए Android 10 वेंडर के ज़रिए तय किए गए ऑपरेशन और डेटा टाइप का कलेक्शन. NN चलाने वाले डिवाइसों पर HAL 1.2 या उसके बाद के वर्शन में ड्राइवर, हार्डवेयर से तेज़ी लाने के लिए कस्टम ऑपरेशन दे सकते हैं के साथ काम करने वाले वेंडर एक्सटेंशन. वेंडर एक्सटेंशन, Google Analytics 4 प्रॉपर्टी मौजूदा कार्रवाइयों का व्यवहार.

वेंडर एक्सटेंशन, OEM के ऑपरेशन के लिए ज़्यादा स्ट्रक्चर्ड विकल्प देते हैं और डेटा टाइप जिन्हें Android 10 में बंद कर दिया गया था. ज़्यादा जानकारी के लिए, यह देखें OEM ऑपरेशन और डेटा टाइप.

एक्सटेंशन के इस्तेमाल की अनुमति वाली सूची

वेंडर एक्सटेंशन का इस्तेमाल सिर्फ़ साफ़ तौर पर बताए गए Android ऐप्लिकेशन और /product, /vendor, /odm, और /data पार्टिशन पर नेटिव बाइनरी. /system पार्टिशन में मौजूद ऐप्लिकेशन और नेटिव बाइनरी, वेंडर का इस्तेमाल नहीं कर सकते एक्सटेंशन.

NNAPI वेंडर एक्सटेंशन का इस्तेमाल करने की अनुमति वाले Android ऐप्लिकेशन और बाइनरी की सूची है /vendor/etc/nnapi_extensions_app_allowlist में सेव किया गया है. फ़ाइल की हर लाइन एक नई प्रविष्टि शामिल है. कोई एंट्री, ऐसा नेटिव बाइनरी पाथ हो सकती है जिसके साथ प्रीफ़िक्स लगा हो उदाहरण के लिए, /data/foo या किसी Android ऐप्लिकेशन पैकेज का नाम, उदाहरण, com.foo.bar.

अनुमति वाली सूची को NNAPI रनटाइम की शेयर की गई लाइब्रेरी से लागू किया जाता है. यह लाइब्रेरी सेवा को अनजाने में इस्तेमाल किए जाने से बचाता है, लेकिन इसे जान-बूझकर गच्चा देने से नहीं ऐसा ऐप्लिकेशन जो सीधे NNAPI ड्राइवर HAL इंटरफ़ेस का इस्तेमाल करके बनाया गया हो.

वेंडर एक्सटेंशन की परिभाषा

वेंडर, एक्सटेंशन की परिभाषा वाली हेडर फ़ाइल बनाता और उसे मैनेज करता है. ऐप्लिकेशन एक्सटेंशन की परिभाषा का पूरा उदाहरण यहां दिया गया है: example/fibonacci/FibonacciExtension.h.

हर एक्सटेंशन का एक यूनीक नाम होना चाहिए, जो रिवर्स डोमेन नेम से शुरू होता हो विक्रेता के.

const char EXAMPLE_EXTENSION_NAME[] = "com.example.my_extension";

यह नाम, कार्रवाइयों और डेटा टाइप के लिए नेमस्पेस के तौर पर काम करता है. NNAPI इसका इस्तेमाल करता है का इस्तेमाल करें.

इसमें, कार्रवाइयों और डेटा टाइप की जानकारी उसी तरह से दी जाती है जैसे runtime/include/NeuralNetworks.h.

enum {
    /**
     * A custom scalar type.
     */
    EXAMPLE_SCALAR = 0,

    /**
     * A custom tensor type.
     *
     * Attached to this tensor is {@link ExampleTensorParams}.
     */
    EXAMPLE_TENSOR = 1,
};

enum {
    /**
     * Computes example function.
     *
     * Inputs:
     * * 0: A scalar of {@link EXAMPLE_SCALAR}.
     *
     * Outputs:
     * * 0: A tensor of {@link EXAMPLE_TENSOR}.
     */
    EXAMPLE_FUNCTION = 0,
};

एक्सटेंशन ऑपरेशन, किसी भी ऑपरेंड प्रकार का उपयोग कर सकता है, जिसमें गैर-एक्सटेंशन संकार्य भी शामिल है अन्य एक्सटेंशन के प्रकार और ऑपरेंड प्रकार. किसी ऑपरेंड प्रकार का उपयोग करते समय तो ड्राइवर को अन्य एक्सटेंशन का समर्थन करना चाहिए.

एक्सटेंशन, एक्सटेंशन ऑपरेंड के साथ कस्टम स्ट्रक्चर का एलान भी कर सकते हैं.

/**
 * Quantization parameters for {@link EXAMPLE_TENSOR}.
 */
typedef struct ExampleTensorParams {
    double scale;
    int64_t zeroPoint;
} ExampleTensorParams;

NNAPI क्लाइंट में एक्सटेंशन का इस्तेमाल करें

कॉन्टेंट बनाने runtime/include/NeuralNetworksExtensions.h (C API) फ़ाइल रनटाइम एक्सटेंशन के साथ काम करती है. इस सेक्शन में, C API की खास जानकारी देखें.

यह देखने के लिए कि डिवाइस किसी एक्सटेंशन का समर्थन करता है या नहीं, इसका उपयोग करें ANeuralNetworksDevice_getExtensionSupport.

bool isExtensionSupported;
CHECK_EQ(ANeuralNetworksDevice_getExtensionSupport(device, EXAMPLE_EXTENSION_NAME,
                                                   &isExtensionSupported),
         ANEURALNETWORKS_NO_ERROR);
if (isExtensionSupported) {
    // The device supports the extension.
    ...
}

एक्सटेंशन ऑपरेंड के साथ मॉडल बनाने के लिए, इसका इस्तेमाल करें ANeuralNetworksModel_getExtensionOperandType ऑपरेंड टाइप और कॉल ANeuralNetworksModel_addOperand.

int32_t type;
CHECK_EQ(ANeuralNetworksModel_getExtensionOperandType(model, EXAMPLE_EXTENSION_NAME, EXAMPLE_TENSOR, &type),
         ANEURALNETWORKS_NO_ERROR);
ANeuralNetworksOperandType operandType{
        .type = type,
        .dimensionCount = dimensionCount,
        .dimensions = dimensions,
};
CHECK_EQ(ANeuralNetworksModel_addOperand(model, &operandType), ANEURALNETWORKS_NO_ERROR);

वैकल्पिक रूप से, ANeuralNetworksModel_setOperandExtensionData का इस्तेमाल करें.

ExampleTensorParams params{
        .scale = 0.5,
        .zeroPoint = 128,
};
CHECK_EQ(ANeuralNetworksModel_setOperandExtensionData(model, operandIndex, &params, sizeof(params)),
         ANEURALNETWORKS_NO_ERROR);

एक्सटेंशन ऑपरेशन वाला मॉडल बनाने के लिए, इसका इस्तेमाल करें ANeuralNetworksModel_getExtensionOperationType कार्रवाई का टाइप और कॉल पाने के लिए ANeuralNetworksModel_addOperation.

ANeuralNetworksOperationType type;
CHECK_EQ(ANeuralNetworksModel_getExtensionOperationType(model, EXAMPLE_EXTENSION_NAME, EXAMPLE_FUNCTION,
                                                        &type),
         ANEURALNETWORKS_NO_ERROR);
CHECK_EQ(ANeuralNetworksModel_addOperation(model, type, inputCount, inputs, outputCount, outputs),
         ANEURALNETWORKS_NO_ERROR);

किसी NNAPI ड्राइवर में एक्सटेंशन के लिए सहायता जोड़ें

ड्राइवर समर्थित एक्सटेंशन की रिपोर्ट IDevice::getSupportedExtensions तरीका. दिखाई गई सूची में एक ऐसी एंट्री होनी चाहिए जो बताए गए हर काम के लिए ज़रूरी हो एक्सटेंशन चुनें.

Extension {
    .name = EXAMPLE_EXTENSION_NAME,
    .operandTypes = {
        {
            .type = EXAMPLE_SCALAR,
            .isTensor = false,
            .byteSize = 8,
        },
        {
            .type = EXAMPLE_TENSOR,
            .isTensor = true,
            .byteSize = 8,
        },
    },
}

टाइप और ऑपरेशन की पहचान करने के लिए इस्तेमाल किए जाने वाले 32 बिट में से, Model::ExtensionTypeEncoding::HIGH_BITS_PREFIX बिट्स एक्सटेंशन है प्रीफ़िक्स और सबसे कम वैल्यू Model::ExtensionTypeEncoding::LOW_BITS_TYPE बिट से टाइप या कार्रवाई का पता चलता है जोड़ें.

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

किसी एक्सटेंशन के नाम से प्रीफ़िक्स को मैप करने के लिए, उसे इसमें खोजें model.extensionNameToPrefix. प्रीफ़िक्स से एक्सटेंशन के नाम तक की मैपिंग, वन-टू-वन कम्यूनिकेशन है. (बायजेक्शन). अलग-अलग प्रीफ़िक्स वैल्यू अलग-अलग मॉडल में एक ही एक्सटेंशन नाम हो.

ड्राइवर को एक्सटेंशन ऑपरेशन और डेटा टाइप की पुष्टि करनी होगी, क्योंकि NNAPI रनटाइम, एक्सटेंशन की खास कार्रवाइयों और डेटा टाइप की पुष्टि नहीं कर सकता.

एक्सटेंशन ऑपरेंड से जुड़ा डेटा यहां हो सकता है: operand.extraParams.extension, जिसे रनटाइम, आर्बिट्रेरी साइज़ के रॉ डेटा ब्लॉब की तरह मानता है.

OEM की कार्रवाई और डेटा टाइप

NNAPI में, OEM कार्रवाई होती है और OEM डेटा टाइप की अनुमति होती है डिवाइस निर्माता को कस्टम, ड्राइवर-विशिष्ट काम की क्षमता प्रदान करने के लिए. ये कार्रवाई और डेटा टाइप का इस्तेमाल सिर्फ़ OEM ऐप्लिकेशन करते हैं. द सिमेंटिक्स ऑफ़ OEM ऑपरेशन और डेटा टाइप, OEM के लिए खास तौर पर तय होते हैं और इनमें किसी भी समय बदलाव किया जा सकता है. ओईएम ऑपरेशन और डेटा टाइप, OperationType::OEM_OPERATION का इस्तेमाल करके एन्कोड किए जाते हैं, OperandType::OEM और OperandType::TENSOR_OEM_BYTE.