ผู้จัดการ NPU

Android 17 ขึ้นไปรองรับ Neural Processing Unit (NPU) Manager (com.android.npumanager) ซึ่งจะประสานงานการจัดสรรและการกำหนดเวลาทรัพยากร NPU ในบริการของระบบและปริมาณงานของแอปพลิเคชัน เมื่อย้ายการอนุญาโตตุลาการทรัพยากรจาก Daemon ของผู้ให้บริการที่กำหนดเองไปยังแพลตฟอร์ม Android แล้ว NPU Manager จะเพิ่มความสามารถในการคาดการณ์ ป้องกันการขาดแคลนทรัพยากร จัดการขอบเขตความร้อน และปรับปรุงประสิทธิภาพโดยรวมของอุปกรณ์

เบื้องหลังและแรงจูงใจ

ก่อนที่จะมี NPU Manager แอปและโมดูลของระบบจะส่งปริมาณงานไปยังไดรเวอร์ของผู้ให้บริการหรือบริการที่เป็นกรรมสิทธิ์โดยตรง แนวทางนี้มีข้อเสียหลายประการ ดังนี้

  • การแข่งขันด้านทรัพยากรที่ไม่มีประสิทธิภาพ: ปริมาณงานแมชชีนเลิร์นนิงจำนวนมาก (เช่น กลไกการอนุมานของโมเดลภาษาขนาดใหญ่ (LLM) หรือระบบวิชันซิสเต็มในอุปกรณ์) แข่งขันโดยตรงกับระบบอื่นๆ ที่มีความสำคัญสูงกว่าเพื่อแย่งชิงทรัพยากร NPU ที่มีจำกัด (เช่น SRAM, หน่วยความจำน้ำหนัก และช่องทางการดำเนินการ)
  • ระบบไม่เสถียร: ปริมาณงานที่ไม่มีการประสานงานอาจทำให้เกิดการควบคุมความร้อน ข้อผิดพลาดของเพจหน่วยความจำ หรือ Daemon ของ Low Memory Killer (LMKD) หากความต้องการเกินความจุของฮาร์ดแวร์
  • การจัดลำดับความสำคัญที่ไม่มีประสิทธิภาพ: เซิร์ฟเวอร์ระบบไม่สามารถปรับลำดับความสำคัญของ NPU เพื่อตอบสนองต่อการเปลี่ยนแปลงบริบท เช่น งานเบื้องหลังที่โหลดโมเดลขนาดใหญ่ในขณะที่ไปป์ไลน์กล้องหรือผู้ช่วยผู้ใช้ที่ไวต่อเวลาในการตอบสนองทำงานอยู่เบื้องหน้า

NPU Manager แก้ปัญหาเหล่านี้ด้วยการทำหน้าที่เป็นอนุญาโตตุลาการระดับระบบที่ควบคุมการโหลดโมเดลและปรับลำดับความสำคัญในการดำเนินการแบบไดนามิกตามสถานะอุปกรณ์และสถานะแอปในปัจจุบัน

สถาปัตยกรรมของระบบ

NPU Manager ได้รับการติดตั้งใช้งานเป็นบริการของระบบที่ชื่อว่า npu ซึ่งทำงานภายในเฟรมเวิร์ก Android NPU Manager จะแยกการประสานงานระดับสูงของนโยบายการกำหนดเวลาจากการติดตั้งใช้งานไดรเวอร์ของผู้ให้บริการระดับต่ำ

แผนภาพต่อไปนี้แสดงเลเยอร์สภาพแวดล้อมของ NPU Manager

เลเยอร์สภาพแวดล้อมของ NPU Manager

รูปที่ 1 เลเยอร์สภาพแวดล้อมของ NPU Manager

