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 ứ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 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ị với mức độ ưu tiên trong NN HAL 1.3. Mức độ ưu tiên này tương đối 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ể sử dụng nhiều tài nguyên tính toán hơn các quá trình 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 quá 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ố 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ợ 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 các trình điều khiển có hỗ trợ mức độ ưu tiên tích hợp, hãy trực tiếp truyền 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ợ nhiều mức độ ưu tiên ngay cả trước khi quá trình thực thi tiếp cậ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 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 mà khi đạt đến, sẽ 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 hoặc bằng cách phân vùng mô hình thành mô hình con và truy vấn cờ giữa các quá trình thực thi mô hình con. Xin lưu ý rằng việc sử dụng điểm kiểm tra hoặc mô hình con trong các mô hình được chuẩn bị với 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ợ việc chiếm quyề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 thời điểm sau.
    • Không cần hỗ trợ chiếm quyền hoàn toàn, vì vậy, bạn không cần phải giữ lại ngữ cảnh thực thi. Vì các quá trình thực thi mô hình NNAPI là xác định, nên bạn có thể khởi động lại các quá trình thực thi từ đầu vào thời điểm sau.

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 (Android UID). 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ể 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 các trình điều khiển có thể ước tính thời gian thực hiện một tác vụ, thời hạn này cho phép trình điều khiển huỷ tác vụ trước khi tác vụ bắt đầu nếu trình điều khiển ước tính rằng tác vụ không thể hoàn tất trước thời hạn. Tương tự, thời hạn này 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 phải huỷ 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ể sử dụng đối số thời hạn để giải phóng tài nguyên tính toán trong trình điều khiển và trả 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 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 bao gồm 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 trình điều khiển giao tiếp tốt hơn về trạng thái của chúng và ứng dụng khôi phục một cách suôn sẻ 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ể sử dụng 2 mã lỗi MISSED_DEADLINE để cho biết rằng khối lượng công việc đã bị huỷ vì đã đạt đế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 tất trước thời hạn. Bạn có thể sử 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 rằng vấn đề là tạm thời và các lệnh gọi trong tương lai cho 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ụ: bạn nên trả về mã lỗi này khi trình điều khiển đang bận với công việc trước đó chạy trong thời gian 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ụ: bạn nên trả về mã lỗi này khi trình điều khiển ước tính tác vụ sẽ không hoàn tất trước 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 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 bài kiểm thử NNAPI VTS (VtsHalNeuralnetworksV1_3Target). Điều này bao gồm một tập hợp các bài kiểm thử để xác nhận kết quả (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 bài kiểm thử có tên là DeadlineTest (TestGenerated/DeadlineTest#Test/) nhằm đảm bảo rằng trình điều khiển xử lý thời hạn một cách chính xác.