Halaman ini memberikan ringkasan tentang cara menerapkan driver Neural Networks API (NNAPI). Untuk detail selengkapnya, lihat dokumentasi yang ditemukan dalam file definisi HAL
di
hardware/interfaces/neuralnetworks
.
Contoh implementasi driver 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 menentukan abstraksi berbagai perangkat,
seperti unit pemrosesan grafis (GPU) dan pemroses sinyal digital (DSP),
yang ada dalam suatu produk (misalnya, ponsel atau tablet). Driver untuk perangkat ini
harus sesuai dengan NN HAL. Antarmuka ditentukan dalam file
definisi HAL di
hardware/interfaces/neuralnetworks
.
Alur umum antarmuka antara framework dan driver diilustrasikan pada gambar 1.
Gambar 1. Alur Jaringan Neural
Inisialisasi
Saat inisialisasi, framework mengkueri driver untuk mengetahui kemampuannya menggunakan
IDevice::getCapabilities_1_3
.
Struktur @1.3::Capabilities
mencakup semua jenis data dan mewakili performa non-santai menggunakan vektor.
Untuk menentukan cara mengalokasikan komputasi ke perangkat yang tersedia, framework menggunakan kemampuan untuk memahami seberapa cepat dan seberapa hemat energi setiap driver dapat melakukan eksekusi. Untuk memberikan informasi ini, driver harus memberikan angka performa standar berdasarkan eksekusi beban kerja referensi.
Untuk menentukan nilai yang ditampilkan driver sebagai respons terhadap
IDevice::getCapabilities_1_3
, gunakan aplikasi benchmark NNAPI untuk mengukur
performa untuk jenis data yang sesuai. Model MobileNet v1 dan v2, asr_float
,
dan tts_float
direkomendasikan untuk mengukur performa untuk nilai floating point
32-bit dan model kuantisasi MobileNet v1 dan v2
direkomendasikan untuk nilai kuantisasi 8-bit. Untuk informasi selengkapnya, lihat Android Machine Learning Test Suite.
Di Android 9 dan yang lebih rendah, struktur Capabilities
menyertakan informasi performa
driver hanya untuk floating point dan tensor terkuantisasi, serta tidak menyertakan
jenis data skalar.
Sebagai bagian dari proses inisialisasi, framework dapat mengkueri informasi lainnya,
menggunakan
IDevice::getType
,
IDevice::getVersionString
,
IDevice:getSupportedExtensions
,
dan
IDevice::getNumberOfCacheFilesNeeded
.
Di antara mulai ulang produk, framework mengharapkan semua kueri yang dijelaskan di bagian ini selalu melaporkan nilai yang sama untuk driver tertentu. Jika tidak, aplikasi yang menggunakan driver tersebut dapat menunjukkan penurunan performa atau perilaku yang salah.
Kompilasi
Framework menentukan perangkat yang akan digunakan saat menerima permintaan dari aplikasi. Di Android 10, aplikasi dapat menemukan dan menentukan perangkat yang dipilih framework. Untuk mengetahui informasi selengkapnya, lihat Penemuan dan Penetapan Perangkat.
Pada waktu kompilasi model, framework akan mengirimkan model ke setiap driver
kandidat dengan memanggil
IDevice::getSupportedOperations_1_3
.
Setiap driver menampilkan array boolean yang menunjukkan operasi model yang didukung. Driver dapat menentukan bahwa driver tidak dapat
mendukung operasi tertentu karena sejumlah alasan. Contoh:
- Driver tidak mendukung jenis data ini.
- Driver hanya mendukung operasi dengan parameter input tertentu. Misalnya, driver mungkin mendukung operasi konvolusi 3x3 dan 5x5, tetapi tidak 7x7.
- Driver memiliki batasan memori yang mencegahnya menangani grafik atau input berukuran besar.
Selama kompilasi, input, output, dan operand internal model, seperti
yang dijelaskan dalam
OperandLifeTime
,
dapat memiliki dimensi atau peringkat yang tidak diketahui. Untuk mengetahui informasi selengkapnya, lihat
Bentuk output.
Framework ini menginstruksikan setiap driver yang dipilih untuk bersiap mengeksekusi subset
model dengan memanggil
IDevice::prepareModel_1_3
.
Setiap driver kemudian mengompilasi subsetnya. Misalnya, driver dapat membuat kode atau membuat salinan bobot yang diurutkan ulang. Karena mungkin ada
waktu yang signifikan antara kompilasi model dan
eksekusi permintaan, resource seperti sebagian besar memori perangkat tidak boleh
ditetapkan selama kompilasi.
Jika berhasil, driver akan menampilkan handle
@1.3::IPreparedModel
. Jika driver menampilkan kode kegagalan saat menyiapkan subset model, framework akan menjalankan seluruh model pada CPU.
Untuk mengurangi waktu yang digunakan untuk kompilasi saat aplikasi dimulai, driver dapat menyimpan artefak kompilasi dalam cache. Untuk informasi selengkapnya, lihat Pembuatan Cache Kompilasi.
Eksekusi
Saat aplikasi meminta framework untuk mengeksekusi permintaan, framework akan memanggil
metode HAL
IPreparedModel::executeSynchronously_1_3
secara default untuk melakukan eksekusi sinkron pada model yang sudah disiapkan.
Permintaan juga dapat dieksekusi secara asinkron menggunakan metode execute_1_3
, metode executeFenced
(lihat Eksekusi berpagar), atau dieksekusi menggunakan eksekusi burst.
Panggilan eksekusi sinkron meningkatkan performa dan mengurangi overhead threading dibandingkan dengan panggilan asinkron karena kontrol dikembalikan ke proses aplikasi hanya setelah eksekusi selesai. Ini berarti driver tidak memerlukan mekanisme terpisah untuk memberi tahu proses aplikasi bahwa eksekusi selesai.
Dengan metode execute_1_3
asinkron, kontrol akan kembali ke
proses aplikasi setelah eksekusi dimulai, dan driver harus memberi tahu
framework saat eksekusi selesai, menggunakan
@1.3::IExecutionCallback
.
Parameter Request
yang diteruskan ke metode eksekusi mencantumkan operand input dan output
yang digunakan untuk eksekusi. Memori yang menyimpan data operand harus
menggunakan urutan baris utama dengan dimensi pertama yang melakukan iterasi paling lambat dan tidak memiliki
padding di akhir baris. 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 akan ditampilkan ke framework. Selama eksekusi, output atau operand internal model dapat memiliki satu atau beberapa dimensi yang tidak diketahui atau urutan yang tidak diketahui. Jika setidaknya satu operand output memiliki dimensi atau peringkat yang tidak diketahui, driver harus menampilkan informasi output yang berukuran dinamis.
Untuk driver dengan NN HAL 1.1 atau yang lebih rendah, hanya status error yang ditampilkan saat permintaan selesai. Dimensi untuk operand input dan output harus ditentukan sepenuhnya agar eksekusi berhasil diselesaikan. Operand internal dapat memiliki satu atau beberapa dimensi yang tidak diketahui, tetapi harus memiliki peringkat yang ditentukan.
Untuk permintaan pengguna yang mencakup beberapa driver, framework bertanggung jawab untuk menyimpan memori perantara dan untuk mengurutkan panggilan ke setiap driver.
Beberapa permintaan dapat dimulai secara paralel di
@1.3::IPreparedModel
yang sama.
Pengemudi dapat menjalankan permintaan secara paralel atau melakukan serialisasi eksekusi.
Framework dapat meminta pengemudi untuk menyimpan lebih dari satu model yang disiapkan. Misalnya, menyiapkan model m1
, menyiapkan m2
, mengeksekusi permintaan r1
pada m1
, mengeksekusi
r2
pada m2
, mengeksekusi r3
pada m1
, mengeksekusi r4
pada m2
, merilis (dijelaskan dalam
Pembersihan) m1
, dan merilis m2
.
Untuk menghindari eksekusi pertama yang lambat yang dapat mengakibatkan pengalaman pengguna yang buruk (misalnya, frame pertama yang tersendat), driver harus melakukan sebagian besar inisialisasi pada fase kompilasi. Inisialisasi pada eksekusi pertama harus dibatasi pada tindakan yang berdampak negatif pada kesehatan sistem jika dilakukan lebih awal, seperti memesan buffer sementara yang besar atau meningkatkan kecepatan clock perangkat. Driver yang hanya dapat menyiapkan sejumlah model serentak yang terbatas mungkin harus melakukan inisialisasi pada eksekusi pertama.
Di Android 10 atau yang lebih tinggi, jika beberapa eksekusi dengan model yang disiapkan sama dijalankan secara berurutan dengan cepat, klien dapat memilih untuk menggunakan objek burst eksekusi untuk berkomunikasi antara proses aplikasi dan driver. Untuk mengetahui informasi selengkapnya, lihat Eksekusi Burst dan Antrean Pesan Cepat.
Guna meningkatkan performa untuk beberapa eksekusi secara berurutan dengan cepat, driver dapat mempertahankan buffer sementara atau meningkatkan kecepatan clock. Membuat thread watchdog direkomendasikan untuk melepaskan resource jika tidak ada permintaan baru yang dibuat setelah jangka waktu tetap.
Bentuk output
Untuk permintaan dengan satu atau beberapa operand output yang tidak memiliki semua dimensi
yang ditentukan, driver harus memberikan daftar bentuk output yang berisi
informasi dimensi untuk setiap operand output setelah dieksekusi. Untuk mengetahui informasi
selengkapnya tentang dimensi, lihat
OutputShape
.
Jika eksekusi gagal karena buffer output yang berukuran terlalu kecil, driver harus menunjukkan operand output mana yang ukuran buffer-nya tidak memadai 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 waktu
eksekusi jika aplikasi
telah menentukan satu perangkat untuk digunakan selama proses kompilasi. Untuk
mengetahui detailnya, lihat
MeasureTiming
dan Penemuan dan Penetapan Perangkat.
Dalam hal ini,
driver NN HAL 1.2 harus mengukur durasi eksekusi atau melaporkan UINT64_MAX
(untuk
menunjukkan bahwa durasi tidak tersedia) saat menjalankan permintaan. Pengemudi
harus meminimalkan penalti performa yang dihasilkan dari pengukuran durasi
eksekusi.
Pengemudi melaporkan durasi berikut dalam mikrodetik dalam
struktur
Timing
:
- Waktu eksekusi pada perangkat: Tidak mencakup waktu eksekusi dalam driver, yang berjalan pada prosesor host.
- Waktu eksekusi di driver: Mencakup waktu eksekusi di perangkat.
Durasi ini harus mencakup waktu saat eksekusi ditangguhkan, misalnya, saat eksekusi telah didahului oleh tugas lain atau saat menunggu resource tersedia.
Saat driver belum diminta untuk mengukur durasi eksekusi, atau saat
terjadi error eksekusi, driver harus melaporkan durasi sebagai
UINT64_MAX
. Bahkan saat pengemudi diminta untuk mengukur durasi
eksekusi, pengemudi dapat melaporkan UINT64_MAX
untuk waktu di perangkat, waktu di
driver, atau keduanya. Jika driver melaporkan kedua durasi sebagai nilai selain
UINT64_MAX
, waktu eksekusi di driver harus sama dengan atau melebihi waktu di
perangkat.
Eksekusi berpagar
Di Android 11, NNAPI memungkinkan eksekusi menunggu
daftar handle sync_fence
dan secara opsional menampilkan objek sync_fence
, yang
diberi sinyal saat eksekusi selesai. Hal ini mengurangi overhead untuk
model urutan dan kasus penggunaan streaming yang kecil. Eksekusi berpagar juga memungkinkan interoperabilitas yang lebih
efisien dengan komponen lain yang dapat memberikan sinyal atau menunggu
sync_fence
. Untuk mengetahui informasi selengkapnya tentang sync_fence
, lihat
Framework sinkronisasi.
Dalam eksekusi dengan fence, framework 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
. Objek IFencedExecutionCallback
juga harus ditampilkan untuk memungkinkan framework membuat kueri status error dan informasi durasi.
Setelah eksekusi selesai, dua nilai
waktu
berikut yang mengukur durasi eksekusi dapat dikueri melalui
IFencedExecutionCallback::getExecutionInfo
.
timingLaunched
: Durasi dari saatexecuteFenced
dipanggil hingga saatexecuteFenced
memberi sinyalsyncFence
yang ditampilkan.timingFenced
: Durasi dari saat semua fence sinkronisasi yang ditunggu eksekusi diberi sinyal saatexecuteFenced
menandakansyncFence
yang ditampilkan.
Alur kontrol
Untuk perangkat yang menjalankan Android 11 atau yang lebih tinggi, NNAPI
menyertakan dua operasi alur kontrol, IF
dan WHILE
, yang menggunakan model lain
sebagai argumen dan mengeksekusinya secara kondisional (IF
) atau berulang kali (WHILE
). Untuk
mengetahui informasi selengkapnya tentang cara menerapkannya, lihat
Alur kontrol.
Kualitas layanan
Di Android 11, NNAPI menyertakan kualitas layanan (QoS) yang lebih baik dengan memungkinkan aplikasi menunjukkan prioritas relatif modelnya, jumlah waktu maksimum yang diperkirakan untuk menyiapkan model, dan jumlah waktu maksimum yang diperkirakan untuk menyelesaikan eksekusi. Untuk mengetahui informasi selengkapnya, lihat Kualitas Layanan.
Pembersihan
Saat aplikasi selesai menggunakan model yang disiapkan, framework akan merilis
referensinya ke
objek
@1.3::IPreparedModel
. Jika tidak lagi direferensikan, objek IPreparedModel
akan
otomatis dihancurkan di layanan driver yang membuatnya. Resource khusus model
dapat diperoleh kembali saat ini dalam implementasi
destruktor oleh driver. Jika layanan driver ingin objek IPreparedModel
dihancurkan secara otomatis saat tidak lagi diperlukan oleh klien, layanan tersebut tidak boleh menyimpan
referensi apa pun ke objek IPreparedModel
setelah objek IPreparedeModel
ditampilkan melalui
IPreparedModelCallback::notify_1_3
.
Penggunaan CPU
Driver diharapkan menggunakan CPU untuk menyiapkan komputasi. Driver tidak boleh menggunakan CPU untuk melakukan komputasi grafik karena hal tersebut akan mengganggu kemampuan framework untuk mengalokasikan pekerjaan dengan benar. Driver harus melaporkan bagian yang tidak dapat ditanganinya ke framework dan membiarkan framework menangani bagian lainnya.
Framework ini menyediakan implementasi CPU untuk semua operasi NNAPI kecuali operasi yang ditentukan vendor. Untuk informasi selengkapnya, lihat Ekstensi Vendor.
Operasi yang diperkenalkan di Android 10 (API level 29) hanya memiliki implementasi CPU referensi untuk memverifikasi bahwa pengujian CTS dan VTS sudah benar. Implementasi yang dioptimalkan yang disertakan dalam framework machine learning seluler lebih disukai daripada implementasi CPU NNAPI.
Fungsi utilitas
Codebase NNAPI menyertakan fungsi utilitas yang dapat digunakan oleh layanan driver.
File
frameworks/ml/nn/common/include/Utils.h
berisi berbagai fungsi utilitas, seperti yang digunakan untuk logging dan
untuk melakukan konversi antara versi NN HAL yang berbeda.
VLogging:
VLOG
adalah makro wrapper di sekitarLOG
Android yang hanya mencatat pesan ke dalam log jika tag yang sesuai ditetapkan di propertidebug.nn.vlog
.initVLogMask()
harus dipanggil sebelum panggilan keVLOG
. MakroVLOG_IS_ON
dapat digunakan untuk memeriksa apakahVLOG
saat ini sudah diaktifkan, sehingga kode logging yang rumit dapat dilewati jika tidak diperlukan. Nilai properti harus berupa salah satu dari 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 dengan spasi, koma, atau titik dua,
yang menunjukkan logging yang akan dilakukan. Tag-nya adalah
compilation
,cpuexe
,driver
,execution
,manager
, danmodel
.
compliantWithV1_*
: Menampilkantrue
jika objek NN HAL dapat dikonversi ke jenis yang sama dari versi HAL yang berbeda tanpa kehilangan informasi. Misalnya, memanggilcompliantWithV1_0
padaV1_2::Model
akan menampilkanfalse
jika modelnya menyertakan 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 (yaitu, jika versi baru jenis tidak dapat sepenuhnya merepresentasikan nilai).Kemampuan: Fungsi
nonExtensionOperandPerformance
danupdate
dapat digunakan untuk membantu membangun kolomCapabilities::operandPerformance
.Membuat kueri properti jenis:
isExtensionOperandType
,isExtensionOperationType
,nonExtensionSizeOfData
,nonExtensionOperandSizeOfData
,nonExtensionOperandTypeIsScalar
,tensorHasUnspecifiedDimensions
.
File
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 OEM dan jenis ekstensi tidak divalidasi. Misalnya,validateModel
menampilkanfalse
jika model berisi operasi yang mereferensikan indeks operand yang tidak ada, atau operasi yang tidak didukung pada versi HAL tersebut.
File
frameworks/ml/nn/common/include/Tracing.h
berisi makro untuk menyederhanakan penambahan
informasi systracing ke kode Jaringan Neural.
Sebagai contoh, lihat pemanggilan makro NNTRACE_*
pada
contoh driver.
File
frameworks/ml/nn/common/include/GraphDump.h
berisi fungsi utilitas untuk membuang konten Model
dalam bentuk
grafik untuk tujuan proses debug.
graphDump
: Menulis representasi model dalam format Graphviz (.dot
) ke aliran data yang ditentukan (jika tersedia) atau ke logcat (jika tidak ada aliran data yang disediakan).
Validasi
Untuk menguji penerapan NNAPI, gunakan pengujian VTS dan CTS yang disertakan dalam framework Android. VTS menjalankan driver Anda secara langsung (tanpa menggunakan framework), sedangkan CTS menjalankannya secara tidak langsung melalui framework. Pengujian ini menguji setiap metode API dan memverifikasi bahwa semua operasi yang didukung oleh driver berfungsi dengan benar dan memberikan hasil yang memenuhi persyaratan presisi.
Persyaratan presisi di CTS dan VTS untuk NNAPI adalah sebagai berikut:
Floating point: abs(expected - actual) <= atol + rtol * abs(expected); dengan:
- Untuk fp32, atol = 1e-5f, rtol = 5.0f * 1.1920928955078125e-7
- Untuk fp16, atol = rtol = 5.0f * 0.0009765625f
Dikuantisasi: off-by-one (kecuali untuk
mobilenet_quantized
, yang off-by-three)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 driver dengan
penerapan referensi NNAPI. Untuk driver dengan NN HAL 1.2 atau yang lebih tinggi, jika
hasilnya tidak memenuhi kriteria presisi, CTS akan melaporkan error dan mengeluarkan
file spesifikasi untuk model yang gagal di bagian /data/local/tmp
untuk proses debug.
Untuk mengetahui detail selengkapnya tentang kriteria presisi, lihat
TestRandomGraph.cpp
dan
TestHarness.h
.
Uji kegagalan (fuzz testing)
Tujuan pengujian fuzz adalah menemukan error, pernyataan, pelanggaran memori, atau perilaku umum yang tidak ditentukan dalam kode yang sedang diuji karena faktor-faktor seperti input yang tidak terduga. Untuk pengujian fuzz NNAPI, Android menggunakan pengujian berdasarkan libFuzzer, yang efisien dalam melakukan fuzzing karena menggunakan cakupan baris dari kasus pengujian sebelumnya untuk menghasilkan input acak baru. Misalnya, libFuzzer lebih memilih kasus pengujian yang berjalan pada baris kode baru. Hal ini sangat mengurangi waktu yang dibutuhkan pengujian untuk menemukan kode yang bermasalah.
Untuk melakukan pengujian fuzz guna memvalidasi implementasi driver, modifikasi frameworks/ml/nn/runtime/test/android_fuzzing/DriverFuzzTest.cpp
pada utilitas pengujian libneuralnetworks_driver_fuzzer
yang terdapat di AOSP untuk menyertakan kode driver 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 driver,
driver harus memvalidasi argumen panggilan yang diterima. Validasi ini
diverifikasi oleh VTS. Kode validasi ada di
frameworks/ml/nn/common/include/ValidateHal.h
.
Driver juga harus memastikan bahwa aplikasi tidak dapat mengganggu aplikasi lain saat menggunakan perangkat yang sama.
Android Machine Learning Test Suite
Android Machine Learning Test Suite (MLTS) adalah tolok ukur NNAPI yang disertakan dalam CTS dan VTS untuk memvalidasi akurasi model sebenarnya di perangkat vendor. Tolok ukur mengevaluasi latensi dan akurasi, serta membandingkan hasil driver dengan hasil menggunakan TF Lite yang berjalan di CPU, untuk model dan set data yang sama. Hal ini memastikan akurasi driver tidak lebih buruk daripada implementasi referensi CPU.
Developer platform Android juga menggunakan MLTS untuk mengevaluasi latensi dan akurasi driver.
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
Benchmark NNAPI menggunakan model dan set data berikut.
- Float MobileNetV1 dan u8 dikuantisasi dalam berbagai ukuran, dijalankan terhadap sebagian kecil (1.500 gambar) dari Set Data Gambar Terbuka v4.
- MobileNetV2 float dan u8 yang dikuantisasi dalam berbagai ukuran, dijalankan terhadap subkumpulan kecil (1.500 gambar) Open Images Dataset v4.
- Model akustik berbasis long short-term memory (LSTM) untuk text-to-speech, berjalan pada sebagian kecil set CMU Arctic.
- Model akustik berbasis LSTM untuk pengenalan ucapan otomatis, dijalankan pada sebagian kecil set data 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 yang berat atau dalam kasus ekstrem perilaku klien.
Semua uji error menyediakan fitur berikut:
- Deteksi hang: Jika klien NNAPI mengalami hang selama pengujian, pengujian gagal dengan alasan kegagalan
HANG
dan paket pengujian akan berpindah ke pengujian berikutnya. - Deteksi error klien NNAPI: Pengujian bertahan dari error klien dan pengujian
gagal dengan alasan kegagalan
CRASH
. - Deteksi tabrakan pengemudi: Pengujian dapat mendeteksi error driver
yang menyebabkan kegagalan pada panggilan NNAPI. Perhatikan bahwa mungkin terjadi error dalam
proses driver yang tidak menyebabkan kegagalan NNAPI dan tidak menyebabkan pengujian
gagal. Untuk mengatasi jenis kegagalan ini, sebaiknya jalankan perintah
tail
di log sistem untuk menemukan error atau error terkait driver. - Penargetan semua akselerator yang tersedia: Pengujian dijalankan terhadap semua driver yang tersedia.
Semua uji error memiliki empat kemungkinan hasil berikut:
SUCCESS
: Eksekusi selesai tanpa error.FAILURE
: Eksekusi gagal. Biasanya disebabkan oleh kegagalan saat menguji model, yang menunjukkan bahwa driver gagal mengompilasi atau mengeksekusi model.HANG
: Proses pengujian menjadi tidak responsif.CRASH
: Proses pengujian mengalami error.
Untuk informasi selengkapnya tentang pengujian stres dan daftar lengkap pengujian error, lihat
platform/test/mlts/benchmark/README.txt
.
Menggunakan MLTS
Untuk menggunakan MLTS:
- Hubungkan perangkat target ke workstation dan pastikan perangkat
dapat dijangkau melalui
adb.
Mengekspor variabel lingkungan
ANDROID_SERIAL
perangkat target 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 benchmark, hasilnya akan ditampilkan 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 dalam versi HAL Jaringan Neural dan Android.
Android 11
Android 11 memperkenalkan NN HAL 1.3, yang mencakup perubahan penting berikut.
- Dukungan untuk kuantisasi 8-bit yang ditandatangani dalam NNAPI. Menambahkan
jenis operasi
TENSOR_QUANT8_ASYMM_SIGNED
. Driver dengan NN HAL 1.3 yang mendukung operasi dengan kuantisasi tanpa tanda tangan juga harus mendukung varian bertanda tangan dari operasi tersebut. Saat menjalankan versi bertanda tangan dan tidak ditandatangani dari sebagian besar operasi terkuantisasi, driver harus memberikan hasil yang sama hingga offset 128. Ada lima pengecualian untuk persyaratan ini:CAST
,HASHTABLE_LOOKUP
,LSH_PROJECTION
,PAD_V2
, danQUANTIZED_16BIT_LSTM
. OperasiQUANTIZED_16BIT_LSTM
tidak mendukung operand bertanda tangan, dan empat operasi lainnya mendukung kuantisasi bertanda tangan, tetapi tidak mengharuskan hasilnya sama. - Dukungan untuk eksekusi dengan fence saat framework memanggil metode
IPreparedModel::executeFenced
untuk meluncurkan eksekusi asinkron dengan fence pada model yang 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 mengetahui informasi selengkapnya, lihat Alur kontrol. - Peningkatan kualitas layanan (QoS) karena aplikasi dapat menunjukkan prioritas relatif modelnya, jumlah waktu maksimum yang diperkirakan untuk model disiapkan, dan jumlah waktu maksimum yang diperkirakan untuk eksekusi selesai. Untuk informasi selengkapnya, lihat Kualitas Layanan.
- Dukungan untuk domain memori yang menyediakan antarmuka pengalokasi untuk buffer yang dikelola driver. Hal ini memungkinkan penerusan memori native perangkat di seluruh eksekusi, sehingga menekan penyalinan dan transformasi data yang tidak perlu di antara eksekusi berurutan pada driver yang sama. Untuk mengetahui informasi selengkapnya, lihat Domain memori.
Android 10
Android 10 memperkenalkan NN HAL 1.2, yang mencakup perubahan penting berikut.
- Struct
Capabilities
mencakup semua jenis data, termasuk jenis data skalar, dan mewakili performa non-santai menggunakan vektor, bukan kolom bernama. - Metode
getVersionString
dangetType
memungkinkan framework mengambil jenis perangkat (DeviceType
) dan informasi versi. Lihat Penemuan dan Penetapan Perangkat. - Metode
executeSynchronously
dipanggil secara default untuk melakukan eksekusi secara sinkron. Metodeexecute_1_2
memberi tahu framework untuk melakukan eksekusi secara asinkron. Lihat Eksekusi. - Parameter
MeasureTiming
untukexecuteSynchronously
,execute_1_2
, dan eksekusi burst menentukan apakah driver akan mengukur durasi eksekusi. Hasilnya dilaporkan dalam strukturTiming
. Lihat Pengaturan waktu. - Dukungan untuk eksekusi dengan satu atau beberapa operand output yang memiliki dimensi atau tingkat yang tidak diketahui. Lihat Bentuk output.
- Dukungan untuk ekstensi vendor, yang merupakan kumpulan operasi dan jenis data
yang ditentukan vendor. 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 proses aplikasi dan driver, sehingga mengurangi latensi. Lihat Eksekusi Burst dan Antrean Pesan Cepat.
- Dukungan untuk AHardwareBuffer agar driver dapat melakukan eksekusi tanpa menyalin data. Lihat AHardwareBuffer.
- Meningkatkan dukungan untuk caching artefak kompilasi guna mengurangi waktu yang digunakan untuk kompilasi saat aplikasi dimulai. Lihat Caching Kompilasi.
Android 10 memperkenalkan jenis dan operasi operand berikut.
-
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 operasi yang sudah ada. Update ini secara khusus terkait dengan hal berikut:
- Dukungan untuk tata letak memori NCHW
- Dukungan untuk tensor dengan peringkat yang berbeda dari 4 dalam operasi softmax dan normalisasi
- Dukungan untuk konvolusi yang diluaskan
- Dukungan untuk input dengan kuantisasi campuran di
ANEURALNETWORKS_CONCATENATION
Daftar di bawah menunjukkan operasi yang diubah di Android 10. Untuk mengetahui detail lengkap 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 di Android 9 dan menyertakan perubahan penting berikut.
IDevice::prepareModel_1_1
menyertakan parameterExecutionPreference
. Pengemudi dapat menggunakannya untuk menyesuaikan persiapannya, dengan mengetahui bahwa aplikasi lebih memilih untuk menghemat baterai atau akan menjalankan model dalam panggilan berturut-turut yang cepat.- Sembilan operasi baru telah ditambahkan:
BATCH_TO_SPACE_ND
,DIV
,MEAN
,PAD
,SPACE_TO_BATCH_ND
,SQUEEZE
,STRIDED_SLICE
,SUB
,TRANSPOSE
. - Aplikasi dapat menentukan bahwa komputasi float 32-bit dapat dijalankan
menggunakan rentang dan/atau presisi float 16-bit dengan menetapkan
Model.relaxComputationFloat32toFloat16
ketrue
. StrukturCapabilities
memiliki kolom tambahanrelaxedFloat32toFloat16Performance
sehingga driver dapat melaporkan performa longgarnya ke framework.
Android 8.1
Neural Networks HAL (1.0) awal dirilis di Android 8.1. Untuk mengetahui
informasi selengkapnya, lihat
/neuralnetworks/1.0/
.