서비스 품질

Android 11부터 NNAPI는 앱이 모델의 상대적 우선순위, 지정된 모델 준비에 예상되는 최대 시간 및 지정된 실행 완료에 예상되는 최대 시간을 표시하도록 허용함으로써 향상된 서비스 품질(QoS)을 제공합니다. 또한 Android 11에는 추가 NNAPI 오류 값이 도입되었습니다. 이 오류 값을 사용하면 장애가 발생한 경우 서비스가 무엇이 잘못되었는지 좀 더 정확하게 표시할 수 있기 때문에 클라이언트 앱이 보다 정확하게 대응하고 복구할 수 있습니다.

우선순위

Android 11 이상의 경우 NN HAL 1.3에서는 모델이 우선순위가 지정된 상태로 준비됩니다. 이 우선순위는 동일한 앱이 소유한 다른 준비된 모델에 따라 다릅니다. 우선순위가 높은 실행은 우선순위가 낮은 실행보다 더 많은 컴퓨팅 리소스를 사용할 수 있으며, 우선순위가 낮은 실행을 선점하거나 우선순위가 낮은 실행에 아무런 리소스를 제공하지 않을 수 있습니다.

Priority를 명시적 인수로 포함하는 NN HAL 1.3 호출은 IDevice::prepareModel_1_3입니다. IDevice::prepareModelFromCache_1_3은 캐시 인수에 Priority를 암시적으로 포함합니다.

드라이버와 액셀러레이터의 기능에 따라 우선순위를 지원하는 데는 여러 가지 전략이 가능합니다. 다음은 그중 몇 가지 전략입니다.

  • 우선순위 지원이 내장된 드라이버의 경우 Priority 필드를 액셀러레이터에 직접 전파합니다.
  • 실행이 액셀러레이터에 도달하기 전이더라도 서로 다른 우선순위를 지원하도록 앱별 우선순위 큐를 사용합니다.
  • 현재 실행 중인 우선순위가 낮은 모델을 일시중지 또는 취소하여 액셀러레이터가 우선순위가 높은 모델을 자유롭게 실행할 수 있도록 합니다. 이렇게 하는 방법은 우선순위가 낮은 모델에 체크포인트를 삽입하여 도달 시 그 모델이 플래그를 쿼리하여 현재 실행을 사전에 중지해야 하는지 결정하거나, 모델을 하위 모델로 나누고 하위 모델과 실행 간의 플래그를 쿼리함으로써 가능합니다. 참고로, 우선순위를 지정하여 준비된 모델에 체크포인트 또는 하위 모델을 사용하면 추가 오버헤드가 발생할 수 있습니다. 이러한 오버헤드는 우선순위가 없고 NN HAL 1.3보다 낮은 버전의 모델에서는 발생하지 않습니다.

    • 선점을 지원하려면 실행할 다음 작업이나 하위 모델, 관련된 중간 피연산자 데이터 같은 실행 컨텍스트를 보존해야 합니다. 이 같은 실행 컨텍스트를 사용하여 나중에 실행을 다시 시작할 수 있습니다.
    • 전체 선점 지원은 필요하지 않으므로 실행 컨텍스트를 보존할 필요는 없습니다. NNAPI 모델 실행은 확정적이므로 나중에 처음부터 실행을 다시 시작할 수 있습니다.

Android에서는 서비스가 AID(Android UID)를 사용하여 서로 다른 통화 앱을 구분할 수 있습니다. HIDL에는 메서드 ::android::hardware::IPCThreadState::getCallingUid를 통해 통화 앱의 UID를 가져올 수 있는 메커니즘이 내장되어 있습니다. AID 목록은 libcutils/include/cutils/android_filesystem_config.h에서 확인할 수 있습니다.

기한

