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

신고하기

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

미리보기

커뮤니티

      1,234

      badge 23.06.15

      글 등록

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

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

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

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

      임시저장함

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

      데보션 블로그 게재 요청

      CLOSE
      • *
      • *

      본인인증

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

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

      회원정보 연결

      수식없이 GPT(트랜스포머) 이해하기. 2편

      Teus 25.09.08
      1,004 5 1
      DEVOTEE 요약
      본 블로그는 GPT 기반 LLM(대규모 언어 모델)의 최적화와 성능 개선 방법에 대해 설명합니다. 주요 내용은 KV Cache를 활용해 불필요한 연산을 줄이고, 모델 크기와 양자화를 통해 메모리와 학습 성능의 균형을 맞추는 방법, 그리고 DeepSeek의 Latent Vector를 기반으로 한 계산 방식으로 메모리 사용량을 줄이면서도 효율을 극대화한 사례입니다. 이를 통해 대규모 모델 운영에서 자원 활용과 성능을 동시에 고려할 수 있는 방향을 제시합니다.
      DEVOTEE 추천 블로그

      안녕하세요 Teus입니다.


      이번 포스팅은 지난번 수식없이 GPT(트랜스포머) 이해하기. 1편을 바탕으로

      • GPT기반 모델들의 최적화 기법(KV Cache)

      • 양자화, Small, Big Size Model

      • DeepSeek로 보는 LLM Model의 개선방향

      에 대해서 알아봅니다.


      1. 모델 최적화

      기존에 Self Att블록이 어떻게 계산되는지를 확인 했습니다.

      지난번 연산을 통해서

      Life Is Short, You Need 다음에 Fast 가 왔다고 보겠습니다.

      그러면 GPT는 EOS(End Of Setence)가 나오지 않았기 때문에

      Life Is Short, You Need Fast 다음 무슨 단어가 올 지를 예측하게 됩니다.

      이 경우에 다시 흐름을 따라가보면, 불필요한 연산들이 눈에 보이게 됩니다.

      image.png

      기존에 임베딩 작업은 이미 끝나서 Fast만 임베딩을 하면 됩니다.

      image.png

      QKV를 계산할 때도 마지막 ROW만 별도로 행렬곱을 취해주면 됩니다.

      (최적화된 실제 계산을 위해서 전체 Input을 넣지않고, 마지막 Input에 대해서만 계산하면 됩니다)image.png

      Attention Pattern을 만들어 낼때는 문제가 Attention Pattern의 우측, 아래측을 추가하기 위해서

      Q와 K값이 모두 필요하게 됩니다. 하지만 여기서 Masked Attention인걸을 생각해보면image.png

      기존의 K값을 저장할 경우 K를 다시 구하기위한 연산 리소스를 아낄 수가 있습니다,

      그럼 Value와의 연산도 봐 볼까요?

      image.png

      V 역시 다음 단어 Attention을 구하기 위해서 기존 값이 유지 되어야 합니다.

      그래서, Masked Self Attention의 경우 다음단어 예측간의 QKV 중

      KV를 Cache하여 불필요한 연산의 중복을 막아 계산 효율을 높이게 됩니다.

      대신, KV Cache를 위한 메모리 공간이 확보되어야 하고

      Mutihead개수 * Attention Stack의 개수 * 다음단어 예측을위해 사용된 단어의 개수(=실제 환경에선 Max token)

      3가지의 영향을 받아서 커지기 때문에 부족한 그래픽메모리를 잡아먹게 됩니다.

      때문에, 70B LLM 모델이라고 해서 70B를 올릴 수 있는 메모리만 있다고 실행할 수는 없습니다.

      (70B + 70B모델을위한 KV Cache공간 + 나머지 중간 계산을 위한 메모리)


      2. Big Model? Small Model? 양자화?

      위에서 알 수 있지만, 트랜스포머 기반의 GPT모델들은

      Self Att블록의 Input과 Ouput의 크기가 동일하기 때문에

      원하는 만큼 Self Att를 추가할 수가 있습니다.

      그래서 저 Self Att를 구성하는 가중치 개수가 3B개 라고 했을때

      Self Att를 10개 쌓으면 30B모델

      Self Att를 30개 쌓으면 90B모델

      Self Att를 100개 쌓으면 300B모델

      이 되게 됩니다.

      (물론 예전 이야기고, 요즘은 완전히 이렇게 붕어빵은 아닐겁니다)


      그러면 그냥 무조건 많이쌓으면 되는거 아녀요🤔?

      할 수 있지만

      많이쌓음

      -> 학습할 Parameter가 많아짐

      -> 계산이 많이해야됨 + RAM이 많이필요함

      -> Hynix주가떡상(?)

      -> Model을 실사용 하기 어려워짐(한번 사용하기 위해서 많은 리소스가 요구됨)


      적게쌓음

      -> 학습할 Parameter가 적어짐

      -> 계산이 적어짐 + RAM이 적게필요

      -> 데이터로부터 지식을 저장하기 가중치의 수가 부족해짐

      -> Model이 멍청해서 실사용 하기 어려워짐

      이때 중간에 타협점으로, 양자화 라는 기법이 사용됩니다.

      컴퓨터는 실수(1.0215150216132324)를 표현하기 위해서 2진수를 조합해서 표현합니다. 이때 실수를 표현하기 위해서 2진수를 4개, 8개, 16개 등등 사용할 수 있습니다.

      2진수를 많이 사용할 수록 좀더 Detail한 실수표현(1.02151502161=>거의 기존 실수에 가까움)이 가능한 대신 메모리를 많이먹고

      2진수를 적게 사용할 수록 조금 대충 실수를 표현하지만(1.021 => 기존 실수와의 차이값이 커짐) 대신 메모리를 적게 먹습니다.

      LLM의 Weight의 경우 실수로 표현된 숫자를 저장하게 되는데

      이때 32진수로 되어있는 실수 Weight를 4진수로 표현해서 가지고오는 방법이 바로 양자화 방법 입니다.


      많이쌓고 양자화시킴

      -> 학습할 Parameter는 많음

      -> 계산이 많아짐 + RAM이 적게필요(양자화의 효과)

      -> 계산량을 동일하지만, RAM은 적게 사용 하면서 적게쌓을 모델 대비 우월한 성능


      그래서 보통은

      많이 쌓은 모델 > 많이쌓고 양자화한 모델 > 적게쌓은 모델 > 적게쌓고 양자화한 모델


      순으로 성능을 보여줍니다.


      3. DeepSeek는 어떻게 최적화를 한건데?

      1. KV를 Cache할게 아니라, 하나로 합치면 어떨까? -> 어따쓰지 탄생

      2. KV를 Grouping해서 KV를 조금만 만들면 어떨까? -> 에메르송 탄생

      때문에 KV Cache로 많은 RAM을 차지하지만


      기존 구조를 그대로 가져갈 경우 효율을 위해서 성능의 하락을 피할 수가 없었다는 말 입니다.


      그래서 DeepSeek같은 경우

      1. KV를 바로 계산하지 않고, Latent Vector를 생성함

      2. Latent Vector를 가지고 KV를 계산함

      3. 선형대수를 활용해서 Q와 Latent Vector로 구해진 K를 한번에 계산때림

      4. Latent Vector를 통해서 구해진 V값을 하나만 구하고, 이걸 모든 MultiHead가 공유함

      이 방식을 통해서 KV Cache를 57배 개선하면서, 기존의 구조보다 성능이 올라갔다(라고 DeepSeek에서는 주장합니다)

      댓글 0

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

      Teus 님의 최신 블로그

      더보기

      DEVOTEE 추천 블로그

      동영상 기고하기