Satıcı uzantıları

Neural Networks API (NNAPI) tedarikçi firma uzantıları, Android 10 satıcı tarafından tanımlanan işlem ve veri türleri koleksiyonudur. 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. Satıcı uzantıları, ve mevcut işlemlerin davranışlarıyla ilgili değildir.

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 OEM işlemi ve veri türleri başlıklı makaleyi inceleyin.

Uzantı 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. Bir giriş, /data/foo veya bir Android uygulama paketi adı gibi eğik çizgi (/) kullanarak örnek, com.foo.bar.

İzin verilenler listesi, NNAPI çalışma zamanı paylaşılan kitaplığından uygulanı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 firma, uzantı tanımına sahip bir başlık dosyası oluşturur ve bu dosyayı sürdürür. CEVAP bir uzantı tanımının tam örneğini şu adreste bulabilirsiniz: example/fibonacci/FibonacciExtension.h.

Her uzantının, tedarikçi firmanın ters alan adıyla başlayan benzersiz bir adı olmalıdır.

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

Ad, işlemler ve veri türleri için 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 aşağıdakine benzer şekilde bildirilir: 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,
};

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. Şuradaki işlenen türü kullanılırken: başka bir uzantı varsa sürücünün diğer uzantıyı desteklemesi gerekir.

Uzantıların, uzantı operatörlerine eşlik edecek özel yapılar da tanımlaması mümkündür.

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

NNAPI istemcilerinde uzantıları kullanma

runtime/include/NeuralNetworksExtensions.h (C API) dosyası, çalışma zamanında uzantı desteği sağlar. Bu bölümde, C API'ye genel bakış.

Bir cihazın uzantıyı destekleyip desteklemediğini kontrol etmek için ANeuralNetworksDevice_getExtensionSupport simgesini kullanın.

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);

İsteğe bağlı olarak, ek verileri bir uzantı operatörüyle ilişkilendirmek için ANeuralNetworksModel_setOperandExtensionData kullanın.

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

Uzantı işlemi içeren bir model oluşturmak için ANeuralNetworksModel_getExtensionOperationType işlem türünü almak ve 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 sürücüsüne uzantı desteği ekleme

Sürücüler, desteklenen uzantıları IDevice::getSupportedExtensions yöntemidir. Döndürülen liste, desteklenen her öğeyi açıklayan bir giriş içermelidir uzantısına sahip olur.

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 bit arasından Model::ExtensionTypeEncoding::HIGH_BITS_PREFIX bit önek ve düşük Model::ExtensionTypeEncoding::LOW_BITS_TYPE bitler türü veya işlemi temsil eder görünür.

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.

Ön eki bir uzantı adıyla eşlemek için model.extensionNameToPrefix'da arayın. Ön ekten uzantı adına eşleme, bire bir yazışmadır. (bijeksiyon) alabilir. Farklı önek değerleri farklı modellerde aynı uzantı adını kullanın.

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 çalışma 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 işleminin ve veri türlerinin semantikleri OEM'ye özeldir ve herhangi bir zamanda değişebilir. OEM işlem ve veri türleri OperationType::OEM_OPERATION kullanılarak kodlanır. OperandType::OEM ve OperandType::TENSOR_OEM_BYTE.