SOGM'S Data

LLM 관련 내용 정리 본문

About Data/LLM

LLM 관련 내용 정리

왈왈가부 2024. 12. 29. 23:12

개인용 LLM 내용 정리 

개인적으로 공부하면서 플래그를 찍어볼 내용들  (주로 왜?에 대한 것들) 정리 하는 페이지입니다.


토큰화 : 텍스트에 숫자부여. 

서브위드 토큰화  : 고빈도 단어는 단어 자체로 토큰화(우리, 가족 등) 가끔 나오는 단어는 작은 단어로 토큰화 하는 방식 


임베딩 nn.Embedding 클래스 사용, 임베딩 층 자체도 학습이 된다.


트랜스포머에서  토큰 임베딩 대신 Wq, Wk 가중치를 사용하는 이유 

  • 토큰 자체가 유사성을 찾기 힘들기 때문에 이또한 학습되어함.
  • ex) 내일 점심에 팀장님이랑 밥 약속이 있어.  (내일 점심 <->팀장)의 관계를 토큰 자체 유사성으로는 알 수 없음  

어텐션 스코어를 구할때 분산이 커지면 기울기 소실문제가 있기때문에 임베딩차원의 제곱근으로 나눠준다.

# 1. Q와 K의 행렬곱
scores = Q @ K.transpose(-2, -1)  # (batch_size, seq_len, seq_len)

# 2. 스케일링
scaled_scores = scores / math.sqrt(d_k)

# 3. softmax 적용
attention_weights = F.softmax(scaled_scores, dim=-1)

# 4. V와 곱해서 최종 출력
output = attention_weights @ V

Value 가중치 행렬(W_v)의 역할 

  • Q,K: "어디를 볼까?" V: "무엇을 가져올까?"
  • 예시
    • Q: "먹었다"의 query
    • K: "사과를"과 매칭
    • V: 실제 "사과"의 의미 정보 제공

NLP에서 Batch-Normarlization 보다 Layer-Normalization이 선호되는 이유 (이미지는 반대) 

  • 문장의 길이가 다르기때문에 Batch-Normarlization은 <PAD>토큰과 평균이 구해지는 등, 정규화가 효과 미비
  • 정규화(Layer-Normalization)는 어텐션과 피드포워드 하기 전에 사용하면 효과 좋음(논문 있음)

피드 포워드 층은 주로 선형 레이어, 드롭아웃, 정규화, 활성 함수 로 이뤄져있다. 일반적으로 이를 뭉쳐서 피드 포워드 층이라 칭함.


디코더와 인코더의 차이점 

  • 인코더 : 멀티헤드 어텐션  , 디코더 : 마스크드 멀티헤드어텐션
  • 디코더 : 크로스 어텐션 있음. 인코더의 결과를 쿼리와 키로 사용.

GPU 

  • INT8 양자화:
    - BERT, GPT 모델의 8비트 양자화 일반화
    - 20-30% 성능 손실로 모델 크기 75% 감소
    - 추론 속도 2-4배 향상
  • INT4 양자화:
    - GPT-J, LLaMA 등에서 사용
    - AWQ(Activation-aware Weight Quantization) 적용
    - 40-50% 성능 손실로 모델 크기 87.5% 감소
  • 최신:
    - QLoRA: 4비트 양자화 + LoRA 미세조정
    - GPTQ: 그래디언트 기반 양자화
    - SmoothQuant: 활성화 함수 고려 양자화

GPU 메모리 계산방식

# 기본 모델 크기 계산 (파라미터 수 기준)
기본_메모리 = 파라미터_수 * 데이터타입_크기

# 데이터타입별 크기(bytes)
FP32 = 4
FP16/BF16 = 2
INT8 = 1
INT4 = 0.5

# 실제 필요 메모리 (학습시)
필요_메모리 = 기본_메모리 * (옵티마이저_계수 + 그래디언트_계수 + 활성화_계수)

# 기본메모리
## BERT-base (110M 파라미터) 
BERT_FP32 = 110M * 4 = 440MB (모델만)
BERT_FP16 = 110M * 2 = 220MB
BERT_INT8 = 110M * 1 = 110MB

## GPT-3 (175B 파라미터)
GPT3_FP32 = 175B * 4 = 700GB
GPT3_FP16 = 175B * 2 = 350GB
GPT3_INT8 = 175B * 1 = 175GB
GPT3_INT4 = 175B * 0.5 = 87.5GB

# 옵티마이저_계수:
#- Adam: 8 bytes/파라미터 (모멘텀 + 분산)
#- AdaFactor: 2-4 bytes/파라미터
#- SGD: 0 bytes/파라미터

# 그래디언트_계수: 
#- FP32: 4 bytes/파라미터
#- FP16: 2 bytes/파라미터

# 활성화_계수:
#- 배치크기와 시퀀스 길이에 비례
#- 대략 모델크기의 20-30%

단일 gpu 효율 높이기

  • 그래디언트 체크포인팅: 활성화 메모리 절약
  • 그래디언트 누적: 작은 배치로 분할
  • CPU 오프로딩: 일부 레이어를 CPU로 이동

 

 

Comments