👌

DVC入門ガイド

に公開

DVC入門ガイド - バイナリデータ管理

目次

  1. DVCとは
  2. セットアップ
  3. 基本操作
  4. リモートストレージ設定
  5. AIプロジェクトでの活用
  6. 実践的なワークフロー
  7. トラブルシューティング

DVCとは

概要

DVC (Data Version Control) は、機械学習プロジェクトのためのバージョン管理ツールです。

主な特徴:

  • 大容量ファイル(データセット、モデル、画像など)をGitのように管理
  • Gitと連携して動作
  • AWS S3、Google Drive、Azure Blobなど様々なストレージに対応
  • データのバージョン管理と再現性を実現

なぜDVCが必要か?

Gitだけでは困る場面:

❌ 大きなデータセット(100MB以上)
❌ 機械学習モデルファイル(数GB)
❌ 画像・動画などのバイナリファイル
❌ 頻繁に更新されるデータ

DVCで解決:

✅ 大容量ファイルを効率的に管理
✅ データのバージョン履歴を追跡
✅ チーム間でデータを共有
✅ ストレージコストを最適化

GitとDVCの役割分担

Git:
├─ コード (.py, .js, .md)
├─ 設定ファイル (.yaml, .json)
└─ DVC管理ファイル (.dvc)

DVC:
├─ データセット (.csv, .parquet)
├─ 機械学習モデル (.pkl, .h5, .pt)
├─ 画像・動画 (.jpg, .mp4)
└─ その他バイナリ (.bin, .dat)

セットアップ

インストール

# pipでインストール
pip install dvc

# 特定のストレージサポートを追加
pip install 'dvc[s3]'      # AWS S3
pip install 'dvc[gs]'      # Google Cloud Storage
pip install 'dvc[azure]'   # Azure Blob Storage
pip install 'dvc[gdrive]'  # Google Drive
pip install 'dvc[all]'     # すべて

# バージョン確認
dvc version

初期化

# Gitリポジトリで初期化(Gitリポジトリが必要)
git init
dvc init

# 何が作成されたか確認
ls -la .dvc/

作成されるファイル:

.dvc/
├── config           # DVC設定ファイル
├── .gitignore       # DVCが自動管理するファイル
└── cache/           # ローカルキャッシュ

.dvcignore           # DVC無視ファイル

自動でGitに追加される:

git status
# .dvc/config
# .dvc/.gitignore
# .dvcignore

基本操作

ファイルをDVCで管理

1. データファイルの追加

# サンプルデータを作成
echo "id,name,age" > data.csv
echo "1,Alice,25" >> data.csv
echo "2,Bob,30" >> data.csv

# DVCで管理
dvc add data.csv

何が起こったか:

作成されたファイル:
1. data.csv.dvc     ← Gitで管理(メタデータ)
2. .gitignore       ← 更新される(data.csvを無視)

data.csv は .dvc/cache/ に移動

data.csv.dvcの中身:

outs:
- md5: a1b2c3d4e5f6...
  size: 45
  path: data.csv

2. Gitにコミット

# .dvcファイルをGitで管理
git add data.csv.dvc .gitignore
git commit -m "Add dataset with DVC"

# 実際のdata.csvはDVCのキャッシュに保存される

データの取得

# DVCで管理されているファイルを取得
dvc pull

# 特定のファイルのみ
dvc pull data.csv.dvc

データの更新

# データを変更
echo "3,Carol,28" >> data.csv

# DVCで再追加
dvc add data.csv

# Gitにコミット
git add data.csv.dvc
git commit -m "Update dataset: add new record"

データの削除

# DVCの管理から外す
dvc remove data.csv.dvc

# ファイルも削除
rm data.csv

# Gitから削除
git rm data.csv.dvc .gitignore
git commit -m "Remove dataset"

リモートストレージ設定

ローカルストレージ(練習用)

# ローカルディレクトリをリモートとして設定
mkdir -p /tmp/dvc-storage

dvc remote add -d myremote /tmp/dvc-storage

# 設定確認
dvc remote list
cat .dvc/config

.dvc/config:

[core]
    remote = myremote
['remote "myremote"']
    url = /tmp/dvc-storage
# リモートにプッシュ
dvc push

# リモートから取得
dvc pull

AWS S3

# S3バケットを設定
dvc remote add -d s3remote s3://my-bucket/dvc-storage

