Bu sayfa, bir Neural Networks API (NNAPI) sürücüsünün nasıl uygulanacağına dair 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 hakkında daha fazla bilgi için bkz. Neural Networks API .
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şlemciler (DSP'ler) gibi çeşitli cihazların bir soyutlamasını tanımlar. Bu aygıtların sürücüleri NN HAL'a 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.
Ş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 için 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 enerji açısından verimli bir ş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 karşılaştırmalı değerlendirme uygulamasını kullanın. 32-bitlik kayan noktalı değerler için performansın ölçülmesi için MobileNet v1 ve v2, asr_float
ve tts_float
modelleri, 8-bitlik nicemlenmiş değerler için MobileNet v1 ve v2 nicelemeli modeller ö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 noktalı 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ün yeniden başlatılması 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 bildirmesini bekler. Aksi takdirde, o sürücüyü kullanan bir uygulama düşük performans veya hatalı 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 belirtebilir. Daha fazla bilgi için bkz. Cihaz Keşfi ve Atama .
Model derleme zamanında çerçeve, modeli çağırarak her aday sürücüye gönderir IDevice::getSupportedOperations_1_3
. Her sürücü, modelin hangi işlemlerinin desteklendiğini gösteren bir boole dizisi döndürür. Bir sürücü, belirli bir işlemi birkaç nedenden dolayı destekleyemeyeceğ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 girdileri işlemesini engelleyen bellek kısıtlamaları vardır.
Derleme sırasında, modelin girdisi, çıktısı ve dahili işlenenleri, OperandLifeTime
içinde açıklandığı gibi, bilinmeyen boyutlara veya sıralamaya 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ırlanması talimatını verir. Her sürücü daha sonra kendi alt kümesini derler. Örneğin, bir sürücü kod üretebilir veya ağırlıkların yeniden sıralanmış bir kopyasını oluşturabilir. Modelin derlenmesi ile isteklerin yürütülmesi arasında önemli miktarda zaman olabileceğinden, büyük aygıt belleği parçaları gibi kaynaklar derleme sırasında 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ı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 senkronize bir 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. Çitli yürütme ) kullanılarak eşzamansız olarak yürütülebilir veya bir seri yürütme kullanılarak yürütülebilir.
Eşzamanlı yürütme çağrıları, eşzamansız çağrılara kıyasla performansı artırır ve iş parçacığı ek yükünü azaltır, çünkü denetim yalnızca yürütme tamamlandıktan sonra uygulama sürecine döndürülür. Bu, sürücünün uygulama sürecini 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 kontrol uygulama işlemine geri döner ve sürücü, yürütme tamamlandığında @1.3::IExecutionCallback
kullanarak çerçeveyi 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 boyut en yavaş yinelenen ve herhangi bir satırın sonunda dolgu içermeyen satır ana 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 çıktı işleneni bilinmeyen bir boyuta veya sıralamaya sahip olduğunda, sürücünün dinamik olarak boyutlandırılmış çıktı bilgisi döndürmesi gerekir.
NN HAL 1.1 veya daha düşük sürüme sahip 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 belirli bir dereceye sahip olmaları gerekir.
Birden çok sürücüye yayılan kullanıcı istekleri için çerçeve, ara belleği ayırmaktan ve her bir sürücüye yapılan çağrıları sıralamaktan sorumludur.
Aynı @1.3::IPreparedModel
üzerinde birden çok istek paralel olarak 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
r1
isteğini yürütün, m2
r2
yürütün, r3
m1
, m2
r4
yürütün, m1
bırakın ( Temizleme'de açıklanmıştır) ve m2
bırakın.
Zayıf bir kullanıcı deneyimine (örneğin, ilk karede takılma) yol açabilecek yavaş bir ilk çalıştırmadan kaçınmak için, sürücü başlatmaların çoğunu derleme aşamasında gerçekleştirmelidir. İlk yürütmede başlatma, büyük geçici arabellekleri 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 yapmaları gerekebilir.
Android 10 veya sonraki sürümlerde, aynı hazırlanmış modelle birden fazla yürütmenin hızlı bir şekilde art arda yürütüldüğü durumlarda, istemci, uygulama ve 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. Seri Yürütmeler ve Hızlı Mesaj Kuyrukları .
Hızlı bir şekilde art arda birden çok yürütme performansını 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şturmanız önerilir.
çıktı ş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 çı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
.
Küçük boyutlu bir çıktı arabelleği nedeniyle bir yürütme 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ğu kadar çok boyutlu bilgi rapor etmelidir.
Zamanlama
Android 10'da bir uygulama, derleme işlemi sırasında kullanılacak tek bir cihaz belirtmişse yürütme süresini sorabilir. Ayrıntılar için, MeasureTiming
ve Device Discovery and Assignment bölümüne bakın. Bu durumda, bir istek yürütülürken bir NN HAL 1.2 sürücüsünün yürütme süresini ölçmesi veya UINT64_MAX
(sürenin kullanılamadığını belirtmek için) bildirmesi gerekir. 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:
- Cihazda 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: Cihazdaki yürütme süresini içerir.
Bu süreler, yürütmenin askıya alındığı, örneğin yürütmenin başka görevler tarafından önlendiği veya bir kaynağın kullanılabilir hale gelmesini beklediğ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ünün süreleri UINT64_MAX
olarak bildirmesi gerekir. Sürücüden yürütme süresini ölçmesi istendiğinde bile, bunun yerine cihazda geçirilen süre, sürücüde geçirilen 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 izin verir. Bu, küçük dizi modelleri ve akış kullanım durumları için ek yükü azaltır. Çitli yürütme, sync_fence
için sinyal verebilen veya bekleyebilen diğer bileşenlerle daha verimli birlikte çalışabilirliğe de izin verir. sync_fence
hakkında daha fazla bilgi için bkz. Senkronizasyon çerçevesi .
Çitle çevrili bir yürütmede, çerçeve, beklenecek bir senkronizasyon çitleri vektörüyle hazırlanmış bir model üzerinde ç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ı geri dönmeden önce biterse, 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ütme süresini ölçen aşağıdaki iki zamanlama değeri IFencedExecutionCallback::getExecutionInfo
aracılığıyla sorgulanabilir.
-
timingLaunched
:executeFenced
çağrıldığı andan, executiveFenced'in döndürülenexecuteFenced
işaret ettiği ana kadar geçensyncFence
. -
timingFenced
: Yürütmenin beklediği tüm eşitleme çitlerinin sinyallenmesinden, executiveFenced'in döndürülenexecuteFenced
işaret etmesine kadar geçensyncFence
.
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öreli ö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 kalitesi (QoS) içerir. tamamlanacak Daha fazla bilgi için bkz . Hizmet Kalitesi .
Temizlemek
Bir uygulama, hazırlanmış bir model kullanılarak tamamlandığında, çerçeve @1.3::IPreparedModel
nesnesine olan referansını serbest bırakır. IPreparedModel
nesnesine artık başvurulmadığı zaman, onu oluşturan sürücü hizmetinde otomatik olarak yok edilir. Modele özgü kaynaklar, sürücünün yıkıcı uygulamasında şu anda 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 başvuru tutmamalıdır.
CPU kullanımı
Sürücülerin hesaplamaları ayarlamak için CPU'yu kullanmaları beklenir. Sürücüler, grafik hesaplamaları yapmak için CPU'yu kullanmamalıdır çünkü bu, çerçevenin işi doğru bir şekilde tahsis etme yeteneğini engeller. Sürücü, üstesinden gelemeyeceği parçaları çerçeveye bildirmeli ve gerisini çerçevenin halletmesine izin vermelidir.
Çerçeve, satıcı tanımlı işlemler dışında 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) tanıtılan 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 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ılabilen yardımcı işlevler 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ı işlevler içerir.
VLogging:
VLOG
, yalnızcadebug.nn.vlog
özelliğinde uygun etiket ayarlanmışsa mesajı günlüğe kaydeden Android'inLOG
çevreleyen bir sarmalayıcı makrodur. VLOG'a herhangi bir çağrı yapılmadan önceVLOG
initVLogMask()
çağrılmalıdır.VLOG_IS_ON
makrosu,VLOG
şu anda etkin olup olmadığını kontrol etmek için kullanılabilir ve gerekli değilse karmaşık günlük kodunun atlanmasını sağlar. Özelliğin değeri aşağıdakilerden biri olmalıdır:- Günlük kaydı yapılmayacağını belirten boş bir dize.
- Token
1
veyaall
, tüm günlük kaydının yapılacağını belirtir. - Hangi günlüğün yapılacağını gösteren, boşluklarla, virgüllerle veya iki nokta üst üstelerle 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ü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, birV1_2::Model
compliantWithV1_0
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 yol açarsa (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ı oluşturmaya 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ğrulanmamıştır. Ö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
değerini döndürür.
frameworks/ml/nn/common/include/Tracing.h
dosyası , sistem izleme bilgilerinin Neural Networks koduna eklenmesini 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çimde dökmek için bir yardımcı işlev içerir.
-
graphDump
: Modelin Graphviz (.dot
) biçimindeki bir temsilini belirtilen akışa (sağlanmışsa) veya logcat'e (akış sağlanmamışsa) 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 onları ç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 çalıştığını ve kesinlik gereksinimlerini karşılayan sonuçlar sağladığını doğrular.
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
Sayısallaştırılmış : tek tek (üçte bir olan
mobilenet_quantized
hariç)Boole: tam eşleşme
CTS'nin NNAPI testlerinin bir yolu, NNAPI referans uygulamasıyla her sürücüden yürütme sonuçlarını test etmek ve karşılaştırmak için kullanılan sabit sözde rasgele grafikler oluşturmaktır. NN HAL 1.2 veya üstü 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ı döker. Kesinlik kriterleri hakkında daha fazla ayrıntı için bkz. TestRandomGraph.cpp
ve TestHarness.h
.
Tüylenme testi
Bulanıklık testinin amacı, beklenmedik girdiler gibi faktörler nedeniyle test edilen kodda çökmeler, iddialar, bellek ihlalleri veya genel tanımsız davranışları bulmaktır. NNAPI bulanıklık testi için Android, yeni rasgele girdiler oluşturmak için önceki test durumlarının satır kapsamını kullandıkları için bulanıklaştırmada verimli olan libFuzzer'a dayalı testleri kullanır. Örneğin libFuzzer, yeni kod satırlarında çalışan test durumları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 bulanıklık testi gerçekleştirmek için AOSP'de bulunan libneuralnetworks_driver_fuzzer
test yardımcı programında sürücü kodunuzu içerecek şekilde frameworks/ml/nn/runtime/test/android_fuzzing/DriverFuzzTest.cpp
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 işlemleri doğrudan bir sürücünün işlemiyle 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 uygulamalarla etkileşime girmemesini de sağlamalı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 kıyaslamasıdır. Kıyaslama, gecikmeyi ve doğruluğu değerlendirir ve aynı model ve veri kümeleri için CPU üzerinde çalışan TF Lite kullanan sürücülerin sonuçlarını 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 kıyaslaması, AOSP'de iki projede bulunabilir:
-
platform/test/mlts/benchmark
(benchmark uygulaması) -
platform/test/mlts/models
(modeller ve veri kümeleri)
Modeller ve veri kümeleri
NNAPI kıyaslaması aşağıdaki modelleri ve veri kümelerini kullanır.
- MobileNetV1 float ve u8, farklı boyutlarda nicelenmiş, Açık Görüntüler Veri Kümesi v4'ün küçük bir alt kümesine (1500 görüntü) karşı çalışır.
- MobileNetV2 float ve u8, farklı boyutlarda nicelenmiş, Open Images Dataset v4'ün küçük bir alt kümesine (1500 görüntü) karşı çalışır.
- Metin okuma için 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ıma için LibriSpeech veri setinin küçük bir alt kümesine karşı çalışan LSTM tabanlı akustik model.
Daha fazla bilgi için bkz. platform/test/mlts/models
.
Stres testi
Android Makine Öğrenimi Test Paketi, yoğun kullanım koşulları altında veya istemci davranışlarının önemli olduğu durumlarda sürücülerin 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
başarısızlık nedeni ile başarısız olur ve test takımı bir sonraki teste geçer. - NNAPI istemci kilitlenme tespiti: Testler, istemci çökmelerinden kurtulur ve testler,
CRASH
başarısızlık nedeni ile başarısız olur. - Sürücü çökmesi algılama: Testler, bir NNAPI çağrısında hataya neden olan bir sürücü çökmesini algılayabilir. NNAPI hatasına neden olmayan ve testin başarısız olmasına neden olmayan sürücü işlemlerinde çökmeler olabileceğini unutmayın. Bu tür arızaları kapatmak için, sürücüyle ilgili hatalar veya çökmeler için sistem günlüğünde
tail
komutunun çalıştırılması önerilir. - Mevcut tüm hızlandırıcıların hedeflenmesi: Mevcut tüm sürücülere karşı testler yapılır.
Tüm çarpışma testlerinin aşağıdaki dört olası sonucu vardır:
-
SUCCESS
: Yürütme hatasız tamamlandı. -
FAILURE
: Yürütme başarısız oldu. Genellikle bir model test edilirken meydana gelen ve sürücünün modeli derleyemediği veya yürütemediğine işaret eden bir hatadan kaynaklanır. -
HANG
: Test işlemi 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 kullanma
MLTS'yi kullanmak için:
- İş istasyonunuza bir hedef cihaz bağlayın ve adb yoluyla erişilebilir olduğundan emin olun. Birden fazla cihaz bağlıysa hedef cihaz
ANDROID_SERIAL
ortam değişkenini dışa aktarın. Android üst düzey kaynak dizinine
cd
.source build/envsetup.sh lunch aosp_arm-userdebug # Or aosp_arm64-userdebug if available. ./test/mlts/benchmark/build_and_run_benchmark.sh
Karşılaştırma ç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
.
Yapay 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. İşaretsiz niceleme ile işlemleri destekleyen NN HAL 1.3'e sahip sürücülerin, bu işlemlerin imzalı türevlerini de desteklemesi gerekir. Çoğu sayısallaştırılmış işlemin imzalı ve imzasız sürümlerini çalıştırırken, sürücülerin 128'lik bir uzaklığa kadar aynı sonuçları üretmesi 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. -
IPreparedModel::executeFenced
yöntemini çağırarak hazırlanmış bir model üzerinde beklenecek bir senkronizasyon çit vektörü ile çitle çevrili, eşzamansız bir yürütme başlatmak için çitle çevrili yürütme desteği. Daha fazla bilgi için bkz . - 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ütenIF
veWHILE
işlemlerini ekler. Daha fazla bilgi için bkz. Kontrol akışı . - Geliştirilmiş hizmet kalitesi (QoS), 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. 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ı için destek. Bu, aygıt yerel belleklerinin yürütmeler arasında geçirilmesine izin verir, gereksiz veri kopyalamayı ve aynı sürücü üzerinde ardışık yürütmeler arasında dönüştürmeyi engeller. 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 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 aygıt türü (DeviceType
) ve sürüm bilgilerini almasına izin verir. Bkz. Cihaz Keşfi ve Atama . - Yürütme Eşzamanlı olarak gerçekleştirmek için varsayılan
executeSynchronously
yöntemi ç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 seri yürütme içinMeasureTiming
parametresi, sürücünün yürütme süresini ölçüp ölçmeyeceğini belirtir. SonuçlarTiming
yapısında raporlanır. Bkz. Zamanlama . - Bir veya daha fazla çıktı işleneninin bilinmeyen bir boyuta veya sıralamaya sahip olduğu yürütme desteği. Bkz. Çıktı şekli .
- Satıcı tarafından tanımlanan işlemlerin 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 burst nesnesinin, uygulama ve sürücü işlemleri arasında iletişim kurmak için hızlı mesaj kuyrukları (FMQ'lar) kullanarak gecikmeyi azaltan bir dizi burst yürütmesini kontrol etme yeteneği. Bkz. Seri Yürütmeler ve Hızlı Mesaj Kuyrukları .
- 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 amacıyla derleme yapıtlarının önbelleğe alınması için geliştirilmiş destek. Bkz. Derleme Önbelleğe Alma .
Android 10, aşağıdaki işlenen türlerini ve işlemlerini sunar.
-
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 yönelik güncellemeler sunar. Güncellemeler temel olarak aşağıdakilerle ilgilidir:
- NCHW bellek düzeni için destek
- Softmax ve normalizasyon işlemlerinde rankı 4'ten farklı tensör desteği
- Genişletilmiş kıvrımlar için destek
-
ANEURALNETWORKS_CONCATENATION
karışık nicelemeli 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 referans 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 kullanıma sunuldu ve aşağıdaki önemli değişiklikleri içeriyor.
-
IDevice::prepareModel_1_1
birExecutionPreference
parametresi içerir. Bir sürücü, uygulamanın pil tasarrufu yapmayı tercih ettiğini veya hızlı ardışık aramalarda modeli ç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 16 bit değişken aralık ve/veya kesinlik kullanılarak 32 bitlik değişken hesaplamaların çalıştırılabileceğini belirtebilir.Capabilities
yapısı, sürücünün rahat performansını çerçeveye bildirebilmesi için,relaxedFloat32toFloat16Performance
ek alanına sahiptir.
Android 8.1
İlk Neural Networks HAL (1.0), Android 8.1'de yayınlandı. Daha fazla bilgi için bkz. /neuralnetworks/1.0/
.