Sinir Ağları API'sı

Android Neural Networks API (NNAPI), uygulamaları çalıştırmak için tasarlanmış bir Android C API'dir Android cihazlarda makine öğrenimi için işlem açısından yoğun işlemler. NNAPI, daha yüksek düzeydeki kullanıcılar için temel bir işlevsellik katmanı sunmak çerçeveleri kullanarak TensorFlow Lite Nöral ağlar oluşturup eğiten Caffe2'ye bakalım. API kullanılabilir Android 8.1 (API düzeyi 27) veya sonraki sürümleri çalıştıran tüm Android cihazlarda.

NNAPI, Android cihazlardan önceki verilere uygulayarak çıkarımı destekler tanımlı modellerin eğitilmesidir. Çıkarım örnekleri arasında sınıflandırma yer alır. kullanıcı davranışını tahmin etme ve belirli bir soruna uygun yanıtları seçme anlamına gelir.

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

  • Gecikme: Ağ bağlantısı üzerinden istek göndermeniz gerekmez ve yanıt bekleyin. Ö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ı ödünler de 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. Şunları göz önünde bulundurmalısınız: Özellikle uygulamanız için bir sorun varsa, pil sağlığını izlemek oldukça basit bir araç haline geldi.
  • Uygulama boyutu: Modellerinizin boyutuna dikkat edin. Modeller megabayt yer kaplar. 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.

Bkz. Android Neural Networks API örneği adresine göz atı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.

Bir uygulamanın gereksinimlerine ve Android'deki donanım özelliklerine dayanır Android’in nöral ağı çalışma zamanı sayesinde cihaz üzerinde kullanılabilir işlemciler genelindeki işlem iş yükü ve nöral ağ donanımı, grafik işlem birimleri (GPU'lar) ve dijital sinyal veri işleyenler için de geçerlidir.

Ö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
ziyaret edin.
'nı inceleyin.

Neural Networks API programlama modeli

NNAPI kullanarak hesaplamalar yapmak için öncelikle 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 özetleme kullanır:

  • Model: Matematiksel işlemlerin ve sabit değerin hesaplama grafiği öğrenilen değerleri ifade eder. Bu işlemler, nöral ağlardı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ılı bir şekilde oluşturulduktan sonra ileti dizilerinde 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 eşzamanlı bir işlemdir. Bir kez başarıyla oluşturulduktan sonra, ileti dizilerinde ve yürütmelerde yeniden kullanılabilir. İçinde her derleme temsil edilir. ANeuralNetworksCompilation kullanır.
  • 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 işlemesini sağlar. Uygulamalar genellikle bir modeli tanımlamak için gereken her tensörü içerir. Hafızayı da kullanabilirsiniz. arabelleğe alır. NNAPI'de her bellek arabelleği ANeuralNetworksMemory kullanır.
  • Yürütme: Bir NNAPI modelini bir dizi girişe uygulama ve yardımcı olur. Yürütme işlemi eşzamanlı veya eşzamansız olarak gerçekleştirilebilir.

    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ışı
ziyaret edin.
'nı inceleyin.

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ğitilen ağırlık ve ağırlıklandırma verileriniz büyük olasılıkla bir dosyada depolanır. Sağlamak için Bu verilere etkili erişimle NNAPI çalışma zamanı, bir ANeuralNetworksMemory öğesini çağırarak ANeuralNetworksMemory_createFromFd() işlevini kullanabilir ve açılan veri dosyasının dosya tanımlayıcısını iletebilirsiniz. Ayrıca bellek koruma bayraklarını ve paylaşılan bellek bölgesinin dosya içinde başlar.

// 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 yalnızca bir ANeuralNetworksMemory Örneğin tüm ağırlıklarımız için birden fazla Birden fazla dosya için ANeuralNetworksMemory örneği.

Yerel donanım arabelleklerini kullan

Yerel donanım arabelleklerini kullanabilirsiniz giriş, çıkış ve sabit işlem göreni değerler kullanır. Bazı durumlarda, NNAPI hızlandırıcı erişebilir AHardwareBuffer veya sürücünün verileri kopyalaması gerekmez. 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, ilgili sınırlamaların şurada listeleniyor: ANeuralNetworksMemory_createFromAHardwareBuffer referans belgeleri Böylece derleme ve yürütme işlemlerinin tamamlandığından emin olmak için AHardwareBuffer kullanan kişiler, cihaz ataması kullanarak hızlandırıcıyı belirtin.

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 ifade eder:

