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

Bu sayfa, bir Neural Networks API (NNAPI) sürücüsünün nasıl uygulanacağına ilişkin bir genel bakış sağlar. 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 .

Neural Networks API'si hakkında daha fazla bilgi için, Neural Networks API'ye bakın.

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 aygıtların bir soyutlamasını tanımlar. Bu aygıtların sürücüleri, NN HAL ile uyumlu olmalıdır. Arayüz, hardware/interfaces/neuralnetworks HAL tanım dosyalarında belirtilir.

Çerçeve ve bir 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, sürücüyü IDevice::getCapabilities_1_3 kullanarak yetenekleri için sorgular. @1.3::Capabilities yapısı, tüm veri türlerini içerir ve bir vektör kullanarak gevşetilmemiş performansı temsil eder.

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

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 için NNAPI karşılaştırmalı değerlendirme uygulamasını kullanın. 32 bit kayan nokta değerleri için performansı ölçmek için MobileNet v1 ve v2, asr_float ve tts_float modelleri önerilir ve 8 bit nicelleştirilmiş değerler için MobileNet v1 ve v2 nicelleştirilmiş modeller önerilir. Daha fazla bilgi için bkz. Android Machine Learning Test Suite .

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 işleminin bir parçası olarak çerçeve, IDevice::getType , IDevice::getVersionString , IDevice:getSupportedExtensions ve IDevice::getNumberOfCacheFilesNeeded getNumberOfCacheFilesNeeded kullanarak daha fazla bilgi 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 rapor etmesini bekler. Aksi takdirde, bu sürücüyü kullanan bir uygulama, düşük performans veya yanlış davranış sergileyebilir.

Derleme

Çerçeve, bir uygulamadan bir istek aldığında hangi cihazların kullanılacağını belirler. Android 10'da uygulamalar, çerçevenin seçtiği cihazları keşfedebilir ve 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 gösteren bir dizi boole döndürür. Bir sürücü, çeşitli nedenlerle belirli bir işlemi destekleyemediğini belirleyebilir. Örneğin:

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

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

Çerçeve, seçilen her sürücüye, IDevice::prepareModel_1_3 çağırarak modelin bir alt kümesini yürütmeye hazırlanma talimatı verir. Her sürücü daha sonra 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, derleme sırasında büyük aygıt belleği parçaları gibi kaynaklar atanmamalıdır.

Başarılı olduğunda, 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 tüm modeli CPU üzerinde çalıştırır.

