1모델 버전 관리의 중요성

제조 AI 프로젝트에서는 수백 번의 실험을 통해 최적 모델을 찾아냅니다. 각 실험의 하이퍼파라미터, 데이터셋 버전, 학습 결과를 체계적으로 관리하지 않으면 동일한 결과를 재현할 수 없고, 어떤 모델이 프로덕션에 배포되었는지 추적할 수 없습니다.

모델 버전 관리는 실험 추적(Experiment Tracking), 모델 레지스트리(Model Registry), 데이터 버전 관리(Data Versioning)를 포괄하는 MLOps의 핵심 요소입니다. 이를 통해 모델 개발부터 배포까지의 전체 생명주기를 투명하게 관리할 수 있습니다.

재현 가능성(Reproducibility)이 핵심

3개월 전 학습한 모델의 성능을 현재 재현할 수 있어야 합니다. 이를 위해 코드 버전, 데이터 버전, 환경 설정, 난수 시드까지 모두 기록해야 합니다. 버전 관리 시스템은 이 모든 정보를 자동으로 추적합니다.

모델 생명주기 버전 관리
개발
Code Repo
(Git)
v1.2.3
Python 3.10
실험
Experiments
(MLflow)
Run #42
Params, Metrics
검증
Model Registry
(MLflow)
v2.1.0
Staging / Prod
배포
Production
(API)
Serving v2.1.0
REST API
모니터링
Drift Monitor
 
Retrain
Trigger
추적되는 정보
• 코드 버전 (Git commit hash)
• 데이터 버전 (DVC hash)
• 하이퍼파라미터
• 메트릭 (accuracy, F1, loss)
• 아티팩트 (model.pkl 등)
• 환경 (requirements.txt)
• 메타데이터 (실험자, 시간, 태그)

2MLflow 실험 추적

MLflow는 실험 추적, 모델 레지스트리, 모델 서빙을 통합 제공하는 오픈소스 MLOps 플랫폼입니다. 간단한 API로 모든 실험을 자동 기록하고, 웹 UI로 시각화할 수 있습니다.

PSEUDOCODE MLflow 실험 추적
# === MLflow 실험 추적 수도코드 === # 1. 실험 환경 설정 MLflow.서버연결("http://mlflow-server:5000") MLflow.실험생성("defect_detection_cnn") # 2. 실험 실행 시작 실험시작("cnn_v3_augmented"): // 하이퍼파라미터 기록 params = {lr: 0.001, batch: 32, epochs: 50, 모델: "ResNet50"} MLflow.파라미터기록(params) # 3. 학습 루프 에포크 에 대해: 모델.학습모드() 배치 에 대해: 손실 = 모델(입력) vs 정답 역전파() → 가중치_업데이트() // 검증 수행 모델.평가모드() 정확도, F1점수 = 검증세트_평가() // 메트릭 기록 (에포크별) MLflow.메트릭기록("loss", 손실, step=에포크) MLflow.메트릭기록("accuracy", 정확도, step=에포크) # 4. 최종 결과물 저장 MLflow.모델저장(모델) MLflow.아티팩트저장("confusion_matrix.png") MLflow.태그추가("dataset_version", "v2.1") // 결과: Run ID로 모든 실험 정보 추적 가능
자동 로깅 기능

MLflow는 주요 프레임워크(PyTorch, TensorFlow, scikit-learn 등)의 자동 로깅을 지원합니다. mlflow.autolog() 한 줄만 추가하면 파라미터, 메트릭, 모델이 자동으로 기록됩니다.

MLflow 웹 UI에서는 모든 실험을 비교하고, 최고 성능 모델을 필터링하며, 파라미터와 메트릭의 상관관계를 시각화할 수 있습니다.

3MLflow 모델 레지스트리

모델 레지스트리는 학습된 모델의 중앙 저장소입니다. 각 모델은 버전으로 관리되며, Staging → Production → Archived의 생명주기를 거칩니다.

