vast.ai で RTX 5090 を借りて ローカル LLM を動かす|2026-08 版
第 8 章

【実践】SSH 鍵を登録して 1 台借りる

鍵の登録 → 検索 → Rent → 起動確認までを 15 分・0.2 USD で通す

この章で分かること

借りるまでは 7 段、うち 4 段はまだ無料

この章で初めてお金が動きます。とはいえ、動く額は缶コーヒー 1 本分です。先に全体の地図を置きます。

vast.ai の公式ドキュメントは、レンタルを 3 ステップだと定義しています。① テンプレートを選ぶ → ② GPU を探す → ③ 設定して借りるの順です。「先にソフト環境(テンプレート)を決めて、後から GPU を探す」という順序が初心者には逆に見えますが、これには理由があります。テンプレートを選ぶと、そのテンプレートに対応できないマシンが検索結果から落ちるからです(第 7 章)。GPU を先に決めても、テンプレートを変えた瞬間にその GPU が候補から消えることがあります。

この 3 ステップの前に SSH 鍵の登録を足し、後ろに起動待ちと接続確認を足すと、実際に手を動かす単位は 7 段になります。所要時間を足し合わせると、起動待ちを含めて15 分前後です。

手順 所要時間 この時点の課金 ① SSH 鍵を作る 手元のターミナルで ssh-keygen ② 公開鍵をアカウントに登録 manage-keys ページ or vastai create ssh-key ③ テンプレートを選ぶ Recommended Templates から 1 つ ④ offer を 1 件決める vastai search offers で候補を 3 件 ⑤ RENT を押す(契約成立) ホストとの契約がここで決まる ⑥ loading → running を待つ 1〜5 分。Docker イメージの取得 ⑦ SSH で入って destroy 繋がることを確認したら壊す 約 2 分 約 2 分 約 2 分 約 3 分 即時 1〜5 分 約 3 分 まだ 0 USD まだ 0 USD まだ 0 USD まだ 0 USD ディスク課金が開始 GPU 課金も開始 destroy で全部停止
図 8-1 ④ までは何度やり直しても 0 USD です。⑤ の RENT だけが不可逆の一歩で、ここでホストとの契約が成立します。⑦ を忘れると、手を離しても課金は動き続けます。

金額を先に出しておきます。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 つの数字は始まる瞬間が違います。ここが初心者の見積もりが崩れる場所なので、時間軸で見ておきます。

27 分借りたときの内訳(0.40 USD/時・ディスク 40 GB の場合) GPU 課金 ディスク課金 課金なし 0.40 USD/時 × 25 分 = 約 0.17 USD 40 GB × 0.20 USD/GB/月 = 約 0.005 USD 時間 RENT を押した瞬間 running になった destroy ディスク課金 開始 ここから GPU 課金 両方止まる
図 8-2 公式は「ストレージ料はインスタンスが存在しオンラインである毎秒、状態を問わず課金される」と書いています。一方 GPU の課金は running になってからです。イメージのダウンロード(loading)で待たされている時間に GPU 代を払わされることはありません。

SSH 鍵 — 順序を間違えると、作ったインスタンスに入れない

SSH(= 遠くのコンピューターに安全にログインする仕組み)で入るには鍵が要ります。vast.ai のインスタンスは鍵認証のみで、パスワード認証はセキュリティ上の理由で無効化されています。したがって「SSH でパスワードを聞かれる」のは正常な状態ではなく、鍵の登録が失敗しているサインです。

鍵は 2 つのファイルで 1 組です。ssh-keygen を 1 回打つと手元に 2 つできます。

この公開鍵が「手元 → vast.ai のアカウント → インスタンス」と 2 段で伝わります。2 段目が効くのは、インスタンスを作る瞬間だけです。

手元の PC 秘密鍵 id_ed25519 公開鍵 id_ed25519.pub vast.ai アカウント manage-keys ページ 新規のインスタンス 作成時に鍵が入る 動いているインスタンス attach ssh で後から足す 登録 自動で入る 届かない
図 8-3 点線が「届かない」経路です。アカウントに鍵を足しても、すでに動いているインスタンスには入りません。Docker インスタンスなら attach ssh で後付けできますが、VM インスタンスは作り直しになります。

