4장. LLM 을 완성하는 3단계와 Hugging Face
Trainer 로 학습하기
세탁기의 "표준 코스"를 떠올려 보세요. 빨래와 세제만 넣고 단추를 누르면 불리기, 빨기, 헹구기, 짜기를 알아서 합니다. 2장에서 다섯 줄로 손수 쓴 학습 루프를 transformers 의 Trainer 가 이렇게 대신 돌려 줍니다.
1번 TrainingArguments 에 에포크, 학습률, 배치 크기 같은 설정을 적고, 2번 Trainer 에 모델과 데이터를 넘깁니다. 3번 train() 이 학습 루프를 돌리고, 4번 evaluate() 로 검증 손실을 재고 save_pretrained 로 저장합니다. 여기서 세탁 코스의 설정이 TrainingArguments, 단추가 train() 입니다.
2장의 루프와 견주기
| 2장에서 손으로 한 일 | Trainer 에서 |
|---|---|
DataLoader(…, batch_size=32, shuffle=True) | per_device_train_batch_size=32 |
for epoch in range(200) | num_train_epochs=8 |
torch.optim.Adam(…, lr=0.01) | learning_rate=1e-3(AdamW 가 기본) |
zero_grad, 순전파, 손실, backward, step | trainer.train() 한 줄 |
model.to("cuda") | GPU 가 있으면 알아서 쓴다 |
torch.manual_seed(42) | seed=42 |
| 직접 짠 평가 코드 | trainer.evaluate() → eval_loss |
주요 설정
| 인자 | 뜻 | 실습 5의 값 |
|---|---|---|
output_dir | 중간 저장 폴더 | out_pretrain_ckpt |
per_device_train_batch_size | GPU 하나의 배치 크기 | 32 |
num_train_epochs | 에포크 수 | 8 |
learning_rate | 학습률 | 0.001 |
warmup_steps | 처음 몇 걸음은 학습률을 0 에서 천천히 올린다 | 50 |
fp16 | 혼합 정밀도(GPU 에서만) | GPU 가 있으면 True |
save_strategy | 중간 저장 여부 | "no"(끝에 따로 저장) |
report_to | 학습 기록을 보낼 곳 | "none"(보내지 않음) |
from transformers import TrainingArguments
args = TrainingArguments(
"out_demo_args", # 중간 결과를 둘 폴더 이름
per_device_train_batch_size=32,
num_train_epochs=8,
learning_rate=1e-3,
report_to="none", # 외부 기록 서비스로 보내지 않는다
)
print(args.num_train_epochs, args.learning_rate, args.optim.value)args.optim.value 가 adamw_torch_fused 로 나와 옵티마이저가 AdamW(여러 계산을 한 번에 묶어 빠르게 하는 판)로 정해진 것을 확인할 수 있습니다. 설정만 만든 것이라 폴더나 파일은 아직 생기지 않습니다.
코드에 나오는 함수
| 코드 | 쉬운 뜻 |
|---|---|
TrainingArguments("out_demo_args", ...) | 학습 설정을 한 묶음으로 담는다. arguments 는 "인자, 설정값"이라는 뜻이다. 첫 칸은 output_dir(결과를 둘 폴더)이다 |
per_device_train_batch_size=32 | 장치(GPU 또는 CPU) 하나가 한 걸음에 보는 예제 수다. per device 는 "장치마다"라는 뜻이다 |
num_train_epochs=8 | 학습 데이터를 8번 다 돈다 |
learning_rate=1e-3 | 학습률 0.001 이다. 1e-3 은 1 × 10의 -3제곱을 짧게 적은 꼴이다 |
report_to="none" | 학습 기록을 바깥 서비스로 보내지 않는다 |
args.optim.value | 고른 옵티마이저(optimizer, 가중치를 고치는 방법)의 이름을 글로 꺼낸다 |
이 코드가 뜻하는 것
세탁기의 코스 단추를 누르기 전에 물 온도, 헹굼 횟수, 탈수 세기를 맞추는 단계입니다. 아직 시작 단추(trainer.train())는 누르지 않았습니다.
| 줄 | 하는 일 | 쉽게 말하면 |
|---|---|---|
args = TrainingArguments(...) | 폴더, 배치 크기, 에포크, 학습률을 정한다 | 세탁 코스를 맞춘다 |
report_to="none" | 기록을 밖으로 보내지 않는다 | 세탁 기록을 제조사에 보내지 않게 끈다 |
print(args.num_train_epochs, ...) | 정한 값과 기본으로 골라진 옵티마이저를 찍는다 | 화면에 뜬 설정을 확인한다 |
출력에서 우리가 주지 않은 optim 값이 나온 것은, 따로 정하지 않은 설정은 TrainingArguments 가 기본값으로 채우기 때문입니다. 실습 5에서는 이 묶음에 warmup_steps, fp16, save_strategy 같은 설정을 더해 Trainer 에 넘깁니다.
주의할 점
Trainer는 편리하지만 안에서 무엇을 하는지 보이지 않습니다. 결과가 이상하면 2장의 손 루프로 돌아가 한 단계씩 확인합니다.report_to="none"을 빼면 설치된 외부 기록 서비스로 학습 기록을 보내려 할 수 있습니다. 사내 데이터라면 꼭 끕니다.