23.06.15
DEVOTEE를 활성화 시키면
지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.
버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.
| 컨텐츠 유형 | 제목 | 저장일 | 삭제 |
|---|
본인인증 로그인에 실패하였습니다.
회원이 아니시거나 본인인증 등록이
완료되지 않은 사용자입니다.
안녕하세요 Teus입니다.
이번 포스팅은 지난번 수식없이 GPT(트랜스포머) 이해하기. 1편을 바탕으로
GPT기반 모델들의 최적화 기법(KV Cache)
양자화, Small, Big Size Model
DeepSeek로 보는 LLM Model의 개선방향
에 대해서 알아봅니다.
기존에 Self Att블록이 어떻게 계산되는지를 확인 했습니다.
지난번 연산을 통해서
Life Is Short, You Need 다음에 Fast 가 왔다고 보겠습니다.
그러면 GPT는 EOS(End Of Setence)가 나오지 않았기 때문에
Life Is Short, You Need Fast 다음 무슨 단어가 올 지를 예측하게 됩니다.
이 경우에 다시 흐름을 따라가보면, 불필요한 연산들이 눈에 보이게 됩니다.
기존에 임베딩 작업은 이미 끝나서 Fast만 임베딩을 하면 됩니다.
QKV를 계산할 때도 마지막 ROW만 별도로 행렬곱을 취해주면 됩니다.
(최적화된 실제 계산을 위해서 전체 Input을 넣지않고, 마지막 Input에 대해서만 계산하면 됩니다)
Attention Pattern을 만들어 낼때는 문제가 Attention Pattern의 우측, 아래측을 추가하기 위해서
Q와 K값이 모두 필요하게 됩니다. 하지만 여기서 Masked Attention인걸을 생각해보면
기존의 K값을 저장할 경우 K를 다시 구하기위한 연산 리소스를 아낄 수가 있습니다,
그럼 Value와의 연산도 봐 볼까요?
V 역시 다음 단어 Attention을 구하기 위해서 기존 값이 유지 되어야 합니다.
그래서, Masked Self Attention의 경우 다음단어 예측간의 QKV 중
KV를 Cache하여 불필요한 연산의 중복을 막아 계산 효율을 높이게 됩니다.
대신, KV Cache를 위한 메모리 공간이 확보되어야 하고
Mutihead개수 * Attention Stack의 개수 * 다음단어 예측을위해 사용된 단어의 개수(=실제 환경에선 Max token)
3가지의 영향을 받아서 커지기 때문에 부족한 그래픽메모리를 잡아먹게 됩니다.
때문에, 70B LLM 모델이라고 해서 70B를 올릴 수 있는 메모리만 있다고 실행할 수는 없습니다.
(70B + 70B모델을위한 KV Cache공간 + 나머지 중간 계산을 위한 메모리)
위에서 알 수 있지만, 트랜스포머 기반의 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은 적게 사용 하면서 적게쌓을 모델 대비 우월한 성능
그래서 보통은
많이 쌓은 모델 > 많이쌓고 양자화한 모델 > 적게쌓은 모델 > 적게쌓고 양자화한 모델
순으로 성능을 보여줍니다.
KV를 Cache할게 아니라, 하나로 합치면 어떨까? -> 어따쓰지 탄생
KV를 Grouping해서 KV를 조금만 만들면 어떨까? -> 에메르송 탄생
때문에 KV Cache로 많은 RAM을 차지하지만
기존 구조를 그대로 가져갈 경우 효율을 위해서 성능의 하락을 피할 수가 없었다는 말 입니다.
그래서 DeepSeek같은 경우
KV를 바로 계산하지 않고, Latent Vector를 생성함
Latent Vector를 가지고 KV를 계산함
선형대수를 활용해서 Q와 Latent Vector로 구해진 K를 한번에 계산때림
Latent Vector를 통해서 구해진 V값을 하나만 구하고, 이걸 모든 MultiHead가 공유함
이 방식을 통해서 KV Cache를 57배 개선하면서, 기존의 구조보다 성능이 올라갔다(라고 DeepSeek에서는 주장합니다)
DEVOTEE를 활성화 시키면
지금 작성한 댓글에 AI가 댓글을 달아줍니다.