4장 - LLM 훈련

🏷️ "cme295" "transformer" "llm" "book"

4장. LLM 훈련

오늘 드디어 LLM이 어떻게 훈련되는지를 다룬다. 1강에서 셀프 어텐션과 트랜스포머를, 2강에서 다양한 기법과 변형을, 3강에서 LLM 자체를 소개했다면, 이번 강의에서는 이 거대한 모델을 실제로 학습시키는 전체 과정을 살펴본다. — Afshine Amidi


4.1 전이 학습과 사전 훈련

전이 학습 (Transfer Learning)

전통적인 머신러닝에서는 과제마다 별도의 모델을 처음부터 훈련했다. 스팸 탐지를 위한 모델, 감성 분석을 위한 모델, 요약을 위한 모델을 각각 독립적으로 학습시켰다. 그런데 이 과제들은 완전히 분리된 것이 아니다. 모두 텍스트 이해라는 공통 기반을 공유한다.

**전이 학습(transfer learning)**은 이 관찰에서 출발한다. 매번 처음부터 시작하는 대신, 사전 훈련된 모델에서 출발하여 특정 과제에 맞게 조정(tuning)하는 방식이다. 이것이 현대 LLM 훈련의 기본 패러다임이다.

LLM 훈련은 크게 두 단계로 나뉜다.

  1. 사전 훈련(pre-training): 방대한 데이터로 언어와 코드의 구조를 학습한다.
  2. 튜닝(tuning): 사전 훈련된 모델의 가중치를 특정 과제에 맞게 조정한다.

예를 들어, 하나의 거대한 모델을 사전 훈련한 뒤, 스팸 탐지용으로 튜닝하고, 감성 분석용으로 튜닝하고, 명령어 수행용으로 튜닝하는 식이다. 각 과제에 대해 처음부터 새로운 모델을 훈련하지 않아도 된다.

사전 훈련의 목적

사전 훈련은 LLM 훈련 과정에서 가장 비용이 큰 단계다. 연산량, 데이터량, 시간, 비용 모든 면에서 그렇다. 사전 훈련의 목적은 단순하다. 거대한 데이터를 모델에 주입하여 다음 토큰을 예측하도록 학습시키는 것이다.

여기서 "데이터"란 인터넷에서 찾을 수 있는 거의 모든 것을 의미한다. 영어 텍스트, 다른 언어의 텍스트, 다양한 프로그래밍 언어의 코드, 사실상 인터넷 전체를 포괄한다.

사전 훈련 데이터 소스

데이터 소스

설명

Common Crawl

인터넷 전체를 크롤링한 데이터셋. 월 약 30억 페이지 수집

Wikipedia

백과사전 기사

Reddit

소셜 미디어 대화

GitHub

소스 코드 저장소

Stack Overflow

프로그래밍 관련 Q&A

데이터 규모는 토큰 수로 측정된다. 기억해야 할 규모감은 수천억에서 수조, 심지어 수십조 토큰이다.

모델

훈련 토큰 수

GPT-3

3,000억 (300B)

Llama 3

15조 (15T)

GPT-3의 3,000억 토큰은 당시에는 많아 보였지만, 뒤에서 다룰 Chinchilla 법칙에 비추어 보면 모델 크기 대비 심각하게 부족한 양이었다.

지식 차단일 (Knowledge Cutoff Date)

사전 훈련의 근본적 한계 중 하나는 데이터의 시간적 경계다. 사전 훈련에 사용된 데이터는 특정 시점까지의 정보만 포함하며, 이 시점을 **지식 차단일(knowledge cutoff date)**이라 한다.

기본 사전 훈련 모델은 지식 차단일 이후에 발생한 사건이나 정보를 알 수 없다. 모델 카드(model card)에는 항상 이 날짜가 명시된다. 예를 들어 GPT-5의 지식 차단일은 2025년 9월 30일이다.

지식을 사후에 주입하거나 편집하려는 시도는 많았지만, 가중치를 변경할 때 다른 영역의 성능을 퇴보시키지 않는 깨끗한 방법을 찾기는 매우 어렵다. 또한 훈련 데이터의 내용을 그대로 반복하는 표절(plagiarism) 위험도 존재한다.

