Android 11부터 NNAPI에는 다른 모델을 인수로 사용하여 조건부로(IF
) 또는 반복적으로(WHILE
) 실행하는 두 개의 제어 흐름 연산 IF
와 WHILE
이 포함됩니다. 이에 따라 입력 값을 기반으로 서로 다른 연산을 실행하거나 언롤링 없이 연산을 여러 번 실행하는 모델을 구성할 수 있습니다. 이 사항은 동적 RNN 및 seq2seq 같은 사용 사례에 중요합니다.
NN HAL 1.3의 모델에는 실행의 입력과 출력을 지정하는 데 사용되는 기본 하위 그래프를 비롯하여 여러 하위 그래프가 포함됩니다. 하위 그래프는 SUBGRAPH
유형의 피연산자를 사용하여 다른 하위 그래프를 참조할 수 있습니다. 프레임워크는 액셀러레이터가 제어 흐름 작업에 참조되는 모든 하위 그래프의 모든 작업을 지원하는 경우에만 제어 흐름 작업을 액셀러레이터로 전송할 수 있습니다.
HAL 인터페이스
NN HAL 1.3에서 제어 흐름과 관련된 정의는 types.hal
에 있습니다.
IF
및WHILE
연산 유형SUBGRAPH
피연산자 유형 및 관련SUBGRAPH
피연산자 수명- 기본 하위 그래프와 참조된 하위 그래프 목록이 포함된
Model
구조 ifPerformance
및whilePerformance
를 포함하는Capabilities
구조
IDevice.hal
에는 IDevice
가 포함되어 있습니다. 이 항목의 메서드 getSupportedOperations_1_3()
은 다른 연산과는 다르게 IF
및 WHILE
을 처리해야 합니다.
IPreparedModel.hal
에는 IPreparedModel
이 포함되어 있습니다. 이 항목의 메서드 execute_1_3()
, executeSynchronously_1_3()
및 executeFenced()
는 선택적으로 loopTimeoutDuration
인수를 취합니다.
드라이버 구현
샘플 작업 구현은 CpuExecutor::executeIfOperation
및 CpuExecutor::executeWhileOperation
을 참고하세요.
샘플 작업 유효성 검사 로직은 validateIfOperation()
및 validateWhileOperation()
을 참고하세요.
산술 연산과 비교 연산은 루프 카운터로 사용될 수 있으므로 형태 1
의 TENSOR_INT32
피연산자에 이들 항목을 지원하는 것이 중요합니다.
마찬가지로, 형태 1
의 TENSOR_BOOL8
피연산자를 생성하는 연산에는 IF
및 WHILE
조건을 사용해야 합니다.
WHILE 루프 실행 시간 초과
무한 루프를 방지하려면 WHILE
루프가 IPreparedModel::execute_1_3()
, IPreparedModel::executeSynchronously_1_3()
또는 IPreparedModel::executeFenced()
호출에 전달된 loopTimeoutDuration
값(또는 생략된 경우 기본 값)보다 시간이 더 오래 걸리면 실행이 취소되어야 합니다.
유효성 검사
제어 흐름 테스트는 CTS 및 VTS 테스트 제품군의 일부입니다. 자세한 내용은 유효성 검사를 참고하세요.