// 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ı temizlenmiyor hazırlanır. Giriş ve çıkış tamponlarının her zaman erişilebilir hale getirebilirsiniz.
  • için dosya tanımlayıcılarını senkronize edin.
  • Şu yeri içeren 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.

İşlem görenler

İş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 noktalı, 32 bit kayan noktalı, 8 bitli tensörleri destekler ölçülmüş, 16 bit nicelenmiş, 32 bit tam sayı ve 8 bit boole değerleri.

Örneğin, Şekil 3'te iki işlem içeren bir model gösterilmektedir: ve ardından bir çarpma işlemi gelir. Model, bir giriş tensörü alır ve çıkış tensörü için de geçerlidir.

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

Yukarıdaki modelin yedi işleneni vardır. Bu işlenenler, dolaylı olarak modele eklendikleri sıranın dizinini de içerir. İlk işlenen ekinin dizini 0, ikincisinin dizini 1'dir ve bu şekilde devam eder. 1, 2, 3, ve 5 sabit işlenendir.

İşlem görenleri hangi sırayla eklediğiniz önemli değildir. Örneğin, model çıkış işleneni, eklenen ilk olabilir. Önemli olan, işlenene atıfta bulunurken doğru dizin değeri.

İş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. İşlem görenler hakkında daha fazla bilgi edinin.

İşlemler

Bir işlem, yapılacak hesaplamaları belirtir. Her işlem şu öğelerden oluşur:

  • bir işlem türü (ör. toplama, çarpma, evrişim),
  • İşlemin giriş için kullandığı işlem görenlerin dizinlerinin listesi ve
  • işlemin çıkış için kullandığı işlenenlerin 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
Element tabanlı matematik işlemleri
Tensor işleme
Resim işlemleri
Arama işlemleri
Normalleştirme işlemleri
Konvolüsyon işlemleri
Havuz 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. Siz yalnızca ANEURALNETWORKS_TENSOR_FLOAT32. Bu sorun, Android 10 (API düzeyi 29) ve sonraki sürümlerde çözülmüştür.

Modeller oluşturun

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

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

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

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

    // 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. Sizin belirlediğiniz ağırlıklar ve sapmalar gibi sabit değerlere sahip edinilen bilgileri kullanıyorsanız, ANeuralNetworksModel_setOperandValue() ve ANeuralNetworksModel_setOperandValueFromMemory() işlevlerine dahildir.

    Aşağıdaki örnekte, eğitim veri dosyasından sabit değerler belirledik. eğitim verileri.

    // 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.

    Bu çağrının parametreleri olarak uygulamanız şunları sağlamalıdır:

    • işlem türü
    • giriş değerlerinin sayısı
    • giriş işlenenleri için dizin dizisi
    • çıkış değerlerinin sayısı
    • çıkış işlenenleri için dizin 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. Modelin hangi işlenenleri giriş ve çıkış olarak değerlendirmesi gerektiğini ANeuralNetworksModel_identifyInputsAndOutputs() işlevini kullanın.

    // 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. ANeuralNetworksModel_finish() numaralı telefonu arayın modelinizin tanımını tamamlayın. Hiç hata yoksa bu işlevi, şunun sonuç kodunu döndürür: ANEURALNETWORKS_NO_ERROR.

    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

NNAPI modeline kontrol akışı eklemek 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ışı:

    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 yürütüleceğini belirler ve ilgili sürücülerden uygulamayı yürütmeye hazırlanmalarını istiyor. 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. Şunu çağırın: ANeuralNetworksCompilation_create() işlevini kullanın.

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

    İsteğe bağlı olarak, cihaz ataması özelliğini kullanarak hangi cihazlarda yürütüleceğini seçin.

  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. Bu işlemi, ANeuralNetworksCompilation_setPreference().

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

    Belirtebileceğiniz tercihler şunlardır:

  3. İsterseniz derlemeleri önbelleğe almak için ANeuralNetworksCompilation_setCaching.

    // 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. Şu kodu çağırarak derleme tanımını tamamlayın: ANeuralNetworksCompilation_finish(). Hata yoksa bu işlev şunun sonuç kodunu döndürür: ANEURALNETWORKS_NO_ERROR.

    ANeuralNetworksCompilation_finish(compilation);
    