사전 훈련의 비용은 최소 수백만 달러, 때로는 수천만 달러에서 수억 달러에 이른다. 시간도 매우 오래 걸리며, 환경 비용(ecological cost)도 무시할 수 없어 많은 논문이 이를 함께 보고한다.


4.2 FLOPs와 FLOPS

LLM의 연산량을 논의할 때 반드시 구분해야 하는 두 가지 표기법이 있다. 철자는 비슷하지만 의미가 완전히 다르다.

FLOPs (Floating Point Operations)

FLOPs는 부동소수점 연산의 횟수다. 연산량(compute)의 단위다. 값이 클수록 더 많은 연산이 수반된다. 부동소수점 수(floating-point number)란 소수점이 있는 수, 즉 일반적인 실수를 컴퓨터에서 표현한 것이다.

LLM 훈련의 FLOPs 규모:

\[\text{훈련 FLOPs} \sim 10^{25}\]

FLOPs를 산출하는 공식은 아키텍처에 따라 복잡하지만, 직관적으로는 다음과 같이 이해할 수 있다.

\[\text{FLOPs} \approx O(N \times D)\]

여기서 \(N\)은 모델의 파라미터 수, \(D\)는 훈련 토큰 수다. MoE 기반 LLM은 일부만 활성화되므로 밀집 모델 대비 적은 연산을 필요로 한다.

FLOPS (Floating Point Operations Per Second)

FLOPS는 초당 부동소수점 연산 횟수다. 하드웨어의 연산 속도를 나타낸다. GPU 사양표에 항상 표기되는 지표다. 보통 대문자로 표기하지만, 일부 논문에서 FLOPs와 FLOPS를 혼용하는 경우가 있어 문맥으로 판단해야 한다.

표기

의미

성격

FLOPs

Floating Point Operations

연산의 총량 (단위)

FLOPS

Floating Point Operations Per Second

연산 속도 (하드웨어 성능)


4.3 스케일링 법칙과 Chinchilla 법칙

스케일링 법칙 (Scaling Laws)

사전 훈련에 방대한 연산과 데이터가 필요하다는 사실을 알고 나면, 자연스러운 질문이 떠오른다. 모델 크기와 훈련 데이터 크기에 따라 성능이 어떻게 변하는가?

2020년에 발표된 "Scaling Laws for Neural Language Models" 논문은 이 관계를 체계적으로 실험했다. 주요 발견은 다음과 같다.

  1. 연산량이 많을수록 다음 토큰 예측 성능이 향상된다.
  2. 데이터셋이 클수록 성능이 향상된다.
  3. 모델이 클수록 성능이 향상된다.

이 발견으로 인해 2019년부터 2024년 사이에 모델을 점점 더 크게 만드는 추세가 이어졌다. 또한 큰 모델이 **표본 효율(sample efficiency)**이 더 높다는 사실도 관찰되었다. 동일한 토큰 수를 처리했을 때, 큰 모델이 작은 모델보다 더 나은 성능을 보인다.

Chinchilla 법칙

그러나 연산 자원은 무한하지 않다. 고정된 연산 예산 하에서 모델 크기와 훈련 데이터 크기를 어떻게 배분해야 최적인가?

연구진은 고정된 연산량(그래프에서 각 곡선의 색상으로 표현)에서 다양한 모델 크기와 데이터 크기 조합을 실험했다. 그 결과, 항상 **최적점(sweet spot)**이 존재하며 이것이 일정한 관계를 따른다는 것을 발견했다.

이 관계를 Chinchilla 법칙이라 부르며, 핵심은 다음과 같다.

최적 훈련 토큰 수 \(\approx\) 20 \(\times\) 모델 파라미터 수

파라미터 수

최적 토큰 수 (Chinchilla)

1B

20B

10B

200B

70B

1.4T

175B

3.5T

이 기준에서 보면 GPT-3(175B 파라미터, 300B 토큰)는 심각하게 **과소훈련(undertrained)**된 모델이다. Chinchilla 법칙에 따르면 최소 3.5조 토큰으로 훈련해야 했다.

아키텍처 변화가 성능에 미치는 영향은 상대적으로 작다고 알려져 있다. 현재 LLM은 사실상 모두 디코더 전용 트랜스포머 기반이므로, 성능 변화의 주된 요인은 훈련 토큰 수와 모델 크기다.

