[TensorRT] AttributeError: 'NoneType' object has no attribute 'serialize'
에러 :
AttributeError: 'NoneType' object has no attribute 'serialize'
이 에러는 말 그대로 TensorRT Engine 이 Serialize 되지 않는 문제인데, 다음과 같은 이유 때문에 Serialize 되지 않는 것이다.
- builder.create_network() 함수에서 나온 network 가 노드들을 완전하게 포함하고 있지 않아서 생기는 문제
- Input 부터 Output 까지 필요한 노드들을 포함하고 있지 않기 때문에 아래와 같은 에러가 발생
- [TensorRT] ERROR: Network must have at least one output
- Output Node 를 찾을 수 없어서 Output 이 인식이 안되는 것
- 그래서 반환할 engine 이 없다고 나오는 것
즉, 변환하고자 하는 Onnx 모델 또는 Pytorch 모델에 "지원되지 않는 레이어 목록"이 포함되어 있기 때문에 TensorRT 를 위한 Network 를 제대로 생성 할 수 없는 것이다. 이는 TensorRT 또는 Onnx 에서 지원하지 않는 레어어가 있기 때문에
Onnx Node 들이 중간에 끊겨버려서 Output Node 를 찾지 못하여 TensorRT Engine 생성이 되지 않는 것이다.
중간에 노드가 끊겼다는 사실은 아래와 같이 TensorRT의 (Onnx 모델을 인식한) network 의 레이어 갯수를 출력해보고,
print("network.num_layers", network.num_layers)
Onnx 변환 시 Graph 를 프린트하여 노드 갯수를 파악함으로써 이 두가지를 비교하여 알아 볼 수 있다.
아무튼,
이럴 경우에는, 지원되지 않는 레이어를 대체하여 모델을 설계하거나, custom layer 를 만들어야한다.
하지만 아주 드문 경우인 Output 이 한 개인 경우에 한하여, Onnx 를 인식한 TensorRT의 network.num_layers 의 수와 Onnx 의 Node 수가 일치한다면 단순히 TensorRT 의 Network 가 Output 데이터를 인식 할 수 없을 때 생기는 문제이므로 아래와 같이 해결 할 수 있다.
builder.build_cuda_engine(network) 를 호출하기 전에 아래 코드 한줄을 추가하여 해결
network.mark_output(network.get_layer(network.num_layers - 1).get_output(0))
API 를 이용하여 수동으로 플래그를 지정하여야함
잘못된 답변 : https://forums.developer.nvidia.com/t/onnx-and-tensorrt-error-network-must-have-at-least-one-output/68295/27
참고자료 :
https://github.com/NVIDIA/TensorRT/issues/273
https://github.com/NVIDIA/TensorRT/issues/305
https://docs.nvidia.com/deeplearning/sdk/tensorrt-developer-guide/index.html
3.2.1. Creating A Network Definition From Scratch Using The Python API
'AI Development > TensorRT' 카테고리의 다른 글
[TensorRT] 지원되는 연산자 목록 (2020.04.29 기준) (0) | 2020.04.29 |
---|---|
[TensorRT] NVIDIA TensorRT 개념, 설치방법, 사용하기 (17) | 2020.04.21 |
[TensorRT] Windows + TensorRT 설치하기 (4) | 2019.11.11 |
[TensorRT] Yolo v3 to onnx (2) | 2019.10.08 |
[TensorRT] support matrix 지원 가능한 레이어 목록 (0) | 2019.09.26 |