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 bilgiler verilmektedir. Daha fazla bilgi için hardware/interfaces/neuralnetworks içindeki HAL tanım dosyalarında bulunan dokümanları inceleyin. Örnek sürücü uygulaması frameworks/ml/nn/driver/sample dosyasındadır.

Nöral Ağlar API'si hakkında daha fazla bilgi için Nöral Ağlar API'si başlıklı makaleyi inceleyin.

Nöral Ağlar HAL

Sinir Ağı (NN) HAL, bir üründeki (ör. telefon veya tablet) grafik işleme birimleri (GPU'lar) ve dijital sinyal işlemciler (DSP'ler) gibi çeşitli cihazların soyut bir tanımını tanımlar. Bu cihazların sürücüleri NN HAL'e uygun olmalıdır. Arayüz, hardware/interfaces/neuralnetworks içindeki HAL tanım dosyalarında belirtilir.

Çerçeve ile sürücü arasındaki arayüzün genel akışı Şekil 1'de gösterilmektedir.

Nöral ağ akışı

Şekil 1. Nöral ağ akışı

Başlatma

Çerçeve, başlatma sırasında IDevice::getCapabilities_1_3 kullanarak sürücünün özelliklerini sorgulayarak @1.3::Capabilities yapısı tüm veri türlerini içerir ve bir vektör kullanarak rahatlatılmamış performansı temsil eder.

Çerçeve, mevcut cihazlara hesaplamaların nasıl atanacağını belirlemek için her sürücünün bir yürütmeyi ne kadar hızlı ve ne kadar enerji verimli bir şekilde gerçekleştirebileceğini anlamak üzere bu sürücülerin özelliklerini kullanır. Bu bilgileri sağlamak için sürücünün, referans iş yüklerinin yürütülmesine dayalı standartlaştırılmış performans sayıları sağlaması gerekir.

Sürücünün IDevice::getCapabilities_1_3 yanıtı olarak döndürdüğü değerleri belirlemek için ilgili veri türlerinin performansını ölçmek üzere NNAPI karşılaştırma uygulamasını kullanın. 32 bit kayan nokta değerlerinin performansını ölçmek için MobileNet v1 ve v2, asr_float ve tts_float modelleri, 8 bit kesirli değerler için ise MobileNet v1 ve v2 kesirli modelleri önerilir. Daha fazla bilgi için Android Makine Öğrenimi Test Paketi başlıklı makaleyi inceleyin.

Android 9 ve önceki sürümlerde Capabilities yapısı yalnızca kayan nokta ve kesirli tenzorlar için sürücü performansı bilgilerini içerir ve skaler veri türlerini içermez.

Başlatma işleminin bir parçası olarak çerçeve, IDevice::getType, IDevice::getVersionString, IDevice:getSupportedExtensions ve IDevice::getNumberOfCacheFilesNeeded değerlerini kullanarak daha fazla bilgi sorgulayabilir.

Ürün yeniden başlatılmaları arasında çerçeve, bu bölümde açıklanan tüm sorguların belirli bir sürücü için her zaman aynı değerleri bildirmesini bekler. Aksi takdirde, bu sürücüyü kullanan bir uygulama düşük performans veya yanlış davranış sergileyebilir.

Derleme

Çerçeve, bir uygulamadan istek aldığında hangi cihazların kullanılacağını belirler. Android 10'da uygulamalar, çerçevenin seçtiği cihazları keşfedip belirtebilir. Daha fazla bilgi için Cihaz Keşfi ve Atama başlıklı makaleyi inceleyin.

Çerçeve, model derleme sırasında IDevice::getSupportedOperations_1_3 çağrısını yaparak modeli her bir sürücü adayına gönderir. Her sürücü, modelin hangi işlemlerinin desteklendiğini belirten bir boole dizisi döndürür. Sürücü, belirli bir işlemi çeşitli nedenlerle destekleyemediğini belirleyebilir. Örnek:

  • Sürücü, veri türünü desteklemiyor.
  • Sürücü yalnızca belirli giriş parametrelerine sahip işlemleri destekler. Örneğin, bir sürücü 3x3 ve 5x5'i destekleyebilir ancak 7x7 konvolüsyon işlemlerini 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 operatörleri bilinmeyen boyutlara veya rütbeye sahip olabilir. Daha fazla bilgi için Çıkış şekli bölümüne bakın.

