Bu sayfada, Neural Networks API (NNAPI) sürücüsünün nasıl uygulanacağına dair genel bir bakış sunulmaktadır. Daha fazla 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
içinde yer alır.
Neural Networks API hakkında daha fazla bilgi için Neural Networks API başlıklı makaleyi inceleyin.
Nöral Ağlar Donanım Soyutlama Katmanı
Neural Networks (NN) HAL, bir üründe (ör. telefon veya tablet) bulunan grafik işleme birimleri (GPU'lar) ve dijital sinyal işlemcileri (DSP'ler) gibi çeşitli cihazların soyutlamasını tanımlar. Bu cihazların sürücüleri NN HAL'ye 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.
1. şekil. Nöral ağlar akışı
Başlatma
Çerçeve, başlatma sırasında IDevice::getCapabilities_1_3
kullanarak sürücünün özelliklerini sorgular.
@1.3::Capabilities
yapısı tüm veri türlerini içerir ve vektör kullanarak gevşetilmemiş performansı temsil eder.
Çerçeve, kullanılabilir cihazlara hesaplamaların nasıl dağıtılacağını belirlemek için her sürücünün bir yürütmeyi ne kadar hızlı ve enerji açısından ne kadar verimli bir şekilde gerçekleştirebileceğini anlamak üzere yetenekleri kullanır. Bu bilgileri sağlamak için sürücünün, referans iş yüklerinin yürütülmesine dayalı olarak standartlaştırılmış performans numaraları sağlaması gerekir.
Sürücünün IDevice::getCapabilities_1_3
yanıtında döndürdüğü değerleri belirlemek için NNAPI karşılaştırma uygulamasını kullanarak ilgili veri türlerinin performansını ölçün. MobileNet v1 ve v2, asr_float
ve tts_float
modelleri, 32 bit kayan nokta değerlerinin performansını ölçmek için önerilir. MobileNet v1 ve v2 nicelenmiş modelleri ise 8 bit nicelenmiş değerler için önerilir. Daha fazla bilgi için Android Machine Learning Test Suite başlıklı makaleyi inceleyin.
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şlemi sırasında çerçeve, IDevice::getType
, IDevice::getVersionString
, IDevice:getSupportedExtensions
ve IDevice::getNumberOfCacheFilesNeeded
kullanarak daha fazla bilgi sorgulayabilir.
Çerçeve, ürün yeniden başlatmaları arasında 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 performans düşüşü veya yanlış davranış gösterebilir.
Derleme
Çerçeve, bir uygulamadan istek aldığında hangi cihazların kullanılacağını belirler. Android 10'da uygulamalar, çerçeve tarafından seçilen cihazları keşfedebilir ve belirtebilir. Daha fazla bilgi için Cihaz Bulma ve Atama başlıklı makaleyi inceleyin.
Çerçeve, model derleme zamanında IDevice::getSupportedOperations_1_3
işlevini çağırarak modeli her aday sürücüye gönderir.
Her sürücü, modelin hangi işlemlerinin desteklendiğini belirten bir boolean dizisi döndürür. Bir sürücü, belirli bir işlemi destekleyemeyeceğini çeşitli nedenlerle 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 konvolüsyon işlemlerini desteklemeyebilir.
- Sürücü, büyük grafikleri veya girişleri işlemesini engelleyen bellek kısıtlamalarına sahiptir.
Derleme sırasında, OperandLifeTime
bölümünde açıklandığı gibi modelin giriş, çıkış ve dahili işlenenleri bilinmeyen boyutlara veya sıralamaya sahip olabilir. Daha fazla bilgi için Çıkış şekli başlıklı makaleyi inceleyin.
Çerçeve, seçilen her sürücüye IDevice::prepareModel_1_3
işlevini çağırarak modelin bir alt kümesini yürütmeye hazırlanmasını bildirir.
Ardından her sürücü, 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 cihaz belleğinin büyük parçaları gibi kaynaklar atanmamalıdır.
Başarılı olursa sürücü bir @1.3::IPreparedModel
işleyici döndürür. Sürücü, modelin alt kümesini hazırlarken bir hata kodu döndürürse çerçeve, modelin tamamını CPU üzerinde çalıştırır.
Bir uygulama başlatıldığında derleme için kullanılan süreyi azaltmak amacıyla sürücü, derleme yapılarını önbelleğe alabilir. Daha fazla bilgi için Derleme önbelleğe alma başlıklı makaleyi inceleyin.
Uygulama
Bir uygulama, çerçeveden istek 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.
İstekler, execute_1_3
yöntemi, executeFenced
yöntemi (Fenced execution bölümüne bakın) kullanılarak eşzamansız olarak da yürütülebilir veya burst execution kullanılarak yürütülebilir.
Eşzamanlı yürütme çağrıları, yürütme tamamlandıktan sonra kontrol yalnızca uygulama sürecine döndürüldüğünden performansı artırır ve iş parçacığı oluşturma ek yükünü eşzamansız çağrılara kıyasla azaltır. Bu, sürücünün, uygulamanın yürütme işleminin tamamlandığını bildirmesi için ayrı bir mekanizmaya ihtiyaç duymadığı anlamına gelir.
Asenkron 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 @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 verileri depolayan bellek, satır öncelikli sırayı kullanmalı, ilk boyut en yavaş şekilde yinelenmeli ve satırların sonunda dolgu olmamalıdır. İşlenen türleri hakkında daha fazla bilgi için İşlenenler başlıklı makaleyi inceleyin.
NN HAL 1.2 veya daha yeni sürücülerde, 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 işlenenleri bir veya daha fazla bilinmeyen boyuta ya da bilinmeyen sıralamaya sahip olabilir. En az bir çıkış işleneni bilinmeyen bir boyuta veya sıralamaya sahip 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ücülerde, 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 belirtilmiş bir sıralamaya sahip olmalıdır.
Birden fazla sürücüyü kapsayan kullanıcı istekleri için çerçeve, ara belleği ayırmaktan ve her sürücüye yapılan çağrıları sıralamaktan sorumludur.
Aynı @1.3::IPreparedModel
üzerinde birden fazla istek paralel olarak 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ırlanmış modeli saklamasını isteyebilir. Örneğin, m1
modelini hazırla, m2
modelini hazırla, m1
üzerinde r1
isteğini yürüt, m2
üzerinde r2
isteğini yürüt, m1
üzerinde r3
isteğini yürüt, m2
üzerinde r4
isteğini yürüt, m1
modelini yayınla (Temizleme bölümünde açıklanmıştır) ve m2
modelini yayınla.
Kötü bir kullanıcı deneyimine (örneğin, ilk karede titreme) neden olabilecek yavaş bir ilk yürütmeyi önlemek için sürücü, çoğu başlatma işlemini derleme aşamasında gerçekleştirmelidir. İlk çalıştırmadaki başlatma işlemi, erken yapıldığında sistem sağlığını olumsuz etkileyen işlemlerle (ör. büyük geçici arabellekler ayırma veya cihazın saat hızını artırma) sınırlı olmalıdır. Aynı anda yalnızca sınırlı sayıda model hazırlayabilen sürücülerin başlatma işlemini ilk yürütmede yapması gerekebilir.
Android 10 veya sonraki sürümlerde, aynı hazırlanmış modelle birden fazla yürütme işleminin hızlı bir şekilde art arda gerçekleştirildiği durumlarda istemci, uygulama ve sürücü süreçleri arasında iletişim kurmak için bir yürütme patlaması nesnesi kullanmayı tercih edebilir. Daha fazla bilgi için Ani Yürütmeler ve Hızlı Mesaj Kuyrukları bölümüne bakın.
Hızlı bir şekilde art arda gerçekleştirilen birden fazla yürütme işleminde performansı artırmak için sürücü, geçici arabellekleri tutabilir veya saat hızlarını artırabilir. Belirli bir süre sonra yeni istek oluşturulmazsa kaynakları serbest bırakmak için bir watchdog iş parçacığı oluşturmanız önerilir.
Çıkış şekli
Bir veya daha fazla çıkış işleneninde belirtilen tüm boyutların olmadığı isteklerde, sürücü yürütme işleminden sonra her çıkış işleneni için boyut bilgilerini içeren bir çıkış şekli listesi sağlamalıdır. Boyutlar hakkında daha fazla bilgi için OutputShape
başlıklı makaleyi inceleyin.
Yetersiz boyutlu bir çıkış arabelleği nedeniyle yürütme başarısız olursa sürücü, çıkış şekilleri listesinde hangi çıkış işlenenlerinin arabellek boyutunun yetersiz olduğunu belirtmeli ve bilinmeyen boyutlar için sıfır kullanarak mümkün olduğunca fazla boyutsal bilgi bildirmelidir.
Zamanlama
Android 10'da bir uygulama, derleme işlemi sırasında kullanılacak tek bir cihaz belirtmişse yürütme süresini isteyebilir. Ayrıntılar için MeasureTiming
ve Cihaz Bulma ve Atama başlıklı makaleleri inceleyin.
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
değerini bildirmelidir (sürenin kullanılamadığını belirtmek için). Sürücü, yürütme süresinin ölçülmesinden kaynaklanan performans cezasını en aza indirmelidir.
Sürücü, Timing
yapısında aşağıdaki süreleri mikrosaniye cinsinden 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ı (ör. yürütme, diğer görevler tarafından öncelikli olarak gerçekleştirildiğinde veya bir kaynağın kullanılabilir olmasını beklediğinde) içermelidir.
Sürücüden 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 istendiğinde bile bunun yerine cihazda geçen süre, sürücüde geçen süre veya her ikisi için UINT64_MAX
değerini bildirebilir. 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üreden daha uzun olmalıdır.
Sınırlı yürütme
Android 11'de NNAPI, yürütmelerin bir sync_fence
tutma yeri listesini beklemesine ve isteğe bağlı olarak bir sync_fence
nesnesi döndürmesine olanak tanır. Bu nesne, yürütme tamamlandığında sinyal verir. Bu, küçük sıralı modeller ve akış kullanım alanları için ek yükü azaltır. Sınırlı yürütme, sync_fence
sinyali verebilen veya sync_fence
için bekleyebilen diğer bileşenlerle daha verimli birlikte çalışmaya da olanak tanır. sync_fence
hakkında daha fazla bilgi için Senkronizasyon çerçevesi başlıklı makaleyi inceleyin.
Sınırlı yürütmede çerçeve, beklemek için senkronizasyon sınırlamaları vektörü içeren, hazırlanmış bir modelde sınırlı ve eşzamansız yürütme başlatmak üzere 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 işleyici 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 işlemi 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
işlevi çağrıldıktan sonraexecuteFenced
işlevinin döndürülensyncFence
değerini işaret etmesine kadar geçen süre.timingFenced
: Yürütmenin beklediği tüm senkronizasyon çitlerinin sinyal verildiği andanexecuteFenced
'nin döndürülensyncFence
'ye sinyal verdiği ana kadar geçen süre.
Kontrol akışı
Android 11 veya sonraki sürümleri çalıştıran cihazlarda NNAPI, diğer modelleri bağımsız değişken olarak alan ve bunları koşullu olarak (IF
) veya tekrar tekrar (WHILE
) yürüten iki kontrol akışı işlemi (IF
ve WHILE
) içerir. Bu işlemin 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 izin vererek hizmet kalitesini (QoS) artırır. Daha fazla bilgi için Hizmet Kalitesi bölümünü inceleyin.
Temizle
Bir uygulama, hazırlanmış bir modeli kullanmayı bitirdiğinde çerçeve, @1.3::IPreparedModel
nesnesine olan referansını serbest bırakır. IPreparedModel
nesnesine artık referans verilmediğinde, nesneyi oluşturan sürücü hizmetinde otomatik olarak yok edilir. Modele özgü
kaynaklar, sürücünün yıkıcıyı uygulaması sırasında geri alınabilir. Sürücü hizmeti, IPreparedModel
nesnesinin istemci tarafından artık ihtiyaç duyulmadığında otomatik olarak yok edilmesini istiyorsa IPreparedeModel
nesnesi IPreparedModelCallback::notify_1_3
üzerinden 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. Aksi takdirde, çerçevenin işi doğru şekilde tahsis etme özelliği engellenir. Sürücü, işleyemediği parçaları çerçeveye bildirmeli ve geri kalanını çerçevenin işlemesine izin vermelidir.
Çerçeve, satıcı tanımlı işlemler hariç tüm NNAPI işlemleri için bir CPU uygulaması sağlar. Daha fazla bilgi için Tedarikçi Uzantıları başlıklı makaleyi inceleyin.
Android 10'da kullanıma sunulan işlemler (API düzeyi 29) yalnızca CTS ve VTS testlerinin doğru olduğunu doğrulamak için referans CPU uygulamasına sahiptir. Mobil makine öğrenimi çerçevelerinde yer alan optimize edilmiş uygulamalar, NNAPI CPU uygulamasına 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ı işlevleri içerir.
VLogging:
VLOG
, yalnızcadebug.nn.vlog
özelliğinde uygun etiket ayarlanmışsa mesajı günlüğe kaydeden Android'inLOG
özelliğini sarmalayan bir makrodur.initVLogMask()
işlevi,VLOG
işlevine yapılan tüm çağrılardan önce çağrılmalıdır.VLOG_IS_ON
makrosu,VLOG
öğesinin etkin olup olmadığını kontrol etmek için kullanılabilir. Bu sayede, gerekmediği durumlarda karmaşık günlük kaydı kodunun atlanması sağlanır. Özelliğin değeri aşağıdakilerden biri olmalıdır:- Boş dize, herhangi bir günlüğün oluşturulmayacağını belirtir.
- Tüm günlük kaydının yapılacağını belirten
1
veyaall
jetonu. - Hangi günlük kaydının 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
'dır.
compliantWithV1_*
: Bir NN HAL nesnesi, bilgi kaybı olmadan 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, modelde NN HAL 1.1 veya NN HAL 1.2'de kullanıma sunulan işlem türleri varsaV1_2::Model
üzerindecompliantWithV1_0
çağrısı yapıldığındafalse
döndürülür.convertToV1_*
: Bir 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 temsil edemezse) 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 özellikler sorgulanabilir:
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 olduğunu doğrulayan 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,validateModel
, modelde var olmayan bir işlenen dizinine referans veren bir işlem veya söz konusu HAL sürümünde desteklenmeyen bir işlem varsafalse
değerini döndürür.
frameworks/ml/nn/common/include/Tracing.h
dosyası, sinir ağları koduna systracing bilgilerinin eklenmesini kolaylaştırmak için makrolar içerir.
Örnek olarak, ö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çiminde boşaltmak için bir yardımcı işlev içerir.
graphDump
: Modeli, belirtilen akışa (sağlandıysa) veya logcat'e (akış sağlanmadıysa) Graphviz (.dot
) biçiminde yazar.
Doğrulama
NNAPI uygulamanızı test etmek için Android çerçevesinde yer alan VTS ve CTS testlerini kullanın. VTS, sürücülerinizi doğrudan (çerçeveyi kullanmadan) çalıştırırken CTS, sürücülerinizi çerçeve üzerinden dolaylı olarak çalıştırır. Bu testler, her API yöntemini test eder ve sürücüler tarafından desteklenen tüm işlemlerin doğru çalıştığını ve hassasiyet şartlarını karşılayan sonuçlar verdiğini doğrular.
NNAPI için CTS ve VTS'deki hassasiyet koşulları şunlardır:
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
Kuantize edilmiş: Bir birimlik hata (
mobilenet_quantized
hariç, bu değerde üç birimlik hata vardır)Boole: tam eşleme
CTS, NNAPI'yi test etmek için her sürücünün yürütme sonuçlarını NNAPI referans uygulamasıyla test etmek ve karşılaştırmak üzere kullanılan sabit sözde rastgele grafikler oluşturur. NN HAL 1.2 veya daha yüksek sürücülerde, sonuçlar hassasiyet ölçütlerini karşılamıyorsa CTS hata bildirir ve hata veren model için /data/local/tmp
altında hata ayıklama amacıyla bir spesifikasyon dosyası oluşturur.
Doğruluk ölçütleri hakkında daha fazla bilgi için TestRandomGraph.cpp
ve TestHarness.h
başlıklı makaleleri inceleyin.
Fuzz testi
Fuzz testinin amacı, beklenmedik girişler gibi faktörler nedeniyle test edilen koddaki çökmeleri, onayları, bellek ihlallerini veya genel olarak tanımlanmamış davranışları bulmaktır. Android, NNAPI bulanıklık testi için libFuzzer tabanlı testler kullanır. Bu testler, yeni rastgele girişler oluşturmak için önceki test senaryolarının satır kapsamını kullandığından bulanıklık testi konusunda etkilidir. Örneğin, libFuzzer yeni kod satırlarında çalışan test senaryolarını tercih eder. Bu sayede, testlerin sorunlu kodu bulması için gereken süre önemli ölçüde azalır.
Sürücü uygulamanızı doğrulamak için bulanıklaştırma testi gerçekleştirmek üzere AOSP'de bulunan libneuralnetworks_driver_fuzzer
test yardımcı programında frameworks/ml/nn/runtime/test/android_fuzzing/DriverFuzzTest.cpp
bölümünü sürücü kodunuzu içerecek şekilde değiştirin. NNAPI fuzz testi hakkında daha fazla bilgi için frameworks/ml/nn/runtime/test/android_fuzzing/README.md
başlıklı makaleyi inceleyin.
Güvenlik
Uygulama işlemleri doğrudan sürücü 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
adresine gönderildi.
Sürücüler, aynı cihaz kullanılırken uygulamaların diğer uygulamalara müdahale etmemesini de sağlamalıdır.
Android Makine Öğrenimi Test Paketi
Android Makine Öğrenimi Test Paketi (MLTS), satıcı cihazlarındaki gerçek modellerin doğruluğunu doğrulamak için CTS ve VTS'ye dahil edilen bir NNAPI karşılaştırma testidir. Karşılaştırma testi, gecikme süresini ve doğruluğu değerlendirir ve sürücülerin sonuçlarını aynı model ve veri kümeleri için CPU'da çalışan TF Lite kullanılarak elde edilen sonuçlarla karşılaştırır. Bu, sürücünün doğruluğunun CPU referans uygulamasından daha kötü olmamasını sağlar.
Android platform geliştiricileri, sürücülerin gecikme süresini ve doğruluğunu değerlendirmek için de MLTS'yi kullanır.
NNAPI karşılaştırma testi, 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ında aşağıdaki modeller ve veri kümeleri kullanılır.
- Farklı boyutlarda MobileNetV1 float ve u8 nicemlenmiş modelleri, Open Images Dataset v4'ün küçük bir alt kümesi (1.500 resim) üzerinde çalıştırılır.
- Farklı boyutlarda MobileNetV2 float ve u8 nicelendirilmiş modelleri, Open Images Dataset v4'ün küçük bir alt kümesi (1.500 resim) üzerinde çalıştırılır.
- Metin okuma için uzun kısa süreli bellek (LSTM) tabanlı akustik model, CMU Arctic kümesinin küçük bir alt kümesi üzerinde çalıştırılır.
- Otomatik konuşma tanıma için LSTM tabanlı akustik model, LibriSpeech veri kümesinin küçük bir alt kümesine karşı çalıştırılır.
Daha fazla bilgi için platform/test/mlts/models
konusuna bakın.
Stres testi
Android Machine Learning Test Paketi, sürücülerin ağır kullanım koşulları altında veya müşterilerin davranışlarıyla ilgili uç durumlarda dayanıklılığını doğrulamak için bir dizi kilitlenme testi içerir.
Tüm çarpışma testleri aşağıdaki özellikleri sunar:
- Asılma algılama: NNAPI istemcisi bir test sırasında asılırsa test,
HANG
hata nedeni ile başarısız olur ve test paketi bir sonraki teste geçer. - NNAPI istemci kilitlenmesi algılama: Testler, istemci kilitlenmelerinden etkilenmez ve
CRASH
hata nedeni ile başarısız olur. - Sürücü kilitlenme algılama: Testler, NNAPI çağrısında hataya neden olan sürücü kilitlenmesini algılayabilir. Sürücü işlemlerinde NNAPI hatasına ve testin başarısız olmasına neden olmayan çökmeler olabileceğini unutmayın. Bu tür bir hatayı gidermek 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ülerde çalıştırılır.
Tüm kilitlenme testlerinin dört olası sonucu vardır:
SUCCESS
: Yürütme işlemi hatasız tamamlandı.FAILURE
: Yürütme başarısız oldu. Genellikle bir model test edilirken oluşan hatadan kaynaklanır. Sürücünün modeli derleyemediğini veya yürütemediğini gösterir.HANG
: Test süreci yanıt vermemeye başladı.CRASH
: Test süreci kilitlendi.
Yük testi ve kilitlenme testlerinin tam listesi hakkında daha fazla bilgi için platform/test/mlts/benchmark/README.txt
başlıklı makaleyi inceleyin.
MLTS kullanma
MLTS'yi kullanmak için:
- Bir hedef cihazı iş istasyonunuza bağlayın ve adb üzerinden 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
içine kopyalayın.source build/envsetup.sh lunch aosp_arm-userdebug # Or aosp_arm64-userdebug if available. ./test/mlts/benchmark/build_and_run_benchmark.sh
Bir karşılaştırma çalıştırmasının sonunda sonuçlar bir HTML sayfası olarak sunulur ve
xdg-open
'ya iletilir.
Daha fazla bilgi için platform/test/mlts/benchmark/README.txt
konusuna bakın.
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 nicemleme desteği.
TENSOR_QUANT8_ASYMM_SIGNED
işlenen türünü ekler. İşaretsiz nicemleme ile işlemleri destekleyen NN HAL 1.3'e sahip sürücüler, bu işlemlerin işaretli varyantlarını da desteklemelidir. Çoğu nicemlenmiş işlemin imzalı ve imzasız sürümleri çalıştırılırken sürücüler, 128'lik bir farka kadar aynı sonuçları vermelidir. Bu şartın beş istisnası vardır:CAST
,HASHTABLE_LOOKUP
,LSH_PROJECTION
,PAD_V2
veQUANTIZED_16BIT_LSTM
.QUANTIZED_16BIT_LSTM
işlemi, işaretli işlenenleri desteklemez. Diğer dört işlem ise işaretli nicemlemeyi destekler ancak sonuçların aynı olması gerekmez. - Çerçevenin, beklemek için senkronizasyon bariyerleri vektörüyle hazırlanmış bir modelde bariyerli ve eşzamansız yürütme başlatmak üzere
IPreparedModel::executeFenced
yöntemini çağırdığı bariyerli yürütmeler için destek. Daha fazla bilgi için Fenced execution (Sınırlı yürütme) başlıklı makaleye bakın. - Kontrol akışı desteği. Diğer modelleri bağımsız değişken olarak alan ve bunları koşullu olarak (
IF
) veya tekrar tekrar (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 hizmet kalitesi (QoS) iyileştirildi. 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 ve aynı sürücüdeki ardışık yürütmeler arasında gereksiz veri kopyalama ve dönüştürme işlemleri engellenebilir. 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 sunuyor.
Capabilities
yapısı, skaler veri türleri de dahil olmak üzere tüm veri türlerini içerir ve adlandırılmış alanlar yerine vektör kullanarak gevşetilmemiş 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 Bulma ve Atama bölümünü inceleyin.- Varsayılan olarak, eşzamanlı yürütme gerçekleştirmek için
executeSynchronously
yöntemi çağrılır.execute_1_2
yöntemi, çerçeveye eşzamansız olarak yürütme işlemi yapmasını söyler. Yürütme başlıklı makaleyi 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 bildirilir. Zamanlama başlıklı makaleyi inceleyin.- Bir veya daha fazla çıkış işleneninin bilinmeyen bir boyuta ya da sıralamaya sahip olduğu yürütmeler için destek. Çıkış şekli bölümüne bakın.
- Satıcı tarafından tanımlanan işlemler ve veri türleri koleksiyonları olan satıcı uzantıları için destek. Sürücü,
IDevice::getSupportedExtensions
yöntemiyle desteklenen uzantıları bildirir. Tedarikçi Uzantıları başlıklı makaleyi inceleyin. - Uygulama ve sürücü süreçleri arasında iletişim kurmak için hızlı mesaj kuyruklarını (FMQ'lar) kullanarak bir dizi patlama yürütmesini kontrol etme ve gecikmeyi azaltma. Toplu yürütmeler ve hızlı ileti kuyrukları başlıklı makaleyi inceleyin.
- Sürücünün verileri kopyalamadan yürütme işlemleri gerçekleştirmesine olanak tanıyan AHardwareBuffer desteği. AHardwareBuffer'a bakın.
- Uygulama başlatıldığında derleme için kullanılan süreyi azaltmak amacıyla derleme yapıtlarının önbelleğe alınması için destek iyileştirildi. Derleme önbelleği başlıklı makaleyi inceleyin.
Android 10 aşağıdaki işlenen türlerini ve işlemleri 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 birçoğunda güncellemeler sunar. Güncellemeler temel olarak aşağıdakilerle ilgilidir:
- NCHW bellek düzeni için destek
- Softmax ve normalleştirme işlemlerinde 4'ten farklı sıralamaya sahip tensörler için destek
- Genişletilmiş kıvrımlar için destek
ANEURALNETWORKS_CONCATENATION
içinde karma nicelendirmeye sahip girişler için destek
Aşağıdaki listede, Android 10'da değiştirilen işlemler gösterilmektedir. Değişikliklerle ilgili tüm ayrıntılar için NNAPI referans belgelerindeki OperationCode bölümüne 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ş olup aşağıdaki önemli değişiklikleri içerir.
IDevice::prepareModel_1_1
,ExecutionPreference
parametresini içerir. Uygulamanın pili korumayı tercih ettiğini veya modeli hızlı ve art arda yapılan çağrılarla yürüteceğini bilen sürücü, hazırlığını buna göre ayarlayabilir.- 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 nokta hesaplamalarının 16 bit kayan nokta aralığı ve/veya hassasiyeti kullanılarak çalıştırılabileceğini belirtebilir.Capabilities
Yapıda, sürücünün gevşetilmiş performansını çerçeveye bildirebilmesi içinrelaxedFloat32toFloat16Performance
ek alanı bulunur.
Android 8.1
İlk Neural Networks HAL (1.0) Android 8.1'de yayınlandı. Daha fazla bilgi için /neuralnetworks/1.0/
sayfasına bakın.