Chất lượng dịch vụ

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, thời lượng tối đa dự kiến cần để một mô hình nhất định được chuẩn bị và lượng thời gian 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 một dịch vụ chỉ ra chính xác hơn những gì đã 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 quá trình 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 quy trình 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 sẽ ngầm ẩn 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 các trình điều khiển có sẵn tính năng hỗ trợ mức độ ưu tiên, hãy truyền trực tiếp trường Priority vào trình tăng tốc.
  • Sử dụng hàng đợi ư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 được 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. Thực hiện việc này bằng cách chèn điểm kiểm tra trong các mô hình có mức độ ưu tiên thấp mà khi đạt đến sẽ truy vấn cờ để xác định xem có nên tạm dừng quá trình thực thi hiện tại sớm hay không hoặc 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 phụ. 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ị có mức độ ưu tiên có thể gây ra thêm mức hao tổn không có cho 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ợ khả năng giành quyền, hãy giữ nguyên ngữ cảnh thực thi, bao gồm cả thao tác hoặc mô hình phụ tiếp theo sẽ được thực thi và mọi dữ liệu về toán hạng trung gian có liên quan. Hãy 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 quá trình thực thi mô hình NNAPI mang tính quyết định, nên các quá trình thực thi có thể được bắt đầu lại từ đầu sau đó.

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 AID (UID (UID) của 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 các 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 các quá trình chuẩn bị và thực thi mô hình với đố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 thành trước thời hạn đó. Đối số về 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 thành trước thời hạn hoặc nếu đã quá thời hạn. 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 có thể mà 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 làm đố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 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ể chỉ báo 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 đều cho biết rằng sự cố này 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 trễ 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á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ụ sẽ luôn không thực hiện được. Ví dụ: mã lỗi này sẽ đượ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ất lượng của chức năng dịch vụ được kiểm tra trong các phép kiểm thử VTS NNAPI (VtsHalNeuralnetworksV1_3Target). Bao gồm một tập hợp các bài 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 tập hợp các chương trình kiểm thử có tên DeadlineTest (TestGenerated/DeadlineTest#Test/) nhằm đảm bảo trình điều khiển xử lý thời hạn một cách chính xác.