Çerçeve, seçilen her sürücüye IDevice::prepareModel_1_3 çağrısı yaparak modelin bir alt kümesini yürütmeye hazırlanmasını söyler. Ardından her sürücü kendi alt kümesini derleyebilir. Örneğin, bir sürücü kod oluşturabilir veya ağırlıkların yeniden sıralanmış bir kopyasını oluşturabilir. Modelin derlenmesi ile isteklerin yürütülmesi arasında önemli bir süre olabileceğinden, derleme sırasında büyük cihaz belleği parçaları gibi kaynaklar atanmamalıdır.

Sürücü başarılı olduğunda bir @1.3::IPreparedModel işleyici döndürür. Sürücü, model alt kümesini hazırlarken bir hata kodu döndürürse çerçeve, modelin tamamını CPU'da çalıştırır.

Sürücü, bir uygulama başlatıldığında derleme için kullanılan süreyi azaltmak amacıyla derleme yapılarını önbelleğe alabilir. Daha fazla bilgi için Derleme Önbelleğe Alma başlıklı makaleyi inceleyin.

Uygulama

Bir uygulama, çerçeveden bir isteği 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 (Çitli yürütme bölümüne bakın) kullanılarak veya grup yürütme kullanılarak da eşzamansız olarak yürütülebilir.

Eşzamanlı yürütme çağrıları, uygulama işlemine yalnızca yürütme tamamlandıktan sonra kontrol verildiğinden, eşzamansız çağrılara kıyasla performansı iyileştirir ve mesaj dizileri için ek yükü azaltır. Bu, sürücünün uygulama sürecini yürütmenin tamamlandığı konusunda bilgilendirmek için ayrı bir mekanizmaya ihtiyaç duymadığı anlamına gelir.

Asenkron execute_1_3 yönteminde, yürütme işlemi başladıktan sonra kontrol uygulama işlemine geri döner ve sürücü, yürütme tamamlandığında @1.3::IExecutionCallback kullanarak çerçeveyi bilgilendirmelidir.

execute yöntemine iletilen Request parametresi, yürütme için kullanılan giriş ve çıkış operatörlerini listeler. Operand verilerini depolayan bellek, ilk boyutun en yavaş şekilde iterasyon yaptığı satır öncelikli sırayı kullanmalıdır ve hiçbir satırın sonunda dolgu olmamalıdır. İşlem türleri hakkında daha fazla bilgi için İşlemler bölümüne bakın.

NN HAL 1.2 veya sonraki sürüm sürücüleri için bir istek tamamlandığında hata durumu, çıktı şekli ve zamanlama bilgileri çerçeveye döndürülür. Yürütme sırasında, modelin çıkışı veya dahili operatörleri bir veya daha fazla bilinmeyen boyuta ya da bilinmeyen sıralamaya sahip olabilir. En az bir çıkış operatörü bilinmeyen bir boyuta veya sıralamaya sahip olduğunda sürücü, dinamik olarak boyutlandırılmış çıkış bilgilerini döndürmelidir.

NN HAL 1.1 veya daha düşük sürümleri kullanan sürücülerde, istek tamamlandığında yalnızca hata durumu döndürülür. Yürütmenin başarıyla tamamlanması için giriş ve çıkış operatörlerinin boyutları tam olarak belirtilmelidir. Dahili operatörler bir veya daha fazla bilinmeyen boyuta sahip olabilir ancak belirtilen bir sıralamaya sahip olmalıdır.

Birden fazla sürücüye yayılan kullanıcı isteklerinde, ara belleği ayırmaktan ve her sürücüye yapılan çağrıları sıralamaktan çerçeve 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ır model tutmasını isteyebilir. Örneğin, m1 modelini hazırlayın, m2'u hazırlayın, m1 üzerinde r1 isteğini yürütün, m2 üzerinde r2'ı yürütün, m1 üzerinde r3'ı yürütün, m2 üzerinde r4'i yürütün, m1'ü (Temizleme bölümünde açıklandığı şekilde) yayınlayın ve m2'u yayınlayın.

