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/
)가 포함됩니다.