นับตั้งแต่ Android 11 เป็นต้นไป NNAPI จะมอบคุณภาพการบริการ (QoS) ที่ดีขึ้น โดยอนุญาตให้แอประบุลำดับความสำคัญสัมพัทธ์ของรุ่น ระยะเวลาสูงสุดที่คาดไว้สำหรับการเตรียมรุ่นที่กำหนด และระยะเวลาสูงสุดที่คาดไว้สำหรับ การดำเนินการที่กำหนดให้เสร็จสิ้น นอกจากนี้ Android 11 ยังแนะนำค่าข้อผิดพลาด NNAPI เพิ่มเติมที่ทำให้บริการสามารถระบุสิ่งที่ผิดพลาดเมื่อเกิดความล้มเหลวได้แม่นยำมากขึ้น เพื่อให้แอปไคลเอ็นต์สามารถตอบสนองและกู้คืนได้ดีขึ้น
ลำดับความสำคัญ
สำหรับ Android 11 หรือสูงกว่า รุ่นต่างๆ จะถูกจัดเตรียมโดยมีความสำคัญใน NN HAL 1.3 ลำดับความสำคัญนี้สัมพันธ์กับโมเดลที่เตรียมไว้อื่นๆ ที่เป็นของแอปเดียวกัน การดำเนินการที่มีลำดับความสำคัญสูงกว่าสามารถใช้ทรัพยากรการประมวลผลมากกว่าการดำเนินการที่มีลำดับความสำคัญต่ำกว่า และสามารถยึดหรือระงับการดำเนินการที่มีลำดับความสำคัญต่ำกว่าได้
การเรียก NN HAL 1.3 ที่รวม Priority
เป็นอาร์กิวเมนต์ที่ชัดเจนคือ IDevice::prepareModel_1_3
โปรดทราบว่า IDevice::prepareModelFromCache_1_3
มี Priority
ในอาร์กิวเมนต์แคชโดยปริยาย
มีกลยุทธ์ที่เป็นไปได้มากมายในการสนับสนุนลำดับความสำคัญ ขึ้นอยู่กับความสามารถของผู้ขับขี่และคันเร่ง ต่อไปนี้เป็นกลยุทธ์หลายประการ:
- สำหรับไดรเวอร์ที่มีการรองรับลำดับความสำคัญในตัว ให้เผยแพร่ฟิลด์ลำดับ
Priority
ไปยังตัวเร่งความเร็วโดยตรง - ใช้คิวลำดับความสำคัญต่อแอปเพื่อรองรับลำดับความสำคัญที่แตกต่างกัน ก่อนที่การดำเนินการจะไปถึงตัวเร่งความเร็ว
หยุดชั่วคราวหรือยกเลิกโมเดลที่มีลำดับความสำคัญต่ำที่กำลังดำเนินการเพื่อให้ตัวเร่งความเร็วดำเนินการกับโมเดลที่มีลำดับความสำคัญสูง ทำสิ่งนี้ได้โดยการแทรก จุดตรวจสอบ ในโมเดลที่มีลำดับความสำคัญต่ำ ซึ่งเมื่อไปถึงแล้ว ให้สอบถามแฟล็กเพื่อพิจารณาว่าการดำเนินการปัจจุบันควรหยุดก่อนเวลาอันควร หรือโดยการแบ่งพาร์ติชันโมเดลเป็น โมเดลย่อย และสอบถามแฟล็กระหว่างการดำเนินการกับโมเดลย่อย โปรดทราบว่าการใช้จุดตรวจสอบหรือโมเดลย่อยในโมเดลที่จัดเตรียมด้วยลำดับความสำคัญอาจทำให้เกิดค่าใช้จ่ายเพิ่มเติมที่ไม่มีอยู่ในโมเดลที่ไม่มีลำดับความสำคัญในเวอร์ชันที่ต่ำกว่า NN HAL 1.3
- เพื่อสนับสนุนการจองล่วงหน้า ให้รักษาบริบทการดำเนินการ รวมถึงการดำเนินการถัดไปหรือโมเดลย่อยที่จะดำเนินการ และข้อมูลตัวถูกดำเนินการระดับกลางที่เกี่ยวข้อง ใช้บริบทการดำเนินการนี้เพื่อดำเนินการดำเนินการต่อในภายหลัง
- ไม่จำเป็นต้องมีการสนับสนุนการจองโดยสมบูรณ์ ดังนั้นจึงไม่จำเป็นต้องรักษาบริบทการดำเนินการไว้ เนื่องจากการดำเนินการโมเดล NNAPI นั้นถูกกำหนดไว้แล้ว การดำเนินการจึงสามารถเริ่มใหม่ตั้งแต่ต้นได้ในภายหลัง
Android เปิดใช้บริการเพื่อแยกความแตกต่างระหว่างแอปการโทรต่างๆ ผ่านการใช้ AID (Android UID) HIDL มีกลไกในตัวเพื่อดึงข้อมูล UID ของแอปที่เรียกผ่านวิธีการ ::android::hardware::IPCThreadState::getCallingUid
รายชื่อ AID สามารถพบได้ใน libcutils/include/cutils/android_filesystem_config.h
กำหนดเวลา
เริ่มตั้งแต่ Android 11 เป็นต้นไป การเตรียมโมเดลและการดำเนินการสามารถเปิดใช้งานได้ด้วยอาร์กิวเมนต์กำหนดเวลา OptionalTimePoint
สำหรับผู้ขับขี่ที่สามารถประมาณระยะเวลาของงานได้ กำหนดเวลานี้จะช่วยให้ผู้ขับขี่สามารถยกเลิกงานก่อนที่จะเริ่มงานได้ หากผู้ขับขี่ประเมินว่างานนั้นไม่สามารถดำเนินการให้เสร็จสิ้นก่อนกำหนดเวลาได้ ในทำนองเดียวกัน กำหนดเวลาอนุญาตให้คนขับยกเลิกงานที่กำลังดำเนินอยู่ซึ่งคาดว่าจะไม่เสร็จก่อนกำหนดเวลา อาร์กิวเมนต์กำหนดเวลาไม่ได้บังคับให้คนขับยกเลิกงานหากงานไม่เสร็จสิ้นภายในกำหนดเวลาหรือหากเลยกำหนดเวลาไปแล้ว อาร์กิวเมนต์กำหนดเวลาสามารถใช้เพื่อเพิ่มทรัพยากรการประมวลผลภายในไดรเวอร์และคืนการควบคุมไปยังแอปได้เร็วกว่าที่เป็นไปได้โดยไม่มีกำหนดเวลา
การเรียก NN HAL 1.3 ที่มีกำหนดเวลา OptionalTimePoint
เป็นอาร์กิวเมนต์คือ:
-
IDevice::prepareModel_1_3
-
IDevice::prepareModelFromCache_1_3
-
IPreparedModel::execute_1_3
-
IPreparedModel::executeSynchronously_1_3
-
IPreparedModel::executeFenced
หากต้องการดูการใช้งานอ้างอิงของคุณลักษณะกำหนดเวลาสำหรับแต่ละวิธีข้างต้น โปรดดูไดรเวอร์ตัวอย่าง NNAPI ที่ frameworks/ml/nn/driver/sample/SampleDriver.cpp
รหัสข้อผิดพลาด
Android 11 มีค่ารหัสข้อผิดพลาดสี่ค่าใน NN HAL 1.3 เพื่อปรับปรุงการรายงานข้อผิดพลาด ช่วยให้ผู้ขับสามารถสื่อสารสถานะและแอปของตนได้ดีขึ้นเพื่อกู้คืนได้อย่างสวยงามยิ่งขึ้น นี่คือค่ารหัสข้อผิดพลาดใน ErrorStatus
-
MISSED_DEADLINE_TRANSIENT
-
MISSED_DEADLINE_PERSISTENT
-
RESOURCE_EXHAUSTED_TRANSIENT
-
RESOURCE_EXHAUSTED_PERSISTENT
ใน Android 10 หรือต่ำกว่า ไดรเวอร์สามารถระบุความล้มเหลวผ่านรหัสข้อผิดพลาด GENERAL_FAILURE
เท่านั้น ตั้งแต่ Android 11 รหัสข้อผิดพลาด MISSED_DEADLINE
ทั้งสองรหัสสามารถใช้เพื่อระบุว่าปริมาณงานถูกยกเลิกเนื่องจากถึงกำหนดเวลา หรือเนื่องจากคนขับคาดการณ์ว่าปริมาณงานจะไม่เสร็จสิ้นภายในกำหนดเวลา รหัสข้อผิดพลาด RESOURCE_EXHAUSTED
สองรหัสสามารถใช้เพื่อระบุว่างานล้มเหลวเนื่องจากข้อจำกัดของทรัพยากรภายในไดรเวอร์ เช่น ไดรเวอร์มีหน่วยความจำไม่เพียงพอสำหรับการโทร
ข้อผิดพลาดทั้งสองเวอร์ชัน TRANSIENT
บ่งชี้ว่าปัญหาเกิดขึ้นชั่วคราว และการเรียกงานเดียวกันในอนาคตอาจสำเร็จได้หลังจากการหน่วงเวลาสั้นๆ ตัวอย่างเช่น รหัสข้อผิดพลาดนี้ควรส่งคืนเมื่อไดรเวอร์ยุ่งกับงานที่ต้องใช้เวลานานหรือต้องใช้ทรัพยากรมากก่อนหน้านี้ แต่งานใหม่จะเสร็จสมบูรณ์ได้สำเร็จหากไดรเวอร์ไม่ยุ่งกับงานก่อนหน้า ข้อผิดพลาดทั้งสองเวอร์ชัน PERSISTENT
บ่งชี้ว่าการเรียกงานเดียวกันในอนาคตคาดว่าจะล้มเหลวเสมอ ตัวอย่างเช่น ควรส่งคืนรหัสข้อผิดพลาดนี้เมื่อคนขับประเมินว่างานจะไม่เสร็จสิ้นภายในกำหนดเวลาแม้จะอยู่ในสภาพที่สมบูรณ์ หรือแบบจำลองมีขนาดใหญ่เกินไปและเกินทรัพยากรของไดรเวอร์
การตรวจสอบ
คุณภาพของฟังก์ชันการทำงานของบริการได้รับการทดสอบในการทดสอบ NNAPI VTS ( VtsHalNeuralnetworksV1_3Target
) ซึ่งรวมถึงชุดการทดสอบสำหรับการตรวจสอบ ( TestGenerated/ValidationTest#Test/
) เพื่อให้แน่ใจว่าไดรเวอร์ปฏิเสธลำดับความสำคัญที่ไม่ถูกต้อง และชุดการทดสอบที่เรียกว่า DeadlineTest
( TestGenerated/DeadlineTest#Test/
) เพื่อให้แน่ใจว่าไดรเวอร์จัดการกำหนดเวลาได้อย่างถูกต้อง