mcpField
V
vast-gpu

vast-gpu

github.com/wanshuiyinクラウド・DevOps18.2k460 回インストール4 日前に更新
リポジトリ

vast-gpu について

vast-gpuは、GPU要件の見積もり、vast.aiのオファー検索、インスタンスの設定から削除までを行うスキルです。レンタル計算資源を使う実験ワークフロー向けで、稼働中のインスタンスをプロジェクトファイルで管理します。

主な機能

  1. 01GPU・メモリ・ディスク・時間の見積もり
  2. 02総コスト順のGPUオファー検索
  3. 03GPUインスタンスのレンタルと設定
  4. 04実験コードと依存関係の同期
  5. 05インスタンスの追跡・一覧・削除

活用シーン

  1. 01予定する学習タスク向けのGPU選定
  2. 02実験実行用インスタンスの作成
  3. 03レンタルGPUへのコードと依存関係の配置
  4. 04インスタンス削除前の結果回収

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/wanshuiyin/auto-claude-code-research-in-sleep --skill vast-gpu

インストール後、Claude Code で/vast-gpuを入力して読み込まれたか確認します。

詳細

Vast.ai GPU 管理

vast.ai GPU インスタンスを管理します:$ARGUMENTS

概要

vast.ai から高性能で低価格な GPU をオンデマンドでレンタルします。このスキルはトレーニングタスクを分析して GPU の要件を判断し、コストパフォーマンスに優れたオファーを検索して、推定総費用とともに選択肢を提示し、レンタルからセットアップ、実行、破棄までのライフサイクル全体を管理します。

ユーザーが GPU モデルやハードウェアを指定する必要はありません。タスクの内容を説明すれば、レンタルするものはこのスキルが判断します。

前提条件: vastai CLI がインストールされており(Python ≥ 3.10 が必要)、認証済みである必要があります:

pip install vastai
vastai set api-key YOUR_API_KEY

システムの Python が 3.10 未満の場合は、Python ≥ 3.10 の仮想環境(例:conda create、pyenv、uv venv など)を作成し、その環境に vastai をインストールしてください。

SSH 公開鍵は、いずれかのインスタンスを作成する前に https://cloud.vast.ai/manage-keys/ にアップロードする必要があります。鍵はインスタンスの作成時に組み込まれます。レンタル後に鍵を追加した場合は、インスタンスを破棄して作り直す必要があります。

状態ファイル

実行中のすべての vast.ai インスタンスは、プロジェクトルートにある vast-instances.json で追跡されます:

[
  {
    "instance_id": 33799165,
    "offer_id": 25831376,
    "gpu_name": "RTX_3060",
    "num_gpus": 1,
    "dph": 0.0414,
    "ssh_url": "ssh://[email protected]:58955",
    "ssh_host": "1.208.108.242",
    "ssh_port": 58955,
    "created_at": "2026-03-29T21:12:00Z",
    "status": "running",
    "experiment": "exp01_baseline",
    "estimated_hours": 4.0,
    "estimated_cost": 0.17
  }
]

このファイルは、/run-experiment と /monitor-experiment が vast.ai インスタンスに接続するための信頼できる情報源です。

ワークフロー

アクション:プロビジョニング(デフォルト)

タスクを分析し、最適な GPU を見つけ、コストを最適化した選択肢を提示します。これは主要なエントリーポイントで、直接呼び出されるほか、gpu: vast が設定されている場合は /run-experiment によって自動的に呼び出されます。

ステップ 1:タスク要件を分析する

