Neural Networks API

Android Neural Networks API (NNAPI), Android cihazlarda makine öğrenimi için yoğun hesaplama işlemleri çalıştırmak üzere tasarlanmış bir Android C API'sidir. NNAPI, sinir ağları oluşturup eğiten TensorFlow Lite ve Caffe2 gibi daha üst düzey makine öğrenimi çerçeveleri için temel bir işlev katmanı sağlamak üzere tasarlanmıştır. API, Android 8.1 (API düzeyi 27) veya sonraki sürümleri çalıştıran tüm Android cihazlarda kullanılabilir.

NNAPI, Android cihazlardaki verileri önceden eğitilmiş, geliştirici tanımlı modellere uygulayarak çıkarım yapmayı destekler. Çıkarsama örnekleri arasında resimleri sınıflandırma, kullanıcı davranışını tahmin etme ve arama sorgusuna uygun yanıtları seçme yer alır.

Cihaz üzerinde çıkarım yapmanın birçok avantajı vardır:

  • Gecikme: Ağ bağlantısı üzerinden istek gönderip yanıt beklemeniz gerekmez. Örneğin bu, video uygulamaları için çerçeveleri işleyecek şekilde yeniden üretiyoruz.
  • Kullanılabilirlik: Uygulama, ağ kapsamının dışında olsa bile çalışır.
  • Hız: Nöral ağ işlemeye özgü yeni donanım Tek başına genel amaçlı bir CPU'ya göre çok daha hızlı işlem sağlar.
  • Gizlilik: Veriler Android cihazdan dışarı çıkmaz.
  • Maliyet: Tüm hesaplamalar üzerinde işlem yapıldığında sunucu grubu gerekmez Android cihaz.

Geliştiricilerin göz önünde bulundurması gereken bazı avantajlar ve dezavantajlar da vardır:

  • Sistem kullanımı: Nöral ağların değerlendirilmesi aşamasında bu da pil gücü kullanımını artırabilir. Uygulamanız için bu bir sorunsa, özellikle uzun süren hesaplamalar söz konusu olduğunda pil sağlığını izlemeyi düşünmeniz gerekir.
  • Uygulama boyutu: Modellerinizin boyutuna dikkat edin. Modeller birkaç megabaytlık alan kaplamalıdır. APK'nızda büyük modeller gruplanıyorsa kullanıcılarınızı fazlaca etkileyecekse, söz konusu uygulamanın modellerini kullanarak veya uygulamanızı çalıştırdıktan sonra daha yüksek bir bulut ortamına sahip. NNAPI, çalıştırma işlevi sağlamaz modeller.

NNAPI'nin nasıl kullanılacağına dair bir örnek görmek için Android Neural Networks API örneğine bakın.

Neural Networks API çalışma zamanını anlama

NNAPI; makine öğrenimi kitaplıkları, çerçeveleri ve araçları tarafından çağrılmalıdır. Geliştiricilerin modellerini cihaz dışında eğitip Android'de dağıtmasına olanak tanıyan cihazlar. Uygulamalar genelde NNAPI'yi doğrudan kullanmaz, makine öğrenimi çerçevelerini kullanabilirsiniz. Bu çerçeveler de Desteklenen cihazlarda donanım hızlandırmalı çıkarım işlemleri gerçekleştirmek için NNAPI.

Android'in sinir ağı çalışma zamanı, uygulamanın gereksinimlerine ve Android cihazdaki donanım özelliklerine bağlı olarak, özel sinir ağı donanımı, grafik işlem birimleri (GPU'lar) ve dijital sinyal işlemcileri (DSP'ler) dahil olmak üzere mevcut cihaz üzerinde işlemcilere hesaplama iş yükünü verimli bir şekilde dağıtabilir.

Özel bir tedarikçi sürücüsü bulunmayan Android cihazlarda NNAPI çalışma zamanı istekleri CPU'da yürütür.

Şekil 1'de NNAPI için üst düzey sistem mimarisi gösterilmiştir.

Şekil 1. Android Neural Networks API için sistem mimarisi
'nı inceleyin.

Nöral Ağlar API'si programlama modeli

NNAPI kullanarak hesaplamalar yapmak için önce yönlendirilmiş bir yapılacak hesaplamaları tanımlayan grafik. Bu hesaplama grafiği, (örneğin, bir alt kümeden aşağı aktarılan ağırlıklar ve sapmalar) makine öğrenimi çerçevesi) NNAPI çalışma zamanı değerlendirmesi için model oluşturur.

NNAPI dört ana soyutlama kullanır:

  • Model: Matematiksel işlemlerin ve bir eğitim süreci aracılığıyla öğrenilen sabit değerlerin hesaplama grafiği. Bu işlemler, sinir ağlarına özgüdür. 2 boyutlu (2D) konvolüsyon, lojistik (sigmoid) etkinleştirme, düzeltilmiş doğrusal (ReLU) etkinleştirmesi ve daha fazlası. Model oluşturma, eşzamanlı bir işlemdir. Başarıyla oluşturulduktan sonra mesaj dizileri ve derlemelerde yeniden kullanılabilir. NNAPI'de bir model ANeuralNetworksModel kullanır.
  • Derleme: Bir NNAPI modelini aşağıdaki örnekte derlemek için kullanılan bir yapılandırmayı temsil eder: alt düzey kod. Derleme oluşturma işlemi eşzamanlı bir işlemdir. Bir kez başarıyla oluşturulduktan sonra, ileti dizilerinde ve yürütmelerde yeniden kullanılabilir. NNAPI'de her derleme bir ANeuralNetworksCompilation örneği olarak temsil edilir.
  • Bellek: Paylaşılan belleği, bellekle eşlenen dosyaları ve benzer belleği temsil eder tamponları kullanır. Bellek arabelleği kullanmak, NNAPI çalışma zamanı verilerini sürücülere aktarmasına olanak tanır. verimli bir şekilde çalışır. Uygulamalar genellikle bir modeli tanımlamak için gereken tüm tenzorları içeren bir paylaşılan bellek arabelleği oluşturur. Bir yürütme örneğinin giriş ve çıkışlarını depolamak için bellek arabelleklerini de kullanabilirsiniz. NNAPI'de her bellek arabelleği ANeuralNetworksMemory kullanır.
  • Yürütme: Bir NNAPI modelini bir giriş grubuna uygulamak ve sonuçları toplamak için kullanılan arayüz. Yürütme, eşzamanlı veya eşzamansız olarak yapılabilir.

    Eşzamansız yürütme için birden fazla iş parçacığı aynı yürütmeyi bekleyebilir. Bu yürütme işlemi tamamlandığında, tüm ileti dizileri yayınlandı.

    NNAPI'de her yürütme ANeuralNetworksExecution kullanır.

Şekil 2'de temel programlama akışı gösterilmektedir.

Şekil 2. Android Neural Networks API için programlama akışı

Bu bölümün geri kalanında, NNAPI modelinizi hesaplama yapma, modeli derleme ve derlenen modeli yürütme.

Eğitim verilerine erişim sağlama

Eğitilmiş ağırlık ve önyargı verileriniz büyük olasılıkla bir dosyada depolanır. NNAPI çalışma zamanına bu verilere verimli bir erişim sağlamak için ANeuralNetworksMemory_createFromFd() işlevini çağırıp açılan veri dosyasının dosya tanımlayıcısını ileterek bir ANeuralNetworksMemory örneği oluşturun. Ayrıca, bellek koruma işaretlerini ve paylaşılan bellek bölgesinin dosyada başladığı ofseti de belirtirsiniz.

// Create a memory buffer from the file that contains the trained data
ANeuralNetworksMemory* mem1 = NULL;
int fd = open("training_data", O_RDONLY);
ANeuralNetworksMemory_createFromFd(file_size, PROT_READ, fd, 0, &mem1);

Bu örnekte tüm ağırlıklarımız için yalnızca bir ANeuralNetworksMemory örneği kullansak da birden fazla dosya için birden fazla ANeuralNetworksMemory örneği kullanmak mümkündür.

