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

ตั้งแต่ 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 ไว้ในอาร์กิวเมนต์แคชโดยปริยาย

มีกลยุทธ์ที่เป็นไปได้มากมายในการสนับสนุนลำดับความสำคัญ ทั้งนี้ขึ้นอยู่กับความสามารถของคนขับและ Accelerator ลองมาดูกลยุทธ์ต่างๆ ต่อไปนี้

  • สำหรับไดรเวอร์ที่มีการสนับสนุนลำดับความสำคัญในตัว ให้เผยแพร่ฟิลด์ Priority ไปยัง Accelerator โดยตรง
  • ใช้คิวลำดับความสำคัญต่อแอปเพื่อรองรับลำดับความสำคัญต่างๆ ตั้งแต่ก่อนที่การดำเนินการจะไปถึง Accelerator
  • หยุดชั่วคราวหรือยกเลิกโมเดลที่มีลำดับความสำคัญต่ำซึ่งกำลังดำเนินการเพื่อปลอดจาก Accelerator เพื่อเรียกใช้โมเดลที่มีลำดับความสำคัญสูง โดยใส่จุดตรวจสอบในโมเดลที่มีลำดับความสำคัญต่ำ เมื่อไปถึงแล้ว ให้ค้นหาแฟล็กเพื่อระบุว่าการดำเนินการปัจจุบันควรหยุดก่อนกำหนดหรือโดยการแบ่งพาร์ติชันโมเดลเป็นโมเดลย่อยและค้นหาแฟล็กระหว่างการดำเนินการของโมเดลย่อย โปรดทราบว่าการใช้จุดตรวจสอบหรือโมเดลย่อยในโมเดลที่จัดเตรียมลำดับความสำคัญอาจทำให้เกิดโอเวอร์เฮดเพิ่มเติมซึ่งไม่ได้แสดงสำหรับโมเดลที่ไม่มีลำดับความสำคัญในเวอร์ชันที่ต่ำกว่า NN HAL 1.3

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

Android เปิดใช้บริการเพื่อแยกความแตกต่างระหว่างแอปการโทรต่างๆ ผ่านการใช้ AID (Android UID) HIDL มีกลไกในตัวสำหรับเรียก UID ของแอปการโทรผ่านเมธอด ::android::hardware::IPCThreadState::getCallingUid ดูรายการเอดส์ได้ใน 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 รหัสสามารถใช้เพื่อระบุว่างานล้มเหลวเนื่องจากข้อจำกัดด้านทรัพยากรภายในไดรเวอร์ เช่น ไดรเวอร์มีหน่วยความจำไม่เพียงพอสำหรับการโทร

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

การตรวจสอบความถูกต้อง

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