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

Bắt đầu 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 chỉ ra mức độ ưu tiên tương đối của các mô hình của nó, lượng thời gian tối đa dự kiến ​​để chuẩn bị cho một mô hình nhất định và lượng thời gian tối đa dự kiến ​​cho một sự thực hiện nhất định sẽ được hoàn thành. Hơn nữa, Android 11 còn giới thiệu các giá trị lỗi NNAPI bổ sung cho phép dịch vụ chỉ ra chính xác hơn sự cố khi xảy ra lỗi để ứng dụng khách có thể phản ứng và phục hồi tốt hơn.

Sự ưu tiên

Đối với Android 11 trở lên, các mẫu máy được chuẩn bị với mức độ ưu tiên trong NN HAL 1.3. Mức độ ưu tiên này liên quan đến các mẫu đã chuẩn bị khác thuộc sở hữu của cùng một ứng dụng. Các lần 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 lần thực thi có mức độ ưu tiên thấp hơn và có thể ưu tiên hoặc loại bỏ các lần thực thi có mức độ ưu tiên thấp hơn.

Cuộc gọi NN HAL 1.3 bao gồm Priority làm đối số rõ ràng là IDevice::prepareModel_1_3 . Lưu ý rằng IDevice::prepareModelFromCache_1_3 ngầm bao gồm Priority trong các đối số bộ đệm.

Có nhiều chiến lược khả thi để hỗ trợ các ưu tiên tùy thuộc vào khả năng của người lái và chân ga. 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ợ ưu tiên tích hợp, hãy truyền trực tiếp trường Priority tới máy gia 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 trình tăng tốc.
  • Tạm dừng hoặc hủy 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 để 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 các đ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 tạm dừng 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 con. 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ị với mức độ ưu tiên có thể gây ra chi phí bổ sung không có đối với 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 duy trì bối cảnh thực thi bao gồm 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 sau đó.
    • Hỗ trợ quyền ưu tiên đầy đủ là không cần thiết, do đó bối cảnh thực thi không cần phải được giữ nguyên. Bởi vì việc thực thi mô hình NNAPI mang tính quyết định nên việc thực thi có thể được khởi động 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 điện khác nhau thông qua việc sử dụng AID (Android UID). HIDL có các cơ chế tích hợp sẵn để truy xuất UID của ứng dụng gọi điện 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

Bắt đầu từ Android 11, việc chuẩn bị và thực thi mô hình có thể được khởi chạy 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 thực hiện một nhiệm vụ, thời hạn này cho phép người lái xe hủy bỏ nhiệm vụ trước khi nó bắt đầu nếu người lái xe ước tính rằng nhiệm vụ đó không thể hoàn thành trước thời hạn. Tương tự, thời hạn cho phép người lái xe hủy bỏ một nhiệm vụ đang diễn ra mà họ ướ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 người lái xe phải hủy bỏ nhiệm vụ nếu nhiệm vụ đó không hoàn thành trước thời hạn hoặc nếu thời hạn đã qua. Đối số thời hạn có thể được sử dụng để 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ể nếu không có thời hạn.

Các cuộc gọi NN HAL 1.3 bao gồm các 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 tính năng thời hạn cho từng phương pháp 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 bốn 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 trao đổi tốt hơn về trạng thái của họ và ứng dụng sẽ khôi phục dễ dàng 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ể báo lỗi thông qua mã lỗi GENERAL_FAILURE . Từ Android 11, hai mã lỗi MISSED_DEADLINE có thể được sử dụng để cho biết khối lượng công việc đã bị hủy do đã đến thời hạn hoặc do trình điều khiển dự đoán khối lượng công việc sẽ không hoàn thành trước thời hạn. Hai mã lỗi RESOURCE_EXHAUSTED có thể được sử dụng để cho biết 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 cuộc gọi.

Phiên bản TRANSIENT của cả hai lỗi cho biết rằng sự cố chỉ là tạm thời và các lệnh gọi tới cùng một tác vụ trong tương lai 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ông việc tốn nhiều tài nguyên hoặc chạy dài trước đó, nhưng tác vụ mới đó sẽ hoàn thành 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 tới cùng một tác vụ luôn được cho là sẽ không thành công. Ví dụ: mã lỗi này phải được trả về khi trình điều khiển ước tính nhiệm vụ sẽ không hoàn thành 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.

Thẩm định

Chất lượng của chức năng dịch vụ được kiểm tra trong các bài kiểm tra NNAPI VTS ( VtsHalNeuralnetworksV1_3Target ). Điều này bao gồm một bộ kiểm tra để xác thực ( TestGenerated/ValidationTest#Test/ ) để đảm bảo rằng trình điều khiển từ chối các ưu tiên không hợp lệ và một bộ kiểm tra có tên DeadlineTest ( TestGenerated/DeadlineTest#Test/ ) để đả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.