Yerel donanım arabelleklerini kullan

Yerel donanım arabelleklerini kullanabilirsiniz giriş, çıkış ve sabit işlem göreni değerler kullanır. Belirli durumlarda, NNAPI hızlandırıcısı, sürücünün verileri kopyalamasına gerek kalmadan AHardwareBuffer nesnelerine erişebilir. AHardwareBuffer alanında çok sayıda farklı yapılandırmalara sahiptir ve her NNAPI hızlandırıcı tüm izin vermez. Bu sınırlama nedeniyle, ANeuralNetworksMemory_createFromAHardwareBuffer referans dokümanlarında listelenen kısıtlamalara bakın ve AHardwareBuffer kullanan derlemelerin ve yürütme işlemlerinin beklendiği gibi davrandığından emin olmak için hedef cihazlarda önceden test edin. Hızlandırıcıyı belirtmek için cihaz atamasını kullanın.

NNAPI çalışma zamanının bir AHardwareBuffer nesnesine erişmesine izin vermek için ANeuralNetworksMemory öğesini çağırarak ANeuralNetworksMemory_createFromAHardwareBuffer fonksiyonunu göstererek AHardwareBuffer nesnesini, aşağıdaki kod örneğinde gösterildiği gibi:

// Configure and create AHardwareBuffer object
AHardwareBuffer_Desc desc = ...
AHardwareBuffer* ahwb = nullptr;
AHardwareBuffer_allocate(&desc, &ahwb);

// Create ANeuralNetworksMemory from AHardwareBuffer
ANeuralNetworksMemory* mem2 = NULL;
ANeuralNetworksMemory_createFromAHardwareBuffer(ahwb, &mem2);

NNAPI'nin artık AHardwareBuffer nesnesine erişmesi gerekmediğinde karşılık gelen ANeuralNetworksMemory örneği:

ANeuralNetworksMemory_free(mem2);

Not:

  • Tekliflerinizi otomatikleştirmek ve optimize etmek için AHardwareBuffer yalnızca arabelleğin tamamı için geçerlidir; şununla kullanamazsınız: bir ARect parametresidir.
  • NNAPI çalışma zamanı arabelleği temizlemez. Giriş ve çıkış tamponlarının her zaman erişilebilir hale getirebilirsiniz.
  • Senkronizasyon çiti dosya tanımlayıcıları desteklenmez.
  • Şununla bir AHardwareBuffer için: özel biçimler ve kullanım bitleri vardır. Bu, tedarikçi firmanın uygulamasına bağlıdır temizlik malzemesinin temizlenmesinden istemcinin mi yoksa sürücünün mi sorumlu önbellek.

Model

Model, NNAPI'deki temel hesaplama birimidir. Her model tanımlanmış işleyen veya işlem gücüne sahip olur.

İşlemler

İşlemciler, grafiği tanımlamada kullanılan veri nesneleridir. Bunlar arasında, ve çıkışları, yani bu verileri içeren ara düğümler bir işlemden diğerine geçer ve bu işlemden geçen sabit değerler bu işlemleri yapabilirsiniz.

NNAPI modellerine eklenebilecek iki tür işlenen vardır: skalerler ve tensörler olarak değiştirin.

Skaler, tek bir değeri temsil eder. NNAPI, boole'de skaler değerleri destekler. 16 bit kayan nokta, 32 bit kayan nokta, 32 bit tam sayı ve imzasız 32 bit tam sayı biçimleri.

NNAPI'deki çoğu işlem tensörleri içerir. Tensörler n boyutlu dizilerdir. NNAPI, 16 bit kayan nokta, 32 bit kayan nokta, 8 bit kesirli, 16 bit kesirli, 32 bit tam sayı ve 8 bit doğru/yanlış değerlerine sahip tenzorları destekler.

Örneğin, 3. şekil iki işlem içeren bir modeli temsil eder: artım ve ardından çarpma. Model, bir giriş tensörü alır ve bir çıkış tensörü oluşturur.

Şekil 3. NNAPI modeli için işlenenlere örnek
'nı inceleyin.

Yukarıdaki modelin yedi işleneni vardır. Bu operatörler, modele eklendikleri sıranın dizini tarafından dolaylı olarak tanımlanır. İlk işlenen ekinin dizini 0, ikincisinin dizini 1'dir ve bu şekilde devam eder. 1, 2, 3 ve 5 operatörleri sabit operatörlerdir.

İşlemleri ekleme sırası önemli değildir. Örneğin, model çıkış operatı ilk eklenen olabilir. Önemli olan, bir operand'a atıfta bulunurken doğru dizin değerini kullanmaktır.

İşlem görenlerin türleri vardır. Bunlar modele eklendiklerinde belirtilir.

İşlem gören, bir modelin hem girişi hem çıkışı olarak kullanılamaz.

Her işlenen; model girişi, sabit veya çıkış işleneni olmalıdır. sahip olmanız gerekir.

İşlem görenleri kullanma hakkında daha fazla bilgi için bkz. İşlenenler hakkında daha fazla bilgi

İşlemler

Bir işlem, yapılacak hesaplamaları belirtir. Her işlem aşağıdaki unsurlardan oluşur:

  • bir işlem türü (ör. toplama, çarpma, topoloji),
  • İşlemin giriş için kullandığı operatörlerin dizinlerinin listesi ve
  • İşlemin çıkış için kullandığı operatörlerin dizinlerinin listesi.

Bu listelerdeki sıra önemlidir; bkz. Beklenen girişler için NNAPI API referansı ve çıkışları arasında geçiş yapacaktır.

Bir işlemin tükettiği veya ürettiği işlem görenleri modele eklemeniz gerekir kontrol edin.

İşlemleri ekleme sıranız önemli değildir. NNAPI, işlem grafiğinin oluşturduğu bağımlılıkları işlemlerin yürütüleceği sırayı belirler.

NNAPI'nin desteklediği işlemler aşağıdaki tabloda özetlenmiştir:

Kategori İşlemler
Öğe bazında matematiksel işlemler
Tensor işleme
Resim işlemleri
Arama işlemleri
Normalleştirme işlemleri
Konvolüsyon işlemleri
Havuzlama işlemleri
Etkinleştirme işlemleri
Diğer işlemler

API düzeyi 28'de bilinen sorun: İletilirken ANEURALNETWORKS_TENSOR_QUANT8_ASYMM tensörleri ANEURALNETWORKS_PAD şu anda Android 9 (API düzeyi 28) ve sonraki sürümlerde kullanılabilen NNAPI'den alınan çıkış, üst düzey makine öğreniminden elde edilen çıkışla eşleşmeyebilir çerçeveler, örneğin TensorFlow Lite. Bunun yerine yalnızca ANEURALNETWORKS_TENSOR_FLOAT32 parametresini iletmeniz gerekir. Sorun, Android 10 (API düzeyi 29) ve sonraki sürümlerde giderilmiştir.

Model oluşturma

Aşağıdaki örnekte, şekil 3.

