ddps-lab / edge-inference

Evaluation of inference model performance on edge devices
Apache License 2.0
2 stars 3 forks source link

CNN 모델 TensorRT convert 및 inference #47

Closed jungae-park closed 2 years ago

jungae-park commented 2 years ago
  1. model : Mobilenet V1, Mobilenet V2, Inception V3, Yolo V5
  2. dataset : tfrecord imagenet (1000장)
  3. GPU device : Nvidia Jetson TX1, TX2, Xavier, Nano
  4. TPU device : rpi-4 + Coral TPU
jungae-park commented 2 years ago
kmu-leeky commented 2 years ago

음. 에러가 나는구나. 대략적인 성능이라도 빠르게 확인이 되면 좋기는 하겠다. 혹시 에러 메시지가 조금 자세하게 나온게 있거나, core dump 된걸 gdb 로 디버깅 해보면 대략적인 에러 이유는 알수 있지 않을까 싶네.

jungae-park commented 2 years ago

네 교수님 에러 메시지가 자세하게 나온게 없어서 core dump를 디버깅해보겠습니다.

jungae-park commented 2 years ago

TensorRT 모델로 변환 후 추론 과정에서 발생한 메시지(에러 메시지 포함)를 다시 확인하였습니다. https://encouraging-lantern-5d1.notion.site/error-message-cc0753f5e9fe41cb8492db4eab6e0740

메시지 하단에 tensorRT version에 대한 내용이 있어서, jetson xavier에서 제공하는 tensorRT 버전과 맞지 않아서 생긴 이슈로 추정하고 jetson xavier에서 제공하는 TensorRT 버전을 확인해보았습니다.

그래서 버전 관련해서 생긴 이슈였는지 조금 더 살펴보면서 진행해보려고 합니다.

kmu-leeky commented 2 years ago

응 좋은 생각이다. 둘중에 맞추기 편한 쪽으로 버전을 맞춰서 해보자 (가급적이면 최신 버전이면 좋겠고)

jungae-park commented 2 years ago

기존에 사용하던 이미지가 nvidia 공홈에서 제공해주는 tensorflow만 포함된 이미지였고, TensorRT가 포함되지 않아 에러가 발생한 것으로 추정하였습니다. 그래서 host와 동일한 버전의 TensorRT가 포함된 docker image를 nvidia 공홈에서 확인하여 이미지를 받았고, container를 실행하였으나 로그 메시지를 남기지 않고 컨테이너가 stop 되었습니다. https://catalog.ngc.nvidia.com/orgs/nvidia/containers/l4t-tensorrt

tensorrt가 포함된 docker image의 dockerfile이 있는지 확인해보고 있으며, 컨테이너가 stop된 이유에 대해서도 확인중에 있습니다.

kmu-leeky commented 2 years ago

CNN+TensorRT 로 양자화는 빠르게 될줄 알았는데 안그런가보네..TensorRT 를 xavier 에서 구동하는 기초적인 예제 같은건 돌려봤어? 하나씩 차근 차근 하는게 낫지 않을까 싶고, 가능하면 새로운 xavier 에 깔끔하게깔아서 해봐도 좋고. 환경 구성을 이야기 해줘도 도움이 될테고. 널리 알려진 기본적인 tutorial 은 잘 동작해야할거 같아.

jungae-park commented 2 years ago

TensorRT를 xavier 에서 구동하는 기초적인 예제도 환경이 구성되어야 돌릴 수 있기는 합니다. 컨테이너를 사용하지 않고, xavier에 바로 설치해서 되면 좋지만 안될 경우 꼬일 수 있어서 컨테이너를 띄워 실험을 진행했었습니다. 기본적으로 알려진 튜토리얼을 다시 찾아서 좀 더 확인해보겠습니다.

kmu-leeky commented 2 years ago

짧게 검색해봐도 간단한 설치 및 컨테이너 활용하는 블로그가 많이있는데. 에러가 나나보네. 깨끗한 환경에서 해보는것도 좋을것 같아. 1대만 있는건 아니니.

https://eehoeskrap.tistory.com/309

jungae-park commented 2 years ago

네 전달해주신 예제도 확인을 했었는데, amd64 기준의 docker image를 사용하여 컨테이너를 띄워 확인한 것으로 알고있습니다. 저희는 arm64 기반의 docker image를 사용하였음에도 이슈가 있어, 말씀하신대로 우선 host에서 tensorrt를 설치하고 간단한 예제를 돌려보겠습니다.

