Sinir Ağları API sürücüleri

Bu sayfada bir Sinir Ağları API'si (NNAPI) sürücüsünün nasıl uygulanacağına ilişkin bir genel bakış sunulmaktadır. Daha fazla ayrıntı için hardware/interfaces/neuralnetworks içindeki HAL tanım dosyalarında bulunan belgelere bakın. Örnek bir sürücü uygulaması frameworks/ml/nn/driver/sample konumundadır.

Sinir Ağları API'si hakkında daha fazla bilgi için bkz. Sinir Ağları API'si .

Sinir Ağları HAL

Sinir Ağları (NN) HAL, bir üründe (örneğin bir telefon veya tablet) bulunan grafik işleme birimleri (GPU'lar) ve dijital sinyal işlemcileri (DSP'ler) gibi çeşitli cihazların soyutlanmasını tanımlar. Bu aygıtların sürücüleri NN HAL'e uygun olmalıdır. Arayüz hardware/interfaces/neuralnetworks içindeki HAL tanım dosyalarında belirtilir.

Çerçeve ile sürücü arasındaki arayüzün genel akışı şekil 1'de gösterilmektedir.

Sinir Ağları akışı

Şekil 1. Sinir Ağları akışı

Başlatma

Başlatma sırasında çerçeve, IDevice::getCapabilities_1_3 kullanarak sürücüyü yetenekleri açısından sorgular. @1.3::Capabilities yapısı tüm veri türlerini içerir ve bir vektör kullanarak gevşek olmayan performansı temsil eder.

Hesaplamaların mevcut cihazlara nasıl tahsis edileceğini belirlemek için çerçeve, her sürücünün bir yürütmeyi ne kadar hızlı ve ne kadar enerji verimli şekilde gerçekleştirebileceğini anlamak için yetenekleri kullanır. Bu bilgiyi sağlamak için sürücünün, referans iş yüklerinin yürütülmesine dayalı olarak standartlaştırılmış performans sayıları sağlaması gerekir.

Sürücünün IDevice::getCapabilities_1_3 yanıt olarak döndürdüğü değerleri belirlemek için ilgili veri türlerinin performansını ölçmek üzere NNAPI kıyaslama uygulamasını kullanın. MobileNet v1 ve v2, asr_float ve tts_float modelleri, 32 bit kayan nokta değerleri için performansı ölçmek için önerilir ve MobileNet v1 ve v2 nicelenmiş modeller, 8 bit nicelenmiş değerler için önerilir. Daha fazla bilgi için bkz. Android Makine Öğrenimi Test Paketi .

Android 9 ve önceki sürümlerde, Capabilities yapısı yalnızca kayan nokta ve nicelenmiş tensörler için sürücü performansı bilgilerini içerir ve skaler veri türlerini içermez.

Başlatma sürecinin bir parçası olarak çerçeve, IDevice::getType , IDevice::getVersionString , IDevice:getSupportedExtensions ve IDevice::getNumberOfCacheFilesNeeded kullanarak daha fazla bilgiyi sorgulayabilir.

Ürün yeniden başlatmaları arasında çerçeve, bu bölümde açıklanan tüm sorguların belirli bir sürücü için her zaman aynı değerleri raporlamasını bekler. Aksi takdirde, bu sürücüyü kullanan bir uygulamanın performansı düşebilir veya yanlış davranış sergileyebilir.

Derleme

Çerçeve, bir uygulamadan istek aldığında hangi cihazların kullanılacağını belirler. Android 10'da uygulamalar, çerçevenin seçtiği cihazları keşfedip belirleyebilir. Daha fazla bilgi için bkz. Cihaz Bulma ve Atama .

Model derleme zamanında çerçeve, IDevice::getSupportedOperations_1_3 çağırarak modeli her aday sürücüye gönderir. Her sürücü, modelin hangi işlemlerinin desteklendiğini belirten bir boole dizisi döndürür. Bir sürücü, çeşitli nedenlerden dolayı belirli bir işlemi destekleyemediğini belirleyebilir. Örneğin:

  • Sürücü veri türünü desteklemiyor.
  • Sürücü yalnızca belirli giriş parametrelerine sahip işlemleri destekler. Örneğin, bir sürücü 3x3 ve 5x5'i destekleyebilir ancak 7x7 evrişim işlemlerini desteklemeyebilir.
  • Sürücünün büyük grafikleri veya girişleri işlemesini engelleyen bellek kısıtlamaları var.

Derleme sırasında, OperandLifeTime açıklandığı gibi modelin girişi, çıkışı ve dahili işlenenleri bilinmeyen boyutlara veya sıralamaya sahip olabilir. Daha fazla bilgi için bkz . Çıkış şekli .

Çerçeve, seçilen her sürücüye IDevice::prepareModel_1_3 öğesini çağırarak modelin bir alt kümesini yürütmeye hazırlanması talimatını verir. Daha sonra her sürücü kendi alt kümesini derler. Örneğin, bir sürücü kod oluşturabilir veya ağırlıkların yeniden sıralanmış bir kopyasını oluşturabilir. Modelin derlenmesi ile isteklerin yürütülmesi arasında önemli bir süre olabileceğinden, büyük aygıt belleği parçaları gibi kaynaklar derleme sırasında atanmamalıdır.

