SSAFY AI 챌린지 / repo 기준 정리

모델 이름보다
내가 어떻게 굴렸는지가
먼저 보이게

발표용으로 다시 정리한 페이지입니다. repo와 git log를 보면서, 어떤 모델을 썼는지보다 어떤 구조로 바꿨고, 어디를 직접 손봤는지가 먼저 읽히게 구성했습니다.

commit 9개 핵심 notebook 3개 운영형 + 학습형 분리
정리한 기준

처음에는 모델을 크게 잡아봤고, 이후에는 제출 운영에 맞게 더 가볍고 안정적인 구조로 줄여 갔습니다. 그래서 이 페이지도 모델 스펙보다 구조 변화와 운영 흔적이 먼저 보이게 정리했습니다.

한눈에 보기

발표에서 먼저 보여줄 네 가지

공지 기준이 “학습한 내용, 적용 기법, 현재까지 적용한 결과” 중심이라서, 페이지도 그 흐름대로 바로 읽히게 정리했습니다.

문제 형태

이미지와 객관식 보기를 함께 읽고 정답을 고르는 멀티모달 MCQA 문제입니다.

전체 접근

운영형 추론 notebook과 학습형 LoRA notebook을 분리해서, 제출용 흐름과 실험용 흐름을 섞지 않았습니다.

내가 직접 손본 부분

정답 파싱, item 로그, backup, resume, validation split, adapter 분리 추론 같은 운영부를 직접 정리했습니다.

발표 핵심

모델 이름을 나열하기보다 27B → 35B → 9B, 그리고 Gemma QLoRA로 확장된 이유를 흐름으로 보여주는 게 좋습니다.

직접 구현

코드에서 바로 보이는 내 작업

이 페이지에서 가장 먼저 강조할 부분입니다. 단순히 모델만 바꾼 게 아니라, 실제로 돌리고 다시 이어갈 수 있게 만드는 작업이 코드에 남아 있습니다.

출력 형식 통제

JSON answer, one-letter answer, invalid fallback 처리까지 넣어서 제출 형식을 강하게 고정했습니다.

item 단위 로그

row마다 JSON 로그를 남기고 progress.csv를 따로 유지해서 중간 상태를 확인할 수 있게 했습니다.

다시 이어서 실행

backup, checkpoint, resume, merge 유틸을 넣어서 중간에 끊겨도 이어서 돌릴 수 있게 했습니다.

프롬프트 모드 제어

reasoning / non-thinking 흐름을 분리하고 chat template로 답변 스타일을 제어했습니다.

학습 안정화

fixed validation split, early stopping, gradient checkpointing 쪽을 계속 손보며 학습 흐름을 정리했습니다.

추론 분기 정리

adapter가 없어도 base / it 모델 자체로 inference 가능한 경로를 따로 만들었습니다.

구조

코드는 이런 흐름으로 읽힙니다

notebook이 세 개로 갈라져 있어도 공통 흐름은 같습니다. 발표 때는 먼저 아래 파이프라인을 보여주고, 그다음 각 실험 트랙 차이를 붙이면 정리가 깔끔합니다.

입력 데이터

train.csv / test.csv
train·test image 폴더

프롬프트 구성

choice prompt
reasoning / non-thinking 제어

모델 실행

운영형 추론 / LoRA 학습
Qwen · Gemma 실험 분기

정답 파싱

strict answer letter
JSON fallback 처리

로그 / 제출

item JSON log / progress.csv
backup / submission.csv

Track A

운영형 추론

Qwen 9B 4bit 기반으로 끝까지 돌리는 제출용 baseline입니다.

  • 정답 파서와 fallback
  • backup / merge / progress 관리

Track B

Qwen LoRA

Qwen 27B non-thinking 설정으로 학습형 실험을 분리한 트랙입니다.

  • assistant answer 중심 loss
  • hybrid LoRA target 설정

Track C

Gemma QLoRA

validation / early stopping / adapter inference 쪽을 더 다듬은 트랙입니다.

  • fixed valid split
  • resume + early stopping
여기서 강조할 건 모델 크기보다 운영 흔적입니다. 제출만 만드는 코드가 아니라, 중간 결과를 남기고 다시 이어서 돌릴 수 있는 코드라는 점을 보여주기 좋습니다.

실험

repo 안의 세 가지 실험 트랙