公式ドキュメントは Warning としてこう書いています。「インスタンスを作る前にやれ。公開鍵はコンテナ作成時点で適用される」。登録場所は 3 レイヤーあり、効果範囲が違います。

登録する場所やり方効果範囲
アカウント(画面)cloud.vast.ai/manage-keys に公開鍵を貼る以後新規作成するインスタンスに自動で入る
アカウント(コマンド)vastai create ssh-key ~/.ssh/id_ed25519.pub同上
インスタンス個別インスタンスカードの SSH 鍵ボタン / vastai attach ssh <インスタンス ID> <公開鍵>その 1 台だけ。作成後の救済に使う
やってみる 8-1|SSH 鍵を作ってアカウントに登録する

お金は動きません(0 USD)。所要 4 分。この章で唯一「やり直しが効かない」準備なので、借りる前に必ず済ませます。

  1. ターミナル(Windows は PowerShell)を開いて次を実行する。<自分のメールアドレス> は識別用のコメントで、セキュリティには関係ありません。保存先を聞かれたら、そのまま Enter を 3 回押します。
ssh-keygen -t ed25519 -C "<自分のメールアドレス>"
  1. 公開鍵の中身を表示する。macOS / Linux と Windows でコマンドが違います。
# macOS / Linux
cat ~/.ssh/id_ed25519.pub

# Windows(PowerShell)
Get-Content $env:USERPROFILE\.ssh\id_ed25519.pub
  1. ssh-ed25519 AAAAC3Nza... で始まる 1 行が出ます。行の全部を選択してコピーします(先頭の ssh-ed25519 から末尾のコメントまで)。途中だけコピーすると登録が無効になり、接続時にパスワードを聞かれます。
  2. cloud.vast.ai/manage-keys(鍵をまとめて管理するページ)を開き、SSH 公開鍵を登録する欄に貼り付けて保存する。同じページに API キーを発行する欄もありますが、いま貼るのは SSH の公開鍵の方です。
  3. 登録できたか確認する。vastai コマンドの導入は次節なので、まだ入っていなければこの手順は後回しでよい。
vastai show ssh-keys

貼った公開鍵が一覧に出れば成功です。手元に鍵がまだ 1 つも無いなら、vastai create ssh-key を引数なしで打つ手もあります。Ed25519 の鍵ペアを新規生成してアカウントに登録するところまで 1 コマンドで済みます。既存の id_ed25519 があった場合は .backup_<タイムスタンプ> という名前で退避されるので、上書き事故は起きません。

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 になります。それぞれの意味はこうです。

クエリを省略すると、既定クエリ 'external=false rentable=true verified=true' が使われます。安い未検証マシンも見たいときは -n で既定を無効化します。

やってみる 8-2|候補を 3 件に絞り、offer ID をメモする

お金は動きません(0 USD)。所要 5 分。検索は何度やり直しても無料です。

  1. 上のコマンドを実行する。候補が表形式で並びます。1 行が 1 件の offer で、見るのは 2 つのフィールドだけです。id(= offer ID。次節でそのまま渡す番号)と dph(= 1 時間あたりの USD)です。表が読みにくいときは、コマンドの末尾に --raw を付けると JSON で返るので、各要素の id を確実に拾えます。
  2. 上から 3 件の id を控える。dph は 2026-08-24 時点の実測で中央値 0.4037 USD/時 でした。最安の 1 位は選びません(理由は第 5 章)。3 件のうち真ん中を選びます。
  3. 画面側も開いておく。cloud.vast.ai/create が検索とレンタルのメイン入口です。左上に現在のテンプレートが出ているので、Change Template から Recommended Templates の中の 1 つを選びます(第 7 章)。選んだら、テンプレート設定画面の Image Path:Tag 欄に出ている文字列もメモします。これが Docker イメージ(= OS と必要なソフト一式を丸ごと固めた、インスタンスの中身のひな形)の名前で、コマンドで借りるときに必要になります。
  4. 同じ画面のストレージのスライダーを 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 つとも付けます。

もう 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-3|1 台立ち上げる(ここから課金が始まる)

この節から課金が動きます。この後の 8-4 まで通しても合計は約 0.18 USD(1 USD = 150 円として約 27 円)です。所要 2 分(このあと起動待ちが 1〜5 分あります)。

