Trình quản lý NPU

Android 17 trở lên hỗ trợ Trình quản lý Đơn vị xử lý thần kinh (NPU) (com.android.npumanager), giúp điều phối việc phân bổ và lập lịch tài nguyên NPU trên các dịch vụ hệ thống và khối lượng công việc của ứng dụng. Bằng cách chuyển hoạt động phân xử tài nguyên từ các trình nền tuỳ chỉnh của nhà cung cấp sang nền tảng Android, Trình quản lý NPU giúp tăng khả năng dự đoán, ngăn chặn tình trạng thiếu tài nguyên, quản lý các giới hạn nhiệt và nâng cao hiệu suất tổng thể của thiết bị.

Bối cảnh và động lực

Trước khi có NPU Manager, các ứng dụng và mô-đun hệ thống đã gửi khối lượng công việc trực tiếp đến trình điều khiển của nhà cung cấp hoặc các dịch vụ độc quyền. Phương pháp này có một số hạn chế:

  • Cạnh tranh tài nguyên không hiệu quả: Các khối lượng công việc học máy lớn (chẳng hạn như các công cụ suy luận Mô hình ngôn ngữ lớn (LLM) hoặc hệ thống thị giác trên thiết bị) cạnh tranh trực tiếp với các hệ thống có mức độ ưu tiên cao khác để giành được tài nguyên NPU hữu hạn (chẳng hạn như SRAM, bộ nhớ trọng số và các kênh thực thi).
  • Hệ thống không ổn định: Các khối lượng công việc không phối hợp có thể kích hoạt tính năng điều tiết nhiệt, lỗi trang bộ nhớ hoặc trình nền loại bỏ bộ nhớ thấp (LMKD) nếu nhu cầu vượt quá dung lượng phần cứng.
  • Mức độ ưu tiên không hiệu quả: Máy chủ hệ thống không thể điều chỉnh mức độ ưu tiên NPU để phản hồi các thay đổi về bối cảnh, chẳng hạn như một tác vụ ở chế độ nền tải một mô hình lớn trong khi một quy trình camera nhạy cảm với độ trễ hoặc trợ lý người dùng đang hoạt động ở nền trước.

NPU Manager giải quyết những thách thức này bằng cách đóng vai trò là một bộ phân xử ở cấp hệ thống, có chức năng kiểm soát quá trình tải mô hình và điều chỉnh linh hoạt các mức độ ưu tiên thực thi dựa trên tình trạng thiết bị hiện tại và trạng thái của ứng dụng.

Cấu trúc hệ thống

NPU Manager được triển khai dưới dạng một dịch vụ hệ thống có tên là npu chạy trong khung Android. NPU Manager tách biệt hoạt động điều phối cấp cao của các chính sách lập lịch khỏi việc triển khai trình điều khiển của nhà cung cấp ở cấp thấp.

Sơ đồ sau đây minh hoạ các lớp môi trường của NPU Manager:

Các lớp môi trường của NPU Manager

Hình 1. Các lớp môi trường của NPU Manager.

Các thành phần chính

  • Ứng dụng Framework API (android.npumanager.NpuManager): Điểm truy cập mà các ứng dụng sử dụng để yêu cầu đặt trước việc tải mô hình
  • Dịch vụ hệ thống (npu): Một dịch vụ hệ thống kiểm soát việc phê duyệt tải mô hình và quản lý các lệnh ưu tiên dựa trên các quy tắc ưu tiên lập lịch
  • HAL lập lịch NPU (android.hardware.npu): Một giao diện dựa trên AIDL chuyển tiếp các lệnh gọi lại về mức độ ưu tiên của ứng dụng Android giữa khung và trình điều khiển
  • Trình điều khiển của nhà cung cấp: Trình điều khiển cấp thấp kiểm soát các khối thực thi phần cứng và triển khai cơ chế ưu tiên cấp thấp

SDK và API khung

Trước khi gọi các thư viện mạng nơ-ron cấp thấp hoặc tải các tệp mô hình, các ứng dụng khung phải tương tác với dịch vụ NpuManager. Để làm việc này, trước tiên, các ứng dụng sẽ xác định một yêu cầu tải mô hình, sau đó thực thi yêu cầu và quy trình phê duyệt.

Yêu cầu tải mô hình

Yêu cầu tải mô hình được biểu thị bằng ModelLoadRequest. Đối tượng này chứa:

  • Mã yêu cầu duy nhất
  • Lớp kích thước mô hình ước tính, chẳng hạn như NPU_MODEL_SIZE_LESS_THAN_1GB hoặc NPU_MODEL_SIZE_GREATER_THAN_2G
  • Mức độ ưu tiên dự kiến, chẳng hạn như NPU_MODEL_PRIORITY_BACKGROUND, NPU_MODEL_PRIORITY_NORMAL hoặc NPU_MODEL_PRIORITY_OPPORTUNISTIC

Ví dụ về mã sau đây sẽ tạo một ModelLoadRequest có giới hạn kích thước lớn hơn 2 GB và mức độ ưu tiên thực thi bình thường:

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