Modeli oluşturmak için aşağıdaki adımları izleyin:

  1. Boş bir model tanımlamak için ANeuralNetworksModel_create() işlevini çağırın.

    ANeuralNetworksModel* model = NULL;
    ANeuralNetworksModel_create(&model);
  2. Numarayı çağırarak işlenenleri modelinize ekleyin ANeuralNetworks_addOperand(). Veri türleri ANeuralNetworksOperandType veri yapısı kullanılarak tanımlanır.

    // In our example, all our tensors are matrices of dimension [3][4]
    ANeuralNetworksOperandType tensor3x4Type;
    tensor3x4Type.type = ANEURALNETWORKS_TENSOR_FLOAT32;
    tensor3x4Type.scale = 0.f;    // These fields are used for quantized tensors
    tensor3x4Type.zeroPoint = 0;  // These fields are used for quantized tensors
    tensor3x4Type.dimensionCount = 2;
    uint32_t dims[2] = {3, 4};
    tensor3x4Type.dimensions = dims;

    // We also specify operands that are activation function specifiers ANeuralNetworksOperandType activationType; activationType.type = ANEURALNETWORKS_INT32; activationType.scale = 0.f; activationType.zeroPoint = 0; activationType.dimensionCount = 0; activationType.dimensions = NULL;

    // Now we add the seven operands, in the same order defined in the diagram ANeuralNetworksModel_addOperand(model, &tensor3x4Type); // operand 0 ANeuralNetworksModel_addOperand(model, &tensor3x4Type); // operand 1 ANeuralNetworksModel_addOperand(model, &activationType); // operand 2 ANeuralNetworksModel_addOperand(model, &tensor3x4Type); // operand 3 ANeuralNetworksModel_addOperand(model, &tensor3x4Type); // operand 4 ANeuralNetworksModel_addOperand(model, &activationType); // operand 5 ANeuralNetworksModel_addOperand(model, &tensor3x4Type); // operand 6
  3. Uygulamanızın bir eğitim sürecinden elde ettiği ağırlıklar ve önyargılar gibi sabit değerlere sahip operatörler için ANeuralNetworksModel_setOperandValue() ve ANeuralNetworksModel_setOperandValueFromMemory() işlevlerini kullanın.

    Aşağıdaki örnekte, Eğitim verilerine erişim izni verme bölümünde oluşturduğumuz bellek arabelleğine karşılık gelen sabit değerleri eğitim veri dosyasından ayarlıyoruz.

    // In our example, operands 1 and 3 are constant tensors whose values were
    // established during the training process
    const int sizeOfTensor = 3 * 4 * 4;    // The formula for size calculation is dim0 * dim1 * elementSize
    ANeuralNetworksModel_setOperandValueFromMemory(model, 1, mem1, 0, sizeOfTensor);
    ANeuralNetworksModel_setOperandValueFromMemory(model, 3, mem1, sizeOfTensor, sizeOfTensor);

    // We set the values of the activation operands, in our example operands 2 and 5 int32_t noneValue = ANEURALNETWORKS_FUSED_NONE; ANeuralNetworksModel_setOperandValue(model, 2, &noneValue, sizeof(noneValue)); ANeuralNetworksModel_setOperandValue(model, 5, &noneValue, sizeof(noneValue));
  4. Yönlendirilmiş grafikteki hesaplama yapmak istediğiniz her işlem için işlemini modelinize ANeuralNetworksModel_addOperation() işlevini kullanın.

    Uygulamanız bu çağrının parametreleri olarak şunları sağlamalıdır:

    • işlem türü
    • giriş değerlerinin sayısı
    • Giriş operatörlerinin dizinleri dizisi
    • çıkış değerlerinin sayısı
    • Çıkış operatörlerinin dizinleri dizisi

    İşlem görenin, aynı öğenin hem girişi hem çıkışı için kullanılamayacağını unutmayın. işlemidir.

    // We have two operations in our example
    // The first consumes operands 1, 0, 2, and produces operand 4
    uint32_t addInputIndexes[3] = {1, 0, 2};
    uint32_t addOutputIndexes[1] = {4};
    ANeuralNetworksModel_addOperation(model, ANEURALNETWORKS_ADD, 3, addInputIndexes, 1, addOutputIndexes);

    // The second consumes operands 3, 4, 5, and produces operand 6 uint32_t multInputIndexes[3] = {3, 4, 5}; uint32_t multOutputIndexes[1] = {6}; ANeuralNetworksModel_addOperation(model, ANEURALNETWORKS_MUL, 3, multInputIndexes, 1, multOutputIndexes);
  5. ANeuralNetworksModel_identifyInputsAndOutputs() işlevini çağırarak modelin hangi operatörleri giriş ve çıkış olarak ele alması gerektiğini belirleyin.

    // Our model has one input (0) and one output (6)
    uint32_t modelInputIndexes[1] = {0};
    uint32_t modelOutputIndexes[1] = {6};
    ANeuralNetworksModel_identifyInputsAndOutputs(model, 1, modelInputIndexes, 1 modelOutputIndexes);
  6. İsteğe bağlı olarak, ANEURALNETWORKS_TENSOR_FLOAT32 kadar düşük bir aralık veya hassasiyetle hesaplanabilmesine IEEE 754 16 bit kayan nokta biçimi için ANeuralNetworksModel_relaxComputationFloat32toFloat16().

  7. Modelinizin tanımını tamamlamak için ANeuralNetworksModel_finish() numaralı telefonu arayın. Hata yoksa bu işlev ANEURALNETWORKS_NO_ERROR sonuç kodunu döndürür.

    ANeuralNetworksModel_finish(model);

Bir model oluşturduktan sonra bu modeli istediğiniz sayıda derleyebilir ve her bir modeli yürütebilirsiniz. derlemenize izin verir.

Akışı kontrol etme

Kontrol akışını bir NNAPI modeline dahil etmek için aşağıdakileri yapın:

  1. İlgili yürütme alt grafiklerini (then ve else alt grafikleri) oluşturun bir IF ifadesi, WHILE döngüsü için condition ve body alt grafikleri) bağımsız ANeuralNetworksModel* modelleri olarak:

    ANeuralNetworksModel* thenModel = makeThenModel();
    ANeuralNetworksModel* elseModel = makeElseModel();
  2. Kontrol akışını içeren model içinde bu modellere referans veren işlevler oluşturun:

    ANeuralNetworksOperandType modelType = {
        .type = ANEURALNETWORKS_MODEL,
    };
    ANeuralNetworksModel_addOperand(model, &modelType);  // kThenOperandIndex
    ANeuralNetworksModel_addOperand(model, &modelType);  // kElseOperandIndex
    ANeuralNetworksModel_setOperandValueFromModel(model, kThenOperandIndex, &thenModel);
    ANeuralNetworksModel_setOperandValueFromModel(model, kElseOperandIndex, &elseModel);
  3. Kontrol akışı işlemini ekleyin:

    uint32_t inputs[] = {kConditionOperandIndex,
                         kThenOperandIndex,
                         kElseOperandIndex,
                         kInput1, kInput2, kInput3};
    uint32_t outputs[] = {kOutput1, kOutput2};
    ANeuralNetworksModel_addOperation(model, ANEURALNETWORKS_IF,
                                      std::size(inputs), inputs,
                                      std::size(output), outputs);

Derleme

Derleme adımı, modelinizin hangi işlemcilerde çalışacağını belirler ve ilgili sürücülerden yürütme işlemine hazırlanmalarını ister. Bu modelinizin işlemcilerine özel makine kodunun oluşturulmasını içerir üzerinde çalışır.

Model derlemek için şu adımları uygulayın:

  1. Yeni bir derleme örneği oluşturmak için ANeuralNetworksCompilation_create() işlevini çağırın.

    // Compile the model
    ANeuralNetworksCompilation* compilation;
    ANeuralNetworksCompilation_create(model, &compilation);

    İsterseniz hangi cihazlarda çalışacağını açıkça seçmek için cihaz atamasını kullanabilirsiniz.

  2. İsterseniz çalışma zamanının pil gücü arasında nasıl denge kuracağını etkileyebilirsiniz. ve yürütme hızını artırır. Bunu yapmak için ANeuralNetworksCompilation_setPreference() numaralı telefonu arayabilirsiniz.

    // Ask to optimize for low power consumption
    ANeuralNetworksCompilation_setPreference(compilation, ANEURALNETWORKS_PREFER_LOW_POWER);

    Belirtebileceğiniz tercihler şunlardır:

  3. İsteğe bağlı olarak ANeuralNetworksCompilation_setCaching çağrısını yaparak derleme önbelleğe almayı ayarlayabilirsiniz.

    // Set up compilation caching
    ANeuralNetworksCompilation_setCaching(compilation, cacheDir, token);

    getCodeCacheDir() kullanın cacheDir için. Belirtilen token, içindeki her model için benzersiz olmalıdır takip edebilirsiniz.

  4. ANeuralNetworksCompilation_finish() işlevini çağırarak derleme tanımını tamamlayın. Hata yoksa bu işlev ANEURALNETWORKS_NO_ERROR sonuç kodunu döndürür.

    ANeuralNetworksCompilation_finish(compilation);