Başarı durumunda sürücü bir @1.3::IPreparedModel tanıtıcısı döndürür. Sürücü, modelin alt kümesini hazırlarken bir hata kodu döndürürse, çerçeve, modelin tamamını CPU üzerinde çalıştırır.

Bir uygulama başlatıldığında derleme için kullanılan süreyi azaltmak için sürücü, derleme yapıtlarını önbelleğe alabilir. Daha fazla bilgi için bkz . Derleme Önbelleğe Alma.

Uygulamak

Bir uygulama çerçeveden bir isteği yürütmesini istediğinde, çerçeve, hazırlanmış bir model üzerinde eşzamanlı yürütme gerçekleştirmek için varsayılan olarak IPreparedModel::executeSynchronously_1_3 HAL yöntemini çağırır. Bir istek aynı zamanda execute_1_3 yöntemi, executeFenced yöntemi (bkz. Fenced yürütme ) kullanılarak eşzamansız olarak veya bir seri yürütme kullanılarak yürütülebilir.

Senkronize yürütme çağrıları, performansı artırır ve zaman uyumsuz çağrılarla karşılaştırıldığında iş parçacığı yükünü azaltır; çünkü denetim, yalnızca yürütme tamamlandıktan sonra uygulama sürecine geri döner. Bu, sürücünün uygulama sürecine bir yürütmenin tamamlandığını bildirmek için ayrı bir mekanizmaya ihtiyaç duymadığı anlamına gelir.

Eşzamansız execute_1_3 yöntemiyle, yürütme başladıktan sonra denetim uygulama sürecine geri döner ve sürücünün yürütme tamamlandığında @1.3::IExecutionCallback kullanarak çerçeveye bildirimde bulunması gerekir.

Yürütme yöntemine iletilen Request parametresi, yürütme için kullanılan giriş ve çıkış işlenenlerini listeler. İşlenen verilerini saklayan bellek, ilk boyutun en yavaş yinelendiği ve herhangi bir satırın sonunda dolgu içermediği ana satır sırasını kullanmalıdır. İşlenen türleri hakkında daha fazla bilgi için bkz . İşlenenler .

NN HAL 1.2 veya üzeri sürücüler için bir istek tamamlandığında hata durumu, çıktı şekli ve zamanlama bilgileri çerçeveye döndürülür. Yürütme sırasında, modelin çıktısı veya dahili işlenenleri bir veya daha fazla bilinmeyen boyuta veya bilinmeyen dereceye sahip olabilir. En az bir çıkış işleneninin bilinmeyen bir boyutu veya sırası olduğunda, sürücünün dinamik olarak boyutlandırılmış çıkış bilgilerini döndürmesi gerekir.

NN HAL 1.1 veya daha düşük sürüme sahip sürücüler için, istek tamamlandığında yalnızca hata durumu döndürülür. Yürütmenin başarıyla tamamlanabilmesi için giriş ve çıkış işlenenlerinin boyutları tam olarak belirtilmelidir. Dahili işlenenler bir veya daha fazla bilinmeyen boyuta sahip olabilir ancak bunların belirli bir sıralamaya sahip olması gerekir.

Birden fazla sürücüyü kapsayan kullanıcı istekleri için, çerçeve, ara belleğin ayrılmasından ve her sürücüye yapılan çağrıların sıralanmasından sorumludur.

Aynı @1.3::IPreparedModel üzerinde paralel olarak birden fazla istek başlatılabilir. Sürücü istekleri paralel olarak yürütebilir veya yürütmeleri seri hale getirebilir.

Çerçeve, sürücüden birden fazla hazırlanmış modeli saklamasını isteyebilir. Örneğin, m1 modelini hazırlayın, m2 hazırlayın, m1 üzerinde r1 isteğini yürütün, m2 üzerinde r2 yürütün, m1 üzerinde r3 yürütün, m2 üzerinde r4 yürütün, m1 bırakın ( Temizleme bölümünde açıklanmıştır) ve m2 bırakın.

Kötü bir kullanıcı deneyimine (örneğin, ilk karede takılma) yol açabilecek yavaş bir ilk yürütmeyi önlemek için, sürücünün başlatma işlemlerinin çoğunu derleme aşamasında gerçekleştirmesi gerekir. İlk çalıştırmada başlatma, büyük geçici arabelleklerin ayrılması veya bir cihazın saat hızının artırılması gibi, erken gerçekleştirildiğinde sistem sağlığını olumsuz yönde etkileyen eylemlerle sınırlı olmalıdır. Yalnızca sınırlı sayıda eşzamanlı model hazırlayabilen sürücülerin, ilk çalıştırma sırasında başlatma işlemini yapması gerekebilir.

Android 10 veya üzeri sürümlerde, aynı hazırlanan modelle birden fazla yürütmenin hızlı bir şekilde art arda yürütüldüğü durumlarda müşteri, uygulama ile sürücü işlemleri arasında iletişim kurmak için bir yürütme patlaması nesnesi kullanmayı seçebilir. Daha fazla bilgi için bkz. Ani Yürütmeler ve Hızlı Mesaj Kuyrukları .

Hızlı bir şekilde art arda birden fazla yürütmenin performansını artırmak için sürücü, geçici ara bellekleri kullanabilir veya saat hızlarını artırabilir. Belirli bir süre sonunda yeni istek oluşturulmazsa kaynakları serbest bırakmak için bir gözlemci iş parçacığı oluşturulması önerilir.

