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.
Ş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.
Ç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.
-
timingLaunched:
executeFencedçağrılmasından, executeFenced'in döndürülen
executeFencedsinyal 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
executeFencedsinyallediğ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_ONmakrosu,
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.
-
1veya
allbelirteci, 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,
managerve
model.
compliantWithV1_*: Bir NN HAL nesnesi, bilgi kaybı olmadan aynı türde farklı bir HAL sürümüne dönüştürülebiliyorsa
truedeğ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ı
falsedö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:
nonExtensionOperandPerformanceve
updateişlevleri,
Capabilities::operandPerformancealanı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
truedeğ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
falsedö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_quantizedhariç)
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:
-
platform/test/mlts/benchmark(kıyaslama uygulaması)
-
platform/test/mlts/models(modeller ve veri kümeleri)
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
HANGbaş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,
CRASHbaş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
tailkomutunu ç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:
- İş 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_SERIALortam değişkenini dışa aktarın.
cdAndroid ü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-openiletilir.
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_SIGNEDiş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_V2ve
QUANTIZED_16BIT_LSTM.
QUANTIZED_16BIT_LSTMiş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::executeFencedyö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
IFve
WHILEiş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.
-
Capabilitiesyapı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.
-
getVersionStringve
getTypeyöntemleri, çerçevenin cihaz türünü (
DeviceType) ve sürüm bilgilerini almasına izin verir. Cihaz Bulma ve Atama konusuna bakın.
-
executeSynchronouslyyöntemi, bir yürütmeyi eşzamanlı olarak gerçekleştirmek için varsayılan olarak çağrılır.
execute_1_2yö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_2ve çoğuşma yürütme için
MeasureTimingparametresi, sürücünün yürütme süresini ölçüp ölçmediğini belirtir. Sonuçlar
Timingyapı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::getSupportedExtensionsyö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.
-
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
-
-
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_CONCATENATIONiç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
ExecutionPreferenceparametresi 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
trueolarak ayarlayarak, 32 bitlik kayan noktalı hesaplamaların 16 bitlik kayan nokta aralığı ve/veya kesinlik kullanılarak çalıştırılabileceğini belirtebilir.
Capabilitiesstructında, sürücünün rahat performansını çerçeveye bildirebilmesi için
relaxedFloat32toFloat16Performanceek 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/ .