Android 11부터 OptionalTimePoint 기한 인수로 모델 준비와 실행을 시작할 수 있습니다. 작업 소요 시간을 예측할 수 있는 드라이버는 이러한 기한을 통해 기한 전에 작업을 완료할 수 없다고 예상하면 작업 시작 전에 작업을 취소할 수 있습니다. 마찬가지로, 기한을 통해 드라이버는 진행 중인 작업 중에서 기한 전에 완료되지 않을 것으로 예상하는 작업을 취소할 수 있습니다. 기한 인수는 작업이 기한까지 완료되지 않거나 기한이 지나더라도 드라이버에 작업 취소를 강제하지 않습니다. 기한 인수를 사용하면 드라이버 내의 컴퓨팅 리소스를 확보할 수 있고 기한이 지정되지 않았을 때 가능한 속도보다 더 빨리 앱에 제어권을 반환할 수 있습니다.

OptionalTimePoint 기한을 인수로 포함하는 NN HAL 1.3 호출은 다음과 같습니다.

  • IDevice::prepareModel_1_3
  • IDevice::prepareModelFromCache_1_3
  • IPreparedModel::execute_1_3
  • IPreparedModel::executeSynchronously_1_3
  • IPreparedModel::executeFenced

위의 각 메서드에 관한 기한 기능 참조 구현은 frameworks/ml/nn/driver/sample/SampleDriver.cpp의 NNAPI 샘플 드라이버를 참고하세요.

오류 코드

Android 11에는 오류 보고 개선을 위해 NN HAL 1.3의 4가지 오류 코드 값이 포함되어 있습니다. 이러한 값을 통해 드라이버는 보다 정확하게 상태를 전달할 수 있고 앱은 더욱 안정적으로 복구될 수 있습니다. 다음은 ErrorStatus의 오류 코드 값입니다.

  • MISSED_DEADLINE_TRANSIENT
  • MISSED_DEADLINE_PERSISTENT
  • RESOURCE_EXHAUSTED_TRANSIENT
  • RESOURCE_EXHAUSTED_PERSISTENT

Android 10 이하에서 드라이버는 GENERAL_FAILURE 오류 코드를 통해서만 오류를 나타낼 수 있었습니다. Android 11부터는 기한에 도달했거나 드라이버가 워크로드를 기한까지 완료하지 못한다고 예상했기 때문에 워크로드가 취소되었음을 나타내는 두 가지 MISSED_DEADLINE 오류 코드를 사용할 수 있습니다. 두 가지 RESOURCE_EXHAUSTED 오류 코드는 호출에 필요한 메모리가 드라이버에 부족한 경우 등 드라이버의 리소스 제한으로 인해 작업이 실패했음을 나타내는 데 사용할 수 있습니다.

두 오류의 TRANSIENT 버전은 문제가 일시적이며 잠시 지연이 있은 후 향후의 같은 작업 호출이 성공할 수 있음을 나타냅니다. 예를 들어 이 오류 코드는 드라이버가 오래 실행되거나 리소스 소모가 많은 이전 작업으로 바쁘기는 하지만 드라이버가 이전 작업으로 바쁘지 않으면 새 작업이 성공적으로 완료될 수 있는 경우에 반환됩니다. 두 오류의 PERSISTENT 버전은 향후의 동일한 작업 호출이 예외 없이 실패할 것으로 예상됨을 나타냅니다. 예를 들어 이 오류 코드는 완벽한 조건에서도 기한까지 작업이 완료되지 않을 것으로 드라이버가 예상하거나 본질적으로 모델이 너무 커서 드라이버 리소스를 초과하는 경우에 반환됩니다.

유효성 검사

서비스 품질 기능은 NNAPI VTS 테스트(VtsHalNeuralnetworksV1_3Target)에서 테스트됩니다. 이 기능에는 드라이버가 잘못된 우선순위를 거부하도록 하는 일련의 유효성 검사 테스트(TestGenerated/ValidationTest#Test/ )와 드라이버가 기한을 올바로 처리하도록 하는 DeadlineTest(TestGenerated/DeadlineTest#Test/)라는 일련의 테스트가 포함되어 있습니다.