모델 레지스트리 생명주기
1
None (실험 단계)
MLflow 실험에서 학습된 모델. 아직 레지스트리에 등록되지 않음
2
Staging (검증 단계)
성능이 우수한 모델을 레지스트리에 등록하고 검증 환경에서 테스트
3
Production (운영 단계)
검증 완료된 모델을 프로덕션 환경에 배포. 실제 추론 API에서 사용
4
Archived (보관 단계)
새로운 모델로 교체된 구 버전. 롤백이나 감사를 위해 보관
PSEUDOCODE 모델 레지스트리 관리
# === 모델 레지스트리 수도코드 === # 1. 최고 성능 모델 찾기 실험 = 실험조회("defect_detection_cnn") 최고모델 = 검색(실험, 정렬="F1점수 내림차순", 최대=1) 출력(최고모델.run_id, 최고모델.F1점수) # 2. 레지스트리에 등록 모델버전 = MLflow.모델등록(최고모델.uri, "DefectDetectionModel") // 결과: 모델명 + 버전번호로 추적 가능 # 3. Staging 단계로 전환 모델상태변경(모델명, 버전, 단계="Staging") // 검증 환경에서 테스트 시작 # 4. 모델 설명 추가 모델설명업데이트(버전, 설명="ResNet50, F1=0.96, Augmentation적용") # 5. 검증 후 Production 승격 함수 validate_staging(): 모델 = 로드("models:/모델명/Staging") 정확도 = 테스트세트_평가(모델) 반환 (정확도 > 0.95) 만약 validate_staging(): 모델상태변경(버전, "Production") // 기존 Production → 자동 Archived 아니면: 출력("검증 실패, Staging 유지") # 6. Production 모델 사용 운영모델 = 로드("models:/모델명/Production")
Version Stage Created F1 Score Description
v1.0 Archived 2024-01-10 0.89 Initial baseline model
v1.1 Archived 2024-01-12 0.92 Added dropout regularization
v2.0 Production 2024-01-15 0.96 ResNet50 + data augmentation
v2.1 Staging 2024-01-18 0.97 EfficientNet-B3, testing
승인 워크플로우 적용

Production 승격 시 자동화된 검증 외에도 데이터 과학자와 현장 엔지니어의 수동 승인 프로세스를 추가할 수 있습니다. MLflow의 Webhook 기능으로 Slack/Teams 알림을 연동하면 팀 협업이 용이합니다.

4DVC를 활용한 데이터 버전 관리

DVC(Data Version Control)는 대용량 데이터셋과 모델 파일을 Git처럼 버전 관리하는 도구입니다. 데이터는 클라우드 스토리지(S3, Azure Blob 등)에 저장하고, Git에는 메타데이터만 커밋하여 효율적으로 관리합니다.

📊MLflow
실험 추적과 모델 레지스트리에 특화. 실시간 메트릭 로깅과 웹 UI 제공
  • 실험 파라미터/메트릭 추적
  • 모델 레지스트리 (Staging/Production)
  • 자동 로깅 (PyTorch, TensorFlow)
  • 모델 서빙 API
🗂️DVC
대용량 데이터와 모델의 버전 관리. Git과 유사한 워크플로우
  • 데이터셋 버전 관리
  • 파이프라인 재현성
  • 클라우드 스토리지 연동
  • 데이터 계보 추적
PSEUDOCODE DVC 데이터 버전 관리
# === DVC 데이터 버전 관리 수도코드 === # 1. 초기 설정 dvc init // 프로젝트 초기화 dvc remote add S3스토리지 설정 // 원격 저장소 연결 # 2. 데이터 추적 dvc add 데이터파일 // 대용량 파일 추적 시작 git add .dvc파일 // 메타데이터만 Git에 커밋 dvc push // 실제 데이터는 S3에 업로드 # 3. 파이프라인 정의 (dvc.yaml) stages: preprocess: 입력(원본데이터) → 출력(전처리된 데이터) train: 입력(전처리데이터) → 출력(모델파일) + 메트릭 evaluate: 입력(모델) → 출력(평가결과, 플롯) # 4. 파라미터 관리 (params.yaml) preprocess: {이미지크기: 224, 증강: true} train: {lr: 0.001, batch: 32, epochs: 50} # 5. 실험 재현 dvc repro // 변경된 단계만 재실행 dvc metrics diff 브랜치A 브랜치B // 실험 결과 비교 dvc dag // 파이프라인 의존성 시각화

DVC 파이프라인은 각 단계의 입력, 출력, 파라미터를 명시적으로 정의합니다. 파라미터가 변경되면 영향받는 단계만 자동으로 재실행되어 효율적입니다.

5재현 가능한 실험 환경

코드와 데이터뿐만 아니라 실행 환경도 버전 관리되어야 완벽한 재현성이 보장됩니다. Docker와 Conda를 활용하여 OS, 라이브러리, CUDA 버전까지 고정합니다.