추후에 컨테이너에서 다시 실험을 진행해야 할 때는 따로 dockerfile을 구성해야할 수도 있을 것 같습니다.

jungae-park commented 2 years ago

[xavier host]

[xavier container-기존 docker image 사용(arm64+tensorflow2.5+python3.6)]

[xavier container - 새로운 docker image 사용(arm64+tensorrt 8.2.1+python3.8)]

따라서 jetpack 4.6 기준 장비에서 python, TensorRT, tensorflow 버전을 모두 맞추는 것이 꽤나 이슈가 있을 것으로 예상 아래와 같이 각 환경에서 맞춰야하는 라이브러리 버전이 명시되어 있기도 하였음 https://docs.nvidia.com/deeplearning/tensorrt/container-release-notes/rel_21-12.html image 최소한의 작업으로 코드 실행을 빠르게 해보려고 하였지만, 하나씩 맞춰서 진행할 필요도 있어 보임 그리고 다른 xavier or nano 장비에서 tensorrt 추론 작업에 대한 글을 찾아보았지만 특별하게 참고할 수 있는 것이 없었음

jungae-park commented 2 years ago

기존 실험을 계속 xavier 장비에서 tensorrt 모델로 convert 후 추론을 진행하였었는데, Segmentation fault 오류가 어떤 이유로 생긴 것인지 확인하기 위해 다른 엣지 장비 (tx2, nano) 에서도 작업을 진행해보았습니다.

kmu-leeky commented 2 years ago

오케이 좋은 발견을 했네. TX2 에서 TRT 진행이 되는구나. TX2 에서 이전에 다른 방식으로 양자화한 결과가 있었나? 내 기억에 다른 방식의 양자화는 Xavier 에서만 진행이 되었던것 같은데.. 한번 확인을 해줄래? TRT 설정이 어려운듯 하니 모든 장치에서 하기보다 하나 정도 장비를 정해두고 TRT 와 다른 방식의 양자화 진행시 성능을 비교해보면 좋을것 같아.

그리고 실험결과중에 마지막에 이야기한 MobileNetV1 INT8 의 경우 IPS(inf) 가 매우 높은데 확인해봐야 할것 같아.

jungae-park commented 2 years ago

네 교수님 tx2에서는 이전에 다른 방식으로 양자화한 결과는 없었고, yolo v5 video 추론을 tflite로 양자화하여 tx1, tx2, xavier, nano 장비에서 실험한 내용은 있습니다. image 이때 양자화 실험을 진행하긴 하였지만 결과가 미흡했던 것으로 기억합니다. TRT 추론이 tx2 장비에서 진행이 잘되니, 아래와 같이 tx2 장비에서 TRT 추론과 tflite 추론시 성능 비교를 진행해보는 것이 좋을 것 같습니다.

  1. model 별 TRT vs tflite 성능비교
  2. batch size 단위별 TRT vs tflite 성능 비교
  3. 양자화 FP32 vs FP16 vs INT8 성능 비교

그리고 Mobilenet V1 INT8 TRT 추론시 IPS(Inf)가 높은 것도 확인해보겠습니다.

kmu-leeky commented 2 years ago

응 정애야 좋은 생각이다. 하나씩 진행을 해보자. tx2 에 yolov5 비교 좋은 생각이다. 이게 성공하면 다른 모델로 확장해가는 방향이 좋겠다.

jungae-park commented 2 years ago

tx2 장비에서 yolo v5 모델 기준으로 trt 와 tflite 추론을 비교해보려고 합니다.

  1. Yolo V5 model TRT convert & inference

    1. FP32 TRT model
      • 배치 추론이 되도록 모델 convert 완료
    2. FP16 TRT model
      • convert는 되었지만 model output shape를 확인하였을 때, 배치 추론이 되지 않고 batch size 1로만 추론이 되도록 convert 되는 것을 확인
    3. 참고하고 있는 코드상에는 INT8로 양자화하는 방법이 포함되어 있지 않아 INT8로 양자화가 필요한 경우 다른 방법이 있는지 확인 필요
    4. model 추론시 아래와 같은 에러 메시지 발생하여 확인중에 있음

      AttributeError: 'NoneType' object has no attribute 'num_bindings'
  2. Yolo V5 model tflite convert & infernece

    1. 참고하고 있는 코드상에는 FP32로 양자화하는 방법이 포함되어 있지 않아 FP32로 양자화가 필요한 경우 다른 방법이 있는지 확인 필요
    2. FP16 tflite model
      • 배치 추론이 되지 않는 모델 convert 완료
    3. INT8 tflite model
      • 배치 추론이 되지 않는 모델 convert 완료
    4. 각각의 양자화 model 추론 예정