คอมโพเนนต์หลัก

  • ไคลเอ็นต์ API ของเฟรมเวิร์ก (android.npumanager.NpuManager): จุดเริ่มต้นที่ไคลเอ็นต์ใช้เพื่อขอการจองการโหลดโมเดล
  • บริการของระบบ (npu): บริการของระบบที่ควบคุมการอนุมัติการโหลดโมเดลและจัดการคำสั่งการขัดจังหวะตามกฎลำดับความสำคัญในการกำหนดเวลา
  • NPU Scheduling HAL (android.hardware.npu): อินเทอร์เฟซที่อิงตาม AIDL ซึ่งส่งต่อการเรียกกลับลำดับความสำคัญของแอป Android ระหว่างเฟรมเวิร์กกับไดรเวอร์
  • ไดรเวอร์ของผู้ให้บริการ: ไดรเวอร์ระดับต่ำที่ควบคุมบล็อกการดำเนินการของฮาร์ดแวร์และใช้กลไกการจัดลำดับความสำคัญระดับต่ำ

SDK และ API ของเฟรมเวิร์ก

ก่อนที่จะเรียกใช้ไลบรารีโครงข่ายระบบประสาทเทียมระดับต่ำหรือโหลดไฟล์โมเดล ไคลเอ็นต์ของเฟรมเวิร์กต้องโต้ตอบกับบริการ NpuManager โดยไคลเอ็นต์จะกำหนดคำขอการโหลดโมเดลก่อน จากนั้นจึงดำเนินการตามขั้นตอนการส่งคำขอและการอนุมัติ

คำขอการโหลดโมเดล

คำขอการโหลดโมเดลแสดงด้วย ModelLoadRequest ออบเจ็กต์นี้ประกอบด้วยข้อมูลต่อไปนี้

  • รหัสคำขอที่ไม่ซ้ำกัน
  • คลาสขนาดโมเดลโดยประมาณ เช่น NPU_MODEL_SIZE_LESS_THAN_1GB หรือ NPU_MODEL_SIZE_GREATER_THAN_2G
  • ลำดับความสำคัญที่ต้องการ เช่น NPU_MODEL_PRIORITY_BACKGROUND, NPU_MODEL_PRIORITY_NORMAL หรือ NPU_MODEL_PRIORITY_OPPORTUNISTIC

ตัวอย่างโค้ดต่อไปนี้สร้าง ModelLoadRequest ที่มีขีดจำกัดขนาดมากกว่า 2 GB และลำดับความสำคัญในการดำเนินการปกติ

ModelLoadRequest request = new ModelLoadRequest.Builder(requestId)
        .setSize(NPU_MODEL_SIZE_GREATER_THAN_2G)
        .setPriority(NPU_MODEL_PRIORITY_NORMAL)
        .build();

ขั้นตอนการส่งคำขอและการอนุมัติ

ไคลเอ็นต์จะเรียกใช้ requestCanLoadModel แบบไม่พร้อมกัน

npuManager.requestCanLoadModel(request, callback, executor);

เมื่อมีทรัพยากร NPU พร้อมใช้งาน เฟรมเวิร์กจะตอบกลับโดยใช้ ModelLoadRequestCallback พร้อมเหตุการณ์ต่อไปนี้

  • onCanLoadModel(request, status, listener): ทริกเกอร์เมื่อคำขอได้รับการอนุมัติ ไคลเอ็นต์จะได้รับโทเค็น NpuManager.ModelLoadStatusListener หลังจากที่ไคลเอ็นต์โหลดโมเดลลงในหน่วยความจำของไดรเวอร์จนเสร็จสมบูรณ์แล้ว ไคลเอ็นต์ต้องเรียกใช้ listener.notifyModelLoaded(request)
  • onRequestUnloadModel(request) หรือ onRequestUnloadModel(request, reason): ทริกเกอร์เมื่อระบบมีทรัพยากรไม่เพียงพอ (เช่น คำขอเบื้องหน้าเข้ามาหรืออุณหภูมิสูงขึ้น) และกำหนดให้ไคลเอ็นต์ปล่อยโมเดล หลังจากเรียกคืนทรัพยากร NPU แล้ว ไคลเอ็นต์จะเรียกใช้ listener.notifyModelUnloaded(request)
  • onModelLoadRequestComplete(request, status): แจ้งให้ไคลเอ็นต์ทราบการเปลี่ยนแปลงวงจรคำขอขั้นสุดท้าย เช่น การยกเลิก

ไคลเอ็นต์สามารถยกเลิกคำขอที่รอดำเนินการได้โดยใช้ cancelModelLoad(request)

HAL และการผสานรวมของผู้ให้บริการ

