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.
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ülenexecuteFenced
sinyal göndermesine kadar geçensyncFence
. -
timingFenced
: Yürütmenin beklediği tüm eşitleme çitlerinin sinyallendiği andan itibaren, executeFenced döndürülenexecuteFenced
sinyallediğinde geçensyncFence
.
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ızcadebug.nn.vlog
özelliğinde uygun etiket ayarlanmışsa iletiyi günlüğe kaydeden, Android'inLOG
çevreleyen bir sarmalayıcı makrodur.initVLogMask()
herhangi birVLOG
ç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
veyaall
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
vemodel
.
compliantWithV1_*
: Bir NN HAL nesnesi, bilgi kaybı olmadan aynı türde farklı bir HAL sürümüne dönüştürülebiliyorsatrue
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, birV1_2::Model
üzerindecompliantWithV1_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
veupdate
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çerliysetrue
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çeriyorsavalidateModel
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:
-
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
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:
- İş 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. 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
veQUANTIZED_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ütenIF
veWHILE
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
vegetType
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çinMeasureTiming
parametresi, sürücünün yürütme süresini ölçüp ölçmediğini belirtir. SonuçlarTiming
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.
-
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_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
, birExecutionPreference
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çinrelaxedFloat32toFloat16Performance
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/
.