คุณภาพของบริการ

ตั้งแต่ 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/) เพื่อให้มั่นใจว่าไดรเวอร์จะจัดการกำหนดเวลา ได้อย่างถูกต้อง