23.06.15
DEVOTEE를 활성화 시키면
지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.
버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.
| 컨텐츠 유형 | 제목 | 저장일 | 삭제 |
|---|
본인인증 로그인에 실패하였습니다.
회원이 아니시거나 본인인증 등록이
완료되지 않은 사용자입니다.
현재 A닷의 많은 서비스들이 LLM 을 이용하고 있습니다.
저희 팀은 openAI 와 같은 외부 API 를 호출하는 형태가 아니라 파인 튜닝된 LLM 모델을 올려서 서빙하는 방식을 사용하고 있는데요,
비용 및 (비용에서 비롯되는) 여러가지 문제로 AWS 와 같은 서비스는 쓰지 못하고 국내 업체인 FriendlyAI 의 클라우드 서비스를 사용하고 있습니다.
벤치 마킹을 통해 예상 수준의 부하 에서는 큰 문제가 없을 것으로 보고 있지만 예측 이상의 부하 상황에 대비하기 위해 몇가지 대응 방안을 찾아보고 있는데요,
그 중 하나가 모델 양자화 입니다. LLM 의 크기가 커짐에 따라 최근에 많은 연구가 진행 되어 매우 다양한 방법이 존재하지만,
그 중 FriendlyAI 에서 정확도와 성능 측면에서 모두 괜찮은 것으로 추천하는 AWQ 방식을 조사한 PPT 문서가 이 글의 원래 내용이라 보시면 됩니다.
(실제 서빙은 Nvidia H100 에서 지원하기 시작한 FP8 타입의 성능을 최대한 이용하기 위해 FriendlyAI 에서 구현한 FP8 양자화 기법을 적용한 모델을 사용하고 있습니다)
AWQ 는 Activation-aware Weight Quantization 를 의미하며, 2023 년 5월에 소개된 비교적 오래된(?) 알고리즘 입니다.
이 논문의 비교 알고리즘으로 많이 나오는 GPTQ 나 기타 알고리즘 들이 Weight 값 만을 이용하여 양자화 하고 이의 오차를 줄이기 위해 다양한 방식을 사용한다면
AWQ 는 가장 큰 오차가 어디에서 비롯 되는지를 조사하는 것부터 시작했다는 것이 특징적이라 할 수 있습니다.
논문 제목에서 말하고 있듯이 저자는 가장 큰 오차가 가장 큰 activation 을 만들어 내는 weight 에서 발생하는 것으로 보고 매우 간단한 알고리즘을 적용하여 이를 줄이는 방식을 제안 합니다.
AWQ 는 다음과 같은 장점이 있습니다.
매우 간단합니다 : 많은 엔진이 AWQ 를 지원합니다.
Activation 의 통계 정보를 이용하여 양자화 오차를 줄이는 방식이므로, 이론적으로 다른 양자화 기법과 같이 사용할 수 있습니다.
Activation 값 만을 사용합니다. Gradient 계산이 불필요합니다.
Calibration 데이터가 필요하지만, GPTQ 같은 방식과 달리 데이터에 over-fit 되지 않고 Calibration 데이터의 특성이 성능에 영향을 거의 미치지 않습니다.
GPTQ 대비 매우 적은 Calibration 데이터를 필요로 합니다 (1/10 이하)
가장 많이 사용되는 BitsAndBytes 와는 달리 on-the-fly 로 양자화 하는 것은 불가능 하지만,
Calibration 데이터를 준비하고 양자화를 적용 하는 절차가 GPTQ 대비 간단하고 빠르기 때문에 은근히 많이 쓰이는 것 같습니다.
논문에서 AWQ + GPTQ 를 적용하여 성능 테스트한 결과도 소개하고 있고, AWQ + GGUF 의 사례도 있는 것 같지만 다른 양자화 방식과 혼용하는 예는 그리 많지 않은 것 같습니다.
AWQ + LoRA 를 지원하는 라이브러리는 있지만 생성된 LoRA adapter 를 AWQ 모델에 merge 할 수 있는지는 확인이 잘 안됩니다.
또한 non-linear scale 의 양자화 방식은 적용할 수 없습니다.
다음은 AWQ 논문의 내용에 대한 간단한 설명입니다.
FP16 인 weight 값을 int3 으로 RTN (Round to Nearest) 방식으로 양자화 할 경우 성능이 많이 떨어지게 됩니다.
하지만 1% 의 특정 weight channel (논문에서는 salient weight 라고 합니다) 의 값을 FP16 으로 유지하면 다시 원래의 성능으로 돌아오는 것을 볼 수 있습니다.
그렇다면 이 salient weight 를 어떻게 결정하는지가 가장 중요한 문제라 할 수 있습니다.
가장 간단한 방식은 가장 큰 절대값 평균을 갖는 weight channel 들로 결정하는 것인데, 이들을 FP16으로 유지 해도 성능 개선은 거의 이루어 지지 않는 것을 알 수 있습니다.
이는 random 하게 weight channel 을 정했을 때와 크게 다르지 않은 성능이며 weight 값만 보고는 결정할 수는 없다는 말의 반증이기도 합니다.
앞서 말씀드린 대로 가장 큰 activation 을 만드는 weight channel 이 salient channel 이라고 저자는 말하고 있습니다.
이 salient channel 을 어떻게 보전할 것인가? 위의 설명처럼 단순하게 FP16 + INT3 의 mixed precision 으로 구현해도 되겠지만,
논문 저자는 연산이나 구현 효율이 떨어지므로 이렇게 하고 싶지 않다고 합니다.
그 대신 per-channel scaling 이라는 기법으로 그와 비슷한 성능을 내는게 가능하다고 합니다.
이는 salient channel 을 scaling factor 로 곱한 다음에 양자화 하고, 실제 activation 계산 시에는 마지막에 다시 scaling factor 로 나누어 주는 기법입니다.
이게 정말 되나 싶은데, 아래와 같은 수식으로 설명이 가능합니다.
왼쪽은 scaling factor 를 적용하지 않은 양자화 함수(RTN) 이고, 오른쪽은 scaling factor 를 적용한 양자화 함수 입니다.
델타는 양자화 factor 인데 weight channel 의 최대값으로 결정됩니다. 두개의 양자화 함수의 오차는 다음과 같이 나타낼 수 있습니다.
여기에서 RoundError 로 표시된 부분은 양자화에 따른 오차값인데, 그 안의 변수들의 값이 어쨌든 [0, 0.5] 범위에서 발생합니다.
이런 측면에서 두개의 RoundError 의 평균값은 0.25 로 대략 동일하다고 할 수 있습니다.
아래의 식을 위의 식으로 나누면 원래 양자 함수 오차 대비 scaling factor 를 적용한 양자 함수의 오차 비율이 나오는데, 다음과 같습니다.
앞쪽은 양자화 factor 의 비율인데, 맨 처음 salient channel 을 결정하는 예에서 보듯 최대값을 갖는 weight channel 과 실제 salient channel 은 일반적으로 다르고,
s 가 너무 크지 않으면 scale 된 salient channel 이 기존 최대값 channel 을 넘지 않으므로 이 양자화 factor 의 변화는 무시할 수 있습니다.
즉 적당한 s 값의 범위에서 양자화 오류는 scaling factor 에 의해 작아진다는(1/s) 것을 알 수 있습니다.
그러나 s 값이 커짐에 따라 양자화 factor 의 변경 확률이 올라가면, non-salient channel 의 오류값이 커지기 시작하여 성능이 떨어지기 시작 하므로 일반적인 최적의 s 값은 대략 2 전후라고 합니다.
최적의 s 값은 다음과 같은 에러 함수를 최적화 하여 얻을 수 있는데, Q 함수 자체가 연속 함수가 아니므로
일반적인 back propagation 으로는 구할 수 없고 몇가지 근사 공식으로 구해 봤지만 좋은 결과가 나오지 않았다고 합니다.
하지만 우리는 이미 s 와 activation 의 크기가 서로 상관 관계가 있음을 알고 있으므로,
다음과 같이 search space 를 단순화 하여 (Sx : 채널당 평균 activation 크기) fast grid search 방법으로 alpha 값을 찾는 방식을 사용합니다.
추가적으로 MSE 를 최소화 하기 위해 weight clipping 기법도 같이 사용하여 FP16 mixed precision 방식에 거의 근접하는 결과를 얻을 수 있었다고 합니다.
논문에서 제시하는 AWQ 와 GPTQ 의 성능 차이 입니다.
DEVOTEE를 활성화 시키면
지금 작성한 댓글에 AI가 댓글을 달아줍니다.