# 認証情報設定(オプション)
dvc remote modify s3remote access_key_id 'YOUR_ACCESS_KEY'
dvc remote modify s3remote secret_access_key 'YOUR_SECRET_KEY'

# または環境変数を使用(推奨)
export AWS_ACCESS_KEY_ID='YOUR_ACCESS_KEY'
export AWS_SECRET_ACCESS_KEY='YOUR_SECRET_KEY'

# プッシュ
dvc push

Google Drive

# Google Driveフォルダを設定
dvc remote add -d gdrive gdrive://folder-id

# 初回はブラウザで認証
dvc push

Azure Blob Storage

# Azureストレージを設定
dvc remote add -d azure azure://mycontainer/path

# 接続文字列を設定
dvc remote modify azure connection_string 'YOUR_CONNECTION_STRING'

# プッシュ
dvc push

Google Cloud Storage

# GCSバケットを設定
dvc remote add -d gcs gs://my-bucket/dvc-storage

# 認証(gcloudコマンドを使用)
gcloud auth application-default login

# プッシュ
dvc push

AIプロジェクトでの活用

機械学習プロジェクトの構成例

ml-project/
├── data/
│   ├── raw/              # 生データ(DVC管理)
│   ├── processed/        # 前処理済み(DVC管理)
│   └── external/         # 外部データ(DVC管理)
├── models/               # 学習済みモデル(DVC管理)
├── notebooks/            # Jupyter notebooks(Git管理)
├── src/                  # ソースコード(Git管理)
│   ├── data/
│   ├── features/
│   ├── models/
│   └── visualization/
├── .dvc/
├── .git/
├── dvc.yaml             # パイプライン定義
└── requirements.txt

データセットの管理

# 大きなデータセットを追加
dvc add data/raw/images.zip
dvc add data/raw/labels.csv

# 前処理済みデータ
dvc add data/processed/train.npz
dvc add data/processed/test.npz

