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

RTX 5090 で何が動くのか

VRAM 32 GB が決める上限。動くモデル・動かないモデルを借りる前に知る

この章で分かること

「32 GB」は見積りの分母に使えない

RTX 5090 のカタログ値は VRAM 32 GB GDDR7 / メモリインターフェース 512-bit / CUDA Capability 12.0 です(NVIDIA の GeForce RTX 5090 製品ページ)。VRAM(= GPU に直結した専用メモリ。モデルはここに載せて計算する)が 32 GB あるなら 32 GB 分のモデルが載る、と読みたくなります。ここが最初の落とし穴です。

vast.ai の公開 API で 1 枚構成の RTX 5090 の offer を 64 件取ると、gpu_ram は全件 32607 MB でした(2026-08-24 時点の実測)。この 32607 は MiB 単位なので、実効値は 31.84 GiB です。カタログの 32 GB(= 32 GiB)から、ドライバの予約分を引いた値だと読めます。

32607 MiB ÷ 1024 = 31.84 GiB(実測値からの計算例)

本章の表はすべて 31.8 GiB を分母にします。「32」で計算すると、ちょうど「動くと思ったのに落ちる」幅の楽観が入ります。

値段も先に置きます。1 枚構成の on-demand は 最安 0.3215 USD/時・中央値 0.4037 USD/時(2026-08-24 時点、貸出可能な offer 64 件の実測)。1 USD = 150 円として 48〜61 円/時。24 GB の RTX 4090(実測 gpu_ram 24564 MB)は最安 0.135・中央値 0.336 USD/時なので、約 1.2 倍の値段で VRAM が 1.33 倍という立ち位置です。ただし 4090・5090 とも offer 数が 64 件を超えるため、安い順に 64 件を取った範囲の中央値です。実際の相場より安い側に寄っていると考えてください。

なお本書ではメモリ帯域(GB/s)の数値を一切使いません。NVIDIA の製品ページにその行が無いからです。vast.ai の API には gpu_mem_bw というフィールドがありますが、これはホストの申告値であって NVIDIA の公式スペックではありません。

VRAM は「重み・KV キャッシュ・余裕」の 3 つに割られる

必要 VRAM ≒ 重み + KV キャッシュ + 余裕(フレームワーク常駐・CUDA コンテキスト)

このうち計算で確定できるのは重み(= 学習で決まったモデル本体の数値。パラメータとも呼ぶ)です。vast.ai 公式も「ざっくりした見積もりはモデルパラメータ数 × 2 バイト(BF16 精度の場合)」と書いています。

重み [GB] = パラメータ数 [10 億] × 1 パラメータあたりのビット数 ÷ 8

重み [GiB] = 重み [GB] ÷ 1.073741824

2 行目が要るのは、GB(1000 の 3 乗バイト)と GiB(1024 の 3 乗バイト)が約 7 % ずれるからです。分母の 31.8 は GiB 側の数字なので、比べる相手も GiB に揃えます。

ここで効くのが量子化(= 1 つの数値を表すビット数を落として重みを小さくする圧縮)です。基準の BF16(16 bit)に対し 8 bit なら半分、4 bit なら 1/4。この「1 パラメータあたりのビット数」を bpw(bits per weight)と呼びます。

32B モデルの場合 31.8 GiB の壁 +27.8 GiB 16 bpw(bf16) 8 bpw(Q8 相当) 4 bpw(Q4 相当) 重み 59.6 GiB — 載らない 重み 29.8 GiB KV に残るのは 2.0 GiB 重み 14.9 GiB KV に 16.9 GiB
図 3-1 地色の濃い帯が重み、薄い帯が KV キャッシュに回せる残りです。縦線が 31.8 GiB。8 bpw は「重みは入るが会話の履歴を置く場所が残らない」状態で、載ったのに使えない典型です。

表にすると次のとおり。単位は GiB なので、そのまま 31.8 と比べられます。

パラメータ数16 bpw8 bpw6 bpw4 bpw
7B13.06.54.93.3
8B14.97.55.63.7
14B26.113.09.86.5
24B44.722.416.811.2
32B59.629.822.414.9
70B130.465.248.932.6
120B223.5111.883.855.9

3 つ目の「余裕」の実数は、参照した公式ドキュメントのどこにも書かれていません。ですから上の表からは差し引いていません。実運用ではここからさらに引かれると考えてください。vLLM の場合は gpu_memory_utilization で指定した割合を起動時に先取りし、KV キャッシュ不足で処理が押し出された(preemption)ときの公式の対処もこの値を上げることです。

