Mulai dari Android 11, NNAPI menawarkan kualitas layanan (QoS) yang lebih baik dengan memungkinkan aplikasi menunjukkan prioritas relatif modelnya, jumlah waktu maksimum yang diperkirakan untuk menyiapkan model tertentu, dan jumlah waktu maksimum yang diperkirakan untuk menyelesaikan eksekusi tertentu. Selain itu, Android 11 memperkenalkan nilai error NNAPI tambahan yang memungkinkan layanan menunjukkan masalah yang terjadi saat kegagalan terjadi dengan lebih akurat sehingga aplikasi klien dapat bereaksi dan pulih dengan lebih baik.
Prioritas
Untuk Android 11 atau yang lebih tinggi, model disiapkan dengan prioritas di NN HAL 1.3. Prioritas ini relatif terhadap model lain yang disiapkan dan dimiliki oleh aplikasi yang sama. Eksekusi dengan prioritas lebih tinggi dapat menggunakan lebih banyak resource komputasi daripada eksekusi dengan prioritas lebih rendah, dan dapat mengambil alih atau menghentikan eksekusi dengan prioritas lebih rendah.
Panggilan NN HAL 1.3 yang menyertakan Priority
sebagai argumen eksplisit adalah
IDevice::prepareModel_1_3
.
Perhatikan bahwa
IDevice::prepareModelFromCache_1_3
secara implisit menyertakan Priority
dalam argumen cache.
Ada banyak kemungkinan strategi untuk mendukung prioritas, bergantung pada kemampuan driver dan akselerator. Berikut ini beberapa strateginya:
- Untuk driver yang memiliki dukungan prioritas bawaan, terapkan kolom
Priority
secara langsung ke akselerator. - Gunakan antrean prioritas per aplikasi untuk mendukung prioritas yang berbeda bahkan sebelum eksekusi mencapai akselerator.
Jeda atau batalkan model berprioritas rendah yang sedang dijalankan untuk membebaskan akselerator guna menjalankan model berprioritas tinggi. Lakukan hal ini dengan menyisipkan checkpoint di model prioritas rendah yang, jika tercapai, akan mengkueri tanda untuk menentukan apakah eksekusi saat ini harus dihentikan secara dini atau dengan mempartisi model menjadi submodel dan mengkueri flag di antara eksekusi submodel. Perlu diperhatikan bahwa penggunaan checkpoint atau submodel dalam model yang disiapkan dengan prioritas dapat menimbulkan overhead tambahan yang tidak ada untuk model tanpa prioritas dalam versi yang lebih rendah dari NN HAL 1.3.
- Untuk mendukung preemptif, pertahankan konteks eksekusi termasuk operasi atau submodel berikutnya yang akan dieksekusi dan data operand perantara yang relevan. Gunakan konteks eksekusi ini untuk melanjutkan eksekusi di lain waktu.
- Dukungan preemptif penuh tidak diperlukan, sehingga konteks eksekusi tidak perlu dipertahankan. Karena eksekusi model NNAPI deterministik, eksekusi dapat dimulai ulang dari awal di lain waktu.
Android memungkinkan layanan membedakan antara berbagai aplikasi panggilan melalui
penggunaan AID (Android UID). HIDL memiliki mekanisme bawaan untuk mengambil
UID aplikasi panggilan melalui metode
::android::hardware::IPCThreadState::getCallingUid
. Daftar AID dapat
ditemukan di
libcutils/include/cutils/android_filesystem_config.h
.
Batas waktu
Mulai dari Android 11, persiapan dan
eksekusi model dapat diluncurkan dengan argumen batas waktu OptionalTimePoint
. Untuk
driver yang dapat memperkirakan berapa lama tugas berlangsung, batas waktu ini memungkinkan driver
membatalkan tugas sebelum dimulai jika driver memperkirakan bahwa tugas tidak dapat
selesai sebelum batas waktu. Demikian pula, tenggat waktu memungkinkan pengemudi untuk
membatalkan tugas yang sedang berlangsung yang diperkirakan tidak akan selesai sebelum batas waktu.
Argumen batas waktu tidak memaksa driver untuk membatalkan tugas jika tugas tidak
selesai sebelum batas waktu atau jika batas waktu telah berlalu. Argumen batas waktu
dapat digunakan untuk mengosongkan resource komputasi dalam driver dan mengembalikan kontrol
ke aplikasi lebih cepat daripada yang memungkinkan tanpa batas waktu.
Panggilan NN HAL 1.3 yang menyertakan batas waktu OptionalTimePoint
sebagai argumen
adalah:
IDevice::prepareModel_1_3
IDevice::prepareModelFromCache_1_3
IPreparedModel::execute_1_3
IPreparedModel::executeSynchronously_1_3
IPreparedModel::executeFenced
Untuk melihat implementasi referensi fitur batas waktu untuk setiap metode
di atas, lihat contoh driver NNAPI di
frameworks/ml/nn/driver/sample/SampleDriver.cpp
.
Kode error
Android 11 menyertakan empat nilai kode error di NN HAL 1.3 untuk meningkatkan pelaporan error, sehingga driver dapat mengomunikasikan statusnya dan aplikasi dapat pulih dengan lebih baik. Ini adalah nilai kode error
di ErrorStatus
.
MISSED_DEADLINE_TRANSIENT
MISSED_DEADLINE_PERSISTENT
RESOURCE_EXHAUSTED_TRANSIENT
RESOURCE_EXHAUSTED_PERSISTENT
Di Android 10 atau yang lebih rendah, driver hanya dapat menunjukkan kegagalan melalui
kode error GENERAL_FAILURE
. Dari Android 11, dua kode error MISSED_DEADLINE
dapat digunakan untuk menunjukkan bahwa workload
dibatalkan karena batas waktu tercapai atau karena driver memprediksi
beban kerja tidak akan selesai pada batas waktu. Dua kode error
RESOURCE_EXHAUSTED
dapat digunakan untuk menunjukkan bahwa tugas gagal karena batasan
resource dalam driver, seperti driver yang tidak memiliki cukup memori untuk
panggilan.
Versi TRANSIENT
dari kedua error tersebut menunjukkan bahwa masalahnya bersifat sementara,
dan panggilan mendatang ke tugas yang sama mungkin berhasil setelah penundaan singkat. Misalnya, kode error ini akan ditampilkan saat driver sibuk dengan pekerjaan
sebelumnya yang berjalan lama atau membutuhkan banyak resource, tetapi tugas baru akan berhasil
selesai jika driver tidak sibuk dengan pekerjaan sebelumnya. Versi PERSISTENT
dari kedua error tersebut menunjukkan bahwa panggilan mendatang ke tugas yang sama selalu diharapkan gagal. Misalnya, kode error ini harus ditampilkan saat
pengemudi memperkirakan bahwa tugas tidak akan selesai pada batas waktu bahkan dalam kondisi
sempurna, atau bahwa model terlalu besar dan melebihi resource
driver.
Validasi
Fungsi kualitas layanan diuji dalam pengujian VTS NNAPI
(VtsHalNeuralnetworksV1_3Target
). Hal ini mencakup serangkaian pengujian untuk validasi
(TestGenerated/ValidationTest#Test/
) guna memastikan bahwa driver menolak prioritas
yang tidak valid dan serangkaian pengujian yang disebut DeadlineTest
(TestGenerated/DeadlineTest#Test/
) untuk memastikan bahwa driver menangani batas waktu
dengan benar.