Cihaz bulma ve atama

NNAPI, Android 10 (API düzeyi 29) ve sonraki sürümleri çalıştıran Android cihazlarda makine öğrenimi çerçeve kitaplıklarının ve uygulamalarının kullanılabilir cihazlarla ilgili bilgi edinin ve kullanılacak cihazları belirtin birkaç adım var. 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, hangi cihazların abone olacağını belirtmek için bir modelin farklı bölümlerini yürütebildiğinden, uygulamalar Android için dağıtıldığı cihazları belirtir.

Cihaz bulma

Tekliflerinizi otomatikleştirmek ve optimize etmek için ANeuralNetworks_getDeviceCount kullanılabilir cihaz sayısını görebilirsiniz. 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ı

Tekliflerinizi otomatikleştirmek ve optimize etmek için ANeuralNetworksModel_getSupportedOperationsForDevices kullanarak bir modelin belirli cihazlarda hangi işlemlerin çalıştırılabileceğini keşfedebilirsiniz.

Yürütme için hangi hızlandırıcıların kullanılacağını kontrol etmek için ANeuralNetworksCompilation_createForDevices (ANeuralNetworksCompilation_create yerine). Oluşturulan 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 dağıtımdan çalışma zamanı sorumludur pek çok farklı cihazda çalıştım.

Diğer cihazlara benzer şekilde NNAPI CPU uygulaması bir nnapi-reference adında ve türde ANeuralNetworksDevice ANEURALNETWORKS_DEVICE_TYPE_CPU. Ararken ANeuralNetworksCompilation_createForDevices, CPU uygulaması model derleme ve yürütme hata durumlarını işlemek için kullanılır.

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, belirttiğiniz cihazlar tarafından tam olarak desteklenmiyorsa ANeuralNetworksCompilation_createForDevices kullanılıyor, ANEURALNETWORKS_BAD_DATA hatası döndürülür.

Model bölümlendirme

Model için birden fazla cihaz varsa NNAPI çalışma zamanı yayan ekibin çalışmasını cihazlar arasında paylaştırı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 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ümlendirme algoritması, verimsizlikleri oluşturur. Bu nedenle, birden fazla işlemci belirtmeniz ( ANeuralNetworksCompilation_createForDevices veya dolaylı olarak ANeuralNetworksCompilation_create), elde edilen sonucun profilini çıkarmak ve bir uygulamadır.

