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