コンテキスト長の代金は KV キャッシュで決まる

KV キャッシュ(= トークンごとに保持する計算済みの中間データ。長い入力・長い会話ほど増える)は、コンテキスト長に比例します。vast.ai 公式が式を明示しています。

KV キャッシュ / トークン = 2 × num_hidden_layers × num_key_value_heads × head_dim × 1 要素のバイト数

右辺の名前は、Hugging Face のモデルリポジトリに置かれた config.json(= モデルの構造を書いた設定ファイル)の項目名そのままです。公式の計算例を 2 つ並べると、規模が近くても KV キャッシュは 10 倍違うことが分かります。

モデル(公式の例)公式が示している計算式KV / トークン
GLM-4.7-Flash(MHA)2 x 47 x 20 x 256 x 2 bytes約 962 KB
Qwen3-30B-A3B(GQA)2 x 48 x 4 x 128 x 2 bytes約 96 KB

差の正体は num_key_value_heads です。GLM-4.7-Flash は、MoE(= Mixture of Experts。全パラメータのうち一部だけを 1 トークンごとに動かす構造。公式はこのモデルを「3B アクティブパラメータ」と表現しています)で一般的な GQA(Grouped Query Attention)ではなく MHA(Multi-Head Attention)を使い、KV ヘッドが 4 ではなく 20 あります。公式はこのモデルについて「200k コンテキストでは KV だけで約 188 GB、重みの約 60 GB と合わせて 250 GB 超が必要」と書いています。パラメータ数が同じなら必要 VRAM も同じ、ではありません。

逆算もできます。KV に割ける VRAM を G GiB、1 トークンの KV を B バイトとすると、

収まるトークン数 = G × 1024^3 ÷ B

KV / トークン(fp16)4 GiB で8 GiB で16 GiB で
96 KiB(公式例の Qwen3-30B-A3B 相当)43,690 tok87,381 tok174,763 tok
128 KiB(中規模の GQA)32,768 tok65,536 tok131,072 tok
256 KiB(KV ヘッド多め)16,384 tok32,768 tok65,536 tok
940 KiB(公式例の GLM-4.7-Flash 相当)4,461 tok8,923 tok17,847 tok

公式の計算例自体、962,560 バイトを「約 962 KB」(10 進)、98,304 バイトを「約 96 KB」(実際は 96 KiB)と単位が揃っていません。まずバイトで計算し、換算は最後に 1 回だけやれば取り違えません。

KV キャッシュは量子化して縮められます。Ollama は OLLAMA_KV_CACHE_TYPE で型を選べて、既定の f16 に対し q8_0 が約 1/2(公式は「モデル品質に体感できる影響はまず無い」)、q4_0 が約 1/4(コンテキストが大きいほど精度低下が出やすい)です。llama.cpp なら -ctk q8_0 -ctv q8_0。上の表の数字がそのまま 2 倍・4 倍になります。Ollama 側の指定が効くのは Flash Attention が有効なときだけですが、公式によれば対応するバックエンド・デバイスでは自動的に使われます(明示するなら OLLAMA_FLASH_ATTENTION=1)。

既定値も効きます。Ollama は VRAM 容量でコンテキスト長の既定を切り替えていて、24 GiB 未満は 4k、24〜48 GiB は 32k、48 GiB 以上は 256k。31.8 GiB の 5090 は真ん中の帯なので既定 32k です。公式は Web 検索・エージェント・コーディング用途には「少なくとも 64000 トークン」を推しているので、明示的に上げる場面があります。

OLLAMA_CONTEXT_LENGTH=64000 ollama serve
ollama ps

ollama ps の PROCESSOR 列が 100% GPU なら全部 GPU に載っています。CONTEXT 列が実際のコンテキスト長です。

借りる前に「載る・載らない」を判定する

量子化 ↓ → パラメータ数 8B 14B 32B 70B 16 bpw(bf16) 8 bpw(Q8 相当) 4 bpw(Q4 相当) ◯ △ × × 14.9 GiB 26.1 GiB 59.6 GiB 130.4 GiB ◯ ◯ △ × 7.5 GiB 13.0 GiB 29.8 GiB 65.2 GiB ◯ ◯ ◯ × 3.7 GiB 6.5 GiB 14.9 GiB 32.6 GiB
図 3-2 数字は重みだけのサイズ(GiB)。◯ は KV キャッシュに 8 GiB 以上残る、△ は残りが 8 GiB 未満、× は重みだけで 31.8 GiB を超える組み合わせです。地色の薄いマスは重みが載る組み合わせ、濃いマスは載らない組み合わせ。色を付けた 32B / 4 bpw が 1 枚の 5090 でいちばん素直に動きます。