Çıkış şekli

Bir veya daha fazla çıkış işleneninin tüm boyutların belirtilmediği istekler için, sürücünün, yürütmeden sonra her çıkış işleneni için boyut bilgilerini içeren çıktı şekillerinin bir listesini sağlaması gerekir. Boyutlar hakkında daha fazla bilgi için bkz. OutputShape .

Bir yürütme, düşük boyutlu bir çıkış arabelleği nedeniyle başarısız olursa, sürücü, çıkış şekilleri listesinde hangi çıkış işlenenlerinin yetersiz arabellek boyutuna sahip olduğunu belirtmeli ve bilinmeyen boyutlar için sıfır kullanarak mümkün olduğunca fazla boyut bilgisi rapor etmelidir.

Zamanlama

Android 10'da, uygulamanın derleme işlemi sırasında kullanılacak tek bir cihaz belirtmesi durumunda uygulama yürütme süresini isteyebilir. Ayrıntılar için bkz. MeasureTiming ve Cihaz Keşfi ve Atama . Bu durumda, bir NN HAL 1.2 sürücüsü, bir isteği yürütürken yürütme süresini ölçmeli veya UINT64_MAX (sürenin mevcut olmadığını belirtmek için) rapor etmelidir. Sürücü, yürütme süresinin ölçülmesinden kaynaklanan performans cezasını en aza indirmelidir.

Sürücü, Timing yapısında aşağıdaki süreleri mikrosaniye cinsinden bildirir:

  • Cihazdaki yürütme süresi: Ana işlemcide çalışan sürücüdeki yürütme süresini içermez.
  • Sürücüdeki yürütme süresi: Cihazdaki yürütme süresini içerir.

Bu süreler, yürütmenin askıya alındığı zamanı (örneğin yürütmenin diğer görevler tarafından engellendiği veya bir kaynağın kullanılabilir hale gelmesini beklediği zaman) içermelidir.

Sürücünün yürütme süresini ölçmesi istenmediğinde veya bir yürütme hatası olduğunda, sürücünün süreleri UINT64_MAX olarak bildirmesi gerekir. Sürücüden yürütme süresini ölçmesi istendiğinde bile sürücü bunun yerine aygıttaki süre, sürücüdeki süre veya her ikisi için UINT64_MAX raporlayabilir. Sürücü her iki süreyi de UINT64_MAX dışında bir değer olarak bildirdiğinde, sürücüdeki yürütme süresi aygıttaki süreye eşit veya ondan fazla olmalıdır.

Çitlerle çevrili infaz

Android 11'de NNAPI, yürütmelerin bir sync_fence tanıtıcı listesi beklemesine ve isteğe bağlı olarak yürütme tamamlandığında sinyal verilen bir sync_fence nesnesi döndürmesine olanak tanır. Bu, küçük sıralı modeller ve akış kullanım senaryoları için ek yükü azaltır. Sınırlandırılmış yürütme ayrıca, sync_fence sinyali verebilen veya bekleyebilen diğer bileşenlerle daha verimli bir birlikte çalışabilirlik sağlar. sync_fence hakkında daha fazla bilgi için bkz. Senkronizasyon çerçevesi .

Çerçevelenmiş bir yürütmede, çerçeve, hazır bir model üzerinde beklenecek bir senkronizasyon çitleri vektörü ile çitlenmiş, eşzamansız bir yürütme başlatmak için IPreparedModel::executeFenced yöntemini çağırır. Eşzamansız görev, çağrı geri dönmeden önce tamamlanırsa, sync_fence için boş bir tanıtıcı döndürülebilir. Çerçevenin hata durumu ve süre bilgilerini sorgulamasına izin vermek için bir IFencedExecutionCallback nesnesinin de döndürülmesi gerekir.

Bir yürütme tamamlandıktan sonra, yürütmenin süresini ölçen aşağıdaki iki zamanlama değeri IFencedExecutionCallback::getExecutionInfo aracılığıyla sorgulanabilir.

  • timingLaunched : executeFenced çağrılmasından, executeFenced döndürülen syncFence sinyal vermesine kadar geçen süre.
  • timingFenced : Yürütmenin beklediği tüm senkronizasyon çitlerinin, executeFenced döndürülen syncFence sinyal verdiğinde sinyal verildiği andan itibaren geçen süre.

Kontrol akışı

Android 11 veya üstünü çalıştıran cihazlar için NNAPI, diğer modelleri bağımsız değişken olarak alan ve bunları koşullu ( IF ) veya tekrar tekrar ( WHILE ) yürüten IF ve WHILE olmak üzere iki kontrol akışı işlemi içerir. Bunun nasıl uygulanacağı hakkında daha fazla bilgi için bkz. Kontrol akışı .

Hizmet kalitesi

Android 11'de NNAPI, bir uygulamanın modellerinin göreceli önceliklerini, bir modelin hazırlanması için beklenen maksimum süreyi ve yürütme için beklenen maksimum süreyi belirtmesine izin vererek iyileştirilmiş hizmet kalitesini (QoS) içerir. tamamlanacak. Daha fazla bilgi için bkz. Hizmet Kalitesi .

Temizlemek