Cihaz bulma ve atama

Android 10 (API düzeyi 29) ve sonraki sürümleri çalıştıran Android cihazlarda NNAPI, makine öğrenimi çerçeve kitaplıklarının ve uygulamalarının mevcut cihazlar hakkında bilgi edinmesine ve yürütme için kullanılacak cihazları belirtmesine olanak tanıyan işlevler sağlar. Kullanılabilir cihazlar hakkında bilgi vermek uygulamaların şunları almasını sağlar: bilinen iki sürücüden kaçınmak için bir cihazda bulunan sürücülerin arasındaki farkları konuşacağız. Uygulamalara, bir modelin farklı bölümlerinin hangi cihazlarda çalışacağını belirtme olanağı sunarak uygulamaları dağıtıldıkları Android cihaz için optimize edebilirsiniz.

Cihaz bulma

Mevcut cihaz sayısını öğrenmek için ANeuralNetworks_getDeviceCount simgesini kullanın. Her cihaz için ANeuralNetworks_getDevice o cihaza referans için ANeuralNetworksDevice örneği ayarlayın.

Cihaz referansı edindikten sonra Google Play Yardım Merkezi'ndeki şu işlevleri kullanarak yapabilirsiniz:

Cihaz ataması

Bir modelin hangi işlemlerinin belirli cihazlarda çalışabileceğini öğrenmek için ANeuralNetworksModel_getSupportedOperationsForDevices simgesini kullanın.

Yürütme için hangi hızlandırıcıların kullanılacağını kontrol etmek üzere ANeuralNetworksCompilation_create yerine ANeuralNetworksCompilation_createForDevices çağrısı yapın. Elde edilen ANeuralNetworksCompilation nesnesini normal şekilde kullanın. Sağlanan model aşağıdaki gibi işlemler içeriyorsa, işlev bir hata döndürür: seçilen cihazlar tarafından desteklenmiyor.

Birden fazla cihaz belirtilirse çalışmanın cihazlara dağıtılmasından çalışma zamanı sorumludur.

Diğer cihazlara benzer şekilde, NNAPI CPU uygulaması nnapi-reference adında ve ANEURALNETWORKS_DEVICE_TYPE_CPU türündeki bir ANeuralNetworksDevice ile temsil edilir. ANeuralNetworksCompilation_createForDevices çağrılırken model derleme ve yürütmeyle ilgili hata durumlarını işlemek için CPU uygulaması kullanılmaz.

Bir modeli, alan adındaki alt modellere ayırmak uygulamanın çalıştırılabilir. Manuel işlem gerektirmeyen uygulamalar bölümlendirme, daha basit şekilde ANeuralNetworksCompilation_create hızlandırmak için mevcut tüm cihazları (CPU dahil) kullanmalarını modeli. Model, ANeuralNetworksCompilation_createForDevices kullanılarak belirttiğiniz cihazlar tarafından tam olarak desteklenemiyorsa ANEURALNETWORKS_BAD_DATA döndürülür.

Model bölümlendirme

Model için birden fazla cihaz mevcut olduğunda NNAPI çalışma zamanı, işi cihazlara dağıtır. Örneğin, birden fazla cihaz belirtilen tüm değerler ANeuralNetworksCompilation_createForDevices diğer kişiler de göz önünde bulundurulacaktır. CPU cihazın listede olmadığından CPU yürütmesi devre dışı bırakılacak. ANeuralNetworksCompilation_create kullanılırken CPU dahil olmak üzere mevcut tüm cihazlar dikkate alınır.