KV の残りまで含めて並べると次のようになります。右端は 24 GiB 機(RTX 4090 相当)との比較です。

構成重みKV に残る24 GiB 機では
8B / 16 bpw14.9 GiB約 16.9 GiB入る(残り約 9.1 GiB)
14B / 16 bpw26.1 GiB約 5.7 GiB入らない
14B / 8 bpw13.0 GiB約 18.8 GiB入る(残り約 11.0 GiB)
24B / 4 bpw11.2 GiB約 20.6 GiB入る(残り約 12.8 GiB)
32B / 4 bpw14.9 GiB約 16.9 GiB入る(残り約 9.1 GiB)
32B / 6 bpw22.4 GiB約 9.4 GiB残り約 1.6 GiB で実質不可
32B / 8 bpw29.8 GiB約 2.0 GiB入らない
70B / 4 bpw32.6 GiB入らない入らない
70B / 3 bpw24.5 GiB約 7.3 GiB入らない

4090 に対する差は約 7.9 GiB。これは「一段大きいモデルが動く」ではなく、「量子化を一段良くする」「コンテキストを伸ばす」「bf16 のまま載せる」のどれかに変換できる予算です。差が最も出るのは 32B / 6 bpw(24 GiB 機では残り 1.6 GiB で KV が取れない)と 14B / 16 bpw(24 GiB 機では入らない)です。

逆に期待を折っておくべきなのが 70B です。4 bpw でも重みだけで 32.6 GiB あり、31.8 GiB には入りません。3 bpw なら 24.5 GiB で入り KV に約 7.3 GiB 残ります。2 枚なら合計約 63.7 GiB で 4 bpw も入りますが(2 枚構成は中央値 0.856 USD/時、GPU 1 枚あたり 0.428 USD/時。2026-08-24 時点)、RTX 5090 は NVLink 非対応(公式スペックの SLI-Ready が No)。GPU 間は PCIe 経由だけになり、vast.ai の技術 FAQ も「マルチ GPU 構成では PCIe 帯域が制限になりうる」と警告しています。

もう 1 つ注意。GGUF(= llama.cpp が読み込むモデルファイルの形式)の Q4_K_M のような量子化タイプはちょうど 4 bpw ではありません。実際の bpw はファイルサイズから逆算するのが確実です。

実 bpw = 重みファイルのサイズ [GB] ÷ パラメータ数 [10 億] × 8

VRAM が足りていても動かない条件

ここまでは容量の話でした。5090 には容量と無関係に動作を止める条件がもう 1 つあります。vast.ai 公式の RTX 5 シリーズのページは Blackwell GPU は旧世代ほどの後方互換性を持たないと述べ、「テンプレートと Docker イメージが CUDA 12.8 および PyTorch 2.7 以上を使うように構成されていることが重要である」と明記しています。ここでいう Docker イメージとは、インスタンスに最初から入っているソフトウェア一式を固めたもので、借りるときに選ぶテンプレートが決めます。

依存の向き 570.x 580 以上 ⑤ Docker イメージ 変えると 5 シリーズ対応が壊れる ④ PyTorch 2.7 以上 vast.ai 公式の必須要件 ③ CUDA 12.8 以上 イメージ側が決める ② ドライバ 570.26 以上 ホスト側。借り手は選ぶだけ ① GPU: RTX 5090 compute capability 12.0(固定) CUDA 12.8 / 12.9 まで CUDA 13.x のイメージは動かない CUDA 13.x も選べる cuda_max_good が 13.x のホスト
図 3-3 下から上へ要件が伝わり、どこか 1 段が古いと全体が動きません。①②は借りるときに決まってしまう層、③④⑤はテンプレートで選べる層です。右側は②が③の上限を決める分岐で、2026-08-24 時点の実測ではドライバ 570 番台・575 番台・580 番台が混在しています。

ここで大事なのは「CUDA のバージョンは誰が決めるのか」です。vast.ai の技術 FAQ の答えは 「CUDA バージョンは Docker イメージに依存する」。ホスト側で固定されているのではなく、借り手が選ぶテンプレート側の問題です。確認は借りたインスタンスの中で 2 コマンド。