借り方は 2 通りあり、どちらか一方だけを実行します(両方やると 2 台立ち上がって課金も 2 倍になります)。

  1. 画面から借りる場合: cloud.vast.ai/create で、テンプレートが推奨のもの・ディスクが 40 GB になっていることを目で確認してから、やってみる 8-2 で選んだ offer のカードの RENT ボタンを押す。
  2. コマンドから借りる場合: 8-2 でメモした id と Image Path:Tag を当てはめて次を実行する。
vastai create instance <OFFER_ID> --image <Docker イメージ> --disk 40 --ssh --direct
  1. インスタンス ID を確認する。コマンドで借りたなら、応答の new_contract の数字がそれです。画面から借りたときは次のコマンドで調べます。
vastai show instances
  1. 出てきたインスタンス 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 つあります。

作成直後 actual_status は null loading Docker イメージを取得中 running ここから GPU 課金 exited / unknown / offline running には戻らない destroy して作り直す ディスク課金を止める 1〜5 分 接続可能に ホスト側の異常 唯一の出口 loading 中は GPU 課金なし。ディスク課金は RENT から動く
図 8-4 下段の 3 状態は終端です。公式は「exited / unknown / offline になったら running に到達することはない」と明記しています。待ち続けるとディスク課金だけが積み上がるので、見えた時点で destroy します。
actual_status意味課金
null準備中(vast.ai がマシンを確保している途中)ディスクのみ
loadingDocker イメージのダウンロード・コンテナ起動中ディスクのみ
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 つです。

touch ~/.no_auto_tmux で無効化もできますが、公式は推奨していません(SSH は切れることがあり、tmux はそのとき処理を生き残らせる保険だからです)。

繋がらないときの切り分けは公式が順序を決めています。Permission denied (publickey) が出たら、① 鍵が cloud.vast.ai/manage-keys に登録されているか、② 正しい秘密鍵を使っているか、③ 秘密鍵のパーミッション(chmod 600 ~/.ssh/id_ed25519)、④ ssh -vv -p <ポート番号> root@<ホスト> で詳細ログ、の順に見ます。

やってみる 8-4|GPU を確認して destroy する

所要 3 分。ここまでの合計で約 0.18 USD(1 USD = 150 円として約 27 円)です。最後の destroy を忘れると、ディスク課金が動き続けます。

  1. vastai ssh-url <インスタンス ID> の出力を ssh -p <ポート番号> root@<ホスト> に組み替えて接続する。fingerprint を聞かれたら yes。
  2. GPU が見えているか確認する。
nvidia-smi
  1. 表の GPU 名の欄に GeForce RTX 5090 が出て、メモリの合計が 32607MiB 前後(vast.ai の API が返す gpu_ram は 2026-08-24 実測の 64 件すべてがこの値でした)なら、借りたものが期待どおりだった証拠です。
  2. exit で抜ける。
  3. 壊す。stop ではなく destroy です。
vastai destroy instance <インスタンス ID>
  1. 消えたことを確認する。
vastai show instances

一覧からそのインスタンスが消えていれば完了です。stop はディスク課金を止めません。公式も Warning で「インスタンスを停止してもストレージ課金は続く。課金を止めるにはインスタンスを完全に削除(destroy)せよ」と書いています。destroy するとインスタンス内のデータも消えるので、次章以降で作業した後は「持ち出す → destroy」の順です(残高の確認方法は第 4 章、課金の全体像は第 16 章)。

つまずきポイント

鍵を後から登録して、入れないまま課金が続く

アカウントに鍵を足しても、すでに動いているインスタンスには入りません。Docker インスタンスなら vastai attach ssh <インスタンス ID> <公開鍵> で後付けできますが、VM インスタンスは作り直しになります。なお API リファレンスの 1 ページだけは「登録した鍵は現行の全インスタンスに自動追加される」と逆のことを書いています。ガイド側の警告(作成前に登録)を前提に動くのが安全で、そうしておけばどちらが実態でも困りません。

stop を押したから課金は止まったと思う

止まるのは 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 シリーズの互換性を失う可能性がある」と警告しています。迷ったら推奨テンプレートのイメージをそのまま使います。

loading が終わるのを待ち続ける

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」として明記している癖です。

まとめ

次章では、いま通した接続をもう一段掘ります。proxy 接続と direct 接続の違い、手元のブラウザからリモートのサービスを触る ssh -L、VS Code から直接開く方法を扱います。