NPU 관리자

Android 17 이상은 시스템 서비스 및 애플리케이션 워크로드 전반에서 NPU 리소스의 할당 및 예약을 조정하는 NPU 관리자(com.android.npumanager)를 지원합니다. 리소스 중재를 맞춤 벤더 데몬에서 Android 플랫폼으로 이동함으로써 NPU 관리자는 예측 가능성을 높이고, 리소스 부족을 방지하고, 열 경계를 관리하고, 전반적인 기기 성능을 개선합니다.

배경 및 동기

NPU 관리자 이전에는 앱과 시스템 모듈이 워크로드를 벤더 드라이버 또는 독점 서비스에 직접 제출했습니다. 이 접근 방식에는 다음과 같은 몇 가지 단점이 있었습니다.

  • 비효율적인 리소스 경쟁: 대규모 언어 모델(LLM) 추론 엔진 또는 온디바이스 비전 시스템과 같은 대규모 머신러닝 워크로드가 제한된 NPU 리소스(예: SRAM, 가중치 메모리, 실행 채널)를 두고 다른 우선순위가 높은 시스템과 직접 경쟁했습니다.
  • 시스템 불안정: 수요가 하드웨어 용량을 초과하는 경우 조정되지 않은 워크로드가 열 조절, 메모리 페이지 오류 또는 LMKD (Low Memory Killer Daemon)를 트리거할 수 있습니다.
  • 비효율적인 우선순위 지정: 시스템 서버는 지연 시간에 민감한 카메라 파이프라인 또는 사용자 어시스턴트가 포그라운드에서 활성 상태인 동안 백그라운드 작업이 대규모 모델을 로드하는 것과 같은 컨텍스트 전환에 대응하여 NPU 우선순위를 조정할 수 없습니다.

NPU 관리자는 모델 로드를 게이트하고 현재 기기 상태 및 앱 상태를 기반으로 실행 우선순위를 동적으로 조정하는 시스템 수준 중재자 역할을 하여 이러한 문제를 해결합니다.

시스템 아키텍처

NPU 관리자는 Android 프레임워크 내에서 실행되는 npu라는 시스템 서비스로 구현됩니다. NPU 관리자는 예약 정책의 상위 수준 조정을 하위 수준 벤더 드라이버 구현과 분리합니다.

다음 다이어그램은 NPU 관리자 환경 레이어를 보여줍니다.

NPU 관리자 환경 레이어

그림 1. NPU 관리자 환경 레이어

주요 구성요소

  • 프레임워크 API 클라이언트 (android.npumanager.NpuManager): 클라이언트가 모델 로드 예약을 요청하는 데 사용하는 진입점입니다.
  • 시스템 서비스 (npu): 모델 로드 승인을 게이트하고 예약 우선순위 규칙을 기반으로 선점 명령어를 관리하는 시스템 서비스입니다.
  • NPU 예약 HAL (android.hardware.npu): 프레임워크와 드라이버 간에 Android 앱 우선순위 콜백을 전달하는 AIDL 기반 인터페이스입니다.
  • 벤더 드라이버: 하드웨어 실행 블록을 제어하고 하위 수준 우선순위 지정 메커니즘을 구현하는 하위 수준 드라이버입니다.

SDK 및 프레임워크 API

하위 수준 신경망 라이브러리를 호출하거나 모델 파일을 로드하기 전에 프레임워크 클라이언트는 NpuManager 서비스와 상호작용해야 합니다. 이렇게 하려면 클라이언트가 먼저 모델 로드 요청을 정의한 다음 요청 및 승인 흐름을 실행합니다.

모델 로드 요청

모델 로드 요청은 ModelLoadRequest로 표시됩니다. 이 객체에는 다음이 포함됩니다.

  • 고유 요청 ID
  • NPU_MODEL_SIZE_LESS_THAN_1GB 또는 NPU_MODEL_SIZE_GREATER_THAN_2G와 같은 예상 모델 크기 클래스
  • NPU_MODEL_PRIORITY_BACKGROUND, NPU_MODEL_PRIORITY_NORMAL 또는 NPU_MODEL_PRIORITY_OPPORTUNISTIC과 같은 의도된 우선순위

다음 코드 예에서는 크기 제한이 2GB보다 크고 실행 우선순위가 일반인 ModelLoadRequest를 빌드합니다.

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 및 벤더 통합

NPU 관리자를 지원하려면 기기별 벤더 구현이 android.hardware.npu AIDL 서비스 인터페이스를 준수해야 합니다.

예약 구성

시스템은 SchedulingConfig AIDL the SchedulingConfig AIDL 구조를 사용하여 앱 우선순위를 전달합니다. IScheduling.aidl

package android.hardware.npu;

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

이 구조를 사용하여 NPU 관리자는 우선순위 정렬을 조정합니다. 예를 들어 백그라운드 앱이 우선순위가 높은 작업을 제출하면 포그라운드 그래픽과의 간섭을 방지하기 위해 우선순위가 하향 조정됩니다.

작업 상태 및 프로파일링

벤더 드라이버는 NPU 실행 그룹의 수명 주기 상태를 관리자에게 보고해야 합니다. WorkInfoWorkInfo.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 매개변수를 사용하여 이벤트 디바운싱을 지원합니다. 이렇게 하면 로그 플러딩을 방지하고 반복 모델의 연속 시작 및 종료 이벤트와 같은 빠른 알림을 억제합니다.

콜백 수명 주기 상태는 다음과 같이 보고됩니다.

  • 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 예약 우선순위를 지정하려는 클라이언트는 AndroidManifest.xml에서 NPU 하드웨어 기능을 선언해야 합니다.

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

최신 세대의 파트너 하드웨어에 배포된 모델의 경우 최적의 엔진 생성을 위해 이 선언이 필요할 수 있습니다.

VTS 통합 테스트

NPU HAL 구현은 VTS 기능 테스트(예: VtsHalNpuSchedulingTargetTest)로 검증할 수 있습니다.