파이넷츠프레소의 가지치기 기법을 활용한YOLOv5-L의 실시간 처리 속도 향상

Hyungjun Lee
Research Engineer, Nota AI

 

인공 신경망은 뛰어난 성능으로 잘 알려져 있지만, 실제 상황에서 효과적으로 활용하려면 고급 컴퓨팅 자원이 필요합니다. 최근에는 일상적인 상황에 사용할 수 있는 경량화된 신경망에 대한 수요가 증가하고 있습니다.

이러한 필요를 충족하기 위해 노타는 몇 줄의 코드만으로 인공 신경망을 가속화할 수 있는 사용자 친화적인 라이브러리 형태의 넷츠프레소(NetsPresso®)를 도입했습니다. 이번 포스팅에서는 파이넷츠프레소(PyNetsPresso)를 활용하여 YOLOv5-L의 속도를 실시간 수준으로 향상시키는 방법을 소개하겠습니다.  또한, 그 성능을 평가하여 해당 기술의 기능을 종합적으로 이해하실 수 있도록 설명드리겠습니다.

PyNetsPresso_ yolov5 pruning

그림 1. 파이넷츠프레소를 사용하여 최소한의 성능 저하로 실시간 FPS를 달성하는 모습입니다.

경량화된 YOLOv5 모델을 만드는 과정은 다음과 같습니다:

  1. 넷츠프레소에서 제공하는 YOLOv5 저장소를 사용하여 YOLOv5-L 모델을 학습시킵니다.
    저장소는 여기서 확인하실 수 있습니다: [링크].

  2. 파이넷츠프레소를 사용하여 경량화된 모델을 생성합니다.

  3. 1단계에서 제공된 저장소를 이용하여 경량화된 모델을 재학습시킵니다.
    보다 자세한 지침은 다음 링크를 참고하시기 바랍니다: [링크].

저희는 VOC 데이터셋을 사용하여 예비 실험을 수행하였으며, Jetson Xavier에서 TensorRT로 변환한 후 평균 100번의 측정을 통해 지연 시간을 계산했습니다.

PyNetsPresso_ yolov5 pruning

그림 2-1. 가지치기 비율과 지연 시간을 나타내는 그래프입니다. (지연 시간은 Jetson Xavier에서 측정됨)

PyNetsPresso_ yolov5 pruning

그림 2-2. 가지치기 비율과 mAP를 나타내는 그래프입니다.

PyNetsPresso_ yolov5 pruning

그림 2-3. 지연 시간과 mAP를 나타내는 그래프입니다. (지연 시간은 Jetson Xavier에서 측정됨)

요약 표: 이 아티클에서 다룬 YOLOv5-L 실험 결과

PyNetsPresso_ yolov5 pruning

파이넷츠프레소가 경량화된 인공 신경망 구축에 어떻게 도움이 되는지를 이해하는 것이 중요합니다. 그 핵심은 의존성 인식 가지치기(Dependency Aware Pruning, 이하 DAP)라는 과정에 있습니다. 이 기법은 가지치기 과정에서 신경망의 상호 연결성을 간과하는 전통적인 가지치기 방법과 뚜렷한 차이를 보입니다. DAP는 네트워크 내의 상호 의존성을 고려하여 매개변수를 전략적으로 제거함으로써 성능을 실질적으로 가속화할 수 있습니다. 반면, 기존 가지치기 방법은 이러한 네트워크 상호 의존성을 무시하기 때문에 유사한 성능 향상을 달성하는 데 자주 실패합니다.

지연 시간 비교: 전통적 가지치기 vs. 의존성 인식 가지치기(DAP)

전통적 가지치기

인공 신경망을 가지치기하는 과정에서 흔히 사용되는 기법은 중요도가 낮은 매개변수에 0 값을 할당하는 것입니다 [1, 2]. 그러나 이 방법은 네트워크의 크기나 지연 시간을 실질적으로 줄이는 데는 효과적이지 않습니다. 매개변수를 0으로 설정하더라도 여전히 네트워크에 남아 있기 때문에, 네트워크가 진정으로 효율화되거나 경량화되지 않는다는 한계가 있습니다.

PyNetsPresso_ yolov5 pruning

그림 3. 전통적 가지치기 기법으로는 매개변수를 완전히 제거할 수 없어, 가속화를 달성하기 어렵습니다.

의존성 인식 가지치기(DAP)