# Gitにコミット
git add data/raw/*.dvc data/processed/*.dvc .gitignore
git commit -m "Add training datasets"

# リモートにプッシュ
dvc push

モデルファイルの管理

# 学習済みモデルを保存
python train.py  # model.h5を生成

# DVCで管理
dvc add models/model.h5

# バージョン情報と共にコミット
git add models/model.h5.dvc
git commit -m "Train model v1.0 - accuracy: 0.95"
git tag -a v1.0 -m "Model version 1.0"

# プッシュ
dvc push
git push --tags

モデルの切り替え

# 古いバージョンに戻る
git checkout v1.0
dvc checkout

# 最新に戻る
git checkout main
dvc checkout

実践的なワークフロー

ワークフロー1: データサイエンティストの日常

シナリオ: 新しいデータセットで実験

# 1. 新しいブランチを作成
git checkout -b experiment/new-dataset

# 2. 新しいデータを取得
wget https://example.com/new_data.csv -O data/raw/new_data.csv

# 3. DVCで管理
dvc add data/raw/new_data.csv
git add data/raw/new_data.csv.dvc .gitignore
git commit -m "Add new experimental dataset"

# 4. データ前処理
python src/data/preprocess.py

# 5. 前処理済みデータも管理
dvc add data/processed/new_data_processed.npz
git add data/processed/new_data_processed.npz.dvc
git commit -m "Add preprocessed data"

# 6. モデル学習
python src/models/train.py

# 7. モデルを管理
dvc add models/experiment_model.h5
git add models/experiment_model.h5.dvc
git commit -m "Train model on new dataset - acc: 0.87"

# 8. 結果が良ければメインにマージ
git checkout main
git merge experiment/new-dataset

# 9. リモートに同期
dvc push
git push

ワークフロー2: チーム開発

メンバーA: データ準備

# データ収集・前処理
dvc add data/raw/dataset_v2.parquet
git add data/raw/dataset_v2.parquet.dvc
git commit -m "Update dataset to v2"
dvc push
git push

メンバーB: データ取得・モデル学習

# 最新のコードとメタデータを取得
git pull

# データを取得
dvc pull

# モデル学習
python train.py

# モデルを共有
dvc add models/model_v2.pkl
git add models/model_v2.pkl.dvc
git commit -m "Train model on dataset v2"
dvc push
git push

ワークフロー3: パイプライン管理

DVCパイプラインを使って、データ処理からモデル学習まで自動化:

# dvc.yaml
stages:
  preprocess:
    cmd: python src/data/preprocess.py
    deps:
      - src/data/preprocess.py
      - data/raw/data.csv
    outs:
      - data/processed/train.npz
      - data/processed/test.npz

  train:
    cmd: python src/models/train.py
    deps:
      - src/models/train.py
      - data/processed/train.npz
    params:
      - train.learning_rate
      - train.epochs
    outs:
      - models/model.h5
    metrics:
      - metrics/train_metrics.json:
          cache: false

  evaluate:
    cmd: python src/models/evaluate.py
    deps:
      - src/models/evaluate.py
      - models/model.h5
      - data/processed/test.npz
    metrics:
      - metrics/eval_metrics.json:
          cache: false
# パイプライン実行
dvc repro

# 特定のステージのみ
dvc repro train

# メトリクスの確認
dvc metrics show

# 変更があった場合のみ再実行される(効率的)
dvc repro

AIエージェントとの協働パターン

パターン1: AIが生成したデータ処理スクリプト

# 1. AIにデータ処理を依頼
# "CSVを前処理してNumPy配列に変換するスクリプトを書いて"

# 2. 生成されたスクリプトを保存
# src/data/ai_preprocess.py

# 3. Gitで管理
git add src/data/ai_preprocess.py
git commit -m "Add AI-generated preprocessing script"

# 4. スクリプト実行
python src/data/ai_preprocess.py

# 5. 出力データをDVCで管理
dvc add data/processed/ai_processed.npy
git add data/processed/ai_processed.npy.dvc
git commit -m "Add AI-preprocessed data"
dvc push

パターン2: モデルの実験管理

# AIに複数のモデルアーキテクチャを試してもらう
git checkout -b experiment/ai-models

# モデル1
# AI生成コード → models/ai_model_v1.py
dvc add models/ai_model_v1.h5
git add models/ai_model_v1.h5.dvc models/ai_model_v1.py
git commit -m "AI model v1 - CNN - acc: 0.85"

# モデル2
# AI生成コード → models/ai_model_v2.py
dvc add models/ai_model_v2.h5
git add models/ai_model_v2.h5.dvc models/ai_model_v2.py
git commit -m "AI model v2 - ResNet - acc: 0.91"

# 最良のモデルをメインにマージ
git checkout main
git merge experiment/ai-models
dvc push

DVCとGitの統合ワークフロー

完全な開発サイクル

# === 準備 ===
# プロジェクト作成
mkdir ml-project && cd ml-project
git init
dvc init
git add .dvc .dvcignore
git commit -m "Initialize DVC"

# リモート設定
dvc remote add -d storage s3://my-bucket/dvc
git add .dvc/config
git commit -m "Configure remote storage"

# === データ追加 ===
# データをダウンロード
wget https://example.com/dataset.zip

# DVCで管理
dvc add dataset.zip
git add dataset.zip.dvc .gitignore
git commit -m "Add dataset"
dvc push

# === 開発 ===
# 機能ブランチ作成
git checkout -b feature/new-model

# コード作成(Git管理)
# ... コーディング ...
git add src/
git commit -m "Add new model architecture"

# データ処理
python src/preprocess.py

# 処理済みデータ(DVC管理)
dvc add data/processed/
git add data/processed.dvc
git commit -m "Add preprocessed data"

# モデル学習
python src/train.py

# モデル(DVC管理)
dvc add models/model.h5
git add models/model.h5.dvc
git commit -m "Train new model - acc: 0.92"

# プッシュ
dvc push
git push origin feature/new-model

# === マージ ===
git checkout main
git merge feature/new-model
dvc push
git push

# === 他のメンバーが取得 ===
git pull
dvc pull

ディレクトリの管理

フォルダ全体をDVCで管理

# 画像フォルダ全体を管理
dvc add data/images/

# 生成されるファイル
# data/images.dvc
# .gitignore(data/imagesが追加される)

# Gitにコミット
git add data/images.dvc .gitignore
git commit -m "Add image dataset (1000 images)"

大量のファイルを効率的に管理

# 構造例
data/
├── train/
│   ├── class_a/  (1000 images)
│   └── class_b/  (1000 images)
└── test/
    ├── class_a/  (200 images)
    └── class_b/  (200 images)

# フォルダごと管理
dvc add data/train
dvc add data/test

# メタデータのみGitで管理
git add data/train.dvc data/test.dvc

メトリクスとパラメータ管理

params.yaml

# params.yaml
model:
  learning_rate: 0.001
  batch_size: 32
  epochs: 100
  
data:
  train_split: 0.8
  validation_split: 0.1
  test_split: 0.1

メトリクスの記録

# train.py
import json

# 学習後
metrics = {
    "accuracy": 0.95,
    "loss": 0.12,
    "val_accuracy": 0.93,
    "val_loss": 0.15
}

with open("metrics/train_metrics.json", "w") as f:
    json.dump(metrics, f)

メトリクスの比較

# 現在のメトリクス
dvc metrics show

# 別のブランチと比較
dvc metrics diff main experiment/new-model

# 履歴を確認
dvc metrics show --all-branches

トラブルシューティング

よくある問題と解決法

問題1: "file is not tracked by DVC"

# 原因: .dvcファイルが存在しない、または同期していない

# 解決:
dvc checkout
# または
dvc pull

問題2: ストレージ容量不足

# キャッシュのクリーンアップ
dvc gc -w  # 作業スペースに無いファイルを削除

# 古いバージョンを削除
dvc gc --all-branches --all-tags

問題3: リモートへの接続エラー

# リモート設定確認
dvc remote list
cat .dvc/config

# 認証情報確認
dvc remote modify myremote --local access_key_id 'KEY'

# 接続テスト
dvc push --remote myremote

問題4: ファイルが重複管理されている

# Git と DVC で重複
# .gitignore を確認
cat .gitignore

# DVCで管理すべきファイルをGitから削除
git rm --cached large_file.bin
dvc add large_file.bin
git add large_file.bin.dvc .gitignore

問題5: マージコンフリクト(.dvcファイル)

# .dvcファイルでコンフリクト発生
git status

# 正しいバージョンを選択
# data.csv.dvc を編集してコンフリクトマーカーを削除

# DVCで再チェックアウト
dvc checkout data.csv.dvc

# マージ完了
git add data.csv.dvc
git commit -m "Resolve DVC conflict"

ベストプラクティス

1. .gitignoreとDVCの使い分け

# .gitignore (Git用)
*.pyc
__pycache__/
.env
.venv/
.DS_Store

# .dvcignore (DVC用)
*.tmp
*.log
.ipynb_checkpoints/

2. 適切なファイルサイズの基準

Git で管理:
- ソースコード
- 設定ファイル
- 小さなデータ(< 10MB)

DVC で管理:
- データセット(> 10MB)
- モデルファイル(> 10MB)
- 画像・動画・音声
- バイナリファイル

3. コミットメッセージの規約

# データの場合
git commit -m "data: Add training dataset v2 (10K samples)"

# モデルの場合  
git commit -m "model: Train ResNet50 - acc: 0.95, loss: 0.12"

# パイプラインの場合
git commit -m "pipeline: Update preprocessing steps"

4. ブランチ戦略

# データ実験
git checkout -b data/experiment-v2
dvc add data/experiment_v2.csv
git add data/experiment_v2.csv.dvc
git commit -m "data: Add experimental dataset v2"

# モデル実験
git checkout -b model/resnet-experiment
dvc add models/resnet_experiment.h5
git add models/resnet_experiment.h5.dvc
git commit -m "model: Train ResNet for experiment"

5. タグ付けでバージョン管理

# マイルストーン
git tag -a v1.0-data -m "Dataset version 1.0"
git tag -a v1.0-model -m "Model version 1.0 - prod ready"

# プロダクション
git tag -a prod-2024-01 -m "Production model January 2024"

# タグをプッシュ
git push --tags

まとめ

DVCを使うべき場面

✅ 使うべき:

  • 機械学習プロジェクト
  • 大容量データの管理
  • モデルのバージョン管理
  • データ処理パイプライン
  • チームでのデータ共有

❌ 不要な場合:

  • 小さなプロジェクト(全て< 10MB)
  • バイナリファイルがない
  • 1人だけの開発

重要コマンド一覧

# 初期化
dvc init

# ファイル管理
dvc add <file>
dvc push
dvc pull
dvc checkout

# リモート設定
dvc remote add -d <name> <url>
dvc remote list

# パイプライン
dvc repro
dvc dag

# メトリクス
dvc metrics show
dvc metrics diff

# メンテナンス
dvc gc
dvc status

次のステップ

  1. 実際のプロジェクトで試す
  2. CML (Continuous Machine Learning) を学ぶ
  3. DVC Studio でビジュアル管理
  4. MLflow などとの連携

参考リンク

Discussion