Bir uygulama başladığında derleme için kullanılan süreyi azaltmak için bir sürücü derleme yapıları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 modelde 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 ayrıca execute_1_3 yöntemi , executeFenced yöntemi (bkz.

Eşzamanlı yürütme çağrıları, eşzamansız çağrılara kıyasla performansı artırır ve iş parçacığı oluşturma ek yükünü azaltır, çünkü denetim yalnızca yürütme tamamlandıktan sonra uygulama işlemine döndürülür. Bu, sürücünün uygulama sürecini bir yürütmenin tamamlandığını bildirmek için ayrı bir mekanizmaya ihtiyacı olmadığı anlamına gelir.

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

Yürütme yöntemine iletilen Request parametresi, yürütme için kullanılan giriş ve çıkış işlenenlerini listeler. İşlenen verilerini depolayan bellek, birinci boyutun en yavaş yinelenmesiyle satır ana düzenini kullanmalı ve herhangi bir satırın sonunda dolgu içermemelidir. İş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 sıraya sahip olabilir. En az bir çıktı işleneni bilinmeyen bir boyuta veya dereceye sahip olduğunda, sürücünün dinamik olarak boyutlandırılmış çıktı bilgilerini döndürmesi gerekir.

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

Birden çok sürücüye yayılan kullanıcı istekleri için, ara bellek ayırmaktan ve her sürücüye yapılan çağrıları sıralamaktan çerçeve sorumludur.

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

Çerçeve, bir sürücüden birden fazla hazırlanmış modeli tutması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'i serbest bırakın ve m1 serbest m2 .

Kötü bir kullanıcı deneyimiyle sonuçlanabilecek yavaş bir ilk yürütmeyi önlemek için (örneğin, bir ilk kare kekemeliği), sürücü başlatmaların çoğunu derleme aşamasında gerçekleştirmelidir. İlk çalıştırmada başlatma, büyük geçici arabellekler ayırmak veya bir aygıtın saat hızını artırmak gibi erken gerçekleştirildiğinde sistem sağlığını olumsuz etkileyen eylemlerle sınırlandırılmalıdır. Yalnızca sınırlı sayıda eşzamanlı model hazırlayabilen sürücülerin başlatma işlemlerini ilk çalıştırmada yapması gerekebilir.

Android 10 veya sonraki sürümlerde, aynı hazırlanmış modelle birden çok yürütmenin hızlı bir şekilde art arda yürütüldüğü durumlarda, istemci, uygulama ve sürücü süreçleri arasında iletişim kurmak için bir yürütme patlaması nesnesi kullanmayı seçebilir. Daha fazla bilgi için, bkz. Seri İşlem Yürütmeleri ve Hızlı İleti Kuyrukları .

Hızlı bir şekilde art arda birden fazla yürütme için performansı artırmak için sürücü geçici arabellekleri tutabilir veya saat hızlarını artırabilir. Sabit bir süre sonra yeni istek oluşturulmazsa, kaynakları serbest bırakmak için bir bekçi dizisi oluşturulması önerilir.

Çıkış şekli

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

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

Zamanlama

Android 10'da, uygulama derleme işlemi sırasında kullanmak üzere tek bir cihaz belirtmişse uygulama yürütme süresini sorabilir. Ayrıntılar için bkz. MeasureTiming ve Device Discovery and Assignment . Bu durumda, bir NN HAL 1.2 sürücüsü, bir istek yürütülürken yürütme süresini ölçmeli veya UINT64_MAX (sürenin kullanılamadığını belirtmek için) rapor etmelidir. Sürücü, yürütme süresinin ölçülmesinden kaynaklanan herhangi bir performans cezasını en aza indirmelidir.

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

  • Aygıtta yürütme süresi: Ana bilgisayar işlemcisinde çalışan sürücüdeki yürütme süresini içermez.
  • Sürücüdeki yürütme süresi: Aygıttaki yürütme süresini içerir.

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

Sürücüden yürütme süresini ölçmesi istenmediğinde veya bir yürütme hatası olduğunda, sürücü süreleri UINT64_MAX olarak bildirmelidir. Sürücüden yürütme süresini ölçmesi istendiğinde bile, bunun yerine cihazdaki süre, sürücüdeki süre veya her ikisi için UINT64_MAX rapor edebilir. 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 cihazdaki süreye eşit veya bu süreyi aşmalıdır.

çitle çevrili yürütme

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 izin verir. Bu, küçük dizi modelleri ve akış kullanım durumları için ek yükü azaltır. Çitle çevrili yürütme, sync_fence için sinyal gönderebilen veya bekleyebilen diğer bileşenlerle daha verimli birlikte çalışabilirliğe de olanak tanır. sync_fence hakkında daha fazla bilgi için, bkz. Senkronizasyon Çerçevesi .

Bir çitle çevrili yürütmede, çerçeve, beklemek için bir eşitleme çitleri vektörü ile hazırlanmış bir modelde çitle çevrili, 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ı 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 nesnesi de döndürülmelidir.

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'in döndürülen executeFenced sinyal göndermesine kadar geçen syncFence .
  • timingFenced : Yürütmenin beklediği tüm eşitleme çitlerinin sinyallendiği andan itibaren, executeFenced döndürülen executeFenced sinyallediğinde geçen syncFence .

Kontrol akışı

Android 11 veya sonraki sürümleri çalıştıran cihazlar için, NNAPI, diğer modelleri argüman olarak alan ve onları 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. Akış kontrolü .

Hizmet kalitesi

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

Temizlemek

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

CPU kullanımı

Sürücülerin hesaplamaları ayarlamak için CPU'yu kullanması beklenir. Sürücüler, grafik hesaplamaları yapmak için CPU'yu kullanmamalıdır, çünkü bu, çerçevenin işi doğru şekilde tahsis etme becerisine müdahale eder. Sürücü, işleyemediği parçaları ç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 seviye 29) sunulan işlemler, yalnızca CTS ve VTS testlerinin doğru olduğunu doğrulamak için bir referans CPU uygulamasına sahiptir. Mobil makine öğrenimi çerçevelerinde bulunan 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ılabilen 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 , yalnızca debug.nn.vlog özelliğinde uygun etiket ayarlanmışsa iletiyi günlüğe kaydeden, Android'in LOG çevreleyen bir sarmalayıcı makrodur. initVLogMask() herhangi bir VLOG çağrısından önce çağrılmalıdır. VLOG_IS_ON makrosu, VLOG şu anda etkin olup olmadığını kontrol etmek için kullanılabilir, bu da gerekmediğinde karmaşık günlük kodunun atlanmasını sağlar. Mülkün değeri aşağıdakilerden biri olmalıdır:

    • Günlük kaydı yapılmayacağını belirten boş bir dize.
    • 1 veya all belirteci, tüm günlüğe kaydetmenin yapılacağını belirtir.
    • Hangi günlüğe kaydetmenin yapılacağını belirten boşluk, virgül veya iki nokta üst üste ile ayrılmış bir etiket listesi. Etiketler compilation , cpuexe , driver , execution , manager ve model .
  • compliantWithV1_* : Bir NN HAL nesnesi, bilgi kaybı olmadan aynı türde farklı bir HAL sürümüne dönüştürülebiliyorsa true değerini döndürür. Örneğin, model NN HAL 1.1 veya NN HAL 1.2'de tanıtılan işlem türlerini içeriyorsa, bir V1_2::Model üzerinde compliantWithV1_0 öğesinin çağrılması false 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ına neden olursa (yani, türün yeni sürümü değeri tam olarak temsil edemiyorsa) bir uyarı günlüğe 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 belirtimine göre geçerli olduğunu doğrulamak için yardımcı işlevler içerir.

  • validate* : NN HAL nesnesi, HAL sürümünün belirtimine göre geçerliyse true değerini döndürür. OEM türleri ve uzantı türleri doğrulanmaz. Örneğin, model var olmayan bir işlenen dizinine başvuran bir işlem veya bu 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 bilgisi eklemeyi basitleştirmek için makrolar içerir. Bir örnek için, ö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 boşaltmak için bir yardımcı program işlevi içerir.

  • graphDump : Modelin bir temsilini Graphviz ( .dot ) formatında belirtilen akışa (sağlanmışsa) veya logcat'e (hiçbir 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) uygularken, CTS bunları çerçeve aracılığıyla dolaylı olarak uygular. Bunlar, her API yöntemini test eder ve sürücüler tarafından desteklenen tüm işlemlerin doğru çalıştığını doğrular ve kesinlik gereksinimlerini karşılayan sonuçlar sağlar.

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

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

    • fp32 için atol = 1e-5f, rtol = 5.0f * 1.1920928955078125e-7
    • fp16 için atol = rtol = 5.0f * 0.0009765625f
  • Nicelleştirilmiş : bire bir (üçte bir olan mobilenet_quantized hariç)

  • Boole: tam eşleşme