Bir uygulama hazırlanmış bir modeli kullanarak tamamlandığında, çerçeve @1.3::IPreparedModel nesnesine olan referansını yayınlar. IPreparedModel nesnesine artık başvurulmadığı zaman, onu oluşturan sürücü hizmetinde otomatik olarak yok edilir. Modele özgü kaynaklar şu anda sürücünün yıkıcıyı uygulamasında geri kazanılabilir. Sürücü hizmeti, istemci tarafından artık ihtiyaç duyulmadığında IPreparedModel nesnesinin otomatik olarak yok edilmesini istiyorsa, IPreparedModel nesnesi IPreparedeModel IPreparedModelCallback::notify_1_3 aracılığıyla döndürüldükten sonra IPreparedModel nesnesine herhangi bir başvuru tutmamalıdır.

CPU kullanımı

Sürücülerin hesaplamaları ayarlamak için CPU'yu kullanması bekleniyor. Sürücüler grafik hesaplamaları gerçekleştirmek için CPU'yu kullanmamalıdır çünkü bu, çerçevenin işi doğru şekilde tahsis etme yeteneğini engeller. Sürücü, idare edemediği kısımları çerçeveye bildirmeli ve gerisini çerçevenin halletmesine izin vermelidir.

Çerçeve, satıcı tarafından tanımlanan işlemler dışındaki tüm NNAPI işlemleri için bir CPU uygulaması sağlar. Daha fazla bilgi için bkz . Satıcı Uzantıları .

Android 10'da (API düzeyi 29) tanıtılan işlemlerde yalnızca CTS ve VTS testlerinin doğru olduğunu doğrulamak için bir referans CPU uygulaması bulunur. Mobil makine öğrenimi çerçevelerinde yer alan optimize edilmiş uygulamalar, NNAPI CPU uygulamasına göre tercih edilir.

Yardımcı işlevler

NNAPI kod tabanı, sürücü hizmetleri tarafından kullanılabilecek yardımcı program işlevlerini içerir.

frameworks/ml/nn/common/include/Utils.h dosyası, günlüğe kaydetme ve farklı NN HAL sürümleri arasında dönüştürme için kullanılanlar gibi çeşitli yardımcı program işlevlerini içerir.

  • VLogging: VLOG Android'in LOG çevreleyen ve yalnızca debug.nn.vlog özelliğinde uygun etiket ayarlandığında mesajı günlüğe kaydeden bir sarmalayıcı makrodur. VLOG yapılan herhangi bir çağrıdan önce initVLogMask() çağrılmalıdır. VLOG_IS_ON makrosu, VLOG şu anda etkin olup olmadığını kontrol etmek için kullanılabilir; bu, gerekmediği takdirde karmaşık günlük kodunun atlanmasına olanak tanır. Gayrimenkulün değeri aşağıdakilerden biri olmalıdır:

    • Hiçbir günlük kaydının yapılmayacağını belirten boş bir dize.
    • Tüm günlüğe kaydetmenin yapılacağını belirten belirteç 1 veya all .
    • Hangi günlüğe kaydetme işleminin yapılacağını belirten, boşluk, virgül veya iki nokta üst üste ile ayrılmış etiketlerin listesi. Etiketler compilation , cpuexe , driver , execution , manager ve model .
  • compliantWithV1_* : Bir NN HAL nesnesi, bilgi kaybı olmadan aynı türden farklı bir HAL sürümüne dönüştürülebiliyorsa true döndürür. Örneğin, V1_2::Model üzerinde compliantWithV1_0 çağrılması, modelin NN HAL 1.1 veya NN HAL 1.2'de tanıtılan işlem türlerini içermesi durumunda false değerini döndürür.

  • convertToV1_* : Bir NN HAL nesnesini bir sürümden diğerine dönüştürür. Dönüştürme bilgi kaybıyla sonuçlanırsa (yani türün yeni sürümü değeri tam olarak temsil edemiyorsa) günlüğe bir uyarı kaydedilir.

  • Yetenekler: nonExtensionOperandPerformance ve update işlevleri Capabilities::operandPerformance alanının oluşturulmasına yardımcı olmak için kullanılabilir.

  • Türlerin sorgulama özellikleri: isExtensionOperandType , isExtensionOperationType , nonExtensionSizeOfData , nonExtensionOperandSizeOfData , nonExtensionOperandTypeIsScalar , tensorHasUnspecifiedDimensions .

frameworks/ml/nn/common/include/ValidateHal.h dosyası, bir NN HAL nesnesinin HAL sürümünün spesifikasyonuna göre geçerli olduğunu doğrulamaya yönelik yardımcı program işlevlerini içerir.

  • validate* : NN HAL nesnesi, HAL sürümünün spesifikasyonuna göre geçerliyse true döndürür. OEM türleri ve uzantı türleri doğrulanmamıştır. Örneğin, model var olmayan bir işlenen dizinine başvuran bir işlem veya söz konusu HAL sürümünde desteklenmeyen bir işlem içeriyorsa validateModel false döndürür.

frameworks/ml/nn/common/include/Tracing.h dosyası, Sinir Ağları koduna sistem oluşturma bilgileri eklemeyi basitleştiren makrolar içerir. Örnek olarak, örnek sürücüdeki NNTRACE_* makro çağrılarına bakın.