Modelinizin NNAPI tarafından nasıl bölümlendirildiğini anlamak için Bir mesaj için Android günlükleri (ExecutionPlan etiketiyle bilgi 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çin sağlanan giriştir veya ANeuralNetworksCompilation_createForDevices kullanıyorsanız cihazların listesi ANeuralNetworks_getDeviceCount ve üzeri kullanılarak tüm cihazlarda yineleme yapıldığında döndürülür ANeuralNetworks_getDevice.

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 dizi girişe uygular ve uygulamanızın bir veya daha fazla kullanıcı arabelleğine ya da bellek alanına tahsis edilmiştir.

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 okuyacağını belirtin. Uygulamanız bir kullanıcı arabelleğinden veya ayrılan bir bellek alanından giriş değerlerini okuyabilir telefonla arayarak ANeuralNetworksExecution_setInput() veya ANeuralNetworksExecution_setInputFromMemory() tıklayın.

    // 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 yazacağı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 kullanın. Hata yoksa bu işlev şunun sonuç kodunu döndürür: ANEURALNETWORKS_NO_ERROR.

    // 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 işlemi başarılı olursa bu işlev şunun sonuç kodunu döndürür: ANEURALNETWORKS_NO_ERROR. Bekleme, yürütmeyi başlatandan farklı bir iş parçacığında yapılabilir.

    // 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. Dilerseniz aşağıdaki adımları uygulayarak derlenen modele farklı bir giriş grubu uygulayabilirsiniz: aynı derleme örneğini kullanarak yeni bir ANeuralNetworksExecution kullanır.

    // 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 iyileştirmek için bunun yerine bir uygulamayı eşzamanlı hale getirmeye yönlendirebilirsiniz çağrısından yararlanır. 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 seri çekimi destekler proje yaşam döngüsü boyunca ANeuralNetworksBurst nesnesini tanımlayın. Seri çekim yürütmeler, aynı derlemeyi içeren bir dizi yürütmedir hızlı art arda gerçekleşen (ör. bir kamera kareleri üzerinde çalışan işlemler) örnek ses kayıtları kullanılabilir. ANeuralNetworksBurst nesne kullanıldığında Bu da hızlandırıcılara kaynakların kısa sürede yürütülmesini sağlayacağı için tekrar kullanılmalı ve hızlandırıcıların belirli bir süre içinde çalışmaya devam eder.

ANeuralNetworksBurst, normal yürütmede yalnızca küçük bir değişiklik yapıyor yol'a dokunun. Seri çekim nesnesini ANeuralNetworksBurst_create aşağıdaki kod snippet'inde gösterildiği gibidir:

// 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, ANeuralNetworksExecution_compute her çıkarımı yapmak için, her bir çıkarımı ANeuralNetworksExecution işleve yapılan çağrılarda aynı ANeuralNetworksBurst öğesine sahip nesneler ANeuralNetworksExecution_burstCompute

// 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

NNAPI, Android 11 ve sonraki sürümlerde ek bir planlama yöntemini destekler. ANeuralNetworksExecution_startComputeWithDependencies() yöntemidir. Bu yöntemi kullandığınızda yürütme, bağlı olan işaretlenecek etkinliklerdir. Yürütme işlemi tamamlandıktan sonra ve çıkışlar kullanıma hazır olduğunda, döndürülen etkinlik işaret eder.

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ölümlendirme sırasında bir hata oluşursa, sürücü bir kodu derleyemezse modelin derlenmiş (parça) bir modeli çalıştıramazsa sürücü, NNAPI, kendi CPU uygulamasını kullanmaya devam edebilir. Bunun için anlamına gelir.

NNAPI istemcisi, işlemin optimize edilmiş sürümlerini içeriyorsa ( TFLite gibi), CPU yedeğini devre dışı bırakmak ve İstemcinin optimize edilmiş işlem uygulamasıyla hataları ele alma.

Android 10'da derleme, ANeuralNetworksCompilation_createForDevices, ardından CPU yedeği devre dışı bırakılacak.

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 bu tek bölüm için geri döner ve hâlâ başarısız olursa modelin tamamını CPU'da yeniden dener.

Bölümlendirme 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 yedeğini devre dışı bıraktıktan sonra bile modelde hâlâ işlemler olabilir önceden planlamaya başladım. CPU, sağlanan işlemciler listesindeyse ve ANeuralNetworksCompilation_createForDevices arasında yalnızca olduğunu iddia eden bir işleyen veya performansa sahip olması durumunda, bu işlem birincil (yedek olmayan) olarak seçilir. yürütür.

CPU yürütmesi olmadığından emin olmak için ANeuralNetworksCompilation_createForDevices komutunu kullanın nnapi-reference cihaz listesinden hariç tutuldu. Android P'den başlayarak, çalıştırma sırasında yedeği devre dışı bırakmak mümkündür HATA AYIKLAMA, debug.nn.partition özelliği 2 değerine ayarlanarak derleme oluşturur.

Bellek alanları

NNAPI, Android 11 ve sonraki sürümlerde ayırıcı sağlayan bellek alan adlarını destekler. opak anılar için arayüz oluşturuyoruz. Bu, uygulamaların cihazda yerel ayarı geçirmesine olanak tanır yürütmelerde hafızalarda tutulur. Böylece NNAPI, verileri kopyalamaz veya dönüştürmez. gereksiz yere uygulamaz.

Bellek alanı özelliği, çoğunlukla dahili ve harici ve istemci tarafına sık sık erişmesi gerekmez. Örnekler bu tür tensörler, dizi modellerindeki durum tensörlerini içerir. Şuna ihtiyacı olan tensörler için: yerine paylaşılan bellek havuzlarını kullanın.

Opak 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. İstenen tüm giriş ve çıkış rollerini çağırmak için şunu çağırın: ANeuralNetworksMemoryDesc_addInputRole() ve ANeuralNetworksMemoryDesc_addOutputRole().

    // 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. Şu kodu çağırarak açıklayıcı tanımını kesinleştirin: ANeuralNetworksMemoryDesc_finish().

    ANeuralNetworksMemoryDesc_finish(desc);
    
  5. Açıklayıcıyı ANeuralNetworksMemory_createFromDesc().

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

    ANeuralNetworksMemoryDesc_free(desc);
    

İstemci, oluşturulan ANeuralNetworksMemory nesnesini yalnızca ANeuralNetworksExecution_setInputFromMemory() veya Rollere göre ANeuralNetworksExecution_setOutputFromMemory() ANeuralNetworksMemoryDesc nesnesinde belirtilir. Ofset ve uzunluk bağımsız değişkenler, belleğin tamamının kullanıldığını gösterecek şekilde 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 kuruluş tarafından desteklenmiyorsa ANEURALNETWORKS_OP_FAILED durumu gerekir. Müşterinin, bir veri kümesi dağıtıp bir Ashmem veya BLOB modu AHardwareBuffer destekli yeterince büyük bir arabellek.

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

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 yardımcı olabilir ve çağrının süresini ölçmenizi sağlar. 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 de dahil olmak üzere sürücüdeki yürütme süresi.

Sürücüdeki yürütme süresine, çalışma zamanı gibi ek yük dahil değildir kendisi ve sürücüyle iletişim kurması için gereken IPC.

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ü ilgili işlemi gerçekleştirmek için işi durdurur. çıkarım 2, çıkarım 1'i devam ettirir ve çıkarım 1'i tamamlar. çıkarım 1, çıkarım 2'nin gerçekleştirilmesi için çalışmanın durdurulduğu zamanı içerir.

Bu zamanlama bilgileri bir çevrimdışı kullanım için telemetri toplama uygulaması. Zamanlama verilerini şu amaçlarla kullanabilirsiniz: uygulamayı daha yüksek performans sağlayacak şekilde değiştirebilirsiniz.

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

  • Zamanlama bilgilerinin toplanmasının performans maliyeti olabilir.
  • Yalnızca sürücü kendi başına veya araçta geçirilen zamanı hesaplayabilir hızlandırıcı (NNAPI çalışma zamanında ve IPC'de harcanan süre hariç).
  • Bu API'leri yalnızca şuna sahip bir ANeuralNetworksExecution ile kullanabilirsiniz: ANeuralNetworksExecution numDevices = 1 ile ANeuralNetworksCompilation_createForDevices ile oluşturuldu.
  • Zamanlama bilgilerini bildirebilmek için herhangi bir sürücüye gerek yoktur.

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

NNAPI, Android 10'dan itibaren otomatik olarak systrace etkinlikleri uygulamanızın profilini belirlemek için kullanabilirsiniz.

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ü arasındaki işlemler arası iletişim kod
  • Driver: hızlandırıcı sürücü işlemi.

Profil çıkarma analiz verilerini oluşturma

$ANDROID_BUILD_TOP ve AOSP kaynak ağacını kontrol ettiğiniz TFLite resim sınıflandırma örneğini kullanarak NNAPI profil verilerini oluşturmak için kullanılacak şu adımları uygulayın:

  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 dilinde yazılmıştır. Kendi uygulamanızın profilini çıkarırken org.tensorflow.lite.examples.classification yerine işlem adını yazın uygulama manifestinizde belirtilir.

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

  1. Sistem izleme toplayıcısı başlatıldıktan sonra, uygulamanızı başlatın ve karşılaştırma testi yapabilirsiniz.

Bu örnekte, Görüntü Sınıflandırma uygulamasını Android Studio'dan başlatabilirsiniz. veya uygulama zaten yüklenmişse doğrudan test telefonunuzun kullanıcı arayüzünden kullanabilirsiniz. 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 sistem izlemeyi sonlandırarak şurada enter tuşuna basın: 1. adımdan beri konsol terminali etkin.

  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: Zaman da dahil olmak üzere bir katmanda harcanan toplam süreyi gösterir temel katmana yapılan bir çağrıda yürütülmeyi bekleyerek harcanan - --print-detail: Sistem izlemeden toplanan tüm etkinlikleri yazdırır - --per-execution: yalnızca yürütmeyi ve alt aşamalarını yazdırır (yürütme başına süreler olarak) döndürerek, her aşamaya ait istatistikler yerine - --json: Çıkışı JSON biçiminde üretir

Çıkışın bir örneği aşağıda gösterilmiş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, profil oluşturma işlemini tekrar çalıştırmanız gerekir.

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

ayrıştır_systrace uygulaması, yerleşik Android sistem izleme üzerine kuruludur. işlevi görü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 bölümü:

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

NNAPI, Android 11 ve sonraki sürümlerde bir uygulamanın, sahip olduğu modellerin göreli önceliklerini, bir modeli hazırlamak için gereken maksimum süre ve belirli bir hesaplamayı tamamlaması için beklenen süre. Android 11 ayrıca ek NNAPI sonuç kodları uygulamaların, eksik yürütme gibi hataları anlamasını sağlayan teslim tarihlerine uymalısınız.

İş yükünün önceliğini ayarlama

Bir NNAPI iş yükünün önceliğini ayarlamak için şunu arayın: ANeuralNetworksCompilation_setPriority() ANeuralNetworksCompilation_finish() numaralı telefonu aramadan önce.

Son tarihler belirleyin

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

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

Aşağıdaki bölümde, işlenenlerin kullanımıyla ilgili ileri düzey konular ele alınmaktadır.

Nicel tensörler

Nicelleştirilmiş tensör, n boyutlu bir diziyi temsil etmenin en küçük yoludur. kayan nokta değerleridir.

NNAPI, 8 bit asimetrik nicelenmiş tensörleri destekler. Bu tensörler için her hücrenin değeri 8 bitlik bir tam sayıyla temsil edilir. Şununla ilişkili: tensör bir ölçek ve sıfır puan değeridir. Bunlar, 8 bit'i dönüştürmek için kullanılır. tamsayı değerlerini temsil edilen kayan nokta değerlerine çevirin.

Formül şöyledir:

(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 bitlik kayan nokta değerlerinin tensörleriyle karşılaştırıldığında, 8 bitlik nicelenmiş tensörler 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. Nöral ağ bu durumu telafi etmeyi öğrenir. ayrıntı düzeyini artırır. Ö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. Bu verilerde tensörün ölçeğini ve zeroPoint değerini de belirtirsiniz inceleyeceğiz.

NNAPI, 8 bit asimetrik nicelenmiş tensörlere ek olarak şunları da 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 derecedeki tensörler

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) kullanıma sunuldu aşağıdaki şekilde gösterildiği gibi, bilinmeyen sıralamadaki tensörler ANeuralNetworkOperandType.

NNAPI karşılaştırması

NNAPI karşılaştırması platform/test/mlts/benchmark bölgesindeki AOSP'de mevcuttur (karşılaştırma uygulaması) ve platform/test/mlts/models (modeller ve veri kümeleri).

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ı dışa aktarın ANDROID_SERIAL ortam değişkeni.

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

  4. Şu 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 komutunu kullanın. yardımcı olur.

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ı, kullanılabilir 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 şu komutu kullanın: adb shell setprop debug.nn.vlog '""'

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

NNAPI API bileşenleri, debug.nn.vlog denetimli mesajların yanı sıra düzeylerindeki diğer günlük girişlerini (her biri belirli bir günlük etiketi kullanarak) içerir.

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
  • Derleme Oluşturucu
  • CPU Yürütücü
  • Yürütme Oluşturucu
  • YürütmeBurstDenetleyicisi
  • YürütmeBurstSunucusu
  • Yürütme Planı
  • FibonacciSürücü
  • GraphDump
  • Dizine Eklenmiş Şekil Sarmalayıcı
  • IonWatcher
  • Müdür
  • Bellek
  • Bellek Utilleri
  • MetaModel
  • ModelArgumentBilgisi
  • Model Oluşturucu
  • Sinir Ağları
  • İşlem Çözücü
  • İşlemler
  • İşlem Yardımcıları
  • Paket Bilgileri
  • TokenHasher
  • Tür Yöneticisi
  • 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.