Bu sayfada, Neural Networks API (NNAPI) sürücüsünün nasıl uygulanacağına dair genel bilgiler verilmektedir. Daha ayrıntılı bilgi için hardware/interfaces/neuralnetworks
içindeki HAL tanımı dosyalarında bulunan dokümanlara bakın.
Örnek bir sürücü uygulaması frameworks/ml/nn/driver/sample
konumundadır.
Neural Networks API hakkında daha fazla bilgi için Neural Networks API'ye bakın.
Nöral Ağlar HAL
Sinir Ağı (NN) HAL, bir üründeki (ör. telefon veya tablet) grafik işlem birimleri (GPU'lar) ve dijital sinyal işlemcileri (DSP'ler) gibi çeşitli cihazların soyut bir tanımını tanımlar. Bu cihazların sürücüleri NN HAL'e 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österilmiştir.
Şekil 1. Nöral ağ akışı
Başlatma
Çerçeve, başlatma sırasında IDevice::getCapabilities_1_3
kullanarak sürücünün özelliklerini sorgulayarak
@1.3::Capabilities
yapısı tüm veri türlerini içerir ve bir vektör kullanarak rahatlatılmamış performansı temsil eder.
Çerçeve, hesaplamaların mevcut cihazlara nasıl ayrılacağını belirlemek için her bir sürücünün bir işlemi ne kadar hızlı ve enerji verimli bir şekilde gerçekleştirebileceğini anlamaya yönelik özelliklerden yararlanır. Sürücü, bu bilgileri sağlamak için referans iş yüklerinin yürütülmesine dayalı standart performans sayıları 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 üzere NNAPI karşılaştırma uygulamasını kullanın. 32 bit kayan nokta değerlerinin performansını ölçmek için MobileNet v1, v2, asr_float
ve tts_float
modelleri önerilir. 8 bitlik nicelenmiş değerler için de MobileNet v1 ve v2 nicelenmiş modelleri önerilir. Daha fazla bilgi için Android Makine Öğrenimi Test Paketi'ne bakın.
Android 9 ve önceki sürümlerde Capabilities
yapısı yalnızca kayan nokta ve kesirli tenzorlar 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
değerlerini kullanarak daha fazla bilgi sorgulayabilir.
Ürün yeniden başlatılmaları 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, bu sürücüyü kullanan bir uygulama düşük performans veya yanlış davranış sergileyebilir.
Derleme
Çerçeve, bir uygulamadan istek aldığında hangi cihazların kullanılacağını belirler. Android 10'da uygulamalar, çerçevenin seçtiği cihazları keşfedip belirtebilir. Daha fazla bilgi için Cihaz Keşfi ve Atama başlıklı makaleyi inceleyin.
Model derleme zamanında çerçeve, IDevice::getSupportedOperations_1_3
yöntemini çağırarak modeli her aday sürücüye gönderir.
Her sürücü, modelin hangi işlemlerinin desteklendiğini gösteren bir boole dizisi döndürür. Sürücü, çeşitli nedenlerle belirli bir işlemi
destekleyemediğini belirleyebilir. Örnek:
- 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 konvolüsyon işlemlerini destekleyemez.
- Sürücü, büyük grafikleri veya girişleri işlemesini engelleyen bellek kısıtlamalarına sahiptir.
Derleme sırasında, modelin OperandLifeTime
bölümünde açıklandığı üzere giriş, çıkış ve dahili işlem görenlerin boyutları veya sıralaması bilinmeyen olabilir. Daha fazla bilgi için Çıktı şekli bölümüne bakın.
Çerçeve, seçilen her sürücüye IDevice::prepareModel_1_3
çağrısı yaparak modelin bir alt kümesini yürütmeye hazırlanması talimatını verir.
Ardından her sürücü kendi alt kümesini derleyebilir. Ö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 cihaz belleği parçaları gibi kaynaklar atanmamalıdır.
Sürücü başarılı olduğunda bir @1.3::IPreparedModel
işleyici döndürür. Sürücü, model alt kümesini hazırlarken bir hata kodu döndürürse çerçeve, modelin tamamını CPU'da çalıştırır.
Sürücü, bir uygulama başlatıldığında derleme için kullanılan süreyi azaltmak amacıyla derleme yapılarını önbelleğe alabilir. Daha fazla bilgi için Derleme Önbelleğe Alma bölümüne bakın.
Uygulama
Bir uygulama, çerçeveden bir isteği yürütmesini istediğinde çerçeve, hazır 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.
İstekler, execute_1_3
yöntemi, executeFenced
yöntemi (Çitli yürütme bölümüne bakın) kullanılarak veya grup yürütme kullanılarak da eşzamansız olarak yürütülebilir.
Kontrol, uygulama sürecine yalnızca yürütme tamamlandıktan sonra geri döndüğünden, eşzamanlı yürütme çağrıları eşzamansız çağrılara kıyasla performansı iyileştirir ve iş parçacığı ek yükünü azaltır. Yani sürücü, uygulama işlemine bir yürütmenin tamamlandığını bildirmek için ayrı bir mekanizmaya ihtiyaç duymaz.
Eşzamansız execute_1_3
yönteminde, kontrol yürütme başladıktan sonra uygulama işlemine geri döner ve sürücü, yürütme tamamlandığında @1.3::IExecutionCallback
kullanarak çerçeveyi bilgilendirmelidir.
execute yöntemine iletilen Request
parametresi, yürütme için kullanılan giriş ve çıkış operatörlerini listeler. Operand verilerini depolayan bellek, ilk boyutun en yavaş şekilde iterasyon yaptığı satır öncelikli sırayı kullanmalıdır ve hiçbir satırın sonunda dolgu olmamalıdır. İşlem gören türleri hakkında daha fazla bilgi için İşlenenler bölümüne bakın.
NN HAL 1.2 veya sonraki sürüm sürücüleri 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 çıkışı veya dahili operatörleri bir veya daha fazla bilinmeyen boyuta ya da bilinmeyen sıralamaya sahip olabilir. En az bir çıkış işleneninin boyutu veya sıralaması bilinmeyen olduğunda, sürücü dinamik olarak boyutlandırılmış çıkış bilgileri döndürmelidir.
NN HAL 1.1 veya daha düşük sürümlere sahip sürücüler için, yalnızca bir istek tamamlandığında 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 operatörler bir veya daha fazla bilinmeyen boyuta sahip olabilir ancak belirtilen bir sıralamaya sahip olmalıdır.
Birden fazla sürücüye yayılan kullanıcı istekleri için çerçeve, ara belleği ayırmaktan ve çağrıları her bir sürücüye sıralamaktan sorumludur.
Aynı @1.3::IPreparedModel
üzerinde paralel olarak birden fazla istek başlatılabilir.
Sürücü, istekleri paralel olarak yürütebilir veya yürütmeleri serileştirebilir.
Çerçeve, sürücüden birden fazla hazır model tutmasını isteyebilir. Örneğin, m1
modelini hazırlayın, m2
'u 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
'i yürütün, m1
'ü (Temizleme bölümünde açıklandığı şekilde) yayınlayın ve m2
'u yayınlayın.
Kötü kullanıcı deneyimine neden olabilecek yavaş bir ilk yürütme (örneğin, ilk kare takılması) önlemek için sürücü, çoğu başlatma işlemini derleme aşamasında gerçekleştirmelidir. İlk çalıştırma sırasında başlatma işlemi, erken başlatıldığında sistem sağlığını olumsuz etkileyen işlemlerle (ör. büyük geçici arabelleklerin ayrılması veya cihazın saat hızının artırılması) sınırlı olmalıdır. Yalnızca sınırlı sayıda eşzamanlı model hazırlayabilen sürücülerin ilk kullanıma hazırlama işlemini ilk çalıştırma sırasında yapması gerekebilir.
Android 10 veya sonraki sürümlerde, aynı hazırlanmış modele sahip birden fazla yürütmenin hızlı bir şekilde art arda yürütüldüğü durumlarda istemci, uygulama ile 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 Seri Yürütme İşlemleri ve Hızlı Mesaj Sıraları sayfasına göz atın.
Hızlı bir şekilde arka arkaya birden fazla yürütmenin performansını artırmak için sürücü, geçici arabellekleri tutabilir veya saat hızlarını artırabilir. Belirli bir süre sonunda yeni istek oluşturulmazsa kaynakları serbest bırakmak için bir güvenlik zamanlayıcısı iş parçacığı oluşturmanız önerilir.
Çıkış şekli
Bir veya daha fazla çıkış operatörünün tüm boyutlarının belirtilmediği isteklerde, sürücü, yürütme işleminden sonra her çıkış operatörü için boyut bilgilerini içeren bir çıkış şekilleri listesi sağlamalıdır. Boyutlar hakkında daha fazla bilgi için OutputShape
konusuna bakın.
Yürütme işlemi, çıktı arabelleğinin küçük olması nedeniyle başarısız olursa sürücü, çıkış şekilleri listesinde hangi çıkış işlenenlerinin tampon boyutunun yetersiz olduğunu belirtmeli ve bilinmeyen boyutlar için sıfır kullanarak mümkün olduğunca çok boyut bilgisi rapor etmelidir.
Zamanlama
Android 10'da, derleme işlemi sırasında kullanılacak tek bir cihazı belirtmişse uygulama yürütme süresini isteyebilir. Ayrıntılar için MeasureTiming
ve Cihaz Keşfi ve Atama başlıklı makaleyi inceleyin.
Bu durumda, NN HAL 1.2 sürücüsü bir isteği yürütürken yürütme süresini ölçmeli veya UINT64_MAX
değerini (sürenin kullanılamadığını belirtmek için) bildirmelidir. Sürücü, yürütme süresinin ölçülmesinden kaynaklanan performans cezalarını en aza indirmelidir.
Sürücü, Timing
yapısında mikrosaniye cinsinden aşağıdaki süreleri bildirir:
- Cihazdaki yürütme süresi: Ana işlemcide ç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ığı zamanı içermelidir (örneğin, yürütme başka görevler tarafından geçici olarak engellendiğinde veya bir kaynağın kullanılabilir olmasını beklerken).
Sürücünün yürütme süresini ölçmesi istenmediğinde veya 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 istense bile, bunun yerine cihazda, sürücüde geçirilen süre veya her ikisi için UINT64_MAX
değerini 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, cihazdaki süreye eşit veya bu süreyi aşmalıdır.
Özel yürütme
Android 11'de NNAPI, yürütmelerin sync_fence
tutma yeri listesini beklemesine ve isteğe bağlı olarak yürütme tamamlandığında sinyal verilen bir sync_fence
nesnesi döndürmesine olanak tanır. Bu sayede küçük sıra modelleri ve akış kullanım alanları için ek maliyet azaltılır. Çitli yürütme, sync_fence
sinyali gönderebilen veya bekleyebilen diğer bileşenlerle daha verimli birlikte çalışabilirlik sağlar. sync_fence
hakkında daha fazla bilgi için Senkronizasyon çerçevesi bölümüne bakın.
Çitli yürütmede çerçeve, beklemesi gereken bir senkronizasyon çitleri vektörü içeren hazırlanmış bir modelde çitli, eşzamansız yürütme başlatmak için IPreparedModel::executeFenced
yöntemini çağırır. Asenkron görev, çağrı döndürülmeden önce tamamlanırsa sync_fence
için boş bir herkese açık kullanıcı adı döndürülebilir. Çerçevenin hata durumu ve süre bilgilerini sorgulamasına olanak tanımak 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ıldıktanexecuteFenced
döndürülensyncFence
değerini işaret edene kadar geçen süre.timingFenced
:executeFenced
, döndürülensyncFence
öğesini bildirdiğinde, yürütmenin beklediği tüm senkronizasyon engellerinin işaretlendiği süre.
Kontrol akışı
NNAPI, Android 11 veya sonraki sürümleri çalıştıran cihazlar için IF
ve WHILE
adlı iki kontrol akışı işlemi içerir. Bu işlemler, diğer modelleri bağımsız değişken olarak alıp koşullu olarak (IF
) veya tekrar tekrar (WHILE
) yürütür. Bunun nasıl uygulanacağı hakkında daha fazla bilgi için Kontrol akışı bölümüne bakın.
Hizmet kalitesi
Android 11'de NNAPI, bir uygulamanın modellerinin göreceli önceliklerini, bir modelin hazırlanması için beklenen maksimum süreyi ve bir yürütmenin tamamlanması için beklenen maksimum süreyi belirtmesine olanak tanıyarak iyileştirilmiş hizmet kalitesi (HK) sunar. Daha fazla bilgi için Hizmet Kalitesi bölümüne bakın.
Temizle
Bir uygulama, hazırlanan bir modeli kullanarak tamamladığında çerçeve, çerçevenin @1.3::IPreparedModel
nesnesine referansını serbest bırakır. IPreparedModel
nesnesine artık başvuruda bulunulmadığında bu nesne, nesneyi oluşturan sürücü hizmetinde otomatik olarak kaldırılır. Modele özgü kaynaklar, şu anda sürücünün yıkıcıyı uygularken geri çekilebilir. Sürücü hizmeti, IPreparedModel
nesnesinin artık istemciye ihtiyaç duymadığında otomatik olarak kaldırılmasını 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şleri doğru şekilde paylaştırmasını engeller. Sürücü, işleyemediği bölümleri çerçeveye bildirmeli ve gerisini çerçeveye bırakmalıdır.
Çerçeve, tedarikçi firma tarafından tanımlanan işlemler hariç tüm NNAPI işlemleri için bir CPU uygulaması sağlar. Daha fazla bilgi için Tedarikçi Firma Uzantıları bölümüne bakın.
Android 10'da (API düzeyi 29) sunulan işlemler, yalnızca CTS ve VTS testlerinin doğru olduğunu onaylamak için bir referans CPU uygulaması içerir. NNAPI CPU uygulaması yerine, mobil makine öğrenimi çerçevelerine dahil edilen optimize edilmiş uygulamalar tercih edilir.
Yardımcı işlevler
NNAPI kod tabanı, sürücü hizmetleri tarafından kullanılabilecek yardımcı işlevler içerir.
frameworks/ml/nn/common/include/Utils.h
dosyası, günlük kaydı ve farklı NN HAL sürümleri arasında dönüştürme için kullanılanlar gibi çeşitli yardımcı program işlevleri içerir.
Video günlüğü:
VLOG
, Android'inLOG
özelliğinin etrafında bir sarmalayıcı makrosudur ve yalnızcadebug.nn.vlog
mülkünde uygun etiket ayarlanmışsa mesajı günlüğe kaydeder.initVLogMask()
,VLOG
çağrılarından önce çağrılmalıdır.VLOG_IS_ON
makrosu,VLOG
öğesinin etkin olup olmadığını kontrol etmek için kullanılabilir. Böylece, gerekli olmayan karmaşık günlük kaydı kodunun atlanması sağlanır. Özelliğin değeri aşağıdakilerden biri olmalıdır:- Hiçbir günlük kaydı yapılmayacağını belirten boş bir dize.
- Tüm günlük kayıtlarının gerçekleştirileceğini belirten
1
veyaall
jetonu. - Hangi günlük kaydının yapılacağını belirten, boşluk, virgül veya iki nokta işaretiyle ayrılmış etiketlerin listesi. Etiketler
compilation
,cpuexe
,driver
,execution
,manager
vemodel
şeklindedir.
compliantWithV1_*
: Bir NN HAL nesnesi bilgi kaybetmeden farklı bir HAL sürümünün aynı türüne dönüştürülebiliyorsatrue
değerini döndürür. Örneğin,V1_2::Model
üzerindecompliantWithV1_0
çağrısı, model NN HAL 1.1 veya NN HAL 1.2'de sunulan işlem türlerini içeriyorsafalse
değerini döndürür.convertToV1_*
: NN HAL nesnesini bir sürümden diğerine dönüştürür. Dönüşüm bilgi kaybına neden olursa (yani türün yeni sürümü değeri tam olarak gösteremiyorsa) bir uyarı kaydedilir.Özellikler:
nonExtensionOperandPerformance
veupdate
işlevleri,Capabilities::operandPerformance
alanının oluşturulmasına yardımcı olmak için kullanılabilir.Şu türlerdeki mülkleri sorgulamak:
isExtensionOperandType
,isExtensionOperationType
,nonExtensionSizeOfData
,nonExtensionOperandSizeOfData
,nonExtensionOperandTypeIsScalar
,tensorHasUnspecifiedDimensions
.
frameworks/ml/nn/common/include/ValidateHal.h
dosyası, bir NN HAL nesnesinin HAL sürümünün spesifikasyonuna göre geçerli olup olmadığını doğrulamak için yardımcı işlevler içerir.
validate*
: NN HAL nesnesi, HAL sürümünün spesifikasyonuna 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 operand dizine referans veren bir işlem veya söz konusu HAL sürümünde desteklenmeyen bir işlem içeriyorsavalidateModel
false
döndürür.
frameworks/ml/nn/common/include/Tracing.h
dosyası, systracing bilgilerini yapay zeka ağı koduna eklemeyi kolaylaştıran makrolar içerir.
Ö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 Model
içeriğini grafik biçimde dökmek için bir yardımcı program işlevi içerir.
graphDump
: Modelin bir gösterimini Graphviz (.dot
) biçiminde 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çevesine dahil edilen VTS ve CTS testlerini kullanın. VTS, sürücülerinizi doğrudan (çerçeve kullanmadan) çalıştırırken CTS, sürücülerinizi çerçeve üzerinden dolaylı olarak uygular. Bu araçlar tüm API yöntemlerini test edip sürücüler tarafından desteklenen tüm işlemlerin doğru şekilde çalıştığını ve hassasiyet gereksinimlerini karşılayan sonuçlar sağladığını doğrular.
NNAPI için CTS ve VTS'deki hassasiyet koşulları aşağıdaki gibidir:
Kayan nokta: abs(beklenen - gerçek) <= atol + rtol * abs(beklenen); burada:
- fp32 için atol = 1e-5f, rtol = 5.0f * 1.1920928955078125e-7
- fp16 için atol = rtol = 5.0f * 0.0009765625f
Nicel: tek tek (üçlü
mobilenet_quantized
hariç)Boole: tam eşleme
CTS'nin NNAPI'yi test etme yöntemlerinden biri, her sürücüden gelen 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 sonraki sürümleri kullanan sürücülerde, sonuçlar hassasiyet ölçütlerini karşılamıyorsa CTS bir hata bildirir ve hata ayıklama için başarısız modelin spesifikasyon dosyasını /data/local/tmp
altına aktarır.
Hassasiyet ölçütleri hakkında daha fazla bilgi için TestRandomGraph.cpp
ve TestHarness.h
bölümlerine bakın.
Fuzz testi
Boşluk testi, beklenmedik girişler gibi faktörler nedeniyle test edilen kodda kilitlenmeler, iddialar, bellek ihlalleri veya genel olarak tanımlanmamış davranışları bulmak için yapılır. Android, NNAPI fuzz testi için libFuzzer'a dayalı testler kullanır. Bu testler, yeni rastgele girişler oluşturmak için önceki test durumlarının satır kapsamını kullandığından fuzzing işleminde etkilidir. Örneğin, libFuzzer yeni kod satırlarında çalıştırılan test durumlarını tercih eder. Bu, testlerin sorunlu kodu bulmak için harcadığı süreyi önemli ölçüde azaltır.
Sürücü uygulamanızı doğrulamak için fuzz testi yapmak istiyorsanız AOSP'de bulunan libneuralnetworks_driver_fuzzer
test yardımcı programındaki frameworks/ml/nn/runtime/test/android_fuzzing/DriverFuzzTest.cpp
öğesini 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 işlemleri doğrudan sürücünün işlemiyle iletişim kurduğundan sürücüler, aldıkları çağrıların bağımsız değişkenlerini doğrulamalıdır. Bu doğrulama, VTS tarafından doğrulanır. Doğrulama kodu frameworks/ml/nn/common/include/ValidateHal.h
dilindedir.
Sürücüler, aynı cihazı kullanan uygulamaların diğer uygulamalara müdahale etmediğinden de emin olmalıdır.
Android Makine Öğrenimi Test Paketi
Android Machine Learning Test Suite (MLTS), tedarikçi cihazlarda gerçek modellerin doğruluğunu doğrulamak için CTS ve VTS'ye dahil edilen bir NNAPI karşılaştırmasıdır. Karşılaştırma, gecikme ve doğruluğu değerlendirir ve aynı model ve veri kümeleri için CPU üzerinde çalışan TF Lite'ı kullanarak sürücülerin sonuçlarını sonuçlarla karşılaştırır. Bu, sürücünün doğruluğunun CPU referans uygulamasından daha düşük olmamasını sağlar.
Android platform geliştiricileri, sürücülerin gecikmesini ve doğruluğunu değerlendirmek için MLTS'yi de kullanır.
NNAPI karşılaştırması, AOSP'deki iki projede bulunabilir:
platform/test/mlts/benchmark
(karşılaştırma 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 ölçülmüş MobileNetV1 float ve u8, Open Images Dataset v4'ün küçük bir alt grubunda (1.500 görüntü) çalıştırılır.
- Farklı boyutlarda ölçülmüş MobileNetV2 float ve u8, Open Images Dataset v4'ün küçük bir alt kümesinde (1.500 görüntü) çalıştırılır.
- Metin okuma için uzun süreli kısa süreli bellek (LSTM) tabanlı akustik model, CMU Arctic grubunun küçük bir alt kümesi üzerinde çalışır.
- LibriSpeech veri kümesinin küçük bir alt kümesine karşı çalıştırılan, otomatik konuşma tanıma için LSTM tabanlı akustik model.
Daha fazla bilgi için platform/test/mlts/models
başlıklı makaleyi inceleyin.
Stres testi
Android Makine Öğrenimi Test Paketi, yoğun kullanım koşullarında veya istemci davranışının köşe durumlarında sürücülerin direncini doğrulamak için bir dizi kilitlenme testi içerir.
Tüm kilitlenme testleri aşağıdaki özellikleri sunar:
- Askıya alma algılama: NNAPI istemcisi test sırasında kilitlenirse test,
HANG
hata nedeni ile başarısız olur ve test paketi bir sonraki teste geçer. - NNAPI istemci kilitlenme algılama: Testler, istemci kilitlenmelerinden kurtulur ve
CRASH
hata nedeni ile başarısız olur. - Sürücü kazası algılama: Testler, NNAPI çağrısında hataya neden olan sürücü kazasını algılayabilir. Sürücü işlemlerinde, NNAPI hatasına neden olmayan ve testin başarısız olmasına yol açmayan kilitlenmeler olabileceğini unutmayın. Bu tür hataları kapsayacak şekilde, sürücüyle ilgili hatalar veya kilitlenmeler için sistem günlüğünde
tail
komutunu çalıştırmanız önerilir. - Kullanılabilir tüm hızlandırıcıların hedeflenmesi: Testler, mevcut tüm sürücülerle çalıştırılır.
Tüm kilitlenme testlerinin aşağıdaki dört olası sonucu vardır:
SUCCESS
: Yürütme, hata olmadan tamamlandı.FAILURE
: Yürütme başarısız oldu. Genellikle bir model test edilirken ortaya çıkan bir hatadan kaynaklanır ve sürücünün modeli derleyemediğini veya yürütemediğini gösterir.HANG
: Test işlemi yanıt vermemeye başladı.CRASH
: Test işlemi kilitlendi.
Stres testi hakkında daha fazla bilgi ve kilitlenme testlerinin tam listesi için platform/test/mlts/benchmark/README.txt
sayfasını inceleyin.
MLTS'yi kullan
MLTS'yi kullanmak için:
- İş istasyonunuza bir hedef cihaz bağlayın ve adb üzerinden erişilebildiğinden emin olun.
Birden fazla cihaz bağlıysa hedef cihaz
ANDROID_SERIAL
ortam değişkenini dışa aktarın. cd
öğesini Android'in üst düzey kaynak dizinine ekleyin.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ıştırmasının sonunda, sonuçlar bir HTML sayfası olarak sunulur ve
xdg-open
bölümüne aktarılır.
Daha fazla bilgi için platform/test/mlts/benchmark/README.txt
başlıklı makaleyi inceleyin.
Nöral Ağlar HAL sürümleri
Bu bölümde, Android ve Neural Networks HAL sürümlerinde yapılan değişiklikler açıklanmaktadır.
Android 11
Android 11, aşağıdaki önemli değişiklikleri içeren NN HAL 1.3'ü kullanıma sunar.
- NNAPI'de imzalı 8 bit kesme desteği.
TENSOR_QUANT8_ASYMM_SIGNED
işlenen türünü ekler. İmzasız miktarlandırma içeren işlemleri destekleyen NN HAL 1.3'e sahip sürücüler, bu işlemlerin imzalı varyantlarını da desteklemelidir. Çoğu kesikli işlemin imzalı ve imzasız sürümleri çalıştırıldığında sürücüler, 128'e kadar ofsetle aynı sonuçları üretmelidir. Bu şartın beş istisnası vardır:CAST
,HASHTABLE_LOOKUP
,LSH_PROJECTION
,PAD_V2
veQUANTIZED_16BIT_LSTM
.QUANTIZED_16BIT_LSTM
işlemi, işaretli operatörleri desteklemez. Diğer dört işlem, işaretli kesme işlemini destekler ancak sonuçların aynı olmasını gerektirmez. - Çerçevenin,
IPreparedModel::executeFenced
yöntemini çağırarak hazır bir model üzerinde özel, eşzamansız bir yürütme işlemi başlatmasını ve beklenmesi gereken senkronizasyon çitlerinin vektörünü uygulaması için destek. Daha fazla bilgi için Çitli yürütme bölümüne bakın. - Kontrol akışı desteği. Diğer modelleri bağımsız değişken olarak alıp koşullu olarak (
IF
) veya tekrarlı olarak (WHILE
) yürütenIF
veWHILE
işlemlerini ekler. Daha fazla bilgi için Kontrol akışı bölümüne bakın. - Uygulamalar, modellerinin göreceli önceliklerini, bir modelin hazırlanması için beklenen maksimum süreyi ve bir yürütmenin tamamlanması için beklenen maksimum süreyi belirtebildiğinden daha iyi hizmet kalitesi (HK). Daha fazla bilgi için Hizmet Kalitesi başlıklı makaleyi inceleyin.
- Sürücü tarafından yönetilen arabellekler için ayırıcı arayüzleri sağlayan bellek alanları desteği. Bu sayede, cihazın yerel bellekleri yürütmeler arasında aktarılabilir. Böylece aynı sürücüde art arda yapılan yürütmeler arasında gereksiz veri kopyalama ve dönüştürme işlemleri engellenir. Daha fazla bilgi için Bellek alanları başlıklı makaleyi inceleyin.
Android 10
Android 10, aşağıdaki önemli değişiklikleri içeren NN HAL 1.2'yi kullanıma sunar.
Capabilities
yapı, skaler veri türleri dahil tüm veri türlerini içerir ve adlandırılmış alanlar yerine bir vektör kullanarak rahatlatılmamış performansı temsil eder.getVersionString
vegetType
yöntemleri, çerçevenin cihaz türünü (DeviceType
) ve sürüm bilgilerini almasına olanak tanır. Cihaz Keşfi ve Atama başlıklı makaleyi inceleyin.executeSynchronously
yöntemi, eşzamanlı olarak bir yürütme gerçekleştirmek için varsayılan olarak çağrılır.execute_1_2
yöntemi, çerçeveye eşzamansız olarak yürütme yapmasını söyler. Yürütme bölümünü inceleyin.executeSynchronously
,execute_1_2
ve toplu 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. Zamanlama bölümüne bakın.- Bir veya daha fazla çıkış operatörünün bilinmeyen bir boyuta veya rütbeye sahip olduğu yürütmeler için destek. Çıktı şekli başlıklı makaleyi inceleyin.
- Tedarikçi firma tarafından tanımlanan işlemler ve veri türlerinden oluşan koleksiyonlar olan tedarikçi firma uzantıları için destek. Sürücü, desteklenen uzantıları
IDevice::getSupportedExtensions
yöntemiyle bildirir. Tedarikçi Uzantıları başlıklı makaleyi inceleyin. - Seri işlem nesnesinin, uygulama ve sürücü işlemleri arasında iletişim kurarak gecikmeyi azaltmak için hızlı mesaj sıraları (FMQ'lar) kullanarak bir dizi seri işlem yürütmeyi kontrol etme becerisi. Seri Yürütme İşlemleri ve Hızlı Mesaj Sıraları bölümüne göz atın.
- Sürücünün verileri kopyalamadan yürütme işlemleri gerçekleştirebilmesi için ADonanımBuffer desteği sunulur. AHardwareBuffer konusuna bakın.
- Bir uygulama başlatıldığında derleme için harcanan süreyi azaltmak amacıyla derleme yapılarının önbelleğe alınmasıyla ilgili destek iyileştirildi. Derleme Önbelleğe Alma bölümünü inceleyin.
Android 10, aşağıdaki operatör türlerini ve işlemlerini kullanıma 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ğunda güncellemeler sunar. Güncellemeler temel olarak aşağıdakilerle ilgilidir:
- NCHW bellek düzeni desteği
- Softmax ve normalleştirme işlemlerinde 4'ten farklı rütbeye sahip tenzorlar için destek
- Uzatılmış kıvrımlar için destek
ANEURALNETWORKS_CONCATENATION
bölgesinde karışık miktarlı girişler için destek
Aşağıdaki listede, Android 10'da değiştirilen işlemler gösterilmektedir. Değişikliklerin tüm ayrıntıları için NNAPI referans belgelerindeki 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 sunulmuştur ve aşağıdaki önemli değişiklikleri içerir.
IDevice::prepareModel_1_1
, birExecutionPreference
parametresi içerir. Sürücü, uygulamanın pil tasarrufu yapmayı tercih ettiğini veya arka arkaya kısa çağrılarda modeli çalıştıracağını bilerek hazırlığı 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
değerinitrue
olarak ayarlayarak 32 bit kayan hesaplamaların 16 bit kayan aralık ve/veya hassasiyet kullanılarak çalıştırılabileceğini belirtebilir.Capabilities
yapısındarelaxedFloat32toFloat16Performance
ek alanı bulunur. Böylece sürücü, esnek performansını çerçeveye bildirebilir.
Android 8.1
İlk Nöral Ağ HAL'si (1.0) Android 8.1'de kullanıma sunulmuştur. Daha fazla bilgi için /neuralnetworks/1.0/
konusuna bakın.