따라서 현재 양자화가 가능한 모델을 기준으로 추론을 진행해서 결과값을 먼저 정리해보고, 추가로 양자화가 필요한 모델에 대해서는 조금 더 살펴보려고 합니다.

kmu-leeky commented 2 years ago

trt 와 tflite 의 양자화 비교에서는 굳이 배치 추론은 추가하지 않는건 어떨까? 배치 추론까지 다해서 실험을 하면 좋기는 하겠는데, 벌써부터 이런 저런 이슈가 있는듯 하니 우선은 2개 시스템의 양자화 성능 비교에 촛점을 맞추면 어떨까 싶은 생각이야.

jungae-park commented 2 years ago

mobilenet v1, v2, inception v3 모델에 대해 batch size 1 기준으로 TRT 추론을 완료하였습니다.

image

전체적으로 INT8인 경우 추론 성능이 너무 좋아 무슨 이유로 좋은지 좀 더 알아봐야하고, inception v3 - TRT (INT8) 인 경우는 memory limite으로 인해 killed 되어 어디서 메모리를 사용하고 있는지 확인이 필요해 보입니다.

후에, 3개의 모델에 대해서 tflite 추론 성능도 살펴볼 예정입니다.

kmu-leeky commented 2 years ago

응 정애야 잘 진행했네. 그런데 FP32 의 경우는 원본 모델인거야? TensorRT 로 quantization 했다고 하면서 FP32 라고 하니까 이게 원본 모델인지 헷길리네. 추론을 진행한 전체 이미지의 갯수는 어떻게 되지? INT8 에서의 정확도도 꽤나 높은데 실제 데이터를 사용해서 정확도를 측정한건지 아니면 일부 데이터로만 측정한건지 확인해주면 좋겠다.

jungae-park commented 2 years ago

FP32인 경우도 원본 Tensorflow 모델을 float32로 TRT convert 되도록 진행하였습니다. 추론을 진행한 이미지는 imagenet tfrecord dataset 1000장을 사용하였습니다.

jungae-park commented 2 years ago

Mobilenet V1, V2, Inception V3 (FP32, FP16, INT8) tflite 모델에 대한 추론도 진행해보았습니다. (imagenet raw 1000장 사용)

image

kmu-leeky commented 2 years ago

궁금한점은 "FP32인 경우도 원본 Tensorflow 모델을 float32로 TRT convert 되도록 진행하였습니다." 이렇게 했을때 TRT convert 한것과 하지 않은것의 (원본 FP32) 성능 차이가 조금 있어? tflite 는 gpu 를 사용하지 못하는건 지금까지 계속 그랬던거야? 처음 듣는 이야기인것 같아서. 이전에 우리가 양자화 실험 했을때도 엣지 gpu 를 사용하지 않았던거야?

jungae-park commented 2 years ago

tx2 장비에서 mobilenet v1, v2, inception v3 TF-fp32 원본 모델 추론 성능과 TRT-FP32 추론 성능을 비교해보면 아래와 같습니다.

image

정확도 측면에서는 같고, 추론 성능은 조금 더 좋아졌습니다.

그리고 이전에 tflite 추론 실험을 yolo v5-video 추론만 진행을 했었는데, 이때 gpu를 사용하고 있었는지 메시지를 따로 기록해 두지 않아 gpu 사용 유무에 대해 확인을 할 수 가 없습니다. 하지만 그때도 값이 장비와 양자화에 마다 특이점을 찾을 수 없어서 이상하다고 생각했는데, 그게 cpu를 사용해서 그랬지 않았나 싶습니다. 다른 mobilenet v1, v2, incepction v3 모델은 tflite 추론 실험을 진행한적이 없기도 합니다. gpu를 사용하면서 tflite 추론 진행 사례를 다시 찾아보겠습니다.

kmu-leeky commented 2 years ago

아. 그랬구나. tflite 를 이용한 양자화 실험을 거의 안했구나. 원본 모델과 trt fp32 결과 확인 해보니 좋다. 이걸 가지고 내일 조금 더 이야기를 나눠보자.

jungae-park commented 2 years ago

해당 이슈도 지난번 미팅 때 pause 되어 필요 시 다시 이슈 생성 하겠습니다.