Kötü bir kullanıcı deneyimine (ör. ilk karede takılma) neden olabilecek yavaş bir ilk yürütme işlemini önlemek için sürücü, çoğu başlatma işlemini derleme aşamasında yapmalıdır. İlk çalıştırmadaki başlatma işlemi, büyük geçici arabellekleri ayırma veya bir cihazın saat hızını artırma gibi erken uygulandığında sistem sağlığını olumsuz yönde etkileyen işlemlerle 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 ilklendirmelerini yapmaları gerekebilir.

Android 10 veya sonraki sürümlerde, aynı hazırlanmış modele sahip birden fazla yürütmenin hızlı bir şekilde art arda yürütüldüğü durumlarda istemci, uygulama ile sürücü işlemleri arasında iletişim kurmak için bir yürütme patlaması nesnesi kullanmayı seçebilir. Daha fazla bilgi için Artımlı yürütmeler ve hızlı mesaj sıraları başlıklı makaleyi inceleyin.

Sürücü, art arda hızlı bir şekilde yapılan birden fazla yürütme işleminin performansını artırmak için 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 gözetleyici iş parçacığı oluşturmanız önerilir.

Çıkış şekli

Bir veya daha fazla çıkış operatörünün tüm boyutlarının belirtilmediği isteklerde, sürücü, yürütme işleminden sonra her çıkış operatörü için boyut bilgilerini içeren bir çıkış şekilleri listesi sağlamalıdır. Boyutlar hakkında daha fazla bilgi için OutputShape bölümüne bakın.

Bir yürütme, boyutu yetersiz bir çıkış arabelleği nedeniyle başarısız olursa sürücü, çıkış şekilleri listesinde hangi çıkış operatörlerinin yetersiz arabellek boyutuna sahip 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, derleme işlemi sırasında kullanılacak tek bir cihazı belirtmişse uygulama yürütme süresini isteyebilir. Ayrıntılar için MeasureTiming ve Cihaz Keşfi ve Atama başlıklı makaleyi inceleyin. Bu durumda, NN HAL 1.2 sürücüsü bir isteği yürütürken yürütme süresini ölçmeli veya UINT64_MAX değerini (sürenin kullanılamadığını belirtmek için) bildirmelidir. Sürücü, yürütme süresinin ölçülmesinden kaynaklanan performans cezalarını en aza indirmelidir.

Sürücü, Timing yapısında 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ünün 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 önceliklendirildiğinde veya bir kaynağın kullanılabilir olmasını beklediğinde) içermelidir.

Sürücünün yürütme süresini ölçmesi istenmediğinde veya yürütme hatası olduğunda sürücü, süreleri UINT64_MAX olarak bildirmelidir. Sürücüden yürütme süresini ölçmesi istendiğinde bile bunun yerine cihazdaki süre, sürücüdeki 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üreyi aşmalıdır.

Çitli yürütme

Android 11'de NNAPI, yürütme işlemlerinin bir sync_fence tutamaç listesi beklemesine ve isteğe bağlı olarak yürütme tamamlandığında sinyal gönderilen bir sync_fence nesnesi döndürmesine olanak tanır. Bu sayede küçük sıra modelleri ve akış kullanım alanları için ek maliyet azaltılır. Çitli yürütme, sync_fence sinyali gönderebilen veya bekleyebilen diğer bileşenlerle daha verimli birlikte çalışabilirlik sağlar. sync_fence hakkında daha fazla bilgi için Senkronizasyon çerçevesi başlıklı makaleyi inceleyin.

Çitli yürütmede çerçeve, beklemesi gereken bir senkronizasyon çitleri vektörü içeren hazırlanmış bir modelde çitli, eşzamansız yürütme başlatmak için IPreparedModel::executeFenced yöntemini çağırır. Asenkron görev, çağrı döndürülmeden önce tamamlanırsa sync_fence için boş bir herkese açık kullanıcı adı döndürülebilir. Çerçevenin hata durumu ve süre bilgilerini sorgulamasına izin vermek için bir IFencedExecutionCallback nesnesi de döndürülmelidir.