실제로 Llama 3 논문은 자체 설정에서 최적의 파라미터 수와 토큰 수의 관계를 재현하는 과정을 상세히 기술했다. 소규모 모델과 적은 데이터로 예비 실험을 수행하여 자신들의 설정에 맞는 관계를 도출한 뒤 외삽(extrapolation)했다. 이것이 Llama 3의 35B 파라미터라는 특정 크기가 결정된 근거다.

4-cme295-training-pipeline.png

4.4 훈련 최적화 개요

LLM은 디코더 전용 트랜스포머 기반 모델이다. 훈련 과정의 대부분은 행렬 곱셈으로 이루어지며, 이런 연산에 특화된 하드웨어가 GPU다. Google은 자체 하드웨어인 TPU를 사용하지만, Google 이외의 모델은 대부분 GPU로 훈련된다.

훈련의 세 단계와 메모리 요구

LLM의 가중치를 학습시키는 과정은 세 단계로 구성된다. 각 단계에서 GPU 메모리에 저장해야 하는 요소들이 있다.

1단계: 순방향 전파 (Forward Pass)

입력 데이터를 신경망에 통과시켜 출력을 생성하고 손실(loss)을 계산한다. 이 과정에서 각 레이어의 활성화(activation) 값이 생성되며, 이를 메모리에 저장해야 한다. 활성화에 필요한 메모리는 다음에 의존한다.

2단계: 역방향 전파 (Backward Pass)

손실을 줄이는 방향을 찾기 위해 각 파라미터에 대한 손실의 **기울기(gradient)**를 계산한다. 기울기 역시 메모리에 저장해야 한다.

3단계: 가중치 갱신 (Weight Update)

계산된 기울기를 사용하여 가중치를 갱신한다. 일반적으로 Adam 옵티마이저를 사용하며, Adam은 기울기의 이동 평균(1차 모멘트)과 기울기 제곱의 이동 평균(2차 모멘트)을 추적한다. 이 옵티마이저 상태(optimizer states) 역시 메모리에 저장해야 한다.

저장 대상

설명

모델 파라미터

가중치 자체

활성화

순방향 전파 중 각 레이어의 중간값

기울기

역방향 전파로 계산된 각 파라미터의 편미분 값

옵티마이저 상태

Adam의 1차 모멘트(기울기 이동평균) + 2차 모멘트(기울기 제곱 이동평균)

GPU 메모리의 한계

문제는 GPU 메모리가 유한하다는 것이다. NVIDIA H100 GPU의 사양을 보자.

항목

H100 사양

GPU 메모리

80 GB

메모리 대역폭

~3 TB/s

80GB라는 메모리에 파라미터, 활성화, 기울기, 옵티마이저 상태를 모두 저장해야 한다. 수십억에서 수천억 파라미터를 가진 LLM에게 80GB는 턱없이 부족하다. 해결책은 여러 GPU에 부하를 분산하는 것이다.


4.5 데이터 병렬 처리와 ZeRO

데이터 병렬 처리 (Data Parallelism, DP)

데이터 병렬 처리의 핵심 아이디어는 훈련 데이터 배치를 여러 GPU에 분할하여 순방향 전파와 역방향 전파를 독립적으로 수행하는 것이다.

각 GPU에는 모델의 복제본이 필요하다. 활성화를 계산하고 기울기를 구하려면 전체 모델이 있어야 하기 때문이다. 이 방식으로 배치 크기에 연관된 메모리 부담을 줄일 수 있다.

기울기 갱신 시에는 각 GPU에서 독립적으로 계산된 기울기를 평균하여 집계한다. GPU 간 통신을 통해 기울기를 교환하고 평균을 구한 뒤, 모든 GPU의 가중치를 동일하게 갱신한다.

데이터 병렬 처리의 한계는 두 가지다.

  1. 모델 전체를 각 GPU에 적재해야 한다. 모델 자체가 단일 GPU 메모리에 들어가지 않으면 이 방식만으로는 불가능하다.
  2. **통신 비용(communication cost)**이 발생한다. GPU 간 기울기 집계를 위한 데이터 전송이 훈련 속도를 저하시킨다.

ZeRO (Zero Redundancy Optimizer)

데이터 병렬 처리에서 각 GPU는 동일한 파라미터, 동일한 기울기, 동일한 옵티마이저 상태를 중복 저장한다. ZeRO는 이 중복 정보를 제거하는 최적화 기법이다.

