SFTConfig는 대규모 언어 모델(LLM)의 Supervised Fine-Tuning(SFT) 을 수행할 때 사용하는 학습 설정(Configuration) 클래스다.
특히 Hugging Face 생태계의 TRL(Transformer Reinforcement Learning) 라이브러리에서 SFTTrainer와 함께 사용된다.
예를 들어 다음과 같이 사용할 수 있다.
from trl import SFTTrainer, SFTConfig
training_args = SFTConfig(
output_dir="./results",
per_device_train_batch_size=2,
learning_rate=2e-5,
num_train_epochs=3,
)
위 코드에서 SFTConfig는 모델 학습에 필요한 다양한 설정을 정의한다.
SFT(Supervised Fine-Tuning)는 사람이 작성한 정답 데이터를 이용하여 모델을 추가 학습시키는 방법이다.
예를 들어 다음과 같은 데이터가 있다고 가정해 보자.
| 입력 | 정답 |
|---|---|
| 한국의 수도는? | 서울입니다. |
| Translate hello to Korean | 안녕하세요 |
모델은 이러한 입력-출력 쌍을 학습하여 원하는 형태의 응답을 생성하도록 훈련된다.
기존 Hugging Face Trainer에서는 일반적으로 TrainingArguments를 사용한다.
from transformers import TrainingArguments
하지만 LLM 파인튜닝에는 추가적으로 필요한 기능들이 많다.
예를 들어:
등의 기능이 필요하다.
이를 위해 TRL에서는 TrainingArguments를 확장한 SFTConfig를 제공한다.
구조적으로는 다음과 같이 이해할 수 있다.
TrainingArguments
↓
SFTConfig
즉, SFTConfig는 TrainingArguments의 상위 호환 버전이라고 볼 수 있다.
다음은 자주 사용되는 설정 예시다.
SFTConfig(
output_dir="./outputs",
learning_rate=2e-5,
per_device_train_batch_size=4,
gradient_accumulation_steps=8,
num_train_epochs=3,
logging_steps=10,
save_steps=100,
max_seq_length=2048,
bf16=True,
)
각 옵션의 의미는 다음과 같다.
| 옵션 | 설명 |
|---|---|
learning_rate | 학습률 |
per_device_train_batch_size | GPU당 배치 크기 |
gradient_accumulation_steps | Gradient 누적 횟수 |
num_train_epochs | 전체 데이터 반복 횟수 |
max_seq_length | 최대 토큰 길이 |
bf16, fp16 | 반정밀도 학습 |
logging_steps | 로그 출력 주기 |
save_steps | 모델 저장 주기 |
GPU 메모리가 부족한 경우 큰 배치를 사용할 수 없다.
예를 들어 실제로는 배치 크기 32로 학습하고 싶지만 GPU 메모리 제약으로 배치 크기 4밖에 사용할 수 없는 경우가 있다.
이때:
per_device_train_batch_size=4
gradient_accumulation_steps=8
로 설정하면
4 × 8 = 32
와 동일한 효과를 얻을 수 있다.
즉, 여러 번 계산한 Gradient를 모아 한 번에 업데이트하는 방식이다.
일반적으로 다음과 같은 형태로 사용한다.
from trl import SFTTrainer, SFTConfig
config = SFTConfig(
output_dir="./outputs",
learning_rate=2e-5,
)
trainer = SFTTrainer(
model=model,
train_dataset=dataset,
args=config,
)
trainer.train()
전체 흐름은 다음과 같다.
Dataset
↓
SFTTrainer
↓
SFTConfig 설정 적용
↓
Fine-Tuning 수행
최근에는 전체 모델을 학습하는 대신 LoRA를 사용하는 경우가 많다.
예를 들어:
from peft import LoraConfig
from trl import SFTConfig, SFTTrainer
구조는 다음과 같다.
Pretrained Model
↓
LoRA Adapter 추가
↓
SFTTrainer
↓
SFTConfig로 학습 설정
↓
Fine-Tuning
여기서 각 역할은 다음과 같다.
| 구성 요소 | 역할 |
|---|---|
LoraConfig | 어떤 Adapter를 추가할지 설정 |
SFTConfig | 학습 방법 설정 |
SFTTrainer | 실제 학습 수행 |
초보자들이 자주 헷갈리는 부분이다.
LoraConfig(
r=8,
lora_alpha=16,
target_modules=["q_proj", "v_proj"]
)
SFTConfig(
learning_rate=2e-5,
num_train_epochs=3
)
즉,
LoRAConfig
→ 모델 구조 설정
SFTConfig
→ 학습 방식 설정
이라고 이해하면 된다.
from trl import SFTConfig
training_args = SFTConfig(
output_dir="./checkpoints",
learning_rate=2e-5,
per_device_train_batch_size=4,
gradient_accumulation_steps=4,
num_train_epochs=3,
max_seq_length=2048,
bf16=True,
logging_steps=10,
save_steps=100,
save_total_limit=2,
)
LLM 파인튜닝 실습에서 가장 자주 볼 수 있는 형태의 설정이다.
SFTConfig는 TRL 라이브러리에서 제공하는 SFT(Supervised Fine-Tuning) 전용 학습 설정 클래스다.
주요 역할은 다음과 같다.
즉,
모델을 어떻게 학습시킬 것인지 정의하는 설정 파일
이라고 이해하면 된다.
반면,
LoRAConfig는 모델 구조 설정SFTConfig는 학습 설정을 담당한다.
LLM 파인튜닝에서는 SFTTrainer, SFTConfig, LoRAConfig가 함께 사용되는 경우가 매우 많다.