第1章:GitとGitHubの基本概念
1.1 バージョン管理の必要性
AI開発におけるバージョン管理の重要性
AI開発では、以下の要素を管理する必要があります:
- ソースコード
- 設定ファイル(ハイパーパラメータ)
- 実験スクリプト
- データ前処理コード
これらの変更履歴を追跡しないと、以下の問題が発生します:
- 再現性の欠如: 「先週のモデルの方が精度が良かった」という状況で、元に戻せない
- チーム連携の困難: 複数人が同時に編集すると、変更が上書きされる
- 実験管理の混乱: どのコードでどの結果が得られたか不明
バージョン管理システムの基本機能
バージョン管理システムは以下を提供します:
- 変更履歴の記録
- 複数バージョンの並行管理
- 変更の取り消し・復元
- チームメンバー間での変更の共有
1.2 GitとGitHubの違い
Git
- 定義: 分散型バージョン管理システム
- 動作場所: ローカルコンピュータ
- 主な機能: ファイルの変更履歴管理
GitHub
- 定義: Gitリポジトリのホスティングサービス
- 動作場所: クラウド(Web)
- 追加機能:
- Pull Request
- Issue管理
- プロジェクト管理
- CI/CD(GitHub Actions)
- セキュリティスキャン
関係性
ローカル(Git) ←→ リモート(GitHub)
- Gitで管理したコードをGitHubに保存
- チームメンバーとGitHub経由で共有
1.3 リポジトリの概念
リポジトリとは
プロジェクトのファイルと変更履歴を保存する場所です。
リポジトリの種類
ローカルリポジトリ
- 自分のPC上に存在
.git
ディレクトリとして保存- オフラインで作業可能
リモートリポジトリ
- GitHub上に存在
- チームで共有
- バックアップとしても機能
AI開発でのリポジトリ構成例
my-ai-project/
├── .git/ # Gitの管理情報
├── src/ # ソースコード
├── models/ # 学習済みモデル
├── data/ # データセット(.gitignoreで除外、ファイルサイズが大きいため)
├── notebooks/ # Jupyter Notebook
├── configs/ # 設定ファイル
└── README.md # プロジェクト説明
1.4 コミットとは何か
コミットの定義
ある時点でのファイルの状態を記録したスナップショットです。
コミットの要素
- 一意のID(ハッシュ値):
a1b2c3d...
- 作成者情報: 名前とメールアドレス
- タイムスタンプ: 作成日時
- コミットメッセージ: 変更内容の説明
- 変更内容: 追加・削除・修正されたファイル
良いコミットの原則
- 1つのコミットに1つの変更
- 明確なコミットメッセージ
- 動作する状態でコミット
AI開発でのコミット例
feat: Add data augmentation for image classification
fix: Correct learning rate decay calculation
docs: Update model architecture diagram
experiment: Test different optimizer configurations
- Results logged in experiments/2024-01-15-optimizer-test.json
- Best accuracy: 94.2% with AdamW (lr=0.001)
実験系のコミットでは、結果ファイルへの参照や主要な指標を含めることで、後から実験を追跡しやすくなります。
1.5 ブランチの基本
ブランチとは
コミットの履歴を枝分かれさせる機能です。
ブランチの用途
- 機能開発: 新機能を独立して開発
- 実験: 異なるアプローチを並行して試行
- バグ修正: メインコードに影響せず修正
- リリース管理: 安定版と開発版の分離
基本的なブランチ
main
(またはmaster
): メインブランチ- 注: 近年は包括性の観点から
main
が推奨されています
- 注: 近年は包括性の観点から
develop
: 開発用ブランチfeature/*
: 機能開発用experiment/*
: AI実験用
AI開発でのブランチ戦略例
main
├── develop
│ ├── feature/data-pipeline
│ ├── feature/model-architecture
│ └── experiment/transformer-model
└── release/v1.0
1.6 ローカルとリモートの関係
基本的な流れ
- Clone: リモートからローカルへコピー
- Pull: リモートの更新をローカルへ取得
- Commit: ローカルで変更を記録
- Push: ローカルの変更をリモートへ送信
同期の仕組み
graph LR
A[作業ディレクトリ] -->|add| B[ステージングエリア]
B -->|commit| C[ローカルリポジトリ]
C <-->|push/pull| D[リモートリポジトリ<br/>GitHub]
style A fill:#f9f9f9,stroke:#333,stroke-width:2px
style B fill:#e1f5e1,stroke:#333,stroke-width:2px
style C fill:#e1e5f5,stroke:#333,stroke-width:2px
style D fill:#ffe1e1,stroke:#333,stroke-width:2px
リモートブランチの追跡
- ローカルブランチとリモートブランチの対応
origin/main
のような表記- 追跡関係の設定
AI開発での注意点
- 大容量ファイル: モデルファイルは別管理(Git LFS)
- Git LFS (Large File Storage) は大容量ファイルを効率的に管理するGitの拡張機能
- 詳細は付録Bで解説
- 機密データ: 学習データはリモートに送信しない
- 実験結果: 必要なものだけを選択してプッシュ
データ管理のベストプラクティス
- データセット:
.gitignore
で除外し、別途データ管理システム(DVC、S3等)を使用 - モデルファイル: Git LFSまたはモデルレジストリ(MLflow、Weights & Biases等)で管理
- 実験ログ: 軽量なメタデータのみGitで管理、詳細ログは外部システムで管理
まとめ
本章では、GitとGitHubの基本概念を学習しました:
- バージョン管理はAI開発の再現性確保に必須
- Gitはローカル、GitHubはリモートで動作
- リポジトリ、コミット、ブランチが基本要素
- ローカルとリモートの同期により協働作業が可能
次章では、これらの概念を実際のコマンドで操作する方法を学習します。
確認事項
- GitとGitHubの違いを説明できる
- リポジトリの概念を理解している
- コミットが何を記録するか理解している
- ブランチの用途を説明できる
- ローカルとリモートの関係を理解している