অ্যান্ড্রয়েড ১০-এ প্রবর্তিত নিউরাল নেটওয়ার্কস এপিআই (NNAPI) ভেন্ডর এক্সটেনশন হলো ভেন্ডর-সংজ্ঞায়িত অপারেশন এবং ডেটা টাইপের একটি সংগ্রহ। NN HAL ১.২ বা তার উচ্চতর সংস্করণে চালিত ডিভাইসগুলিতে, ড্রাইভারগুলি সংশ্লিষ্ট ভেন্ডর এক্সটেনশন সমর্থন করার মাধ্যমে কাস্টম হার্ডওয়্যার-ত্বরিত অপারেশন সরবরাহ করতে পারে। ভেন্ডর এক্সটেনশনগুলি বিদ্যমান অপারেশনগুলির আচরণ পরিবর্তন করে না।
ভেন্ডর এক্সটেনশনগুলো OEM অপারেশন এবং ডেটা টাইপের একটি আরও সুসংগঠিত বিকল্প প্রদান করে, যা অ্যান্ড্রয়েড ১০-এ বাতিল করা হয়েছিল। আরও তথ্যের জন্য, OEM অপারেশন এবং ডেটা টাইপ দেখুন।
এক্সটেনশন ব্যবহারের অনুমতি তালিকা
ভেন্ডর এক্সটেনশন শুধুমাত্র /product , /vendor , /odm , এবং /data পার্টিশনে থাকা সুস্পষ্টভাবে নির্দিষ্ট অ্যান্ড্রয়েড অ্যাপ এবং নেটিভ বাইনারি দ্বারা ব্যবহার করা যেতে পারে। /system পার্টিশনে অবস্থিত অ্যাপ এবং নেটিভ বাইনারি ভেন্ডর এক্সটেনশন ব্যবহার করতে পারে না।
NNAPI ভেন্ডর এক্সটেনশন ব্যবহার করার অনুমতিপ্রাপ্ত অ্যান্ড্রয়েড অ্যাপ এবং বাইনারিগুলির একটি তালিকা /vendor/etc/nnapi_extensions_app_allowlist ফাইলে সংরক্ষিত থাকে। ফাইলটির প্রতিটি লাইনে একটি নতুন এন্ট্রি থাকে। একটি এন্ট্রি হতে পারে একটি নেটিভ বাইনারি পাথ যার শুরুতে একটি স্ল্যাশ (/) থাকে, যেমন, /data/foo , অথবা একটি অ্যান্ড্রয়েড অ্যাপ প্যাকেজের নাম, যেমন, 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 ব্যবহার করে এনকোড করা হয়।