CTS'nin NNAPI'yi test etme yollarından biri, 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 ölçütlerini 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 belirtim dosyası atar. Kesinlik kriterleri hakkında daha fazla ayrıntı için TestRandomGraph.cpp ve TestHarness.h bakın.

tüy testi

Bulanıklık testinin amacı, beklenmeyen girdiler gibi faktörler nedeniyle test edilen kodda çö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'de verimli olan libFuzzer tabanlı testler 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 üzere fuzz testi yapmak 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 fuzz 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ü süreciyle iletişim kurduğundan, sürücülerin aldıkları çağrıların bağımsız değişkenlerini doğrulaması gerekir. Bu doğrulama VTS tarafından doğrulanır. Doğrulama kodu frameworks/ml/nn/common/include/ValidateHal.h .

Sürücüler, aynı cihazı kullanırken uygulamaların diğer uygulamalara müdahale etmemesini de sağlamalıdır.

Android Makine Öğrenimi Test Paketi

Android Machine Learning Test Suite (MLTS), satıcı cihazlarda gerçek modellerin doğruluğunu doğrulamak için CTS ve VTS'de bulunan 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, bir 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ır.

NNAPI karşılaştırma ölçütü, AOSP'deki iki projede bulunabilir:

Modeller ve veri kümeleri

