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
에는 getSupportedOperations_1_3()
메서드가 IF
및 WHILE
을 다른 작업과 다르게 처리해야 하는 IDevice
가 포함되어 있습니다.
IPreparedModel.hal
에는 execute_1_3()
, IPreparedModel
executeSynchronously_1_3()
및 executeFenced()
메서드가 선택적 loopTimeoutDuration
인수를 사용하는 IPreparedModel이 포함되어 있습니다.
드라이버 구현
샘플 작업 구현은 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 테스트 제품군의 일부입니다. 자세한 내용은 유효성 검사 를 참조하십시오.