[TensorRT] TensorRT 및 Tensor Core에서 NCHW vs NHWC 형식의 성능 차이
1. TensorRT : NCHW vs NHWC
"It’s recommended to use NCHW format to get better performance with TensorRT."
NVIDIA 에서는 TensorRT 입력 값으로 NCHW 포맷을 권장한다. 사용자가 TensorRT Engine 에 Input 값을 NHWC 포맷으로 입력해도 되지만, TensorRT 에서 최적화 될 때, 입력값과 호환되도록 여러 형식 변환기를 자동으로 삽입한다. 즉, NVIDIA는 입력값이 어찌되었던 GPU Acceleration 으로 인해 NCHW 를 형식을 채택한다.
또한, NHWC 형식을 선호하는 경우 UFF Parser 가 호환성을 처리할 수 있으며, 일반적으로 Caffe 는 NCHW 형식을 사용하며, 호환하는데 문제가 없다고 한다. 참고로 TensorFlow 의 포맷은 NHWC 이다.
결론은, TensorRT 에서 성능이 중요할 경우 입력값으로 NCHW 형식을 채택해야한다.
2. Tensor Core : NCHW vs NHWC
이와는 반대로 NHWC 형식이 성능이 더 좋은 사례는 아래와 같다.
아래는 Tensor Core 에서 구현된 Convolution Tensor Size 및 NCHW, NHWC 형식에 따른 성능 차이 지표이다.
WinML(Window Machine Learning)에서 Tensor Core 를 사용할 수 있도록 이 모델의 입력 및 배치 크기를 미리 알고 있어야 한다. 이러한 값은 입력 데이터 자체에서 유추 할 수 있지만, 이를 명시적(Explicit)으로 제공할 경우 런타임이 최적화 될 수 있다. 이러한 이유에서 TensorRT 7.0 버전에서 명시적 배치 사이즈(Explicit Batch Size) 를 도입하지 않았나 싶다.
Tensor Core 를 제대로 활용하여 최대의 성능을 얻으려면 Convolution의 입력 크기를 64/128/256의 배수로 유지하고 가능한 한 허용된 메모리 안에서 크기를 최대한 크게 유지하는 것이 좋다. TensorRT 와는 다르게 Tensor Core 에서 구현된 Convolution 에서는 NCHW 포맷보다 NHWC 포맷이 Tensor Core 에서 더 나은 성능을 제공한다.
참고자료 1 : https://forums.developer.nvidia.com/t/tensorrt-specify-layer-nchw-nhwc/68694/6
참고자료 2 : https://devblogs.nvidia.com/accelerating-winml-and-nvidia-tensor-cores/
참고자료 3 : https://docs.nvidia.com/deeplearning/sdk/pdf/Deep-Learning-Performance-Guide.pdf
'AI Development > TensorRT' 카테고리의 다른 글
[TensorRT] Onnx 모델을 위한 Custom Plugin 구현 (작성중) (0) | 2020.08.03 |
---|---|
[TensorRT] TensorRT GA vs RC => Use the GA version (0) | 2020.05.18 |
[TensorRT] 지원되는 연산자 목록 (2020.04.29 기준) (0) | 2020.04.29 |
[TensorRT] NVIDIA TensorRT 개념, 설치방법, 사용하기 (17) | 2020.04.21 |
[TensorRT] AttributeError: 'NoneType' object has no attribute 'serialize' (2) | 2020.03.12 |