llama 3.2 1b 파인튜닝으로 한국어 능력 향상시키기 #4

드디어 파인튜닝(Fine-Tuning)이 완료되었습니다. 훈련 시작 시 80시간을 예상했으나, 워낙 오래된 PC라 보니 대략 20시간 정도 더 지연된 것 같습니다. 4일내 끝날 줄 알았지만 5일이 걸렸죠.

오늘은 이전 글 “llama fine tuning 방법 #2 – 목표 설정과 Dataset”에서 확인해 봤던 llama 3.2 1b 원본 모델의 한국어 능력이 파인튜닝으로 얼마나 향상되었는지 확인해 보도록 하겠습니다.


llama 3.2 1b 파인튜닝 결과

파인튜닝을 시작했을 때와 종료 시 출력된 로그는 다음과 같습니다.

{'loss': 2.1015, 'grad_norm': 7.565408229827881, 'learning_rate': 1.97979797979798e-05, 'epoch': 0.03} <--- 시작
{'loss': 0.5755, 'grad_norm': 5.137156009674072, 'learning_rate': 0.0, 'epoch': 2.99} <---- 끝

TrainOutput(global_step=990, training_loss=1.074503596142085, metrics={'train_runtime': 363338.2458, 'train_samples_per_second': 0.087, 'train_steps_per_second': 0.003, 'total_flos': 2.367687846002688e+16, 'train_loss': 1.074503596142085, 'epoch': 2.9943289224952743})

파인튜닝 훈련 주요 변화

이 로그 정보를 기준으로 실시한 파인튜닝에 결과에 대해 성능을 살펴보면 다음과 같이 간단하게 정리할 수 있을 것 같습니다.

  • 시작:
    • loss: 2.1015
    • grad_norm: 7.5654
    • learning_rate: 1.9798e-05
    • epoch: 0.03
  • 종료:
    • loss: 0.5755
    • grad_norm: 5.1372
    • learning_rate: 0.0
    • epoch: 2.99
  • 결론:
    • 평균 훈련 손실 (traning_loss): 1.0745
    • 총 학습 단계 (global_step): 990
    • 최종 에포크: 약 2.99 (3번 반복)
    • 훈련 시간: 약 100시간 (363,338초)


손실 변화 분석

  • 손실 값 변화:
    • 초기 손실: 2.1015
    • 최종 손실: 0.5755
    • 평균 손실: 1.0745

손실이 약 72% 감소했으며, 이것은 모델이 데이터를 학습하고 성능이 개선 되었음을 보여주고 있습니다. 저사양 PC의 능력을 의심했지만 그래도 뭔가를 해 준 것 같습니다. 또, 평균 소실 대비 최종 손실이 더 낮은 값을 갖는 다는 것은 튜닝 과정에 따라 학습이 지속적인 성공적으로 진행됐다고 볼 수 있을 것 같습니다.

Gradient Norm (grad_norm)

이 역시 감소하는 것을 보이고 있는데, 이것은 훈련이 그래도 조금씩 안정화되고 있다는 의미로, 튜닝 시작 시 큰 변화량으로 학습을 시작했다는 것을 의미하고 있으며 종료 시에는 기울기 폭주 (Gradient Explosion)나 기울기 소실 (Vanishing Gradient) 문제 없이 훈련이 잘 마무리되었다는 것을 말해 주고 있습니다.

학습률 (Learning Rate)

  • 초기 학습률: 1.9798e-05
  • 최종 학습률: 0.0

최종 학습률이 0에 도달한 것은 정상적으로 훈련이 종료되었다는 의미입니다.

결론적으로 훈련 초기 손실이 2.1015에서 최종 0.5755로 감소한 하여 훈련 과정이 효과적이었다고 생각됩니다. 또 Graident norm 수치 결과로 훈련 과정 역시 큰 문제가 없었기 때문에 최종 결과 모델의 성능을 기대할 수 있게 합니다.

다만, 이번 파인튜닝은 결과에 대한 기대가 매우 작았고 훈련 완료 자체만을 기대했기 때문에 코드 구현시 성능 평가에 대한 어떤 지표도 적용하지 않았습니다. 때문에 정확도(Accuracy), 정밀도(Precision), 재현율(Recall) 등에 대한 정량적 수치를 통해 최종 모델의 성능 평가할 수는 없었습니다.

훈련된 모델의 학습 능력 확인

자, 그러면 이제 실제 대화를 통해 훈련된 모델의 한국어 능력을 확인해 보도록 하겠습니다.

우선 llama 3.2 1b 원본 모델의 한국어 능력을 다시 한번 확인해 보면 아래 그림과 같습니다. 아래 그림은 이전 글에서 확인했던 내용입니다.

llama fine tuning하기 02 - 생성 모델 한글 체크
llama fine tuning하기 02 – 생성 모델 한글 체크

문장 중간 중간에 외국어가 삽입되었죠. 뿐만 아니라 내용 역시 오류가 있었습니다.

다음은 훈련된 모델의 한국에 능력을 확인해 보겠습니다. 위 그림도 같은 환경으로 아래 챗팅 환경은 ollama에 훈련된 모델을 생성하고 Open WebUI인 Docker를 연결하여 대화를 실행하고 있습니다. 이 부분에 대해서는 아래 링크의 이전 글들을 참고하시면 자세한 내용을 보실 수 있습니다.


훈련된 모델을 선택하여 대화를 준비합니다. 파인 튜닝된 모델은 “llama3.2-1b-finetuned-32bit:latest”이고, “llama3.2:1b”는 원본 모델입니다.

llama 파인튜닝 01
llama 파인튜닝 01

모델을 선택했으면 화면 맨 아래에 요청 사항을 입력합니다. 원본의 한국어 능력과 비교하기 위해 이전에 했던 질문을 똑같이 입력합니다.

llama 파인튜닝 02
llama 파인튜닝 02

훈련된 모델이 응답한 길이는 짧았지만, 완벽한 문장의 한글로 대답을 했습니다. 물론 “한국어와 비슷하지만..” 이 부분은 의미가 이상한 부분이 여전히 있습니다. 응답이 짧았으므로 다시 요청하여 응답을 받아 봅니다.

llama 파인튜닝 03
llama 파인튜닝 03

이번에는 지난 원본 모델이 응답 했던 것 처럼 대답을 길게 해 주었습니다. 직관적으로 보면 전체적으로 지난 번 원본 모델 보다 한국어 능력은 더 좋아진 것으로 보입니다.

가장 큰 변화는 한국어 중간에 외국어가 사용되지 않았습니다. 물론 위 그림에 붉은 점선 부분처럼 이상한 기호가 사용되기는 했지만, 그 부분의 문맥상 의미는 분명해 보입니다. 전체적인 응답의 논리나 의미 전달은 아직 완벽해 보이지는 않습니다. 한글에 대한 설명 부분이 부족했는지 학습이 더 필요해 보이기도 합니다.

자, 여기까지 llama 3.2 1b모델로 한글 파인튜닝한 결과를 살펴 봤습니다. 파인 튜닝 시간이 매우 길기는 했지만 그래도 결과는 기대보다는 상당히 좋게 나와서 의미있는 실험이었다 생각됩니다.

12월 18일 현재 기준 Meta에서는 다국어 모델 llama 3.3이 발표되었습니다. 물론 70b 모델로 직접 사용할 수는 없었습니다만, 매개변수가 큰 모델이므로 한국어 능력 역시 수준급이지 않나 예상해 봅니다.





llama fine tuning 방법 시리즈

답글 남기기