Company

Resources

Company

Resources

Product

Optimium 탐구(4) — Mixed Precision Inference

Optimium 탐구(4) — Mixed Precision Inference

Optimium 탐구(4) — Mixed Precision Inference

안녕하세요 에너자이 CTO 유재윤(Jaeyoon Yoo)입니다. 그 동안 AI 추론 가속화를 위한 많은 방법들을 소개드렸습니다. 오늘은 에너자이의 최첨단 AI 추론 엔진 Optimium이 활용하고 있는 또 하나의 기법, Mixed Precision Inference를 소개드리고자 합니다.

Jaeyoon Yoo

2024년 5월 8일

안녕하세요 에너자이 CTO 유재윤(Jaeyoon Yoo)입니다. 그 동안 AI 추론 가속화를 위한 많은 방법들을 소개드렸습니다. 오늘은 에너자이의 최첨단 AI 추론 엔진 Optimium이 활용하고 있는 또 하나의 기법, Mixed Precision Inference를 소개드리고자 합니다.

Mixed Precision이란 데이터를 표현하는 비트 수를 조절하여 추론 속도와 정확도를 모두 잡기 위한 방법인데요. 데이터를 표현하는 비트란 무엇인가부터 알아보면서 차근차근 설명드리도록 하겠습니다.

우리가 알고 있던 숫자와 컴퓨터가 알고 있는 숫자는 다르다?

일상 생활 속에서 우리는 0~9의 숫자 10개로 수를 표현하는 10진법을 채택하고 있지만, 컴퓨터는 0,1의 두 가지 숫자만으로 수를 표현하는 2진법을 채택하고 있습니다. 그렇기 때문에 우리가 원하는 수를 컴퓨터가 이해할 수 있는 형태로 표현하기 위해서는 10진수를 2진수로 변환할 필요가 있습니다.

컴퓨터에서 실수를 표현하는(2진수로 변환하는) 방식에는 고정 소수점 방식과 부동 소수점 방식 두 가지가 있지만, 대부분의 시스템에서는 부동 소수점 방식을 사용하고 있는데요. 부동 소수점 방식은 아래와 같은 방식으로 수를 표현합니다.

아래는 32bit 부동 소수점의 예시입니다.

여기서 X는 가수부(fraction), Y는 지수부(exponent)라고 불리는데 각각을 위해 마련된 bit의 수는 형식에 따라 다릅니다. 단정도(Single precision)라고 부르는 형식에서는 각각 23bit, 8bit이고 배정도(Double precision)라고 부르는 형식에서는 각각 52bit, 11bit입니다. 그리고 요즘 나오는 FP16, BF16, FP8에서는 전체 비트 숫자를 16과 8에 맞추기 위해 그만큼 작아집니다.

그렇다면, 왜 이렇게 다양한 표현 방식이 존재할까요? 심지어 16bit의 경우 FP16, BF16의 두 가지 표현 방식이 존재합니다. 이유는 각각의 방식마다 명확한 장단점이 있기 때문입니다.

  1. 더 많은 비트를 사용하는 것의 장점

  • 더 넓은 영역의 숫자를 표현할 수 있습니다. 32bit는 3.4*10³⁸까지 표현 가능한 반면, 64bit는 1.7*10³⁰⁸이라는 엄청난 숫자까지 표현 가능합니다.

  • 더 많은 비트를 사용한다는 것은 그만큼 정밀한 숫자 표현이 가능하다는 뜻입니다. 아래 그림은 FP16과 FP8로 0.3952를 표현한 결과를 비교한 것인데요. 8비트를 사용할 경우 최대 0.2의 오차가 발생하는 반면 16비트를 사용할 경우 오차가 0.005 이하로 훨씬 작은 것을 확인할 수 있습니다. 뿐만 아니라, 표현 방식이 동일해도 지수부와 가수부에 할당된 비트 숫자에 따라 정밀도가 달라지는 것을 볼 수 있습니다.

2. 더 적은 비트를 사용하는 것의 장점

  • 직관적으로 데이터 크기가 줄어듭니다. 같은 숫자를 나타내는데 있어 8비트와 64비트는 8배의 차이가 발생하므로 어떤 데이터를 저장하는데 그만큼의 데이터 크기 절감 효과를 볼 수 있습니다.

  • 연산 시간도 줄어듭니다. 우리가 데이터를 보유하는 이유는 그 데이터를 이용하여 무언가를 하기 위함입니다. 대부분 곱셈, 덧셈을 수행하는데 비트 수가 줄어들면 그만큼 연산하는데 걸리는 시간도 줄어듭니다.

Machine learning에서는 어떤 숫자를 사용할까?

