- 하나의 텐서와 행렬 곱셈을 통해 Llama3를 처음부터 구현함.
- Meta에서 제공한 Llama3 모델 파일에서 텐서를 직접 로드
LLaMA-3 모델의 스크래치 구현 요약
토크나이저 설정
- Tiktoken 라이브러리를 사용하여 토크나이저 설정
- 특수 토큰들을 정의하고 토크나이저에 추가
모델 파일 읽기
- PyTorch를 사용하여 모델 파일(
consolidated.00.pth
)을 로드
- 모델의 구성을
params.json
파일에서 읽어옴
- 차원 수(
dim
), 레이어 수(n_layers
), 헤드 수(n_heads
) 등의 정보 포함
텍스트를 토큰으로 변환
- 프롬프트 텍스트를 토크나이저를 사용하여 토큰 시퀀스로 변환
- 각 토큰을 해당하는 임베딩으로 변환
- RMS 정규화를 사용하여 임베딩 정규화
어텐션 구현
- 쿼리(
wq
), 키(wk
), 값(wv
), 출력(wo
) 행렬을 모델에서 로드
- 각 토큰에 대해 쿼리, 키, 값 벡터 계산
- RoPE(Rotary Positional Embedding)를 사용하여 위치 정보 추가
- 쿼리와 키의 내적을 계산하여 어텐션 점수 계산
- 미래 토큰에 대한 어텐션 점수를 마스킹
- Softmax 함수를 적용하여 어텐션 분포 계산
- 어텐션 분포와 값 벡터를 곱하여 어텐션 결과 계산
멀티 헤드 어텐션
- 모든 어텐션 헤드에 대해 어텐션 계산을 수행
- 각 헤드의 결과를 연결(concatenate)하여 최종 어텐션 결과 생성
피드 포워드 네트워크
- SwiGLU(Swish Gated Linear Unit) 활성화 함수를 사용한 피드 포워드 네트워크 구현
- 어텐션 결과와 피드 포워드 네트워크의 출력을 더하여 최종 임베딩 생성
전체 레이어 반복
- 모든 트랜스포머 레이어에 대해 어텐션과 피드 포워드 네트워크 계산을 반복
- 최종 임베딩을 RMS 정규화
토큰 예측
- 최종 임베딩을 출력 행렬과 곱하여 로짓(logits) 계산
- 로짓에서 가장 높은 값을 가진 토큰을 다음 토큰으로 예측
- 예측된 토큰을 디코딩하여 출력
GN⁺의 의견
-
이 기사는 Llama3 모델의 내부 구조와 동작 방식을 이해하는 데 매우 유용함. 특히, 처음부터 구현하는 과정을 통해 모델의 각 구성 요소가 어떻게 상호작용하는지 명확히 알 수 있음.
-
초급 소프트웨어 엔지니어에게는 다소 복잡할 수 있음. 그러나, 단계별로 설명이 잘 되어 있어 천천히 따라가면 이해할 수 있음.
-
RoPE(회전 위치 임베딩)와 같은 고급 개념을 도입하여 모델의 성능을 향상시키는 방법을 배울 수 있음. 이는 다른 NLP 모델을 구현하거나 개선할 때 유용할 수 있음.
-
이 기사를 통해 딥러닝 모델의 내부 구조와 동작 방식을 깊이 이해할 수 있음. 이는 모델을 최적화하거나 디버깅할 때 큰 도움이 될 것임.