Neural Networks API (NNAPI) ভেন্ডর এক্সটেনশন, যা Android 10-এ চালু করা হয়েছে, তা হল ভেন্ডর-সংজ্ঞায়িত অপারেশন ও ডেটা ধরনের সংগ্রহ। NN HAL 1.2 বা এর পরবর্তী যেকোনও ভার্সন চলছে এমন ডিভাইসে, ড্রাইভাররা সংশ্লিষ্ট ভেন্ডর এক্সটেনশন সাপোর্ট করার মাধ্যমে কাস্টম হার্ডওয়্যার-অ্যাক্সিলারেটেড অপারেশন প্রদান করতে পারে। ভেন্ডর এক্সটেনশন আগে থেকে থাকা অপারেশনের আচরণ পরিবর্তন করে না।
ভেন্ডর এক্সটেনশন 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, ¶ms, 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,
},
},
}
ধরন ও অপারেশন শনাক্ত করার জন্য ব্যবহৃত ৩২ বিটের মধ্যে, বেশি
Model::ExtensionTypeEncoding::HIGH_BITS_PREFIX
বিট হল এক্সটেনশন
প্রিফিক্স এবং কম
Model::ExtensionTypeEncoding::LOW_BITS_TYPE
বিট এক্সটেনশনের ধরন বা অপারেশন
দেখায়।
কোনও অপারেশন বা অপারেন্ডের ধরন হ্যান্ডেল করার সময়, ড্রাইভারকে অবশ্যই এক্সটেনশন
প্রিফিক্স চেক করতে হবে। এক্সটেনশন প্রিফিক্সে অশূন্য মান থাকলে, অপারেশন বা অপারেন্ড
টাইপ হল এক্সটেনশন টাইপ। মান 0 হলে, অপারেশন বা অপারেন্ডের ধরন
এক্সটেনশনের ধরন নয়।
এক্সটেনশনের নামের সাথে প্রিফিক্স ম্যাপ করতে, model.extensionNameToPrefix-এ এটি খুঁজুন।
প্রিফিক্স থেকে এক্সটেনশনের নামের ম্যাপিং হল প্রদত্ত মডেলের জন্য এক-থেকে-এক চিঠিপত্র
(বাইজেকশন)। বিভিন্ন মডেলে একই এক্সটেনশন নামের সাথে
বিভিন্ন প্রিফিক্স ভ্যালু থাকতে পারে।
ড্রাইভারকে অবশ্যই এক্সটেনশন অপারেশন এবং ডেটার ধরন যাচাই করতে হবে কারণ NNAPI রানটাইম নির্দিষ্ট এক্সটেনশন অপারেশন এবং ডেটার ধরন যাচাই করতে পারে না।
এক্সটেনশন অপারেন্ডের সাথে যুক্ত ডেটা থাকতে পারে
operand.extraParams.extension,
যেটিকে রানটাইম, যেকোনও সাইজের র ডেটা ব্লব হিসেবে বিবেচনা করে।
OEM অপারেশন ও ডেটার ধরন
NNAPI-তে OEM অপারেশন ও OEM ডেটা টাইপ আছে যা ডিভাইস
প্রস্তুতকারকদের কাস্টম, ড্রাইভার-নির্দিষ্ট কার্যকারিতা প্রদান করতে দেয়। এইসব
অপারেশন ও ডেটার ধরন শুধুমাত্র OEM অ্যাপ্লিকেশন ব্যবহার করে। OEM
অপারেশন ও ডেটার ধরনের শব্দার্থ OEM-নির্দিষ্ট এবং যেকোনও সময় পরিবর্তিত হতে পারে। OEM
অপারেশন ও ডেটার ধরন OperationType::OEM_OPERATION,
OperandType::OEM ও OperandType::TENSOR_OEM_BYTE ব্যবহার করে এনকোড করা হয়।