- SSH 鍵をインスタンス作成の前に登録しなければならない理由と、忘れたときの救済手段
vastaiコマンドを入れて、1 枚の RTX 5090 の候補を 3 件まで絞り込む手順- RENT を押した瞬間と running になった瞬間に、それぞれ何の課金が始まるか
- 起動待ちで「二度と running にならない」3 つの状態の見分け方
- 15 分・約 0.18 USD で「借りる → 入る → 壊す」を 1 周する実践
借りるまでは 7 段、うち 4 段はまだ無料
この章で初めてお金が動きます。とはいえ、動く額は缶コーヒー 1 本分です。先に全体の地図を置きます。
vast.ai の公式ドキュメントは、レンタルを 3 ステップだと定義しています。① テンプレートを選ぶ → ② GPU を探す → ③ 設定して借りるの順です。「先にソフト環境(テンプレート)を決めて、後から GPU を探す」という順序が初心者には逆に見えますが、これには理由があります。テンプレートを選ぶと、そのテンプレートに対応できないマシンが検索結果から落ちるからです(第 7 章)。GPU を先に決めても、テンプレートを変えた瞬間にその GPU が候補から消えることがあります。
この 3 ステップの前に SSH 鍵の登録を足し、後ろに起動待ちと接続確認を足すと、実際に手を動かす単位は 7 段になります。所要時間を足し合わせると、起動待ちを含めて15 分前後です。
金額を先に出しておきます。2026-08-24 時点の 1× RTX 5090(on-demand・借りられる状態)の 1 時間単価は、実測 64 件の中央値が 0.4037 USD/時、最安が 0.3215 USD/時でした。同じ 64 件のディスク単価は中央値 0.20 USD/GB/月です。
この章の実践に当てはめた計算例を出します。0.40 USD/時 のマシンをディスク 40 GB で借り、2 分で起動して 25 分後に destroy した場合です。
GPU = 0.40 USD/時 × (25 分 ÷ 60) = 約 0.17 USD
ディスク = 40 GB × 0.20 USD/GB/月 ÷ 720 時間 × 0.45 時間 = 約 0.005 USD
ディスクの式で 720 で割っているのは、1 か月を 30 日 = 720 時間として時間あたりに直しているからです(ストレージの単価は「USD/GB/月」で提示されるため、時間課金に合わせるにはこの換算が要ります)。0.45 時間は起動待ち 2 分 + 稼働 25 分 = 27 分のことです。
合わせて約 0.18 USD(1 USD = 150 円として約 27 円)。この 2 つの数字は始まる瞬間が違います。ここが初心者の見積もりが崩れる場所なので、時間軸で見ておきます。
SSH 鍵 — 順序を間違えると、作ったインスタンスに入れない
SSH(= 遠くのコンピューターに安全にログインする仕組み)で入るには鍵が要ります。vast.ai のインスタンスは鍵認証のみで、パスワード認証はセキュリティ上の理由で無効化されています。したがって「SSH でパスワードを聞かれる」のは正常な状態ではなく、鍵の登録が失敗しているサインです。
鍵は 2 つのファイルで 1 組です。ssh-keygen を 1 回打つと手元に 2 つできます。
id_ed25519— 秘密鍵。手元に置いたまま、絶対に誰にも渡さない側id_ed25519.pub— 公開鍵。サーバーに登録する側。共有しても安全
この公開鍵が「手元 → vast.ai のアカウント → インスタンス」と 2 段で伝わります。2 段目が効くのは、インスタンスを作る瞬間だけです。
attach ssh で後付けできますが、VM インスタンスは作り直しになります。公式ドキュメントは Warning としてこう書いています。「インスタンスを作る前にやれ。公開鍵はコンテナ作成時点で適用される」。登録場所は 3 レイヤーあり、効果範囲が違います。
| 登録する場所 | やり方 | 効果範囲 |
|---|---|---|
| アカウント(画面) | cloud.vast.ai/manage-keys に公開鍵を貼る | 以後新規作成するインスタンスに自動で入る |
| アカウント(コマンド) | vastai create ssh-key ~/.ssh/id_ed25519.pub | 同上 |
| インスタンス個別 | インスタンスカードの SSH 鍵ボタン / vastai attach ssh <インスタンス ID> <公開鍵> | その 1 台だけ。作成後の救済に使う |
お金は動きません(0 USD)。所要 4 分。この章で唯一「やり直しが効かない」準備なので、借りる前に必ず済ませます。
- ターミナル(Windows は PowerShell)を開いて次を実行する。
<自分のメールアドレス>は識別用のコメントで、セキュリティには関係ありません。保存先を聞かれたら、そのまま Enter を 3 回押します。
ssh-keygen -t ed25519 -C "<自分のメールアドレス>"
- 公開鍵の中身を表示する。macOS / Linux と Windows でコマンドが違います。
# macOS / Linux
cat ~/.ssh/id_ed25519.pub
# Windows(PowerShell)
Get-Content $env:USERPROFILE\.ssh\id_ed25519.pub
ssh-ed25519 AAAAC3Nza...で始まる 1 行が出ます。行の全部を選択してコピーします(先頭のssh-ed25519から末尾のコメントまで)。途中だけコピーすると登録が無効になり、接続時にパスワードを聞かれます。- cloud.vast.ai/manage-keys(鍵をまとめて管理するページ)を開き、SSH 公開鍵を登録する欄に貼り付けて保存する。同じページに API キーを発行する欄もありますが、いま貼るのは SSH の公開鍵の方です。
- 登録できたか確認する。
vastaiコマンドの導入は次節なので、まだ入っていなければこの手順は後回しでよい。
vastai show ssh-keys
貼った公開鍵が一覧に出れば成功です。手元に鍵がまだ 1 つも無いなら、vastai create ssh-key を引数なしで打つ手もあります。Ed25519 の鍵ペアを新規生成してアカウントに登録するところまで 1 コマンドで済みます。既存の id_ed25519 があった場合は .backup_<タイムスタンプ> という名前で退避されるので、上書き事故は起きません。
CLI を入れて、候補を 3 件に絞る
CLI(= 端末に打ち込んで使う vastai コマンド)は REST API の薄い包み紙です。認証・リトライ・リクエストの形を面倒見てくれるので、公式も「まず CLI か SDK から始めよ。生の API が必要か分からないなら、ほぼ確実に必要ない」と書いています。画面だけでも借りられますが、状態の確認と destroy はコマンドの方が速くて確実なので、ここで入れておきます。
# macOS / Linux / WSL
curl -fsSL https://vast.ai/install.sh | bash
# Windows(PowerShell。Python 3 が必要)
py -m pip install vastai
入れ終わったら新しいターミナルを開き直します(シェルが更新された PATH を読み込むため)。vastai --help が説明を返せば成功です。次に、第 4 章で作った API キーを保存します。
vastai set api-key <API キー>
vastai show user
<API キー> は cloud.vast.ai/manage-keys で発行した文字列です。キーは ~/.config/vastai/vast_api_key に保存されます。vastai show user が credit(残高)を含む JSON を返せば、認証は通っています。
ここから offer(= ホストが出している貸し出し条件 1 件)を探します。クエリ全体をシングルクォートで囲むことと、GPU 名のスペースをアンダースコアに置き換えることの 2 点が公式の明示ルールです。> や < をクォートの外に出すと、シェルがリダイレクトと解釈して失敗します。
vastai search offers 'gpu_name=RTX_5090 num_gpus=1 verified=true direct_port_count>=1 rentable=true reliability>0.95' -o 'dph'
条件をスペースで並べると AND になります。それぞれの意味はこうです。
gpu_name=RTX_5090— GPU の型。RTX 5090(スペース)では 0 件になりますnum_gpus=1— 1 枚ちょうど。2 枚以上のマシンは要りませんdirect_port_count>=1— direct SSH(vast のプロキシを経由しない直接接続)に必要な条件。実測(2026-08-24)では 1× RTX 5090 のdirect_port_countは中央値 98 で、5090 でこの条件が原因で候補が枯れることはまずありませんreliability>0.95— ホストの稼働実績。全マシンが 0.60 から始まるスコアです-o 'dph'— 1 時間単価の昇順に並べる(末尾に-を付けると降順)
クエリを省略すると、既定クエリ 'external=false rentable=true verified=true' が使われます。安い未検証マシンも見たいときは -n で既定を無効化します。
お金は動きません(0 USD)。所要 5 分。検索は何度やり直しても無料です。
- 上のコマンドを実行する。候補が表形式で並びます。1 行が 1 件の offer で、見るのは 2 つのフィールドだけです。
id(= offer ID。次節でそのまま渡す番号)とdph(= 1 時間あたりの USD)です。表が読みにくいときは、コマンドの末尾に--rawを付けると JSON で返るので、各要素のidを確実に拾えます。 - 上から 3 件の
idを控える。dphは 2026-08-24 時点の実測で中央値 0.4037 USD/時 でした。最安の 1 位は選びません(理由は第 5 章)。3 件のうち真ん中を選びます。 - 画面側も開いておく。cloud.vast.ai/create が検索とレンタルのメイン入口です。左上に現在のテンプレートが出ているので、
Change Templateから Recommended Templates の中の 1 つを選びます(第 7 章)。選んだら、テンプレート設定画面のImage Path:Tag欄に出ている文字列もメモします。これが Docker イメージ(= OS と必要なソフト一式を丸ごと固めた、インスタンスの中身のひな形)の名前で、コマンドで借りるときに必要になります。 - 同じ画面のストレージのスライダーを 40 GB にする。既定は 10 GB です。
ディスク容量は作成時に確定し、後から変更できません。この章は接続確認だけなので 10 GB でも足りますが、次章以降でモデルを落とすと数十 GB 単位で消えます。公式の Tip も「思っているより多めに確保しろ」です。40 GB のディスクを 1 か月置いたままにすると 40 × 0.20 = 月 8 USD(1 USD = 150 円として月 1,200 円)かかるので、使い終わったら destroy するのが前提の数字です。
RENT を押す — ここで契約が成立する
offer カードの RENT ボタンを押した瞬間、その offer の「いまの条件」でホストとのレンタル契約が成立します。押した後で条件は変わりません。ここが不可逆の一歩です。
コマンドで借りるなら create instance です。画面の RENT ボタンと同じ動作をします。
vastai create instance <OFFER_ID> --image <Docker イメージ> --disk 40 --ssh --direct
プレースホルダは 2 つです。<OFFER_ID> は前節でメモした id、<Docker イメージ> はテンプレート設定画面の Image Path:Tag 欄に出ている文字列をそのまま貼ります。公式が「最低限これだけは渡せ」と書いているのはこの 2 つ(offer ID と --image)だけです。残りの 3 つは文法上は省略できますが、省略すると何が起きるか読めなくなるので、この章では 3 つとも付けます。
--disk 40— ディスク 40 GB。省略しないでください。公式ドキュメント内で既定値の記述が 8 GB・10 GB・16 GB と割れており(CLI リファレンスは 10、REST の説明は 8、launch instanceは 16)、どれが効くか読者の側からは確定できません。必ず自分で数字を書きます--ssh— SSH で入れるようにする。これは launch mode(= このインスタンスにどうやって入るかの起動モード。SSH / Jupyter / Entrypoint の 3 択)の指定で、作成後には変えられません--direct— proxy(= vast.ai の中継サーバー)を経由せず、ホストへ直接繋ぐ経路を使う。公式が preferred method(推奨の方法)と呼んでいる速い方です。前節の検索でdirect_port_count>=1を入れたのは、この経路を持つ offer だけを残すためでした
もう 1 つ覚えておくことがあります。1 つの offer ID から作れるインスタンスは 1 台だけです。同じ番号でもう 1 台は作れないので、2 台目が要るときは検索し直します。
成功するとこの 1 行が返ります。
{"success": true, "new_contract": 12345678}
new_contract の数字がインスタンス ID です。id という名前では返ってきません。この癖は公式も「Key Quirks」として明記しています。以降のコマンドはこの番号を使うので、メモします。
失敗するときの原因はほぼ 3 つです。
| メッセージ | 原因 | 対処 |
|---|---|---|
offer is no longer available | 検索してから押すまでに他の人が借りた。同じ offer を大勢が同時に取り合っていて、成功するのは 1 人だけ | メモした 2 件目・3 件目を試す。--cancel-unavail を付けると、確保できないときに待たずエラーで返る |
server_error Something went wrong on the server | テンプレートの Docker イメージにバージョンタグが付いていない | テンプレート編集画面の Version Tag で latest を選ぶと直ることが多い |
| 作れたのに SSH でパスワードを聞かれる | 公開鍵がアカウントに入っていない、または全文コピーできていない | やってみる 8-1 をやり直し、vastai attach ssh で後付けする |
もう 1 つ、5090 を借りるときだけの注意があります。公式の CLI 入門ページには --image pytorch/pytorch:2.4.0-cuda12.4-cudnn9-runtime という例が載っていますが、これは CUDA 12.4 のイメージです。公式は RTX 5 系(Blackwell)について「以前の世代のような後方互換性を持たないので、テンプレートと Docker イメージが CUDA 12.8 と PyTorch 2.7 以上を使うよう設定されていることが重要」と書いています。入門ページの例をそのままコピペしないでください(詳細は第 7 章)。
この節から課金が動きます。この後の 8-4 まで通しても合計は約 0.18 USD(1 USD = 150 円として約 27 円)です。所要 2 分(このあと起動待ちが 1〜5 分あります)。
借り方は 2 通りあり、どちらか一方だけを実行します(両方やると 2 台立ち上がって課金も 2 倍になります)。
- 画面から借りる場合: cloud.vast.ai/create で、テンプレートが推奨のもの・ディスクが 40 GB になっていることを目で確認してから、やってみる 8-2 で選んだ offer のカードの
RENTボタンを押す。 - コマンドから借りる場合: 8-2 でメモした
idとImage Path:Tagを当てはめて次を実行する。
vastai create instance <OFFER_ID> --image <Docker イメージ> --disk 40 --ssh --direct
- インスタンス ID を確認する。コマンドで借りたなら、応答の
new_contractの数字がそれです。画面から借りたときは次のコマンドで調べます。
vastai show instances
- 出てきたインスタンス ID をメモする。
vastai show instances -qなら ID だけが並びます。
この時点で actual_status は null か loading です。GPU 課金はまだ始まっていませんが、ディスク課金はもう動いています(図 8-2)。
起動を待つ — 二度と running にならない 3 状態
起動時間の目安は1〜5 分です。Docker イメージがホストにキャッシュされていれば 30 秒程度で終わります。逆に、回線が遅いホストで巨大なイメージを引くと 1 時間以上かかることもあります。確認は 10〜30 秒おきにこれを打つだけです。
vastai show instance <インスタンス ID>
見るのは actual_status の 1 語です。そして、ここに「待っても無駄な状態」が 3 つあります。
exited / unknown / offline になったら running に到達することはない」と明記しています。待ち続けるとディスク課金だけが積み上がるので、見えた時点で destroy します。actual_status | 意味 | 課金 |
|---|---|---|
null | 準備中(vast.ai がマシンを確保している途中) | ディスクのみ |
loading | Docker イメージのダウンロード・コンテナ起動中 | ディスクのみ |
running | 実行中。SSH で入れる | GPU + ディスク |
stopped | 停止。データは残る | ディスクのみ(GPU は止まる) |
exited | コンテナのプロセスが予期せず終了した | ディスクのみ。終端 |
unknown | ホストからの生存確認の信号(ハートビート)が来ていない | オンライン扱いの間はディスク課金。終端 |
offline | ホストが vast のサーバーから切断された | 課金なし。終端 |
画面で見ているときは、インスタンスカードのメインボタンの表示が同じことを教えてくれます。Loading は Docker イメージのダウンロード中、Connecting は Docker は動いているが接続が未検証、Connect はロード完了でクリックすると SSH の接続情報が出る、Open はブラウザでアクセスできる状態、Inactive は停止中(データは保持)、Scheduling は GPU の空きを待っている状態です。
判断の目安を 2 つ持っておきます。20 分待って loading のままなら別のマシンを試す(推奨テンプレートを使っているかも確認する)。Scheduling で 30 秒以上止まったら、その GPU は他の人に取られた可能性が高い。停止ボタンをもう一度押してスケジューリングをキャンセルできます。
繋がることを確認して、すぐ壊す
running になったら接続情報を取ります。
vastai ssh-url <インスタンス ID>
返ってくるのは ssh://root@ssh5.vast.ai:33426 のような 1 行です(direct 接続なら ssh://root@142.214.185.187:20544 のように IP が入ります)。これはそのままでは ssh コマンドではありません。ssh://ユーザー@ホスト:ポート の形なので、ホストとポートを次のように並べ替えます。
ssh -p <ポート番号> root@<ホスト名または IP>
<ポート番号> は : の後ろの数字、<ホスト名または IP> は @ と : の間です。ユーザー名は常に root。ポートは 22 番ではありません。画面から取る場合は、インスタンスカードの SSH ボタンを押すと接続コマンドの文字列がそのまま出ます。
初回の接続では必ずこれを聞かれます。fingerprint(= 接続先サーバーの鍵から作った短い指紋。なりすましを見分けるために表示される)の確認です。yes と打って Enter を押します。
The authenticity of host '[142.214.185.187]:20544' can't be established.
ED25519 key fingerprint is SHA256:WTUphznpN0zikMp...
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
入ると画面の下に緑色のバーが出ます。これは tmux(= 1 つの接続の中に複数の作業画面を持て、接続が切れても中の処理が生き残る仕組み)のセッションで、vast が「フォアグラウンドのプロセスが意図せず死ぬのを防ぐため」既定で入れています。異常ではありません。よく使う操作は 4 つです。
- Ctrl+b → c — 新しい作業画面を作る
- Ctrl+b → n — 次の作業画面へ切り替える
- Ctrl+b → % — 画面を縦に分割する
- Ctrl+b → " — 画面を横に分割する
touch ~/.no_auto_tmux で無効化もできますが、公式は推奨していません(SSH は切れることがあり、tmux はそのとき処理を生き残らせる保険だからです)。
繋がらないときの切り分けは公式が順序を決めています。Permission denied (publickey) が出たら、① 鍵が cloud.vast.ai/manage-keys に登録されているか、② 正しい秘密鍵を使っているか、③ 秘密鍵のパーミッション(chmod 600 ~/.ssh/id_ed25519)、④ ssh -vv -p <ポート番号> root@<ホスト> で詳細ログ、の順に見ます。
所要 3 分。ここまでの合計で約 0.18 USD(1 USD = 150 円として約 27 円)です。最後の destroy を忘れると、ディスク課金が動き続けます。
vastai ssh-url <インスタンス ID>の出力をssh -p <ポート番号> root@<ホスト>に組み替えて接続する。fingerprint を聞かれたらyes。- GPU が見えているか確認する。
nvidia-smi
- 表の GPU 名の欄に
GeForce RTX 5090が出て、メモリの合計が 32607MiB 前後(vast.ai の API が返すgpu_ramは 2026-08-24 実測の 64 件すべてがこの値でした)なら、借りたものが期待どおりだった証拠です。 exitで抜ける。- 壊す。stop ではなく destroy です。
vastai destroy instance <インスタンス ID>
- 消えたことを確認する。
vastai show instances
一覧からそのインスタンスが消えていれば完了です。stop はディスク課金を止めません。公式も Warning で「インスタンスを停止してもストレージ課金は続く。課金を止めるにはインスタンスを完全に削除(destroy)せよ」と書いています。destroy するとインスタンス内のデータも消えるので、次章以降で作業した後は「持ち出す → destroy」の順です(残高の確認方法は第 4 章、課金の全体像は第 16 章)。
つまずきポイント
アカウントに鍵を足しても、すでに動いているインスタンスには入りません。Docker インスタンスなら vastai attach ssh <インスタンス ID> <公開鍵> で後付けできますが、VM インスタンスは作り直しになります。なお API リファレンスの 1 ページだけは「登録した鍵は現行の全インスタンスに自動追加される」と逆のことを書いています。ガイド側の警告(作成前に登録)を前提に動くのが安全で、そうしておけばどちらが実態でも困りません。
止まるのは GPU の課金だけです。ディスク課金はインスタンスが存在しオンラインである限り、状態を問わず秒単位で続きます。しかも停止中の単価は稼働中より高いことがあります。40 GB を置き忘れると月 8 USD(1 USD = 150 円として月 1,200 円)です。使い終わったら destroy します。
CLI 入門ページの例は pytorch/pytorch:2.4.0-cuda12.4-cudnn9-runtime、つまり CUDA 12.4 です。公式は RTX 5 系について CUDA 12.8 と PyTorch 2.7 以上を要件に挙げており、「互換性のない Docker イメージに切り替えると 5 シリーズの互換性を失う可能性がある」と警告しています。迷ったら推奨テンプレートのイメージをそのまま使います。
exited / unknown / offline は終端状態で、running に到達することは二度とありません。スクリプトでポーリングするならタイムアウトを必ず入れます。入れないと無限ループしながらディスク課金だけが積み上がります。20 分待って loading のままなら、destroy して別の offer を取り直します。loading の間に GPU 課金が発生しないのは救いですが、放置の理由にはなりません。
理解度チェック
Q1. インスタンスを作った後に SSH 鍵をアカウントへ登録しました。その鍵でこのインスタンスに入れますか?
そのままでは入れません。アカウントの鍵が自動で入るのはそれ以降に新規作成するインスタンスだけです。Docker インスタンスならインスタンスカードの SSH 鍵ボタン、または vastai attach ssh で後付けできます。VM インスタンスは作り直しが必要です。
Q2. RENT を押してから running になるまでの 3 分間、何にいくら課金されますか?
GPU の課金は発生しません(loading 中は課金されない)。一方でディスクの課金は RENT の瞬間から動いています。ディスク 40 GB・0.20 USD/GB/月 なら 3 分で 0.001 USD 未満で、金額としては無視できる大きさです。問題になるのはそのまま放置したときです。
Q3. vastai search offers 'gpu_name=RTX 5090 num_gpus=1' が 0 件を返しました。原因は?
GPU 名のスペースです。CLI では文字列値のスペースをアンダースコアに置き換えるのが公式の決まりなので、gpu_name=RTX_5090 と書きます。CLI のクエリはスペースを条件の区切りとして読むため、スペースを残すと 5090 から先が別の条件として解釈され、意図した絞り込みになりません。
Q4. SSH で入ったら画面下に緑色のバーが出て、Ctrl+C を押してもプロセスが残ります。何が起きていますか?
tmux セッションの中にいます。vast は既定で tmux に接続させます(フォアグラウンドのプロセスが意図せず終了するのを防ぐため)。異常ではありません。別の作業画面が欲しければ Ctrl+b → c です。touch ~/.no_auto_tmux で無効化できますが公式は推奨していません。
Q5. vastai create instance の応答が {"success": true, "new_contract": 12345678} でした。次のコマンドに渡すインスタンス ID はどれですか?
12345678、つまり new_contract の値です。このエンドポイントは作成したインスタンスの ID を id ではなく new_contract という名前で返します。公式が「Key Quirks」として明記している癖です。
まとめ
- SSH 鍵はインスタンスを作る前に登録する。公開鍵はコンテナ作成時点で適用されるので、後から足してもすでに動いている 1 台には届かない(Docker なら
attach sshで救済、VM は作り直し) - 公開鍵は行の全文をコピーする。途中だけ貼ると、接続時にパスワードを聞かれる(vast.ai に SSH パスワードは存在しない)
- CLI の検索はクエリ全体をシングルクォートで囲み、GPU 名はアンダースコア(
RTX_5090)。direct_port_count>=1を入れると direct 接続が使える offer だけが残る - RENT が不可逆の一歩。押した瞬間にディスク課金、
runningになって GPU 課金が始まる。ディスク容量と launch mode は作成後に変更できない create instanceが返すインスタンス ID はnew_contract。exited/unknown/offlineを見たら待たずに destroy する- 片付けは
stopではなくdestroy。停止中もディスク課金は続く
次章では、いま通した接続をもう一段掘ります。proxy 接続と direct 接続の違い、手元のブラウザからリモートのサービスを触る ssh -L、VS Code から直接開く方法を扱います。
参考リンク
- SSH で接続する(鍵の作成・登録・トラブルシュート・tmux)
- CLI Hello World(インストールから作成・接続・destroy まで)
- vastai create ssh-key / vastai attach ssh
- vastai search offers(クエリ構文とフィールド一覧)
- vastai create instance(オプション一覧)
- vastai ssh-url / vastai show instances
- offer を探して借りる(カードの項目と RENT)
- インスタンスの管理(状態表示とボタンの意味)
- インスタンス作成 API(new_contract と Key Quirks)
- 課金の 3 要素(GPU・ストレージ・帯域)