Bir yürütme tamamlandıktan sonra, yürütmenin süresini ölçen aşağıdaki iki zamanlama değeri IFencedExecutionCallback::getExecutionInfo aracılığıyla sorgulanabilir.

  • timingLaunched: executeFenced çağrıldıktan executeFenced döndürülen syncFence değerini bildirene kadar geçen süre.
  • timingFenced: yürütmenin beklediği tüm senkronizasyon çitlerinin sinyallendiği andan executeFenced'ın döndürülen syncFence değerini sinyallediğ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 tekrarlı olarak (WHILE) yürüten iki kontrol akışı işlemi (IF ve WHILE) içerir. Bunun nasıl uygulanacağı hakkında daha fazla bilgi için Kontrol akışı bölümüne bakın.

Hizmet kalitesi

Android 11'de NNAPI, bir uygulamanın modellerinin göreceli önceliklerini, bir modelin hazırlanması için beklenen maksimum süreyi ve bir yürütmenin tamamlanması için beklenen maksimum süreyi belirtmesine olanak tanıyarak iyileştirilmiş hizmet kalitesi (HK) sunar. Daha fazla bilgi için Hizmet Kalitesi bölümüne bakın.

Temizle

Bir uygulama, hazırlanmış bir modeli kullanmayı bitirdiğinde çerçeve, @1.3::IPreparedModel nesnesine referansını serbest bırakır. IPreparedModel nesnesi artık referans almadığında, onu oluşturan sürücü hizmetinde otomatik olarak imha edilir. Modele özgü kaynaklar, sürücünün yıkıcıyı uygulaması sırasında bu sırada yeniden kullanılabilir. Sürücü hizmeti, IPreparedModel nesnesinin artık istemci tarafından ihtiyaç duyulmadığında otomatik olarak yok edilmesini istiyorsa IPreparedeModel nesnesi IPreparedModelCallback::notify_1_3 aracılığıyla döndürüldükten sonra IPreparedModel nesnesine dair hiç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ını gerçekleştirmek için CPU'yu kullanmamalıdır. Aksi takdirde, çerçevenin işi doğru şekilde dağıtma özelliği etkilenir. Sürücü, işleyemediği bölümleri çerçeveye bildirmeli ve geri kalanı çerçevenin işlemesine izin vermelidir.

Çerçeve, tedarikçi firma tarafından tanımlanan işlemler hariç tüm NNAPI işlemleri için bir CPU uygulaması sağlar. Daha fazla bilgi için Tedarikçi Uzantıları başlıklı makaleyi inceleyin.

Android 10'da kullanıma sunulan (API düzeyi 29) işlemler, yalnızca CTS ve VTS testlerinin doğru olduğunu doğrulamak için referans bir CPU uygulamasına sahiptir. Mobil makine öğrenimi çerçevelerine dahil edilen optimize edilmiş uygulamalar, NNAPI CPU uygulamasına tercih edilir.

Yardımcı işlevler

NNAPI kod tabanı, sürücü hizmetleri tarafından kullanılabilen yardımcı işlevler içerir.

frameworks/ml/nn/common/include/Utils.h dosyası, günlük kaydı ve farklı NN HAL sürümleri arasında dönüştürme için kullanılanlar gibi çeşitli yardımcı program işlevleri içerir.

  • Video günlüğü: VLOG, Android'in LOG özelliğinin etrafında bir sarmalayıcı makrosudur ve yalnızca debug.nn.vlog mülkünde uygun etiket ayarlanmışsa mesajı günlüğe kaydeder. VLOG çağrılarından önce initVLogMask() çağrılmalıdır. VLOG_IS_ON makrosu, VLOG'un şu anda etkin olup olmadığını kontrol etmek için kullanılabilir. Böylece, gerekli olmadığında karmaşık günlük kaydı kodunun atlanması sağlanır. Özelliğin değeri aşağıdakilerden biri olmalıdır:

    • Günlüğe kayıt yapılmayacağını belirten boş bir dize.
    • Tüm günlük kayıtlarının yapılması gerektiğini belirten jeton 1 veya all.
    • Hangi günlük kaydının yapılacağını belirten, boşluk, virgül veya iki nokta işaretiyle ayrılmış etiketlerin listesi. Etiketler compilation, cpuexe, driver, execution, manager ve model'dir.
  • compliantWithV1_*: Bir NN HAL nesnesi bilgi kaybetmeden 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, model NN HAL 1.1 veya NN HAL 1.2'de kullanıma sunulan işlem türlerini içeriyorsa V1_2::Model üzerinde compliantWithV1_0 çağrısı yapıldığında false döndürülür.

  • convertToV1_*: NN HAL nesnesini bir sürümden diğerine dönüştürür. Dönüşüm bilgi kaybına neden olursa (yani türün yeni sürümü değeri tam olarak temsil edemiyorsa) bir uyarı kaydedilir.

  • Özellikler: nonExtensionOperandPerformance ve update işlevleri, Capabilities::operandPerformance alanını oluşturmaya yardımcı olmak için kullanılabilir.

  • Aşağıdaki türlerdeki mülkleri sorgulamak: isExtensionOperandType, isExtensionOperationType, nonExtensionSizeOfData, nonExtensionOperandSizeOfData, nonExtensionOperandTypeIsScalar, tensorHasUnspecifiedDimensions.