ZeRO Stage 1: 옵티마이저 상태를 GPU들에 걸쳐 **분할(shard)**한다. 각 GPU는 옵티마이저 상태의 일부만 저장한다. 이것만으로도 메모리가 크게 절약된다.

ZeRO Stage 2: Stage 1에 더해 기울기도 분할한다.

ZeRO Stage 3: Stage 2에 더해 모델 파라미터 자체도 분할한다. 이 단계에서는 중복 정보가 전혀 없다. 모든 것이 GPU들에 걸쳐 분배된다.

ZeRO 단계

분할 대상

메모리 절약

통신 비용

Stage 1

옵티마이저 상태

낮음

Stage 2

  • 기울기

더 큼

중간

Stage 3

  • 파라미터

최대

높음

단계가 높아질수록 메모리 절약이 커지지만 통신 비용도 증가한다. 어떤 단계를 선택할지는 모델 크기, 훈련 시간에 대한 민감도, 가용 GPU 수에 따른 설계 결정이다.


4.6 모델 병렬 처리

데이터 병렬 처리가 데이터를 분할한다면, **모델 병렬 처리(model parallelism)**는 모델 자체를 분할한다. 단일 배치 내에서도 연산을 병렬화하는 기법이다.

전문가 병렬 처리 (Expert Parallelism)

3장에서 다룬 MoE 기반 LLM에서, 각 전문가를 서로 다른 GPU에 배치한다. 토큰이 특정 전문가로 라우팅되면 해당 GPU에서 연산이 수행된다.

텐서 병렬 처리 (Tensor Parallelism)

큰 행렬 곱셈을 분할하여 여러 GPU에서 동시에 수행한다. 하나의 거대한 행렬 연산을 더 작은 단위로 쪼개어 각 GPU가 일부를 담당한다. 단일 레이어 내의 연산을 여러 GPU에 나누는 방식이다.

파이프라인 병렬 처리 (Pipeline Parallelism)

순방향 전파가 여러 레이어를 순차적으로 통과하는 점을 활용한다. 레이어를 GPU별로 할당한다.

각 GPU는 자신에게 할당된 레이어만 저장하고 연산한다.

병렬화 기법

분할 대상

핵심 아이디어

전문가 병렬

MoE 전문가

각 전문가를 별도 GPU에 배치

텐서 병렬

행렬 연산

큰 행렬 곱셈을 여러 GPU에 분산

파이프라인 병렬

레이어

레이어 그룹을 순차적으로 GPU에 할당

실제 대규모 LLM 훈련에서는 이들 기법을 데이터 병렬 처리와 함께 조합하여 사용한다.


4.7 플래시 어텐션 (Flash Attention)

플래시 어텐션은 2022년 스탠퍼드에서 개발된 기법으로, GPU의 메모리 구조를 활용하여 어텐션 연산을 가속한다. 근사(approximation)가 아닌 정확한(exact) 연산을 수행하면서도 속도와 메모리 효율을 모두 개선한다.

GPU의 두 종류 메모리

GPU 내부에는 두 종류의 메모리가 존재한다.

메모리

용량

속도

위치

HBM (High Bandwidth Memory)

수십 GB

수 TB/s

GPU 외부 (크지만 상대적으로 느림)

SRAM (Static RAM)

수십 MB

수십 TB/s

칩 위 (작지만 ~10배 빠름)

HBM은 GPU 사양에 표시되는 "GPU 메모리"에 해당한다 (H100의 경우 80GB). SRAM은 연산 유닛 바로 옆에 위치하여 HBM보다 약 10배 빠르지만 용량은 수십 MB에 불과하다.

기존 어텐션의 병목

셀프 어텐션의 핵심 수식을 떠올려 보자.

\[\text{Attention}(Q, K, V) = \text{softmax}\!\left(\frac{QK^\top}{\sqrt{d_k}}\right)V\]

기존 방식(vanilla attention)으로 이 연산을 수행하면 다음과 같이 진행된다.

  1. HBM에서 \(Q\), \(K\) 행렬을 읽어온다 → \(QK^\top\) 계산 → 결과를 HBM에 기록한다.
  2. HBM에서 결과를 다시 읽는다 → 소프트맥스 계산 → 결과를 HBM에 기록한다.
  3. HBM에서 소프트맥스 결과와 \(V\) 행렬을 읽는다 → 행렬 곱 계산 → 최종 결과를 HBM에 기록한다.

