본문 바로가기
공부/ML&DL

[머신러닝 공부] Tiny ML -21 / 최적화 문제

by 로디네로 2022. 5. 7.
반응형

 

Chapter21. 최적화 문제

 

 

"

Tiny ML + 임베디드에서 최적화 문제는 무엇인가?

"


목차 :

  1. 최적화 문제가 필요할까?
  2. 방법 1 - 하드웨어 변경
  3. 방법 2 - 모델 개선
  4. 방법 3 - 양자화
  5. 방법 4 - 제품 설계
  6. 방법 5 - 코드 최적화
  7. 방법 6 - 연산 최적화

 


 

1. 최적화 문제가 필요할까?

 

원활한 사용환경을 제공하기 위해 현업에서도 어떤 프로젝트를 하던간에 최적화는 꼭 필요하다.

 

특히 TinyML + 임베디드 기기는 컴퓨팅파워가 높지 않기 때문에 병목현상이 생길 수 있다.

 

더 성능이 좋은 모델을 돌리지 못하는 한계점이 있을 수 밖에 없는데.. 이를 어떻게 극복하는지 알아보자.

 

 


 

방법 1 - 하드웨어 변경

 

 

우선적으로 고려해볼 사항은 하드웨어 사양을 올릴 수 있는가 이다.

 

개발중일 때는 비용과 시간문제로 쉽게 바꾸기 힘든 사항이기도 하다.

 

어느정도 신경망을 사용할 것인지 파악 후 칩셋 및 기타 하드웨어 사양을 결정해 설계해야한다.

 

클라우드 환경에서는 batch size를 결정해 한번에 많은 훈련 데이터 샘플을 보내지만

임베디드 환경에서는 추론을 트리거 하기 전에 더 큰 batch를 를 수집하긴 어려울 수 있다.

 


 

방법 2 - 모델 개선

 

1. 코드를 최적화할 때는 어셈블리 수준에서 반복문을 최적화 하는것보다, 고수준 알고리즘을 변경하는게 효율적이다.

 

2. 어떤 작업의 속도를 높이기보다 가능하면 그 작업을 아예 없애는 방법을 생각해보자.

 

3. 추론을 수행하는 기능적 블랙박스의 역할에서의 모델은 알고리즘을 전환하는것 보다 모델 자체를 교체하는게 쉽다.

 

4. 개별 레이어를 제거하여 실험하면서 효과 관찰

 

모델 지연 시간 추정 :

  • 신경망 모델의 연산 규모는 입력값 수에 레이어의 출력값 수를 곱하여 파악할 수 있다. 
  • 네트워크에서는 추론을 한 번 실행할 때 필요한 FLOP(부동소수점 연산) 수를 단위로 한다.
  • 예를들어 Dense Layer에는 입출력 벡터의 크기를 곱한 여러개의 FLOP이 필요하다.
  • 이를 통해 FLOP은 네트워크 실행 시간에 대한 대략적인 지표로도 이용된다. (1억FLOP 속도 < 2억FLOP 속도)

모델 속도 개선 방법 :

  • 모델 아키텍처 설계는 아직도 연구가 활발한 분야이다. (초보가 다가가긴 어렵다.)
  • 효율성을 염두하고 설계된 모델을 찾아 변경하며 실험해볼 수 있다.
  • 각 레이어에 필요한 FLOP을 보고 특히 느린 레이어를 변경해볼 수 있다.(제거, 대안찾기)
  • 하지만 FLOP을 보는 것은 확실하지 않으므로 각 레이어의 실제 지연시간을 살펴볼 필요가 있다.

 


 

방법 3 - 양자화(Quantization)

 

일반적인 양자화의 단점은 정밀도가 떨어지고 부정확한 결과를 내놓는다는 것이다.

 

그러나 딥러닝 모델에서는 중간 레이어에서 정밀도의 손실에 대처할 수 있다.

모델은 중요하지 않은 변화에 영향을 덜 받고 중요한 패턴에 초점을 맞춘다.

 

위 내용을 좀더 직접적으로 얘기하면, 32비트 부동소수점 자료형은 추론에 있어서 필요이상으로 정확하다는 것이며,

8비트 자료형만 사용해도 구별할 수 없는 결과를 도출해낼 수 있다는 것이다.

 

