데보션앱 소개페이지 바로가기
로그인 선택

신고하기

CLOSE
신고사유 (대표 사유 1개)
상세내용 (선택)
0/200
  • 신고한 게시글은 더 이상 보이지 않습니다.
  • 이용약관과 운영정책에 따라 신고사유에 해당하는지 검토 후 조치됩니다.
  • 허위 신고인 경우, 신고자의 서비스 이용이 제한될 수 있으니 유의하시어 신중하게 신고해 주세요.
(이 회원이 작성한 모든 댓글과 커뮤니티 게시물이 보이지 않고, 알림도 오지 않습니다.)

미리보기

커뮤니티

      1,234

      badge 23.06.15

      글 등록

      카테고리를 선택해주세요.

      DEVOTEE를 활성화 시키면
      지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.

      버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.

      임시저장함에 저장되었습니다. 저장일시 : 2022.5.17 14:29:08

      임시저장함

      제목을 선택하시면 이어서 작성이 가능하며,
      최대 20건까지 저장합니다.
      컨텐츠 유형, 제목, 저장일시, 삭제로 이뤄진 임시저장 목록
      컨텐츠 유형 제목 저장일 삭제

      데보션 블로그 게재 요청

      CLOSE
      • *
      • *

      본인인증

      효율적인 데보션 서비스 이용 및
      고객님의 소중한 개인정보보호를 위해
      본인인증을 진행해주세요. 본인인증 미 진행 시 로그인이 제한됩니다.
      본인인증 실패

      본인인증 로그인에 실패하였습니다.
      회원이 아니시거나 본인인증 등록이
      완료되지 않은 사용자입니다.

      회원정보 연결

      Activation-aware Weight Quantization

      navis.ryu 24.07.08
      7,594 8 0
      DEVOTEE 요약
      A닷 팀은 외부 API 대신 파인 튜닝된 LLM 모델을 서빙하기 위해 국내 업체인 FriendlyAI의 클라우드 서비스를 사용하고 있습니다. 모델 양자화로 부하 상황을 대비하고 있으며, FriendlyAI가 추천하는 AWQ(AWQ는 Activation-aware Weight Quantization)의 특징과 장점을 강조한 PPT 문서를 작성했습니다. [AWQ]는 2023년 5월에 소개된 알고리즘으로, 활성화 통계를 이용해 양자화 오차를 줄이며 GPTQ와 비교했을 때 적은 보정 데이터를 필요로 하는 것이 특징입니다.
      DEVOTEE 추천 블로그

      개요

      현재 A닷의 많은 서비스들이 LLM 을 이용하고 있습니다.

      저희 팀은 openAI 와 같은 외부 API 를 호출하는 형태가 아니라 파인 튜닝된 LLM 모델을 올려서 서빙하는 방식을 사용하고 있는데요,

      비용 및 (비용에서 비롯되는) 여러가지 문제로 AWS 와 같은 서비스는 쓰지 못하고 국내 업체인 FriendlyAI 의 클라우드 서비스를 사용하고 있습니다.


      벤치 마킹을 통해 예상 수준의 부하 에서는 큰 문제가 없을 것으로 보고 있지만 예측 이상의 부하 상황에 대비하기 위해 몇가지 대응 방안을 찾아보고 있는데요,

      그 중 하나가 모델 양자화 입니다. LLM 의 크기가 커짐에 따라 최근에 많은 연구가 진행 되어 매우 다양한 방법이 존재하지만,

      그 중 FriendlyAI 에서 정확도와 성능 측면에서 모두 괜찮은 것으로 추천하는 AWQ 방식을 조사한 PPT 문서가 이 글의 원래 내용이라 보시면 됩니다.

      (실제 서빙은 Nvidia H100 에서 지원하기 시작한 FP8 타입의 성능을 최대한 이용하기 위해 FriendlyAI 에서 구현한 FP8 양자화 기법을 적용한 모델을 사용하고 있습니다)


      Activation-aware Weight Quantization

      AWQ 는 Activation-aware Weight Quantization 를 의미하며, 2023 년 5월에 소개된 비교적 오래된(?) 알고리즘 입니다.

      이 논문의 비교 알고리즘으로 많이 나오는 GPTQ 나 기타 알고리즘 들이 Weight 값 만을 이용하여 양자화 하고 이의 오차를 줄이기 위해 다양한 방식을 사용한다면

      AWQ 는 가장 큰 오차가 어디에서 비롯 되는지를 조사하는 것부터 시작했다는 것이 특징적이라 할 수 있습니다.

      논문 제목에서 말하고 있듯이 저자는 가장 큰 오차가 가장 큰 activation 을 만들어 내는 weight 에서 발생하는 것으로 보고 매우 간단한 알고리즘을 적용하여 이를 줄이는 방식을 제안 합니다.


      AWQ 는 다음과 같은 장점이 있습니다.

      1. 매우 간단합니다 : 많은 엔진이 AWQ 를 지원합니다.

      2. Activation 의 통계 정보를 이용하여 양자화 오차를 줄이는 방식이므로, 이론적으로 다른 양자화 기법과 같이 사용할 수 있습니다.

      3. 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 의 성능 차이 입니다.


      댓글 0

      DEVOTEE를 활성화 시키면
      지금 작성한 댓글에 AI가 댓글을 달아줍니다.

      navis.ryu 님의 최신 블로그

      더보기

      DEVOTEE 추천 블로그

      동영상 기고하기