같은 문제를 한 방향으로만 밀지 않고, 운영형과 학습형을 나눠서 가져간 흔적이 git log와 notebook 둘 다에 남아 있습니다.

운영형 baseline

Qwen 9B 4bit NF4 A100 40GB

먼저 제출 파이프라인부터 만든 notebook입니다. 답안 포맷, 로그, 백업, merge 흐름이 여기서 정리됩니다.

  • 핵심 : strict answer parsing / retry / backup / merge
  • 기록 방식 : row별 JSON 저장, run_state와 progress.csv 유지
  • 변화 흐름 : 27B 8bit → 35B-A3B → 4bit → 9B 축소

운영 관점에서 보면, 이 트랙은 “더 큰 모델”보다 “끝까지 도는 구조”를 먼저 만든 흐름으로 읽힙니다.

RUN_NAME = "qwen35_9b_4bit_run01"
AUTO_DOWNLOAD_BACKUP = True
MERGE_RUN_NAMES = [RUN_NAME]

Qwen LoRA 실험

Qwen 27B non-thinking LoRA

운영형과 별도로, 학습을 통해 답안을 더 안정적으로 뽑아보려는 트랙입니다. non-thinking 제어와 one-letter answer 정책이 이 notebook의 핵심입니다.

  • 학습 세팅 : bf16 / grad checkpointing / batch 1 / grad accum 8
  • 데이터 : train 90/10 split, assistant 정답 토큰 중심 loss
  • 출력 제약 : a, b, c, d 중 한 글자만 반환

이 트랙에서는 운영형 notebook과 별도로 학습형 실험을 분리해 가져간 판단이 가장 분명하게 드러납니다.

NON_THINKING = True
NUM_EPOCHS = 1
r = 32, alpha = 64, dropout = 0.05

Gemma 31B-it QLoRA

Gemma 31B-it QLoRA early stopping

Gemma 계열로 실험을 확장하면서, 학습 안정성과 추론 분기까지 더 정리한 notebook입니다.

  • 학습 세팅 : valid 10%, train subset 400, epoch 10, grad accum 4
  • 안정성 : eager attention, early stopping, checkpoint resume
  • 추론 : adapter가 없어도 base / it 모델로 inference 가능하게 분리

이 트랙은 모델 변경보다 validation, resume, inference 분기를 어떻게 정리했는지가 핵심입니다.

EARLY_STOP_PATIENCE = 3
ENABLE_VISION_TOWER_LORA = False
ADAPTER_FOR_INFERENCE = None

작업 로그

git log로 다시 읽은 코드 변화

커밋 메시지를 그대로 나열하지 않고, 실제로 코드 의미가 바뀐 지점을 기준으로 다시 묶었습니다. 발표에서는 이 부분이 실험 과정을 가장 잘 보여줍니다.

참고

Jupyter Notebook은 output이 같이 저장돼서 diff line 수가 실제 코드 변화보다 크게 보일 수 있습니다. 그래서 아래에서는 diff 수치무엇이 바뀌었는지를 같이 보게 했습니다.

발표 정리

공지 기준에 맞춰 말하면

배운 것, 지금 적용한 것, 다음에 해볼 것으로 나누면 이번 작업 흐름이 가장 자연스럽게 정리됩니다.

배운 것

  • 멀티모달 chat template와 이미지 + 텍스트 입력 구조
  • reasoning / non-thinking 모드를 나누는 방법
  • LoRA / QLoRA, gradient checkpointing, 양자화 운영 방식
  • 학습용 파이프라인과 제출용 파이프라인을 분리하는 기준

지금 적용한 것

  • strict answer parsing과 fallback 처리
  • item 단위 로그 저장, 재시작 가능한 실행 흐름
  • fixed validation split, checkpoint, early stopping
  • adapter 분리 추론, multiple run merge 유틸

다음에 해볼 것

  • reasoning on/off 비교 실험을 더 체계적으로 분리
  • prompt variant A/B 테스트와 파서 강건성 비교
  • run merge를 넘어서 모델 / adapter ensemble 검토
  • validation 설계를 문제 유형 기준으로 더 세분화
정리

이번 기록에서 가장 중요하게 남기고 싶었던 건, 모델 교체보다 실험이 남고 다시 돌 수 있는 구조를 같이 만들었다는 점입니다.