YOLOv5 NVIDIA Jetson 포팅기

HnBrd·2023년 5월 24일
0
post-thumbnail

본 글은 튜토리얼이 아니고 설치 후기임을 미리 알려드립니다.

YOLOv5 모델을 엔비디아의 엣지 장비인 AGX Xavier에서 돌려야 하는 일이 있었다. 엣지가 뭔데..
처음 엣지라는 용어를 듣고 뭔가 cutting-edge technology를 사용한 괴물같은 장비인줄 알고 기대했는데 어떤 망의 종단에 있는 장치라는 의미의 edge라는 것을 깨닫고 실망했다. 트리구조로 따지자면 리프노드 정도로 생각하면 되는 듯 하다.
하여튼 엔비디아에 따르면 소비전력은 최대 30W / 성능은 최대 32TOPS으로 꽤 강력한 성능을 내주는 녀석이라고 하는데, 실제로 우분투 GUI 환경만으로도 버벅거리는 장비치고는 연산자체는 빠른 편이라고 느꼈다. 이후에 Jetson Nano라는 더 작고 하찮은 장비를 만지고 있는 지금은 Xavier가 굉장한 장비라는 것을 느끼고 있다.

출처 : http://terms.tta.or.kr/dictionary/dictionaryView.do?word_seq=180916-1

AGX Xavier

Specification

  • 512-Core Volta GPU
  • 32Gb Memory
  • 32Gb eMMC 5.1 Storage
  • Max 30W / Max 32TOPS

설치 과정

Jetpack을 최신버전으로 설치하면 PyTorch, OpenCV 등 기타 패키지들을 하위호환으로 지원할 것이라는 착각에 5.1 버전을 설치했었는데, 패키지 의존성 문제로 이틀동안 고생하고 Jetpack 재설치라는 결론을 내렸다.
Jetson에서 패키지를 설치할 때의 문제점은, NVIDIA에서 제공하는 패키지만 사용해야 한다는 것이다. 일반적인 리눅스 시스템처럼 원하는 패키지를 골라서 설치할 수 없으니, 동작시키고자 하는 모델의 요구사항을 잘 살피고 해당 패키지들을 설치할 수 있는 Jetpack이라는 첫 단추부터 잘 끼워야 한다. 아니면 torch.cuda.is_available() == False 를 보게 될 것.

설치 시 필요했던 사이트

  • PyTorch for Jetson
    - Jetson 버전 별로 torchtorchvision 설치하는 방법이 정리되어있음
  • NVIDIA SDK
    - Jetson에 Jetpack을 설치하기 위한 NVIDIA SDK, NVIDIA Developer 계정이 필요하다
  • Installing Frameworks for Jetson
    - Jetson에 TensorFlow와 PyTorch를 설치하기 위한 매뉴얼

설치 과정 중에 겪은 문제들

  • YOLOv5를 실행하기 위한 PyTorch 버전은 torch==1.9, 아니면 해결할 수 없는 오류가 발생
  • Jetson용 PyTorch 1.9 패키지는 Python 3.6용 버전밖에 제공하지 않는다
  • PyTorch 3.6을 위해서는 Jetpack 4.6를 설치해야한다
  • Jetpack 4.6을 설치하기 위해서는 NVIDIA SDK Manager에서 Ubuntu 18.04를 요구한다
  • Jetpack 설치는 생각보다 Host PC에 생각보다 큰 용량을 요구한다
  • SDK Manager에서 설치 도중 수많은 에러를 내뿜어서 Repair + Install을 무한 반복. 어느 순간 모든 것이 잘 맞아떨어지더니 설치가 완료되었다. 아직도 왜 갑자기 잘 설치된건지 이해할 수 없어서 그저 엣지 장비의 변덕이었던 것으로..

한줄 요약 : Jetpack 버전부터 잘 골라서 설치하자!

Jetson으로의 포팅

코드 수정

NVIDIA의 제품이어서 그런지 호환성을 위해서 코드를 추가하거나 변결할 필요가 전혀 없었다. 패키지 설치만 똑바로 하면 될 뿐..

  • YOLOv5 모델 생성 부분을 클래스로 감싸고 이미지 한 장을 입력으로 받아서 처리하는 run 함수를 만들었다
  • OpenCV의 VideoCapture 로 동영상을 오픈한 뒤에 매 프레임 run을 호출하도록 하였다
  • 원래는 배치로 입력을 받아서 처리하는 구조여서 성능의 저하가 심하게 예상되었지만 모종의 이유로 변경할 수 밖에 없었다

성능

  • 눈으로 가늠했을 때 평균 초당 17프레임을 처리
  • 최저 16FPS / 최고 20FPS

생각해볼만한 성능향상 방안으로는

  • 배치 입력
  • GUI 끄기 : Jetson Nano의 경우에는 GUI를 껐을 때 더 안정적으로 동작했다. 더 이상 결과 이미지를 눈으로 확인할 수는 없게 되겠지만 성능 향상이 있을 것은 분명하다
  • 최적화 : 장비가 온전히 Tensor 연산에 집중할 수 있도록 입출력같은 부분을 최적화하면 더 잘 동작하지 않을까?

생각나는 방안은 그렇고 요구받은 스펙 자체가 엣지장비에서 1초에 30프레임씩 처리하는 것이 아니였기 때문에 여기서 멈출 계획이다. 요런 류의 장비는 상당한 수준의 최적화가 없지 않으면 장비에서 최대 성능을 끌어내기 힘들 것 같다.

profile
잡식

0개의 댓글