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ülen
executeFencedişaret ettiği ana kadar geçen
syncFence.
-
timingFenced: Yürütmenin beklediği tüm eşitleme çitlerinin sinyallenmesinden, executiveFenced'in döndürülen
executeFencedişaret etmesine kadar geçen
syncFence.
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ızca
debug.nn.vlogözelliğinde uygun etiket ayarlanmışsa mesajı günlüğe kaydeden Android'in
LOGçevreleyen bir sarmalayıcı makrodur. VLOG'a herhangi bir çağrı yapılmadan önce
VLOG
initVLogMask()çağrılmalıdır.
VLOG_IS_ONmakrosu,
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
1veya
all, 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,
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
compliantWithV1_0
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 yol açarsa (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ı 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,
truedeğ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
falsedeğ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_quantizedhariç)
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
HANGbaş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,
CRASHbaş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
tailkomutunun ç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_SERIALortam 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-openiletilir.
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_SIGNEDiş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_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.
-
IPreparedModel::executeFencedyö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üten
IFve
WHILEiş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.
-
Capabilitiesyapı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.
-
getVersionStringve
getTypeyö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
executeSynchronouslyyöntemi çağrılır.
execute_1_2yöntemi, çerçeveye eşzamansız olarak bir yürütme gerçekleştirmesini söyler. Bkz. Yürütme .
-
executeSynchronously,
execute_1_2ve seri yürütme için
MeasureTimingparametresi, sürücünün yürütme süresini ölçüp ölçmeyeceğini belirtir. Sonuçlar
Timingyapı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::getSupportedExtensionsyö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_CONCATENATIONkarışı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_1bir
ExecutionPreferenceparametresi 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
trueolarak 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.
Capabilitiesyapısı, sürücünün rahat performansını çerçeveye bildirebilmesi için,
relaxedFloat32toFloat16Performanceek 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/ .