nvidia-smi        # ホスト側のドライバのバージョンと VRAM の使用量が出る
nvcc --version    # イメージ側の CUDA のバージョンが出る

PyTorch 2.7 以上かどうかは、vast.ai 公式が載せている確認スニペットで見ます。python と打って対話モードに入り、そのまま貼り付けてください。

import torch
print(f"PyTorch version: {torch.__version__}")
print(f"CUDA available: {torch.cuda.is_available()}")
print(f"GPU device: {torch.cuda.get_device_name(0)}")

1 行目が 2.7 以上、2 行目が True、3 行目に GPU の名前が出れば要件を満たしています。

ただし上限はホストのドライバが決めます。NVIDIA の対応表では CUDA 12.8 GA に Linux で 570.26 以上、CUDA 13.x に 580 以上が必要です。実測(2026-08-24 時点)ではドライバは 570.133.07〜580.159.03 に分布し、cuda_max_good(そのホストで使える CUDA の上限)は 12.8 から 13.3 のいずれかで、12.8 未満は 64 件中 1 件もありませんでした。12.8 の要件は事実上満たされている一方、CUDA 13.x 前提のイメージにはドライバ 580 以上のホストが要るということです。

もう 1 つ、名前に騙されないための事実。「Blackwell 対応」と書かれていても 5090 で動くとは限りません。compute capability(= GPU の世代を表す番号。ソフトウェアはこの番号で対応可否を判定する)は、B200 / GB200 が 10.0、B300 / GB300 が 10.3、DGX Spark の GB10 が 12.1、GeForce RTX 50 シリーズと RTX PRO Blackwell が 12.0 です。sm_100 向けにしかビルドされていないものは、同じ「Blackwell」でも 5090(sm_120)では動きません。

この番号はそのまま設定値にもなります。llama.cpp を自前ビルドするなら小数点を取った "120" を渡します(公式の例が 8.6 と 8.9 を "86;89" と書く形式なので、そこからの導出)。

cmake -B build -DGGML_CUDA=ON -DCMAKE_CUDA_ARCHITECTURES="120"

逆に断定できないことも書いておきます。vLLM の量子化方式のハードウェア対応表には Blackwell の列がありません(列は Volta / Turing / Ampere / Ada / Hopper と AMD GPU / Intel GPU / CPU 系のみ)。「5090 で AWQ が使えるか」はその表からは読み取れないので、使う版で確認します。また CUDA 13.3 Update 1 のリリースノートには compute capability 12.0 / 12.1 を名指しした cuBLAS の既知の不具合が 2 件あり、うち 1 件は条件付きで誤った結果を返します。「新しいほど安心」ではありません。

溢れたときに何が起きるか

重み + KV が 31.8 GiB を超える 既定 自動調整 手で削る 環境変数 そのまま落ちる: CUDA OOM(VRAM 不足) -c を明示した/重みだけで超えている場合 --fit(既定 on)が自動で縮める コンテキストが 4096 まで下がることがある -ngl や -ctk で自分で削る CPU に落ちた層のぶん遅くなる unified memory で RAM へ退避 環境変数 1 つで、落ちなくなる(Linux)
図 3-4 矢印のラベルが引き金です。上 2 つは何も指定しなくても起きる挙動、下 2 つは自分で選ぶ挙動。事故として現れるのは上 2 つです。

まず既定の挙動。llama.cpp は VRAM を使い切ると落ちます。Linux では GGML_CUDA_ENABLE_UNIFIED_MEMORY=1 を付けると「VRAM が枯渇したときにクラッシュせずシステム RAM へスワップできる」ようになります。裏を返せば、付けなければ落ちるということです。次に説明する --fit が既定で効いていても落ちうるのは、--fit が調整するのは明示していない引数だけだからです(公式の「未設定の引数を調整する」という記述からの導出)。-c 32768 のように自分で大きな値を書けば、その値は据え置かれたまま VRAM を超えます。

次に、いちばん気付きにくい挙動。llama.cpp の -ngl(= VRAM に置くレイヤーの最大数。レイヤーとはモデル内部の計算の段で、モデルはこの段の積み重ねでできています)は既定 auto、--fit は既定 on。--fit は「明示していない引数をデバイスメモリに収まるよう調整する」機能で、デバイスごとに 1024 MiB のマージンを残し、コンテキストは最小 4096 まで下げます。「動いたけれど会話が短いところで切れる」の正体はほぼこれです。古い記事の -ngl 99 を写して自動調整を潰すより、何も指定せず起動ログを読むほうが速く着地します。

