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

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

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

การตรวจสอบ

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