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

ตั้งแต่ 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 ไปยังตัวเร่งโดยตรง
  • ใช้คิวที่มีลําดับความสําคัญระดับแอปเพื่อรองรับลําดับความสําคัญที่แตกต่างกันก่อนที่จะมีการดำเนินการถึงตัวเร่ง
  • หยุดชั่วคราวหรือยกเลิกโมเดลที่มีลําดับความสําคัญต่ำซึ่งกําลังทํางานเพื่อปลดปล่อยตัวเร่งให้ทํางานกับโมเดลที่มีลําดับความสําคัญสูง โดยสามารถดำเนินการได้โดยการแทรกจุดตรวจสอบในโมเดลที่มีลำดับความสำคัญต่ำ ซึ่งเมื่อถึงจุดตรวจสอบแล้ว ระบบจะค้นหา 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/) เพื่อให้แน่ใจว่าไดรเวอร์จะจัดการกับกําหนดเวลาได้อย่างถูกต้อง