HBM에 대한 읽기/쓰기가 반복된다. GPU 연산 자체는 매우 빠르지만, HBM과의 데이터 전송이 병목이 된다. 이것을 메모리 바운드(memory-bound) 연산이라 한다.

병목의 근본 원인은 소프트맥스다. 소프트맥스는 행 단위로 정규화하므로, 전체 \(QK^\top\) 행렬이 완성되어야만 수행할 수 있다고 생각하기 쉽다.

타일링과 소프트맥스 분해

그런데 실제로는 전체 행렬을 한꺼번에 계산하지 않아도 된다. 이것이 플래시 어텐션의 핵심 착안점이다.

타일링(tiling): \(Q\), \(K\), \(V\) 행렬을 작은 블록으로 분할하여 SRAM에 적재한 뒤, 블록 단위로 어텐션 연산을 처음부터 끝까지 수행하고 결과를 HBM에 기록한다. HBM 접근 횟수를 최소화하는 것이 목표다.

소프트맥스 분해(softmax decomposition): 전체 행렬 \(S\)에 대한 소프트맥스를 부분 행렬 \(S_1, S_2, \ldots, S_n\)의 소프트맥스로 분해할 수 있다.

\[\text{softmax}(S) = \text{softmax}([S_1, S_2, \ldots, S_n])\]

이때 각 부분 행렬의 소프트맥스에 **스케일링 팩터(scaling factor)**를 적용하면 전체 소프트맥스와 정확히 동일한 결과를 얻는다. 소프트맥스 공식이 \(\exp(x_i) / \sum_j \exp(x_j)\) 형태이므로, 행 전체에 공유되는 정규화 상수를 부분별로 계산한 뒤 보정할 수 있다. 스케일링 팩터는 반복적으로(iteratively) 정확하게 계산된다.

구체적인 절차는 다음과 같다.

  1. \(Q\)의 첫 번째 블록과 \(K\), \(V\)의 첫 번째 블록을 SRAM에 적재한다.
  2. 블록 단위로 \(QK^\top\), 소프트맥스, \(\times V\) 연산을 수행한다.
  3. 출력 행렬의 해당 위치를 갱신한다.
  4. \(K\), \(V\)의 다음 블록으로 반복한다.
  5. \(Q\)의 다음 블록으로 이동하여 전체 과정을 반복한다.

결과적으로 HBM에서의 읽기는 최초 1회, SRAM에서의 읽기/쓰기는 매우 빠르게 수행되고, 최종 결과만 HBM에 기록된다.

재계산 (Recomputation)

플래시 어텐션의 두 번째 아이디어는 활성화 재계산이다. 역방향 전파에서 기울기를 계산할 때 연쇄 법칙(chain rule)에 의해 순방향 전파의 활성화 값이 필요하다. 일반적으로는 순방향 전파 시 활성화를 메모리에 저장해 둔다.

그런데 플래시 어텐션 덕분에 어텐션 연산이 매우 빨라졌으므로, 순방향 전파의 활성화를 저장하지 않고 역방향 전파 시 다시 계산한다. 이것이 재계산(recomputation)이다.

통상적으로 재계산은 메모리를 절약하되 실행 시간이 늘어나는 트레이드오프다. 그러나 플래시 어텐션의 재계산은 놀라운 결과를 보인다.

지표

기존 방식

플래시 어텐션

연산량 (GFLOPs)

더 적음

더 많음 (재계산 포함)

HBM 읽기/쓰기

40.3

~4 (약 10배 감소)

실행 시간

더 김

더 짧음

메모리 사용

더 많음

더 적음

연산량은 늘었지만, HBM 접근이 약 10배 줄어 실행 시간이 오히려 단축되고 메모리도 절약된다. 속도와 메모리 모두 개선되는, 이른바 "모든 것이 좋아지는" 결과다.

Flash Attention 2, Flash Attention 3 등의 후속 연구는 새로운 GPU 하드웨어의 특성에 맞게 이 최적화를 더욱 발전시켰다.


4.8 양자화 (Quantization)