Pytorch, Tensorflow를 비롯한 대부분의 머신러닝 프레임워크에서는 32bit floating point를 기본 데이터타입으로 활용합니다. 이는 python이 64bit double precision을 기본 데이터타입으로 활용하는 것과 대조되는데요. (아마도 32bit로 표현해도 충분한 정확도를 얻을 수 있다는 것과 GPU의 VRAM을 아껴서 써야한다는 사실과 그리고 GPU에서 FP32 연산 속도가 FP64보다 훨씬 빠르다는 사실에서 기인한 것으로 보입니다.) 최근에는 transformer와 같은 대형 AI 모델을 구동하기 위해 FP16과 FP8을 GPU에서 지원하기 시작하면서 32비트보다 더 낮은 비트를 시도하고 있는 추세입니다.

하지만, edge에서는 여전히 대부분의 hardware에서 FP8을 지원하지 않고 있기 때문에 FP32 또는 FP16 방식을 채택하고 있습니다. 문제는 어떤 경우에도 정확도와 연산 속도 간의 trade-off가 발생한다는 것입니다. FP32의 경우 정확도는 뛰어나지만 연산 속도가 아쉽고, FP16의 경우 FP32에 비해 연산 속도는 빠르지만 정확도가 떨어지기 때문이죠.

두 가지 장점을 섞을 순 없을까?

그래서 나온 것이 바로 FP16과 FP32를 섞어서 사용하는 mixed preicsion inference입니다. 이 때 FP16과 FP32를 서로 더하거나 곱하는 등의 연산을 수행할 수는 없기 때문에 딥러닝 모델에서 특정 layer들은 FP16을 사용하고 나머지 layer들은 FP32를 사용하는 방식으로 섞어서 사용합니다. (최근 LLM에서의 mixed precision에서는 I/O bound의 병목을 해결하기 위해서 하나의 layer에서 FP8과 FP32가 혼합되어 사용되기도 합니다. 이는 추후 다른 글에서 설명드리겠습니다)

그렇다면 남은 문제는 하나입니다. “어떤 기준으로 FP16을 사용하는 layer들을 고를 것인가”이죠. 다양한 방법론들이 제시되었지만 대부분을 관통하는 원리는 아래와 같습니다.

“최종 output에 가장 영향이 적은, 즉 민감도가 적은 layer들부터 FP16 layer로 선택하자”

위에서 말씀드렸듯 FP16 방식의 단점은 FP32 대비 낮은 정확도입니다. AI 모델의 학습은 대부분 FP32 기반으로 이루어지는데, 학습된 FP32 weight들을 FP16으로 변환하는 과정에서 오차가 발생하게 되며(위에서 0.3952를 표현했을 때 0.005 정도의 오차가 발생했던 것을 기억해보세요), 이러한 오차는 AI 모델의 최종 output 값에 영향을 줍니다. 그런데 어떤 layer의 weight는 많이 바꿔도 최종 변동량(최종 output 값에 미치는 영향)이 적고 또다른 layer는 조금만 바꿔도 최종 변동량이 큽니다. 따라서 전자와 같은 layer의 경우 FP16으로 변환해도 무방하지만, 후자와 같은 layer의 경우 FP32 방식을 그대로 유지하는 것이 좋겠죠.

조금 더 구체적으로 설명드리면, output에 대한 weight의 영향이란 해당 layer의 weight 값이 변했을 때 output이 얼마나 많이 변하는지를 뜻합니다.

위 식에서 L이 output이고 w_i가 i 번째 layer의 weight 값인데요. 이 때 이 weight가 δw_i 만큼 변하면 output은 2차 근사를 취하고 해당 weight가 최적점의 weight라는 가정 하에 약 (1/2)*(δw_i)*(H_{w_i})*(δw_i) 만큼 변하게 됩니다. 여기서 H_{w_i}는 2차 미분을 뜻하는 Hessian이며, output에 대한 weight의 영향을 나타내는 “민감도”는 이 Hessian의 크기에 비례한다고 볼 수 있습니다. 엄밀하게 말하면 weight는 다차원이기 때문에 Hessian은 matrix 형태이고, 민감도를 측정할 때는 Hessian matrix의 determinant를 이용합니다.

요약하면, mixed precision inference에서는 Hessian을 이용하여 layer들의 민감도를 측정하고, 이 민감도가 제일 작은 layer부터 FP16으로 치환합니다. 많은 layer를 FP16으로 치환할수록 AI 모델의 정확도는 줄어들기 때문에 개발자가 미리 설정한 정확도 변화 감내량 (tolerance) 내에서 최대한 많은 layer를 FP16으로 치환합니다.

기저에 있는 원리는 위와 같고 practical한 알고리즘은 다양합니다. 엄밀하게 Hessian을 구하는 것이 비싼 연산이기 때문에 Hessian vector product를 이용하거나 1차 근사만을 이용한 민감도 우회 측정 등 민감도를 근사하는 다양한 방법들이 있습니다. 그리고 layer의 개수가 수백개가 되는 경우 정확도 변화를 최소로 하는 layer 조합을 찾는 것이 non polynomial하기 때문에 binary search, greedy search 등 search 알고리즘도 다양합니다. 에너자이에서는 지속적인 연구 및 실험을 통해 mixed precision inference를 가장 효과적이면서 practical하게 적용하기 위한 방법을 모색하고 있습니다.