frameworks/ml/nn/common/include/ValidateHal.h dosyası, bir NN HAL nesnesinin HAL sürümünün spesifikasyonuna göre geçerli olup olmadığını doğrulamak için yardımcı işlevler içerir.

  • validate*: NN HAL nesnesi, HAL sürümünün spesifikasyonuna göre geçerliyse true değerini döndürür. OEM türleri ve uzantı türleri doğrulanmaz. Örneğin, model var olmayan bir operand dizine referans veren bir işlem veya söz konusu HAL sürümünde desteklenmeyen bir işlem içeriyorsa validateModel false döndürür.

frameworks/ml/nn/common/include/Tracing.h dosyası, systracing bilgilerini yapay zeka ağı koduna eklemeyi kolaylaştıran makrolar içerir. Örnek olarak, örnek sürücüdeki NNTRACE_* makro çağrılarına bakabilirsiniz.

frameworks/ml/nn/common/include/GraphDump.h dosyası, hata ayıklama amacıyla Model içeriğini grafik biçimde dökmek için bir yardımcı program işlevi içerir.

  • graphDump: Modelin Graphviz (.dot) biçimindeki bir temsilini, belirtilen akışa (sağlandıysa) veya logcat'e (akış sağlanmadıysa) yazar.

Doğrulama

