본문 바로가기
HRDI_AI/머신러닝_딥러닝 핵심 기술과 실무 중심 생성형 AI 프로젝트

Midterm Report

by Toddler_AD 2025. 11. 26.

1. 사용 모델과 학습 환경

1-1. 사용 모델: KETI-AIR ke-T5-ko2en(T5 - large)

이번 프로젝트에서 사용하는 모델은 허깅페이스의

KETI-AIR/ke-t5-large-ko2en

계열 한국어 → 영어 번역 모델이다.

  • 기본 구조: Transformer 기반 Encoder–Decoder(Seq2Seq) 구조
  • Text-to-Text: 입력과 출력이 모두 텍스트인 Text-to-Text 패러다임
  • 활용 목적
    • 일반 문장 + 과학·기술 도메인 텍스트를
      한국어에서 영어로 자연스럽게 번역
    • 향후 RAG 파이프라인에서 Generator 역할을 하는 기반 모델

정리하자면,
Transformer 구조를 쓰되, 번역/요약/질문응답 등을 전부 ‘텍스트 → 텍스트’로 통일한 T5 계열 모델을, 한국어↔영어에 맞게 특화한 버전”을 파인튜닝하고 있다고 보면 된다.


1-2. 학습 환경

GPU 구성

  • NVIDIA TITAN RTX 24GB × 2
  • NVIDIA GeForce GTX 1060 6GB × 1
  • 학습 시에는
 
CUDA_VISIBLE_DEVICES="0,1"

로 설정하여 0, 1번 TITAN RTX만 사용하고, 1060은 제외한다.

시스템/소프트웨어 환경

  • CPU: Xeon E5-2697v2
  • RAM: 1.5TB 대용량 메모리
  • 가상환경: Conda KDT_Academy
  • 주요 라이브러리
    • PyTorch
    • Hugging Face Transformers / Datasets / Tokenizers


2. 사용 데이터셋과 분할 작업

2-1. 데이터셋 개요

데이터는 한국어–영어 기술과학 분야 병렬 말뭉치(Parallel Corpus) 다.
형태는 아주 단순하다.

  • src : 한국어 문장
  • tgt : 영어 문장

전체 규모는 대략 132만 문장쌍이며, DatasetDict 기준으로 다음과 같이 나뉜다.

  • Train : 1,080,129 문장쌍
  • Validation : 120,015 문장쌍
  • Test : 150,018 문장쌍

도메인은 일반 문장을 기반으로 한 과학·기술 분야 문장이 담겨져 있다.


2-2. 전처리 & 분할 전략

전처리(예시)

  • 공백/제어문자/이상 문자 정리
  • 너무 긴 문장 또는 너무 짧은 문장 필터링
  • 필요 시 중복 샘플 제거

분할 전략

  • Train / Validation / Test를 명확히 분리하여 데이터 누수 방지
  • 역할은 다음과 같다.
세트 용도
Train 모델 파라미터 학습
Validation 학습 중 성능 모니터링, 튜닝 기준
Test 최종 번역 성능 평가(BLEU 등)
  • 데이터 셋이 train과 validation으로 구성되어 있어, train 셋을 9:1의 비율로 train:valid로 나눠 구성하였으며, validation 셋을 test로 전환하여 세팅하였다.

3. 현재 학습 진행 과정과 시행착오

이번 파인튜닝에서 가장 크게 겪은 문제는 학습률과 디버깅 코드였다.

Hugging Face transformers 의 Trainer가 학습 중에 출력하는 로그

3-1. 초기 세팅에서 터졌던 문제

  1. 너무 큰 learning rate : 5e-05

초기에는 비교적 큰 learning_rate 로 시작했는데,
로그에서 이런 패턴이 반복적으로 나타났다.

  • loss: 0.0
  • grad_norm: nan

학습률을 키울수록 같은 패턴이 심해졌고,
이건 전형적인 수치 폭주 / NaN 문제였다.

→  잘못된 분석 : LR은 grad_norm과 직접적인 관련이 없다.

  1. 학습 시간(ETA)이 비정상적으로 길어짐
  • max_grad_norm = 0.5 를 사용하면서
  • 학습 루프 안에 디버깅용 로그 출력/검증 코드가 과하게 들어가 있었다.
  • 그 결과:
    • 원래는 30시간 안쪽 정도로 끝날 것으로 예상되던 학습이
    • 중간에 ETA가 400시간 이상으로 튀는 상황까지 나타났다.

나중에 확인해 보니,
속도 저하의 직접적인 원인은 gradient clipping 자체가 아니라
매 스텝마다 과도하게 찍던 디버깅 코드였다.


3-2. 문제 해결을 위해 조정한 점

  1. 학습률 안정화
  • learning_rate 를 4e-6 수준으로 내렸고,
  • 그 이후에는 loss, grad_norm이 NaN으로 튀는 현상이 눈에 띄게 줄었다.
  1. 디버깅 코드 정리
  • 꼭 필요한 로깅만 남기고,
    학습 루프 안에서 과하게 호출하던 출력/검증 코드를 제거(또는 주석 처리).
  • 그 결과 ETA가 다시 정상적인 수십 시간 수준으로 돌아왔다.
  1. 현재 세팅 목표
  • max_grad_norm = 0.5 는 유지
  • 두 장의 TITAN RTX를 활용해서 실효 배치 크기를 확보
  • 전체 학습을 2일 안에 완주하는 것을 목표로
    • batch_size
    • gradient_accumulation_steps
    • num_train_epochs
      조합을 조정 중이다.

3-3. 앞으로의 단기 계획

  • 현재 안정화된 세팅(LR=4e-6 등)으로 1차 full train 완주 목표.
  • Validation 기준 성능(BLEU, chrF 등)을 로그로 남기기