大容量データの「Git Push」という悪夢
機械学習を始めたばかりの頃、私は「古典的」な失敗を犯しました。数KBのPythonコードから、5GBの画像データセット、800MBのモデルファイル(.pth)まで、すべてをGitに放り込んでしまったのです。その結果、git pushコマンドは1時間経っても終わらず、最終的にはファイルサイズが100MBの制限を超えたため、GitHubに拒否されてしまいました。
応急処置としてgit-lfsを試したこともありますが、ストレージ費用が急速に膨らみ、チームメンバー間の同期も非常に遅くなりました。さらに悪いことに、デバッグのために古いバージョンのデータに戻る際、どのコードがどのデータに対応しているのか全く分からなくなってしまいました。Gitはコード(テキスト)を管理するために作られたものであり、数ギガバイトのバイナリデータを扱うようには設計されていないのです。
なぜGitは「大容量データ」が苦手なのか?
問題はスナップショットの仕組みにあります。テキストファイルを修正する場合、Gitは差分(diff)のみを保存します。しかし、画像やモデルの重みのようなバイナリファイルでは、たとえ1バイトの変更であっても、Gitはファイル全体を新しく保存します。そのため、リポジトリは瞬く間に肥大化します。過去の不要なデータのせいでプロジェクトのgit cloneに30分かかることを想像してみてください。それはまさに苦行です。
多くの開発者は、以下のような「その場しのぎ」の方法を選びがちです:
- データを圧縮してGoogle Driveにアップロードする(バージョンの混乱を招きやすい)。
- Git LFSを使用する(コストがかかり、サーバーに依存する)。
- データのバージョン管理を諦める(AI開発において極めて危険)。
DVC (Data Version Control) — AIエンジニアのための救世主
実際のプロジェクトでDVCを6ヶ月間運用した結果、これが欠けていた「最後のパズルの一片」であると確信しました。DVCはデータをGitに直接保存しません。代わりに、データの代理となる数KBの非常に軽量なメタファイル(.dvc)を作成します。実データは、S3、Google Drive、またはSSH経由の内部サーバーなど、別のストレージにプッシュされます。
DVCの仕組み:
- 実データ: ローカルマシンに置かれ、自動的に
.gitignoreに追加されます。 - .dvcファイル: データを一意に識別するハッシュ値が含まれ、このファイルがGitで管理されます。
- DVC Remote: 実データを保存する場所(重量物用の倉庫のようなもの)。
ゼロからのDVC導入
実際にプロジェクトをセットアップしてみましょう。
1. ツールのインストール
pipで素早くインストールできます。使用するストレージに応じたプラグインのインストールも忘れずに行ってください:
pip install dvc
# S3を使用する場合
pip install "dvc[s3]"
# Google Driveを使用する場合
pip install "dvc[gdrive]"
2. 環境の初期化
プロジェクトのルートディレクトリで、以下のコマンドを実行します:
dvc init
git commit -m "Initialize DVC"
これにより、DVCの設定ディレクトリ .dvc/ が作成されます。これで準備完了です。
3. 最初のデータの管理
例えば、2GBの data/raw/ ディレクトリがあるとします。通常のGitコマンドの代わりに、以下を使用します:
dvc add data/raw/
DVCは data/raw.dvc ファイルを作成します。同時に、data/raw/ を自動的に .gitignore に追加します。あとは、メタファイルをGitにコミットするだけです:
git add data/raw.dvc .gitignore
git commit -m "Add raw dataset via DVC"
4. リモートストレージの設定
個人のGoogle Driveなどをデータ保存先として利用できます。以下は、サーバーをシミュレートするためにローカルディレクトリを設定する例です:
dvc remote add -d myremote /path/to/dvc_storage
git commit .dvc/config -m "Configure remote storage"
データをストレージにプッシュするには、dvc push という1つのコマンドを実行するだけです。
スムーズなチーム開発
同僚がコードを git pull した際、彼らの data/raw/ ディレクトリは空の状態です。しかし心配はいりません。以下のコマンドを打つだけです:
dvc pull
DVCは .dvc ファイル内のハッシュ値を自動的に読み取り、リモートから正しいバージョンのデータをダウンロードします。大容量ファイルの転送が最適化されているため、多くの場合、Git LFSよりもはるかに高速です。
実戦経験:モデルの重み管理
以前、model_v2_final_fix_v3.pth というファイルを探し出すだけで午前中を丸々潰したことがありました。DVCを使えば、よりプロフェッショナルに管理できます。重要なマイルストーンにGitのタグを付けるだけです。
例えば、学習率0.001で精度95%を達成したモデルを保存する場合:
dvc add model.pth
git add model.pth.dvc
git commit -m "LR 0.001で精度95%を達成したモデル"
git tag -a "v1.0-prod" -m "本番環境用モデル"
dvc push
その後、コードがどれだけ変更されても、git checkout v1.0-prod を実行してから dvc checkout を行えば、その時点の正確なコードとモデルがすぐに手に入ります。「どのコードがどのモデルに対応しているか分からない」という状況はもう起こりません。
重要な注意点(「血の教訓」)
- 常に dvc push を忘れない: Gitのコミットは「外枠」を保存するだけです。データをリモートにプッシュし忘れると、同僚は実行するデータがない状態になってしまいます。
- SSHを優先する: 企業で作業する場合は、共有サーバーへの接続にSSHを使用することをお勧めします。Google Driveよりも速度が安定します。
- パイプラインによる自動化:
dvc runについて調べてみてください。コード -> データ -> モデルを自動化された一連の流れとして繋ぎ、常に再現性(reproducible)を確保できます。
結びに代えて
プロジェクトが数個の軽量なCSVファイルだけで構成されているなら、Gitだけで十分です。しかし、数千枚の画像や動画、あるいは数百MBেরモデルファイルを扱い始めたら、DVCは必須の選択肢となります。DVCはGitリポジトリを常にクリーンでプロフェッショナルな状態に保ち、チーム内でのコラボレーションをこれまで以上に容易にしてくれます。