Mixed Precision의 효과는 상당했다

에너자이 팀은 실제로 mixed precision을 통해 AI 모델의 정확도 손실을 최소화하면서 추론 속도를 가속화한 바 있는데요. 해당 모델은 70개 정도의 layer를 보유한 pose landmark estimation 모델로, 아래 그림은 layer별 sensitivity를 나타낸 것입니다.

x축은 몇 번째 layer인 지를 뜻하며 0에 가까울수록 Input에 가까운 layer이고 오른쪽일수록 Output에 가까운 layer입니다. y축이 sensitivity인데 단위는 없기 때문에 숫자 크기보다 그 상대적인 크기를 보시면 됩니다. 해당 모델의 경우 Input에 가까울수록 민감도가 큰 경향성을 보이기 때문에 뒷부분의 layer들을 FP16으로 치환하는 것이 효과적임을 알 수 있습니다. Landmark detection 모델이기 때문에 앞부분에 많은 연산들이 집중되어 있기 때문이라고 추측됩니다.

저희가 설정한 정확도 변화 감내량(Tolerance)이 매우 타이트했기 때문에 약 40%의 layer만 FP16으로 치환되었으며, 그 결과는 아래와 같습니다.

위 그림에서 초록색선이 FP32 원본 모델을 구동했을 때 인식한 landmark이며 파란색 선이 precision 변경 후 모델이 인식한 landmark입니다. 왼쪽이 Mixed Precision을 활용한 결과이고 오른쪽이 모든 layer를 FP16으로 변환했을 때의 결과입니다. 그림에서 보시다시피 단순히 모든 layer를 FP16으로 변환할 경우 정확도가 현저히 떨어지는 반면에 Mixed Precision을 사용하면 정확도가 거의 그대로 유지되는 것을 확인할 수 있습니다.

아래의 표는 두 모델의 정확도를 정량적으로 측정한 결과로, 두 개의 정확도 지표 NME(낮을수록 정확), PCK(높을수록 정확)를 측정하였습니다. (FP32 모델의 결과를 정답으로 설정하여 측정한 결과입니다)

연산 속도 측면에서도 뚜렷한 개선 효과를 보였습니다.

Mixed Precision을 통해 연산 속도가 원본 FP32 모델 대비 약 12% 가속화된 것을 확인할 수 있는데요. 물론, Fully FP16 모델보다는 연산 속도가 느릴 수 밖에 없지만, 해당 모델의 경우 정확도 손실이 허용 가능한 수준을 넘어서기 때문에 비교가 큰 의미가 없습니다.

Optimium은 이러한 Mixed Precision뿐만 아니라 fusion, auto-tuning 등 다양한 최적화 기법을 적용하여 최종적으로 연산 속도를 약 1.5배 이상 가속화할 수 있습니다!

Run Optimium, run!🏃

에너자이 추론 최적화 기술의 정수인 Optimium은 현재 베타 테스트 진행 중이며, 다양한 하드웨어 환경에 대하여 기존 추론 최적화 엔진들 대비 우수한 성능을 보여 다양한 업체들의 관심을 받고 있습니다. 치열한 연구 개발이 현재 진행형으로 이루어지고 있지만, 이미 시중에서 널리 사용되고 있는 TensorFlow Lite XNNPACK 대비 우월한 추론 속도를 보일 정도로 뛰어난 성능을 보유하고 있는데요.

앞으로도 Optimium에 적용된 흥미로운 기술들에 대한 게시물들을 지속적으로 업로드할 예정이니 많은 관심 부탁 드리며, 현재 진행 중인 Optimium Beta Test 참여에 관심 있으신 분들은 아래 링크를 통해 신청 부탁 드립니다! 👉

https://wft8y29gq1z.typeform.com/to/Sv9In4SI

Optimium

Optimium

Solutions

Resources

ENERZAi

Copyright ⓒ ENERZAi Inc. All Rights Reserved

사업자등록번호: 246-86-01405

이메일: contact@enerzai.com

연락처: +82 (2) 883 1231

주소: 대한민국 서울특별시 강남구 테헤란로27길 27

Optimium

Optimium

Solutions

Resources

ENERZAi

Copyright ⓒ ENERZAi Inc. All Rights Reserved

사업자등록번호: 246-86-01405

이메일: contact@enerzai.com

연락처: +82 (2) 883 1231

주소: 대한민국 서울특별시 강남구 테헤란로27길 27

Optimium

Optimium

Solutions

Resources

ENERZAi

Copyright ⓒ ENERZAi Inc. All Rights Reserved

사업자등록번호: 246-86-01405

이메일: contact@enerzai.com

연락처: +82 (2) 883 1231

주소: 대한민국 서울특별시 강남구 테헤란로27길 27