일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- PySpark
- 태블로
- spark df
- 코테
- pyspark오류
- Docker error
- BigQuery
- 프로그래머스 파이썬
- 데이터엔지니어링
- LLM
- airflow
- spark explode
- 빅쿼리
- dataframe
- spark #스파크
- 언어모델
- tableau
- 시각화
- 로컬 pyspark
- DataFrame Spark
- sparkdf
- SparkSQL
- Big Query
- docker
- 도커오류
- 데이터 시각화
- 빅쿼리 튜닝
- 도커
- 도커exec
- ifkakao2020
Archives
- Today
- Total
SOGM'S Data
LLM 관련 내용 정리 본문
개인용 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