PSEUDOCODE 재현 가능한 실험 환경
# === 재현 가능한 실험 환경 수도코드 === # 1. Docker 환경 구성 베이스이미지: PyTorch 2.0 + CUDA 11.7 설치항목: DVC, MLflow, 필수라이브러리 환경변수: MLflow서버주소, AWS키 # 2. 의존성 고정 (requirements.txt) torch==2.0.1, mlflow==2.8.0, dvc==3.20.0 ... // 모든 라이브러리 버전 명시 # 3. 재현성 보장 함수 함수 set_seed(시드=42): random.seed(시드) numpy.seed(시드) torch.seed(시드) cudnn.deterministic = True // 동일 시드 → 동일 결과 # 4. 학습 스크립트 구조 함수 main(): set_seed(42) // 재현성 보장 설정 = 로드("params.yaml") MLflow.실험시작(): // 추적 정보 기록 MLflow.태그("git_commit", 현재커밋해시) MLflow.파라미터("torch_version", torch버전) // 환경 파일 저장 MLflow.아티팩트저장("params.yaml", "dvc.lock", "Dockerfile") // 학습 및 모델 저장 모델 = train_model(설정) MLflow.모델저장(모델, 환경정보포함=True) // 결과: 3개월 후에도 동일 결과 재현 가능
MLflow Projects로 패키징

MLflow Projects는 코드, 환경, 파라미터를 하나로 묶어 재현 가능한 실험 단위로 만듭니다. mlflow run 명령으로 어디서든 동일한 환경에서 실험을 재실행할 수 있습니다.

6모델 아티팩트 관리

학습된 모델 외에도 전처리 파이프라인, 레이블 인코더, 정규화 파라미터 등의 아티팩트를 함께 관리해야 추론 시 일관성이 보장됩니다.

PSEUDOCODE 아티팩트 저장 및 로드
# === 모델 아티팩트 관리 수도코드 === # 1. 학습 시 아티팩트 저장 MLflow.실험시작(): 모델 = 학습() // 필수 아티팩트 저장 MLflow.모델저장(모델) MLflow.아티팩트저장("preprocessor.pkl") // 전처리기 MLflow.아티팩트저장("label_encoder.pkl") // 레이블 인코더 MLflow.아티팩트저장("norm_stats.json") // 정규화 통계 MLflow.아티팩트저장("class_names.json") // 클래스명 매핑 // 입출력 시그니처 정의 시그니처 = 추론(샘플입력, 샘플출력) MLflow.모델저장(모델, signature=시그니처) # 2. 추론 서버에서 로드 함수 load_production_model(): 모델 = MLflow.로드("models:/모델명/Production") // 아티팩트 다운로드 아티팩트경로 = MLflow.다운로드(run_id, "artifacts") 전처리기 = 로드(아티팩트경로 + "preprocessor.pkl") 정규화통계 = 로드(아티팩트경로 + "norm_stats.json") 클래스명 = 로드(아티팩트경로 + "class_names.json") 반환 {모델, 전처리기, 정규화통계, 클래스명} # 3. 추론 함수 함수 predict(이미지): 처리됨 = 전처리기.변환(이미지) 정규화 = (처리됨 - 평균) / 표준편차 예측인덱스 = 모델(정규화).argmax() 반환 클래스명[예측인덱스] // "scratch", "dent" 등

7버전 관리 Best Practices

모델 버전 관리 체크리스트
  • 명명 규칙 통일: 모델명은 {domain}_{architecture}_{version} 형식 (예: defect_resnet50_v2.1)
  • 태그 활용: 데이터셋 버전, 엔지니어, 배포 환경 등을 MLflow 태그로 기록
  • 자동화된 검증: Staging 모델은 자동 테스트를 통과해야만 Production 승격
  • 롤백 계획: 문제 발생 시 이전 Production 모델로 즉시 롤백 가능하도록 Archived 버전 유지
  • 변경 로그 작성: 각 모델 버전의 주요 변경사항을 description에 명시
  • 데이터 계보 추적: DVC로 학습 데이터의 출처와 변환 과정 기록
  • 환경 동결: requirements.txt, Dockerfile, conda environment를 모든 실험에 포함
  • CI/CD 통합: Git 푸시 시 자동으로 DVC 데이터 검증 및 MLflow 실험 실행
  • 접근 권한 관리: Production 모델 승격은 승인된 사용자만 가능하도록 제한
  • 모니터링 연계: Production 모델의 성능을 실시간 모니터링하고 드리프트 감지 시 알림
실전 팁: MLflow + DVC 조합

MLflow는 실험 메트릭과 모델 레지스트리에, DVC는 대용량 데이터와 파이프라인 재현에 강점이 있습니다. 두 도구를 함께 사용하면 완벽한 MLOps 워크플로우를 구축할 수 있습니다. MLflow 실험에 DVC 데이터 버전을 태그로 기록하면 모델과 데이터의 연결고리가 명확해집니다.