利用可能なコンテキストを読み取り、タスクに必要なものを判断します。

  1. 実験計画から(refine-logs/EXPERIMENT_PLAN.md):

    • 計算予算(GPU 時間の合計)
    • ハードウェアに関するヒント(例:「4x RTX 3090」)
    • モデルアーキテクチャとデータセットのサイズ
    • 実行順序とマイルストーンごとのコスト見積もり
  2. 実験スクリプトから(すでに作成されている場合):

    • モデルのサイズ — モデルクラス、num_parameters、設定ファイルを検索します
    • バッチサイズ、シーケンス長 — これらから VRAM を見積もります
    • データセット — データセットのサイズとエポック数からトレーニング時間を見積もります
    • マルチ GPU — DataParallel、DistributedDataParallel、accelerate、deepspeed の使用を確認します
  3. ユーザーの説明から(計画やスクリプトがない場合):

    • モデル名/サイズ(例:「LLaMA-7B をファインチューニング」「ResNet-50 をトレーニング」)
    • データセットの規模(例:「ImageNet」「10k サンプル」)
    • 推定所要時間(例:「約 2 時間」)

ステップ 2:GPU 要件を決定する

タスク分析に基づいて、以下を決定します。

要素推定方法
最小 VRAMモデルのパラメーター数 × 4 バイト(fp32)または × 2(fp16/bf16)+オプティマイザーの状態+アクティベーション。目安:7B モデル ≈ 16 GB(fp16)、13B ≈ 28 GB、70B ≈ 140 GB(マルチ GPU が必要)。ResNet/ViT ≈ 4~8 GB。20% の余裕を追加します。
GPU 数以下の場合を除き 1:モデルが単一 GPU の VRAM に収まらない、スクリプトで DDP/FSDP/DeepSpeed を使用している、または計画でマルチ GPU が指定されている
推定時間実験計画のコスト列から取得するか、次の式で計算します:(データセットサイズ × エポック数)/(スループット × バッチサイズ)。利用可能であれば、ユーザーの見積もりをデフォルトとして使用します。セットアップや予想外の速度低下に備えて、30% の余裕を追加します
最小ディスク容量基本容量 20 GB +モデルチェックポイントのサイズ+データセットのサイズ。デフォルト:50 GB
CUDA バージョンPyTorch のバージョンに合わせます。PyTorch 2.x には CUDA ≥ 11.8 が必要です。デフォルト:12.1

ステップ 3:オファーを検索する

複数の GPU ティアを検索し、最もお得なものを見つけます。常に幅広く検索し、GPU モデルを 1 種類に限定しないでください。

# Tier 1: Budget GPUs (good for small models, fine-tuning, ablations)
vastai search offers "gpu_ram>=<MIN_VRAM> num_gpus>=<N> reliability>0.95 inet_down>100" -o 'dph+' --storage <DISK> --limit 10

# Tier 2: If VRAM > 24 GB, also search high-VRAM cards specifically
vastai search offers "gpu_ram>=48 num_gpus>=<N> reliability>0.95" -o 'dph+' --storage <DISK> --limit 5

出力は、次の列を持つテーブルです:ID、CUDA、N(GPU 数)、Model、PCIE、cpu_ghz、vCPUs、RAM、Disk、$/hr、DLP(ディープラーニング性能)、score、NV Driver、Net_up、Net_down、R(信頼性 %)、Max_Days、mach_id、status、host_id、ports、country。

**最初の列(ID)**は、vastai create instance に必要なオファー ID です。

ステップ 4:コストを最適化した選択肢を提示する

推定総コストの低い順に、ユーザーに3 つの選択肢を提示します。

Task analysis:
- Model: [model name/size] → estimated VRAM: ~[X] GB
- Training: ~[Y] hours estimated
- Requirements: [N] GPU(s), ≥[X] GB VRAM, ~[Z] GB disk

Recommended options (sorted by estimated total cost):

| # | GPU          | VRAM  | $/hr   | Est. Hours | Est. Total | Reliability | Offer ID  |
|---|-------------|-------|--------|------------|------------|-------------|-----------|
| 1 | RTX 3060    | 12 GB | $0.04  | ~6h        | ~$0.25     | 99.4%       | 25831376  |  ← cheapest
| 2 | RTX 4090    | 24 GB | $0.28  | ~4h        | ~$1.12     | 99.2%       | 6995713   |  ← best value
| 3 | A100 SXM    | 80 GB | $0.95  | ~2h        | ~$1.90     | 99.5%       | 7023456   |  ← fastest