Dağıtım, kullanılabilir cihazlar listesinden seçim yaparak yapılır. modeldeki işlemleri, işlemi destekleyen cihazı ve en iyi performansı (ör. en hızlı yürütme süresini veya tarafından belirtilen yürütme tercihine bağlı olarak en düşük güç tüketimi teslim edilir. Bu bölümleme algoritması, farklı işlemciler arasındaki G/Ç'nin neden olduğu olası verimsizlikleri hesaba katmaz. Bu nedenle, birden fazla işlemci belirtirken (ANeuralNetworksCompilation_createForDevices kullanırken açıkça veya ANeuralNetworksCompilation_create kullanırken dolaylı olarak) ortaya çıkan uygulamanın profilini oluşturmak önemlidir.

Modelinizin NNAPI tarafından nasıl bölümlendirildiğini anlamak için Android günlüklerinde bir mesaj olup olmadığını kontrol edin (ExecutionPlan etiketiyle INFO düzeyinde):

ModelBuilder::findBestDeviceForEachOperation(op-name): device-index

op-name, işlemin grafikteki açıklayıcı adıdır ve device-index, cihaz listesindeki aday cihazın dizinidir. Bu liste, ANeuralNetworksCompilation_createForDevices işlevine sağlanan giriştir veya ANeuralNetworksCompilation_createForDevices kullanılıyorsa ANeuralNetworks_getDeviceCount ve ANeuralNetworks_getDevice kullanılarak tüm cihazlar üzerinde iterasyon yapılırken döndürülen cihaz listesidir.

Mesaj (ExecutionPlan etiketiyle bilgi düzeyinde):

ModelBuilder::partitionTheWork: only one best device: device-name

Bu mesaj, cihazda tüm grafiğin hızlandırıldığını gösterir device-name

Uygulama

Yürütme adımı, modeli bir giriş grubuna uygular ve hesaplama çıkışlarını, uygulamanızın ayırdığı bir veya daha fazla kullanıcı arabelleğine ya da bellek alanına depolar.

Derlenmiş bir modeli yürütmek için şu adımları izleyin:

  1. Şunu çağırın: ANeuralNetworksExecution_create() işlevini kullanın.

    // Run the compiled model against a set of inputs
    ANeuralNetworksExecution* run1 = NULL;
    ANeuralNetworksExecution_create(compilation, &run1);
  2. Uygulamanızın hesaplama için giriş değerlerini nerede okuduğunu belirtin. Uygulamanız, sırasıyla ANeuralNetworksExecution_setInput() veya ANeuralNetworksExecution_setInputFromMemory() işlevini çağırarak giriş değerlerini bir kullanıcı arabelleğinden ya da ayrılmış bir bellek alanından okuyabilir.

    // Set the single input to our sample model. Since it is small, we won't use a memory buffer
    float32 myInput[3][4] = { ...the data... };
    ANeuralNetworksExecution_setInput(run1, 0, NULL, myInput, sizeof(myInput));
  3. Uygulamanızın çıkış değerlerini nereye yazdığını belirtin. Uygulamanız, öğesini çağırarak kullanıcı arabelleğine veya ayrılan bellek alanına ANeuralNetworksExecution_setOutput() veya ANeuralNetworksExecution_setOutputFromMemory() tıklayın.

    // Set the output
    float32 myOutput[3][4];
    ANeuralNetworksExecution_setOutput(run1, 0, NULL, myOutput, sizeof(myOutput));
  4. ANeuralNetworksExecution_startCompute() işlevini çağırarak yürütmenin başlamasını planlayın. Hata yoksa bu işlev ANEURALNETWORKS_NO_ERROR sonuç kodunu döndürür.

    // Starts the work. The work proceeds asynchronously
    ANeuralNetworksEvent* run1_end = NULL;
    ANeuralNetworksExecution_startCompute(run1, &run1_end);
  5. ANeuralNetworksEvent_wait() numaralı telefonu arayın işlevini çağırın. Yürütme başarılıysa bu işlev ANEURALNETWORKS_NO_ERROR sonuç kodunu döndürür. Beklemenin, yürütmeyi başlatan iş parçacığından farklı bir iş parçacığında yapılması mümkündür.

    // For our example, we have no other work to do and will just wait for the completion
    ANeuralNetworksEvent_wait(run1_end);
    ANeuralNetworksEvent_free(run1_end);
    ANeuralNetworksExecution_free(run1);
  6. İsteğe bağlı olarak, yeni bir ANeuralNetworksExecution örneği oluşturmak için aynı derleme örneğini kullanarak derlenmiş modele farklı bir giriş grubu uygulayabilirsiniz.

    // Apply the compiled model to a different set of inputs
    ANeuralNetworksExecution* run2;
    ANeuralNetworksExecution_create(compilation, &run2);
    ANeuralNetworksExecution_setInput(run2, ...);
    ANeuralNetworksExecution_setOutput(run2, ...);
    ANeuralNetworksEvent* run2_end = NULL;
    ANeuralNetworksExecution_startCompute(run2, &run2_end);
    ANeuralNetworksEvent_wait(run2_end);
    ANeuralNetworksEvent_free(run2_end);
    ANeuralNetworksExecution_free(run2);

Eşzamanlı yürütme

Eşzamansız yürütme, iş parçacıklarını oluşturmak ve senkronize etmek için zaman harcar. Ayrıca gecikme, en uzun süre, değişkenlik gösteren bir iş parçacığının bildirildiği zaman arasında 500 mikrosaniyeye kadar olan gecikmeler veya bağlı olduğu süreyi gösterir.

Gecikmeyi azaltmak için uygulamayı, çalışma zamanında eşzamanlı bir çıkarım çağrısı yapmaya yönlendirebilirsiniz. Bu çağrı, yalnızca bir çıkarım tam olarak tamamlanması anlamına gelir. Bunun yerine arama ANeuralNetworksExecution_startCompute için çalışma zamanına yönelik eşzamansız bir çıkarım çağrısı için ANeuralNetworksExecution_compute çağrısında bulunmayı da unutmayın. Bir ANeuralNetworksExecution_compute, ANeuralNetworksEvent kabul etmiyor ve ANeuralNetworksEvent_wait numaralı telefona yapılan bir aramayla eşlenmedi.

Seri çekim yürütmeler

NNAPI, Android 10 (API düzeyi 29) ve sonraki sürümleri çalıştıran Android cihazlarda ANeuralNetworksBurst nesnesi aracılığıyla toplu yürütmeleri destekler. Art arda yürütme, aynı derlemenin hızlı bir şekilde art arda yürütülmesidir (ör. kamera yakalama kareleri veya art arda ses örnekleri üzerinde çalışanlar). ANeuralNetworksBurst nesneleri, hızlandırıcılara kaynakların yürütmeler arasında yeniden kullanılabileceğini ve hızlandırıcıların ani artış süresi boyunca yüksek performanslı durumda kalması gerektiğini belirttiği için daha hızlı yürütmelerle sonuçlanabilir.

ANeuralNetworksBurst, normal yürütme yolunda yalnızca küçük bir değişiklik yapar. Aşağıdaki kod snippet'inde gösterildiği gibi ANeuralNetworksBurst_create kullanarak bir seri nesnesi oluşturursunuz:

// Create burst object to be reused across a sequence of executions
ANeuralNetworksBurst* burst = NULL;
ANeuralNetworksBurst_create(compilation, &burst);

Seri çekim yürütmeler eşzamanlıdır. Ancak her çıkarım işlemini gerçekleştirmek için ANeuralNetworksExecution_compute kullanmak yerine, ANeuralNetworksExecution_burstCompute işlev çağrılarında çeşitli ANeuralNetworksExecution nesnelerini aynı ANeuralNetworksBurst ile eşleşirsiniz.

// Create and configure first execution object
// ...

// Execute using the burst object
ANeuralNetworksExecution_burstCompute(execution1, burst);

// Use results of first execution and free the execution object
// ...

// Create and configure second execution object
// ...

// Execute using the same burst object
ANeuralNetworksExecution_burstCompute(execution2, burst);

// Use results of second execution and free the execution object
// ...

Şununla ANeuralNetworksBurst nesnesini serbest bırakın: ANeuralNetworksBurst_free gerektiğinde de kullanabilirsiniz.

// Cleanup
ANeuralNetworksBurst_free(burst);

Eşzamansız komut sıraları ve sınırlı yürütme

Android 11 ve sonraki sürümlerde NNAPI, ANeuralNetworksExecution_startComputeWithDependencies() yöntemi aracılığıyla asenkron yürütmeyi planlamanın ek bir yolunu destekler. Bu yöntemi kullandığınızda yürütme, bağlı olan işaretlenecek etkinliklerdir. Yürütme tamamlandıktan ve çıkışlar kullanılmaya hazır hale geldikten sonra döndürülen etkinlik sinyallenir.

Yürütmeyi gerçekleştiren cihazlara bağlı olarak etkinlik, çitleri senkronize edin. Siz aramalı ANeuralNetworksEvent_wait() etkinliği beklemek ve yürütmenin kullandığı kaynakları geri yüklemek. Siz içe aktarma işini bir etkinlik nesnesine aktarmak için ANeuralNetworksEvent_createFromSyncFenceFd(), ve bir etkinlik nesnesindeki senkronizasyon sınırlarını dışa aktarabilirsiniz. ANeuralNetworksEvent_getSyncFenceFd().

Dinamik olarak boyutlandırılmış çıkışlar

Çıkış boyutunun girişe bağlı olduğu modelleri desteklemek için verileri (yani model yürütülürken boyutun belirlenemediği) zaman—kullan ANeuralNetworksExecution_getOutputOperandRank ve ANeuralNetworksExecution_getOutputOperandDimensions.

Aşağıdaki kod örneğinde bunun nasıl yapılacağı gösterilmektedir:

// Get the rank of the output
uint32_t myOutputRank = 0;
ANeuralNetworksExecution_getOutputOperandRank(run1, 0, &myOutputRank);

// Get the dimensions of the output
std::vector<uint32_t> myOutputDimensions(myOutputRank);
ANeuralNetworksExecution_getOutputOperandDimensions(run1, 0, myOutputDimensions.data());

Temizle

Temizleme adımı, hesaplamadır.

// Cleanup
ANeuralNetworksCompilation_free(compilation);
ANeuralNetworksModel_free(model);
ANeuralNetworksMemory_free(mem1);

Hata yönetimi ve CPU yedeği

Bölme işlemi sırasında bir hata oluşursa, sürücü bir modeli (veya modelin bir parçasını) derleyemezse veya sürücü derlenmiş bir modeli (veya modelin bir parçasını) yürütemezse NNAPI, bir veya daha fazla işlemin kendi CPU uygulamasına geri dönebilir.

NNAPI istemcisi, işlemin optimize edilmiş sürümlerini içeriyorsa (ör. TFLite) CPU yedek planını devre dışı bırakmak ve istemcinin optimize edilmiş işlem uygulamasıyla hataları ele almak avantajlı olabilir.

Android 10'da derleme ANeuralNetworksCompilation_createForDevices kullanılarak gerçekleştirilirse CPU yedekleme devre dışı bırakılır.

Android P'de, sürücüde yürütme başarısız olursa NNAPI yürütme işlemi CPU'ya geri döner. Bu durum, ANeuralNetworksCompilation_create yerine Android 10'da da geçerlidir. ANeuralNetworksCompilation_createForDevices daha kullanıldı.

İlk yürütme, tek bir bölüm için geri çekilir ve bu yine de başarısız olursa modelin tamamını CPU'da yeniden dener.

Bölme veya derleme başarısız olursa modelin tamamı CPU'da denenir.

Bazı işlemlerin CPU'da desteklenmediği durumlar ve derleme veya yürütme yöntemlerinin geri çekilmesine neden olacağı anlamına gelebilir.

CPU yedekleme devre dışı bırakıldıktan sonra bile modelde CPU'da planlanmış işlemler olabilir. CPU, ANeuralNetworksCompilation_createForDevices için sağlanan işlemciler listesindeyse ve bu işlemleri destekleyen tek işlemciyse ya da bu işlemler için en iyi performansı iddia eden işlemciyse birincil (yedek olmayan) yürütücü olarak seçilir.

CPU yürütmesi olmadığından emin olmak için ANeuralNetworksCompilation_createForDevices komutunu kullanın nnapi-reference cihaz listesinden hariç tutuldu. Android P'den itibaren, debug.nn.partition mülkünü 2 olarak ayarlayarak YAPI YOKSA derlemelerinde yürütme sırasında yedeği devre dışı bırakmak mümkündür.

Bellek alanları

Android 11 ve sonraki sürümlerde NNAPI, opak bellekler için ayırıcı arayüzleri sağlayan bellek alanlarını destekler. Bu sayede uygulamalar, cihaza özgü bellekleri yürütmeler arasında iletebilir. Böylece NNAPI, aynı sürücüde art arda yürütmeler gerçekleştirirken gereksiz yere veri kopyalama veya dönüştürme yapmaz.

Bellek alanı özelliği, çoğunlukla sürücüye dahili olan ve istemci tarafına sık sık erişmesi gerekmeyen tenzorlar için tasarlanmıştır. Bu tür tenzorlara örnek olarak sıra modellerindeki durum tenzorları verilebilir. İstemci tarafında sık sık CPU erişimi gerektiren tenzorlar için bunun yerine paylaşılan bellek havuzlarını kullanın.

Saydam olmayan bir bellek ayırmak için aşağıdaki adımları uygulayın:

  1. Şunu çağırın: ANeuralNetworksMemoryDesc_create() işlevini kullanın:

    // Create a memory descriptor
    ANeuralNetworksMemoryDesc* desc;
    ANeuralNetworksMemoryDesc_create(&desc);
  2. ANeuralNetworksMemoryDesc_addInputRole() ve ANeuralNetworksMemoryDesc_addOutputRole() çağrılarını yaparak amaçlanan tüm giriş ve çıkış rollerini belirtin.

    // Specify that the memory may be used as the first input and the first output
    // of the compilation
    ANeuralNetworksMemoryDesc_addInputRole(desc, compilation, 0, 1.0f);
    ANeuralNetworksMemoryDesc_addOutputRole(desc, compilation, 0, 1.0f);
  3. İsteğe bağlı olarak, ANeuralNetworksMemoryDesc_setDimensions().

    // Specify the memory dimensions
    uint32_t dims[] = {3, 4};
    ANeuralNetworksMemoryDesc_setDimensions(desc, 2, dims);
  4. ANeuralNetworksMemoryDesc_finish() çağrısını yaparak tanımlayıcı tanımını tamamlayın.

    ANeuralNetworksMemoryDesc_finish(desc);
  5. Tanımlayıcıyı ANeuralNetworksMemory_createFromDesc() öğesine ileterek ihtiyacınız olan kadar bellek ayırın.

    // Allocate two opaque memories with the descriptor
    ANeuralNetworksMemory* opaqueMem;
    ANeuralNetworksMemory_createFromDesc(desc, &opaqueMem);
  6. Artık ihtiyaç duymadığınız bellek tanımlayıcısını serbest bırakın.

    ANeuralNetworksMemoryDesc_free(desc);

İstemci, oluşturulan ANeuralNetworksMemory nesnesini yalnızca ANeuralNetworksMemoryDesc nesnesinde belirtilen rollere göre ANeuralNetworksExecution_setInputFromMemory() veya ANeuralNetworksExecution_setOutputFromMemory() ile kullanabilir. Başlangıç ve uzunluk bağımsız değişkenleri, belleğin tamamının kullanıldığını belirten 0 olarak ayarlanmalıdır. Müşteri ANeuralNetworksMemory_copy().

Belirtilmemiş boyut veya sıralama rollerine sahip opak anılar oluşturabilirsiniz. Bu durumda, bellek oluşturma işlemi temel sürücü tarafından desteklenmiyorsa ANEURALNETWORKS_OP_FAILED durumuyla başarısız olabilir. İstemcinin, Ashmem veya BLOB modu AHardwareBuffer tarafından desteklenen yeterince büyük bir arabellek ayırarak yedek mantığını uygulaması önerilir.

NNAPI'nin opak bellek nesnesine erişmesi gerekmediğinde ilgili ANeuralNetworksMemory örneğini serbest bırakın:

ANeuralNetworksMemory_free(opaqueMem);

Performansı ölçün

Uygulamanızın performansını, yürütme süresini ölçerek veya profil çıkarma.

Yürütme süresi

Çalışma zamanı boyunca toplam yürütme süresini belirlemek istediğinizde senkronize yürütme API'sini kullanabilir ve çağrının ne kadar sürdüğünü ölçebilirsiniz. Google Takvim widget'ını daha düşük bir yazılım seviyesi üzerinden toplam yürütme süresini belirlemek istiyorsanız toplu olarak ANeuralNetworksExecution_setMeasureTiming ve ANeuralNetworksExecution_getDuration almak için:

  • bir hızlandırıcıda yürütme süresi (ana makinede çalışan sürücüde değil) için geçerlidir).
  • hızlandırıcıdaki süre dahil olmak üzere sürücüde yürütme süresi.