NNAPI karşılaştırması aşağıdaki modelleri ve veri kümelerini kullanır.

  • Farklı boyutlarda nicelenmiş MobileNetV1 kayan nokta ve u8, Açık Görüntüler Veri Kümesi v4'ün küçük bir alt kümesine (1500 görüntü) karşı çalışır.
  • Farklı boyutlarda nicelenmiş MobileNetV2 kayan nokta ve u8, Açık Görüntüler Veri Kümesi 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 kümesinin küçük bir alt kümesine karşı çalışır.
  • Otomatik konuşma tanıma için 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 Machine Learning Test Suite, sürücülerin yoğun kullanım koşulları altında veya müşterilerin davranışlarının kritik durumlarında 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 algılaması: NNAPI istemcisi bir test sırasında kilitlenirse, test HANG başarısızlık nedeni ile başarısız olur ve test paketi bir sonraki teste geçer.
  • NNAPI istemci kilitlenme algılaması: Testler, istemci çökmelerinde hayatta kalır ve testler, CRASH başarısızlık nedeni ile başarısız olur.
  • Sürücü kilitlenme algılaması: Testler, bir NNAPI çağrısında hataya neden olan bir sürücü çökmesini algılayabilir. 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 bir hatayı örtmek 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şı çalıştırılır.

Tüm çarpışma testleri aşağıdaki dört olası sonuca sahiptir:

  • SUCCESS : Yürütme hatasız tamamlandı.
  • FAILURE : Yürütme başarısız oldu. Tipik olarak, bir model test edilirken, 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 ve çarpışma testlerinin tam listesi hakkında daha fazla bilgi için bkz. platform/test/mlts/benchmark/README.txt .

MLTS'yi kullanma

MLTS'yi kullanmak için:

  1. İş istasyonunuza bir hedef cihaz bağlayın ve adb aracılığıyla erişilebilir olduğundan emin olun. Birden fazla cihaz bağlıysa, hedef cihaz ANDROID_SERIAL ortam değişkenini dışa aktarın.
  2. cd Android üst düzey kaynak dizinine.

    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 bkz. platform/test/mlts/benchmark/README.txt .

Sinir Ağları HAL sürümleri

