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 ứ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 quá trình thực thi nhất định. Ngoài ra, Android 11 còn giới thiệu thêm các giá trị lỗi NNAPI để cho phép dịch vụ cho biết chính xác hơn lỗi xảy ra khi xảy ra 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ị với mức độ ưu tiên trong NN HAL 1.3. Mức độ ưu tiên này so với các mô hình đã chuẩn bị khác do cùng một ứng dụng sở hữu. Các quá trình thực thi có mức độ ưu tiên cao hơn có thể dùng nhiều tài nguyên điện toán hơn so với các lượt thực thi có mức độ ưu tiên thấp hơn, đồng thời có thể giành quyền hoặc bỏ qua các lượt 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 đối số tường minh 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ố bộ nhớ đệm.
Có nhiều chiến lược có thể hỗ trợ mức độ ưu tiên, tuỳ thuộc vào khả năng của trình điều khiển và trình tăng tốc. Sau đây là một số chiến lược:
- Đối với trình điều khiển có hỗ trợ ưu tiên tích hợp, hãy trực tiếp truyền trường
Priority
đến trình tăng tốc. - Sử dụng hàng đợi mức độ ưu tiên cho mỗi ứng dụng để hỗ trợ nhiều mức độ ưu tiên ngay cả trước khi quá trình thực thi đến trình 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 trình tăng tốc nhằm thực thi các mô hình có mức độ ưu tiên cao. Bạn có thể thực hiện việc này bằng cách chèn điểm kiểm tra vào các mô hình có mức độ ưu tiên thấp. Khi đạt đến điểm kiểm tra, hãy truy vấn một cờ để xác định xem có nên tạm dừng quá trình thực thi hiện tại hay không hoặc bằng cách phân chia mô hình thành 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ể gây ra thêm hao tổn 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ợ tính năng can thiệp trước, 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.
- Bạn không cần hỗ trợ quyền giành quyền đầy đủ, vì vậy, bạn không cần duy trì ngữ cảnh thực thi. Vì các lần thực thi mô hình NNAPI là xác định, nên bạn có thể bắt đầu lại các lần 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 thông qua việc sử dụng một mã nhận dạng (AID) (UID trong Android). HIDL có các cơ chế tích hợp để 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ể bắt đầu 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 người lái xe có thể ước tính khoảng thời gian cần thực hiện một tác vụ, thời hạn này cho phép người lái xe huỷ tác vụ đó trước khi bắt đầu nếu trình điều khiển ước tính rằng không thể hoàn thành tác vụ đó trước thời hạn. Tương tự, thời hạn cho phép trình điều khiển huỷ một tác vụ đang diễn ra mà trình điều khiển ước tính sẽ không hoàn tất trước thời hạn.
Đối số thời hạn không buộc trình điều khiển huỷ một tác vụ nếu tác vụ đó không hoàn tất trước thời hạn hoặc nếu thời hạn đã trôi qua. Bạn có thể sử 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 đố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 tính năng thời hạn cho từng phương thức 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 cung cấp 4 giá trị mã lỗi trong NN HAL 1.3 để cải thiện việc báo cáo lỗi, cho phép người lái xe thông báo hiệu quả hơn về trạng thái và ứng dụng để khôi phục linh hoạt 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
. Từ Android 11, bạn có thể sử dụng 2 mã lỗi MISSED_DEADLINE
để cho biết khối lượng công việc đã bị huỷ vì đã đến thời hạn hoặc vì trình điều khiển dự đoán khối lượng công việc sẽ không hoàn thành đúng thời hạn. Bạn có thể dùng 2 mã lỗi RESOURCE_EXHAUSTED
để cho biết tác vụ không thực hiện được do có 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 đề 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 bị trì hoã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ác công việc chạy trong thời gian dài hoặc tốn nhiều tài nguyên trước đó, 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 đến cùng một tác vụ luôn dự kiến sẽ không thành công. Ví dụ: mã lỗi này phải được trả về khi người lái xe ước tính tác vụ sẽ không hoàn thành đúng thời hạn ngay cả trong điều kiện hoàn hảo, hoặc mô hình vốn quá lớn và vượt quá tài nguyên của người lái xe.
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 bài 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 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 trình điều khiển xử lý đúng hạn chót.