전통적 가지치기와 달리 파이넷츠프레소에서 제공하는 DAP는 더 효과적인 해결책을 제시합니다. DAP를 사용하면 인공 신경망의 계층 간 의존성을 추적하고, 불필요한 매개변수를 제거할 수 있습니다. 이를 통해 지연 시간과 네트워크 크기를 줄여, 더 효율적이고 최적화된 네트워크를 만들 수 있습니다.

llm pruning

그림 4. DAP는 각 계층 간의 입력/출력 관계를 고려해 매개변수를 완전히 제거함으로써 경량화된 인공 신경망을 구현합니다.

파이넷츠프레소의 DAP 기능은 매우 유연하여 간단한 네트워크 구조에만 국한되지 않습니다. 이 기능은 스킵-연결, 병합, 분할 기능과 같은 신경망 내의 복잡한 작업도 처리할 수 있습니다. 이러한 유연성 덕분에 다양한 인공 신경망 아키텍처를 효과적으로 최적화할 수 있습니다.

llm pruning

그림 5. 스킵 연결에서 DAP 작업은 의존성을 추적하고 제거함으로써 인공 신경망의 실질적인 가속화를 가능하게 합니다.

실습 시작

실습을 시작하기 전에 다음 세 가지 전제 조건이 갖추어져야 합니다:

  1. 앞서 언급된 저장소를 사용해 YOLOv5-L모델이 학습되어야 합니다.

  2. 파이넷츠프레소에 액세스할 수 있는 활성화된 계정이 필요합니다.

  3. 파이넷츠프레소 라이브러리가 로컬 시스템에 설치되어 있어야 합니다.

저희는 VOC 데이터셋으로 YOLOv5-L 모델을 학습시켰습니다. 계정을 만들려면 py.netspresso.ai를 방문하세요.

마지막으로, 다음 단계를 따라 파이넷츠프레소 라이브러리를 설치할 수 있습니다:

준비가 완료되면 필요한 모듈을 불러와 파이넷츠프레소를 사용합니다.

넷츠프레소를 사용하여 경량화된 모델을 생성하려면 다음 두 단계를 따라하면 됩니다.

첫째, 압축 과정을 위해 컴프레서를 생성한 후, 학습된 인공 신경망을 업로드하세요. 그러면 업로드된 모델에 여러 번 액세스할 수 있는 고유한 'model.model_id'가 생성됩니다.

둘째, 인공 신경망의 각 계층에 대해 권장 가지치기 비율을 설정하여 목표 가지치기 비율과 일치하도록 해야 합니다. 권장 가지치기 비율을 설정하는 데 사용되는 방법은 LAMP [3]의 변형인 SLAMP [4]로, NetsPresso에 적합하게 수정된 방식입니다. 가지치기 과정이 완료되면 가지치기된 인공 신경망은 지정된 'output_path'에 저장됩니다.

그림 6. 결과가 'output_path'에 저장된 모습입니다.

모든 스크립트 실행이 완료된 후, 이전에 업로드한 인공 신경망의 무게를 더 줄이고 싶다면, 아래에 표시된 것처럼 'model_id'를 사용해 업로드된 모델에 액세스하고 동일한 방식으로 가지치기를 계속 진행할 수 있습니다.

저장된 인공 신경망은 최적의 성능을 회복하기 위해 재학습이 필요합니다. 노타는 이러한 요구를 충족하기 위해 공식 YOLOv5 저장소를 기반으로 한 수정된 저장소 형태의 솔루션을 개발했습니다. 이 저장소는 기존 YOLOv5와 동일하게 작동하므로 모든 작업이 원활하고 간단하게 이루어집니다. 추가 정보는 여기서 확인하실 수 있습니다: [링크].

재학습 과정에 대한 코드는 다음과 같습니다.

이렇게 하면 다양한 시나리오에서의 실험과 실제 사용을 위한 경량 인공 신경망을 얻을 수 있습니다.

저희는 파이넷츠프레소의 가지치기 기법을 사용해 YOLOv5-L의 성능을 2.63배 향상시켰으며, 성능 저하는 단 2%에 그쳤습니다. 파이넷츠프레소는 필터 분해를 통해 가지치기와 신경망 가속화를 제공합니다. 파이넷츠프레소를 활용한 인공 신경망 가속화, 실제 적용 사례, 그리고 경량 신경망 생성에 대해 더 알고 싶다면, 노타 홈페이지를 방문해 주세요!

Previous
Previous

AI 기반 포트홀 감지를 통한 도로 안전 개선: AI 비전 개발자 및 엔지니어를 위한 성능 최적화