티스토리 뷰

반응형

다양한 AI 모델이 시시각각 나오는 시대에서 경량화에 대한 이슈도 그만큼 높아져 가고 있는데요. 모델이 작으면서 정확도가 좋다면 그만큼 리소스를 절약할 수 있기 때문에 다양한 산업군에서 점점 니즈가 생겨나고 있습니다. 클라우드 서비스를 하는 곳에서도 AI 모델을 사용한다면 클라우드 자체에 모델의 사이즈가 작다면 클라우드 비용을 그만큼 절약할 수 있는 가능성이 높기에 리소의 제약이 심한 엣지 디바이스 뿐 아니라 클라우드 환경에서도 가능하다면 적용하는 사례가 늘고 있습니다.

경량화를 연구하는 스타트업은 아래와 같습니다.

1. 노타(https://www.nota.ai/)

2. 에너자이(https://enerzai.com/)

3. 스퀴즈비츠 (https://squeezebits.com/)

4. 날비(https://www.nalbi.ai/)

물론 위 스타트업 말고도 크고 작게 경량화 연구를 하는 곳은 더 있지만 메인으로 하면서 성과를 내는 곳은 위에 있는 스타트업 정도로 보이는데요

오늘은 모델 경량화의 방법 중 '양자화' 라는 것을 설명해보도록 하겠습니다.

 

양자화 란, 단순하게 만드는 것

 

인공지능 분야에서 연산량을 줄이면서 전력 효율성을 향상시키는 방법 중 하나가 양자화(quantization) 기술입니다. 양자화는, 정확하고 세밀한 단위로 표현한 입력값을 보다 단순화한 단위의 값으로 변환하는 다양한 기술을 포괄적으로 의미하는 용어입니다. 예를 들어볼까요? 누군가 여러분에게 현재 시간을 물었다고 가정해 보죠. 여러분은 시계를 확인하고 ‘10 21이라고 대답할 겁니다. 하지만 이 시간이 100% 정확하다고 말할 수는 없습니다. 시간, , 초라는 단위는 연속적인 시간이라는 값을 양자화하여 근사적으로 표현하기 위해 사용하는 일종의 규칙이기 때문입니다. , 시간이라는 값을 단순화하여, 띄엄띄엄 불연속적인 시, , 초의 값으로 표현한 것입니다.

다만, 이것을 어떻게 Realization 할 수 있을까요? 우리에겐 그래서 AI Framework 들이 있지요? 텐서플로우 그 안에 TFLite 라는 녀석이 이 기능을 수행 할 수 있습니다.

학습 후 양자화

텐서플로우 라이트에서 지원하는 양자화는 4 단계가 있으면 아래와 같습니다.

  • float32 양자화
  • float16 양자화
  • int8 양자화
  • dynamic Range 양자화

 

위 3가지는 변수 타입이니까 int8이 제일 작을 것이라는 생각이 들고 마지막은 먼지는 잘 모르지만 제일 밑에 있으니 가장 작게 줄여 줄 수 있는 방법으로 생각되겠죠? 실제로는 아래와 같습니다.

양자화에는 Trade-Off가 있으며 (Accuracy ←→ computing power 등), int8 같이 input data에 특정 조건이 만족되어야만 invoke가 가능한 양자화도 있습니다. 양자화 종류를 선택하는 기준에 대해서 tensorflow 팀은 아래와 같은 플로우차트를 제공하고 있습니다.

그럼 이제 양자화의 방법 중 자신의 모델에 적합한 방법을 선택하는 방법에 대해서 알아보도록 하겠습니다. 기본 적으로 위에 있는 그래프 대로 진행하면 되는데 좀더 쉽게 설명하면 아래와 같습니다.

  • 모델을 최적화하는가? → N → float tflite model로 변환
  • 모델을 최적화하는가? → Y → float16으로 제한하는가? → Y → 파라메터는 float16으로 양자화하고, 모델은 float32 operation으로 실행
  • 모델을 최적화하는가? → Y → float16으로 제한하는가? → N → RepresentativeDataset이 있는가? (아래 설명) → N → 파라메터는 int8로 양자화하고, 모델은 int8과 float32를 섞어서 구동
    • RepresentativeDataset == tf.lite.RepresentativeDataset(intput_gen)
     

  • 모델을 최적화하는가? → Y → float16으로 제한하는가? → N → RepresentativeDataset이 있는가? → Y → int8 operation으로 제한하는가? → Y → 파라메터와 activation 모두 int8로 양자화. 모델 또한 int8로만 구동. 이를 지원하지 않는 모델이라면 컨버팅 자체가 실패
  • 모델을 최적화하는가? → Y → float16으로 제한하는가? → N → RepresentativeDataset이 있는가? → Y → int8 operation으로 제한하는가? → N → 파라메터와 activation 모두 int8로 양자화. 모델은 가능한 한 int8로 구동되나 실패시 float32 구동으로 회귀

이렇게 텐서플로루 라이트에서는 양자화 할 수 있는 방법을 제공하고 있는데요, 저 역시 이를 이용해서 실제 양자화를 하고 테스를 해보면서 양자화별 어떤 방법이 가장 적합했는데 모델별롸 확인하는 과정들을 지속해서 공유하도록 하겠습니다.

반응형
댓글