Option 1 is cheapest overall. Option 3 finishes fastest.
Pick a number (or type a different offer ID):

提示に関する重要なルール:

  • 時間単価だけでなく、必ず推定総コスト($/hr × 推定時間)を示します
  • 高速な GPU ほど推定時間が短くなります(相対 FLOPS に応じて調整します)
  • 安価な選択肢の信頼性が 0.97 未満の場合、「予算重視の選択肢 — 中断される確率は 3%」と明記します
  • タスクが小規模(1 時間未満)の場合は、さらにコストを抑えられる中断可能な料金を推奨します
  • VRAM 要件を満たすオファーがない場合は、その理由を説明し、代替案(例:マルチ GPU、量子化)を提案します

相対的な速度スケーリング(GPU ティア間の時間見積もりに使用する概算値):

GPU相対速度(FP16)
RTX 30600.5×
RTX 30901.0×
RTX 40901.6×
A50000.9×
A60001.1×
L40S1.5×
A100 SXM2.0×
H100 SXM3.3×

これらを使って、各オファーの推定時間を基準となる推定時間から調整します。

アクション:レンタル

ユーザーが選択したオファーからインスタンスを作成します。

ステップ 1:インスタンスを作成する

vastai create instance <OFFER_ID> \
  --image <DOCKER_IMAGE> \
  --disk <DISK_GB> \
  --ssh \
  --direct \
  --onstart-cmd "apt-get update && apt-get install -y git screen rsync"

デフォルトの Docker イメージ:pytorch/pytorch:2.1.0-cuda12.1-cudnn8-devel(設定されている場合は、AGENTS.md の image: フィールドで上書きできます)。

出力は次のようになります。

Started. {'success': True, 'new_contract': 33799165, 'instance_api_key': '...'}

new_contract の値がインスタンス ID です。以降のすべてのコマンドで使用するため、保存してください。

ステップ 2:インスタンスが準備完了になるまで待つ

インスタンスのステータスを 20 秒ごとに確認し、running になるまで待ちます(通常は 30~60 秒、最大で約 5 分かかります)。

vastai show instances --raw | python3 -c "
import sys, json
instances = json.load(sys.stdin)
for inst in instances:
    if inst['id'] == <INSTANCE_ID>:
        print(inst['actual_status'])
"

待機中の状態:loading → running。loading の状態が 5 分を超えて続く場合は、ホストの応答が遅いか、イメージのサイズが大きい可能性があることをユーザーに伝えてください。

ステップ 3:SSH 接続の詳細を取得する

vastai ssh-url <INSTANCE_ID>

次の形式の URL が返されます:ssh://root@<HOST>:<PORT>

この URL からホストとポートを解析します。例:

重要: 接続の詳細を取得する際は、必ず vastai ssh-url を使用してください。vastai show instances の ssh_host/ssh_port は、直接接続のエンドポイントとは異なるプロキシサーバーを指している場合があるため、使用しないでください。

ステップ 4:SSH 接続を確認する

ssh -o StrictHostKeyChecking=no -o ConnectTimeout=15 -p <PORT> root@<HOST> "nvidia-smi && echo 'CONNECTION_OK'"

SSH が「Permission denied (publickey)」で失敗する場合:

  • インスタンス作成前に、ユーザーの SSH キーが https://cloud.vast.ai/manage-keys/ にアップロードされていません。
  • 対処方法: このインスタンスを破棄し、ユーザーにキーをアップロードしてもらってから、新しいインスタンスを作成します。キーは作成時に組み込まれるため、実行中のインスタンスにキーを追加する方法はありません。

SSH が「Connection refused」で失敗する場合:

  • インスタンスの初期化がまだ終わっていない可能性があります。15 秒間隔で最大 3 回再試行してください。

ステップ 5:状態ファイルを更新する

ステップ 3 で取得した ssh_url、推定稼働時間、コストなど、新しいインスタンスの詳細を vast-instances.json に書き込むか、既存の内容を更新します。

ステップ 6:報告する

