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

รูปที่ 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