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 bakış sunulmaktadır. Daha ayrıntılı bilgi 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.

Neural Networks API hakkında daha fazla bilgi için Neural Networks API'ye bakın.

Sinir Ağları HAL'si

Sinir Ağları (NN) HAL'si, bir üründe (ör. telefon veya tablet) bulunan grafik işleme birimleri (GPU'lar) ve dijital sinyal işlemciler (DSP'ler) gibi çeşitli cihazların soyutlanması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ımlama dosyalarında belirtilmiştir.

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

Sinir Ağları akışı

Şekil 1. Sinir Ağları akışı

Başlatma

Başlatma sırasında çerçeve, IDevice::getCapabilities_1_3 kullanarak sürücüyü özelliklerini sorgular. @1.3::Capabilities yapısı, tüm veri türlerini içerir ve bir vektör kullanarak serbest olmayan performansı temsil eder.

Çerçeve, hesaplamaların mevcut cihazlara nasıl ayrılacağını belirlemek için her bir sürücünün bir işlemi ne kadar hızlı ve enerji verimli bir şekilde gerçekleştirebileceğini anlamaya yönelik özelliklerden yararlanır. Sürücü, bu bilgileri sağlamak için referans iş yüklerinin yürütülmesine dayalı standart performans sayıları sağlamalıdır.

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

Android 9 ve önceki sürümlerde Capabilities yapısı, yalnızca kayan nokta ve nicel tensörler için sürücü performansı bilgilerini içerir, 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 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 raporlamasını bekler. Aksi takdirde, bu sürücüyü kullanan bir uygulamanın performansı düşebilir veya hatalı davranış ortaya çıkabilir.

Derleme

Çerçeve, bir uygulamadan istek aldığında hangi cihazların kullanılacağını belirler. Android 10'da uygulamalar, çerçevenin seçeceği cihazları keşfedip belirtebilir. Daha fazla bilgi için Cihaz Bulma ve Atama bölümüne bakın.

Model derleme zamanında çerçeve, IDevice::getSupportedOperations_1_3 yöntemini çağırarak modeli her aday sürücüye gönderir. Her sürücü, modelin hangi işlemlerinin desteklendiğini gösteren bir boole dizisi döndürür. Sürücü, çeşitli nedenlerden dolayı belirli bir işlemi destekleyemediğini belirleyebilir. Örnek:

  • Sürücü, veri türünü desteklemiyor.
  • Sürücü yalnızca belirli giriş parametrelerine sahip işlemleri destekler. Örneğin, bir sürücü 3x3 ve 5x5'i destekleyebilir, ancak 7x7 konvolüsyon işlemlerini destekleyemez.
  • Sürücünün, büyük grafikleri veya girişleri işlemesini engelleyen bellek kısıtlamaları vardır.

Derleme sırasında, modelin OperandLifeTime bölümünde açıklandığı üzere giriş, çıkış ve dahili işlem görenlerin boyutları veya sıralaması bilinmeyen olabilir. Daha fazla bilgi için Çıktı şekli bölümüne bakın.

Çerçeve, seçilen her sürücüye IDevice::prepareModel_1_3 çağrısı yaparak modelin bir alt kümesini yürütmeye hazırlanması talimatını verir. 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 cihaz belleği parçaları gibi kaynaklar derleme sırasında atanmamalıdır.

Başarılı olduğunda, sürücü bir @1.3::IPreparedModel tutma yeri 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.

Sürücü, uygulama başlatıldığında derleme için kullanılan süreyi kısaltmak için derleme yapılarını önbelleğe alabilir. Daha fazla bilgi için Derleme Önbelleğe Alma bölümüne bakın.

Uygulama

Bir uygulama, çerçeveden bir isteği yürütmesini istediğinde çerçeve, hazır bir modelde eşzamanlı yürütme gerçekleştirmek için varsayılan olarak IPreparedModel::executeSynchronously_1_3 HAL yöntemini çağırır. Bir istek ayrıca execute_1_3 yöntemi ve executeFenced yöntemi (bkz. Fencereli yürütme) kullanılarak eşzamansız olarak yürütülebilir veya seri çekim yürütme ile yürütülebilir.

Kontrol, uygulama sürecine yalnızca yürütme tamamlandıktan sonra geri döndüğünden, eşzamanlı yürütme çağrıları eşzamansız çağrılara kıyasla performansı iyileştirir ve iş parçacığı ek yükünü azaltır. Yani sürücü, uygulama işlemine bir yürütmenin tamamlandığını bildirmek için ayrı bir mekanizmaya ihtiyaç duymaz.

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

Yürütme yöntemine iletilen Request parametresi, yürütme için kullanılan giriş ve çıkış işlenenlerini listeler. İşlem gören verileri depolayan bellek, en yavaş öğenin yinelendiği ilk boyut olmak üzere satır-ana sıralamayı kullanmalı ve hiçbir satırın sonunda dolgu içermemelidir. İşlem gören türleri hakkında daha fazla bilgi için İşlenenler bölümüne bakın.

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 ya da bilinmeyen bir sıralamaya sahip olabilir. En az bir çıkış işleneninin boyutu veya sıralaması bilinmeyen olduğunda, sürücü dinamik olarak boyutlandırılmış çıkış bilgileri döndürmelidir.

NN HAL 1.1 veya daha düşük sürümlere sahip sürücüler için, yalnızca bir istek tamamlandığında hata durumu döndürülür. Yürütmenin başarıyla tamamlanması için giriş ve çıkış işlenenlerinin boyutları tam olarak belirtilmelidir. Dahili işlenenlerin bir veya daha fazla bilinmeyen boyutu olabilir, ancak bunların sıralaması belirtilmelidir.

Birden fazla sürücüye yayılan kullanıcı istekleri için çerçeve, ara belleği ayırmaktan ve çağrıları her bir sürücüye sıralamaktan sorumludur.

Aynı @1.3::IPreparedModel üzerinde paralel olarak birden fazla istek başlatılabilir. Sürücü, istekleri paralel olarak yürütebilir veya yürütmeleri serileştirebilir.

Çerçeve, sürücüden birden fazla hazır model tutmasını isteyebilir. Örneğin, m1 modelini hazırlayın, m2 öğesini hazırlayın, m1 tarihinde r1 isteğini yürütün, m2 tarihinde r2 yöntemini yürütün, m1 üzerinde r3 yürütün, m2 üzerinde r4 yürütmeyi, m1 sürümünü yayınlayın (Temizlik bölümünde açıklanmıştır) ve m2 sürümünü yayınlayın.

Kötü kullanıcı deneyimine neden olabilecek yavaş bir ilk yürütme (örneğin, ilk kare takılması) önlemek için sürücü, çoğu başlatma işlemini derleme aşamasında gerçekleştirmelidir. İlk çalıştırma sırasında başlatma işlemi, erken başlatıldığında sistem sağlığını olumsuz etkileyen işlemlerle (ör. büyük geçici arabelleklerin ayrılması veya cihazın saat hızının artırılması) sınırlı olmalıdır. Yalnızca sınırlı sayıda eşzamanlı model hazırlayabilen sürücülerin ilk kullanıma hazırlama işlemini ilk çalıştırma sırasında yapması gerekebilir.

Android 10 veya sonraki sürümlerde, aynı hazırlanan modelle birden fazla yürütme işleminin hızlı bir şekilde arka arkaya yürütüldüğü durumlarda istemci, uygulama ile sürücü işlemleri arasında iletişim kurmak için bir yürütme seri işlem nesnesi kullanmayı tercih edebilir. Daha fazla bilgi için Seri Yürütme İşlemleri ve Hızlı Mesaj Sıraları sayfasına göz atın.

Hızlı bir şekilde arka arkaya birden fazla yürütmenin performansını artırmak için sürücü, geçici arabellekleri tutabilir veya saat hızlarını artırabilir. Belirli bir süre sonunda yeni istek oluşturulmazsa kaynakları serbest bırakmak için bir güvenlik zamanlayıcısı iş parçacığı oluşturmanız önerilir.

Çıktı şekli

Bir veya daha fazla çıkış işleneninin tüm boyutların belirtilmediği istekler için sürücü, yürütme işleminden sonra her çıkış işleneninin boyut bilgilerini içeren çıkış şekillerinin bir listesini sağlamalıdır. Boyutlar hakkında daha fazla bilgi için OutputShape konusuna bakın.

Yürütme işlemi, çıktı arabelleğinin küçük olması nedeniyle başarısız olursa sürücü, çıkış şekilleri listesinde hangi çıkış işlenenlerinin tampon boyutunun yetersiz olduğunu belirtmeli ve bilinmeyen boyutlar için sıfır kullanarak mümkün olduğunca çok boyut bilgisi rapor etmelidir.

Zamanlama

Android 10'da, derleme işlemi sırasında kullanılacak tek bir cihaz belirtilmişse uygulamalar yürütme süresini sorabilir. Ayrıntılar için MeasureTiming ile Cihaz Keşfi ve Atama bölümünü inceleyin. Bu durumda, NN HAL 1.2 sürücüsü bir istek yürütürken yürütme süresini ölçmeli veya UINT64_MAX (sürenin kullanılamadığını belirtmek için) rapor etmelidir. Sürücü, yürütme süresinin ölçülmesinden kaynaklanan performans cezalarını en aza indirmelidir.

Sürücü, Timing yapısında mikrosaniye cinsinden aşağıdaki süreleri bildirir:

  • Cihazda yürütme süresi: Ana makine işlemcisinde çalışan sürücüdeki yürütme süresini içermez.
  • Sürücüdeki yürütme süresi: Cihazdaki yürütme süresini içerir.

Bu süreler, yürütmenin askıya alındığı zamanı içermelidir (örneğin, yürütmenin başka görevler tarafından geçici olarak durdurulduğu veya bir kaynağın kullanılabilir olmasını beklerken).

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 istense bile, bunun yerine cihazda, sürücüde geçirilen süre veya her ikisi için UINT64_MAX değerini raporlayabilir. Sürücü, her iki süreyi de UINT64_MAX dışında bir değer olarak bildirdiğinde, sürücüdeki yürütme süresi cihazdaki süreye eşit veya bundan fazla olmalıdır.

Özel yürütme

Android 11'de NNAPI, yürütmelerin sync_fence tutma yeri listesini beklemesine ve isteğe bağlı olarak yürütme tamamlandığında sinyal verilen bir sync_fence nesnesi döndürmesine olanak tanır. Bu da küçük sıralı modeller ve akış kullanım alanları için ek yükü azaltır. Özel yürütme, sync_fence sinyalini oluşturabilen veya bekleyebilecek diğer bileşenlerle daha verimli bir birlikte çalışabilirlik sağlar. sync_fence hakkında daha fazla bilgi için Senkronizasyon çerçevesi bölümüne bakın.

Özel çerçeveli yürütmede çerçeve, IPreparedModel::executeFenced yöntemini çağırarak hazır bir model üzerinde, beklenmesi gereken senkronizasyon çitleri vektörüne sahip, bağımsız, eşzamansız bir yürütme işlemi başlatmak için kullanılır. Eşzamansız görev, çağrı geri gelmeden önce tamamlanırsa sync_fence için boş bir herkese açık kullanıcı adı döndürülebilir. Çerçevenin hata durumu ve süre bilgilerini sorgulamasına olanak tanımak için bir IFencedExecutionCallback nesnesi de döndürülmelidir.

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

  • timingLaunched: executeFenced, döndürülen syncFence öğesini işaretlediğinde executeFenced çağrıldığı andan itibaren geçen süre.
  • timingFenced: executeFenced, döndürülen syncFence öğesini bildirdiğinde, yürütmenin beklediği tüm senkronizasyon engellerinin işaretlendiği süre.

Akışı kontrol etme

NNAPI, Android 11 veya sonraki sürümleri çalıştıran cihazlar için IF ve WHILE adlı iki kontrol akışı işlemi içerir. Bu işlemler, diğer modelleri bağımsız değişken olarak alıp koşullu olarak (IF) veya tekrar tekrar (WHILE) yürütür. Bunun nasıl uygulanacağı hakkında daha fazla bilgi için Kontrol akışı bölümüne bakın.

Hizmet kalitesi

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

Temizle

Bir uygulama, hazırlanan bir modeli kullanarak tamamladığında çerçeve, çerçevenin @1.3::IPreparedModel nesnesine referansını serbest bırakır. IPreparedModel nesnesine artık başvuruda bulunulmadığında bu nesne, nesneyi oluşturan sürücü hizmetinde otomatik olarak kaldırılır. Modele özgü kaynaklar, şu anda sürücünün yıkıcıyı uygularken geri çekilebilir. Sürücü hizmeti, IPreparedModel nesnesinin artık istemciye ihtiyaç duymadığında otomatik olarak kaldırılmasını istiyorsa IPreparedeModel nesnesi IPreparedModelCallback::notify_1_3 aracılığıyla döndürüldükten sonra IPreparedModel nesnesine herhangi bir referans tutmamalıdır.

CPU kullanımı

Sürücülerin hesaplamaları ayarlamak için CPU'yu kullanması beklenir. Sürücüler, grafik hesaplamaları yapmak için CPU'yu kullanmamalıdır. Çünkü bu, çerçevenin işleri doğru şekilde paylaştırmasını engeller. Sürücü, işleyemediği bölümleri çerçeveye bildirmeli ve gerisini çerçeveye bırakmalıdır.

Çerçeve, satıcı tarafından tanımlanan işlemler hariç tüm NNAPI işlemleri için CPU uygulaması sağlar. Daha fazla bilgi için Tedarikçi Firma Uzantıları bölümüne bakın.

Android 10'da (API düzeyi 29) sunulan işlemler, yalnızca CTS ve VTS testlerinin doğru olduğunu onaylamak için bir referans CPU uygulaması içerir. NNAPI CPU uygulaması yerine, mobil makine öğrenimi çerçevelerindeki optimize edilmiş uygulamalar tercih edilir.

Yardımcı işlevler

NNAPI kod tabanı, sürücü hizmetleri tarafından kullanılabilecek yardımcı program işlevleri 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şlemleri için kullanılanlar gibi çeşitli yardımcı program işlevlerini içerir.

  • VLogging: VLOG, Android LOG çevresinde bir sarmalayıcı makrosudur ve mesajı yalnızca debug.nn.vlog özelliğinde uygun etiket ayarlanmışsa günlüğe kaydeder. initVLogMask(), VLOG çağrılarından önce çağrılmalıdır. VLOG_IS_ON makrosu, VLOG öğesinin etkin olup olmadığını kontrol etmek için kullanılabilir. Böylece, gerekli olmayan karmaşık günlük kaydı kodunun atlanması sağlanır. Özelliğin değeri şunlardan biri olmalıdır:

    • Hiçbir günlük kaydı yapılmayacağını belirten boş bir dize.
    • Tüm günlük kayıtlarının gerçekleştirileceğini belirten 1 veya all jetonu.
    • Boşluk, virgül veya iki nokta ile ayrılmış ve hangi günlük kaydının yapılacağını belirten bir etiket listesi. Etiketler compilation, cpuexe, driver, execution, manager ve model şeklindedir.
  • compliantWithV1_*: Bir NN HAL nesnesi bilgi kaybetmeden aynı türdeki farklı bir HAL sürümüne dönüştürülebiliyorsa true değerini döndürür. Örneğin, V1_2::Model üzerinde compliantWithV1_0 çağrısı, model NN HAL 1.1 veya NN HAL 1.2'de sunulan işlem türlerini içeriyorsa false değerini döndürü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 gösteremiyorsa) bir 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ürdeki özellikleri sorgulama: 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ğrulamak için yardımcı program işlevleri 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 işlem gören dizine başvuruda bulunan veya o HAL sürümünde desteklenmeyen bir işlem içeriyorsa validateModel false değerini döndürür.

frameworks/ml/nn/common/include/Tracing.h dosyası, Nöral Ağları koduna sistrasyon bilgisi eklemeyi basitleştirmek için makrolar içerir. Örnek için örnek sürücüdeki NNTRACE_* makro çağrılarına bakın.

frameworks/ml/nn/common/include/GraphDump.h dosyası, hata ayıklama amacıyla Model içeriğinin dökümünü grafik şeklinde veren bir yardımcı program işlevi içerir.

  • graphDump: Modelin bir gösterimini Graphviz (.dot) biçiminde belirtilen akışa (sağlanmışsa) veya logcat'e (akış sağlanmamışsa) yazar.

Doğrulama

NNAPI uygulamanızı test etmek için Android çerçevesine dahil olan VTS ve CTS testlerini kullanın. VTS, sürücülerinizi doğrudan (çerçeve kullanmadan) çalıştırırken CTS, sürücülerinizi çerçeve üzerinden dolaylı olarak uygular. Bu araçlar tüm API yöntemlerini test edip sürücüler tarafından desteklenen tüm işlemlerin doğru şekilde çalıştığını ve hassasiyet gereksinimlerini karşılayan sonuçlar sağladığını doğrular.

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

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

    • fp32 için atol = 1e-5f, rtol = 5.0f * 1.1920928955078125e-7
    • fp16 için atol = rtol = 5.0f * 0.0009765625f
  • Nicel: tek tek (üç kapalı mobilenet_quantized hariç)

  • Boole: tam eşleme

CTS'nin NNAPI'yi test etmenin bir yolu, her bir sürücünün yürütme sonuçlarını NNAPI referans uygulamasıyla test edip karşılaştırmak için kullanılan sabit sahte rastgele grafikler oluşturmaktır. NN HAL 1.2 veya sonraki sürümleri olan sürücüler için, sonuçlar kesinlik ölçütlerini karşılamıyorsa CTS, hata bildirir ve başarısız olan model için hata ayıklama amacıyla /data/local/tmp altına bir spesifikasyon dosyası atar. Hassasiyet ölçütleri hakkında daha fazla bilgi için TestRandomGraph.cpp ve TestHarness.h bölümlerine bakın.

Fuzz testi

Fuz testinin amacı, beklenmedik girişler gibi faktörler nedeniyle test edilen kodda kilitlenmeleri, onaylamaları, bellek ihlallerini veya genel ve tanımlanmamış davranışları bulmaktır. Android, NNAPI fuzz testi için libFuzzer'a dayalı testleri kullanır. Bu testler, yeni rastgele girişler oluşturmak için önceki test durumlarının çizgi kapsamını kullandığından fuzzing açısından verimlidir. Örneğin, libFuzzer yeni kod satırlarında çalıştırılan test durumlarını tercih eder. Böylece, testlerin sorunlu kodu bulmak için gereken süreyi önemli ölçüde kısaltır.

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

Güvenlik

Uygulama işlemleri doğrudan sürücünün işlemiyle iletişim kurduğu için sürücülerin aldıkları çağrıların bağımsız değişkenlerini doğrulaması gerekir. Bu doğrulama, VTS tarafından doğrulanır. Doğrulama kodu frameworks/ml/nn/common/include/ValidateHal.h dilindedir.

Sürücüler, aynı cihazı kullanırken uygulamaların diğer uygulamalara müdahale etmemesini de sağlamalıdır.

Android Makine Öğrenimi Test Paketi

Android Machine Learning Test Suite (MLTS), tedarikçi cihazlarda gerçek modellerin doğruluğunu doğrulamak için CTS ve VTS'ye dahil edilen bir NNAPI karşılaştırmasıdır. Karşılaştırma, gecikme ve doğruluğu değerlendirir ve aynı model ve veri kümeleri için CPU üzerinde çalışan TF Lite'ı kullanarak sürücülerin sonuçlarını sonuçlarla karşılaştırır. Bu, sürücünün doğruluğunun CPU referans uygulamasından daha düşük olmamasını sağlar.

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

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

Modeller ve veri kümeleri

NNAPI karşılaştırması aşağıdaki modelleri ve veri kümelerini kullanır.

  • Farklı boyutlarda ölçülmüş MobileNetV1 float ve u8, Open Images Dataset v4'ün küçük bir alt grubunda (1.500 görüntü) çalıştırılır.
  • Farklı boyutlarda ölçülmüş MobileNetV2 float ve u8, Open Images Dataset v4'ün küçük bir alt kümesinde (1.500 görüntü) çalıştırılır.
  • Metin okuma için uzun süreli kısa süreli bellek (LSTM) tabanlı akustik model, CMU Arctic grubunun küçük bir alt kümesi üzerinde çalışır.
  • Otomatik konuşma tanıma için LSTM tabanlı akustik model, LibriSpeech veri kümesinin küçük bir alt kümesinde çalışır.

Daha fazla bilgi için platform/test/mlts/models sayfasını inceleyin.

Stres testi

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

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

  • Askıya alma algılama: NNAPI istemcisi test sırasında kilitlenirse test, HANG hata nedeni ile başarısız olur ve test paketi bir sonraki teste geçer.
  • NNAPI istemci kilitlenmesi algılama: Testler istemci kilitlenmelerinden kurtulur ve CRASH hata nedeniyle başarısız olur.
  • Sürücü kazası algılama: Testler, NNAPI çağrısında hataya neden olan sürücü kazasını algılayabilir. Sürücü işlemlerinde, NNAPI hatasına neden olmayan ve testin başarısız olmasına yol açmayan kilitlenmeler olabileceğini unutmayın. Bu tür hataları gidermek için sistem günlüğündeki tail komutunu sürücüyle ilgili hatalar veya kilitlenmeler için çalıştırmanız önerilir.
  • Mevcut tüm hızlandırıcıların hedeflenmesi: Testler, mevcut tüm sürücülere karşı çalıştırılır.

Tüm kilitlenme testlerinin aşağıdaki dört olası sonucu vardır:

  • SUCCESS: Yürütme, hata olmadan tamamlandı.
  • FAILURE: Yürütme başarısız oldu. Genellikle model test edilirken sürücünün modeli derleyemediğini veya yürütemediğini gösteren bir hatadan kaynaklanır.
  • HANG: Test işlemi yanıt vermemeye başladı.
  • CRASH: Test işlemi kilitlendi.

Stres testi hakkında daha fazla bilgi ve kilitlenme testlerinin tam listesi için platform/test/mlts/benchmark/README.txt sayfasını inceleyin.

MLTS'yi kullan

MLTS'yi kullanmak için:

  1. İş istasyonunuza bir hedef cihaz bağlayın ve adb üzerinden erişilebildiğinden emin olun. Birden fazla cihaz bağlıysa hedef cihaz ANDROID_SERIAL ortam değişkenini dışa aktarın.
  2. cd öğesini Android'in üst düzey kaynak dizinine ekleyin.

    source build/envsetup.sh
    lunch aosp_arm-userdebug # Or aosp_arm64-userdebug if available.
    ./test/mlts/benchmark/build_and_run_benchmark.sh
    

    Karşılaştırma çalıştırmasının sonunda, sonuçlar bir HTML sayfası olarak sunulur ve xdg-open bölümüne aktarılır.

Daha fazla bilgi için platform/test/mlts/benchmark/README.txt sayfasını inceleyin.

Neural Networks HAL sürümleri

Bu bölümde, Android ve Nöral Ağlar 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 sundu.

  • NNAPI'de imzalı 8 bit ölçüm desteği. TENSOR_QUANT8_ASYMM_SIGNED işlenen türünü ekler. İmzasız miktarlandırma içeren işlemleri destekleyen NN HAL 1.3'e sahip sürücüler, bu işlemlerin imzalı varyantlarını da desteklemelidir. Miktarları ölçülen çoğu işlemin imzalı ve imzasız sürümlerini çalıştırırken sürücüler, 128 dereceye 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 imzalı işlem görenleri desteklemez. Diğer dört işlem de imzalı miktar hesaplamayı destekler ancak sonuçların aynı olması gerekmez.
  • Çerçevenin, hazır bir model üzerinde özel, eşzamansız bir yürütme başlatmak için IPreparedModel::executeFenced yöntemini çağırdığı ve beklenmesi gereken senkronizasyon çitleri vektörü içeren özel yürütmeler için destek. Daha fazla bilgi için Özel yürütme bölümüne bakın.
  • Kontrol akışı desteği. Diğer modelleri bağımsız değişken olarak alıp koşullu olarak (IF) veya tekrarlı olarak (WHILE) yürü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, modelin hazırlanması için beklenen maksimum süreyi ve yürütme işleminin tamamlanması için beklenen maksimum süreyi gösterebildiği için hizmet kalitesi (QoS) iyileştirildi. Daha fazla bilgi için Hizmet Kalitesi bölümüne bakın.
  • Sürücü tarafından yönetilen arabellekler için ayırıcı arayüzler sağlayan bellek alanları desteği. Bu, yürütmeler genelinde cihaz yerel belleklerinin aktarılmasına olanak tanıyarak aynı sürücüdeki art arda yürütmeler arasında gereksiz veri kopyalama ve dönüşüm işlemlerini önler. Daha fazla bilgi için Bellek alanları bölümüne bakın.

Android 10

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

  • Capabilities yapısı, skaler veri türleri dahil tüm veri türlerini içerir ve adlandırılmış alanlar yerine vektör kullanarak esnek olmayan performansı temsil eder.
  • getVersionString ve getType yöntemleri, çerçevenin cihaz türü (DeviceType) ve sürüm bilgilerini almasına olanak tanır. Cihaz Keşfi ve Atama bölümünü inceleyin.
  • executeSynchronously yöntemi, eşzamanlı olarak bir yürütme gerçekleştirmek için varsayılan olarak çağrılır. execute_1_2 yöntemi, çerçeveye yürütmeyi eşzamansız olarak gerçekleştirmesini bildirir. Yürütme bölümünü inceleyin.
  • executeSynchronously, execute_1_2 ve seri işlem 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ünü inceleyin.
  • Bir veya daha fazla çıkış işleneninin boyutu veya sıralaması bilinmeyen yürütme işlemleri için destek. Çıktı şekli başlıklı makaleyi inceleyin.
  • Tedarikçi firma tarafından tanımlanan işlemler ve veri türlerinden oluşan koleksiyonlar olan tedarikçi firma uzantıları için destek. Sürücü, desteklenen uzantıları IDevice::getSupportedExtensions yöntemini kullanarak bildirir. Tedarikçi Firma Uzantıları sayfasını inceleyin.
  • Seri işlem nesnesinin, uygulama ve sürücü işlemleri arasında iletişim kurarak gecikmeyi azaltmak için hızlı mesaj sıraları (FMQ'lar) kullanarak bir dizi seri işlem yürütmeyi kontrol etme becerisi. Seri Yürütme İşlemleri ve Hızlı Mesaj Sıraları bölümüne göz atın.
  • Sürücünün verileri kopyalamadan yürütme işlemleri gerçekleştirebilmesi için ADonanımBuffer desteği sunulur. ADonanımBuffer konusuna bakın.
  • Uygulama başlatıldığında derleme için kullanılan süreyi azaltmak için derleme yapılarının önbelleğe alınmasıyla ilgili iyileştirilmiş destek. Derleme Önbelleğe Alma bölümünü inceleyin.

Android 10'da aşağıdaki işlenen türleri ve işlemleri sunulmaktadır.

  • İşlenen türler

    • 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 genellikle aşağıdakilerle ilgilidir:

  • NCHW bellek düzeni desteği
  • Softmax ve normalleştirme işlemlerinde sıralaması 4'ten farklı olan tensörler için destek
  • Uzatılmış kıvrımlar için destek
  • ANEURALNETWORKS_CONCATENATION bölgesinde karışık miktarlı girişler için destek

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

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

Android 9

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

  • IDevice::prepareModel_1_1, bir ExecutionPreference parametresi içerir. Sürücü, uygulamanın pil tasarrufu yapmayı tercih ettiğini veya arka arkaya kısa çağrılarda modeli çalıştıracağını bilerek hazırlığı ayarlamak için bunu kullanabilir.
  • Dokuz yeni işlem eklendi: BATCH_TO_SPACE_ND, DIV, MEAN, PAD, SPACE_TO_BATCH_ND, SQUEEZE, STRIDED_SLICE, SUB, TRANSPOSE.
  • Bir uygulama, Model.relaxComputationFloat32toFloat16 değerini true olarak ayarlayarak 32 bit kayan hesaplamaların 16 bit kayan aralık ve/veya hassasiyet kullanılarak çalıştırılabileceğini belirtebilir. Capabilities yapısında relaxedFloat32toFloat16Performance ek alanı bulunur. Böylece sürücü, esnek performansını çerçeveye bildirebilir.

Android 8.1

İlk Nöral Ağ HAL'si (1.0) Android 8.1'de kullanıma sunulmuştur. Daha fazla bilgi için /neuralnetworks/1.0/ sayfasını inceleyin.