모델을 부동소수점에서 8비트로 변환

  • 효율적 계산을 위해 8비트 실수값으로 선형 변환해야한다.
  • 가중치의 변환은 각 레이어 범위를 알기때문에 비율 계산이 되지만, 활성화 쪽은 각 레이어의 출력 범위가 명확하지 않아 정확도가 떨어질 위험이 있다.
  • 너무 작은범위 선택 시 출력이 잘리고 큰 범위를 선택 시 정밀도가 작아질 수 있다.

 


 

방법 4 - 제품, 시스템 설계

 

최적화를 위한 일반적인 방법은 아니지만 좋은 절차 중 하나이다.

 

예를들면 마이크로 컨트롤러가 네트워크를 통해 클라우드에 접근해 고수준의 분석을 위임하고 로컬장치에서는 간단한 감지기능 정도만 실행하도록 설계하는 것이다.

 

이외에도 호출어를 부를 때 일반 상황에서는 쓰지 않는 단어로 호출하게 하여 오인식이 나지 않게 하는 방법의 설계도 있다. 

ex) 시리야, 지니야 등등은 일상생활에서 사용하지 않는 단어이다.

 

제품과 시스템은 결국 사용자 경험이 최우선되어야 한다. 다른 어떤 부분을 희생해서 사용자의 긍정적 반응을 극대화 할 수 있다면 이런 설계가 필요하다.

 


 

방법 5 - 코드 최적화

 

코드 최적화는 기본적으로 프로그램의 각 부분이 실행되는데 걸리는 시간을 파악하는데에서 시작한다.

 

1. 블링키

단순한 방법이다 blink, 임베디드 보드의 LED blink 를 보고 대략적 시간을 추정할 수 있다.

 

2. 샷건 프로파일링

두번째 단순한 방법이다. 일부 코드를 주석처리하고 전체 실행 시간을 확인한다.

 

3. 디버그 로깅

코드 실행 시 디버깅 로그를 출력하는 방식이다. 하지만 이를 위한 통신 시에도 딜레이가 걸리는 단점이 있다.

 

4. 로직 애널라이저

LED토글과 비슷하게 GPIO핀을 켜고 끄며 그 파형을 애널라이저(비싸다)로 시각화하는 방법이다.

 

5. 타이머

정밀도를 제공할 수 있는 타이머가 있으면 코드섹션의 시작 끝을 측정하고 로그로 출력하는 방식이다.

 

6. 프로파일러

외부 프로파일링 도구를 지원하는 툴체인이나 플랫폼을 사용한다.

어떤 함수가 가장 많은 시간을 소모하는지, 어떤 행에서 시간을 많이 소모하는지 시각화가 가능하다.

 

 


 

방법 6 - 연산 최적화

 

레이어의 일부에서 병목현상이 일어날 수 있다. 이를 위해 뭘 할 수 있을까?

 

1. 이미 최적화된 구현 탐색

2. 최적화 된 구현 작성

3. 하드웨어 기능 활용

4. 가속기 및 보조 프로세서

 

 


 

 

앞서 구현한 TFLite 프로젝트들

 

 

[머신러닝 공부] Tiny ML -8 / 음성인식 어플리케이션-1

Chapter8. 음성인식(호출어 감지) 어플리케이션 만들기 " 이번 챕터에서는 TinyML을 좀더 생활에 밀접한 부분에 사용해본다. " 목차 : TinyML을 이용한 호출어감지는 왜 필요할까? 만들고자 하는 시스템

dbstndi6316.tistory.com

 

[머신러닝 공부] Tiny ML -13 / 인체감지 어플리케이션-1

Chapter13. 인체감지 어플리케이션 " 카메라로 인체를 감지해보자 (CNN) " 목차 : 개요 만들고자하는 시스템 어플리케이션 아키텍처 코드 기본흐름 -> 다음장 핵심 함수 분석 -> 다음장 마이크로컨트

dbstndi6316.tistory.com

 

[머신러닝 공부] Tiny ML -17 / 제스처인식 어플리케이션 -1

Chapter17. 제스처인식 어플리케이션 " 자이로센서를 이용해 간단한 제스처를 인식하는 어플리케이션을 만들어보자 " 목차 : 개요 만들고자 하는 시스템 기본흐름 코드 제스처 감지 -> 다음장 MCU에

dbstndi6316.tistory.com

참고 : 한빛미디어 초소형 머신러닝 TinyML 15장

 

 

반응형

댓글