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

Hyungjun Lee
Research Engineer, Nota AI

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

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

 

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

 

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

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

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

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

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

 

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

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

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


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

 

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


 

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


 

전통적 가지치기

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

 

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

 

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

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

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

 

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

그림 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 비전 개발자 및 엔지니어를 위한 성능 최적화