Sürücünün yürütme süresi, çalışma zamanının kendisi ve çalışma zamanının sürücüyle iletişim kurması için gereken IPC gibi ek maliyetleri içermez.

Bu API'ler, gönderilen çalışma ile tamamlanan çalışma arasındaki süreyi ölçer sürücünün veya hızlandırıcının performansa ayırdığı zaman yerine zaman bağlam değişimiyle kesintiye uğrayabilir.

Örneğin, 1. çıkarım başlarsa sürücü 2. çıkarım yapmak için çalışmayı durdurur, ardından çalışmayı devam ettirerek 1. çıkarımı tamamlar. 1. çıkarım için yürütme süresi, 2. çıkarım yapmak üzere çalışmanın durdurulduğu zamanı içerir.

Bu zamanlama bilgileri bir çevrimdışı kullanım için telemetri toplama uygulaması. Uygulamayı daha yüksek performans sağlayacak şekilde değiştirmek için zamanlama verilerini kullanabilirsiniz.

Bu işlevi kullanırken aşağıdakileri göz önünde bulundurun:

  • Zamanlama bilgilerinin toplanmasının performans maliyeti olabilir.
  • NNAPI çalışma zamanında ve IPC'de harcanan süre hariç, yalnızca sürücü kendisinde veya hızlandırıcıda harcanan süreyi hesaplayabilir.
  • Bu API'leri yalnızca numDevices = 1 ile ANeuralNetworksCompilation_createForDevices kullanılarak oluşturulmuş bir ANeuralNetworksExecution ile kullanabilirsiniz.
  • Zamanlama bilgilerini bildirmek için sürücüye gerek yoktur.

Android Systrace ile uygulamanızın profilini oluşturma

Android 10'dan itibaren NNAPI, uygulamanızın profilini oluşturmak için kullanabileceğiniz systrace etkinliklerini otomatik olarak oluşturur.