NNAPI uygulamanızı test etmek için Android çerçevesine dahil edilen VTS ve CTS testlerini kullanın. VTS, sürücülerinizi doğrudan (çerç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 şekilde çalıştığını ve hassasiyet koşullarını karşılayan sonuçlar sağladığını doğrular.

NNAPI için CTS ve VTS'deki hassasiyet koşulları aşağıdaki gibidir:

  • Kayan nokta: abs(beklenen - gerçek) <= atol + rtol  * abs(beklenen); burada:

    • fp32 için atol = 1e-5f, rtol = 5.0f * 1.1920928955078125e-7
    • fp16 için, atol = rtol = 5,0f * 0,0009765625f
  • Kuantize edilmiş: Bir eksik (üç eksik olan mobilenet_quantized hariç)

  • Boole: tam eşleme

CTS'nin NNAPI'yi test etme yöntemlerinden biri, her sürücüden gelen yürütme sonuçlarını NNAPI referans uygulamasıyla test etmek ve karşılaştırmak için kullanılan sabit sözde rastgele grafikler oluşturmaktır. NN HAL 1.2 veya sonraki sürümleri kullanan sürücülerde, sonuçlar hassasiyet ölçütlerini karşılamıyorsa CTS bir hata bildirir ve hata ayıklama için başarısız modelin spesifikasyon dosyasını /data/local/tmp altına aktarır. Hassasiyet ölçütleri hakkında daha fazla bilgi için TestRandomGraph.cpp ve TestHarness.h bölümüne bakın.

Fuzz testi

Boşluk testi, beklenmedik girişler gibi faktörler nedeniyle test edilen kodda kilitlenmeler, iddialar, bellek ihlalleri veya genel olarak tanımlanmamış davranışları bulmak için yapılır. Android, NNAPI fuzz testi için libFuzzer'a dayalı testler kullanır. Bu testler, yeni rastgele girişler oluşturmak için önceki test durumlarının satır kapsamını kullandığından fuzzing işleminde etkilidir. Örneğin, libFuzzer yeni kod satırlarında çalışan test durumlarını tercih eder. Bu sayede, testlerin sorunlu kodu bulmak için harcadığı süre önemli ölçüde azaltılır.

Sürücü uygulamanızı doğrulamak için fuzz testi yapmak istiyorsanız AOSP'de bulunan libneuralnetworks_driver_fuzzer test yardımcı programındaki frameworks/ml/nn/runtime/test/android_fuzzing/DriverFuzzTest.cpp öğesini sürücü kodunuzu içerecek şekilde değiştirin. NNAPI fuzz testi hakkında daha fazla bilgi için frameworks/ml/nn/runtime/test/android_fuzzing/README.md bölümüne bakın.

Güvenlik

Uygulama süreçleri 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 adresindedir.

Sürücüler, aynı cihazı kullanan uygulamaların diğer uygulamalara müdahale etmediğinden de emin olmalıdır.

Android Makine Öğrenimi Test Paketi

Android Makine Öğrenimi Test Paketi (MLTS), tedarikçi cihazlardaki gerçek modellerin doğruluğunu doğrulamak için CTS ve VTS'ye dahil edilmiş 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'da ç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ına olanak tanır.

Android platform geliştiricileri, sürücülerin gecikmesini ve doğruluğunu değerlendirmek için MLTS'yi de kullanır.

NNAPI karşılaştırması, AOSP'deki iki projede bulunabilir:

Modeller ve veri kümeleri

NNAPI karşılaştırmasında aşağıdaki modeller ve veri kümeleri kullanılır.

  • Open Images Dataset v4'ün küçük bir alt kümesinde (1.500 resim) çalıştırılan, farklı boyutlarda kesirli ve u8 olarak kesikli MobileNetV1.
  • Open Images Dataset v4'ün küçük bir alt kümesinde (1.500 resim) çalıştırılan, farklı boyutlarda kesirli ve u8 olarak kesikli MobileNetV2.
  • CMU Arctic veri kümesinin küçük bir alt kümesine karşı çalıştırılan, metinden sese dönüştürme için uzun kısa süreli bellek (LSTM) tabanlı akustik model.
  • LibriSpeech veri kümesinin küçük bir alt kümesine karşı çalıştırılan, otomatik konuşma tanıma için LSTM tabanlı akustik model.

Daha fazla bilgi için platform/test/mlts/models başlıklı makaleyi inceleyin.

Stres testi

Android Makine Öğrenimi Testi Paketi, sürücülerin yoğun kullanım koşullarında veya istemcilerin davranışıyla ilgili köşe durumlarına karşı direncini doğrulamak için bir dizi kilitlenme testi içerir.

Tüm kilitlenme testleri aşağıdaki özellikleri sunar:

  • Askıya alma algılama: NNAPI istemcisi bir test sırasında askıya alınırsa test, HANG hata nedeniyle başarısız olur ve test paketi bir sonraki teste geçer.
  • NNAPI istemci kilitlenme algılama: Testler istemci kilitlenmelerinden etkilenmez ve CRASH hata nedeniyle başarısız olur.
  • Sürücü kilitlenmesi 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 kilitlenmeler olabileceğini unutmayın. Bu tür hataları kapsayacak şekilde, sürücüyle ilgili hatalar veya kilitlenmeler için sistem günlüğünde tailkomutunu çalıştırmanız önerilir.
  • Kullanılabilir tüm hızlandırıcıların hedeflenmesi: Testler, mevcut tüm sürücülerle çalıştırılır.

Tüm çarpışma testlerinin dört olası sonucu vardır:

  • SUCCESS: Yürütme hatasız tamamlandı.
  • FAILURE: Yürütme başarısız oldu. Genellikle bir model test edilirken ortaya çıkan bir hatadan kaynaklanır ve sürücünün modeli derleyemediğini veya yürütemediğini gösterir.
  • HANG: Test işlemi yanıt vermeyi bıraktı.
  • CRASH: Test süreci kilitlendi.

Stres 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. Hedef cihazı iş istasyonunuza bağlayın ve adb üzerinden erişilebildiğinden emin olun. Birden fazla cihaz bağlıysa hedef cihaz ANDROID_SERIAL ortam değişkenini dışa aktarın.
  2. cd dosyasını 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 karşılaştırma çalışmasının sonunda sonuçlar HTML sayfası olarak sunulur ve xdg-open adresine iletilir.

Daha fazla bilgi için platform/test/mlts/benchmark/README.txt başlıklı makaleyi inceleyin.

Nöral Ağlar HAL sürümleri

Bu bölümde, Android ve Neural Networks HAL sürümlerinde yapılan değişiklikler açıklanmaktadır.

Android 11

Android 11, aşağıdaki önemli değişiklikleri içeren NN HAL 1.3'ü kullanıma sunar.

  • NNAPI'de imzalı 8 bit kesme desteği. TENSOR_QUANT8_ASYMM_SIGNED işlenen türünü ekler. NN HAL 1.3'e sahip ve imzalanmamış kesmeyle işlemleri destekleyen sürücüler, bu işlemlerin imzalı varyantlarını da desteklemelidir. Çoğu kesikli işlemin imzalı ve imzasız sürümleri çalıştırıldığında sürücüler, 128'e kadar ofsetle aynı sonuçları üretmelidir. Bu şartın beş istisnası vardır: CAST, HASHTABLE_LOOKUP, LSH_PROJECTION, PAD_V2 ve QUANTIZED_16BIT_LSTM. QUANTIZED_16BIT_LSTM işlemi, işaretli operatörleri desteklemez. Diğer dört işlem, işaretli kesme işlemini destekler ancak sonuçların aynı olmasını gerektirmez.
  • Çerçevenin, beklemesi gereken bir senkronizasyon çitleri vektörü içeren hazırlanmış bir modelde çitli, eşzamansız bir yürütme başlatmak için IPreparedModel::executeFenced yöntemini çağırdığı çitli yürütmeler için destek. Daha fazla bilgi için Çitli yürütme bölümüne bakın.
  • Kontrol akışı desteği. Diğer modelleri bağımsız değişken olarak 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 Denetimli akış bölümüne bakın.
  • Uygulamalar, modellerinin göreceli önceliklerini, bir modelin hazırlanması için beklenen maksimum süreyi ve bir yürütmenin tamamlanması için beklenen maksimum süreyi belirtebildiğinden daha iyi hizmet kalitesi (HK). Daha fazla bilgi için Hizmet Kalitesi başlıklı makaleyi inceleyin.
  • Sürücü tarafından yönetilen arabellekler için ayırıcı arayüzleri sağlayan bellek alanları desteği. Bu sayede, cihazın yerel bellekleri yürütmeler arasında aktarılabilir. Böylece aynı sürücüdeki art arda yürütmeler arasında gereksiz veri kopyalama ve dönüştürme işlemleri engellenir. Daha fazla bilgi için Bellek alanları başlıklı makaleyi inceleyin.

Android 10

Android 10, aşağıdaki önemli değişiklikleri içeren NN HAL 1.2'yi kullanıma sunar.

  • Capabilities yapı, skaler veri türleri dahil tüm veri türlerini içerir ve adlandırılmış alanlar yerine bir vektör kullanarak rahatlatılmamış performansı temsil eder.
  • getVersionString ve getType yöntemleri, çerçevenin cihaz türünü (DeviceType) ve sürüm bilgilerini almasına olanak tanır. Cihaz Keşfi ve Atama başlıklı makaleyi inceleyin.
  • executeSynchronously yöntemi, yürütmeyi eşzamanlı olarak gerçekleştirmek için varsayılan olarak çağrılır. execute_1_2 yöntemi, çerçeveye eşzamansız olarak yürütme yapmasını söyler. Yürütme 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 raporlanır. Zamanlama bölümüne bakın.
  • Bir veya daha fazla çıkış operatörünün bilinmeyen bir boyuta veya rütbeye sahip olduğu yürütmeler için destek. Çıkış şekli bölümüne bakın.
  • Satıcı tanımlı işlem ve veri türlerinden oluşan satıcı uzantıları için destek. Sürücü, IDevice::getSupportedExtensions yöntemiyle desteklenen uzantıları raporlar. Tedarikçi Uzantıları başlıklı makaleyi inceleyin.
  • Bir toplu işlem nesnesinin, uygulama ile sürücü işlemleri arasında iletişim kurmak için hızlı mesaj sıraları (FMQ'ler) kullanarak bir dizi toplu işlem yürütmeyi kontrol etme ve böylece gecikmeyi azaltma özelliği. Burst Executions and Fast Message Queues (Burst Executions ve Hızlı Mesaj Kuyrukları) başlıklı makaleyi inceleyin.
  • Sürücünün verileri kopyalamadan yürütme yapmasına izin vermek için AHardwareBuffer desteği. AHardwareBuffer konusuna bakın.
  • Bir uygulama başlatıldığında derleme için harcanan süreyi azaltmak amacıyla derleme yapılarının önbelleğe alınmasıyla ilgili destek iyileştirilmiştir. Derleme Önbelleğe Alma başlıklı makaleyi inceleyin.

Android 10, aşağıdaki operatör türlerini ve işlemlerini kullanıma sunar.

  • İşaretçi 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 çoğunda güncellemeler sunar. Güncellemeler temel olarak aşağıdakilerle ilgilidir:

  • NCHW bellek düzeni desteği
  • Yumuşak maksimum ve normalleştirme işlemlerinde 4'ten farklı rütbeye sahip tenzorlar için destek
  • Genişletilmiş konvolüsyonlar için destek
  • ANEURALNETWORKS_CONCATENATION'te karma kesme içeren girişler için destek

Aşağıdaki listede, Android 10'da değiştirilen işlemler gösterilmektedir. Değişikliklerin tüm ayrıntıları için NNAPI referans dokümanlarında OperationCode'a bakın.

  • ANEURALNETWORKS_ADD
  • ANEURALNETWORKS_AVERAGE_POOL_2D
  • ANEURALNETWORKS_BATCH_TO_SPACE_ND
  • ANEURALNETWORKS_CONCATENATION
  • ANEURALNETWORKS_CONV_2D
  • ANEURALNETWORKS_DEPTHWISE_CONV_2D
  • ANEURALNETWORKS_DEPTH_TO_SPACE
  • ANEURALNETWORKS_DEQUANTIZE
  • ANEURALNETWORKS_DIV
  • ANEURALNETWORKS_FLOOR
  • ANEURALNETWORKS_FULLY_CONNECTED
  • ANEURALNETWORKS_L2_NORMALIZATION
  • ANEURALNETWORKS_L2_POOL_2D
  • ANEURALNETWORKS_LOCAL_RESPONSE_NORMALIZATION
  • ANEURALNETWORKS_LOGISTIC
  • ANEURALNETWORKS_LSH_PROJECTION
  • ANEURALNETWORKS_LSTM
  • ANEURALNETWORKS_MAX_POOL_2D
  • ANEURALNETWORKS_MEAN
  • ANEURALNETWORKS_MUL
  • ANEURALNETWORKS_PAD
  • ANEURALNETWORKS_RELU
  • ANEURALNETWORKS_RELU1
  • ANEURALNETWORKS_RELU6
  • ANEURALNETWORKS_RESHAPE
  • ANEURALNETWORKS_RESIZE_BILINEAR
  • ANEURALNETWORKS_RNN
  • ANEURALNETWORKS_ROI_ALIGN
  • ANEURALNETWORKS_SOFTMAX
  • ANEURALNETWORKS_SPACE_TO_BATCH_ND
  • ANEURALNETWORKS_SPACE_TO_DEPTH
  • ANEURALNETWORKS_SQUEEZE
  • ANEURALNETWORKS_STRIDED_SLICE
  • ANEURALNETWORKS_SUB
  • ANEURALNETWORKS_SVDF
  • ANEURALNETWORKS_TANH
  • ANEURALNETWORKS_TRANSPOSE

Android 9

NN HAL 1.1, Android 9'da kullanıma sunulmuştur ve aşağıdaki önemli değişiklikleri içerir.

  • IDevice::prepareModel_1_1, ExecutionPreference parametresi içeriyor. Sürücü, uygulamanın pili korumayı tercih ettiğini veya modeli art arda hızlı çağrılarda çalıştıracağını bilerek hazırlıkları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 değerini true olarak ayarlayarak 32 bitlik kayan nokta hesaplamalarının 16 bitlik kayan nokta aralığı ve/veya hassasiyeti kullanılarak çalıştırılabileceğini belirtebilir. Sürücünün, rahat performansını çerçeveye bildirebilmesi için Capabilities struct'ta relaxedFloat32toFloat16Performance ek alanı bulunur.

Android 8.1

İlk Nöral Ağlar HAL'i (1.0), Android 8.1'de kullanıma sunuldu. Daha fazla bilgi için /neuralnetworks/1.0/ konusuna bakın.