Neural Networks API sürücüleri

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.

Nöral ağlar akışı

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 sonra executeFenced işlevinin döndürülen syncFence değerini işaret etmesine kadar geçen süre.
  • timingFenced: Yürütmenin beklediği tüm senkronizasyon çitlerinin sinyal verildiği andan executeFenced'nin döndürülen syncFence'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ızca debug.nn.vlog özelliğinde uygun etiket ayarlanmışsa mesajı günlüğe kaydeden Android'in LOG ö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 veya all 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 ve model'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ülebiliyorsa true 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 varsa V1_2::Model üzerinde compliantWithV1_0 çağrısı yapıldığında false 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 ve update 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çerliyse true 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 varsa false 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:

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:

  1. 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.
  2. 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 ve QUANTIZED_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üten IF ve WHILE 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 ve getType 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çin MeasureTiming parametresi, sürücünün yürütme süresini ölçüp ölçmeyeceğini belirtir. Sonuçlar Timing 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.

  • İşlenen türleri

    • 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
  • İşlemler

    • 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ğerini true 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çin relaxedFloat32toFloat16Performance 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.