ตั้งแต่ 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
ไว้ในอาร์กิวเมนต์แคชโดยปริยาย
มีกลยุทธ์ที่เป็นไปได้มากมายในการสนับสนุนลำดับความสำคัญ ทั้งนี้ขึ้นอยู่กับความสามารถของคนขับและ Accelerator ลองมาดูกลยุทธ์ต่างๆ ต่อไปนี้
- สําหรับไดรเวอร์ที่รองรับลําดับความสําคัญในตัว ให้ส่งต่อช่อง
Priority
ไปยังตัวเร่งโดยตรง - ใช้คิวที่มีลําดับความสําคัญระดับแอปเพื่อรองรับลําดับความสําคัญที่แตกต่างกันก่อนที่จะมีการดำเนินการถึงตัวเร่ง
หยุดชั่วคราวหรือยกเลิกโมเดลที่มีลําดับความสําคัญต่ำซึ่งกําลังทํางานเพื่อปลดปล่อยตัวเร่งให้ทํางานกับโมเดลที่มีลําดับความสําคัญสูง โดยสามารถดำเนินการได้โดยการแทรกจุดตรวจสอบในโมเดลที่มีลำดับความสำคัญต่ำ ซึ่งเมื่อถึงจุดตรวจสอบแล้ว ระบบจะค้นหา Flag เพื่อพิจารณาว่าควรหยุดการดำเนินการปัจจุบันก่อนเวลาอันควรหรือไม่ หรือจะแบ่งพาร์ติชันโมเดลออกเป็นโมเดลย่อยและค้นหา Flag ระหว่างการดำเนินการของโมเดลย่อยก็ได้ โปรดทราบว่าการใช้จุดตรวจสอบหรือโมเดลย่อยในโมเดลที่จัดเตรียมลำดับความสำคัญอาจทำให้เกิดโอเวอร์เฮดเพิ่มเติมซึ่งไม่ได้แสดงสำหรับโมเดลที่ไม่มีลำดับความสำคัญในเวอร์ชันที่ต่ำกว่า 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 มีค่ารหัสข้อผิดพลาด 4 ค่าใน 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
ทั้ง 2 รายการได้เพื่อระบุว่าภาระงานถูกล้มเลิกเนื่องจากถึงกำหนดเวลาแล้ว หรือเนื่องจากคนขับคาดการณ์ว่าภาระงานจะไม่เสร็จสมบูรณ์ภายในเวลาที่กำหนด คุณสามารถใช้รหัสข้อผิดพลาด RESOURCE_EXHAUSTED
2 รหัสนี้เพื่อระบุว่างานไม่สำเร็จเนื่องจากข้อจำกัดด้านทรัพยากรภายในไดรเวอร์ เช่น ไดรเวอร์มีหน่วยความจำไม่เพียงพอสำหรับการเรียกใช้
ข้อผิดพลาดทั้ง 2 รายการเวอร์ชัน TRANSIENT
บ่งบอกว่าปัญหาเกิดขึ้นชั่วคราว และอาจเรียกใช้งานเดียวกันได้สำเร็จหลังจากรอสักครู่ เช่น ระบบควรแสดงรหัสข้อผิดพลาดนี้เมื่อคนขับไม่ว่างเนื่องจากมีงานก่อนหน้าที่ใช้เวลานานหรือใช้ทรัพยากรมาก แต่งานใหม่จะเสร็จสมบูรณ์หากคนขับไม่ได้ไม่ว่างกับงานก่อนหน้า ข้อผิดพลาดทั้ง 2 รายการในเวอร์ชัน PERSISTENT
บ่งบอกว่าการเรียกใช้งานเดียวกันในอนาคตจะล้มเหลวเสมอ ตัวอย่างเช่น ระบบควรแสดงรหัสข้อผิดพลาดนี้เมื่อนักขับประมาณว่างานจะไม่เสร็จภายในกำหนดเวลาแม้ว่าจะอยู่ในสภาพที่สมบูรณ์แบบ หรือโมเดลมีขนาดใหญ่เกินกว่าทรัพยากรของนักขับ
การตรวจสอบความถูกต้อง
ฟังก์ชันการทำงานของคุณภาพของบริการได้รับการทดสอบในการทดสอบ VTS ของ NNAPI (VtsHalNeuralnetworksV1_3Target
) ซึ่งรวมถึงชุดการทดสอบเพื่อตรวจสอบ (TestGenerated/ValidationTest#Test/
) เพื่อให้แน่ใจว่าไดรเวอร์จะปฏิเสธลําดับความสําคัญที่ไม่ถูกต้อง และชุดการทดสอบที่เรียกว่า DeadlineTest
(TestGenerated/DeadlineTest#Test/
) เพื่อให้แน่ใจว่าไดรเวอร์จะจัดการกับกําหนดเวลาได้อย่างถูกต้อง