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 테스트 제품군의 일부입니다. 자세한 내용은 유효성 검사를 참고하세요.