본문 바로가기
Development/GCP, AWS

Gemini Supervised Tuning (SFT, TuningJobs, 파인튜닝 후기)

by 남디윤 2025. 9. 29.

안녕하세요 남디윤입니다 :)

오랜만에 블로그에 글을 작성하네요..!

일상 글로 근황을 곧 풀어보는 것으로 하고 오늘은 Gemini Supervised Tuning(SFT)에 대해 정리해보려고 합니다!

 

목차

데이터셋

학습 관련 사항

TuningJobs (학습 관리)

학습 후기

Gemini 튜닝이 적합한 경우

 

 

 

Gemini Supervised Tuning

  • Gemini를 주로 추론용으로 사용하는게 일반적인데, 저희 회사에서는 필요가 있어 학습을 진행하게 되었습니다. 그 과정에서 알게된 사항들을 공유드리고자 합니다. (구글 도큐멘테이션이 워낙 혼재되어 있고 검색해도 바로바로 안나오는 경우도 많기에..!)
  • 튜닝을 하는 경우가 워낙 드물어서 레딧이나 포럼에도 글이 많은 편이 아닙니다.. 혹시 관련해서 트러블슈팅하시거나 아시는 부분 있으시면 같이 공유해요 ㅎㅎ

 

 

데이터셋

  • 형식: jsonl
  • 업로드 경로: GCS (Google Cloud Storage)
  • Parts 형식
    • 텍스트 길이 제한은 한 text기준(전체x) 공식적으로 8192 토큰이라고 안내, 실제로는 초과해도 에러가 발생 X.
    • 다만 지나치게 긴 입력은 학습에 부정일 것으로 예상 → 본인” 텍스트를 3개 파트로 나누어 업로드.
  • 이미지: 가능하다면 GCS에 업로드 후 GCS 경로 참조하는 것을 추천 (이미지 https 주소 참조 가능하긴 함)
{'contents': [{'role': 'user',
   'parts': [{'text': '[Task]\n첨부한 디자인 템플릿을 분석하여...'},
    {'text': '[Code to Choose]\n<object_category>....</object_category>\n'},
    {'text': 'Let\'s think a bit step by step. After think step by step ...'},
    {'fileData': {'mimeType': 'image/jpeg',
      'fileUri': 'gs://test-dp-mdi/jy_test/train_images/design_idx_589602_0.jpeg'}}]},
  {'role': 'model', 'parts': [{'text': '{"object_choices": ["O00-00"]}'}]}]}

 

 

학습 관련 사항

  • 방식: 지도학습(Supervised Learning)만 지원.
  • 튜닝 기법: LoRA 기반 튜닝.
  • 하이퍼파라미터:
    • 어댑터 크기
    • epoch
    • learning rate
    • (옵션은 많지 않음)
  • 재학습 불가: 한 번 학습된 모델은 다시 이어서 학습할 수 없음.

 

 

TuningJobs (학습 관리)

  • 실행 환경: 현재는 Vertex AI에서만 학습 가능.
    • 예전에는 Gemini Developer API를 통해서도 가능했으나, 현재는 Vertex AI 관리형 서비스만 지원.
    • 인스턴스 직접 선택 불가(api 형태로만 job 지원).
  • 개념
    • 학습(Job): 모델 파라미터를 실제로 업데이트하여 결과물을 생성하는 과정.
    • 실험(Experiment): 여러 학습 시도를 조직적으로 관리하고 비교·분석하는 프레임워크.
      • 실험 이름(exp name) 하위에 여러 Tuning Job(TuningJobId)이 속함.
      • 각 Job 결과로 Model(id/name@version)이 생성됨.
      • Gemini는 지속적 학습(continual learning)을 지원하지 않으므로 모델 버전은 @1만 존재.
    • Experiment (exp name) 안에서 → 여러 Tuning job (TuningJob)이 돌고 → 그 결과로 Model (id/name@version)이 생성
from google import genai
sft_tuning_job = client.tunings.tune(
        base_model=BASE_MODEL,
        training_dataset=training_dataset,
        config=types.CreateTuningJobConfig(
            tuned_model_display_name=args.exp_name,
            validation_dataset=validation_dataset,
            epoch_count=args.epoch_count
        ),
    )

 

 

  • 지표 관리
    • 기본적으로 TensorBoard와 연동되어 있음. (별도 설정도 가능)
    • MLflow처럼 로컬 인프라를 쓰는 것이 아니라 Vertex AI API로 지표를 요청·기록 필요
run_name = sft_tuning_job.experiment.split("/")[-1]
my_runs = aiplatform.ExperimentRun.list(experiment=run_name)
my_run = aiplatform.ExperimentRun(run_name.replace('tuning-experiment', 'tuning-experiment-run'), experiment=run_name)
log_df = my_run.get_time_series_data_frame()
log_df = log_df.rename(columns=lambda x: x.lstrip("/"))
for _, row in log_df.iterrows():
    step = int(row["step"])
    for col in log_df.columns:
        if col not in ["step", "wall_time"]:
            val = row[col]
            if pd.isna(val):  # NaN이면 건너뜀
                continue
            mlflow.log_metric(col, float(val), step=step)

 

 

  • 진행 방식
    1. TuningJob 제출 시 데이터셋 검증이 먼저 수행됨.
      • 이미지의 경우 한 번에 열려야 하며, 요청(Request) 에러가 나면 검증 실패 처리됨.
    2. 검증 완료 후 학습 queue에 올라감. (즉시 시작되지 않음)
    3. Queue 대기 시간이 불확실함.
      • 보통 1시간 내 시작되지만, Reddit/Google AI Forum 사례에 따르면 이틀 이상 대기하는 경우도 있음.
      • 이 경우, Job을 취소 후 다시 제출하는 것이 더 나은 방법.
  • 추론(Serving)
    • 배치 추론 지원.
    • 캐시 가능하다고 알려져 있으나, Gemini 환경에서는 캐시 설정이 잘 작동하지 않는 경우 많음(백로그).

 

 

학습 후기

  • 효과
    • 기대 대비 성능 향상은 제한적.
    • 예: 베이스라인 점수 63 → 튜닝 후 70 정도.
    • 특정 라벨·정보를 반복 학습시켜도 기억력이 약해 retention이 떨어짐.
    • Reddit 등 커뮤니티에서도 학습 효과에 의문을 제기하는 글이 있음.
  • 제어된 생성(Controlled Generation)
    • 학습 데이터 자체는 그대로 반영되지만(별도의 instruction이 합쳐져서 학습되는 것은 아님),
    • 추론 시에는 Google이 설정한 기본 지시문이 항상 함께 적용됨.
    • Vertex AI 환경의 안전성 레이어(content filter, 안전 지시문)가 기본적으로 활성화됨.
      • 성적 콘텐츠, 욕설 등은 회피 처리됨.

 

 

Gemini 튜닝이 적합한 경우

  • 도메인 튜닝이 필요한 경우 → 정확도를 조금이라도 높이는 것이 의미가 있을 때.
  • 대규모 워크플로우/배치 처리가 필요한 경우 → Gemini API 비용이 별도 모델 서빙보다 저렴할 수 있음.
  • 멀티모달 + Long context 활용이 필요한 경우 → 오픈소스 LLM보다 긴 문맥 처리에 강점.
    • 특히 Gemini는 롱컨텍스트 성능이 우수함.