版本控制与 DVC
Git、DVC 与可复现性。
版本控制与 DVC
这一课你将能做到
- 说清 Git 与 DVC 的分工:Git 管代码和小文件,DVC 管数据/模型的存储指针
- 用 dvc.yaml + params.yaml 把「造数据 → 清洗 → 特征 → 训练」定义成一条可重放管道
- 配置 remote 存储并完成 push/pull,掌握团队协作时数据与模型文件的流转方式
为什么要学
Git 只适合管文本:仓库超过几百 MB 就开始卡,二进制 diff 没有意义。而 ML 项目最大的两块资产恰恰是数据集(GB 级)和模型文件(百 MB 级)。没有数据版本控制,你永远回答不了「线上这个模型是用哪一版数据训的」这种致命问题。
DVC(Data Version Control)的思路:数据本体放在 Git 仓库之外的存储(本地盘/S3/OSS),Git 里只提交一个几字节的 .dvc 指针文件。于是「提交代码 v3 + 数据 v7」在 Git 历史里原子地绑定在一起,checkout 任意历史提交后 dvc checkout 就能还原对应的数据。
人话:Git 像仓库管理员只登记货单(指针),DVC 像仓库货架(cache + remote),货单和货架通过 MD5 编号对应。本课把上一课的判题日志数据集和特征表全部纳入版本管理。
先建立图像
你的工作区 Git 仓库 DVC Remote
├─ src/train.py ────────────────▶ 存代码本体
├─ data/raw/judge_logs.parquet ──▶ data/raw.dvc (指针, ~100B)
│ 数据本体 ───────────────────────────────────▶ .dvc/cache (MD5 编号)
└─ models/timeout.joblib ───────▶ models.dvc (指针)
模型本体 ──────────────────────────────────▶ 远端存储 (S3/OSS/MinIO)
git checkout v1.2 → 指针文件回到 v1.2
dvc checkout → 按 v1.2 的指针从 cache/remote 还原数据与模型
跟着做
步骤 1:初始化 Git 与 DVC
pip install dvc
git init
dvc init
git commit -m "init dvc"
步骤 2:把上一课的数据纳入 DVC
沿用上一课的 src/make_dataset.py、src/clean.py、src/features.py,先生成数据,再让 DVC 接管:
python src/make_dataset.py && python src/clean.py && python src/features.py
dvc add data/raw/judge_logs.jsonl data/processed/problem_daily.parquet
git add data/raw/judge_logs.jsonl.dvc data/processed/problem_daily.parquet.dvc .gitignore
git commit -m "data: 判题日志 v1 (5000 行)"
观察两件事:原始 jsonl 被写进了 .gitignore(DVC 自动加的);.dvc 文件内容是指针:
outs:
- path: data/raw/judge_logs.jsonl
hash: md5
size: 1234567
hash: 6f1a3c.... # 数据本体的 MD5,存在 .dvc/cache 里
步骤 3:配置 remote 并推送
# 团队共享存储:S3/OSS/MinIO 均可,本地练习用目录模拟
dvc remote add -d storage /tmp/dvcstore # Windows 用 D:/dvcstore 这类绝对路径
dvc push
同事拿到你的仓库后:
git pull && dvc pull # 代码 + 数据一步到位