LLM의 가중치는 모두 부동소수점 수다. 소수점 이하의 모든 정밀도가 실제로 필요한가? 정밀도를 줄여서 메모리를 절약하되 성능은 유지할 수 있지 않을까? 이것이 **양자화(quantization)**의 출발점이다.

부동소수점 표현

부동소수점 수는 비트(bit)들의 조합으로 표현된다. 각 표현은 세 부분으로 구성된다.

주요 부동소수점 형식의 비교:

형식

총 비트

지수 비트

가수 비트

용도

FP64

64

11

52

과학 계산 (매우 높은 정밀도)

FP32

32

8

23

기본 훈련 정밀도

FP16

16

5

10

추론 및 혼합 정밀도

BF16

16

8

7

딥러닝 특화 (넓은 범위, 낮은 정밀도)

INT8

8

-

-

양자화된 추론

FP16은 FP32 대비 메모리를 절반만 사용하지만, 정밀도(세밀함)가 낮다.

정밀도와 연산 속도의 관계

GPU 사양을 보면, 표현 형식에 따라 연산 속도가 크게 달라진다.

정밀도

H100 연산 속도

FP64

34 TFLOPS

FP32

~67 TFLOPS

FP16/BF16

~990 TFLOPS

정밀도가 낮을수록 연산 속도가 빨라지고 메모리도 절약된다. 양자화의 이중 이점이다.


4.9 혼합 정밀도 훈련 (Mixed Precision Training)

혼합 정밀도 훈련은 서로 다른 정밀도를 전략적으로 조합하여, 성능 손실을 최소화하면서 메모리와 속도를 개선하는 기법이다.

기본 전략

대상

정밀도

이유

모델 가중치 (마스터 복사본)

FP32 (고정밀도)

양자화 오차 누적 방지

순방향/역방향 전파 연산

FP16 (저정밀도)

속도 향상 + 메모리 절약

가중치 갱신

FP32 (고정밀도)

정밀한 갱신 보장

이 전략의 직관은 다음과 같다. 순방향 전파에서 처리하는 데이터는 본질적으로 노이즈를 포함하고 있어, 소수점 이하의 극단적 정밀도가 필수적이지 않다. 기울기 역시 "가중치를 어느 방향으로 움직일지"를 나타내는 것이므로, 초정밀할 필요가 없다.

반면 가중치 자체는 고정밀도로 유지해야 한다. 저정밀도 가중치에 반복적으로 작은 갱신을 적용하면 양자화 오차가 누적되어 성능이 저하될 수 있기 때문이다.

양자화를 모든 레이어에 균일하게 적용할지, 특정 레이어에만 적용할지는 설정에 따라 다르다. 일부 레이어가 다른 레이어보다 정밀도에 더 민감할 수 있으며, 이에 대한 다양한 변형이 연구되어 있다.


4.10 지도 미세 조정 (Supervised Fine-Tuning, SFT)

사전 훈련 모델의 한계

사전 훈련된 모델은 다음 토큰 예측에 최적화되어 있을 뿐, 유용한 답변을 생성하도록 훈련되지 않았다. 예를 들어, 사전 훈련된 모델에 "곰 인형을 세탁기에 넣어도 되나요?"라고 물으면, 질문에 대한 답변 대신 곰 인형의 소재에 관한 연속 문장을 생성할 수 있다. 인터넷 텍스트의 패턴을 따라 다음에 올 법한 토큰을 예측하기 때문이다.

SFT의 정의

**지도 미세 조정(Supervised Fine-Tuning, SFT)**은 사전 훈련된 가중치에서 출발하여, 입출력 쌍(pair)으로 구성된 레이블 데이터로 모델을 추가 훈련하는 과정이다.

목적 함수의 차이

SFT의 목적 함수는 사전 훈련과 동일하게 다음 토큰 예측이지만, 적용 범위가 다르다.

즉, 모델이 사용자의 질문을 그대로 반복하는 것이 아니라, 질문을 조건으로 하여 유용한 응답을 생성하도록 학습한다.

인스트럭션 튜닝 (Instruction Tuning)

SFT의 하위 범주로, LLM을 범용 유용한 어시스턴트로 만드는 과정을 특별히 **인스트럭션 튜닝(instruction tuning)**이라 한다. 모델이 명령(instruction)에 적절히 응답하도록 학습시킨다.

SFT 데이터의 구성