NNAPI Kaynağı,parse_systrace systrace etkinlikleri içeren systrace etkinlikleri ile birlikte, model yaşam döngüsünün farklı aşamalarında harcanan süre (Örnekleme, (hazırlık, derleme, yürütme ve feshetme) ve farklı seviyelerde izin verir. Uygulamanızın bölündüğü katmanlar şunlardır:

  • Application: ana uygulama kodu
  • Runtime: NNAPI Çalışma Zamanı
  • IPC: NNAPI Çalışma Zamanı ile Sürücü kodu arasındaki işlemler arası iletişim
  • Driver: hızlandırıcı sürücü işlemi.

Profil oluşturma analizi verilerini oluşturma

$ANDROID_BUILD_TOP adresindeki AOSP kaynak ağacını kontrol ettiğinizi ve hedef uygulama olarak TFLite görüntü sınıflandırma örneğini kullandığınızı varsayarak aşağıdaki adımları uygulayarak NNAPI profilleme verilerini oluşturabilirsiniz:

  1. Aşağıdaki komutla Android sistem izlemeyi başlatın:
$ANDROID_BUILD_TOP/external/chromium-trace/systrace.py  -o trace.html -a org.tensorflow.lite.examples.classification nnapi hal freq sched idle load binder_driver

-o trace.html parametresi, izlerin trace.html dosyasına yazılacağını gösterir. Kendi uygulamanızın profilini oluştururken org.tensorflow.lite.examples.classification değerini, uygulama manifestinizde belirtilen işlem adıyla değiştirmeniz gerekir.

Bu, kabuk konsollarınızdan birini meşgul tutacaktır, komutu şurada çalıştırmayın: etkileşimli olarak enter sona ermesini beklediğinden arka planda çalışır.

  1. Systrace toplayıcısı çalıştırıldıktan sonra uygulamanızı başlatın ve karşılaştırma testinizi çalıştırın.

Bizim durumumuzda, Görüntü Sınıflandırma uygulamasını Android Studio'dan veya uygulama zaten yüklüyse doğrudan test telefonunuzun kullanıcı arayüzünden başlatabilirsiniz. NNAPI verileri oluşturmak için uygulamayı NNAPI kullanacak şekilde yapılandırmanız gerekir: Uygulama yapılandırma iletişim kutusunda hedef cihaz olarak NNAPI'nin seçilmesi

  1. Test tamamlandığında, 1. adımdan beri etkin olan konsol terminalinde enter tuşuna basarak systrace'i sonlandırın.

  2. Kümülatif istatistikler oluşturmak için systrace_parser yardımcı programını çalıştırın:

$ANDROID_BUILD_TOP/frameworks/ml/nn/tools/systrace_parser/parse_systrace.py --total-times trace.html

Ayrıştırıcı aşağıdaki parametreleri kabul eder: - --total-times: Alttaki bir katmana yapılan çağrıda yürütmeyi beklerken harcanan süre dahil olmak üzere bir katmanda harcanan toplam süreyi gösterir - --print-detail: systrace'ten toplanan tüm etkinlikleri yazdırır - --per-execution: Tüm aşamaların istatistikleri yerine yalnızca yürütme ve alt aşamalarını (yürütme başına süre olarak) yazdırır - --json: Çıktıyı JSON biçiminde oluşturur

Aşağıda çıkışa örnek verilmiştir:

===========================================================================================================================================
NNAPI timing summary (total time, ms wall-clock)                                                      Execution
                                                           ----------------------------------------------------
              Initialization   Preparation   Compilation           I/O       Compute      Results     Ex. total   Termination        Total
              --------------   -----------   -----------   -----------  ------------  -----------   -----------   -----------   ----------
Application              n/a         19.06       1789.25           n/a           n/a         6.70         21.37           n/a      1831.17*
Runtime                    -         18.60       1787.48          2.93         11.37         0.12         14.42          1.32      1821.81
IPC                     1.77             -       1781.36          0.02          8.86            -          8.88             -      1792.01
Driver                  1.04             -       1779.21           n/a           n/a          n/a          7.70             -      1787.95

Total                   1.77*        19.06*      1789.25*         2.93*        11.74*        6.70*        21.37*         1.32*     1831.17*
===========================================================================================================================================
* This total ignores missing (n/a) values and thus is not necessarily consistent with the rest of the numbers

Toplanan etkinlikler tam bir değeri temsil etmezse ayrıştırıcı başarısız olabilir izin verir. Özellikle sistem izleme etkinlikleri oluşturulduysa başarısız olabilir. ilişkilendirilmiş olmadan izlemede mevcut olan bir bölümün sonunu işaretlemek bölümü başlangıç etkinliği. Bu durum genellikle önceki bir etkinlikteki systrace toplayıcıyı başlattığınızda profil oluşturma oturumu oluşturuluyor. Bu durumda, profilinizi tekrar çalıştırmanız gerekir.

Uygulama kodunuzun istatistiklerini systrace_parser çıkışına ekleyin

parse_systrace uygulaması, yerleşik Android systrace işlevini temel alır. Uygulamanızdaki belirli işlemler için systrace API (Java için , yerel uygulamalar için ) özel etkinlik adlarını kullanın.

Özel etkinliklerinizi Uygulama yaşam döngüsünün aşamalarıyla ilişkilendirmek için: etkinlik adınızın başına aşağıdaki dizelerden birini ekleyin:

  • [NN_LA_PI]: Başlatma için uygulama düzeyinde etkinlik
  • [NN_LA_PP]: Hazırlık için uygulama düzeyinde etkinlik
  • [NN_LA_PC]: Derleme için uygulama düzeyinde etkinlik
  • [NN_LA_PE]: Yürütme için uygulama düzeyinde etkinlik

Aşağıda, TFLite resim sınıflandırma örneğini nasıl değiştirebileceğinize dair bir örnek verilmiştir: Execution aşaması için bir runInferenceModel bölümü ve Şu özelliklere sahip başka bölümleri içeren Application katman: preprocessBitmap NNAPI izlerinde dikkate alınmaz. runInferenceModel bölümü, nnapi systrace ayrıştırıcısı tarafından işlenen systrace etkinliklerinin bir parçası olacaktır:

Kotlin

/** Runs inference and returns the classification results. */
fun recognizeImage(bitmap: Bitmap): List {
   // This section won’t appear in the NNAPI systrace analysis
   Trace.beginSection("preprocessBitmap")
   convertBitmapToByteBuffer(bitmap)
   Trace.endSection()

   // Run the inference call.
   // Add this method in to NNAPI systrace analysis.
   Trace.beginSection("[NN_LA_PE]runInferenceModel")
   long startTime = SystemClock.uptimeMillis()
   runInference()
   long endTime = SystemClock.uptimeMillis()
   Trace.endSection()
    ...
   return recognitions
}

Java

/** Runs inference and returns the classification results. */
public List recognizeImage(final Bitmap bitmap) {

 // This section won’t appear in the NNAPI systrace analysis
 Trace.beginSection("preprocessBitmap");
 convertBitmapToByteBuffer(bitmap);
 Trace.endSection();

 // Run the inference call.
 // Add this method in to NNAPI systrace analysis.
 Trace.beginSection("[NN_LA_PE]runInferenceModel");
 long startTime = SystemClock.uptimeMillis();
 runInference();
 long endTime = SystemClock.uptimeMillis();
 Trace.endSection();
  ...
 Trace.endSection();
 return recognitions;
}

Hizmet kalitesi

Android 11 ve sonraki sürümlerde NNAPI, bir uygulamanın modellerinin göreceli önceliklerini, belirli bir modelin hazırlanması için beklenen maksimum süreyi ve belirli bir hesaplamanın tamamlanması için beklenen maksimum süreyi belirtmesine olanak tanıyarak daha iyi hizmet kalitesi (HK) sağlar. Android 11, uygulamaların yürütme son tarihlerinin kaçırılması gibi hataları anlamasını sağlayan ek NNAPI sonuç kodları da sunar.

Bir iş yükünün önceliğini ayarlama

Bir NNAPI iş yükünün önceliğini ayarlamak için ANeuralNetworksCompilation_finish()'ı çağırmadan önce ANeuralNetworksCompilation_setPriority()'ı çağırın.

Teslim tarihleri belirleme

Uygulamalar hem model derleme hem de çıkarım için son tarihler belirleyebilir.

İşlem görenler hakkında daha fazla bilgi

Aşağıdaki bölümde, operatörlerin kullanımıyla ilgili ileri seviye konular ele alınmaktadır.

Kesirli tensörler

Kuantize edilmiş bir tensör, kayan noktalı değerlerden oluşan n boyutlu bir diziyi temsil etmenin kompakt bir yoludur.

NNAPI, 8 bit asimetrik olarak ölçülmüş tenzorları destekler. Bu tensörlerde her hücrenin değeri 8 bitlik bir tam sayı ile temsil edilir. Şununla ilişkili: tensör bir ölçek ve sıfır puan değeridir. Bunlar, 8 bitlik tam sayıları temsil edilen kayan nokta değerlerine dönüştürmek için kullanılır.

Formül şu şekildedir:

(cellValue - zeroPoint) * scale

Burada sıfır Nokta değeri 32 bitlik bir tam sayı, ölçek ise 32 bitlik kayan puan değeri

32 bit kayan nokta değerlerinin yer aldığı tenzorlara kıyasla 8 bitlik kesirli tenzorların iki avantajı vardır:

  • Eğitilen ağırlıklar boyutun dörtte birini oluşturduğundan uygulamanız daha küçüktür bir yazılımdır.
  • Hesaplamalar genellikle daha hızlı yürütülebilir. Bunun nedeni, bellekten getirilmesi gereken verilerin ve işlemcilerin verimliliğinden Şelale'yi kapsayabilir.

Kayan nokta modelini nicel bir modele dönüştürmek mümkün olsa da, tecrübeleri niceliksel bir eğitimle daha iyi sonuçlar elde edildiğini göstermiştir. modelinizi doğrudan test eder. Böylece, sinir ağı her bir değerin artan ayrıntı düzeyini telafi etmeyi öğrenir. Ölçülen her tensör için ölçek ve Sıfır noktası değerleri eğitim sürecinde belirlenir.

NNAPI'de ANeuralNetworksOperandType veri yapısını da ANEURALNETWORKS_TENSOR_QUANT8_ASYMM. Ayrıca, söz konusu veri yapısında tensörün ölçeğini ve sıfır noktası değerini de belirtirsiniz.

NNAPI, 8 bit asimetrik kesirli tenzorlara ek olarak aşağıdakileri destekler:

İsteğe bağlı işlenenler

Örneğin, ANEURALNETWORKS_LSH_PROJECTION, isteğe bağlı işlenenleri alma. Modelde isteğe bağlı işlenenin atlandığında, ANeuralNetworksModel_setOperandValue() fonksiyonunu kullanabilirsiniz. Tampon için NULL ve uzunluk için 0 değeri iletir.

İşlenenin mevcut olup olmadığı konusundaki karar her biri için değişiyorsa isterseniz ANeuralNetworksExecution_setInput() veya ANeuralNetworksExecution_setOutput() fonksiyonlarını kullanarak arabellek için NULL, uzunluk için 0 değerini iletir.

Bilinmeyen rütbedeki tenzorlar

Android 9 (API düzeyi 28), bilinmeyen boyutlardaki model işlem görenlerini kullanıma sundu. bilinen sıra (boyut sayısı). Android 10 (API düzeyi 29), ANeuralNetworksOperandType'da gösterildiği gibi bilinmeyen rütbedeki tenzorları kullanıma sundu.

NNAPI karşılaştırması

NNAPI karşılaştırması, AOSP'de platform/test/mlts/benchmark (karşılaştırma uygulaması) ve platform/test/mlts/models (modeller ve veri kümeleri) olarak kullanılabilir.

Karşılaştırma, gecikme ve doğruluğu değerlendirir ve sürücüleri aynı değerle karşılaştırır modellerin her biri için CPU üzerinde çalışan Tensorflow Lite kullanılarak veri kümelerinde yer alır.

Karşılaştırmayı kullanmak için aşağıdakileri yapın:

  1. Bilgisayarınıza hedef Android cihazı bağlayın, bir terminal penceresi açın ve cihaza adb üzerinden erişilebildiğinden emin olun.

  2. Birden fazla Android cihaz bağlıysa hedef cihaz ANDROID_SERIAL ortam değişkenini dışa aktarın.

  3. Android'in üst düzey kaynak dizinine gidin.

  4. Aşağıdaki komutları çalıştırın:

    lunch aosp_arm-userdebug # Or aosp_arm64-userdebug if available
    ./test/mlts/benchmark/build_and_run_benchmark.sh
    

    Karşılaştırma çalıştırmasının sonunda, sonuçları bir HTML sayfası olarak sunulur xdg-open işlevine aktarıldı.

NNAPI günlükleri

NNAPI, sistem günlüklerinde yararlı teşhis bilgileri oluşturur. Günlükleri analiz etmek için logcat yardımcı programını kullanın.

Belirli aşamalar veya bileşenler için ayrıntılı NNAPI günlük kaydını etkinleştirmek için debug.nn.vlog mülkü (adb shell kullanarak) aşağıdaki değerler listesine eklenir, boşluk, iki nokta veya virgülle ayırın:

  • model: Model oluşturma
  • compilation: Model yürütme planı ve derlemesinin oluşturulması
  • execution: Model yürütme
  • cpuexe: NNAPI CPU uygulamasını kullanarak işlemlerin yürütülmesi
  • manager: NNAPI uzantıları, mevcut arayüzler ve özelliklerle ilgili bilgiler
  • all veya 1: Yukarıdaki tüm öğeler

Örneğin, tam ayrıntılı günlük kaydını etkinleştirmek için şu komutu kullanın: adb shell setprop debug.nn.vlog all Ayrıntılı günlük kaydını devre dışı bırakmak için adb shell setprop debug.nn.vlog '""' komutunu kullanın.

Etkinleştirildikten sonra ayrıntılı günlük kaydı, aşama veya bileşen adına ayarlanmış bir etiketle INFO düzeyinde günlük girişleri oluşturur.

NNAPI API bileşenleri, debug.nn.vlog kontrollü mesajların yanı sıra her biri belirli bir günlük etiketi kullanan çeşitli düzeylerde başka günlük girişleri de sağlar.

Bileşen listesini almak için şu ifade:

grep -R 'define LOG_TAG' | awk -F '"' '{print $2}' | sort -u | egrep -v "Sample|FileTag|test"

Bu ifade şu anda aşağıdaki etiketleri döndürmektedir:

  • Patlama Oluşturucu
  • Geri çağırma işlevleri
  • CompilationBuilder
  • CPU Yürütücü
  • Yürütme Oluşturucu
  • ExecutionBurstController
  • ExecutionBurstServer
  • Yürütme Planı
  • FibonacciDriver
  • GraphDump
  • Dizine Eklenmiş Şekil Sarmalayıcı
  • IonWatcher
  • Müdür
  • Bellek
  • Bellek Utilleri
  • MetaModel
  • ModelArgumentInfo
  • ModelBuilder
  • Sinir Ağları
  • İşlem Çözücü
  • İşlemler
  • OperationsUtils
  • Paket Bilgileri
  • TokenHasher
  • TypeManager
  • Yardımcı programlar
  • Doğrulama
  • Sürümlü Arayüzler

logcat tarafından gösterilen günlük mesajlarının seviyesini kontrol etmek için şunları kullanın: ANDROID_LOG_TAGS ortam değişkeni

NNAPI günlük mesajlarının tümünü göstermek ve diğerlerini devre dışı bırakmak için ANDROID_LOG_TAGS öğesini şu şekilde ayarlayın: şu:

BurstBuilder:V Callbacks:V CompilationBuilder:V CpuExecutor:V ExecutionBuilder:V ExecutionBurstController:V ExecutionBurstServer:V ExecutionPlan:V FibonacciDriver:V GraphDump:V IndexedShapeWrapper:V IonWatcher:V Manager:V MemoryUtils:V Memory:V MetaModel:V ModelArgumentInfo:V ModelBuilder:V NeuralNetworks:V OperationResolver:V OperationsUtils:V Operations:V PackageInfo:V TokenHasher:V TypeManager:V Utils:V ValidateHal:V VersionedInterfaces:V *:S.

Aşağıdaki komutu kullanarak ANDROID_LOG_TAGS öğesini ayarlayabilirsiniz:

export ANDROID_LOG_TAGS=$(grep -R 'define LOG_TAG' | awk -F '"' '{ print $2 ":V" }' | sort -u | egrep -v "Sample|FileTag|test" | xargs echo -n; echo ' *:S')

Bunun yalnızca logcat için geçerli bir filtre olduğunu unutmayın. Yine de ayrıntılı günlük bilgileri oluşturmak için debug.nn.vlog özelliğini all olarak ayarlayın.