[TensorRT] ERROR: 3: [executionContext.cpp::setBindingDimensions::944] Error Code 3: API Usage Error (Parameter check failed at: runtime/api/executionContext.cpp::setBindingDimensions::944, condition: profileMaxDims.d[i] >= dimensions.d[i]



ERROR: 3: [executionContext.cpp::setBindingDimensions::944] Error Code 3: API Usage Error (Parameter check failed at: runtime/api/executionContext.cpp::setBindingDimensions::944, condition: profileMaxDims.d[i] >= dimensions.d[i]

NVIDIA-AI-IOT 오픈소스에서 torch2trt로 변환 후, 모델 inference할 때 변환 과정에서 설정된 차원값과 input 차원 값이 맞지 않아 발생하는 에러입니다.
저 같은 경우 max dimension이 5로 설정되었는데, input demension이 6이라 에러가 발생했습니다.

차원 맞추기

torch2trt parameters를 보면 차원을 설정할 수 있는 값으로 유추되는건 min_shapes, max_shapes, opt_shapes, max_batch_size가 있습니다.

이 값들을 어떻게 사용하는지 아래 코드를 보면
  • inputs와 outputs를 Flattener value로 만든 후, 입력 값(dataset)의 min / max shape을 구합니다.
  • max_batch_size가 입력된 경우(None이 아닌 경우) min_shapes_flat과 max_shapes_flat을 각각 구하여 infer_dynamic_axes에 넣어줍니다.
  • 반대로 max_batch_size가 None인 경우에는 위에서 계산해둔(min_shapes와 max_shapes에서 구한) min_shapes_flat, max_shapes_flat를 이용합니다.
코드 구조를 보아 dynamic_axes_flat에서 입력 배치가 설정됨을 유추할 수 있습니다.
저같은 경우에는 입력 이미지 크기가 변경되는게 아닌 단순한 배치 크기의 문제이므로 배치 사이즈를 늘려서 torch2trt로 export하겠습니다.
* 입력 이미지 크기가 변경되어야하는 분들은 min_shapes와 max_shapes의 크기를 입력으로 넣어주세요.

저는 최대 8의 배치 사이즈가 필요하기 때문에 max_batch_size를 8로 설정했습니다.
model_trt = torch2trt(model, [input_tensor], fp16_mode=True, max_batch_size=8)

배치 8로 설정된 모델을 inference하면 정상 구동됨을 확인할 수 있습니다.
  • 배치 변경 전 실행화면
  • 배치 변경 후 실행화면


참고 문헌

[1]   https://zerohertz.github.io/pytorch-model-to-tensorrt/
[2]   https://github.com/NVIDIA-AI-IOT/torch2trt/blob/master/torch2trt/torch2trt.py#L518

댓글

이 블로그의 인기 게시물

[opencv-python] 이미지 크기조절(resize) 하는 법

[python] selenium close와 quit 차이점

[python]파이썬: csv reader header skip (첫번째 행 무시하기, 안읽기)