안녕하세요 남디윤입니다 :)
오랜만에 블로그에 글을 작성하네요..!
일상 글로 근황을 곧 풀어보는 것으로 하고 오늘은 Gemini Supervised Tuning(SFT)에 대해 정리해보려고 합니다!
목차
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)
- 진행 방식
- TuningJob 제출 시 데이터셋 검증이 먼저 수행됨.
- 이미지의 경우 한 번에 열려야 하며, 요청(Request) 에러가 나면 검증 실패 처리됨.
- 검증 완료 후 학습 queue에 올라감. (즉시 시작되지 않음)
- Queue 대기 시간이 불확실함.
- 보통 1시간 내 시작되지만, Reddit/Google AI Forum 사례에 따르면 이틀 이상 대기하는 경우도 있음.
- 이 경우, Job을 취소 후 다시 제출하는 것이 더 나은 방법.
- TuningJob 제출 시 데이터셋 검증이 먼저 수행됨.
- 추론(Serving)
- 배치 추론 지원.
- 캐시 가능하다고 알려져 있으나, Gemini 환경에서는 캐시 설정이 잘 작동하지 않는 경우 많음(백로그).
학습 후기
- 효과
- 기대 대비 성능 향상은 제한적.
- 예: 베이스라인 점수 63 → 튜닝 후 70 정도.
- 특정 라벨·정보를 반복 학습시켜도 기억력이 약해 retention이 떨어짐.
- Reddit 등 커뮤니티에서도 학습 효과에 의문을 제기하는 글이 있음.
- 제어된 생성(Controlled Generation)
- 학습 데이터 자체는 그대로 반영되지만(별도의 instruction이 합쳐져서 학습되는 것은 아님),
- 추론 시에는 Google이 설정한 기본 지시문이 항상 함께 적용됨.
- Vertex AI 환경의 안전성 레이어(content filter, 안전 지시문)가 기본적으로 활성화됨.
- 성적 콘텐츠, 욕설 등은 회피 처리됨.
Gemini 튜닝이 적합한 경우
- 도메인 튜닝이 필요한 경우 → 정확도를 조금이라도 높이는 것이 의미가 있을 때.
- 대규모 워크플로우/배치 처리가 필요한 경우 → Gemini API 비용이 별도 모델 서빙보다 저렴할 수 있음.
- 멀티모달 + Long context 활용이 필요한 경우 → 오픈소스 LLM보다 긴 문맥 처리에 강점.
- 특히 Gemini는 롱컨텍스트 성능이 우수함.
'Development > GCP, AWS' 카테고리의 다른 글
Fast API Docker GCP Cloud Run 배포 (도커 설치부터 배포까지) (3) | 2024.01.25 |
---|---|
[에러 해결] API [sqladmin.googleapis.com] not enabled on project(Cloud SQL PERMISSION DENIED) (0) | 2023.09.06 |