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 çalıştıran cihazlarda HAL 1.2 veya sonraki sürümleri çalıştıran sürücüler, satıcı uzantılarını desteklemek için kullanabilirsiniz. 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 bkz. OEM işlemleri ve veri türleri.

Uzantı kullanımı izin verilenler listesi

Satıcı uzantıları, yalnızca açıkça belirtilen Android uygulamaları ve /product, /vendor, /odm ve /data bölümlerinde yerel ikili programlar. /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 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 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, 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 ad alanı görevi görür. NNAPI, bunu satıcı uzantılarını ayırt etmek için kullanılı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, 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, &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şlemi veya işlenen türünü işlerken uzantıyı kontrol etmelidir. ön eki ile değiştirebilirsiniz. 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 ekten uzantı adına eşleme, bire bir yazışmadır. (bijection) içerir. 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ı işlenenleri, şurada ilişkili verilere sahip olabilir: operand.extraParams.extension çalışma zamanı tarafından rastgele boyuttaki ham veri blobu olarak değerlendirilir.

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'nin anlamı işlem ve veri türleri OEM'ye özgüdür ve herhangi bir zamanda değiştirilebilir. OEM işlem ve veri türleri OperationType::OEM_OPERATION kullanılarak kodlanır. OperandType::OEM ve OperandType::TENSOR_OEM_BYTE.