Quy trình yêu cầu và phê duyệt

Các ứng dụng gọi requestCanLoadModel một cách không đồng bộ:

npuManager.requestCanLoadModel(request, callback, executor);

Khi có tài nguyên NPU, khung sẽ phản hồi bằng cách sử dụng ModelLoadRequestCallback với các sự kiện sau:

  • onCanLoadModel(request, status, listener): Kích hoạt khi yêu cầu được phê duyệt. Máy khách nhận được một mã thông báo NpuManager.ModelLoadStatusListener. Sau khi tải mô hình đầy đủ vào bộ nhớ trình điều khiển, ứng dụng phải gọi listener.notifyModelLoaded(request).
  • onRequestUnloadModel(request) hoặc onRequestUnloadModel(request, reason): Được kích hoạt khi hệ thống chịu áp lực về tài nguyên (chẳng hạn như yêu cầu đến ở nền trước hoặc nhiệt độ tăng đột biến) và yêu cầu ứng dụng giải phóng mô hình. Sau khi thu hồi các tài nguyên NPU, ứng dụng sẽ gọi listener.notifyModelUnloaded(request).
  • onModelLoadRequestComplete(request, status): Thông báo cho máy khách về các thay đổi cuối cùng trong vòng đời của yêu cầu, chẳng hạn như việc huỷ.

Ứng dụng có thể huỷ lời mời đang chờ xử lý bằng cách sử dụng cancelModelLoad(request).

Tích hợp HAL và nhà cung cấp

Để hỗ trợ NPU Manager, các quy trình triển khai của nhà cung cấp dành riêng cho thiết bị phải tuân thủ các giao diện dịch vụ AIDL android.hardware.npu.

Cấu hình lập lịch

Hệ thống chuyển tiếp mức độ ưu tiên của ứng dụng bằng SchedulingConfig AIDL, cấu trúc AIDL SchedulingConfig được xác định trong IScheduling.aidl:

package android.hardware.npu;

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

Khi sử dụng cấu trúc này, Trình quản lý NPU sẽ điều phối việc điều chỉnh mức độ ưu tiên. Ví dụ: nếu một ứng dụng chạy trong nền gửi một công việc có mức độ ưu tiên cao, thì mức độ ưu tiên sẽ được điều chỉnh giảm xuống để tránh gây trở ngại cho đồ hoạ trên nền trước.

Trạng thái và lập hồ sơ của tác vụ

Trình điều khiển của nhà cung cấp phải báo cáo trạng thái vòng đời của các nhóm thực thi NPU cho trình quản lý. WorkInfo theo dõi các tác vụ (được xác định trong 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;
}

Chống dội sự kiện

Khung lập lịch hỗ trợ việc loại bỏ sự kiện trùng lặp bằng cách sử dụng tham số debounce_duration_ms trong quá trình đăng ký lệnh gọi lại lập lịch. Điều này giúp tránh tình trạng tràn nhật ký và ngăn chặn các thông báo nhanh, ví dụ: các sự kiện bắt đầu và kết thúc liên tiếp cho các mô hình lặp lại.

Các trạng thái vòng đời gọi lại được báo cáo như sau:

  • onWorkRequested: Tải được dịch vụ của nhà cung cấp xếp hàng đợi.
  • onWorkStarted: Bắt đầu thực thi khối lượng công việc.
    • NPU_START_REASON_INITIAL: Lần chạy thực thi đầu tiên.
    • NPU_START_REASON_RESUMED: Quá trình thực thi tiếp tục sau khi bị chiếm quyền.
  • onWorkEnded: Quá trình thực thi khối lượng công việc đã kết thúc.
    • NPU_END_REASON_COMPLETED: Hoàn tất thành công quá trình chạy.
    • NPU_END_REASON_CANCELLED_USER: Do khách hàng huỷ.
    • NPU_END_REASON_CANCELLED_SYSTEM: Bị chính sách hệ thống ưu tiên.
    • NPU_END_REASON_FAILED: Lỗi thực thi hoặc lỗi trình điều khiển.
    • NPU_END_REASON_PAUSED: Tạm thời bị tạm ngưng để thực hiện các tác vụ có mức độ ưu tiên cao hơn.

Kiểm thử và chuẩn bị thiết bị

Đảm bảo bạn đã thiết lập các cấu hình này trước khi xác minh tình trạng thiết bị.

Nội dung khai báo của ứng dụng

Những ứng dụng muốn ưu tiên lập lịch NPU phải khai báo tính năng phần cứng NPU trong AndroidManifest.xml:

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

Đối với các mô hình được triển khai trên phần cứng của đối tác thuộc thế hệ mới hơn, bạn có thể phải khai báo thông tin này để tạo công cụ một cách tối ưu.

Kiểm thử tích hợp VTS

Bạn có thể xác thực việc triển khai HAL NPU bằng các kiểm thử chức năng VTS, chẳng hạn như VtsHalNpuSchedulingTargetTest.