Bu sayfada bir Sinir Ağları API'si (NNAPI) sürücüsünün nasıl uygulanacağına ilişkin bir genel bakış sunulmaktadır. 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
konumundadır.
Sinir Ağları API'si hakkında daha fazla bilgi için bkz. Sinir Ağları API'si .
Sinir Ağları HAL
Sinir Ağları (NN) HAL, bir üründe (örneğin bir telefon veya tablet) bulunan grafik işleme birimleri (GPU'lar) ve dijital sinyal işlemcileri (DSP'ler) gibi çeşitli cihazların soyutlanmasını tanımlar. Bu aygıtları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ö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 açısından 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 ne kadar enerji verimli ş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 kıyaslama uygulamasını kullanın. MobileNet v1 ve v2, asr_float
ve tts_float
modelleri, 32 bit kayan nokta değerleri için performansı ölçmek için önerilir ve MobileNet v1 ve v2 nicelenmiş modeller, 8 bit nicelenmiş değerler için ö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 nokta ve nicelenmiş tensörler için sürücü performansı bilgilerini içerir ve skaler veri türlerini içermez.
Başlatma sürecinin bir parçası olarak çerçeve, IDevice::getType
, IDevice::getVersionString
, IDevice:getSupportedExtensions
ve IDevice::getNumberOfCacheFilesNeeded
kullanarak daha fazla bilgiyi sorgulayabilir.
Ürün yeniden başlatmaları arasında çerçeve, bu bölümde açıklanan tüm sorguların belirli bir sürücü için her zaman aynı değerleri raporlamasını bekler. Aksi takdirde, bu sürücüyü kullanan bir uygulamanın performansı düşebilir 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 belirleyebilir. Daha fazla bilgi için bkz. Cihaz Bulma ve Atama .
Model derleme zamanında çerçeve, IDevice::getSupportedOperations_1_3
çağırarak modeli her aday sürücüye gönderir. Her sürücü, modelin hangi işlemlerinin desteklendiğini belirten bir boole dizisi döndürür. Bir sürücü, çeşitli nedenlerden dolayı belirli bir işlemi destekleyemediğ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 girişleri işlemesini engelleyen bellek kısıtlamaları var.
Derleme sırasında, OperandLifeTime
açıklandığı gibi modelin girişi, çıkışı ve dahili işlenenleri bilinmeyen boyutlara veya sıralamaya sahip olabilir. Daha fazla bilgi için bkz . Çıkış şekli .
Çerçeve, seçilen her sürücüye IDevice::prepareModel_1_3
öğesini çağırarak modelin bir alt kümesini yürütmeye hazırlanması talimatını verir. Daha sonra 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, büyük aygıt belleği parçaları gibi kaynaklar derleme sırasında atanmamalıdır.
Başarı durumunda 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, modelin tamamını CPU üzerinde çalıştırır.
Bir uygulama başlatıldığında derleme için kullanılan süreyi azaltmak için 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 eşzamanlı yürütme gerçekleştirmek için varsayılan olarak IPreparedModel::executeSynchronously_1_3
HAL yöntemini çağırır. Bir istek aynı zamanda execute_1_3
yöntemi, executeFenced
yöntemi (bkz. Fenced yürütme ) kullanılarak eşzamansız olarak veya bir seri yürütme kullanılarak yürütülebilir.
Senkronize yürütme çağrıları, performansı artırır ve zaman uyumsuz çağrılarla karşılaştırıldığında iş parçacığı yükünü azaltır; çünkü denetim, yalnızca yürütme tamamlandıktan sonra uygulama sürecine geri döner. Bu, sürücünün uygulama sürecine bir 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 denetim uygulama sürecine geri döner ve sürücünün yürütme tamamlandığında @1.3::IExecutionCallback
kullanarak çerçeveye bildirimde bulunması gerekir.
Yürütme yöntemine iletilen Request
parametresi, yürütme için kullanılan giriş ve çıkış işlenenlerini listeler. İşlenen verilerini saklayan bellek, ilk boyutun en yavaş yinelendiği ve herhangi bir satırın sonunda dolgu içermediği ana satır 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 çıkış işleneninin bilinmeyen bir boyutu veya sırası olduğunda, sürücünün dinamik olarak boyutlandırılmış çıkış bilgilerini döndürmesi gerekir.
NN HAL 1.1 veya daha düşük sürüme sahip sürücüler için, istek tamamlandığında yalnızca hata durumu döndürülür. Yürütmenin başarıyla tamamlanabilmesi için giriş ve çıkış işlenenlerinin boyutları tam olarak belirtilmelidir. Dahili işlenenler bir veya daha fazla bilinmeyen boyuta sahip olabilir ancak bunların belirli bir sıralamaya sahip olması gerekir.
Birden fazla sürücüyü kapsayan kullanıcı istekleri için, çerçeve, ara belleğin ayrılmasından ve her sürücüye yapılan çağrıların sıralanmasından 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 seri hale getirebilir.
Çerçeve, sürücüden birden fazla hazırlanmış modeli saklamasını isteyebilir. Örneğin, m1
modelini hazırlayın, m2
hazırlayın, m1
üzerinde r1
isteğini yürütün, m2
üzerinde r2
yürütün, m1
üzerinde r3
yürütün, m2
üzerinde r4
yürütün, m1
bırakın ( Temizleme bölümünde açıklanmıştır) ve m2
bırakın.
Kötü bir kullanıcı deneyimine (örneğin, ilk karede takılma) yol açabilecek yavaş bir ilk yürütmeyi önlemek için, sürücünün başlatma işlemlerinin çoğunu derleme aşamasında gerçekleştirmesi gerekir. İlk çalıştırmada başlatma, büyük geçici arabelleklerin ayrılması veya bir cihazın saat hızının artırılması gibi, erken gerçekleştirildiğinde sistem sağlığını olumsuz yönde etkileyen eylemlerle sınırlı olmalıdır. Yalnızca sınırlı sayıda eşzamanlı model hazırlayabilen sürücülerin, ilk çalıştırma sırasında başlatma işlemini yapması gerekebilir.
Android 10 veya üzeri sürümlerde, aynı hazırlanan modelle birden fazla yürütmenin hızlı bir şekilde art arda yürütüldüğü durumlarda müşteri, 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 bkz. Ani Yürütmeler ve Hızlı Mesaj Kuyrukları .
Hızlı bir şekilde art arda birden fazla yürütmenin performansını artırmak için sürücü, geçici ara bellekleri kullanabilir veya saat hızlarını artırabilir. Belirli bir süre sonunda yeni istek oluşturulmazsa kaynakları serbest bırakmak için bir gözlemci iş parçacığı oluşturulması önerilir.
Çıkış şekli
Bir veya daha fazla çıkış işleneninin tüm boyutların belirtilmediği istekler için, sürücünün, yürütmeden sonra her çıkış işleneni için boyut bilgilerini içeren çıktı şekillerinin bir listesini sağlaması gerekir. Boyutlar hakkında daha fazla bilgi için bkz. OutputShape
.
Bir yürütme, düşük boyutlu bir çıkış arabelleği nedeniyle başarısız olursa, sürücü, çıkış şekilleri listesinde hangi çıkış işlenenlerinin yetersiz arabellek boyutuna sahip olduğunu belirtmeli ve bilinmeyen boyutlar için sıfır kullanarak mümkün olduğunca fazla boyut bilgisi rapor etmelidir.
Zamanlama
Android 10'da, uygulamanın derleme işlemi sırasında kullanılacak tek bir cihaz belirtmesi durumunda uygulama yürütme süresini isteyebilir. Ayrıntılar için bkz. MeasureTiming
ve Cihaz Keşfi ve Atama . Bu durumda, bir 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
(sürenin mevcut olmadığını belirtmek için) rapor etmelidir. 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ı (örneğin yürütmenin diğer görevler tarafından engellendiği veya bir kaynağın kullanılabilir hale gelmesini beklediği zaman) içermelidir.
Sürücünün 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 sürücü bunun yerine aygıttaki süre, sürücüdeki 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 olanak tanır. Bu, küçük sıralı modeller ve akış kullanım senaryoları için ek yükü azaltır. Sınırlandırılmış yürütme ayrıca, sync_fence
sinyali verebilen veya bekleyebilen diğer bileşenlerle daha verimli bir birlikte çalışabilirlik sağlar. sync_fence
hakkında daha fazla bilgi için bkz. Senkronizasyon çerçevesi .
Çerçevelenmiş bir yürütmede, çerçeve, hazır bir model üzerinde beklenecek bir senkronizasyon çitleri vektörü ile çitlenmiş, 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 tamamlanırsa, sync_fence
için boş bir tanıtıcı döndürülebilir. Çerçevenin hata durumu ve süre bilgilerini sorgulamasına izin vermek için bir IFencedExecutionCallback
nesnesinin de döndürülmesi gerekir.
Bir yürütme tamamlandıktan sonra, yürütmenin süresini ölçen aşağıdaki iki zamanlama değeri IFencedExecutionCallback::getExecutionInfo
aracılığıyla sorgulanabilir.
-
timingLaunched
:executeFenced
çağrılmasından,executeFenced
döndürülensyncFence
sinyal vermesine kadar geçen süre. -
timingFenced
: Yürütmenin beklediği tüm senkronizasyon çitlerinin,executeFenced
döndürülensyncFence
sinyal verdiğinde sinyal verildiği andan itibaren geçen süre.
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öreceli ö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 kalitesini (QoS) içerir. tamamlanacak. Daha fazla bilgi için bkz. Hizmet Kalitesi .
Temizlemek
Bir uygulama hazırlanmış bir modeli kullanarak tamamlandığında, çerçeve @1.3::IPreparedModel
nesnesine olan referansını yayınlar. IPreparedModel
nesnesine artık başvurulmadığı zaman, onu oluşturan sürücü hizmetinde otomatik olarak yok edilir. Modele özgü kaynaklar şu anda sürücünün yıkıcıyı uygulamasında geri kazanılabilir. Sürücü hizmeti, istemci tarafından artık ihtiyaç duyulmadığında IPreparedModel
nesnesinin otomatik olarak yok edilmesini istiyorsa, IPreparedModel
nesnesi IPreparedeModel
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 kullanması bekleniyor. Sürücüler grafik hesaplamaları gerçekleştirmek için CPU'yu kullanmamalıdır çünkü bu, çerçevenin işi doğru şekilde tahsis etme yeteneğini engeller. Sürücü, idare edemediği kısımları çerçeveye bildirmeli ve gerisini çerçevenin halletmesine izin vermelidir.
Çerçeve, satıcı tarafından tanımlanan işlemler dışındaki tüm NNAPI işlemleri için bir CPU uygulaması sağlar. Daha fazla bilgi için bkz . Satıcı Uzantıları .
Android 10'da (API düzeyi 29) tanıtılan işlemlerde yalnızca CTS ve VTS testlerinin doğru olduğunu doğrulamak için bir referans CPU uygulaması bulunur. 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ılabilecek yardımcı program işlevlerini içerir.
frameworks/ml/nn/common/include/Utils.h
dosyası, günlüğe kaydetme ve farklı NN HAL sürümleri arasında dönüştürme için kullanılanlar gibi çeşitli yardımcı program işlevlerini içerir.
VLogging:
VLOG
Android'inLOG
çevreleyen ve yalnızcadebug.nn.vlog
özelliğinde uygun etiket ayarlandığında mesajı günlüğe kaydeden bir sarmalayıcı makrodur.VLOG
yapılan herhangi bir çağrıdan önceinitVLogMask()
çağrılmalıdır.VLOG_IS_ON
makrosu,VLOG
şu anda etkin olup olmadığını kontrol etmek için kullanılabilir; bu, gerekmediği takdirde karmaşık günlük kodunun atlanmasına olanak tanır. Gayrimenkulün değeri aşağıdakilerden biri olmalıdır:- Hiçbir günlük kaydının yapılmayacağını belirten boş bir dize.
- Tüm günlüğe kaydetmenin yapılacağını belirten belirteç
1
veyaall
. - Hangi günlüğe kaydetme işleminin yapılacağını belirten, boşluk, virgül veya iki nokta üst üste ile ayrılmış etiketlerin listesi. Etiketler
compilation
,cpuexe
,driver
,execution
,manager
vemodel
.
compliantWithV1_*
: Bir NN HAL nesnesi, bilgi kaybı olmadan aynı türden farklı bir HAL sürümüne dönüştürülebiliyorsatrue
döndürür. Örneğin,V1_2::Model
üzerindecompliantWithV1_0
çağrılması, modelin NN HAL 1.1 veya NN HAL 1.2'de tanıtılan işlem türlerini içermesi durumundafalse
değerini 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ıyla sonuçlanırsa (yani türün yeni sürümü değeri tam olarak temsil edemiyorsa) günlüğe bir uyarı kaydedilir.Yetenekler:
nonExtensionOperandPerformance
veupdate
işlevleriCapabilities::operandPerformance
alanının oluşturulmasına yardımcı olmak için kullanılabilir.Türlerin sorgulama özellikleri:
isExtensionOperandType
,isExtensionOperationType
,nonExtensionSizeOfData
,nonExtensionOperandSizeOfData
,nonExtensionOperandTypeIsScalar
,tensorHasUnspecifiedDimensions
.
frameworks/ml/nn/common/include/ValidateHal.h
dosyası, bir NN HAL nesnesinin HAL sürümünün spesifikasyonuna göre geçerli olduğunu doğrulamaya yönelik yardımcı program işlevlerini içerir.
-
validate*
: NN HAL nesnesi, HAL sürümünün spesifikasyonuna göre geçerliysetrue
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 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ı, Sinir Ağları koduna sistem oluşturma bilgileri eklemeyi basitleştiren 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 bir Model
içeriğini grafik biçiminde dökmek için bir yardımcı program işlevi içerir.
-
graphDump
: Modelin bir temsilini Graphviz (.dot
) biçiminde belirtilen akışa (varsa) veya logcat'e (eğer akış sağlanmadıysa) yazar.
Doğrulama
NNAPI uygulamanızı test etmek için Android çerçevesinde bulunan VTS ve CTS testlerini kullanın. VTS, sürücülerinizi doğrudan (çerçeveyi kullanmadan) çalıştırırken, CTS bunları ç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 şekilde çalıştığını ve hassasiyet gereksinimlerini karşılayan sonuçlar sağladığını doğrular.
NNAPI için CTS ve VTS'deki hassasiyet gereksinimleri aşağıdaki gibidir:
Kayan nokta: abs(beklenen - gerçek) <= atol + rtol * abs(beklenen); Neresi:
- Fp32 için atol = 1e-5f, rtol = 5,0f * 1,1920928955078125e-7
- Fp16 için atol = rtol = 5,0f * 0,0009765625f
Nicelenmiş: birer birer (üçer birer olan
mobilenet_quantized
hariç)Boolean: tam eşleşme
CTS'nin NNAPI testlerinin bir yolu, her sürücünün yürütme sonuçlarını NNAPI referans uygulamasıyla test etmek ve karşılaştırmak için kullanılan sabit sözde rastgele grafikler oluşturmaktır. NN HAL 1.2 veya üzeri sürücüler için, sonuçlar kesinlik kriterlerini 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 spesifikasyon dosyası döker. Kesinlik kriterleri hakkında daha fazla ayrıntı için bkz. TestRandomGraph.cpp
ve TestHarness.h
.
Fuzz testi
Fuzz testinin amacı, beklenmeyen girişler gibi faktörler nedeniyle test edilen koddaki çökmeleri, iddiaları, bellek ihlallerini veya genel tanımsız davranışları bulmaktır. NNAPI fuzz testi için Android, yeni rastgele girdiler oluşturmak için önceki test senaryolarının hat kapsamını kullandıkları için fuzzing konusunda etkili olan libFuzzer tabanlı testleri kullanır. Örneğin libFuzzer, yeni kod satırlarında çalışan test senaryolarını tercih eder. Bu, testlerin sorunlu kodu bulmak için harcadığı süreyi büyük ölçüde azaltır.
Sürücü uygulamanızı doğrulamak amacıyla fuzz testi gerçekleştirmek için, AOSP'de bulunan libneuralnetworks_driver_fuzzer
test yardımcı programında frameworks/ml/nn/runtime/test/android_fuzzing/DriverFuzzTest.cpp
sürücü kodunuzu içerecek şekilde değiştirin. NNAPI bulanıklık testi hakkında daha fazla bilgi için bkz. frameworks/ml/nn/runtime/test/android_fuzzing/README.md
.
Güvenlik
Uygulama süreçleri doğrudan sürücünün süreciyle iletişim kurduğundan, sürücülerin aldıkları çağrıların argümanlarını doğrulaması gerekir. Bu doğrulama VTS tarafından doğrulanmıştır. Doğrulama kodu frameworks/ml/nn/common/include/ValidateHal.h
dosyasındadır.
Sürücüler aynı cihazı kullanırken uygulamaların diğer uygulamalara müdahale edemeyeceğinden de emin olmalı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 karşılaştırmasıdır. Karşılaştırma, gecikmeyi ve doğruluğu değerlendirir ve sürücülerin sonuçlarını, aynı model ve veri kümeleri için CPU üzerinde çalışan TF Lite kullanan sonuçlarla karşılaştırır. Bu, 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ıyor.
NNAPI kıyaslaması AOSP'deki iki projede bulunabilir:
-
platform/test/mlts/benchmark
(kıyaslama uygulaması) -
platform/test/mlts/models
(modeller ve veri kümeleri)
Modeller ve veri kümeleri
NNAPI kıyaslaması aşağıdaki modelleri ve veri kümelerini kullanır.
- Farklı boyutlarda nicelenmiş MobileNetV1 float ve u8, Open Images Dataset v4'ün küçük bir alt kümesine (1500 görüntü) karşı çalışır.
- Farklı boyutlarda nicelenmiş MobileNetV2 float ve u8, Open Images Dataset v4'ün küçük bir alt kümesine (1500 görüntü) karşı çalışır.
- Metinden konuşmaya yönelik uzun kısa süreli bellek (LSTM) tabanlı akustik model, CMU Arctic setinin küçük bir alt kümesine karşı çalışır.
- Otomatik konuşma tanımaya yönelik LSTM tabanlı akustik model, LibriSpeech veri kümesinin küçük bir alt kümesine karşı çalışır.
Daha fazla bilgi için bkz. platform/test/mlts/models
.
Stres testi
Android Makine Öğrenimi Test Paketi, sürücülerin yoğun kullanım koşulları altında veya istemci davranışı gibi durumlarda 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
hata nedeni ile başarısız olur ve test paketi bir sonraki teste geçer. - NNAPI istemci çökmesi tespiti: Testler istemci çökmelerinden sağ çıkar ve testler
CRASH
hata nedeni ile başarısız olur. - Sürücü çökmesi tespiti: Testler, NNAPI çağrısında hataya neden olan bir sürücü çökmesini tespit edebilir. Sürücü işlemlerinde NNAPI hatasına neden olmayan ve testin başarısız olmasına neden olmayan çökmeler olabileceğini unutmayın. Bu tür arızaları 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ülere karşı gerçekleştirilir.
Tüm çarpışma testlerinin aşağıdaki dört olası sonucu vardır:
-
SUCCESS
: Uygulama hatasız tamamlandı. -
FAILURE
: Yürütme başarısız oldu. Genellikle bir modeli test ederken sürücünün modeli derleyemediğini veya yürütemediğini gösteren bir hatadan kaynaklanır. -
HANG
: Test süreci yanıt vermemeye başladı. -
CRASH
: Test işlemi çöktü.
Stres testi hakkında daha fazla bilgi ve çarpışma testlerinin tam listesi için bkz. platform/test/mlts/benchmark/README.txt
.
MLTS'yi kullan
MLTS'yi kullanmak için:
- Hedef cihazı iş istasyonunuza bağlayın ve ona adb aracılığıyla erişilebildiğinden emin olun. Birden fazla cihaz bağlıysa hedef cihazın
ANDROID_SERIAL
ortam değişkenini dışa aktarın. cd
Android üst düzey kaynak dizinine 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 kıyaslama çalışmasının sonunda sonuçlar bir HTML sayfası olarak sunulur ve
xdg-open
iletilir.
Daha fazla bilgi için platform/test/mlts/benchmark/README.txt
bakın.
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. İmzasız nicelemeli işlemleri destekleyen NN HAL 1.3'e sahip sürücülerin aynı zamanda bu işlemlerin imzalı çeşitlerini de desteklemesi gerekir. Çoğu nicelenmiş işlemin imzalı ve imzasız sürümlerini çalıştırırken, sürücülerin 128'e 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 imzalı işlenenleri desteklemez ve diğer dört işlem imzalı nicelemeyi destekler ancak sonuçların aynı olmasını gerektirmez. - Çerçevenin
IPreparedModel::executeFenced
yöntemini çağırarak, hazır bir model üzerinde beklenecek senkronizasyon çitleri vektörüyle çitle çevrilmiş, eşzamansız bir yürütme başlatmak üzere çağrıldığı çitle çevrilmiş yürütmeler için destek. Daha fazla bilgi için bkz. Çitlerle çevrili yürütme . - 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ışı . - 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 gösterebildiği için iyileştirilmiş hizmet kalitesi (QoS) sağlanır. 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ı desteği. Bu, aygıt yerel belleklerinin yürütmeler arasında aktarılmasına, gereksiz veri kopyalamanın ve aynı sürücüdeki ardışık yürütmeler arasında dönüşümün engellenmesine olanak tanır. Daha fazla bilgi için bkz . Bellek alanları .
Android 10
Android 10, aşağıdaki önemli değişiklikleri içeren NN HAL 1.2'yi sunar.
-
Capabilities
yapısı, skaler veri türleri de dahil olmak üzere tüm veri türlerini içerir ve adlandırılmış alanlar yerine bir vektör kullanarak gevşek olmayan performansı temsil eder. -
getVersionString
vegetType
yöntemleri, çerçevenin aygıt türünü (DeviceType
) ve sürüm bilgilerini almasına olanak tanır. Bkz. Cihaz Bulma ve Atama . -
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 bir yürütme gerçekleştirmesini söyler. Bkz. Yürütme . -
executeSynchronously
,execute_1_2
ve patlama 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 dereceye sahip olduğu uygulamalar için destek. Bkz. Çıkış şekli .
- Satıcı tarafından tanımlanan işlemler 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 patlama nesnesinin, uygulama ve sürücü işlemleri arasında iletişim kurmak için hızlı mesaj kuyruklarını (FMQ'lar) kullanarak bir dizi patlama yürütmesini kontrol etme yeteneği, böylece gecikmeyi azaltır. Bkz . Ani Yürütmeler ve Hızlı Mesaj Kuyrukları .
- Sürücünün verileri kopyalamadan yürütme gerçekleştirmesine olanak tanıyan AHardwareBuffer desteği. AHardwareBuffer'a bakın.
- Bir uygulama başlatıldığında derleme için kullanılan süreyi azaltmak amacıyla derleme yapıtlarının önbelleğe alınmasına yönelik iyileş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 güncellemeler getiriyor. Güncellemeler temel olarak aşağıdakilerle ilgilidir:
- NCHW bellek düzeni desteği
- Softmax ve normalizasyon işlemlerinde derecesi 4'ten farklı olan tensör desteği
- Genişletilmiş evrişimler için destek
-
ANEURALNETWORKS_CONCATENATION
karışık nicemlemeli girişler için destek
Aşağıdaki liste, Android 10'da değiştirilen işlemleri göstermektedir. 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 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 modeli hızlı ardışık aramalarda çalıştıracağını bilerek, hazırlığını ayarlamak için bunu kullanabilir. - Dokuz yeni işlem eklendi:
BATCH_TO_SPACE_ND
,DIV
,MEAN
,PAD
,SPACE_TO_BATCH_ND
,SQUEEZE
,STRIDED_SLICE
,SUB
,TRANSPOSE
. - Bir uygulama,
Model.relaxComputationFloat32toFloat16
true
olarak ayarlayarak 32 bitlik kayan nokta hesaplamalarının 16 bit kayan nokta aralığı ve/veya hassasiyet kullanılarak çalıştırılabileceğini belirtebilir.Capabilities
yapısı, sürücünün rahat performansını çerçeveye bildirebilmesi için ek olarakrelaxedFloat32toFloat16Performance
alanına sahiptir.
Android8.1
İlk Sinir Ağları HAL (1.0), Android 8.1'de piyasaya sürüldü. Daha fazla bilgi için bkz. /neuralnetworks/1.0/
.