사전 훈련 데이터가 인터넷 전체의 원시 텍스트라면, SFT 데이터는 특정 과제에 대한 고품질 입출력 쌍이다.

범주

예시

이야기 생성

주어진 조건으로 이야기 작성

시 창작

특정 주제의 시 생성

목록 생성

조건에 맞는 항목 나열

설명

개념이나 과정 설명

코드

고품질 코드 생성

수학

증명, 풀이 과정

안전성

유해한 요청 거부, 표현 완화(hedging)

초기에는 전문 언어학자가 작성한 순수 인간 생성 데이터만 사용했다. 현재는 이미 훈련된 대규모 LLM을 활용하여 데이터를 생성하고, 인간 또는 다른 LLM이 품질을 검수하는 방식이 병행된다.

안전성(safety) 데이터는 특별히 중요하다. 모델이 유용하면서도 **무해(harmless)**하도록, 유해한 질의를 거부하거나 표현을 완화하는 사례를 포함한다.

SFT 데이터의 규모

모델

SFT 예시 수

추정 토큰 수

GPT-3

~13K

~1,300만

Llama 3

~10M

~100억

SFT 데이터는 사전 훈련 데이터보다 여러 자릿수(orders of magnitude) 작다. 핵심 멘탈 모델은 다음과 같다.

인스트럭션 튜닝 후, 앞서 "곰 인형" 질문에 대해 모델은 "네, 세탁기에 넣을 수 있지만, 손세탁을 권장합니다"와 같은 유용한 답변을 생성한다.

SFT의 과제

  1. 고품질 데이터 확보의 어려움: 인간이 관여해야 하므로 시간과 비용이 크다.
  2. 프롬프트 분포 불일치: SFT 데이터의 프롬프트 분포와 실제 추론 시 사용자 프롬프트 분포가 다르면 일반화가 어렵다.
  3. 평가의 어려움: MMLU(대규모 다과제 언어 이해), GSM8K(수학 추론), HumanEval(코드 생성) 등 벤치마크가 있지만, 벤치마크 점수와 실제 사용자 경험 사이에 괴리가 있을 수 있다. Chatbot Arena 같은 인간 선호도 평가도 초기 비교 대상에 따른 노이즈, 순위 조작 가능성, 사용자 선호와 전문가 판단의 괴리 등 한계가 있다.

중간 훈련 (Mid-Training)

최근 부상하는 개념으로, 사전 훈련과 미세 조정 사이에 위치한다. 사전 훈련과 동일한 목적 함수(다음 토큰 예측)를 사용하되, 관심 과제와 관련된 데이터로 학습하여 모델의 표현을 과제 도메인에 맞게 조정한다.


4.11 LoRA: 파라미터 효율적 미세 조정

미세 조정의 연산 부담

수십억에서 수천억 개의 파라미터를 가진 LLM의 모든 가중치를 미세 조정하는 것은 막대한 연산 비용을 수반한다. **LoRA(Low-Rank Adaptation)**는 이 문제를 해결하는 널리 사용되는 기법이다.

LoRA의 핵심 아이디어

전체 가중치 행렬을 직접 미세 조정하는 대신, 가중치의 변화를 저차원 행렬 곱으로 분해한다.

\[W = W_0 + BA\]

\(W_0\)의 차원 \(d\)가 수백에서 수천인 반면, \(r\)은 10 이하로 설정되므로 학습해야 할 파라미터 수가 극적으로 줄어든다.

항목

전체 미세 조정

LoRA (r=4, d=1024)

학습 파라미터

\(d \times d = 1,048,576\)

\(2 \times d \times r = 8,192\)

비율

100%

~0.8%

LoRA의 동작 방식

  1. 순방향 전파 시, 입력 \(x\)에 대해 \(W_0 x\)\(BAx\)를 각각 계산한다.
  2. 두 결과를 더한다: \(y = W_0 x + BAx\).
  3. \(W_0\)는 동결 상태이므로 역방향 전파에서 \(B\)\(A\)만 갱신한다.

이 구조의 우아한 점은 과제별로 다른 \(B\), \(A\) 행렬을 학습할 수 있다는 것이다. 동일한 사전 훈련 모델 \(W_0\)에서 출발하여, 스팸 탐지용 \((B_1, A_1)\), 감성 분석용 \((B_2, A_2)\) 등을 각각 학습하면 된다. 기본 모델을 공유하면서 과제별 어댑터만 교체하는 것이다.

