Android 10'da kullanıma sunulan Neural Networks API (NNAPI) tedarikçi firma uzantıları, tedarikçi firma tarafından tanımlanan işlem ve veri türlerinin koleksiyonlarıdır. NN HAL 1.2 veya daha yeni sürümleri çalıştıran cihazlarda sürücüler, ilgili tedarikçi uzantılarını destekleyerek özel donanım hızlandırmalı işlemler sağlayabilir. Tedarikçi firma uzantıları, mevcut işlemlerin davranışını değiştirmez.
Tedarikçi firma uzantıları, OEM çalışmasına kıyasla daha yapılandırılmış bir alternatif sunar ve veri türlerine izin verilmez. Daha fazla bilgi için bkz. OEM işlemleri ve veri türleri.
Uzantıların kullanımı izin verilenler listesi
Tedarikçi uzantıları yalnızca açıkça belirtilen Android uygulamaları ve /product
, /vendor
, /odm
ve /data
bölümlerindeki yerel ikili dosyalar tarafından kullanılabilir.
/system
bölümünde bulunan uygulamalar ve yerel ikili programlar, sağlayıcıyı kullanamaz
uzantılar.
NNAPI tedarikçi firma uzantılarını kullanmasına izin verilen Android uygulamaları ve ikili programların listesi
/vendor/etc/nnapi_extensions_app_allowlist
içinde depolanıyor. Dosyanın her satırı
yeni bir giriş içeriyor. Giriş, önüne eğik çizgi (/) eklenen yerel bir ikili yol (ör. /data/foo
) veya bir Android uygulama paketinin adı (ör. com.foo.bar
) olabilir.
İzin verilenler listesi, NNAPI çalışma zamanı paylaşılan kitaplığından zorunlu kılınır. Bu kitaplık yanlış kullanıma karşı koruma sağlar ancak NNAPI sürücüsü HAL arayüzünü kullanarak bir uygulamayı doğrudan yükleyebilirsiniz.
Tedarikçi firma uzantısı tanımı
Tedarikçi, uzantı tanımını içeren bir başlık dosyası oluşturur ve korur. CEVAP
bir uzantı tanımının tam örneğini şu adreste bulabilirsiniz:
example/fibonacci/FibonacciExtension.h
.
Her uzantının, ters alan adıyla başlayan benzersiz bir adı olmalıdır sağlar.
const char EXAMPLE_EXTENSION_NAME[] = "com.example.my_extension";
Ad, işlemler ve veri türleri için bir ad alanı görevi görür. NNAPI, tedarikçi uzantılarını ayırt etmek için bu adı kullanır.
İşlemler ve veri türleri, runtime/include/NeuralNetworks.h
'dakilere benzer şekilde tanımlanır.
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,
};
Bir uzantı işlemi, uzantı olmayan işlenen dahil olmak üzere herhangi bir işlem gören türünü kullanabilir türlerini ve işlem gören türlerini kapsar. Başka bir uzantıdaki bir operatör türü kullanıldığında sürücü, diğer uzantıyı desteklemelidir.
Uzantılar, uzantı işlenenlerine eşlik edecek özel yapılar da tanımlayabilir.
/**
* Quantization parameters for {@link EXAMPLE_TENSOR}.
*/
typedef struct ExampleTensorParams {
double scale;
int64_t zeroPoint;
} ExampleTensorParams;
NNAPI istemcilerinde uzantıları kullanma
İlgili içeriği oluşturmak için kullanılan
runtime/include/NeuralNetworksExtensions.h
(C API) dosyası, çalışma zamanı uzantısı desteği sağlar. Bu bölümde,
C API'ye genel bakış.
Cihazın bir uzantıyı destekleyip desteklemediğini kontrol etmek için
ANeuralNetworksDevice_getExtensionSupport
.
bool isExtensionSupported;
CHECK_EQ(ANeuralNetworksDevice_getExtensionSupport(device, EXAMPLE_EXTENSION_NAME,
&isExtensionSupported),
ANEURALNETWORKS_NO_ERROR);
if (isExtensionSupported) {
// The device supports the extension.
...
}
Uzantı işlem göreni olan bir model oluşturmak için
ANeuralNetworksModel_getExtensionOperandType
ve çağrının işlenen türünü almak için
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);
İsterseniz
ANeuralNetworksModel_setOperandExtensionData
kullanabilirsiniz.
ExampleTensorParams params{
.scale = 0.5,
.zeroPoint = 128,
};
CHECK_EQ(ANeuralNetworksModel_setOperandExtensionData(model, operandIndex, ¶ms, sizeof(params)),
ANEURALNETWORKS_NO_ERROR);
Uzatma işlemi içeren bir model oluşturmak için ANeuralNetworksModel_getExtensionOperationType
kullanarak işlem türünü alın ve ANeuralNetworksModel_addOperation
'i çağırın.
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 sürücüsüne uzantı desteği ekleme
Sürücüler, desteklenen uzantıları
IDevice::getSupportedExtensions
yöntemidir. Döndürülen listede, desteklenen her uzantıyı açıklayan bir giriş bulunmalıdır.
Extension {
.name = EXAMPLE_EXTENSION_NAME,
.operandTypes = {
{
.type = EXAMPLE_SCALAR,
.isTensor = false,
.byteSize = 8,
},
{
.type = EXAMPLE_TENSOR,
.isTensor = true,
.byteSize = 8,
},
},
}
Türleri ve işlemleri tanımlamak için kullanılan 32 bitten yüksek Model::ExtensionTypeEncoding::HIGH_BITS_PREFIX
ikili basamaklar uzantı ön ekiyle ilişkiliyken düşük Model::ExtensionTypeEncoding::LOW_BITS_TYPE
ikili basamaklar uzantının türünü veya işlemini temsil eder.
Sürücü, bir işlem veya operant türünü işlerken uzantı ön ekini kontrol etmelidir. Uzantı önekinin sıfır olmayan bir değeri varsa işlem veya işlenen
type, bir uzantı türüdür. Değer 0
ise işlem veya işlenen türü
bir uzantı türü değil.
Öneki bir uzantı adıyla eşlemek için
model.extensionNameToPrefix
.
Ön ek ile uzantı adı arasındaki eşleme, belirli bir model için bire bir ilişkidir (bijection). Farklı ön ek değerleri, farklı modellerde aynı uzantı adına karşılık gelebilir.
Sürücü, uzantı işlemlerini ve veri türlerini doğrulamalıdır çünkü NNAPI çalışma zamanı belirli uzantı işlemlerini ve veri türlerini doğrulayamaz.
Uzantı operatörleri, çalışma zamanında rastgele boyuttaki ham veri kümesi olarak işlenen operand.extraParams.extension
içinde ilişkili verilere sahip olabilir.
OEM işlemi ve veri türleri
NNAPI, izin vermek için bir OEM işlemine ve OEM veri türlerine sahiptir
cihaz üreticilerinin özel, sürücüye özgü işlevler sağlamasıdır. Bu
işlem ve veri türleri yalnızca OEM uygulamaları tarafından kullanılır. OEM'nin anlamı
işlem ve veri türleri OEM'ye özgüdür ve herhangi bir zamanda değiştirilebilir. OEM işlemi ve veri türleri OperationType::OEM_OPERATION
, OperandType::OEM
ve OperandType::TENSOR_OEM_BYTE
kullanılarak kodlanır.