Halaman ini menyediakan ringkasan tentang cara mengimplementasikan Neural Networks API (NNAPI)
{i>driver<i}. Untuk detail lebih lanjut, lihat dokumentasi yang terdapat dalam definisi HAL
file di
hardware/interfaces/neuralnetworks
Contoh implementasi {i>driver<i} ada di
frameworks/ml/nn/driver/sample
Untuk informasi selengkapnya tentang Neural Networks API, lihat Neural Networks API.
HAL Jaringan Neural
Neural Networks (NN) HAL mendefinisikan abstraksi berbagai perangkat,
seperti unit pemrosesan grafis (GPU) dan pemroses sinyal digital (DSP),
yang ada dalam suatu produk (misalnya, ponsel atau tablet). Pendorong untuk tindakan ini
perangkat harus sesuai dengan NN HAL. Antarmuka yang ditetapkan dalam HAL
file definisi di
hardware/interfaces/neuralnetworks
Alur umum antarmuka antara framework dan {i>driver<i} digambarkan pada gambar 1.
Gambar 1. Alur Jaringan Neural
Inisialisasi
Saat inisialisasi, framework akan mengkueri driver untuk mengetahui kemampuannya menggunakan
IDevice::getCapabilities_1_3
Struktur @1.3::Capabilities
mencakup semua jenis data dan
merepresentasikan performa yang tidak santai menggunakan vektor.
Untuk menentukan cara mengalokasikan komputasi ke perangkat yang tersedia, framework ini menggunakan kemampuan untuk memahami seberapa cepat efisien setiap {i>driver<i} dapat melakukan eksekusi. Untuk memberikan informasi ini, {i>driver <i}harus memberikan angka kinerja standar berdasarkan eksekusi workload referensi.
Untuk menentukan nilai yang ditampilkan oleh pengemudi sebagai respons terhadap
IDevice::getCapabilities_1_3
, gunakan aplikasi tolok ukur NNAPI untuk mengukur
performa untuk jenis data yang sesuai. MobileNet v1 dan v2, asr_float
,
dan model tts_float
direkomendasikan untuk mengukur performa untuk 32-bit
nilai floating point dan model terkuantisasi MobileNet v1 dan v2
direkomendasikan untuk nilai terkuantisasi 8-bit. Untuk informasi selengkapnya, lihat
Android Machine Learning Test Suite.
Di Android 9 dan yang lebih rendah, struktur Capabilities
menyertakan performa pengemudi
informasi hanya untuk floating point dan tensor terkuantisasi,
jenis data skalar.
Sebagai bagian dari proses inisialisasi, kerangka kerja
dapat meminta informasi lebih lanjut,
menggunakan
IDevice::getType
,
IDevice::getVersionString
,
IDevice:getSupportedExtensions
,
dan
IDevice::getNumberOfCacheFilesNeeded
.
Di antara perangkat dimulai ulang, framework mengharapkan semua kueri yang dijelaskan dalam agar selalu melaporkan nilai yang sama untuk {i>driver<i} tertentu. Jika tidak, aplikasi menggunakan {i>driver<i} itu dapat menyebabkan penurunan kinerja atau perilaku yang tidak tepat.
Kompilasi
Framework menentukan perangkat mana yang akan digunakan ketika menerima permintaan dari . Di Android 10, aplikasi dapat menemukan dan menentukan perangkat yang dipilih oleh kerangka kerja. Untuk informasi selengkapnya, lihat Penemuan dan Penetapan Perangkat.
Pada waktu kompilasi model, framework akan mengirimkan model ke setiap kandidat
pengemudi dengan memanggil
IDevice::getSupportedOperations_1_3
Setiap driver menampilkan array boolean yang menunjukkan
mendukung operasi model. Pengemudi dapat
menentukan bahwa ia tidak
mendukung operasi tertentu
karena sejumlah alasan. Contoh:
- Driver tidak mendukung jenis data ini.
- Driver hanya mendukung operasi dengan parameter input tertentu. Sebagai contoh, driver mungkin mendukung 3x3 dan 5x5, tetapi tidak mendukung konvolusi 7x7 operasional bisnis.
- {i>Driver<i} memiliki batasan memori yang mencegahnya menangani grafik atau input.
Selama kompilasi, input, output, dan operand internal model, seperti
dijelaskan dalam
OperandLifeTime
,
dapat memiliki dimensi atau peringkat
yang tidak diketahui. Untuk informasi selengkapnya, lihat
Bentuk output.
Framework ini menginstruksikan setiap pengemudi yang dipilih untuk bersiap menjalankan subset
model dengan memanggil
IDevice::prepareModel_1_3
Setiap driver kemudian mengompilasi subset-nya. Misalnya, seorang pengemudi mungkin
menghasilkan kode atau membuat salinan bobot yang diurutkan ulang. Karena bisa jadi ada
banyak waktu antara kompilasi model dengan
eksekusi permintaan, sumber daya seperti
bongkahan memori perangkat yang besar tidak
ditetapkan selama kompilasi.
Jika berhasil, pengemudi akan menampilkan @1.3::IPreparedModel
nama sebutan channel. Jika {i>driver<i} mengembalikan kode kegagalan saat mempersiapkan {i>subset<i}-nya
, framework menjalankan seluruh model pada CPU.
Guna mengurangi waktu yang digunakan untuk kompilasi saat aplikasi dimulai, driver dapat artefak kompilasi cache. Untuk informasi selengkapnya, lihat Kompilasi Menyimpan ke cache.
Eksekusi
Saat aplikasi meminta framework untuk mengeksekusi permintaan, framework akan memanggil
tindakan
IPreparedModel::executeSynchronously_1_3
Metode HAL secara default untuk melakukan eksekusi sinkron pada model yang sudah disiapkan.
Permintaan juga dapat dieksekusi secara asinkron menggunakan
execute_1_3
, metode
executeFenced
(lihat Eksekusi berpagar),
atau dieksekusi menggunakan
eksekusi burst.
Panggilan eksekusi sinkron meningkatkan performa dan mengurangi threading overhead dibandingkan dengan panggilan asinkron karena kontrol dikembalikan ke metode proses aplikasi hanya setelah eksekusi selesai. Ini berarti bahwa {i>driver<i} tidak memerlukan mekanisme terpisah untuk memberi tahu proses aplikasi bahwa dan eksekusi telah selesai.
Dengan metode execute_1_3
asinkron, kontrol akan kembali ke
aplikasi setelah eksekusi dimulai, dan pengemudi harus memberi tahu
kerangka kerja ketika eksekusi selesai, dengan menggunakan
@1.3::IExecutionCallback
.
Parameter Request
yang diteruskan ke metode eksekusi mencantumkan input dan output
operand yang digunakan untuk eksekusi. Memori yang menyimpan data operand harus
gunakan urutan baris-utama dengan dimensi pertama yang melakukan iterasi paling lambat dan tidak memiliki
{i>padding<i} di akhir baris mana pun. Untuk informasi selengkapnya tentang jenis operand,
lihat
Operand.
Untuk driver NN HAL 1.2 atau yang lebih tinggi, saat permintaan selesai, status error, bentuk output, dan informasi waktu ditampilkan ke dalam kerangka kerja. Selama eksekusi, output atau operand internal model bisa memiliki satu atau beberapa dimensi atau peringkat yang tidak diketahui. Saat setidaknya satu output operand memiliki dimensi atau peringkat yang tidak diketahui, pengemudi harus menampilkan informasi output berukuran dinamis.
Untuk pengemudi dengan NN HAL 1.1 atau lebih rendah, hanya status kesalahan yang ditampilkan selesai. Dimensi untuk operand input dan output harus sepenuhnya yang ditentukan agar eksekusi berhasil diselesaikan. Operand internal dapat memiliki satu atau beberapa dimensi yang tidak diketahui, tetapi dimensi tersebut harus memiliki peringkat yang ditentukan.
Untuk permintaan pengguna yang mencakup beberapa driver, framework bertanggung jawab untuk yang mencadangkan memori perantara dan untuk mengurutkan panggilan ke setiap driver.
Beberapa permintaan dapat dimulai secara paralel pada
@1.3::IPreparedModel
Driver dapat menjalankan permintaan secara paralel atau membuat serialisasi eksekusi.
Framework ini dapat meminta pengemudi untuk menyimpan lebih dari satu model yang disiapkan. Sebagai
contoh, menyiapkan model m1
, menyiapkan m2
, mengeksekusi permintaan r1
pada m1
, mengeksekusi
r2
pada m2
, jalankan r3
pada m1
, jalankan r4
pada m2
, rilis (dijelaskan di
Pembersihan) m1
, lalu rilis m2
.
Untuk menghindari eksekusi pertama yang lambat yang dapat mengakibatkan pengalaman pengguna yang buruk (untuk misalnya, ketersendatan frame pertama), driver harus melakukan sebagian besar inisialisasi pada fase kompilasi. Inisialisasi pada eksekusi pertama harus dibatasi pada tindakan yang berdampak negatif pada kesehatan sistem bila dilakukan dini, seperti mencadangkan {i>buffer <i}sementara yang besar atau meningkatkan kecepatan jam perangkat. {i>Driver<i} yang hanya dapat menyiapkan sejumlah model serentak mungkin memiliki perlu melakukan inisialisasi pada eksekusi pertama.
Di Android 10 atau yang lebih tinggi, dalam kasus di mana beberapa dengan model persiapan yang sama dan dieksekusi dengan cepat, klien dapat memilih untuk menggunakan burst untuk berkomunikasi antara aplikasi dan proses driver. Untuk selengkapnya informasi, lihat Burst Executions dan Fast Message Queues.
Guna meningkatkan performa untuk beberapa eksekusi secara berurutan dengan cepat, driver dapat berpegang pada {i>buffer <i}sementara atau meningkatkan kecepatan jam. Membuat watchdog thread disarankan untuk melepaskan resource jika tidak ada permintaan baru yang dibuat setelah periode waktu tertentu.
Bentuk output
Untuk permintaan yang satu atau beberapa operand output tidak memiliki semua dimensi
yang ditentukan, {i>driver<i} harus memberikan daftar bentuk output yang berisi
informasi dimensi untuk setiap operand output setelah eksekusi. Untuk selengkapnya
informasi tentang dimensi, lihat
OutputShape
Jika eksekusi gagal karena buffer output berukuran kecil, driver harus menunjukkan operand output mana yang memiliki ukuran buffer yang tidak mencukupi dalam daftar bentuk output, dan harus melaporkan informasi dimensi sebanyak mungkin, menggunakan nol untuk dimensi yang tidak diketahui.
Waktu
Di Android 10, aplikasi dapat meminta eksekusi
waktu jika aplikasi
telah menentukan satu perangkat yang akan digunakan selama proses kompilasi. Sebagai
detail, lihat
MeasureTiming
dan Penemuan dan Penetapan Perangkat.
Dalam hal ini,
Driver NN HAL 1.2 harus mengukur durasi eksekusi atau melaporkan UINT64_MAX
(ke
menunjukkan bahwa durasi tidak tersedia) saat mengeksekusi permintaan. Pengemudi
harus meminimalkan penalti performa yang disebabkan oleh pengukuran eksekusi
durasi.
Pengemudi melaporkan durasi berikut dalam mikrodetik dalam
Timing
struktur:
- Waktu eksekusi di perangkat: Tidak termasuk waktu eksekusi dalam {i>driver<i}, yang berjalan pada prosesor {i>host<i}.
- Waktu eksekusi di driver: Termasuk waktu eksekusi pada perangkat.
Durasi ini harus mencakup waktu saat eksekusi ditangguhkan, karena ketika eksekusi telah didahului oleh tugas lain atau ketika menunggu sumber daya tersedia.
Ketika {i>driver<i} belum diminta untuk mengukur durasi eksekusi, atau kapan
terjadi kesalahan eksekusi, {i>driver<i} harus melaporkan durasi
UINT64_MAX
. Bahkan saat pengemudi diminta untuk mengukur eksekusi
sebagai gantinya, tindakan ini dapat melaporkan UINT64_MAX
untuk waktu di perangkat, waktu di
{i>driver<i}, atau keduanya. Saat pengemudi melaporkan kedua durasi tersebut sebagai nilai selain
UINT64_MAX
, waktu eksekusi dalam driver harus sama dengan atau melebihi waktu pada
perangkat.
Eksekusi berpagar
Di Android 11, NNAPI mengizinkan eksekusi menunggu
daftar handle sync_fence
dan secara opsional menampilkan objek sync_fence
, yang
akan diberi sinyal
saat eksekusi selesai. Hal ini mengurangi {i>overhead<i} untuk
model urutan dan kasus penggunaan streaming. Eksekusi berpagar juga
memungkinkan lebih banyak
interoperabilitas yang efisien dengan komponen
lain yang dapat memberi sinyal atau menunggu
sync_fence
. Untuk mengetahui informasi selengkapnya tentang sync_fence
, lihat
Framework sinkronisasi.
Dalam eksekusi dengan fence, framework akan memanggil metode
IPreparedModel::executeFenced
untuk meluncurkan eksekusi asinkron dengan fence pada model yang telah disiapkan dengan
vektor fence sinkronisasi yang akan ditunggu. Jika tugas asinkron selesai sebelum
panggilan ditampilkan, handle kosong dapat ditampilkan untuk sync_fence
. Channel
Objek IFencedExecutionCallback
juga harus ditampilkan untuk mengizinkan framework
untuk melakukan kueri status {i>error<i} dan informasi durasi.
Setelah eksekusi selesai, dua hal berikut
nilai timing
untuk mengukur durasi eksekusi,
IFencedExecutionCallback::getExecutionInfo
timingLaunched
: Durasi dari saatexecuteFenced
dipanggil hinggaexecuteFenced
dipanggil menandakansyncFence
yang ditampilkan.timingFenced
: Durasi sejak semua fence sinkronisasi yang ditunggu eksekusi akan diberi sinyal saatexecuteFenced
memberikan sinyalsyncFence
yang ditampilkan.
Alur kontrol
Untuk perangkat yang menjalankan Android 11 atau yang lebih tinggi, NNAPI
mencakup dua operasi alur kontrol, IF
dan WHILE
, yang menggunakan model lain
sebagai argumen dan menjalankannya secara bersyarat (IF
) atau berulang kali (WHILE
). Sebagai
informasi selengkapnya tentang cara menerapkannya, lihat
Alur kontrol.
Kualitas layanan
Di Android 11, NNAPI menyertakan peningkatan kualitas (QoS) dengan memungkinkan aplikasi menunjukkan prioritas relatif waktu maksimum yang diharapkan untuk mempersiapkan model, dan jumlah waktu maksimum yang diharapkan untuk menyelesaikan eksekusi. Sebagai informasi selengkapnya, lihat Kualitas Layanan.
Pembersihan
Saat aplikasi selesai menggunakan model yang sudah disiapkan, framework akan merilis
referensinya ke
@1.3::IPreparedModel
. Saat objek IPreparedModel
tidak lagi direferensikan, objek tersebut
secara otomatis dihancurkan di layanan
{i>driver<i} yang membuatnya. Spesifik per model
sumber daya dapat diklaim kembali saat ini
dalam implementasi {i>driver<i} dari
destruktor. Jika layanan pengemudi ingin objek IPreparedModel
otomatis dihancurkan bila tidak lagi dibutuhkan oleh klien, maka harus tidak ditahan
referensi apa pun ke objek IPreparedModel
setelah objek IPreparedeModel
dikembalikan melalui
IPreparedModelCallback::notify_1_3
Penggunaan CPU
Driver diharapkan menggunakan CPU untuk menyiapkan komputasi. Pengemudi tidak seharusnya menggunakan CPU untuk melakukan komputasi grafik karena hal itu mengganggu proses kemampuan kerangka kerja untuk mengalokasikan pekerjaan dengan benar. Pengemudi harus melaporkan bagian yang tidak dapat ditangani kerangka kerja dan membiarkan kerangka kerja menangani beristirahat.
Framework ini menyediakan implementasi CPU untuk semua operasi NNAPI kecuali untuk operasi yang ditentukan vendor. Untuk informasi selengkapnya, lihat Ekstensi Vendor.
Tujuan yang diperkenalkan di Android 10 (level API 29) hanya memiliki implementasi CPU referensi untuk memverifikasi bahwa uji CTS dan VTS sudah benar. Implementasi yang dioptimalkan disertakan dalam machine learning seluler framework lebih disukai daripada implementasi CPU NNAPI.
Fungsi utilitas
Codebase NNAPI menyertakan fungsi utilitas yang dapat digunakan oleh driver layanan IT perusahaan mereka.
Tujuan
frameworks/ml/nn/common/include/Utils.h
berisi berbagai fungsi utilitas, seperti yang digunakan untuk melakukan {i>logging<i} dan
untuk mengonversi antara berbagai versi NN HAL.
VLogging:
VLOG
adalah makro wrapper di sekitarLOG
Android yang hanya mencatat pesan jika tag yang sesuai disetel didebug.nn.vlog
saat ini.initVLogMask()
harus dipanggil sebelum panggilan keVLOG
. MakroVLOG_IS_ON
dapat berupa digunakan untuk memeriksa apakahVLOG
saat ini diaktifkan, sehingga memungkinkan logging yang rumit kode yang akan dilewati jika tidak diperlukan. Nilai properti harus salah satu hal berikut:- String kosong, menunjukkan bahwa tidak ada logging yang harus dilakukan.
- Token
1
atauall
, yang menunjukkan bahwa semua logging harus dilakukan. - Daftar tag, yang dipisahkan oleh spasi, koma, atau titik dua,
yang menunjukkan {i>logging<i}
mana yang harus dilakukan. Tag-nya adalah
compilation
,cpuexe
,driver
,execution
,manager
, danmodel
.
compliantWithV1_*
: Menampilkantrue
jika objek NN HAL dapat dikonversi ke jenis versi HAL yang sama tanpa kehilangan informasi. Sebagai Misalnya, memanggilcompliantWithV1_0
diV1_2::Model
akan menampilkanfalse
jika model mencakup jenis operasi yang diperkenalkan dalam NN HAL 1.1 atau NN HAL 1.2.convertToV1_*
: Mengonversi objek NN HAL dari satu versi ke versi lainnya. Peringatan akan dicatat jika konversi menyebabkan hilangnya informasi (yang adalah, jika jenis versi baru tidak dapat sepenuhnya merepresentasikan nilai).Kemampuan:
nonExtensionOperandPerformance
danupdate
fungsi dapat digunakan untuk membangunCapabilities::operandPerformance
kolom tersebut.Properti kueri jenis:
isExtensionOperandType
,isExtensionOperationType
,nonExtensionSizeOfData
,nonExtensionOperandSizeOfData
,nonExtensionOperandTypeIsScalar
,tensorHasUnspecifiedDimensions
.
Tujuan
frameworks/ml/nn/common/include/ValidateHal.h
berisi fungsi utilitas untuk memvalidasi bahwa objek NN HAL valid
sesuai dengan spesifikasi versi HAL-nya.
validate*
: Menampilkantrue
jika objek NN HAL valid sesuai dengan spesifikasi versi HAL-nya. Jenis dan jenis ekstensi OEM tidak divalidasi. Misalnya,validateModel
menampilkanfalse
jika berisi operasi yang mereferensikan indeks operand yang tidak ada, atau operasi yang tidak didukung pada versi HAL itu.
Tujuan
frameworks/ml/nn/common/include/Tracing.h
file berisi makro untuk menyederhanakan penambahan
informasi systracing ke kode Jaringan Neural.
Sebagai contoh, lihat pemanggilan makro NNTRACE_*
pada
contoh driver.
Tujuan
frameworks/ml/nn/common/include/GraphDump.h
file berisi fungsi utilitas untuk membuang konten Model
dalam bentuk
untuk tujuan proses debug.
graphDump
: Menulis representasi model di Graphviz (.dot
) ke streaming yang ditentukan (jika tersedia) atau ke logcat (jika tidak ada streaming yang disediakan).
Validasi
Untuk menguji implementasi NNAPI, gunakan pengujian VTS dan CTS yang disertakan dalam framework Android. VTS melatih pengemudi Anda secara langsung (tanpa menggunakan ), sedangkan CTS melatihnya secara tidak langsung melalui kerangka kerja. Ini menguji setiap metode API dan memverifikasi bahwa semua operasi didukung oleh {i>driver<i} bekerja dengan benar dan memberikan hasil yang memenuhi persyaratan presisi.
Persyaratan presisi dalam CTS dan VTS untuk NNAPI adalah sebagai berikut:
Floating point: abs(yang diharapkan - aktual) <= atol + rtol * abs(diharapkan); dalam hal ini:
- Untuk fp32, atol = 1e-5f, rtol = 5.0f * 1.1920928955078125e-7
- Untuk fp16, atol = rtol = 5.0f * 0,0009765625f
Terkuantisasi: diskon satu per satu (kecuali untuk
mobilenet_quantized
, yang kurang dari tiga)Boolean: pencocokan persis
Salah satu cara CTS menguji NNAPI adalah dengan membuat grafik pseudorandom tetap
yang digunakan untuk menguji dan membandingkan
hasil eksekusi dari setiap {i>driver<i} dengan
Implementasi referensi NNAPI. Untuk pengemudi dengan NN HAL 1.2 atau lebih tinggi, jika
tidak memenuhi kriteria presisi, CTS melaporkan error dan mengeluarkan
file spesifikasi untuk model yang gagal pada /data/local/tmp
untuk proses debug.
Untuk detail selengkapnya tentang kriteria presisi, lihat
TestRandomGraph.cpp
dan
TestHarness.h
Uji kegagalan (fuzz testing)
Tujuan dari uji fuzz adalah untuk menemukan kerusakan, pernyataan, pelanggaran memori, atau perilaku yang tidak ditentukan secara umum dalam kode yang sedang diuji karena faktor seperti input yang tidak terduga. Untuk pengujian fuzz NNAPI, Android menggunakan pengujian berdasarkan libFuzzer, yang merupakan efisien dalam fuzzing karena mereka menggunakan cakupan garis kasus uji sebelumnya untuk menghasilkan input acak baru. Misalnya, libFuzzer mendukung kasus pengujian yang menjalankan baris kode baru. Ini sangat mengurangi waktu yang dibutuhkan pengujian untuk menemukan kode yang bermasalah.
Untuk melakukan pengujian fuzz guna memvalidasi implementasi driver Anda, ubah
frameworks/ml/nn/runtime/test/android_fuzzing/DriverFuzzTest.cpp
dalam utilitas pengujian libneuralnetworks_driver_fuzzer
yang ditemukan di AOSP untuk menyertakan
kode {i>driver<i} Anda. Untuk informasi selengkapnya tentang pengujian fuzz NNAPI, lihat
frameworks/ml/nn/runtime/test/android_fuzzing/README.md
Keamanan
Karena proses aplikasi berkomunikasi
langsung dengan proses {i>driver<i},
pengemudi harus memvalidasi argumen panggilan yang diterima. Validasi ini
diverifikasi oleh VTS. Kode validasi ada di dalam
frameworks/ml/nn/common/include/ValidateHal.h
Pengemudi juga harus memastikan bahwa aplikasi tidak boleh mengganggu aplikasi saat menggunakan perangkat yang sama.
Android Machine Learning Test Suite
Android Machine Learning Test Suite (MLTS) adalah benchmark NNAPI yang disertakan dalam CTS dan VTS untuk memvalidasi akurasi model nyata di perangkat vendor. Tujuan benchmark mengevaluasi latensi dan akurasi, serta membandingkan performa driver hasil dengan hasil menggunakan TF Lite yang berjalan pada CPU, untuk model dan set data yang sama. Hal ini memastikan bahwa akurasi pengemudi tidak lebih buruk dibandingkan implementasi referensi CPU.
Developer platform Android juga menggunakan MLTS untuk mengevaluasi latensi dan akurasi pengemudi.
Tolok ukur NNAPI dapat ditemukan dalam dua project dalam AOSP:
platform/test/mlts/benchmark
(aplikasi tolok ukur)platform/test/mlts/models
(model dan set data)
Model dan set data
Tolok ukur NNAPI menggunakan model dan set data berikut.
- Float dan u8 MobileNetV1 dikuantisasi dalam berbagai ukuran, dijalankan terhadap subset kecil (1.500 gambar) dari Set Data Gambar Terbuka v4.
- Float dan u8 MobileNetV2 dikuantisasi dalam berbagai ukuran, dijalankan terhadap subset kecil (1.500 gambar) dari Set Data Gambar Terbuka v4.
- model akustik berbasis memori jangka pendek (LSTM) untuk text-to-speech, berlari melawan sebagian kecil dari kumpulan CMU Arctic.
- Model akustik berbasis LSTM untuk pengenalan ucapan otomatis, yang dijalankan di subset kecil dari {i>dataset<i} LibriSpeech.
Untuk mengetahui informasi selengkapnya, lihat
platform/test/mlts/models
.
Pengujian stres
Android Machine Learning Test Suite menyertakan serangkaian uji error untuk memvalidasi ketahanan pengemudi dalam kondisi penggunaan berat atau di sudut jalan kasus yang dialami klien perilaku model.
Semua uji error menyediakan fitur berikut:
- Deteksi hang: Jika klien NNAPI berhenti selama pengujian,
pengujian gagal dengan alasan kegagalan
HANG
dan rangkaian pengujian melanjutkan ke pengujian berikutnya. - Deteksi error klien NNAPI: Pengujian bertahan dari error dan pengujian klien
gagal dengan alasan kegagalan
CRASH
. - Deteksi tabrakan pengemudi: Pengujian dapat mendeteksi tabrakan pengemudi
yang menyebabkan kegagalan pada panggilan NNAPI. Perhatikan bahwa mungkin terjadi error di
proses driver yang tidak menyebabkan kegagalan NNAPI dan tidak menyebabkan pengujian
gagal. Untuk menangani kegagalan semacam ini, sebaiknya jalankan
tail
pada log sistem untuk {i>error<i} atau masalah terkait {i>driver<i}. - Penargetan semua akselerator yang tersedia: Pengujian dijalankan terhadap semua {i>driver<i} yang tersedia.
Semua uji error memiliki empat kemungkinan hasil berikut:
SUCCESS
: Eksekusi selesai tanpa error.FAILURE
: Eksekusi gagal. Biasanya disebabkan oleh kegagalan ketika menguji model, yang menunjukkan bahwa {i>driver<i} gagal mengompilasi atau mengeksekusi model.HANG
: Proses pengujian menjadi tidak responsif.CRASH
: Proses pengujian mengalami error.
Untuk informasi selengkapnya tentang pengujian daya tahan dan daftar lengkap uji error, lihat
platform/test/mlts/benchmark/README.txt
Menggunakan MLTS
Untuk menggunakan MLTS:
- Hubungkan perangkat target ke workstation dan pastikan perangkat tersebut
dapat dijangkau melalui
adb terlebih dahulu.
Ekspor perangkat target
ANDROID_SERIAL
variabel lingkungan jika lebih dari satu perangkat terhubung. cd
ke direktori sumber level teratas Android.source build/envsetup.sh lunch aosp_arm-userdebug # Or aosp_arm64-userdebug if available. ./test/mlts/benchmark/build_and_run_benchmark.sh
Di akhir proses tolok ukur, hasilnya dibacakan sebagai halaman HTML dan diteruskan ke
xdg-open
.
Untuk mengetahui informasi selengkapnya, lihat
platform/test/mlts/benchmark/README.txt
.
Versi HAL Jaringan Neural
Bagian ini menjelaskan perubahan yang diperkenalkan di Android dan Neural Versi HAL Jaringan.
Android 11
Android 11 memperkenalkan NN HAL 1.3, yang menyertakan mengikuti perubahan penting.
- Dukungan untuk kuantisasi 8-bit yang ditandatangani dalam NNAPI. Menambahkan
TENSOR_QUANT8_ASYMM_SIGNED
jenis operand. Pengemudi dengan NN HAL 1.3 yang mendukung operasi dengan kuantisasi yang tidak ditandatangani juga harus mendukung varian bertanda tangan operasi tersebut. Saat menjalankan versi yang ditandatangani dan tidak ditandatangani, terkuantisasi, pengemudi harus memberikan hasil yang sama hingga offset sebesar 128. Ada lima pengecualian untuk persyaratan ini:CAST
,HASHTABLE_LOOKUP
,LSH_PROJECTION
,PAD_V2
, danQUANTIZED_16BIT_LSTM
. OperasiQUANTIZED_16BIT_LSTM
tidak mendukung operand bertanda dan empat operasi lainnya mendukung kuantisasi yang ditandatangani tetapi tidak memerlukan hasilnya sama. - Dukungan untuk eksekusi dengan fence di mana framework memanggil
IPreparedModel::executeFenced
untuk meluncurkan eksekusi asinkron dengan fence pada model yang telah disiapkan dengan vektor fence sinkronisasi yang akan ditunggu. Untuk informasi selengkapnya, lihat Eksekusi berpagar. - Dukungan untuk alur kontrol. Menambahkan operasi
IF
danWHILE
, yang menggunakan model lain sebagai argumen dan menjalankannya secara bersyarat (IF
) atau berulang kali (WHILE
). Untuk informasi selengkapnya, lihat Alur kontrol. - Peningkatan kualitas layanan (QoS) karena aplikasi dapat menunjukkan prioritas modelnya, jumlah waktu maksimum yang diharapkan untuk model yang akan dipersiapkan, dan jumlah waktu maksimum yang diharapkan untuk pelaksanaan tugas. Untuk informasi selengkapnya, lihat Kualitas Layanan.
- Dukungan untuk domain memori yang menyediakan antarmuka alokator untuk {i>buffer<i} yang dikelola oleh {i>driver<i}. Hal ini memungkinkan penerusan memori native perangkat di seluruh eksekusi, sehingga menekan penyalinan dan transformasi data yang tidak perlu di antara eksekusi berurutan pada {i>driver<i} yang sama. Untuk informasi selengkapnya, lihat Domain memori.
Android 10
Android 10 memperkenalkan NN HAL 1.2, yang menyertakan mengikuti perubahan penting.
- Struktur
Capabilities
mencakup semua jenis data termasuk skalar tipe data, dan merepresentasikan kinerja yang tidak santai menggunakan vektor, bukan daripada {i>field<i} bernama. - Metode
getVersionString
dangetType
memungkinkan framework untuk mengambil informasi jenis perangkat (DeviceType
) dan versi. Lihat Penemuan dan Penetapan Perangkat. - Metode
executeSynchronously
dipanggil secara default untuk melakukan dan mengeksekusinya secara sinkron. Metodeexecute_1_2
memberi tahu framework untuk menjalankan eksekusi secara asinkron. Lihat Eksekusi. - Parameter
MeasureTiming
keexecuteSynchronously
,execute_1_2
, dan eksekusi burst menentukan apakah driver akan mengukur eksekusi durasi. Hasilnya dilaporkan dalam strukturTiming
. Lihat Waktu. - Dukungan untuk eksekusi jika satu atau beberapa operand output memiliki alamat yang tidak diketahui dimensi atau peringkat. Lihat Bentuk output.
- Dukungan untuk ekstensi vendor, yang merupakan kumpulan dari kumpulan yang ditentukan vendor
operasi dan tipe data. Pengemudi melaporkan ekstensi
yang didukung melalui
metode
IDevice::getSupportedExtensions
. Lihat Ekstensi Vendor. - Kemampuan objek burst untuk mengontrol serangkaian eksekusi burst menggunakan antrean pesan cepat (FMQ) untuk berkomunikasi antara aplikasi dan driver proses, sehingga mengurangi latensi. Lihat Burst Executions dan Fast Message Queues.
- Dukungan untuk AHardwareBuffer agar driver dapat melakukan eksekusi tanpa menyalin data. Lihat AHardwareBuffer.
- Meningkatkan dukungan untuk caching artefak kompilasi guna mengurangi waktu digunakan untuk kompilasi saat aplikasi dimulai. Lihat Pembuatan Cache Kompilasi.
Android 10 memperkenalkan jenis operand berikut dan operasional bisnis.
-
ANEURALNETWORKS_BOOL
ANEURALNETWORKS_FLOAT16
ANEURALNETWORKS_TENSOR_BOOL8
ANEURALNETWORKS_TENSOR_FLOAT16
ANEURALNETWORKS_TENSOR_QUANT16_ASYMM
ANEURALNETWORKS_TENSOR_QUANT16_SYMM
ANEURALNETWORKS_TENSOR_QUANT8_SYMM
ANEURALNETWORKS_TENSOR_QUANT8_SYMM_PER_CHANNEL
-
ANEURALNETWORKS_ABS
ANEURALNETWORKS_ARGMAX
ANEURALNETWORKS_ARGMIN
ANEURALNETWORKS_AXIS_ALIGNED_BBOX_TRANSFORM
ANEURALNETWORKS_BIDIRECTIONAL_SEQUENCE_LSTM
ANEURALNETWORKS_BIDIRECTIONAL_SEQUENCE_RNN
ANEURALNETWORKS_BOX_WITH_NMS_LIMIT
ANEURALNETWORKS_CAST
ANEURALNETWORKS_CHANNEL_SHUFFLE
ANEURALNETWORKS_DETECTION_POSTPROCESSING
ANEURALNETWORKS_EQUAL
ANEURALNETWORKS_EXP
ANEURALNETWORKS_EXPAND_DIMS
ANEURALNETWORKS_GATHER
ANEURALNETWORKS_GENERATE_PROPOSALS
ANEURALNETWORKS_GREATER
ANEURALNETWORKS_GREATER_EQUAL
ANEURALNETWORKS_GROUPED_CONV_2D
ANEURALNETWORKS_HEATMAP_MAX_KEYPOINT
ANEURALNETWORKS_INSTANCE_NORMALIZATION
ANEURALNETWORKS_LESS
ANEURALNETWORKS_LESS_EQUAL
ANEURALNETWORKS_LOG
ANEURALNETWORKS_LOGICAL_AND
ANEURALNETWORKS_LOGICAL_NOT
ANEURALNETWORKS_LOGICAL_OR
ANEURALNETWORKS_LOG_SOFTMAX
ANEURALNETWORKS_MAXIMUM
ANEURALNETWORKS_MINIMUM
ANEURALNETWORKS_NEG
ANEURALNETWORKS_NOT_EQUAL
ANEURALNETWORKS_PAD_V2
ANEURALNETWORKS_POW
ANEURALNETWORKS_PRELU
ANEURALNETWORKS_QUANTIZE
ANEURALNETWORKS_QUANTIZED_16BIT_LSTM
ANEURALNETWORKS_RANDOM_MULTINOMIAL
ANEURALNETWORKS_REDUCE_ALL
ANEURALNETWORKS_REDUCE_ANY
ANEURALNETWORKS_REDUCE_MAX
ANEURALNETWORKS_REDUCE_MIN
ANEURALNETWORKS_REDUCE_PROD
ANEURALNETWORKS_REDUCE_SUM
ANEURALNETWORKS_RESIZE_NEAREST_NEIGHBOR
ANEURALNETWORKS_ROI_ALIGN
ANEURALNETWORKS_ROI_POOLING
ANEURALNETWORKS_RSQRT
ANEURALNETWORKS_SELECT
ANEURALNETWORKS_SIN
ANEURALNETWORKS_SLICE
ANEURALNETWORKS_SPLIT
ANEURALNETWORKS_SQRT
ANEURALNETWORKS_TILE
ANEURALNETWORKS_TOPK_V2
ANEURALNETWORKS_TRANSPOSE_CONV_2D
ANEURALNETWORKS_UNIDIRECTIONAL_SEQUENCE_LSTM
ANEURALNETWORKS_UNIDIRECTIONAL_SEQUENCE_RNN
Android 10 memperkenalkan update untuk banyak operasional bisnis. Pembaruan utamanya terkait dengan berikut ini:
- Dukungan untuk tata letak memori NCHW
- Dukungan untuk tensor dengan peringkat yang berbeda dari 4 pada softmax dan operasi normalisasi
- Dukungan untuk konvolusi yang dilebarkan
- Dukungan untuk input dengan kuantisasi campuran dalam
ANEURALNETWORKS_CONCATENATION
Daftar di bawah ini menunjukkan operasi yang dimodifikasi dalam Android 10. Untuk lengkap detail perubahan, lihat OperationCode dalam dokumentasi referensi NNAPI.
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 diperkenalkan pada Android 9 dan mencakup hal-hal berikut perubahan.
IDevice::prepareModel_1_1
menyertakanExecutionPreference
. Pengemudi dapat menggunakan ini untuk menyesuaikan persiapannya, mengetahui bahwa aplikasi lebih memilih untuk menghemat baterai atau akan mengeksekusi model dalam beberapa panggilan cepat berturut-turut.- Sembilan operasi baru telah ditambahkan:
BATCH_TO_SPACE_ND
,DIV
,MEAN
,PAD
,SPACE_TO_BATCH_ND
,SQUEEZE
,STRIDED_SLICE
,SUB
,TRANSPOSE
. - Aplikasi dapat menetapkan bahwa komputasi float 32-bit dapat dijalankan
menggunakan rentang float 16-bit dan/atau presisi dengan menetapkan
Model.relaxComputationFloat32toFloat16
hinggatrue
.Capabilities
struct memiliki kolom tambahanrelaxedFloat32toFloat16Performance
, jadi {i>driver<i} dapat melaporkan kinerja yang longgar ke kerangka kerja.
Android 8.1
Neural Networks HAL (1.0) awal dirilis di Android 8.1. Untuk selengkapnya
informasi, lihat
/neuralnetworks/1.0/