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

ตั้งแต่ 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 เป็นต้นไป คุณสามารถใช้รหัสข้อผิดพลาด MISSED_DEADLINE 2 รายการเพื่อระบุว่าระบบยกเลิกเวิร์กโหลดเนื่องจากถึงกำหนดเวลาแล้วหรือเนื่องจากไดรเวอร์คาดการณ์ว่าเวิร์กโหลดจะทำไม่เสร็จตามกำหนดเวลา คุณสามารถใช้รหัสข้อผิดพลาด RESOURCE_EXHAUSTED 2 รายการเพื่อระบุว่างานล้มเหลวเนื่องจากข้อจำกัดด้านทรัพยากรภายในไดรเวอร์ เช่น ไดรเวอร์มีหน่วยความจำไม่เพียงพอสำหรับการเรียก

ข้อผิดพลาดทั้ง 2 เวอร์ชัน TRANSIENT บ่งบอกว่าปัญหาเกิดขึ้นชั่วคราว และการเรียกงานเดียวกันในอนาคตอาจสำเร็จหลังจากผ่านไปสักครู่ เช่น ควรแสดงรหัสข้อผิดพลาดนี้เมื่อไดรเวอร์ไม่ว่างเนื่องจากกำลังทำงานที่ใช้เวลานานหรือใช้ทรัพยากรมากก่อนหน้านี้ แต่หากไดรเวอร์ไม่ว่างเนื่องจากกำลังทำงานก่อนหน้านี้ งานใหม่จะเสร็จสมบูรณ์ ข้อผิดพลาดทั้ง 2 เวอร์ชัน PERSISTENT บ่งบอกว่าการเรียกงานเดียวกันในอนาคตคาดว่าจะล้มเหลวเสมอ เช่น ควรแสดงรหัสข้อผิดพลาดนี้เมื่อไดรเวอร์ประมาณว่างานจะทำไม่เสร็จตามกำหนดเวลาแม้ในสภาวะที่สมบูรณ์แบบ หรือโมเดลมีขนาดใหญ่เกินไปและใช้ทรัพยากรของไดรเวอร์มากเกินไป

การตรวจสอบ

ระบบจะทดสอบฟังก์ชันการทำงานด้านคุณภาพการบริการในการทดสอบ NNAPI VTS (VtsHalNeuralnetworksV1_3Target) ซึ่งรวมถึงชุดการทดสอบสำหรับการตรวจสอบ (TestGenerated/ValidationTest#Test/) เพื่อให้แน่ใจว่าไดรเวอร์ปฏิเสธลำดับความสำคัญที่ไม่ถูกต้อง และชุดการทดสอบที่เรียกว่า DeadlineTest (TestGenerated/DeadlineTest#Test/) เพื่อให้แน่ใจว่าไดรเวอร์จัดการกำหนดเวลา ได้อย่างถูกต้อง