Vast.ai instance ready:
- Instance ID: <ID>
- GPU: <GPU_NAME> x <NUM_GPUS>
- Cost: $<DPH>/hr (estimated total: ~$<TOTAL>)
- SSH: ssh -p <PORT> root@<HOST>
- Docker: <IMAGE>

To deploy: /run-experiment (will auto-detect this instance)
To destroy when done: /vast-gpu destroy <ID>
アクション:セットアップ

../shared-references/compute-env-contract.md に従ってください。宣言型の環境仕様(1 つの大きなインストールではなく、順序付けされた pip_phases)を書き込むか再利用し、.aris/compute/vast.md に env:<name>@<specHash> ブロックを記録してから、実際の実験を開始する前にシード済みカーネルの検証を実行します。新しいインスタンスで import torch が成功しても、誤った SM 向けのホイールがインストールされている可能性があります。

レンタルしたインスタンスを、特定の実験向けにセットアップします。vast.ai インスタンスを対象とする /run-experiment によって自動的に呼び出されます。

ステップ 1:依存関係をインストールする(環境仕様をフェーズごとに適用する)

プロジェクトの環境仕様を順序付けされたフェーズとして適用します。フェーズごとに pip install を 1 回実行することで、後続のパッケージによって先行フェーズのバージョン固定が引きずられないようにします。

# phase 1: the fought-over pins first (torch/cuda wheel)
ssh -p <PORT> root@<HOST> "pip install -q torch==<pinned>"
# phase 2+: everything that must respect those pins
ssh -p <PORT> root@<HOST> "pip install -q wandb tensorboard scipy scikit-learn pandas"

レガシーな代替方法 — プロジェクトに環境仕様がなく、requirements.txt だけがある場合は、1 つのフェーズとしてインストールします。その後、バージョンの競合が発生した場合は、それを順序付けされたフェーズに変換する目安とします。

scp -P <PORT> requirements.txt root@<HOST>:/workspace/
ssh -p <PORT> root@<HOST> "pip install -q -r /workspace/requirements.txt"

注:scp ではポート指定に大文字の -P を使いますが、ssh では小文字の -p を使います。

ステップ 2:コードを同期する

rsync -avz -e "ssh -p <PORT>" \
  --include='*.py' --include='*.yaml' --include='*.yml' --include='*.json' \
  --include='*.txt' --include='*.sh' --include='*/' \
  --exclude='*.pt' --exclude='*.pth' --exclude='*.ckpt' \
  --exclude='__pycache__' --exclude='.git' --exclude='data/' \
  --exclude='wandb/' --exclude='outputs/' \
  ./ root@<HOST>:/workspace/project/

ステップ 3:セットアップを確認する

ssh -p <PORT> root@<HOST> "cd /workspace/project && python -c 'import torch; print(f\"PyTorch {torch.__version__}, CUDA: {torch.cuda.is_available()}, GPUs: {torch.cuda.device_count()}\")'"

期待される出力:PyTorch 2.1.0, CUDA: True, GPUs: 1(マルチ GPU インスタンスの場合は、GPU 数がさらに多くなります)。

アクション:破棄

請求を停止するため、vast.ai インスタンスを終了します。

ステップ 1:結果が収集済みか確認する

破棄する前に、ダウンロードする実験結果があるか確認します。

ssh -p <PORT> root@<HOST> "ls /workspace/project/results/ 2>/dev/null || echo 'NO_RESULTS_DIR'"

結果がある場合は、先にダウンロードします。

rsync -avz -e "ssh -p <PORT>" root@<HOST>:/workspace/project/results/ ./results/

ログもダウンロードします。