LoRA 적용 위치

원래 논문에서는 어텐션 행렬에만 LoRA를 적용했다. 그러나 이후 연구에서 **피드포워드 블록(FFN)**에 LoRA를 적용하는 것이 성능 개선에 가장 효과적이라는 것이 밝혀졌다. 현재는 어텐션과 FFN 모두에 LoRA를 적용하되, 성능 향상의 대부분은 FFN에서 발생한다.

LoRA의 실무 팁

항목

권장사항

설명

학습률

전체 미세 조정 대비 ~10배 높게

저차원 공간에서 탐색해야 하므로 더 큰 스텝이 필요

배치 크기

작게 유지

큰 배치에서 성능이 떨어지는 경향 (행렬 곱 형태의 훈련 동역학이 원인으로 추정)

랭크 \(r\)

4가 일반적

초기 축소 효과가 압도적이라 추가 축소의 한계 효용이 작음


4.12 QLoRA: 양자화된 LoRA

QLoRA는 LoRA에 양자화를 결합하여 메모리 효율을 극단적으로 높인 기법이다.

QLoRA의 구조

\[W = \text{Quantize}(W_0) + BA\]

NF4 양자화

NF4는 가중치가 **정규 분포(normal distribution)**를 따른다는 가정 하에, 고정 크기 구간이 아닌 분위수(quantile) 기반으로 공간을 분할한다. 각 구간에 거의 동일한 수의 값이 배치되므로, 비트를 최적으로 활용한다.

이중 양자화 (Double Quantization)

양자화 과정에서 생성되는 양자화 상수(quantization constants)를 한 번 더 양자화한다. 이 이중 양자화로 추가적인 메모리 절약을 달성한다.

기법

VRAM 절약

NF4 양자화

~16배

*+ 이중 양자화*

추가 절약 (소폭)

QLoRA 덕분에 수십억 파라미터의 모델도 단일 소비자용 GPU에서 미세 조정할 수 있게 되었다.


핵심 정리

개념

핵심

전이 학습

매번 처음부터 훈련하지 않고, 사전 훈련 모델에서 출발하여 과제별로 튜닝

사전 훈련

수조 토큰의 방대한 데이터로 다음 토큰 예측 학습. 가장 비용이 큰 단계

지식 차단일

사전 훈련 데이터의 시간적 경계. 이후 정보는 모델이 알 수 없음

FLOPs vs FLOPS

FLOPs = 연산 횟수(총량), FLOPS = 초당 연산 횟수(속도)

Chinchilla 법칙

최적 토큰 수 ≈ 20 × 파라미터 수. GPT-3는 이 기준으로 과소훈련

Adam 옵티마이저

1차/2차 모멘트를 저장. 파라미터 외 추가 메모리 필요

GPU 메모리

H100 80GB에 파라미터+활성화+기울기+옵티마이저 상태를 저장해야 함

ZeRO

Stage 1(옵티마이저), 2(+기울기), 3(+파라미터) 분할로 중복 제거

모델 병렬

전문가 병렬, 텐서 병렬, 파이프라인 병렬로 모델을 GPU에 분산

플래시 어텐션

HBM/SRAM 구조 활용. 타일링 + 소프트맥스 분해로 정확한 어텐션을 더 빠르게

재계산

활성화를 저장하지 않고 역방향 전파 시 재계산. 속도와 메모리 모두 개선

양자화

FP32→FP16→INT8 등으로 정밀도를 낮춰 메모리 절약 + 속도 향상

혼합 정밀도

가중치는 FP32, 연산은 FP16. 성능 유지하면서 효율 확보

SFT

고품질 입출력 쌍으로 모델을 유용한 어시스턴트로 정렬. 데이터는 사전 훈련보다 수 자릿수 작음

인스트럭션 튜닝

SFT의 하위 범주. 명령에 대한 응답 능력 학습

LoRA

\(W = W_0 + BA\). 저랭크 행렬 곱으로 학습 파라미터를 ~1% 이하로 축소

QLoRA

LoRA + NF4 양자화. 동결 가중치를 4비트로 양자화하여 VRAM 16배 절약


다음 장: 5장 - LLM 튜닝