VLM_math [2] SFT

Leejaegun·2025년 4월 13일

VLM_reasoning

목록 보기
2/3

Qwen-VL이라는 Vision-Language Model(VLM)에 Supervised Fine-Tuning(SFT)을 수행하기까지의 전 과정을 체계적으로 정리하면 다음과 같습니다.

✅ 1. 목표 및 배경 설정

  • 모델: Qwen-VL (비전-언어 모델, Multimodal LLM)
  • 학습 목적: 특정 도메인이나 태스크에 특화된 멀티모달 Reasoning 성능 향상
  • 데이터: Video-R1 데이터셋 (예시: video-R1-cot-165k.json, video-R1-260k.json 등)

✅ 2. 데이터셋 준비 및 전처리

① 원본 데이터셋 확보

  • 비디오 기반의 멀티모달 데이터셋 확보(Video-R1 등)
  • JSON 형태로 구성된 원본 데이터셋 확인
{
    "video": "비디오 경로 또는 URL",
    "prompt": "입력 프롬프트",
    "answer": "기대되는 정답 또는 출력"
}

② 데이터 전처리 (process_vision_info)

  • qwen-vl-utils 라이브러리를 사용하여 영상 또는 이미지를 Vision Token으로 변환
  • 프레임 추출 및 Vision Encoder를 통해 비전 임베딩 생성

③ SFT 포맷으로 데이터셋 변환

  • SFT가 가능한 형식으로 변환 (input-output 쌍)
  • 예시:
{
    "input": "<Vision Tokens> + Prompt",
    "output": "Reasoning based Answer"
}

✅ 3. 모델 준비 및 환경 설정

① 베이스 모델 로딩

  • Huggingface transformers 라이브러리를 사용하여 Qwen-VL 모델 로딩
from transformers import AutoModelForCausalLM, AutoTokenizer

model_name = "Qwen/Qwen-VL"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name)

② 환경 설정

  • 필요한 라이브러리 및 의존성 설치
pip install transformers accelerate trl wandb torchvision flash_attn
  • GPU 환경 세팅(CUDA, Multi-GPU 환경 구축)
  • flash_attn 등 효율적 Attention 라이브러리 설정을 통해 메모리 최적화

✅ 4. SFT 학습 수행

① 학습 스크립트 작성

  • sft_video.py 등의 커스텀 스크립트를 이용하여 SFT 학습 수행
  • Training Loop 예시:
from trl import SFTTrainer
from transformers import TrainingArguments

training_args = TrainingArguments(
    output_dir="./output",
    learning_rate=1e-6,
    per_device_train_batch_size=1,
    gradient_accumulation_steps=8,
    num_train_epochs=3,
    gradient_checkpointing=True,
    report_to="wandb"
)

trainer = SFTTrainer(
    model=model,
    tokenizer=tokenizer,
    args=training_args,
    train_dataset=train_dataset,
    eval_dataset=eval_dataset,
)

trainer.train()

② 효율적 학습 전략 수립

  • Multi-GPU 환경 활용(Distributed Data Parallel, accelerate)
  • Gradient Checkpointing 사용으로 메모리 사용량 최적화
  • WandB를 이용한 학습 모니터링 및 로깅

✅ 5. 학습 중 문제 해결

  • 학습 중 자주 발생하는 오류 해결 사례:
    | 문제 상황 | 원인 | 해결 방법 |
    |---|---|---|
    | Out of Memory | 비디오 입력이 너무 큼 | 비디오 프레임 수나 크기 줄이기, Gradient Accumulation 적용 |
    | CUDA Indexing 오류 | 비디오 데이터 indexing 문제 | CUDA_LAUNCH_BLOCKING=1로 디버깅 후 데이터셋 확인 및 재구성 |
    | 모듈 Import 문제 | 라이브러리 버전 불일치 | 특정 버전 지정하여 재설치 (flash_attn==2.7.0.post2) |

✅ 6. SFT 학습 완료 및 평가

① 최종 모델 평가

  • Validation 데이터셋을 활용한 성능 평가 (BLEU, CIDEr 등)
  • WandB를 활용하여 학습 결과 분석 및 시각화

② 모델 저장 및 배포 준비

  • 학습 완료된 모델 저장
model.save_pretrained("Qwen-VL-SFT-finetuned")
tokenizer.save_pretrained("Qwen-VL-SFT-finetuned")

📌 최종 요약 및 흐름도

graph TD
A[원본 데이터셋 확보] --> B[비전 데이터 전처리 및 Vision Token 생성]
B --> C[SFT 데이터셋 변환]
C --> D[모델 및 환경 설정]
D --> E[SFT 학습 수행]
E --> F[학습 중 발생하는 오류 해결]
F --> G[최종 평가 및 모델 저장]

이러한 체계적인 프로세스를 통해 Qwen-VL 모델에 대한 성공적인 Supervised Fine-Tuning을 진행할 수 있습니다.

profile
Lee_AA

0개의 댓글