Kể từ Android 11, NNAPI cung cấp chất lượng dịch vụ (QoS) tốt hơn bằng cách cho phép một ứng dụng cho biết các mức độ ưu tiên tương đối của các mô hình, khoảng thời gian tối đa dự kiến cần để chuẩn bị một mô hình nhất định và thời lượng tối đa dự kiến cần để hoàn tất một quy trình thực thi nhất định. Ngoài ra, Android 11 giới thiệu các giá trị lỗi NNAPI bổ sung, cho phép dịch vụ cho biết chính xác hơn những gì đã xảy ra khi có lỗi để ứng dụng khách có thể phản ứng và khôi phục tốt hơn.
Mức độ ưu tiên
Đối với Android 11 trở lên, các mô hình được chuẩn bị theo mức độ ưu tiên trong NN HAL 1.3. Mức độ ưu tiên này tương ứng với các mô hình được chuẩn bị khác do cùng một ứng dụng sở hữu. Các hoạt động thực thi có mức độ ưu tiên cao hơn có thể sử dụng nhiều tài nguyên điện toán hơn các hoạt động thực thi có mức độ ưu tiên thấp hơn và có thể chiếm quyền hoặc làm cạn kiệt các hoạt động thực thi có mức độ ưu tiên thấp hơn.
Lệnh gọi NN HAL 1.3 bao gồm Priority
dưới dạng một đối số rõ ràng là IDevice::prepareModel_1_3
.
Xin lưu ý rằng IDevice::prepareModelFromCache_1_3
ngầm bao gồm Priority
trong các đối số của bộ nhớ đệm.
Có nhiều chiến lược có thể hỗ trợ các mức độ ưu tiên, tuỳ thuộc vào khả năng của trình điều khiển và bộ tăng tốc. Dưới đây là một số chiến lược:
- Đối với những trình điều khiển có dịch vụ hỗ trợ ưu tiên tích hợp, hãy truyền trực tiếp trường
Priority
đến bộ tăng tốc. - Sử dụng hàng đợi ưu tiên cho mỗi ứng dụng để hỗ trợ các mức độ ưu tiên khác nhau ngay cả trước khi quá trình thực thi đạt đến bộ tăng tốc.
Tạm dừng hoặc huỷ các mô hình có mức độ ưu tiên thấp đang được thực thi để giải phóng bộ tăng tốc nhằm thực thi các mô hình có mức độ ưu tiên cao. Hãy làm việc này bằng cách chèn các điểm kiểm tra vào các mô hình có mức độ ưu tiên thấp. Khi đạt đến các điểm này, hãy truy vấn một cờ để xác định xem quá trình thực thi hiện tại có nên bị dừng sớm hay không bằng cách phân vùng mô hình thành các mô hình con và truy vấn cờ giữa các lần thực thi mô hình con. Xin lưu ý rằng việc sử dụng các điểm kiểm tra hoặc mô hình con trong các mô hình được chuẩn bị theo mức độ ưu tiên có thể làm tăng thêm chi phí không có trong các mô hình không có mức độ ưu tiên trong các phiên bản thấp hơn NN HAL 1.3.
- Để hỗ trợ quyền ưu tiên, hãy giữ lại ngữ cảnh thực thi, bao gồm cả thao tác hoặc mô hình con tiếp theo sẽ được thực thi và mọi dữ liệu toán hạng trung gian có liên quan. Sử dụng ngữ cảnh thực thi này để tiếp tục thực thi vào lúc khác.
- Không cần hỗ trợ đầy đủ quyền ưu tiên, do đó, không cần phải giữ lại ngữ cảnh thực thi. Vì quá trình thực thi mô hình NNAPI mang tính xác định, nên bạn có thể khởi động lại quá trình thực thi từ đầu vào lúc khác.
Android cho phép các dịch vụ phân biệt giữa các ứng dụng gọi khác nhau thông qua việc sử dụng AID (UID Android). HIDL có các cơ chế tích hợp sẵn để truy xuất UID của ứng dụng gọi thông qua phương thức ::android::hardware::IPCThreadState::getCallingUid
. Bạn có thể tìm thấy danh sách AID trong libcutils/include/cutils/android_filesystem_config.h
.
Thời hạn
Kể từ Android 11, bạn có thể khởi chạy quá trình chuẩn bị và thực thi mô hình bằng đối số thời hạn OptionalTimePoint
. Đối với những người lái xe có thể ước tính thời gian cần thiết để hoàn thành một nhiệm vụ, thời hạn này cho phép người lái xe huỷ nhiệm vụ trước khi bắt đầu nếu người lái xe ước tính rằng không thể hoàn thành nhiệm vụ trước thời hạn. Tương tự, thời hạn cho phép trình điều khiển huỷ bỏ một tác vụ đang diễn ra mà trình điều khiển ước tính sẽ không hoàn thành trước thời hạn.
Đối số thời hạn không buộc trình điều khiển huỷ bỏ một tác vụ nếu tác vụ đó chưa hoàn tất trước thời hạn hoặc nếu thời hạn đã qua. Bạn có thể dùng đối số thời hạn để giải phóng tài nguyên điện toán trong trình điều khiển và trả lại quyền kiểm soát cho ứng dụng nhanh hơn so với khi không có thời hạn.
Các lệnh gọi NN HAL 1.3 bao gồm thời hạn OptionalTimePoint
dưới dạng một đối số là:
IDevice::prepareModel_1_3
IDevice::prepareModelFromCache_1_3
IPreparedModel::execute_1_3
IPreparedModel::executeSynchronously_1_3
IPreparedModel::executeFenced
Để xem cách triển khai tham chiếu của tính năng thời hạn cho từng phương thức nêu trên, hãy xem trình điều khiển mẫu NNAPI tại frameworks/ml/nn/driver/sample/SampleDriver.cpp
.
Mã lỗi
Android 11 có 4 giá trị mã lỗi trong NN HAL 1.3 để cải thiện tính năng báo cáo lỗi, cho phép trình điều khiển giao tiếp tốt hơn về trạng thái của chúng và các ứng dụng khôi phục mượt mà hơn. Đây là các giá trị mã lỗi trong ErrorStatus
.
MISSED_DEADLINE_TRANSIENT
MISSED_DEADLINE_PERSISTENT
RESOURCE_EXHAUSTED_TRANSIENT
RESOURCE_EXHAUSTED_PERSISTENT
Trong Android 10 trở xuống, trình điều khiển chỉ có thể cho biết lỗi thông qua mã lỗi GENERAL_FAILURE
. Kể từ Android 11, bạn có thể dùng 2 mã lỗi MISSED_DEADLINE
để cho biết rằng tải công việc đã bị huỷ vì đã hết thời hạn hoặc vì trình điều khiển dự đoán rằng tải công việc sẽ không hoàn thành trước thời hạn. Bạn có thể dùng 2 mã lỗi RESOURCE_EXHAUSTED
để cho biết rằng tác vụ không thành công do giới hạn tài nguyên trong trình điều khiển, chẳng hạn như trình điều khiển không có đủ bộ nhớ cho lệnh gọi.
Phiên bản TRANSIENT
của cả hai lỗi cho biết vấn đề chỉ là tạm thời và các lệnh gọi trong tương lai đến cùng một tác vụ có thể thành công sau một khoảng thời gian ngắn. Ví dụ: mã lỗi này sẽ được trả về khi trình điều khiển đang bận với công việc trước đó kéo dài hoặc tốn nhiều tài nguyên, nhưng tác vụ mới sẽ hoàn tất thành công nếu trình điều khiển không bận với công việc trước đó. Phiên bản PERSISTENT
của cả hai lỗi cho biết rằng các lệnh gọi trong tương lai cho cùng một tác vụ luôn được dự kiến sẽ không thành công. Ví dụ: mã lỗi này sẽ được trả về khi trình điều khiển ước tính rằng tác vụ sẽ không hoàn tất đúng thời hạn ngay cả trong điều kiện hoàn hảo, hoặc mô hình vốn dĩ quá lớn và vượt quá tài nguyên của trình điều khiển.
Xác nhận kết quả
Chức năng chất lượng dịch vụ được kiểm thử trong các kiểm thử VTS NNAPI (VtsHalNeuralnetworksV1_3Target
). Trong đó có một bộ kiểm thử để xác thực (TestGenerated/ValidationTest#Test/
) nhằm đảm bảo rằng trình điều khiển từ chối các mức độ ưu tiên không hợp lệ và một bộ kiểm thử có tên là DeadlineTest
(TestGenerated/DeadlineTest#Test/
) để đảm bảo rằng trình điều khiển xử lý đúng thời hạn.