frameworks/ml/nn/common/include/GraphDump.h dosyası, hata ayıklama amacıyla bir Model içeriğini grafik biçiminde dökmek için bir yardımcı program işlevi içerir.

  • graphDump : Modelin bir temsilini Graphviz ( .dot ) biçiminde belirtilen akışa (varsa) veya logcat'e (eğer akış sağlanmadıysa) yazar.

Doğrulama

NNAPI uygulamanızı test etmek için Android çerçevesinde bulunan VTS ve CTS testlerini kullanın. VTS, sürücülerinizi doğrudan (çerçeveyi kullanmadan) çalıştırırken, CTS bunları çerçeve aracılığıyla dolaylı olarak çalıştırır. Bunlar, her bir API yöntemini test eder ve sürücüler tarafından desteklenen tüm işlemlerin doğru şekilde çalıştığını ve hassasiyet gereksinimlerini karşılayan sonuçlar sağladığını doğrular.

NNAPI için CTS ve VTS'deki hassasiyet gereksinimleri aşağıdaki gibidir:

  • Kayan nokta: abs(beklenen - gerçek) <= atol + rtol * abs(beklenen); Neresi:

    • Fp32 için atol = 1e-5f, rtol = 5,0f * 1,1920928955078125e-7
    • Fp16 için atol = rtol = 5,0f * 0,0009765625f
  • Nicelenmiş: birer birer (üçer birer olan mobilenet_quantized hariç)

  • Boolean: tam eşleşme

CTS'nin NNAPI testlerinin bir yolu, her sürücünün yürütme sonuçlarını NNAPI referans uygulamasıyla test etmek ve karşılaştırmak için kullanılan sabit sözde rastgele grafikler oluşturmaktır. NN HAL 1.2 veya üzeri sürücüler için, sonuçlar kesinlik kriterlerini karşılamıyorsa, CTS bir hata bildirir ve hata ayıklama için /data/local/tmp altına başarısız model için bir spesifikasyon dosyası döker. Kesinlik kriterleri hakkında daha fazla ayrıntı için bkz. TestRandomGraph.cpp ve TestHarness.h .

Fuzz testi

Fuzz testinin amacı, beklenmeyen girişler gibi faktörler nedeniyle test edilen koddaki çökmeleri, iddiaları, bellek ihlallerini veya genel tanımsız davranışları bulmaktır. NNAPI fuzz testi için Android, yeni rastgele girdiler oluşturmak için önceki test senaryolarının hat kapsamını kullandıkları için fuzzing konusunda etkili olan libFuzzer tabanlı testleri kullanır. Örneğin libFuzzer, yeni kod satırlarında çalışan test senaryolarını tercih eder. Bu, testlerin sorunlu kodu bulmak için harcadığı süreyi büyük ölçüde azaltır.

Sürücü uygulamanızı doğrulamak amacıyla fuzz testi gerçekleştirmek için, AOSP'de bulunan libneuralnetworks_driver_fuzzer test yardımcı programında frameworks/ml/nn/runtime/test/android_fuzzing/DriverFuzzTest.cpp sürücü kodunuzu içerecek şekilde değiştirin. NNAPI bulanıklık testi hakkında daha fazla bilgi için bkz. frameworks/ml/nn/runtime/test/android_fuzzing/README.md .

Güvenlik

Uygulama süreçleri doğrudan sürücünün süreciyle iletişim kurduğundan, sürücülerin aldıkları çağrıların argümanlarını doğrulaması gerekir. Bu doğrulama VTS tarafından doğrulanmıştır. Doğrulama kodu frameworks/ml/nn/common/include/ValidateHal.h dosyasındadır.

Sürücüler aynı cihazı kullanırken uygulamaların diğer uygulamalara müdahale edemeyeceğinden de emin olmalıdır.

Android Makine Öğrenimi Test Paketi

Android Makine Öğrenimi Test Paketi (MLTS), satıcı cihazlarda gerçek modellerin doğruluğunu doğrulamak için CTS ve VTS'ye dahil edilen bir NNAPI karşılaştırmasıdır. Karşılaştırma, gecikmeyi ve doğruluğu değerlendirir ve sürücülerin sonuçlarını, aynı model ve veri kümeleri için CPU üzerinde çalışan TF Lite kullanan sonuçlarla karşılaştırır. Bu, sürücünün doğruluğunun CPU referans uygulamasından daha kötü olmamasını sağlar.

Android platformu geliştiricileri ayrıca sürücülerin gecikmesini ve doğruluğunu değerlendirmek için MLTS'yi kullanıyor.

NNAPI kıyaslaması AOSP'deki iki projede bulunabilir:

Modeller ve veri kümeleri

NNAPI kıyaslaması aşağıdaki modelleri ve veri kümelerini kullanır.

  • Farklı boyutlarda nicelenmiş MobileNetV1 float ve u8, Open Images Dataset v4'ün küçük bir alt kümesine (1500 görüntü) karşı çalışır.
  • Farklı boyutlarda nicelenmiş MobileNetV2 float ve u8, Open Images Dataset v4'ün küçük bir alt kümesine (1500 görüntü) karşı çalışır.
  • Metinden konuşmaya yönelik uzun kısa süreli bellek (LSTM) tabanlı akustik model, CMU Arctic setinin küçük bir alt kümesine karşı çalışır.
  • Otomatik konuşma tanımaya yönelik LSTM tabanlı akustik model, LibriSpeech veri kümesinin küçük bir alt kümesine karşı çalışır.