Bu bölüm, Android ve Neural Networks HAL sürümlerinde sunulan değişiklikleri açıklamaktadı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 nicelemeyle işlemleri destekleyen NN HAL 1.3'e sahip sürücülerin, bu işlemlerin imzalı türevlerini de desteklemesi gerekir. Çoğu nicelenmiş işlemin imzalı ve imzasız sürümlerini çalıştırırken, sürücülerin 128'lik bir ofset değerine kadar aynı sonuçları vermesi gerekir. Bu gereksinimin beş istisnası vardır: CAST , HASHTABLE_LOOKUP , LSH_PROJECTION , PAD_V2 ve QUANTIZED_16BIT_LSTM . QUANTIZED_16BIT_LSTM işlemi, işaretli işlenenleri desteklemez ve diğer dört işlem, işaretli nicelemeyi destekler, ancak sonuçların aynı olmasını gerektirmez.
  • Çerçevenin, beklemek için bir eşitleme çitleri vektörü ile hazırlanmış bir model üzerinde çitle çevrili, eşzamansız bir yürütme başlatmak için IPreparedModel::executeFenced yöntemini çağırdığı çitle çevrili yürütmeler için destek. Daha fazla bilgi için, bkz. Çitle çevrili yürütme .
  • Kontrol akışı için destek. Diğer modelleri argüman olarak alan ve onları koşullu ( IF ) veya tekrar tekrar ( WHILE ) yürüten IF ve WHILE işlemlerini ekler. Daha fazla bilgi için bkz. Akış kontrolü .
  • Uygulamalar, modellerinin göreli ö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ğinden iyileştirilmiş hizmet kalitesi (QoS). Daha fazla bilgi için bkz . Hizmet Kalitesi .
  • Sürücü tarafından yönetilen arabellekler için ayırıcı arabirimleri sağlayan bellek etki alanları desteği. Bu, aynı sürücü üzerinde ardışık yürütmeler arasında gereksiz veri kopyalamayı ve dönüştürmeyi önleyerek, aygıt yerel belleklerinin yürütmeler arasında geçirilmesine olanak tanır. Daha fazla bilgi için bkz. Bellek etki 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 cihaz türünü ( DeviceType ) ve sürüm bilgilerini almasına izin verir. Cihaz Bulma ve Atama konusuna bakın.
  • executeSynchronously yöntemi, bir yürütmeyi eşzamanlı olarak 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. Yürütme bölümüne bakın.
  • executeSynchronously , execute_1_2 ve çoğuşma yürütme için MeasureTiming parametresi, sürücünün yürütme süresini ölçüp ölçmediğini belirtir. Sonuçlar Timing yapısında rapor edilir. Bkz. Zamanlama .
  • Bir veya daha fazla çıktı işleneninin bilinmeyen bir boyuta veya dereceye sahip olduğu yürütmeler için destek. Bkz. Çıktı şekli .
  • Satıcı tanımlı işlemler ve veri türleri koleksiyonları olan satıcı uzantıları için destek. Sürücü, desteklenen uzantıları IDevice::getSupportedExtensions yöntemi aracılığıyla bildirir. Satıcı Uzantılarına bakın.
  • Bir patlama nesnesinin, uygulama ve sürücü süreçleri arasında iletişim kurmak için hızlı mesaj kuyrukları (FMQ'lar) kullanarak bir dizi patlama yürütmesini kontrol ederek gecikmeyi azaltma yeteneği. Burst Yürütmeler ve Hızlı Mesaj Kuyruklarına bakın.
  • Sürücünün verileri kopyalamadan yürütme gerçekleştirmesine izin vermek için AHardwareBuffer desteği. AHardwareBuffer'a bakın.
  • Bir uygulama başladığında derleme için kullanılan süreyi azaltmak için derleme yapılarının önbelleğe alınması için geliştirilmiş destek. Derleme Önbelleğe Alma konusuna bakın.

Android 10, aşağıdaki işlenen türlerini ve işlemlerini tanıtır.

  • iş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 esas olarak aşağıdakilerle ilgilidir:

  • NCHW bellek düzeni desteği
  • Softmax ve normalizasyon işlemlerinde rankı 4'ten farklı olan tensörler için destek
  • Genişletilmiş kıvrımlar için destek
  • ANEURALNETWORKS_CONCATENATION içinde karışık nicemlemeli girişler için destek

Aşağıdaki liste, Android 10'da değiştirilen işlemleri gösterir. Değişikliklerin tüm ayrıntıları için, NNAPI başvuru belgelerinde 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 tanıtıldı 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 pilden tasarruf etmeyi 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 noktalı hesaplamaların 16 bitlik kayan nokta aralığı ve/veya kesinlik kullanılarak çalıştırılabileceğini belirtebilir. Capabilities structında, sürücünün rahat performansını çerçeveye bildirebilmesi için relaxedFloat32toFloat16Performance ek alanına sahiptir.

Android 8.1

İlk Sinir Ağları HAL (1.0), Android 8.1'de yayınlandı. Daha fazla bilgi için bkz. /neuralnetworks/1.0/ .