데이터 세트 및 ML 모델 버전 관리: 프로덕션의 DVC
94%의 정확도를 달성하는 모델을 훈련하고 이를 프로덕션에 출시한 다음, 3개월 후에는 어느 버전의 데이터 세트가 사용되었는지 정확히 아는 사람이 아무도 없다는 사실을 발견했습니다. 활성화된 하이퍼파라미터 해당 모델은 현재 생산중이지만, 재현 불가능. 안타깝게도 이 시나리오는 ML을 채택하지 않는 팀에서는 예외가 아니라 표준입니다. 구조화된 버전 관리 방식.
MLOps의 버전 관리는 단지 코드 파일에 관한 것이 아닙니다. 데이터 세트, 모델, 파이프라인 및 구성. Git은 소스 코드를 매우 잘 처리하지만 실패합니다. ML 데이터 세트의 일반적인 수백 GB 파일이 포함됩니다. 그리고 여기서 그것이 시작됩니다 DVC(데이터 버전 제어), Git의 원칙을 데이터와 세계의 세계에 적용하는 오픈 소스 도구입니다. 기계 학습 모델.
2025년 11월, LakeFS는 DVC를 인수하여 이 도구의 중요성을 확인했습니다. MLOps 생태계에서 100% 오픈 소스 프로젝트로서의 연속성을 보장합니다. 이에 DVC에 대해 심도 있게 살펴볼 기사: 설정, 파이프라인, 원격 스토리지, Git 통합 및 MLflow, 모든 규모의 팀을 위한 LakeFS 및 모범 사례와의 비교.
이 기사에서 배울 내용
- 버전 관리가 MLOps의 기본인 이유와 코드 버전 관리와의 차이점
- 완전한 DVC 설정: 초기화, 데이터 추적, 자동 .dvc 파일 및 .gitignore
- dvc.yaml이 포함된 DVC 파이프라인: stage, deps, outs, params 및 dvc.lock 파일
- 원격 스토리지: AWS S3, Google Cloud Storage 및 Azure Blob Storage 구성
- DVC Python API: 프로그래밍 방식 액세스를 위한 dvc.api.open() 및 dvc.api.get_url()
- 데이터 세트 버전을 실험에 연결하기 위한 DVC + MLflow 통합
- DVC와 LakeFS 아키텍처 비교: 언제 어떤 도구를 사용해야 할까요?
- 예산이 제한된 ML 팀을 위한 모범 사례(<5K EUR/년)
MLOps 시리즈 및 프로덕션에서의 기계 학습
| # | Articolo | 집중하다 |
|---|---|---|
| 1 | MLOps: 실험에서 프로덕션까지 | 기초 및 전체 수명주기 |
| 2 | CI/CD가 포함된 ML 파이프라인 | ML용 GitHub Actions 및 Docker |
| 3 | 현재 위치 - DVC와 LakeFS 버전 관리 | 데이터 세트 및 모델 버전 관리 |
| 4 | MLflow를 사용한 실험 추적 | 추적, 모델 등록, 비교 |
| 5 | 모델 드리프트 감지 | 자동 모니터링 및 재교육 |
| 6 | FastAPI + Uvicorn으로 제공 | 프로덕션에 모델 배포 |
| 7 | Kubernetes에서 ML 확장 | KubeFlow 및 Seldon Core |
| 8 | ML 모델의 A/B 테스트 | 방법론 및 구현 |
| 9 | ML 거버넌스 | 규정 준수, AI법 EU, 윤리 |
| 10 | 사례 연구: 이탈 예측 | 프로덕션의 엔드투엔드 파이프라인 |
머신러닝의 버전 관리 문제
전통적인 소프트웨어 프로젝트에서 Git은 거의 모든 버전 문제를 해결합니다. 가볍고 텍스트가 풍부하며 자연스럽게 차이점과 병합이 가능합니다. 그러나 ML 프로젝트에서는 코드는 방정식의 일부일뿐입니다. 모델의 재현성을 위해서는 추적이 필요합니다. 동시에:
- 훈련 및 검증 데이터세트: 대개 기가바이트 또는 테라바이트에 달하는 정형 또는 비정형 데이터
- 모델 아티팩트: 수백 MB에 달하는 .pkl, .pt, .h5 파일
- 초매개변수 및 구성: 학습률, 아키텍처, 전처리 단계
- 측정항목 및 결과: 각 실험에 대한 정확도, F1, AUC-ROC
- 환경 종속성: Python 버전, 라이브러리, CUDA 드라이버
Git은 대용량 바이너리 파일용으로 설계되지 않았습니다. 각 푸시마다 500MB 모델이 있습니다. 전체 기록을 복제하여 몇 달 안에 저장소를 사용할 수 없게 됩니다. 해결책 버전 관리를 포기하는 것이 아니라 각 유형의 아티팩트에 적합한 도구를 사용하는 것입니다.
ML 버전 관리 부족으로 인한 비용
| 대본 | 버전 관리가 없는 비용 | DVC 솔루션 |
|---|---|---|
| 저하된 생산 모델 | 이전 모델로 롤백할 수 없습니다. | git 체크아웃 + dvc 체크아웃 |
| 파이프라인의 손상된 데이터 세트 | 다시 다운로드하여 처음부터 처리 | dvc checkout 이전 데이터세트 |
| 규제 감사(AI Act EU) | 어떤 데이터가 모델을 구성했는지 증명하는 것은 불가능합니다. | .dvc 파일에 표시된 데이터 세트의 해시 |
| 팀 협업 | 모든 데이터 과학자는 서로 다른 버전의 데이터를 사용합니다. | dvc pull은 팀 전체를 동기화합니다. |
| 실험 재현 | 6개월 후에는 결과를 재현할 수 없습니다. | git checkout + dvc repro는 모든 것을 다시 빌드합니다. |
DVC 설정 및 구성
DVC는 추가 계층으로 기존 Git 저장소에 통합됩니다. 서버가 필요하지 않습니다 Central은 로컬에서 실행되며 팀이 성장함에 따라 클라우드 스토리지로 쉽게 확장됩니다. 설치는 다양한 스토리지 백엔드를 지원하는 pip를 통해 이루어집니다.
# Installazione base
pip install dvc
# Con supporto remote storage (scegli in base al provider)
pip install dvc[s3] # Amazon S3
pip install dvc[gs] # Google Cloud Storage
pip install dvc[azure] # Azure Blob Storage
pip install dvc[ssh] # SSH/SFTP
pip install dvc[all] # Tutti i backend
# Verifica installazione
dvc --version
# DVC 3.x.x
설치가 완료되면 Git 저장소에서 DVC를 초기화합니다. 이 명령은 구조를 생성합니다. 필요한 디렉토리를 삭제하고 .gitignore를 자동으로 업데이트하여 파일을 제외합니다. Git 추적 데이터:
# Inizializza Git (se non già fatto)
git init
git add .
git commit -m "Initial commit"
# Inizializza DVC
dvc init
# Struttura creata da dvc init:
# .dvc/
# ├── config # Configurazione DVC (tracciato da Git)
# ├── .gitignore # Esclude cache e tmp
# ├── cache/ # Cache locale degli artefatti (NON tracciata da Git)
# └── tmp/
# Commit dei file di configurazione DVC
git add .dvc/ .gitignore
git commit -m "chore: initialize DVC"
데이터 세트 및 모델 추적
DVC의 핵심과 명령 dvc add, 이는 다음과 유사하게 작동합니다.
git add 하지만 대용량 파일의 경우. DVC는 파일의 MD5 해시를 계산합니다.
로컬 캐시로 이동하고 파일을 생성합니다. .dvc (작은 텍스트 파일
Git에 의해 추적됨) 해시를 가리킵니다.
# Aggiungere un dataset al tracking DVC
dvc add data/raw/training_data.csv
# DVC ha creato:
# - data/raw/training_data.csv.dvc (puntatore, tracciato da Git)
# - data/raw/.gitignore (esclude il file originale da Git)
# Contenuto del file .dvc generato:
# outs:
# - md5: a1b2c3d4e5f6...
# size: 524288000
# path: training_data.csv
# Aggiungere il puntatore a Git
git add data/raw/training_data.csv.dvc data/raw/.gitignore
git commit -m "feat: add training dataset v1.0"
git tag "dataset-v1.0"
# Aggiungere un modello addestrato
dvc add models/churn_model.pkl
git add models/churn_model.pkl.dvc models/.gitignore
git commit -m "feat: add trained churn model v1 (accuracy=0.94)"
git tag "model-v1.0"
.dvc 파일의 작동 방식
파일 .dvc MD5(또는 SHA-256) 해시가 포함된 경량 YAML 파일
원본 파일의 내용, 크기 및 상대 경로. 이 해시는 결정적입니다.
동일한 파일은 항상 동일한 해시를 생성하므로 해당 파일의 무결성을 확인할 수 있습니다.
언제든지 데이터. Git은 .dvc 파일, 데이터 파일
로컬 DVC 캐시나 원격 저장소에 실제로 존재합니다.
DVC를 사용한 일일 작업 흐름
DVC의 일반적인 워크플로우는 Git 주기를 따르며 다음이 추가됩니다. dvc push e
dvc pull 데이터를 원격 저장소와 동기화하려면:
# Workflow DVC quotidiano
# 1. Pull dati aggiornati dal remote
git pull
dvc pull
# 2. Modifica dataset o allena nuovo modello
python scripts/preprocess.py
python scripts/train.py
# 3. Traccia nuovi artefatti
dvc add data/processed/features.parquet
dvc add models/churn_model_v2.pkl
# 4. Commit codice e puntatori
git add .
git commit -m "feat: retrain model with new features (F1=0.92)"
# 5. Push dati al remote storage
dvc push
# 6. Push codice a Git
git push
# ---- Sul computer di un collega ----
git pull # Scarica codice e .dvc files
dvc pull # Scarica i dati dal remote storage
원격 저장소: S3, GCS 및 Azure
원격 스토리지는 DVC 협업의 핵심입니다. 그것 없이는 데이터가 존재합니다 로컬에서만 가능하며 버전 관리는 팀에 도움이 되지 않습니다. DVC는 모든 주요 기능을 지원합니다. 클라우드 제공업체 및 SSH 또는 NFS를 통한 온프레미스 솔루션.
# ==================== AWS S3 ====================
# Prerequisiti: pip install dvc[s3], AWS credentials configurate
# Aggiungere S3 come remote di default
dvc remote add -d myremote s3://my-ml-bucket/dvc-storage
# Configurazione con access keys (per CI/CD, preferire IAM roles)
dvc remote modify myremote access_key_id $AWS_ACCESS_KEY_ID
dvc remote modify myremote secret_access_key $AWS_SECRET_ACCESS_KEY
dvc remote modify myremote region eu-west-1
# Per credenziali sensibili, usare config locale (non tracciata da Git)
dvc remote modify --local myremote access_key_id $AWS_ACCESS_KEY_ID
dvc remote modify --local myremote secret_access_key $AWS_SECRET_ACCESS_KEY
# ==================== Google Cloud Storage ====================
# Prerequisiti: pip install dvc[gs], gcloud auth configurato
dvc remote add -d gcsremote gs://my-ml-bucket/dvc-storage
# Con Service Account (per produzione)
dvc remote modify gcsremote credentialpath /path/to/service-account.json
# ==================== Azure Blob Storage ====================
# Prerequisiti: pip install dvc[azure]
dvc remote add -d azureremote azure://mycontainer/dvc-storage
# Configurazione connection string
dvc remote modify --local azureremote connection_string $AZURE_CONN_STRING
# ==================== Verifica e Operazioni ====================
# Mostra la configurazione remota
dvc remote list
# Push di tutti gli artefatti tracciati
dvc push
# Push solo di file specifici
dvc push models/churn_model.pkl.dvc
# Pull di tutti gli artefatti
dvc pull
# Verifica stato sincronizzazione
dvc status --cloud
자격 증명의 보안
파일에 AWS, GCS 또는 Azure 자격 증명을 배치하지 마십시오. .dvc/config 추적됨
힘내에서. 항상 사용 --local 쓰다 .dvc/config.local
(Git에서는 자동으로 무시됨) 또는 변수를 통해 자격 증명을 구성합니다.
CI/CD 시스템의 환경 또는 IAM 역할. Kubernetes 아키텍처에서는 i를 사용합니다.
IRSA(서비스 계정에 대한 IAM 역할)가 포함된 ServiceAccount를 사용하여 S3에 안전하게 액세스할 수 있습니다.
하드코딩된 자격 증명.
제한된 예산을 위한 설정: 무료 대안인 DagsHub
예산이 연간 5K EUR 미만인 팀을 위해 DagsHub는 DVC 원격 스토리지를 위한 무료 호스팅을 제공합니다. (공용 저장소당 최대 10GB) MLflow에 대한 기본 통합이 포함됩니다. 그리고 해결책 신생 기업 및 학술 팀에 적합:
# DagsHub come remote storage gratuito
# 1. Crea account su dagshub.com e un nuovo repository
# 2. Configura il remote DagsHub
dvc remote add origin https://dagshub.com/username/my-ml-project.dvc
# 3. Autenticazione con token personale
dvc remote modify origin --local auth basic
dvc remote modify origin --local user username
dvc remote modify origin --local password $DAGSHUB_TOKEN
# 4. Push e pull normali
dvc push
dvc pull
DVC 파이프라인: dvc.yaml을 사용한 재현성
파이프라인은 DVC의 가장 강력한 기능입니다. 이를 통해 워크플로를 정의할 수 있습니다. 일련의 ML을 완료하세요. 인턴십 서로에게 의존합니다. DVC는 단계 간의 종속성과 입력이 변경된 단계만 다시 실행합니다. 기계 학습을 위한 지능형 makefile.
파이프라인은 파일에 정의되어 있습니다. dvc.yaml 및 그 상태(모든 해시
입력 및 출력) 및 플롯 dvc.lock. 당신이 달릴 때
dvc repro, DVC는 현재 상태를 dvc.lock 전자
무효화된 단계만 다시 수행합니다.
# dvc.yaml - Pipeline ML completa per churn prediction
stages:
# Stage 1: Download e validazione dei dati raw
fetch_data:
cmd: python src/data/fetch_data.py
deps:
- src/data/fetch_data.py
params:
- data.source_url
- data.date_range
outs:
- data/raw/transactions.parquet
- data/raw/customers.csv
# Stage 2: Preprocessing e feature engineering
preprocess:
cmd: python src/features/preprocess.py
deps:
- src/features/preprocess.py
- data/raw/transactions.parquet
- data/raw/customers.csv
params:
- features.window_days
- features.aggregations
outs:
- data/processed/features.parquet
- data/processed/feature_names.json
# Stage 3: Split train/validation/test
split:
cmd: python src/data/split.py
deps:
- src/data/split.py
- data/processed/features.parquet
params:
- split.train_ratio
- split.val_ratio
- split.random_seed
outs:
- data/splits/train.parquet
- data/splits/val.parquet
- data/splits/test.parquet
# Stage 4: Training del modello
train:
cmd: python src/models/train.py
deps:
- src/models/train.py
- data/splits/train.parquet
- data/splits/val.parquet
params:
- model.type
- model.n_estimators
- model.max_depth
- model.learning_rate
outs:
- models/churn_model.pkl
- models/feature_importance.json
metrics:
- metrics/train_metrics.json:
cache: false
# Stage 5: Valutazione sul test set
evaluate:
cmd: python src/models/evaluate.py
deps:
- src/models/evaluate.py
- models/churn_model.pkl
- data/splits/test.parquet
outs:
- reports/confusion_matrix.png:
cache: false
metrics:
- metrics/test_metrics.json:
cache: false
파이프라인 매개변수는 파일에 정의됩니다. params.yaml, 이는
Git에 의해 추적됩니다. 이를 통해 다양한 하이퍼파라미터를 사용하여 실험을 비교할 수 있습니다.
사용하여 dvc params diff:
# params.yaml - Configurazione centralizzata
data:
source_url: "s3://my-data-bucket/raw/2025/"
date_range: "2024-01-01:2025-01-01"
features:
window_days: 30
aggregations:
- mean
- std
- max
split:
train_ratio: 0.7
val_ratio: 0.15
random_seed: 42
model:
type: "xgboost"
n_estimators: 500
max_depth: 6
learning_rate: 0.05
subsample: 0.8
파이프라인 실행 및 관리
# Eseguire l'intera pipeline (solo stage invalidati)
dvc repro
# Forzare ri-esecuzione di tutti gli stage
dvc repro --force
# Eseguire solo fino a uno stage specifico
dvc repro evaluate
# Visualizzare il DAG della pipeline
dvc dag
# Output:
# +------------+
# | fetch_data |
# +------------+
# * *
# *** ***
# * *
# +-----------+ +----------+
# | preprocess| | |
# +-----------+ +----------+
# *
# ...
# Confrontare metriche tra commit
dvc metrics show
dvc metrics diff HEAD~1
# Confrontare parametri tra branch
dvc params diff main feature/new-model
# Visualizzare differenze nei dati
dvc diff
DVC의 Python API: 프로그래밍 방식 데이터 액세스
DVC의 Python API를 사용하면 버전이 지정된 데이터 세트 및 모델에 직접 액세스할 수 있습니다. 먼저 파일을 수동으로 다운로드할 필요 없이 Python 코드에서. 특히 유용함 추론 파이프라인이나 동적으로 로드하려는 서비스 시스템에서 모델의 올바른 버전.
import dvc.api
import pandas as pd
import pickle
import json
# ==================== dvc.api.open() ====================
# Accede direttamente al remote storage senza download locale
# Leggere un dataset CSV da una versione specifica
with dvc.api.open(
"data/raw/customers.csv",
repo="https://github.com/myorg/ml-project",
rev="dataset-v2.1", # tag Git
mode="r"
) as f:
df = pd.read_csv(f)
print(f"Dataset caricato: {len(df)} righe")
# Leggere un file Parquet (file binario)
with dvc.api.open(
"data/processed/features.parquet",
rev="model-v3.0",
mode="rb"
) as f:
features_df = pd.read_parquet(f)
# ==================== dvc.api.get_url() ====================
# Ottiene l'URL diretto al remote storage per una versione specifica
url = dvc.api.get_url(
"models/churn_model.pkl",
repo="https://github.com/myorg/ml-project",
rev="model-v2.5"
)
print(f"Model URL: {url}")
# Output: s3://my-ml-bucket/dvc-storage/ab/cd1234...
# ==================== Caricamento Modello Versioned ====================
def load_model(version: str):
"""Carica un modello da una specifica versione DVC."""
with dvc.api.open(
"models/churn_model.pkl",
rev=version,
mode="rb"
) as f:
model = pickle.load(f)
# Carica anche i metadata del modello
with dvc.api.open(
"models/feature_importance.json",
rev=version,
mode="r"
) as f:
metadata = json.load(f)
return model, metadata
# Uso in produzione
model, metadata = load_model("model-v3.0")
print(f"Modello caricato. Features: {metadata['n_features']}")
Git과 DVC 통합: 전체 워크플로
DVC의 진정한 힘은 Git과 긴밀하게 통합될 때 드러납니다. 모든 Git 커밋
파일을 업데이트하는 것 .dvc o dvc.lock 스냅샷을 나타냅니다
전체 ML 프로젝트 상태(코드, 데이터, 모델)를 함께 재현할 수 있습니다.
# Workflow Git+DVC per un ciclo di sviluppo ML
# ==================== Feature Branch Workflow ====================
# 1. Crea un branch per il nuovo esperimento
git checkout -b experiment/xgboost-v2
# 2. Aggiorna i parametri
# Modifica params.yaml: learning_rate: 0.01, n_estimators: 1000
# 3. Esegui la pipeline
dvc repro
# 4. Controlla le metriche
dvc metrics show
# Path accuracy f1_score auc_roc
# metrics/test_metrics.json 0.9423 0.8891 0.9234
# 5. Confronta con main
dvc metrics diff main
# Path Metric Old New Change
# metrics/test_metrics.json accuracy 0.9301 0.9423 +0.0122
# 6. Commit e push
git add dvc.lock params.yaml metrics/
git commit -m "experiment: XGBoost v2 - accuracy +1.2% (0.9423)"
dvc push
git push origin experiment/xgboost-v2
# 7. Crea Pull Request e, dopo merge, tagga il modello
git checkout main
git merge experiment/xgboost-v2
git tag -a "model-v2.0" -m "XGBoost v2: accuracy=0.9423, F1=0.8891"
git push --tags
# ==================== Rollback a Versione Precedente ====================
# Situazione: il modello v2.0 ha un bug in produzione
# 1. Torna al commit del modello v1.0
git checkout model-v1.0
# 2. Ripristina i dati e i modelli a quella versione
dvc checkout
# 3. Verifica il modello ripristinato
python src/models/evaluate.py
# 4. Il sistema di serving può ora ricaricare model-v1.0
DVC + MLflow: 데이터 세트 버전 관리 및 실험 추적
DVC와 MLflow는 서로를 보완합니다. DVC는 데이터 및 모델 버전 관리를 처리합니다. (대형 아티팩트), MLflow는 매개변수, 측정항목 및 실험의 실행. 이들을 통합한다는 것은 완전한 감사 추적을 의미합니다. MLflow를 실행하여 어떤 버전의 데이터 세트가 사용되었는지 정확히 알아보세요.
import mlflow
import mlflow.sklearn
import dvc.api
import subprocess
import pandas as pd
from sklearn.metrics import accuracy_score, f1_score, roc_auc_score
from xgboost import XGBClassifier
def get_dvc_metadata() -> dict:
"""Raccoglie metadata DVC per il run MLflow corrente."""
# Hash del dataset corrente
result = subprocess.run(
["dvc", "status", "--json"],
capture_output=True, text=True
)
# Ottieni la revisione Git corrente (che punta ai dati)
git_rev = subprocess.run(
["git", "rev-parse", "HEAD"],
capture_output=True, text=True
).stdout.strip()
# URL del remote storage per il dataset
data_url = dvc.api.get_url("data/splits/train.parquet")
return {
"dvc.git_rev": git_rev,
"dvc.data_url": data_url,
"dvc.train_dataset": "data/splits/train.parquet",
"dvc.data_version": "v2.1",
}
def train_with_tracking(params: dict) -> None:
"""Training con tracking completo DVC + MLflow."""
mlflow.set_experiment("churn-prediction")
with mlflow.start_run(run_name="xgboost-dvc-integrated") as run:
# Logga metadata DVC - collega run MLflow a versione dati
dvc_metadata = get_dvc_metadata()
mlflow.log_params(dvc_metadata)
mlflow.log_params(params)
# Carica dati dalla versione DVC corrente
train_df = pd.read_parquet("data/splits/train.parquet")
val_df = pd.read_parquet("data/splits/val.parquet")
test_df = pd.read_parquet("data/splits/test.parquet")
X_train = train_df.drop("churn", axis=1)
y_train = train_df["churn"]
X_test = test_df.drop("churn", axis=1)
y_test = test_df["churn"]
# Training
model = XGBClassifier(**params)
model.fit(X_train, y_train,
eval_set=[(val_df.drop("churn", axis=1), val_df["churn"])],
early_stopping_rounds=50,
verbose=False)
# Metriche
y_pred = model.predict(X_test)
y_prob = model.predict_proba(X_test)[:, 1]
metrics = {
"accuracy": accuracy_score(y_test, y_pred),
"f1_score": f1_score(y_test, y_pred),
"auc_roc": roc_auc_score(y_test, y_prob),
"best_iteration": model.best_iteration,
}
mlflow.log_metrics(metrics)
mlflow.sklearn.log_model(model, "model")
print(f"Run ID: {run.info.run_id}")
print(f"Accuracy: {metrics['accuracy']:.4f}")
print(f"Dataset version: {dvc_metadata['dvc.data_version']}")
if __name__ == "__main__":
params = {
"n_estimators": 500,
"max_depth": 6,
"learning_rate": 0.05,
"subsample": 0.8,
"use_label_encoder": False,
"eval_metric": "logloss",
}
train_with_tracking(params)
DVC와 LakeFS: 언제 어떤 도구를 사용해야 할까요?
2025년 11월 LakeFS는 DVC를 인수했지만 두 도구는 여전히 구별됩니다. 다양한 사용 사례. 선택은 데이터의 규모, 복잡성에 따라 달라집니다. 인프라와 팀의 요구 사항. 두 가지 도구가 있다는 점에 유의하는 것이 중요합니다. 이들은 상호 배타적이지 않습니다. 기업 팀에서는 두 가지를 모두 사용하는 경우가 많습니다.
DVC와 LakeFS 아키텍처 비교
| 크기 | DVC | 호수FS |
|---|---|---|
| 건축학 | 클라이언트 전용, 서버가 필요하지 않음 | 클라이언트/서버, LakeFS 서버 배포 필요 |
| 데이터 규모 | 최대 TB까지의 데이터 세트 | 페타바이트 규모의 엔터프라이즈 데이터 레이크 |
| 완성 | Git과 통합(동일한 작업 흐름) | S3 호환 API, Spark, Hive, Athena |
| 데이터 분기 | 커밋 Git + .dvc 파일을 통해 | 객체 저장소 수준의 기본 분기 |
| 설정 | pip 설치 + dvc init(분) | Docker/Kubernetes 배포(시간/일) |
| 목표 | 데이터 과학자, 소규모 ML 팀 | 데이터 엔지니어링 팀, 엔터프라이즈 기업 |
| 비용 | 오픈 소스, 무료(스토리지 비용만 지불) | 오픈소스 + 유료 엔터프라이즈 플랜 |
| ML 프레임워크 | Python 기반, MLflow, DVCLive | Spark, Presto, DuckDB 등 모든 빅데이터 도구 |
LakeFS: 아키텍처 및 사용 사례
LakeFS는 객체 스토리지(S3, GCS, Azure Blob) 위에서 메타데이터 계층으로 작동합니다. S3 호환 API를 노출합니다. 다음을 포함하지 않는 데이터 보기 버전을 만듭니다. 기본 파일 복제: 분기를 만드는 데 밀리초가 걸립니다. 데이터 세트의 크기에 관계없이.
# lakeFS: esempio di workflow con Python SDK
from lakefs_sdk import Client, Repository, Branch, Commit
import pandas as pd
# Connessione al server lakeFS
client = Client(
host="https://lakefs.mycompany.com",
username="access_key",
password="secret_key"
)
# Crea un repository
repo = client.repositories.create_repository(
"churn-data-lake",
storage_namespace="s3://my-data-lake/churn/",
default_branch="main"
)
# Workflow Git-like per dati
# 1. Crea branch per nuovo esperimento
experiment_branch = repo.branch("experiment/new-features").create(
source_reference="main"
)
# 2. Upload nuovi dati sul branch sperimentale
# (non impatta il branch main - zero copy)
experiment_branch.object("data/features_v2.parquet").upload(
content=new_features_df.to_parquet()
)
# 3. Commit sul branch
experiment_branch.commit(
message="feat: add recency features for churn model",
metadata={"model_version": "v3.0", "engineer": "alice"}
)
# 4. Merge solo se i risultati sono soddisfacenti
# (dopo validazione e A/B testing)
repo.branch("main").merge(source_ref="experiment/new-features")
# 5. Rollback immediato se qualcosa va storto
repo.branch("main").revert(
reference="main~1" # Torna al commit precedente
)
어떤 도구를 선택해야 할까요?
미국 DVC 만약에:
- 귀하는 데이터 과학자이거나 소규모 팀(1~10명)입니다.
- 데이터 세트는 GB/몇 TB 정도입니다.
- 추가 인프라 없이 Git과의 기본 통합을 원합니다.
- 제한된 예산(<5K EUR/년)
- 단일 ML 실험에 초점을 맞춘 워크플로
미국 호수FS 만약에:
- 페타바이트 규모의 데이터를 포함하는 엔터프라이즈 데이터 레이크가 있습니다.
- Spark, Athena, Presto 또는 기타 빅 데이터 프레임워크를 사용합니다.
- 규정 준수를 위한 데이터 거버넌스 및 감사 추적이 필요합니다(GDPR, AI법).
- 대규모 데이터 엔지니어링 팀(10명 이상)과 협력
- 서버 배포를 위한 Kubernetes 인프라가 이미 있습니다.
프로덕션의 ML 버전 관리 모범 사례
1. 저장소 구조
잘 구성된 저장소 구조로 인해 DVC 버전 관리가 더욱 효과적입니다. 팀 협업을 촉진합니다.
ml-project/
├── .dvc/
│ ├── config # Remote storage config (no secrets)
│ └── .gitignore
├── data/
│ ├── raw/
│ │ ├── .gitignore # Generato da DVC
│ │ ├── customers.csv.dvc
│ │ └── transactions.parquet.dvc
│ ├── processed/
│ │ └── features.parquet.dvc
│ └── splits/
│ ├── train.parquet.dvc
│ └── test.parquet.dvc
├── models/
│ ├── .gitignore
│ └── churn_model.pkl.dvc
├── metrics/
│ └── test_metrics.json # Tracciato da Git (piccolo file JSON)
├── reports/
│ └── confusion_matrix.png # Tracciato da Git (con cache: false)
├── src/
│ ├── data/
│ │ ├── fetch_data.py
│ │ └── split.py
│ ├── features/
│ │ └── preprocess.py
│ └── models/
│ ├── train.py
│ └── evaluate.py
├── dvc.yaml # Definizione pipeline
├── dvc.lock # Snapshot stato pipeline (tracciato da Git)
├── params.yaml # Iperparametri e configurazione
└── requirements.txt
2. Git 태그의 명명 규칙
# Schema di naming raccomandato per tag Git+DVC
# Dataset versioning
git tag "data/raw/v1.0" # Prima raccolta dati
git tag "data/processed/v2.3" # Dataset preprocessato v2.3
git tag "data/features/v1.0-30d" # Features con finestra 30 giorni
# Model versioning
git tag "model/baseline/v1.0" # Modello baseline
git tag "model/xgboost/v2.1" # XGBoost tuned v2.1
git tag "model/prod/v3.0" # Versione in produzione attuale
# Pipeline snapshot
git tag "pipeline/2025-Q1" # Snapshot pipeline Q1 2025
# Esempio di workflow release
git tag -a "model/prod/v3.0" \
-m "Production model v3.0
Metrics:
- accuracy: 0.9423
- f1_score: 0.8891
- auc_roc: 0.9567
Dataset: data/features/v2.1
MLflow run: a1b2c3d4e5f6"
git push origin "model/prod/v3.0"
3. GitHub Actions를 사용한 자동화
DVC를 CI/CD 파이프라인에 통합하면 모든 끌어오기 요청의 유효성이 검사됩니다. 실제 데이터와 업데이트된 측정항목을 사용하여:
# .github/workflows/ml-pipeline.yml
name: ML Pipeline Validation
on:
pull_request:
branches: [main]
paths:
- 'src/**'
- 'params.yaml'
- 'dvc.yaml'
jobs:
run-pipeline:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0 # Necessario per dvc metrics diff
- name: Setup Python
uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Install dependencies
run: |
pip install dvc[s3] -r requirements.txt
- name: Configure DVC remote
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
run: |
dvc remote modify --local myremote \
access_key_id $AWS_ACCESS_KEY_ID
dvc remote modify --local myremote \
secret_access_key $AWS_SECRET_ACCESS_KEY
- name: Pull data
run: dvc pull data/splits/
- name: Run pipeline
run: dvc repro
- name: Check metrics regression
run: |
# Confronta metriche con main branch
dvc metrics diff main --md >> $GITHUB_STEP_SUMMARY
# Fallisce se accuracy scende sotto soglia
python scripts/check_metrics.py \
--min-accuracy 0.90 \
--metrics metrics/test_metrics.json
- name: Push updated artifacts
run: dvc push
피해야 할 안티패턴
- 대용량 데이터 파일을 Git에 직접 추가하지 마세요.: 단일 200MB .pkl 파일이라도 저장소를 영원히 복제하는 데 속도가 느려집니다.
- 파이프라인 생성 파일에 dvc add를 사용하지 마세요.: 파이프라인 출력 파일은 다음과 같이 정의되어야 합니다.
outsindvc.yaml, 수동으로 추가되지 않음 - .gitignore의 dvc.lock을 무시하지 마세요.: 이 파일은 재현성을 위해 필수적이며 Git에서 항상 추적해야 합니다.
- 훈련 후에는 DVC 푸시를 잊지 마세요.: 밀지 않고, 하는 동료
dvc pull그들은 새로운 유물을 찾지 못할 것입니다 - dvc.yaml에서 절대 경로를 사용하지 마세요.: 서로 다른 시스템 간의 이식성을 보장하려면 항상 상대 경로를 사용하십시오.
결론 및 다음 단계
데이터세트와 모델의 버전 관리는 사치가 아니라 모든 프로젝트에 필수입니다. 심각한 ML. DVC는 문제를 우아하게 해결합니다. Git과 원활하게 통합되고 지원됩니다. 모든 주요 클라우드 제공업체는 이미 클라우드 제공업체에 있는 사람들을 위한 완만한 학습 곡선을 갖추고 있습니다. Git에 익숙합니다. 2025년 LakeFS의 인수로 생태계는 더욱 강력해지며 엔터프라이즈 데이터 레이크와의 더욱 심층적인 통합을 위한 길을 열어줍니다.
스타트업 또는 SME 팀의 경우, 조합 DVC + Git + S3(또는 DagsHub 무료 저장 공간) 저렴한 비용으로 전문적인 버전 관리 시스템을 제공합니다. 5~10명으로 구성된 팀의 경우 월 100 EUR입니다. 페타바이트 규모의 데이터 레이크를 보유한 기업의 경우 LakeFS는 S3 및 주요 호환성을 유지하면서 엔터프라이즈 기능을 제공합니다. 빅 데이터 프레임워크.
시리즈의 다음 기사에서 우리는 탐구할 것입니다 실험 추적을 위한 MLflow: 매개변수, 지표 및 아티팩트를 기록하는 방법, 모델 레지스트리를 사용하여 관리하는 방법 모델 수명주기 및 완전한 MLOps 시스템을 위해 MLflow를 DVC와 통합하는 방법을 설명합니다.
리소스 및 다음 단계
- 공식 DVC 문서: dvc.org/doc
- LakeFS 문서: docs.lakefs.io
- 무료 저장을 위한 DagsHub: dagshub.com
- 이 시리즈의 샘플 GitHub 리포지토리(모든 MLOps 문서)
- 다음 기사: MLflow를 사용한 실험 추적 - 전체 가이드
- 상호 연결: 고급 딥 러닝 - 고급 교육
- 상호 연결: 컴퓨터 비전 - 객체 감지 파이프라인
ML 버전 관리를 위한 권장 스택(예산 <5K EUR/년)
| 요소 | 기구 | 예상 연간 비용 |
|---|---|---|
| 데이터 및 모델 버전 관리 | DVC(오픈소스) | 무료 |
| 원격 저장소(최대 100GB) | DagsHub 또는 AWS S3 | 무료 / ~28 EUR/년 |
| 실험 추적 | MLflow 자체 호스팅 | 무료(VM 비용만 해당) |
| CI/CD 파이프라인 | GitHub 작업 | 무료(2000분/월) |
| MLflow 서버용 VM | EC2 t3.small 또는 동급 | ~180 EUR/년 |
| 예상 총액 | <250유로/년 |







