2. 数据版本控制入门

任务目标

使用DVC(Data Version Control)对本地数据集目录进行版本管理,实现数据文件的追踪(dvc add)、提交(git commit)以及历史版本切换(dvc checkout)。本案例以MNIST数据集的子集模拟真实场景,完成从初始化到版本回滚的完整闭环。

环境与依赖

  • Python 3.8+,已安装 dvc(pip install dvc)与 git
  • 操作系统:Linux/macOS/WSL(Windows原生需额外配置)
  • 无需远程存储,本案例使用本地目录作为DVC缓存

实现步骤与代码

以下命令在项目根目录按顺序执行。核心逻辑为:用DVC接管数据目录,通过Git记录DVC元数据文件(.dvc文件),利用DVC缓存实现版本切换。

# 1. 初始化项目与DVC
mkdir dvc-demo && cd dvc-demo
git init
dvc init
# 创建模拟数据集(v1.0:100个文件)
mkdir -p data/images
for i in $(seq -w 1 100); do echo "img-$i" > data/images/$i.txt; done

# 2. 追踪数据目录(生成 data/images.dvc 元数据文件)
dvc add data/images

# 3. 提交第一个版本
git add data/images.dvc .gitignore
git commit -m "dataset v1.0: 100 samples"

# 4. 模拟数据更新(v2.0:新增50个文件)
for i in $(seq -w 101 150); do echo "img-$i" > data/images/$i.txt; done
dvc add data/images
git add data/images.dvc
git commit -m "dataset v2.0: 150 samples"

# 5. 版本切换演示:回退到v1.0
git checkout HEAD~1 -- data/images.dvc
dvc checkout
# 验证:此时 data/images 目录应恢复为100个文件
ls data/images | wc -l   # 预期输出:100

# 6. 切回最新版本
git checkout main -- data/images.dvc
dvc checkout
ls data/images | wc -l   # 预期输出:150

关键机制说明

  • dvc add 将数据文件复制到DVC缓存(默认 .dvc/cache),并在工作区生成 .dvc 元数据文件(记录文件哈希),原始数据目录被替换为缓存链接。
  • Git只追踪 .dvc 文件和 .gitignore(自动添加数据目录),不直接存储大文件。
  • 版本切换时,先通过 git checkout 切换 .dvc 文件到目标版本,再执行 dvc checkout 让DVC根据元数据哈希从缓存恢复对应数据文件。

验证方法与通过标准

  1. 版本追踪验证:执行 dvc status,输出应显示 Data and pipelines are up to date.,表示当前数据与Git记录一致。
  2. 版本切换验证:完成第5步后,ls data/images | wc -l 输出必须为 100;完成第6步后输出必须为 150。若数值不符,说明缓存或元数据未正确切换。
  3. 缓存完整性验证:执行 dvc cache dir 确认缓存路径存在,且 find .dvc/cache -type f | wc -l 输出为2(两个版本各对应一个哈希文件目录)。

常见问题

  • 切换后文件丢失:若 dvc checkout 报错 file not found,先执行 dvc pull(本地缓存场景下会自动从 .dvc/cache 恢复),再检查 git status 确认 .dvc 文件已正确切换。
  • 缓存占用过大:DVC默认保留所有历史版本缓存,如需清理可执行 dvc gc(会删除未被当前工作区引用的缓存文件,谨慎使用)。