はじめに

GPUクラウドのLambda Labsを使ってLLM訓練を自動化するシステムを作りました。

手動でやっていた作業: 1. Lambda Labs Webコンソールでインスタンス起動 2. IPアドレスをコピー 3. SSHで接続 4. ファイルを転送 5. 訓練スクリプト実行 6. 完了を確認 7. 結果をダウンロード 8. インスタンスを終了

これを全部自動化しました。

完成したシステム

たった1コマンドで全自動

python3 lambda_auto_train.py \ --instance-type gpu_1x_a10 \ --region us-west-1 \ --files train.py data.py \ --command "cd workspace && python3 train.py"

これだけで:

  • ✅ GPUインスタンス自動起動
  • ✅ ファイル自動転送
  • ✅ 訓練自動実行
  • ✅ 結果自動取得
  • ✅ インスタンス自動終了
  • ✅ iPhoneにDiscord通知

寝てる間に訓練完了!

重要な機能:料金制限

誤って高額インスタンスを起動しない仕組みを作りました。 デフォルトで$2/時間以下のインスタンスしか起動できません:

$0.75/時間のA10 → ✅ 起動OK

python3 lambda_api_client.py launch --instance-type gpu_1x_a10 ...

$39.92/時間の8xB200 → ❌ 自動ブロック

python3 lambda_api_client.py launch --instance-type gpu_8x_b200_sxm6 ...

Error: 料金 ($39.92/時間) が 最大料金 ($2.00/時間) を超えています

実際にテストして、$39.92/時間のインスタンスがブロックされることを確認済み。

利用可能なGPU($2以下)

| GPU | 料金 | メモリ | |-----|------|--------| | RTX 6000 | $0.50/時間 | 24 GB | | A10 | $0.75/時間 | 24 GB | | A6000 | $0.80/時間 | 48 GB | | A100 | $1.29/時間 | 40 GB | | GH200 | $1.49/時間 | 96 GB |

MacBookで試行錯誤してから、完成したら$0.75/時間のA10で本番訓練。

エラーハンドリング

ネットワークエラーに強い設計:
  • ファイル転送: 3回リトライ
  • 結果取得: 3回リトライ
  • インスタンス終了: 3回リトライ
  • 部分的失敗許容: ログ取得失敗でも続行

タイムアウトも適切に設定:

  • インスタンス起動: 10分(実際は5分程度)
  • SSH接続: 6分
  • ファイル転送: 5分

Discord通知の例

訓練開始:

🚀 訓練開始
インスタンス: gpu_1x_a10
プロジェクト: trial21
開始時刻: 2025-10-25 19:00:00

進捗通知(10分ごと):

⚙️ 訓練継続中
経過時間: 25.0分
最新ログ:
Epoch 12/20, Loss: 0.456

完了通知:

🎉 訓練完了!
プロジェクト: trial21
結果ファイル: 3個
所要時間: 45.2分
サーバー: 64.181.247.4

iPhoneで通知を受けて、結果を確認できます。

実装の技術詳細

1. Lambda Labs API

Lambda LabsはREST APIを提供していますが、ドキュメントが少ない。 認証方式: HTTP Basic Auth
auth = (api_key, "")  # トレーリングコロンが必要
response = requests.get(
    "https://cloud.lambdalabs.com/api/v1/instances",
    auth=auth
)

2. 起動待機の実装

インスタンスは起動リクエスト後、すぐには使えません:
def wait_for_instance(self, timeout: int = 600) -> str:
    """起動完了とIP取得を待機(最大10分)"""
    start_time = time.time()
    while time.time() - start_time < timeout:
        instances = self.api.list_instances()
        for instance in instances.get("data", []):
            if instance["id"] == self.instance_id:
                if instance["status"] == "active":
                    self.instance_ip = instance["ip"]
                    return self.instance_ip
        time.sleep(5)  # 5秒ごとにポーリング
    raise TimeoutError(f"起動タイムアウト({timeout}秒)")
実際の起動時間は約5分でした。

3. tmux経由での訓練実行

SSH切断に備えて、tmuxセッションで実行:
tmux_cmd = f"tmux new-session -d -s {session_name} '{command} 2>&1 | tee {log_file}'"
subprocess.run(["ssh", server, tmux_cmd])
完了検知:

tmuxセッションの存在確認

result = subprocess.run( ["ssh", server, f"tmux has-session -t {session_name}"], capture_output=True )

セッションが存在しない = 訓練完了

if result.returncode != 0: print("訓練完了")

テスト結果

7種類のテストを実装:

1. ✅ API接続テスト 2. ✅ インスタンス一覧取得 3. ✅ インスタンスタイプ一覧取得 4. ✅ 料金フィルタリング 5. ✅ 料金チェック強制($39.92がブロックされることを確認) 6. ✅ SSH鍵一覧取得 7. ✅ フルワークフロー

全テスト合格 ✅ 実機テストでは、gpu_1x_a10 ($0.75/時間) で起動・終了を確認。

コスト最適化の効果

従来:
  • 手動でインスタンス起動
  • 作業忘れでインスタンス付けっぱなし → 数十ドルの課金
  • 高額インスタンスを間違って起動 → 1時間で$40
自動化後:
  • 訓練完了後、自動的に終了(付けっぱなし防止)
  • $2/時間以下の制限(誤起動防止)
  • 必要な時だけ起動(コスト最小化)
推定節約: 月数百ドル

DPO訓練との統合

このシステムは、以前作ったDPO(Direct Preference Optimization)訓練テンプレートと統合予定。

完全自動化フロー: 1. テンプレートからプロジェクト生成 2. Lambda APIでGPU起動 3. スクリプト・データセット自動転送 4. SFT → DPO → 検証を自動実行 5. 結果自動取得 6. インスタンス自動終了 7. Discord通知

寝る前にコマンド1つ実行すれば、朝には訓練済みモデルが手に入ります。

まとめ

Lambda Labs APIを使ったGPU訓練の完全自動化システムを作りました。 主な機能:
  • 💰 料金制限($2/時間デフォルト)
  • 🔄 リトライ機能(ネットワークエラー対応)
  • ⏱️ 適切なタイムアウト設定
  • 🔔 Discord通知
  • 📝 詳細ログ
テスト結果:
  • ユニットテスト: 7/7合格
  • 実機テスト: 起動・終了確認済み
コスト最適化:
  • 自動終了で付けっぱなし防止
  • 料金制限で誤起動防止
  • 月数百ドルの節約
次のステップ:
  • DPO訓練テンプレートと統合
  • 完全自動化パイプライン構築
MacBookでLLM訓練の試行錯誤 → Lambda Labs GPUで本番実行という理想的なワークフローが実現しました。 --- 関連記事: リポジトリ: https://github.com/... (公開予定) タグ: #MachineLearning #LLM #GPU #LambdaLabs #自動化 #Python #DPO