EVA-02 모델의 Git 버전 관리 전략: 협업 개발 및 모델 반복 관리
EVA-02 모델을 기반으로 한 AI 프로젝트에 참여 중이라면, 미세 조정(fine-tuning), 배포 또는 애플리케이션 개발 과정에서 다음과 같은 상황을 자주 마주하게 됩니다. 동료 A가 모델 구성 파일을 변경해 실험 결과를 재현할 수 없게 만들었거나, 여러 가지 다른 프롬프트 템플릿을 시도했지만 일주일 후 어느 것이 가장 효과적이었는지 기억하지 못했습니다. 또한 몇백 GB 크기의 모델 가중치 파일을 저장소에 업로드해 프로젝트 클론이 매우 느려졌습니다.
이러한 문제들은 기본적으로 버전 관리 부족에서 비롯된 것입니다. 이번 문서에서는 복잡한 모델 원리를 다루지 않고, EVA-02 프로젝트를 효율적으로 관리하기 위한 중요한 실무 방법인 Git 활용법에 대해 논의합니다.
1. EVA-02 프로젝트에 Git이 필요한 이유
코드 관리를 위해 Git을 사용하는 것은 당연한 일이지만, 특히 AI 프로젝트와 같이 대량의 구성 파일, 실험 스크립트 및 데이터를 포함하는 경우 Git의 역할은 단순히 코드 관리 이상입니다.
우선, AI 프로젝트의 출력물은 코드뿐만 아니라 실험 자체입니다. 초매개변수(hyperparameter) 조정, 데이터 전처리 방식 변경, 새로운 프롬프트 시도 등 각각 독립적인 실험이며, Git의 브랜치 기능을 통해 이러한 실험들을 안전한 "샌드박스" 환경에서 자유롭게 탐구할 수 있습니다.
둘째, 협업에서 발생하는 문제를 해결할 수 있습니다. 예를 들어, config.yaml과 같은 모델 구성 파일이나 데이터 로드 논리, 학습 스크립트는 종종 여러 사람이 동시에 수정해야 합니다. 버전 관리가 없다면 "내 컴퓨터에서는 잘 작동한다"라는 고전적인 문제가 발생할 수 있습니다. Git은 누가 언제 어떤 이유로 특정 코드를 수정했는지를 명확히 기록함으로써 이러한 문제를 근본적으로 해결합니다.
마지막으로, 자산 관리와 실험 재현성 측면에서도 중요합니다. 몇 일씩 걸리는 모델 학습으로 생성된 로그, 중간 체크포인트, 최종 가중치는 소중한 자산이며, 이를 Git을 통해 정확히 추적하고 재현 가능한 상태를 유지할 수 있습니다.
2. 프로젝트 초기화 및 저장소 구조 설계
Git 저장소를 초기화하기 전에 적절한 디렉토리 구조를 설계하는 것이 중요합니다. 아래는 권장되는 기본 구조입니다:
eva02-project/
├── .gitignore
├── README.md
├── configs/
│ ├── model/
│ │ ├── eva02_base.yaml
│ │ └── eva02_large.yaml
│ ├── experiment/
│ │ ├── finetune_coco.yaml
│ │ └── inference_demo.yaml
│ └── data/
│ └── dataset_preprocess.yaml
├── scripts/
│ ├── train.py
│ ├── evaluate.py
│ └── preprocess_data.py
├── prompts/
│ ├── image_captioning/
│ │ ├── detailed.jinja2
│ │ └── concise.jinja2
│ └── vqa/
│ └── zero_shot.jinja2
├── requirements.txt
└── docs/
└── experiment_log.md
설계 목적:
configs/: 모델 구조, 실험 설정, 데이터 처리 등을 YAML 또는 JSON 형식으로 분류하여 관리.scripts/: 모든 실행 가능한 Python 스크립트를 저장.prompts/: 프롬프트 템플릿을 관리하며 Jinja2와 같은 템플릿 엔진을 사용하면 유연성을 확보.docs/: 주요 실험 로그를 Markdown 형식으로 기록.
이 구조를 바탕으로 Git 저장소를 초기화합니다:
# 프로젝트 디렉토리로 이동
cd eva02-project
# Git 저장소 초기화
git init
# 디렉토리 구조 생성
mkdir -p configs/model configs/experiment configs/data scripts prompts/image_captioning prompts/vqa docs
# README와 .gitignore 파일 생성
touch README.md .gitignore
# 파일 추가 및 초기 커밋
git add .
git commit -m "Initial commit: Basic project structure for EVA-02"
3. 핵심 파일 관리 및 .gitignore 설정
3.1 모델 구성 파일 관리
예시 YAML 구성 파일:
experiment:
name: "eva02_base_finetune_coco_captioning"
seed: 42
model:
pretrained_name: "eva02_base_patch14"
checkpoint_path: null # 초기 학습 시에는 null
trainable_layers: ["visual.fc", "head"] # 마지막 몇 계층만 학습
data:
train_dataset: "coco_2017_train"
val_dataset: "coco_2017_val"
image_dir: "/datasets/coco/images"
annotation_path: "/datasets/coco/annotations"
training:
batch_size: 32
num_epochs: 10
learning_rate: 1e-4
optimizer: "AdamW"
scheduler: "cosine"
logging:
output_dir: "/experiment_outputs/eva02_coco_01" # Git으로 추적하지 않음
log_interval: 100
3.2 프롬프트 템플릿 관리
Jinja2를 활용한 예제:
{# prompts/image_captioning/detailed.jinja2 #}
이미지를 상세히 설명하세요.
이 이미지는 다음 내용을 포함합니다:
{% if objects %}
객체들: {{ objects|join(', ') }}.
{% endif %}
장면, 인물 행동, 감정적 분위기 및 세부 사항 네 가지 측면에서 설명해주세요.
이미지: [IMAGE]
3.3 효과적인 .gitignore 설정
.gitignore 예시:
# .gitignore
# 모델 가중치 및 체크포인트
*.bin
*.pth
*.pt
*.safetensors
checkpoints/
models/
# 실험 출력 디렉토리
experiment_outputs/
outputs/
runs/
logs/
# 데이터셋
data/raw/
data/processed/
datasets/
*.h5
*.tfrecord
*.npz
# 환경 및 IDE
.vscode/
.idea/
__pycache__/
*.py[cod]
*$py.class
.env
venv/
env/
# 시스템 파일
.DS_Store
Thumbs.db
# 대용량 로그 파일
*.log
4. 협업 개발 프로세스: 브랜치 전략 및 코드 리뷰
4.1 브랜치 전략
main브랜치: 항상 안정적인 상태 유지.develop브랜치: 선택사항으로 모든 새로운 기능은 여기서 통합 후 테스트.feature/*브랜치: 각 작업별로 독립적으로 관리.
예시:
# 새로운 기능 브랜치 생성
git checkout main
git pull origin main
git checkout -b feature/new-lr-scheduler
4.2 코드 리뷰 및 Pull Request
PR을 통해 코드 리뷰를 진행하며, 실험 결과와 코드 변경 사항을 논의합니다.
5. 실험 관리 및 버전 추적
Git을 활용해 실험 생명주기를 관리합니다. 각 실험마다 독립적인 브랜치를 생성하고, 실험 결과를 docs/experiment_log.md에 기록합니다.