自分で削る手段は公式に並んでいます。上の 2 つはコンテキストの持ち方を変えるだけ、下の 3 つは計算やデータを CPU 側へ移す手段なので、上から順に試します。

llama-server --model <GGUF ファイルの絶対パス> -c 8192 -ctk q8_0 -ctv q8_0 --port 20000

<GGUF ファイルの絶対パス> には .gguf のフルパスを入れます(vast.ai 公式手順での置き場所は /workspace/llama.cpp/models)。--port 20000 は任意の数字ではなく、Open WebUI テンプレートが localhost:20000 を見に行くよう事前設定されているからです。

つまずきポイント

「32 GB あるから 32B のモデルが動く」と思っていた

パラメータ数の B(10 億個)と容量の GB は別の単位です。32B を BF16 で載せると重みだけで 59.6 GiB、8 bpw でも 29.8 GiB で KV キャッシュに 2.0 GiB しか残りません。31.8 GiB で 32B を実用にするなら 6 bpw か 4 bpw です。

「4 bit にすれば 70B も載る」と思っていた

70B の 4 bpw は 32.6 GiB で、31.8 GiB に 0.8 GiB 足りません。3 bpw なら 24.5 GiB で入ります。2 枚で 63.7 GiB にするなら、中央値 0.856 USD/時(2026-08-24 時点)に加えて GPU 間の通信が PCIe 経由だけになることを織り込んでください。

「動いたから設定は合っている」と思っていた

llama.cpp は --fit が既定 on で、収まらないときに明示していない引数を勝手に下げます(マージン 1024 MiB、コンテキストは最小 4096)。Ollama も VRAM 容量で既定コンテキストが決まります。長い文書を貼ったのに途中を忘れる症状が出たら、まず ollama ps の CONTEXT 列と起動ログを見ます。

「Blackwell 対応」と書いてあったから安心した

Blackwell は 1 つの番号ではありません。sm_100 向けビルドは 5090(sm_120)では動きません。またテンプレートの Docker イメージを自分で差し替えると、vast.ai 公式が警告するとおり 5 シリーズ互換性を失う可能性があります(既定の [Automatic] タグのテンプレートはサポート済みイメージを pull します)。

理解度チェック

Q1. VRAM の見積りで分母に置くべき数字は何ですか?

31.84 GiB です。offer が返す gpu_ram は 32607 MB(MiB)で、1 枚構成の RTX 5090 の 64 件すべてが同じ値でした(2026-08-24 時点の実測)。カタログの「32 GB」から予約分を引いた実効値がこれです。

Q2. 32B のモデルを 8 bpw と 6 bpw で載せたとき、KV キャッシュに残るのはそれぞれ何 GiB ですか。どちらを選びますか?

8 bpw は重み 29.8 GiB で残り約 2.0 GiB、6 bpw は重み 22.4 GiB で残り約 9.4 GiB。6 bpw を選びます。2.0 GiB では実用的なコンテキスト長が取れません。24 GiB 機では 6 bpw の残りが約 1.6 GiB しかなく、ここが 5090 の差が最も出る構成です。

Q3. 規模が近い 2 つのモデルで KV キャッシュが 10 倍違うことがあるのはなぜですか?

式の中の num_key_value_heads が違うからです。公式の計算例では MHA の GLM-4.7-Flash が KV ヘッド 20 で約 962 KB/トークン、GQA の Qwen3-30B-A3B が KV ヘッド 4 で約 96 KB/トークンでした。

Q4. ドライバが 570.x のホストで、CUDA 13.x のイメージは動きますか?

動きません。NVIDIA の対応表では CUDA 13.x にドライバ 580 以上が必要です(12.8 GA は 570.26 以上)。実測では 5090 ホストのドライバは 570.133.07〜580.159.03 と混在しているので、ホストを選ぶ段階で絞る必要があります。

Q5. llama.cpp で「起動はしたが会話が短いところで切れる」とき、最初に疑うのは何ですか?

--fit(既定 on)による自動調整です。明示していない引数を VRAM に収まるよう下げる機能で、コンテキストは最小 4096 まで縮みます。-c を明示すれば調整対象から外れます。

まとめ

次章では実際にアカウントを作ってクレジットを入れます。残高が尽きたときにインスタンスがどうなるかまで、先に押さえておきます。