Visual Question Answering (VQA) ์ฑ๋ฆฐ์ง๋ฅผ ์ํ ๋จ์ผ ํตํฉ ๋ ธํธ๋ถ ํ๋ก์ ํธ์ ๋๋ค.
- ๋ชจ๋ธ: Qwen2.5-VL (3B/7B) + QLoRA
- ๋ชฉํ ์ ํ๋: 85-88% (Top 10%)
- ํ๊ฒฝ: T4 GPU ์๋ฒฝ ํธํ
- ํน์ง: ๋ชจ๋ ๊ธฐ๋ฅ์ด ํ๋์ ๋ ธํธ๋ถ์ ํตํฉ
Kaggle_AllInOne_Pro.ipynb - ์ ์ฒด ํ์ดํ๋ผ์ธ ํตํฉ ๋
ธํธ๋ถ
์ด ๋ ธํธ๋ถ ํ๋๋ก ๋ชจ๋ ๊ฒ์ด ๊ฐ๋ฅํฉ๋๋ค:
- โ ํ๊ฒฝ ์ค์ ๋ฐ ํจํค์ง ์ค์น
- โ Config ํตํฉ ๊ด๋ฆฌ
- โ ๋ฐ์ดํฐ ๋ก๋ ๋ฐ EDA
- โ Stratified K-Fold CV
- โ ๊ณ ๊ธ ํ์ต ๋ฃจํ (AMP, EMA, SWA, Cosine Warmup)
- โ TTA ์ถ๋ก
- โ ์์๋ธ
- โ ์ ์ถ ํ์ผ ์์ฑ
251023_Baseline.ipynb - ๊ฒฝ์ ๋ฒ ์ด์ค๋ผ์ธ ์ฝ๋ (์ฐธ๊ณ ์ฉ)
- โ Float16 (BFloat16 ๋์ )
- โ SDPA Attention (FlashAttention ์ ๊ฑฐ)
- โ 4-bit QLoRA
- โ Gradient Checkpointing
- โ Assistant ๋ฉ์์ง์ ์ ๋ต ํฌํจ
- โ
add_generation_prompt=False์ฌ์ฉ - โ ์ ๋ต ํ ํฐ ์์น ์ ํํ ํ์ต
- โ AMP (Automatic Mixed Precision)
- โ EMA (Exponential Moving Average)
- โ SWA (Stochastic Weight Averaging)
- โ Cosine Warmup Scheduler
- โ Gradient Clipping
- โ Stratified K-Fold (๋ต๋ณ ๋ถํฌ ์ ์ง)
- โ 3-Fold ๊ธฐ๋ณธ ์ค์
- โ Fold๋ณ ๋ ๋ฆฝ ํ์ต
- โ Test-Time Augmentation ์ง์
- โ Majority Voting ์์๋ธ
- โ Weighted Ensemble ์ต์
| ์ค์ | ์ ํ๋ | ํ์ต ์๊ฐ | ๋ ธํธ |
|---|---|---|---|
| Baseline (200 samples) | 60-65% | ~20min | ๋น ๋ฅธ ํ ์คํธ |
| Single Fold (3B, full data) | 75-78% | ~2h | ๋จ์ผ ๋ชจ๋ธ |
| 3-Fold Ensemble (3B) | 79-82% | ~6h | ์์๋ธ |
| 3-Fold Ensemble (7B) | 83-85% | ~12h | ๊ณ ์ฑ๋ฅ |
| + TTA + Optimization (7B) | 85-88% | ~15h | ์ต๊ณ ์ฑ๋ฅ |
SSAFY_AI_PJT_2025/
โโโ ๐ Kaggle_AllInOne_Pro.ipynb โญ ๋ฉ์ธ ํตํฉ ๋
ธํธ๋ถ
โโโ ๐ 251023_Baseline.ipynb ์ฐธ๊ณ ์ฉ ๋ฒ ์ด์ค๋ผ์ธ
โโโ README.md ์ด ํ์ผ
โโโ PROJECT_SUMMARY.md ํ๋ก์ ํธ ์์ฝ
โโโ requirements.txt ํจํค์ง ๋ชฉ๋ก
โโโ install.sh ์๋ ์ค์น ์คํฌ๋ฆฝํธ
โโโ data/ ๋ฐ์ดํฐ ํด๋
โ โโโ train.csv
โ โโโ test.csv
โ โโโ sample_submission.csv
โโโ experiments/ ์คํ ๊ฒฐ๊ณผ ์ ์ฅ
โ โโโ README.md
โโโ checkpoints/ ๋ชจ๋ธ ์ฒดํฌํฌ์ธํธ (ํ์ต ํ ์์ฑ)
โโโ outputs/ ์ ์ถ ํ์ผ (์ถ๋ก ํ ์์ฑ)
โโโ logs/ ํ์ต ๋ก๊ทธ (์ ํ)
# Kaggle_AllInOne_Pro.ipynb์ ์ฒซ ๋ฒ์งธ ์ฝ๋ ์
์คํ
!pip install -q "transformers>=4.44.2" "accelerate>=0.34.2" "peft>=0.13.2" \
"bitsandbytes>=0.43.1" datasets pillow pandas torch torchvision \
scikit-learn matplotlib seaborn tqdm --upgrade
!pip install -q qwen-vl-utils==0.0.8
# ๋ฐํ์ ์ฌ์์Colab์ ๊ฒฝ์ฐ:
from google.colab import drive
drive.mount('/content/drive')
# ๋ฐ์ดํฐ ์์ถ ํด์
!unzip "/content/drive/My Drive/data.zip" -d "/content/"Kaggle์ ๊ฒฝ์ฐ:
- Add Data โ Upload Dataset
๋ ธํธ๋ถ์ Config ์ ์์ ํ์ดํผํ๋ผ๋ฏธํฐ ์กฐ์ :
class Config:
# ๋ชจ๋ธ ์ค์
MODEL_ID = "Qwen/Qwen2.5-VL-3B-Instruct" # ๋๋ 7B
IMAGE_SIZE = 384 # 384, 512, 768
# K-Fold ์ค์
N_FOLDS = 3
USE_KFOLD = True
# ํ์ต ์ค์
NUM_EPOCHS = 1 # ์ค์ : 3~5
BATCH_SIZE = 1
GRAD_ACCUM_STEPS = 4
LEARNING_RATE = 1e-4
# ๊ณ ๊ธ ๊ธฐ๋ฒ
USE_AMP = True
USE_EMA = True
USE_SWA = False
USE_TTA = False
# ์ํ๋ง (๋๋ฒ๊น
)
USE_SAMPLE = True # False: ์ ์ฒด ๋ฐ์ดํฐ
SAMPLE_SIZE = 200๋ ธํธ๋ถ์ ๋ชจ๋ ์ ์ ์์๋๋ก ์คํ:
- ํ๊ฒฝ ์ค์
- Config
- ๋ฐ์ดํฐ ๋ก๋ & EDA
- K-Fold ์์ฑ
- Dataset ์ ์
- ๋ชจ๋ธ ๋ก๋
- ํ์ต
- ์ถ๋ก
- ์์๋ธ
- ๊ฒฐ๊ณผ ๋ถ์
outputs/submission_ensemble.csv (๋๋ submission_single.csv) ํ์ผ์ ๋ค์ด๋ก๋ํ์ฌ ์ ์ถ
USE_SAMPLE = True
SAMPLE_SIZE = 200
NUM_EPOCHS = 1
USE_KFOLD = FalseUSE_SAMPLE = False
NUM_EPOCHS = 3
USE_KFOLD = False
MODEL_ID = "Qwen/Qwen2.5-VL-3B-Instruct"USE_SAMPLE = False
NUM_EPOCHS = 3
USE_KFOLD = True
N_FOLDS = 3
MODEL_ID = "Qwen/Qwen2.5-VL-7B-Instruct" # ๊ณ ์ฑ๋ฅUSE_SAMPLE = False
NUM_EPOCHS = 5
USE_KFOLD = True
N_FOLDS = 3
MODEL_ID = "Qwen/Qwen2.5-VL-7B-Instruct"
IMAGE_SIZE = 512 # ๋๋ 768
USE_EMA = True
USE_SWA = True
USE_TTA = True
TTA_SCALES = [0.9, 1.0, 1.1]- Float16 ์ฌ์ฉ (BFloat16 ์๋) - T4๋ BF16 ๋ฏธ์ง์
- SDPA Attention (FlashAttention ์ ๊ฑฐ) - T4 ์ต์ ํ ๋ถ๊ฐ
- 4-bit Quantization - ๋ฉ๋ชจ๋ฆฌ ํจ์จ
์ด๊ฒ์ด ๊ฐ์ฅ ์ค์ํ ์์ ์ฌํญ์ ๋๋ค!
โ ์๋ชป๋ ๋ฐฉ๋ฒ (ํ์ต/์ถ๋ก ๋ถ์ผ์น):
# ํ์ต ์ ์ ๋ต ์์ด ํ์ต
messages = [
{"role": "user", "content": [...]},
]
text = processor.apply_chat_template(messages, add_generation_prompt=True)โ ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ (๋ผ๋ฒจ ์ ๋ ฌ):
# ํ์ต ์ ์ ๋ต ํฌํจ
messages = [
{"role": "user", "content": [...]},
{"role": "assistant", "content": [{"type": "text", "text": "a"}]} # ์ ๋ต!
]
text = processor.apply_chat_template(messages, add_generation_prompt=False) # False!- Seed 42๋ก ๊ณ ์
torch.backends.cudnn.deterministic = True
- Gradient Checkpointing ํ์ฑํ
- Batch Size 1 + Gradient Accumulation 4
A: ๋ค์์ ์๋ํ์ธ์:
BATCH_SIZE = 1๋ก ๊ฐ์IMAGE_SIZE = 384๋ก ๊ฐ์MODEL_ID๋ฅผ 3B๋ก ๋ณ๊ฒฝUSE_EMA = False,USE_SWA = False
A:
USE_SAMPLE = True,SAMPLE_SIZE = 200์ผ๋ก ๋น ๋ฅธ ํ ์คํธNUM_EPOCHS = 1๋ก ๊ฐ์USE_KFOLD = False๋ก ๋จ์ผ ๋ชจ๋ธ ํ์ต
A:
NUM_EPOCHS์ฆ๊ฐ (3~5)MODEL_ID๋ฅผ 7B๋ก ๋ณ๊ฒฝIMAGE_SIZE์ฆ๊ฐ (512, 768)USE_KFOLD = True๋ก ์์๋ธUSE_EMA = True,USE_TTA = True
A: ๋ชจ๋ ์ฝ๋๊ฐ Kaggle_AllInOne_Pro.ipynb ๋
ธํธ๋ถ์ ํตํฉ๋์ด ์์ต๋๋ค. ๋ณ๋ ์คํฌ๋ฆฝํธ ํ์ผ์ด ํ์ ์์ต๋๋ค.
- Qwen2.5-VL ๊ณต์ ๋ฌธ์: https://huggingface.co/Qwen/Qwen2.5-VL-7B-Instruct
- PEFT (LoRA): https://huggingface.co/docs/peft
- Transformers: https://huggingface.co/docs/transformers
- โ
scripts/ํด๋ โ โ ๋ ธํธ๋ถ์ ํตํฉ - โ
config/ํด๋ โ โ Config ํด๋์ค๋ก ํตํฉ - โ
notebooks/VQA_Training_Complete.ipynbโ โKaggle_AllInOne_Pro.ipynb๋ก ๋์ฒด
- โ EMA (Exponential Moving Average)
- โ SWA (Stochastic Weight Averaging)
- โ Cosine Warmup Scheduler
- โ TTA (Test-Time Augmentation)
- โ ํตํฉ Config ๊ด๋ฆฌ
- โ ์๋ EDA & ์๊ฐํ
- โ T4 ํธํ์ฑ (Float16, SDPA)
- โ ๋ผ๋ฒจ ์ ๋ ฌ ๊ต์
- โ Stratified K-Fold
- โ QLoRA (4-bit)
- โ Gradient Checkpointing
- ์คํ ๊ด๋ฆฌ:
experiments/ํด๋์ ์คํ ๋ก๊ทธ ์ ์ฅ - ํ์ดํผํ๋ผ๋ฏธํฐ ์ต์ ํ: Optuna ๋ฑ ํ์ฉ
- ์์๋ธ ๊ฐ์ : Weighted Voting, Stacking
- ๋ฐ์ดํฐ ์ฆ๊ฐ: Choice Shuffle, Paraphrase
- ์๋ฌ ๋ถ์: ์์ธก ์คํจ ์ํ ๋ถ์
- GitHub Issues: ํ๋ก์ ํธ ๊ด๋ จ ์ง๋ฌธ
๐ค SSAFY AI Project 2025
โญ ํ์ด์ ๋น๋๋ค!