Daha fazla bilgi için bkz. platform/test/mlts/models .

Stres testi

Android Makine Öğrenimi Test Paketi, sürücülerin yoğun kullanım koşulları altında veya istemci davranışı gibi durumlarda dayanıklılığını doğrulamak için bir dizi çarpışma testi içerir.

Tüm çarpışma testleri aşağıdaki özellikleri sağlar:

  • Askıda kalma tespiti: NNAPI istemcisi bir test sırasında askıda kalırsa, test HANG hata nedeni ile başarısız olur ve test paketi bir sonraki teste geçer.
  • NNAPI istemci çökmesi tespiti: Testler istemci çökmelerinden sağ çıkar ve testler CRASH hata nedeni ile başarısız olur.
  • Sürücü çökmesi tespiti: Testler, NNAPI çağrısında hataya neden olan bir sürücü çökmesini tespit edebilir. Sürücü işlemlerinde NNAPI hatasına neden olmayan ve testin başarısız olmasına neden olmayan çökmeler olabileceğini unutmayın. Bu tür arızaları gidermek için sürücüyle ilgili hatalar veya çökmeler için sistem günlüğünde tail komutunu çalıştırmanız önerilir.
  • Mevcut tüm hızlandırıcıların hedeflenmesi: Testler mevcut tüm sürücülere karşı gerçekleştirilir.

Tüm çarpışma testlerinin aşağıdaki dört olası sonucu vardır:

  • SUCCESS : Uygulama hatasız tamamlandı.
  • FAILURE : Yürütme başarısız oldu. Genellikle bir modeli test ederken sürücünün modeli derleyemediğini veya yürütemediğini gösteren bir hatadan kaynaklanır.
  • HANG : Test süreci yanıt vermemeye başladı.
  • CRASH : Test işlemi çöktü.

Stres testi hakkında daha fazla bilgi ve çarpışma testlerinin tam listesi için bkz. platform/test/mlts/benchmark/README.txt .

MLTS'yi kullan

MLTS'yi kullanmak için:

  1. Hedef cihazı iş istasyonunuza bağlayın ve ona adb aracılığıyla erişilebildiğinden emin olun. Birden fazla cihaz bağlıysa hedef cihazın ANDROID_SERIAL ortam değişkenini dışa aktarın.
  2. cd Android üst düzey kaynak dizinine kopyalayın.

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

    Bir kıyaslama çalışmasının sonunda sonuçlar bir HTML sayfası olarak sunulur ve xdg-open iletilir.

Daha fazla bilgi için platform/test/mlts/benchmark/README.txt bakın.

Sinir Ağları HAL sürümleri

Bu bölümde Android ve Neural Networks HAL sürümlerinde sunulan değişiklikler açıklanmaktadır.

Android 11

Android 11, aşağıdaki önemli değişiklikleri içeren NN HAL 1.3'ü sunar.

  • NNAPI'de imzalı 8 bit niceleme desteği. TENSOR_QUANT8_ASYMM_SIGNED işlenen türünü ekler. İmzasız nicelemeli işlemleri destekleyen NN HAL 1.3'e sahip sürücülerin aynı zamanda bu işlemlerin imzalı çeşitlerini de desteklemesi gerekir. Çoğu nicelenmiş işlemin imzalı ve imzasız sürümlerini çalıştırırken, sürücülerin 128'e kadar aynı sonuçları üretmesi gerekir. Bu gereksinimin beş istisnası vardır: CAST , HASHTABLE_LOOKUP , LSH_PROJECTION , PAD_V2 ve QUANTIZED_16BIT_LSTM . QUANTIZED_16BIT_LSTM işlemi imzalı işlenenleri desteklemez ve diğer dört işlem imzalı nicelemeyi destekler ancak sonuçların aynı olmasını gerektirmez.
  • Çerçevenin IPreparedModel::executeFenced yöntemini çağırarak, hazır bir model üzerinde beklenecek senkronizasyon çitleri vektörüyle çitle çevrilmiş, eşzamansız bir yürütme başlatmak üzere çağrıldığı çitle çevrilmiş yürütmeler için destek. Daha fazla bilgi için bkz. Çitlerle çevrili yürütme .
  • Kontrol akışı desteği. Diğer modelleri bağımsız değişken olarak alan ve bunları koşullu ( IF ) veya tekrar tekrar ( WHILE ) yürüten IF ve WHILE işlemlerini ekler. Daha fazla bilgi için bkz. Kontrol akışı .
  • Uygulamalar, modellerinin göreceli önceliklerini, bir modelin hazırlanması için beklenen maksimum süreyi ve bir yürütmenin tamamlanması için beklenen maksimum süreyi gösterebildiği için iyileştirilmiş hizmet kalitesi (QoS) sağlanır. Daha fazla bilgi için bkz. Hizmet Kalitesi .
  • Sürücü tarafından yönetilen arabellekler için ayırıcı arabirimler sağlayan bellek etki alanları desteği. Bu, aygıt yerel belleklerinin yürütmeler arasında aktarılmasına, gereksiz veri kopyalamanın ve aynı sürücüdeki ardışık yürütmeler arasında dönüşümün engellenmesine olanak tanır. Daha fazla bilgi için bkz . Bellek alanları .

Android 10