scp -P <PORT> root@<HOST>:/workspace/*.log ./logs/ 2>/dev/null

ステップ 2:インスタンスを破棄する

vastai destroy instance <INSTANCE_ID>

出力:destroying instance <INSTANCE_ID>.

破棄は取り消せません。インスタンス上のすべてのデータは完全に削除されます。

ステップ 3:状態ファイルを更新する

vast-instances.json からインスタンスを削除するか、ステータスを destroyed に変更します。

ステップ 4:コストを報告する

作成時刻と $/hr に基づいて実際のコストを計算します。

Instance <ID> destroyed.
- Duration: ~X.X hours
- Actual cost: ~$X.XX (estimated was $Y.YY)
- Results downloaded to: ./results/
アクション:一覧表示

稼働中の vast.ai インスタンスをすべて表示します。

vastai show instances

実験との関連付けについては、vast-instances.json と照合してください。

アクション:すべて破棄

アクティブなインスタンスをすべて停止します(すべての実験が完了した後に実行してください)。

  1. 各インスタンスから結果をダウンロードします
  2. すべてのインスタンスを破棄します
  3. vast-instances.json をクリアします
  4. 合計コストを報告します

主なルール

  • タスクに基づいて選択する — ユーザーに GPU モデルを選ばせてはいけません。タスクを分析し、要件を見積もり、総額を含めてコストを最適化した選択肢を提示します
  • 実験が完了したら、必ずインスタンスを破棄する — vast.ai は秒単位で課金されるため、実行したままにすると費用が無駄になります
  • 破棄する前に結果をダウンロードする — 破棄するとデータは永久に失われます
  • 短時間の実験(2時間未満)にはオンデマンド料金を優先する。長時間の実行(4時間超)には、チェックポイントを設定したうえで、中断可能な料金または入札料金を提案します
  • 信頼性が 0.95 を超えていることを確認する — 信頼性の低いホストでは、トレーニング中にクラッシュする可能性があります
  • インスタンスの作成時には --direct SSH を使用する — プロキシ SSH より高速です
  • 接続情報の取得には 必ず vastai ssh-url <ID> を使用する — show instances に表示されるホストやポートと異なる場合があります
  • インスタンスを作成する前に SSH キーをアップロードする — キーは作成時に組み込まれます。SSH が「Permission denied」で失敗した場合は、キーを追加してからインスタンスを破棄し、再作成してください
  • デフォルトの Docker イメージ:ユーザーが別のイメージを指定しない限り、pytorch/pytorch:2.1.0-cuda12.1-cudnn8-devel を使用します
  • インスタンス上の作業ディレクトリ:/workspace/(Docker のデフォルト)。コードは /workspace/project/ に同期されます
  • 状態ファイル vast-instances.json は常に最新に保つ — ほかのスキルがこのファイルに依存しています
  • $/時間だけでなく、合計コストの見積もりを提示する — 2時間で完了する GPU が $0.90/時間($1.80)なら、8時間かかる $0.30/時間の GPU($2.40)より優れています
  • vastai CLI には Python ≥ 3.10 が必要 — システムの Python が古い場合は、conda 環境を使用します

AGENTS.md の例

ユーザーは gpu: vast を設定するだけで構いません。ハードウェアの希望を指定する必要はありません。

## Vast.ai
- gpu: vast                  # tells run-experiment to use vast.ai
- auto_destroy: true         # auto-destroy after experiment completes (default: true)
- max_budget: 5.00           # optional: max total $ to spend (skill warns if estimate exceeds this)
- image: pytorch/pytorch:2.1.0-cuda12.1-cudnn8-devel  # optional: override Docker image

このスキルは、実験スクリプトと計画を分析し、レンタルする GPU を決定します。GPU モデル、VRAM、インスタンス数を指定する必要はありません。

ほかのスキルとの組み合わせ

/run-experiment "train model"       ← detects gpu: vast, calls /vast-gpu provision
  ↳ /vast-gpu provision             ← analyzes task, presents options with cost
  ↳ user picks option               ← rent + setup + deploy
  ↳ /vast-gpu destroy               ← auto-destroy when done (if auto_destroy: true)

/vast-gpu provision                 ← manual: analyze task + show options
/vast-gpu rent <offer_id>           ← manual: rent a specific offer
/vast-gpu list                      ← show active instances
/vast-gpu destroy <instance_id>     ← tear down, stop billing
/vast-gpu destroy-all               ← tear down everything

コメント