vast-gpu について
vast-gpuは、GPU要件の見積もり、vast.aiのオファー検索、インスタンスの設定から削除までを行うスキルです。レンタル計算資源を使う実験ワークフロー向けで、稼働中のインスタンスをプロジェクトファイルで管理します。
主な機能
- 01GPU・メモリ・ディスク・時間の見積もり
- 02総コスト順のGPUオファー検索
- 03GPUインスタンスのレンタルと設定
- 04実験コードと依存関係の同期
- 05インスタンスの追跡・一覧・削除
活用シーン
- 01予定する学習タスク向けのGPU選定
- 02実験実行用インスタンスの作成
- 03レンタルGPUへのコードと依存関係の配置
- 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:タスク要件を分析する
利用可能なコンテキストを読み取り、タスクに必要なものを判断します。
-
実験計画から(
refine-logs/EXPERIMENT_PLAN.md):- 計算予算(GPU 時間の合計)
- ハードウェアに関するヒント(例:「4x RTX 3090」)
- モデルアーキテクチャとデータセットのサイズ
- 実行順序とマイルストーンごとのコスト見積もり
-
実験スクリプトから(すでに作成されている場合):
- モデルのサイズ — モデルクラス、
num_parameters、設定ファイルを検索します - バッチサイズ、シーケンス長 — これらから VRAM を見積もります
- データセット — データセットのサイズとエポック数からトレーニング時間を見積もります
- マルチ GPU —
DataParallel、DistributedDataParallel、accelerate、deepspeedの使用を確認します
- モデルのサイズ — モデルクラス、
-
ユーザーの説明から(計画やスクリプトがない場合):
- モデル名/サイズ(例:「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 3060 | 0.5× |
| RTX 3090 | 1.0× |
| RTX 4090 | 1.6× |
| A5000 | 0.9× |
| A6000 | 1.1× |
| L40S | 1.5× |
| A100 SXM | 2.0× |
| H100 SXM | 3.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 からホストとポートを解析します。例:
- 入力:
ssh://[email protected]:58955 - ホスト:
1.208.108.242、ポート:58955
重要: 接続の詳細を取得する際は、必ず
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 と照合してください。
アクション:すべて破棄
アクティブなインスタンスをすべて停止します(すべての実験が完了した後に実行してください)。
- 各インスタンスから結果をダウンロードします
- すべてのインスタンスを破棄します
vast-instances.jsonをクリアします- 合計コストを報告します
主なルール
- タスクに基づいて選択する — ユーザーに GPU モデルを選ばせてはいけません。タスクを分析し、要件を見積もり、総額を含めてコストを最適化した選択肢を提示します
- 実験が完了したら、必ずインスタンスを破棄する — vast.ai は秒単位で課金されるため、実行したままにすると費用が無駄になります
- 破棄する前に結果をダウンロードする — 破棄するとデータは永久に失われます
- 短時間の実験(2時間未満)にはオンデマンド料金を優先する。長時間の実行(4時間超)には、チェックポイントを設定したうえで、中断可能な料金または入札料金を提案します
- 信頼性が 0.95 を超えていることを確認する — 信頼性の低いホストでは、トレーニング中にクラッシュする可能性があります
- インスタンスの作成時には
--directSSH を使用する — プロキシ 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)より優れています
vastaiCLI には 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