Android 10, aşağıdaki önemli değişiklikleri içeren NN HAL 1.2'yi sunar.

  • Capabilities yapısı, skaler veri türleri de dahil olmak üzere tüm veri türlerini içerir ve adlandırılmış alanlar yerine bir vektör kullanarak gevşek olmayan performansı temsil eder.
  • getVersionString ve getType yöntemleri, çerçevenin aygıt türünü ( DeviceType ) ve sürüm bilgilerini almasına olanak tanır. Bkz. Cihaz Bulma ve Atama .
  • executeSynchronously yöntemi, eşzamanlı olarak bir yürütme gerçekleştirmek için varsayılan olarak çağrılır. execute_1_2 yöntemi, çerçeveye eşzamansız olarak bir yürütme gerçekleştirmesini söyler. Bkz. Yürütme .
  • executeSynchronously , execute_1_2 ve patlama yürütme için MeasureTiming parametresi, sürücünün yürütme süresini ölçüp ölçmeyeceğini belirtir. Sonuçlar Timing yapısında raporlanır. Bkz . Zamanlama .
  • Bir veya daha fazla çıktı işleneninin bilinmeyen bir boyuta veya dereceye sahip olduğu uygulamalar için destek. Bkz. Çıkış şekli .
  • Satıcı tarafından tanımlanan işlemler ve veri türlerinin koleksiyonları olan satıcı uzantıları için destek. Sürücü, desteklenen uzantıları IDevice::getSupportedExtensions yöntemi aracılığıyla bildirir. Bkz. Satıcı Uzantıları .
  • Bir patlama nesnesinin, uygulama ve sürücü işlemleri arasında iletişim kurmak için hızlı mesaj kuyruklarını (FMQ'lar) kullanarak bir dizi patlama yürütmesini kontrol etme yeteneği, böylece gecikmeyi azaltır. Bkz . Ani Yürütmeler ve Hızlı Mesaj Kuyrukları .
  • Sürücünün verileri kopyalamadan yürütme gerçekleştirmesine olanak tanıyan AHardwareBuffer desteği. AHardwareBuffer'a bakın.
  • Bir uygulama başlatıldığında derleme için kullanılan süreyi azaltmak amacıyla derleme yapıtlarının önbelleğe alınmasına yönelik iyileştirilmiş destek. Bkz. Derleme Önbelleğe Alma.

Android 10 aşağıdaki işlenen türlerini ve işlemlerini sunar.

  • İşlenen türleri

    • ANEURALNETWORKS_BOOL
    • ANEURALNETWORKS_FLOAT16
    • ANEURALNETWORKS_TENSOR_BOOL8
    • ANEURALNETWORKS_TENSOR_FLOAT16
    • ANEURALNETWORKS_TENSOR_QUANT16_ASYMM
    • ANEURALNETWORKS_TENSOR_QUANT16_SYMM
    • ANEURALNETWORKS_TENSOR_QUANT8_SYMM
    • ANEURALNETWORKS_TENSOR_QUANT8_SYMM_PER_CHANNEL
  • Operasyonlar

    • ANEURALNETWORKS_ABS
    • ANEURALNETWORKS_ARGMAX
    • ANEURALNETWORKS_ARGMIN
    • ANEURALNETWORKS_AXIS_ALIGNED_BBOX_TRANSFORM
    • ANEURALNETWORKS_BIDIRECTIONAL_SEQUENCE_LSTM
    • ANEURALNETWORKS_BIDIRECTIONAL_SEQUENCE_RNN
    • ANEURALNETWORKS_BOX_WITH_NMS_LIMIT
    • ANEURALNETWORKS_CAST
    • ANEURALNETWORKS_CHANNEL_SHUFFLE
    • ANEURALNETWORKS_DETECTION_POSTPROCESSING
    • ANEURALNETWORKS_EQUAL
    • ANEURALNETWORKS_EXP
    • ANEURALNETWORKS_EXPAND_DIMS
    • ANEURALNETWORKS_GATHER
    • ANEURALNETWORKS_GENERATE_PROPOSALS
    • ANEURALNETWORKS_GREATER
    • ANEURALNETWORKS_GREATER_EQUAL
    • ANEURALNETWORKS_GROUPED_CONV_2D
    • ANEURALNETWORKS_HEATMAP_MAX_KEYPOINT
    • ANEURALNETWORKS_INSTANCE_NORMALIZATION
    • ANEURALNETWORKS_LESS
    • ANEURALNETWORKS_LESS_EQUAL
    • ANEURALNETWORKS_LOG
    • ANEURALNETWORKS_LOGICAL_AND
    • ANEURALNETWORKS_LOGICAL_NOT
    • ANEURALNETWORKS_LOGICAL_OR
    • ANEURALNETWORKS_LOG_SOFTMAX
    • ANEURALNETWORKS_MAXIMUM
    • ANEURALNETWORKS_MINIMUM
    • ANEURALNETWORKS_NEG
    • ANEURALNETWORKS_NOT_EQUAL
    • ANEURALNETWORKS_PAD_V2
    • ANEURALNETWORKS_POW
    • ANEURALNETWORKS_PRELU
    • ANEURALNETWORKS_QUANTIZE
    • ANEURALNETWORKS_QUANTIZED_16BIT_LSTM
    • ANEURALNETWORKS_RANDOM_MULTINOMIAL
    • ANEURALNETWORKS_REDUCE_ALL
    • ANEURALNETWORKS_REDUCE_ANY
    • ANEURALNETWORKS_REDUCE_MAX
    • ANEURALNETWORKS_REDUCE_MIN
    • ANEURALNETWORKS_REDUCE_PROD
    • ANEURALNETWORKS_REDUCE_SUM
    • ANEURALNETWORKS_RESIZE_NEAREST_NEIGHBOR
    • ANEURALNETWORKS_ROI_ALIGN
    • ANEURALNETWORKS_ROI_POOLING
    • ANEURALNETWORKS_RSQRT
    • ANEURALNETWORKS_SELECT
    • ANEURALNETWORKS_SIN
    • ANEURALNETWORKS_SLICE
    • ANEURALNETWORKS_SPLIT
    • ANEURALNETWORKS_SQRT
    • ANEURALNETWORKS_TILE
    • ANEURALNETWORKS_TOPK_V2
    • ANEURALNETWORKS_TRANSPOSE_CONV_2D
    • ANEURALNETWORKS_UNIDIRECTIONAL_SEQUENCE_LSTM
    • ANEURALNETWORKS_UNIDIRECTIONAL_SEQUENCE_RNN

Android 10, mevcut işlemlerin çoğuna güncellemeler getiriyor. Güncellemeler temel olarak aşağıdakilerle ilgilidir:

  • NCHW bellek düzeni desteği
  • Softmax ve normalizasyon işlemlerinde derecesi 4'ten farklı olan tensör desteği
  • Genişletilmiş evrişimler için destek
  • ANEURALNETWORKS_CONCATENATION karışık nicemlemeli girişler için destek

Aşağıdaki liste, Android 10'da değiştirilen işlemleri göstermektedir. Değişikliklerin tüm ayrıntıları için NNAPI referans belgelerindeki OperationCode'a bakın.

  • ANEURALNETWORKS_ADD
  • ANEURALNETWORKS_AVERAGE_POOL_2D
  • ANEURALNETWORKS_BATCH_TO_SPACE_ND
  • ANEURALNETWORKS_CONCATENATION
  • ANEURALNETWORKS_CONV_2D
  • ANEURALNETWORKS_DEPTHWISE_CONV_2D
  • ANEURALNETWORKS_DEPTH_TO_SPACE
  • ANEURALNETWORKS_DEQUANTIZE
  • ANEURALNETWORKS_DIV
  • ANEURALNETWORKS_FLOOR
  • ANEURALNETWORKS_FULLY_CONNECTED
  • ANEURALNETWORKS_L2_NORMALIZATION
  • ANEURALNETWORKS_L2_POOL_2D
  • ANEURALNETWORKS_LOCAL_RESPONSE_NORMALIZATION
  • ANEURALNETWORKS_LOGISTIC
  • ANEURALNETWORKS_LSH_PROJECTION
  • ANEURALNETWORKS_LSTM
  • ANEURALNETWORKS_MAX_POOL_2D
  • ANEURALNETWORKS_MEAN
  • ANEURALNETWORKS_MUL
  • ANEURALNETWORKS_PAD
  • ANEURALNETWORKS_RELU
  • ANEURALNETWORKS_RELU1
  • ANEURALNETWORKS_RELU6
  • ANEURALNETWORKS_RESHAPE
  • ANEURALNETWORKS_RESIZE_BILINEAR
  • ANEURALNETWORKS_RNN
  • ANEURALNETWORKS_ROI_ALIGN
  • ANEURALNETWORKS_SOFTMAX
  • ANEURALNETWORKS_SPACE_TO_BATCH_ND
  • ANEURALNETWORKS_SPACE_TO_DEPTH
  • ANEURALNETWORKS_SQUEEZE
  • ANEURALNETWORKS_STRIDED_SLICE
  • ANEURALNETWORKS_SUB
  • ANEURALNETWORKS_SVDF
  • ANEURALNETWORKS_TANH
  • ANEURALNETWORKS_TRANSPOSE

Android 9

NN HAL 1.1, Android 9'da kullanıma sunuldu ve aşağıdaki önemli değişiklikleri içeriyor.

  • IDevice::prepareModel_1_1 bir ExecutionPreference parametresi içerir. Bir sürücü, uygulamanın pil tasarrufu yapmayı tercih ettiğini veya modeli hızlı ardışık aramalarda çalıştıracağını bilerek, hazırlığını ayarlamak için bunu kullanabilir.
  • Dokuz yeni işlem eklendi: BATCH_TO_SPACE_ND , DIV , MEAN , PAD , SPACE_TO_BATCH_ND , SQUEEZE , STRIDED_SLICE , SUB , TRANSPOSE .
  • Bir uygulama, Model.relaxComputationFloat32toFloat16 true olarak ayarlayarak 32 bitlik kayan nokta hesaplamalarının 16 bit kayan nokta aralığı ve/veya hassasiyet kullanılarak çalıştırılabileceğini belirtebilir. Capabilities yapısı, sürücünün rahat performansını çerçeveye bildirebilmesi için ek olarak relaxedFloat32toFloat16Performance alanına sahiptir.

Android8.1

İlk Sinir Ağları HAL (1.0), Android 8.1'de piyasaya sürüldü. Daha fazla bilgi için bkz. /neuralnetworks/1.0/ .