การติดตั้งใช้งานของผู้ให้บริการที่เฉพาะเจาะจงกับอุปกรณ์ต้องเป็นไปตามอินเทอร์เฟซบริการ android.hardware.npu AIDL เพื่อรองรับ NPU Manager

การกำหนดค่าการกำหนดเวลา

ระบบจะส่งต่อลำดับความสำคัญของแอปโดยใช้ SchedulingConfig AIDL โครงสร้าง AIDL SchedulingConfig ที่กำหนดไว้ใน IScheduling.aidl

package android.hardware.npu;

@VintfStability
parcelable SchedulingConfig {
    int minPriority;
    int maxPriority;
    int uid;
    int appPriority;
    boolean hasDirectAccess;
    boolean canAttributeOtherUid;
}

NPU Manager จะประสานงานการจัดลำดับความสำคัญโดยใช้โครงสร้างนี้ ตัวอย่างเช่น หากแอปเบื้องหลังส่งงานที่มีลำดับความสำคัญสูง ระบบจะปรับลำดับความสำคัญลงเพื่อป้องกันไม่ให้รบกวนกราฟิกเบื้องหน้า

สถานะงานและการสร้างโปรไฟล์

ไดรเวอร์ของผู้ให้บริการต้องรายงานสถานะวงจรของกลุ่มการดำเนินการ NPU ไปยังผู้จัดการ WorkInfo จะติดตามงาน (กำหนดไว้ใน WorkInfo.aidl)

package android.hardware.npu;

import android.hardware.npu.NpuUuid;

@VintfStability
parcelable WorkInfo {
    int id;
    @nullable NpuUuid groupId;
    int uid;
    int debugPid;
    int originalUid;
    @nullable String debugFeatureId;
    int jobPriority;
    int effectivePriority;
    long timestampMs;
    int deviceNumber;
}

การดีเบานซ์เหตุการณ์

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

ระบบจะรายงานสถานะวงจรการเรียกกลับดังนี้

  • onWorkRequested: บริการของผู้ให้บริการจะจัดคิวปริมาณงาน
  • onWorkStarted: เริ่มการดำเนินการปริมาณงาน
    • NPU_START_REASON_INITIAL: การดำเนินการครั้งแรก
    • NPU_START_REASON_RESUMED: การดำเนินการกลับมาทำงานต่อหลังจากถูกขัดจังหวะ
  • onWorkEnded: การดำเนินการปริมาณงานสิ้นสุดลง
    • NPU_END_REASON_COMPLETED: การดำเนินการเสร็จสมบูรณ์
    • NPU_END_REASON_CANCELLED_USER: ผู้ใช้ยกเลิก
    • NPU_END_REASON_CANCELLED_SYSTEM: ถูกขัดจังหวะโดยนโยบายระบบ
    • NPU_END_REASON_FAILED: ข้อผิดพลาดในการดำเนินการหรือไดรเวอร์ล้มเหลว
    • NPU_END_REASON_PAUSED: หยุดชั่วคราวสำหรับงานที่มีลำดับความสำคัญสูงกว่า

ความพร้อมใช้งานและการทดสอบอุปกรณ์

ตรวจสอบว่ามีการกำหนดค่าเหล่านี้ก่อนที่จะยืนยันประสิทธิภาพการทำงานของอุปกรณ์

การประกาศแอปพลิเคชัน

ไคลเอ็นต์ที่ต้องการจัดลำดับความสำคัญในการกำหนดเวลา NPU ต้องประกาศฟีเจอร์ฮาร์ดแวร์ NPU ใน AndroidManifest.xml

<uses-feature android:name="android.hardware.npu" android:required="false" />

สำหรับโมเดลที่ทำให้ใช้งานได้ในฮาร์ดแวร์ของพาร์ทเนอร์รุ่นใหม่ การประกาศนี้อาจจำเป็นสำหรับการสร้างกลไกการทำงานที่เหมาะสม

การทดสอบการผสานรวม VTS

คุณสามารถตรวจสอบการติดตั้งใช้งาน NPU HAL ได้ด้วยการทดสอบการทำงานของ VTS เช่น VtsHalNpuSchedulingTargetTest