はじめに
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 Authauth = (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訓練テンプレートと統合
- 完全自動化パイプライン構築
