結論

RunPodは、GPUを秒単位の従量課金で借りるクラウドで、PodsとServerlessの2通りで使います。前払いのクレジット制で、無料枠はありません。

この記事でわかること

  • GPU21種の時間単価とストレージ3種の料金表
  • Stop・Terminate・Serverlessの月額試算5通り
  • ハンドラーを手元で動かした出力とAPIの実物

2026年10月22日更新|runpod SDK 1.12.0・Python 3.11で実行確認

Pods は GPU マシンを丸ごと借りて SSH や Jupyter で作業する使い方、Serverless はリクエストが来たときだけ GPU のワーカーが動く使い方です。

flowchart TD
    A[RunPod] --> B[Pods<br>GPUマシンを借りる]
    A --> C[Serverless<br>呼ばれた間だけ動く]
    B --> D[SSH・Jupyterで作業<br>起動中は毎秒課金]
    C --> E[ハンドラーが処理<br>0台なら課金なし]

急いでいる人向けに、よく調べられることを先にまとめます。

知りたいこと 答え 詳しい節
料金 RTX 4090 の Pod は $0.89/時(10月22日時点) 料金
無料で使えるか 無料枠なし。$10 から入金して使う 料金
止めれば無料か GPU は止まるが Volume Disk は $0.20/GB/月 Stop と Terminate
Pods と Serverless 作業・学習は Pods、API 提供は Serverless 違い
データが消える場所 Container Disk は Stop で消える ストレージ
接続方法 Web ターミナル・SSH・JupyterLab(8888) 接続
画像生成(ComfyUI) テンプレートを選んで Pod を作る Pod の作り方
Serverless の書き方 runpod.serverless.start({"handler": 関数}) Serverless
API の呼び方 POST https://api.runpod.ai/v2/{ID}/runsync API
Colab との違い 時間単価の従量課金で、GPU を選んで借りる 違い表

確認環境:Ubuntu 24.04・Python 3.11.15・runpod(Python SDK)1.12.0(PyPI の安定版、2026年10月22日時点)・FastAPI 0.159.1・OpenSSH 9.6p1。Serverless のハンドラーを --test_input と --rp_serve_api(ローカルの API サーバー、127.0.0.1:32300)で実際に動かし、/runsync・/run・/status・/stream の応答を記録しました。SDK の runpod.Endpoint と curl は、Runpod の API の形をまねた自作の擬似サーバー(127.0.0.1:32302)に向け、送られたリクエスト(URL・ヘッダー・本文)を記録しました。月額の試算は Python で計算しました。料金・Pods の操作・ストレージ・接続方法・runpodctl・REST API は docs.runpod.io と runpod.io/pricing(料金ページの表示は2026年10月8日更新)で確かめました(確認日 2026年10月22日)。

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「RunPodとは|使い方・料金・PodsとServerlessの違いを実例で」

RunPodとは(読み方・できること)

この節では、RunPod がどんなサービスで、何に使われているかが分かります。

RunPod は、AI の学習・推論や画像生成のために、GPU を必要な時間だけ借りるクラウドです。 日本語では「ランポッド」と読まれることが多いです。公式ドキュメントでは現在「Runpod」と表記されています。

公式の製品ページは、主な製品を次の4つに分けています。

製品 公式の説明(要約) 向いている用途
Pods GPU か CPU の専用インスタンスでコンテナを動かす 開発・学習・画像生成・常駐の作業
Serverless 秒単位の課金で、自動で台数が増減する 推論 API・量が変わる処理
Public Endpoints 用意済みの AI モデルを API で呼ぶ デプロイせずに画像・動画・文章を生成
Instant Clusters 複数ノードの GPU クラスタ 大きなモデルの分散学習

ほかに、作ったワーカーやテンプレートを公開・検索できる Runpod Hub があります。

1GPU を秒単位で借りる

Pods は計算とストレージが秒単位の課金。データの送受信(ingress・egress)に料金はかからない。

2テンプレートですぐ使える

PyTorch・JupyterLab・ComfyUI などを入れたコンテナを選ぶだけで、環境が立ち上がる。

3推論を API にできる

Serverless は Python の関数(ハンドラー)を書いてイメージにすると、HTTP の API になる。

4前払いのクレジット制

カードや暗号資産で入金した残高から引かれる。残高が0になると Pod は止まる。

PodsとServerlessの違い(どちらを使うか)

この節では、2つの使い方の違いと、自分の用途でどちらを選ぶかが分かります。

Pods は「マシンを借りる」、Serverless は「関数を置いておく」使い方です。 Pods は起動している間ずっと課金され、その間は自分で自由に操作できます。Serverless はリクエストが来たときだけワーカー(コンテナ)が起動し、処理が終わると0台まで縮みます。

PodsGPU マシンを借りて、SSH・Jupyter で操作する。起動中は使っていなくても課金
→
Serverlessリクエストの間だけワーカーが動く。0台の間は GPU の課金なし

試行錯誤・学習・画像生成の画面操作は Pods、アプリから呼ぶ推論 API は Serverless が合う

比べること Pods Serverless
課金される時間 起動している間(毎秒) ワーカーが動いている間(起動・処理・待機5秒)
操作の仕方 SSH・Web ターミナル・JupyterLab HTTP の API(/run・/runsync)
書くもの 何でも(手で作業) ハンドラー関数と Docker イメージ
台数 自分で決める リクエストに応じて 0〜最大ワーカー数
待ち時間 起動後はすぐ 0台からはコールドスタートがある
データ /workspace に保存 ネットワークボリュームは /runpod-volume

迷ったときは次の表で選びます。

やりたいこと 選ぶもの
ComfyUI・Stable Diffusion の画面で画像を作る Pods(ComfyUI のテンプレート)
LoRA などの学習を数時間回す Pods(Network Volume に結果を保存)
自分のアプリから画像生成・LLM を呼ぶ Serverless
たまにしか呼ばれない推論 API Serverless(Flex ワーカー、0台まで縮む)
常に速く返したい推論 API Serverless(Active ワーカーを1台以上)
モデルをデプロイせずに試す Public Endpoints

RunPodの料金(2026年10月22日時点)

この節では、GPU ごとの時間単価・ストレージの料金・課金のルールが分かります。

料金は「GPU の時間単価 × 使った秒数」と「ストレージの GB × 期間」の合計です。 公式ドキュメントでは、Pods の計算とストレージは秒単位で課金され、データの送受信に料金はかかりません。

$0.27/時いちばん安い GPU(RTX A5000)Pods の料金ページの表示
$10始めるときの入金の目安無料枠・無料トライアルの記載はない
$80/時既定の利用上限(全リソース)サポートに頼むと上げられる

Pods の GPU の時間単価

runpod.io/pricing の Pods の表(2026年10月8日更新の表示)を、VRAM の大きい順に並べました。RAM と vCPU は1枚あたりの目安です。

GPU VRAM RAM・vCPU 時間単価
B300 288GB 251GB・32 $8.99
B200 180GB 283GB・28 $7.99
H200 141GB 276GB・24 $5.29
RTX Pro 6000 96GB 188GB・16 $2.49
H100 NVL 94GB 94GB・16 $3.19
H100 SXM 80GB 125GB・20 $3.99
H100 PCIe 80GB 188GB・16 $2.89
A100 SXM 80GB 125GB・16 $1.79
A100 PCIe 80GB 117GB・8 $1.79
Pro 6000 MIG 48GB 48GB 62GB・8 $1.29
L40S 48GB 94GB・16 $1.09
RTX 6000 Ada 48GB 167GB・10 $0.99
L40 48GB 94GB・8 $0.82
A40 48GB 50GB・9 $0.59
RTX A6000 48GB 50GB・9 $0.59
RTX 5090 32GB 35GB・9 $1.19
RTX 4090 24GB 41GB・6 $0.89
Pro 6000 MIG 24GB 24GB 31GB・4 $0.69
L4 24GB 50GB・12 $0.59
RTX 3090 24GB 125GB・16 $0.50
RTX A5000 24GB 25GB・9 $0.27

料金ページの表の見出しには Community Cloud と Secure Cloud がありますが、各 GPU に表示される時間単価は1つでした。実際の単価はデプロイ画面で GPU とクラウドの種類を選んだときに表示されるので、作成前にそこで確かめます。

Serverless の時間単価

Serverless は VRAM のクラスごとの単価です。課金は秒単位なので、1秒あたりは時間単価を 3,600 で割った値になります(右の列は計算した値)。

VRAM 主な GPU 時間単価 1秒あたり(計算)
180GB B200 $8.64 $0.00240
141GB H200 $5.93 $0.00165
80GB H100 $4.79 $0.00133
80GB A100 $2.72 $0.00076
48GB L40・L40S・6000 Ada $1.75 $0.00049
48GB A6000・A40 $1.22 $0.00034
32GB 5090 $1.58 $0.00044
24GB 4090 $1.10 $0.00031
24GB L4・A5000・3090 $0.69 $0.00019
16GB A4000・A4500・RTX 4000 $0.58 $0.00016

ほかに 280GB(B300)$10.65、96GB(RTX 6000 Pro)$3.49、32GB(RTX PRO 4500 Blackwell)$1.15 の行があります。Serverless のワーカーには、0台まで縮む Flex と、常に起動している Active があります。料金ページは Flex を他社より安いと説明し、Active・Flex の割引は営業への相談としています。

ストレージの料金

種類 起動中 停止中 特徴
Container Disk $0.10/GB/月 課金なし(中身は消える) OS・一時ファイル用
Volume Disk $0.10/GB/月 $0.20/GB/月 /workspace。Pod を消すまで残る
Network Volume(標準) $0.07/GB/月 $0.07/GB/月 1TB を超えた分は $0.05
Network Volume(高性能) $0.14/GB/月 $0.14/GB/月 標準より速い(料金ページ)

Volume Disk は、停止中のほうが単価が高くなります($0.10 → $0.20)。 止めたまま長く置くと、使っていない月にも料金がかかります。

支払い・残高・上限のルール

項目 公式ドキュメントの内容
支払い方法 クレジットカード・暗号資産・請求書($5,000 を超える取引)
始めるときの額 「$10 から始められる」。プリペイドカードは1回 $100 以上
返金 クレジットは返金・引き出しできない
自動チャージ 残高がしきい値を下回ると入金(1時間に1回まで)
残高が $0 になったとき 起動中の Pod はすべて止まる。Network Volume が無い Pod は削除され、データは戻せない
利用上限 全リソースで既定 $80/時。利用歴で上がり、サポートに頼むと早く上げられる
長期割引 Savings Plan(3か月・6か月の前払い。GPU の計算だけが対象で返金不可)
Pod を作る条件 選んだ構成の1時間分以上のクレジットが要る

月額の目安を計算する(Stop・Terminate・Serverless)

この節では、同じ GPU でも使い方によって月額がどれだけ変わるかを、計算した数字で確かめられます。

RTX 4090 の Pod($0.89/時)を「1日4時間 × 月22日」使う場合などを、料金表の単価で計算しました。1か月は730時間とします。

# Runpod の月額の目安(料金は runpod.io/pricing、2026年10月22日時点の表示)
H = 730                          # 1か月の時間数(365日×24時間÷12)
GPU = 0.89                       # RTX 4090 の Pod($/時)
DISK, VOL_RUN, VOL_STOP, NV = 0.10, 0.10, 0.20, 0.07   # $/GB/月

use = 4 * 22                     # 1日4時間 × 月22日 使う
idle = H - use                   # 残りの時間

def show(name, gpu, storage):
    print(f"{name}: GPU ${gpu:.2f} + ストレージ ${storage:.2f} = ${gpu + storage:.2f}")

# A: 使い終わったら Stop(Container 20GB・Volume 50GB)
show("A 使ったら Stop", GPU * use,
     20 * DISK * use / H + 50 * VOL_RUN * use / H + 50 * VOL_STOP * idle / H)
# B: 使い終わったら Terminate、データは Network Volume 50GB
show("B Terminate + NV 50GB", GPU * use, 20 * DISK * use / H + 50 * NV)
# C: 止めずに1か月つけっぱなし
show("C つけっぱなし", GPU * H, 20 * DISK + 50 * VOL_RUN)

# D: Stop したまま1か月使わない(Volume 50GB だけが残る)
show("D Stop のまま放置", 0, 50 * VOL_STOP)

# E: Serverless(RTX 4090 の Flex は $1.10/時)。1日1,000件 × 1件4秒、月30日
sec = 1000 * 4 * 30
show("E Serverless 4秒×3万件", 1.10 / 3600 * sec, 0)
print(f"   (GPU が動いた時間 {sec / 3600:.1f} 時間。コールドスタートと待機5秒は含めない)")

実行した結果です。

A 使ったら Stop: GPU $78.32 + ストレージ $9.64 = $87.96
B Terminate + NV 50GB: GPU $78.32 + ストレージ $3.74 = $82.06
C つけっぱなし: GPU $649.70 + ストレージ $7.00 = $656.70
D Stop のまま放置: GPU $0.00 + ストレージ $10.00 = $10.00
E Serverless 4秒×3万件: GPU $36.67 + ストレージ $0.00 = $36.67
   (GPU が動いた時間 33.3 時間。コールドスタートと待機5秒は含めない)

読み取れることは次の3つです。

  • 止め忘れ(C)は、使う分だけ動かす(A)の約7.5倍になる。月額のほとんどは GPU の時間。
  • 使うたびに Terminate して Network Volume にデータを置く(B)と、停止中の Volume Disk の $0.20 がかからない分だけ安い。
  • Serverless(E)は、実際に処理した33.3時間分だけになる。ただし実際の請求には、ワーカーの起動(コールドスタート)と、最後のジョブの後の待機(既定5秒)の時間も入る。

RunPodの始め方(アカウント作成・入金・APIキー)

この節では、アカウントを作ってから最初の Pod を作るまでの順番が分かります。

1

アカウントを作る

runpod.io からサインアップし、コンソール(console.runpod.io)に入ります。

メールか外部アカウント

2

クレジットを入金する

Billing でカードなどから入金します。公式は $10 から始められると案内しています。使い過ぎを防ぐなら、低残高の通知を先に設定します。

返金はできない

3

SSH の公開鍵を登録する

Credentials ページの SSH Public Keys タブで、~/.ssh/id_ed25519.pub の中身を貼ります。

SSH で入るなら必要

4

Pod を作る

GPU を選び、テンプレート(PyTorch・ComfyUI など)とディスクの大きさを決めて Deploy します。

1時間分以上の残高が要る

5

使い終わったら Stop か Terminate

続きを使うなら Stop、データを Network Volume に置いたなら Terminate します。どちらも GPU の課金は止まります。

止め忘れが最大の出費

API キーの作り方と権限

コンソールの Credentials ページの API Keys タブで Create API Key を押し、名前と権限を決めます。キーは作ったときにしかコピーできません(公式は「Runpod は API キーを保存しない」と書いています)。

権限 できること 向いている使い方
All すべての操作 自分の手元の CLI・管理スクリプト
Restricted Serverless のエンドポイントごとに None・Read Only・Read/Write 等を決める アプリから特定の推論 API だけを呼ぶ
Read Only 読み取りだけ 料金や状態の確認

アプリに埋め込むキーは Restricted にして、呼ぶエンドポイントだけを許可すると、漏れたときの影響を小さくできます。

Podの作り方とテンプレート(ComfyUI・PyTorch)

この節では、Pod を作るときに決める項目と、テンプレートの種類が分かります。

テンプレートは、Docker イメージ・ディスクの大きさ・公開するポート・環境変数・起動コマンドをまとめた設定です。 公式ドキュメントは3種類に分けています。

種類 作る人 サポート
Official Runpod が選んで保守 Runpod が対応
Community 利用者が作り、利用数で表示される コミュニティ(Discord)
Custom 自分で作る(非公開・公開を選べる) 自分で対応

Pod を作るときに決める主な項目です。

項目 決めること 目安
GPU 種類と枚数 下の「GPU の選び方」
クラウドの種類 Secure Cloud か Community Cloud 業務データは Secure Cloud
テンプレート イメージと初期設定 PyTorch・ComfyUI など
Container Disk OS・ライブラリ用 runpodctl の既定は 20GB
Volume Disk か Network Volume /workspace に保存するデータ用 モデルとデータの合計+余裕
公開するポート HTTP(8888 など)と TCP(22) テンプレートの既定のまま

Secure Cloud と Community Cloud の違いは、公式の表では次のとおりです。公式は、Community Cloud の新しいホストの受け付けをやめ、既存の Community Cloud は引き続き使えると書いています。

比べること Secure Cloud Community Cloud
設備 T3・T4 のデータセンター 個人・事業者のホスト(P2P)
信頼性 冗長性が高い ばらつきがある
向いている用途 本番・機密データ 費用を抑えたい処理

ComfyUI で画像を作るときは、ComfyUI のテンプレートを選んで Pod を作り、Connect から ComfyUI のポートを開きます。テンプレートに無いモデルを足すと、その分だけディスクが要り、ストレージの料金も増えます。ComfyUI のノードやワークフローの使い方は、関連記事「ComfyUIとは|インストール・使い方・Manager・APIを解説」で扱っています。

GPUの選び方(VRAMの目安)

GPU は、まず VRAM(GPU のメモリ)で選びます。公式の「Choose a Pod」の目安です。

用途 GPU の例 VRAM の目安
LLM の推論(7B〜13B) RTX 4090・L4・PRO 6000 MIG 24GB 24GB 以上
LLM の推論(30B〜70B) A100・H100・PRO 6000 MIG 48GB 48〜80GB(複数枚の場合あり)
LLM の学習・ファインチューニング A100・H100 40〜80GB
画像生成(SDXL・Flux) ミドルクラス 16〜24GB
画像認識(Computer Vision) エントリー〜ミドル 8〜16GB
3D レンダリング RT コアのあるミドルクラス 16〜24GB

公式は、LLM では「パラメータ10億あたり約2GB の VRAM」を目安とし、4bit の量子化で大きく減らせると書いています。たとえば 7B のモデルなら、約14GB が目安になります。

RunPodのストレージの違い(Container Disk・Volume Disk・Network Volume)

この節では、どこに置いたデータがいつ消えるかが分かります。データを失わないためにいちばん大事な節です。

Pod の中には、消えるタイミングが違う3つの置き場所があります。 モデル・データセット・学習の結果は、必ず /workspace(Volume Disk か Network Volume)に置きます。

比べること Container Disk Volume Disk Network Volume
置き場所 システムの領域(/ など) /workspace /workspace(Volume Disk の代わり)
Stop・再起動 消える 残る 残る
Terminate(削除) 消える 消える 残る
速さ いちばん速い(ローカル) 速い(ローカル) ネットワーク越しで変わる
複数の Pod で共有 できない できない できる
大きさの変更 できる 増やすだけ できる(減らせない)

Network Volume には、次の決まりがあります(公式ドキュメント)。

  • データセンターに結び付く。付けた Pod・Serverless は、そのデータセンターで動く。
  • Pod を作るときに付け、あとから外せない。
  • 複数のワーカーから同時に同じファイルへ書くと、データが壊れることがある。
  • Serverless のワーカーでは /runpod-volume にマウントされる。
  • S3 互換 API で、Pod を起動せずにファイルを出し入れできる。

ディスクの残りは df -h で、フォルダごとの使用量は du -sh で確かめます。公式のトラブルシューティングは、/workspace で大きいファイルを探す次のコマンドを載せています。

df -h
du -sh /workspace/*
find /workspace -type f -exec du -h {} + | sort -rh | head -n 10

JupyterLab の画面で消したファイルは、ゴミ箱($HOME/.local/share/Trash/ や /workspace/.Trash*)に残って容量を使い続けることがあります。

Stop(停止)とTerminate(削除)で課金はどう変わるか

この節では、Pod を止めたときと消したときに、何が残って何に課金されるかが分かります。

flowchart TD
    A[Pod 起動中<br>GPU とディスクに課金] -->|Stop| B[停止中<br>GPU 0・Volume Disk $0.20]
    B -->|Start| A
    A -->|Terminate| C[削除<br>Network Volume 以外は消える]
    B -->|Terminate| C
操作 GPU の課金 Container Disk Volume Disk Network Volume
起動中 あり(毎秒) $0.10/GB/月 $0.10/GB/月 $0.07/GB/月
Stop なし 消える・課金なし 残る・$0.20/GB/月 残る・$0.07/GB/月
Terminate なし 消える 消える 残る・$0.07/GB/月
残高 $0 で自動停止 なし 消える Network Volume の無い Pod は削除 残る(課金は続く)

Terminate は取り消せません。 公式は「Network Volume に無いデータはすべて完全に削除される」と書いています。Terminate の前に、必要なファイルを Network Volume か手元に移します。

停止した Pod が GPU 0 枚で起動する(Zero GPU)

Pod は特定の物理マシンに結び付いています。 Stop すると GPU が解放され、ほかの利用者が借りることがあります。その間に Start すると、GPU が0枚の状態で起動します。公式の対処は次の3つです。

対処 内容
GPU 0 枚のまま起動する CPU だけでディスクにアクセスし、データを取り出す
待ってから再び Start する GPU が空くのを待つ(いつ空くかは分からない)
Terminate して作り直す 同じ設定で新しい Pod を作る。Volume Disk のデータは消える

いちばんの予防は Network Volume を使うことです。データがマシンから切り離されているので、Terminate して別のマシンに新しい Pod を作っても、同じデータを付けられます。

  • 1結果は /workspace に保存したかContainer Disk(/workspace 以外)は Stop で消える
  • 2しばらく使わないなら Terminate できるか停止中の Volume Disk は $0.20/GB/月。Network Volume に移せば $0.07
  • 3Pod の一覧に起動中のものが残っていないかrunpodctl pod list でも確かめられる
  • 4低残高の通知か自動チャージを設定したか残高 0 で Network Volume の無い Pod は削除される

SSH・JupyterLabでPodに接続する

この節では、Pod に入る4つの方法と、それぞれのコマンド・URL の形が分かります。

方法 使い方 向いている作業
Web ターミナル Connect からブラウザで開く ちょっとした確認(セッション単位)
JupyterLab Connect の HTTP Services から開く(通常 8888) ノートブックでの試行
SSH 手元のターミナルから接続 長い処理・ファイル転送
VS Code・Cursor Remote-SSH の拡張機能で接続 手元のエディターで開発

SSH の鍵を作って登録する

手元で鍵を作り、公開鍵(.pub)をコンソールに登録します。OpenSSH 9.6p1 で作った出力です。

ssh-keygen -t ed25519 -C "runpod"
cat ~/.ssh/id_ed25519.pub
Generating public/private ed25519 key pair.
Your identification has been saved in ./id_ed25519
Your public key has been saved in ./id_ed25519.pub

登録するのは ssh-ed25519 AAAA... で始まる1行です。公式は、SHA256: で始まる指紋(フィンガープリント)を貼ると失敗すると注意しています。CLI では runpodctl ssh add-key --key-file ~/.ssh/id_ed25519.pub でも登録できます。

2種類の SSH の違い

方式 コマンドの形 scp・SFTP
Basic SSH(中継経由) ssh <Pod ID>-<英数字>@ssh.runpod.io -i ~/.ssh/id_ed25519 使えない
Full SSH(公開 IP) ssh root@<IP> -p <ポート> -i ~/.ssh/id_ed25519 使える

Basic SSH はすべての Pod で使えます。Full SSH には、公開 IP・TCP の 22 番の公開・SSH サーバーの起動が必要で、公式テンプレートの多くは設定済みです。Pod の中の 22 番は、外からは別のポート番号になります。 Connect の画面に表示される番号を使います。ポートの割り当ては Pod をリセットすると変わります。

接続のたびに長いコマンドを打たないように、~/.ssh/config に書いておけます(IP とポートは Connect の画面の値)。

Host runpod-4090
    HostName 213.173.109.39
    Port 13007
    User root
    IdentityFile ~/.ssh/id_ed25519
ssh runpod-4090
scp -P 13007 ./data.zip root@213.173.109.39:/workspace/

鍵のファイルの権限が広いと、ssh は鍵を使いません。手元で chmod 644 にして確かめた表示です。

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for './id_ed25519' are too open.
It is required that your private key files are NOT accessible by others.

chmod 600 ~/.ssh/id_ed25519 で直ります。ssh のオプションと config の書き方は、関連記事「ssh コマンドの使い方まとめ|鍵・ポート指定・config・接続エラー対処」で扱っています。

JupyterLab と公開ポートの URL

HTTP のポートは、Runpod のプロキシ経由で次の形の URL になります。

https://[POD_ID]-[INTERNAL_PORT].proxy.runpod.net
例:https://7h9k2m4n6p-8888.proxy.runpod.net(JupyterLab)

このプロキシには、1回の接続が100秒までという制限があります(Cloudflare の制限)。100秒以内に応答しないと 524 エラーで切れます。長い処理を HTTP で待つ作りにはせず、バックグラウンドで動かすか、TCP のポート・SSH を使います。ブラウザを閉じても Pod は動き続けますが、Web ターミナルのセッションは切れるので、長い処理は SSH から tmux の中で動かします(公式の Tips も tmux を案内しています)。

ファイルの受け渡しは、scp(Full SSH のとき)のほか、runpodctl send と runpodctl receive で同じコード(合言葉)を指定して送る方法があります。

runpodctlの使い方(CLIでPodを操作する)

この節では、画面を使わずに Pod を作る・止める・消すコマンドが分かります。

runpodctl は Runpod 公式の CLI です。 公式ドキュメントでは、すべての Pod に runpodctl と、その Pod だけに効く API キーが最初から入っています。手元に入れる方法は次のとおりです。

# Linux・macOS(インストールスクリプト)
bash <(curl -sL cli.runpod.io)
# macOS(Homebrew)
brew install runpod/runpodctl/runpodctl

# 初回の設定(API キーと SSH 鍵を対話で設定)
runpodctl doctor
# または API キーだけを保存(~/.runpod/config.toml)
runpodctl config --apiKey YOUR_API_KEY

Pod の操作は runpodctl pod の下にまとまっています(公式のリファレンス)。

runpodctl gpu list                                   # 使える GPU の一覧
runpodctl pod create --template-id runpod-torch-v21 --gpu-id "NVIDIA GeForce RTX 4090"
runpodctl pod list                                   # 起動中の Pod
runpodctl pod list --all                             # 停止中も含める
runpodctl pod stop <pod-id>                          # 停止(GPU を解放)
runpodctl pod start <pod-id>                         # 再開
runpodctl pod delete <pod-id>                        # 削除(Terminate)
runpodctl billing pods                               # Pod の請求履歴

pod create の主なオプションです。

オプション 既定値 意味
--gpu-id なし GPU の種類(例 NVIDIA GeForce RTX 4090)
--image / --template-id なし Docker イメージかテンプレート
--gpu-count 1 GPU の枚数
--container-disk-in-gb 20 Container Disk の GB
--volume-in-gb なし Volume Disk の GB(/workspace)
--network-volume-id なし 付ける Network Volume(--volume-in-gb と同時に使えない)
--cloud-type SECURE SECURE か COMMUNITY
--ports なし 例 8888/http,22/tcp
--env なし 例 '{"KEY":"value"}'

コマンドのグループは、ほかに serverless(sls)・template(tpl)・network-volume(nv)・hub・registry・datacenter・user があります。

RunPod Serverlessの使い方(ハンドラーを書いて手元で動かす)

この節では、Serverless のワーカーの書き方と、デプロイする前に手元で動かして確かめる方法が分かります。

Serverless のワーカーは、「ジョブを受け取って結果を返す関数(ハンドラー)」を runpod.serverless.start() に渡した Python のプログラムです。 リクエストが来ると、job["input"] に JSON の input の中身が入ってハンドラーが呼ばれ、戻り値が結果になります。

flowchart TD
    A[アプリ<br>POST /run] --> B[エンドポイントのキュー]
    B --> C[ワーカーを起動<br>コールドスタート]
    C --> D[ハンドラー<br>job input を処理]
    D --> E[結果を保存<br>GET /status で取る]

ハンドラーを書く

SDK は pip で入れます(2026年10月22日時点の安定版は 1.12.0)。

pip install runpod

モデルの読み込みはハンドラーの外に書きます。ワーカーが起動したときに1回だけ動き、そのワーカーが続けて受けたジョブでは読み込み直しません。ここでは、重いモデルの代わりに 1.5 秒待つ、単語で感情を判定するだけの関数にしました。

# handler.py
import time
import runpod
from runpod.serverless.utils.rp_validator import validate

# ① モデルの読み込みはハンドラーの外に書く(ワーカーの起動時に1回だけ動く)
t0 = time.time()
MODEL = {"好き": 1, "最高": 1, "嫌い": -1, "最悪": -1}
time.sleep(1.5)  # 重いモデルを GPU に載せる時間の代わり
print(f"model loaded in {time.time() - t0:.1f}s")

SCHEMA = {
    "text": {"type": str, "required": True},
    "top_k": {"type": int, "required": False, "default": 1},
}

# ② リクエスト(ジョブ)ごとに呼ばれる関数
def handler(job):
    checked = validate(job["input"], SCHEMA)
    if "errors" in checked:
        return {"error": "; ".join(checked["errors"])}  # error は文字列で返す
    inp = checked["validated_input"]
    if not 1 <= inp["top_k"] <= 5:
        return {"error": "top_k は 1〜5 で指定します"}
    score = sum(v for w, v in MODEL.items() if w in inp["text"])
    label = "positive" if score > 0 else "negative" if score < 0 else "neutral"
    return {"label": label, "score": score, "top_k": inp["top_k"]}

runpod.serverless.start({"handler": handler})

test_input.json で1回だけ動かす

同じフォルダに test_input.json を置き、python handler.py を引数なしで動かすと、その中身がジョブとして渡されます。

{"input": {"text": "このGPUクラウドは最高", "top_k": 2}}
$ python handler.py
model loaded in 1.5s
--- Starting Serverless Worker |  Version 1.12.0 ---
INFO   | Using test_input.json as job input.
DEBUG  | Retrieved local job: {'input': {'text': 'このGPUクラウドは最高', 'top_k': 2}, 'id': 'local_test'}
INFO   | local_test | Started.
DEBUG  | local_test | Handler output: {'label': 'positive', 'score': 1, 'top_k': 2}
DEBUG  | local_test | run_job return: {'output': {'label': 'positive', 'score': 1, 'top_k': 2}}
INFO   | Job local_test completed successfully.
INFO   | Job result: {'output': {'label': 'positive', 'score': 1, 'top_k': 2}}
INFO   | Local testing complete, exiting.

ハンドラーの戻り値は output に包まれて結果になりました。ジョブ ID は local_test です。

--test_input で入力を変えて試す

コマンドラインの --test_input は test_input.json より優先されます。--rp_log_level INFO で DEBUG の行を消しました。

$ python handler.py --rp_log_level INFO --test_input '{"input": {"text": "好き", "top_k": 9}}'
model loaded in 1.5s
--- Starting Serverless Worker |  Version 1.12.0 ---
INFO   | Log level set to INFO
INFO   | test_input set, using test_input as job input.
INFO   | local_test | Started.
ERROR  | Job local_test failed with error: top_k は 1〜5 で指定します
$ echo $?
1

いくつかの入力で試した結果です。

入力 結果 終了コード
{"input": {"text": "最悪"}} {'label': 'negative', 'score': -1, 'top_k': 1}(既定値が入る) 0
{"input": {"top_k": 2}} failed with error: ['text is a required input.'] 1
{"input": {"text": "好き", "top_k": 9}} failed with error: top_k は 1〜5 で指定します 1
{"text": "x"}(input が無い) Job has no input parameter. Unable to run. 1

ジョブが失敗すると終了コードが 1 になるので、CI でハンドラーを確かめるときは終了コードを見ます。SDK 1.12.0 の引数の定義には --test_output が無く、指定しても比較されず終了コードは 0 のままでした。

rp_validator の constraints(範囲などの条件を lambda で書く項目)は、SDK 1.12.0 のソースでは、default を持つ項目で値の型が既定値と同じときに確かめられません。実際に "default": 1 と "constraints": lambda x: 1 <= x <= 5 を書いた版では、top_k: 9 がそのまま通りました。上のコードは、範囲をハンドラーの中で確かめています。

ハンドラーの中で例外が起きた場合は、ジョブが失敗し、型・メッセージ・トレースバックがまとめて返ります。

ERROR  | local_test | Captured Handler Exception
ERROR  | {
    "error_type": "<class 'ValueError'>",
    "error_message": "モデルの出力が空です",
    "error_traceback": "Traceback (most recent call last):\n  ...\nValueError: ...\n",
    "hostname": "unknown",
    "worker_id": "unknown",
    "runpod_version": "1.12.0"
}

日本語のメッセージは モ... の形(JSON のエスケープ)で表示されます。

ローカルAPIサーバーで/run・/runsync・/statusを試す

この節では、デプロイ後と同じ URL の形でハンドラーを呼び、応答の形を確かめる方法が分かります。

--rp_serve_api を付けると、手元に FastAPI のサーバーが立ちます。既定のポートは 8000 で、--rp_api_port で変えられます。

$ python handler.py --rp_serve_api --rp_api_port 32300
model loaded in 1.5s
--- Starting Serverless Worker |  Version 1.12.0 ---
INFO   | Starting API server.
DEBUG  | Not deployed on Runpod serverless, pings will not be sent.
INFO:     Uvicorn running on http://localhost:32300 (Press CTRL+C to quit)

サーバーが持っている URL を /openapi.json から出しました。手元のサーバーは4つで、すべて POST です。

POST /run
POST /runsync
POST /stream/{job_id}
POST /status/{job_id}

別のターミナルから curl で呼んだ結果です。

curl -X POST http://localhost:32300/runsync \
  -H 'Content-Type: application/json' \
  -d '{"input": {"text": "この設定は最悪", "top_k": 3}}'
{"id":"test-64322daf-b1c5-457f-bfd5-ff62b428aac9","status":"COMPLETED","output":{"label":"negative","score":-1,"top_k":3}}

ほかの呼び方の結果をまとめました。

リクエスト 応答
/runsync(text なし) {"id":"test-…","status":"FAILED","error":"text is a required input."}
/run {"id":"test-96567299-…","status":"IN_PROGRESS"}
続けて /status/{id}(1回目) {"id":"test-96567299-…","status":"COMPLETED","output":{"label":"positive","score":1,"top_k":1}}
同じ /status/{id}(2回目) {"id":"test-96567299-…","status":"FAILED","error":"Job ID not found"}
GET /status/{id} {"detail":"Method Not Allowed"}(405)
input の無い本文 {"detail":[{"type":"missing","loc":["body","input"],"msg":"Field required",…}]}
通常の関数に /stream/{id} "error":"Stream not supported, handler must be a generator."

SDK 1.12.0 の手元のサーバーでは、/run はジョブを預かって ID を返すだけで、/status を呼んだときにハンドラーが動き、結果を返すとジョブを消しました。そのため2回目の /status は Job ID not found になります。公式ドキュメントも、非同期の動きは Runpod の仕組みが必要なので、手元では /runsync で確かめるよう書いています。

ストリーミング(generator のハンドラー)

yield で少しずつ返すハンドラーは、/stream で途中の結果を受け取れます。return_aggregate_stream: True を付けると、/run の結果(/status)でもまとめて受け取れます。

# stream_handler.py
import time
import runpod

def handler(job):
    words = job["input"]["text"].split()
    for i, word in enumerate(words, 1):
        runpod.serverless.progress_update(job, f"{i}/{len(words)}")
        time.sleep(0.2)
        yield {"token": word}

runpod.serverless.start({"handler": handler, "return_aggregate_stream": True})

手元のサーバーで /runsync と、/run の後の /stream/{id} を呼んだ結果です。

/runsync  → {"id":"test-0a35e719-…","status":"COMPLETED","output":[{"token":"GPU"},{"token":"を"},{"token":"秒"},{"token":"単位で"},{"token":"借りる"}]}
/stream   → {"id":"test-69222166-…","status":"COMPLETED","stream":[{"output":{"token":"GPU"}},{"output":{"token":"を"}},{"output":{"token":"秒"}},{"output":{"token":"単位で"}},{"output":{"token":"借りる"}}]}

generator のハンドラーを --test_input で動かすと、結果は {'output': <generator object handler at 0x…>} と表示され、中身は取り出されませんでした。generator のハンドラーは --rp_serve_api で確かめます。progress_update は進み具合を /status に載せる関数で、手元のサーバーでは送り先が無いため、ログに Failed to return job results. の行が出ました。

デプロイ(Dockerイメージ → エンドポイント)

手元で動いたハンドラーを Docker イメージにします。公式の Dockerfile の形を、この記事のファイルの置き場所に合わせました。

FROM python:3.11.1-slim
WORKDIR /
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY handler.py .
CMD ["python", "-u", "/handler.py"]
docker build --platform linux/amd64 -t DOCKER_USERNAME/sentiment-worker:v1.0.0 .
docker push DOCKER_USERNAME/sentiment-worker:v1.0.0

コンソールの Serverless で New Endpoint → Import from Docker Registry を選び、イメージの URL を入れて GPU と設定を決め、Deploy Endpoint を押します。GitHub のリポジトリから直接デプロイする方法もあります。公式は、本番では :latest のタグを避け、版の付いたタグを使うよう書いています。Dockerfile を小さく保つ書き方は、関連記事「Dockerfileの書き方|軽く・速く・安全なイメージを作るベストプラクティス」で扱っています。

エンドポイントの主な設定と既定値です(公式の Endpoint settings)。

設定 既定値 意味
Active workers 0 常に起動しておく台数。1以上でコールドスタートが減る
Max workers 3 増やせる上限の台数
GPUs per worker 1 1台あたりの GPU の枚数
Idle timeout 5秒 最後のジョブの後、次を待つ時間(課金される)
Execution timeout 600秒 1ジョブの上限(5秒〜7日)
Job TTL 24時間 ジョブが残る期間(10秒〜7日)
FlashBoot 有効 起動を速くする仕組み
GPU priority ― GPU の種類を最大3つ、優先順に指定

課金は、ワーカーの起動から完全に止まるまでで、秒単位に切り上げです。コールドスタート(モデルを GPU に載せる時間など)・処理・待機(Idle timeout)の時間が対象で、縮んだワーカー(Idle)には課金されません。

RunPodのAPIの呼び方(curl・Python SDK・REST API)

この節では、デプロイしたエンドポイントを呼ぶときに、実際にどんなリクエストが送られるかが分かります。

Serverless のエンドポイントは https://api.runpod.ai/v2/{エンドポイントID}/{操作} の形で呼びます。 主な操作です(公式の Operation reference)。

操作 内容 上限・保存期間
POST /runsync 終わるまで待って結果を返す 本文 20MB・結果は1分保存・既定で90秒待つ
POST /run ジョブ ID をすぐ返す 本文 10MB・結果は30分保存
GET /status/{id} 状態と結果 IN_QUEUE・IN_PROGRESS・COMPLETED・FAILED
GET /stream/{id} 途中の結果 1チャンク 1MB まで
POST /cancel/{id} 取り消す CANCELLED になる
POST /retry/{id} 失敗したジョブを同じ ID で再実行 結果が残っている間
POST /purge-queue 待ち行列のジョブを消す 実行中のものは続く
GET /health ジョブの数とワーカーの状態 ―

/runsync の待ち時間は ?wait= で 1000〜300000 ミリ秒に変えられます。

Python SDK から呼ぶ

SDK の runpod.Endpoint で呼ぶコードです。SDK は環境変数 RUNPOD_ENDPOINT_BASE_URL(既定は https://api.runpod.ai/v2)を読むので、自作の擬似サーバーに向けて、送られた中身を記録しました。

import os
import runpod

runpod.api_key = os.environ["RUNPOD_API_KEY"]
endpoint = runpod.Endpoint("abc123xyz")

# 同期:結果が返るまで待つ(/runsync)
print("run_sync:", endpoint.run_sync({"text": "最高"}, timeout=60))

# 非同期:ジョブIDを受け取り、あとで結果を取る(/run → /status)
job = endpoint.run({"input": {"text": "好き"}})
print("job id:", job.job_id)
print("status:", job.status())
print("output:", job.output(timeout=30))

print("health:", endpoint.health())
run_sync: {'label': 'positive', 'echo': {'text': '最高'}}
job id: db0e0091-c735-4842-bb6a-f62fc3c6e2ca
status: IN_QUEUE
output: {'label': 'positive', 'echo': {'text': '好き'}}
health: {'jobs': {'completed': 3, 'failed': 0, 'inProgress': 0, 'inQueue': 0, 'retried': 0}, 'workers': {'idle': 1, 'running': 0}}

擬似サーバーに届いたリクエストです(API キーはダミー)。

--> POST /v2/abc123xyz/runsync
    authorization: Bearer rpa_DUMMYKEY0123456789
    content-type: application/json
    user-agent: python-requests/2.34.2
    body: {"input": {"text": "最高"}}
--> POST /v2/abc123xyz/run
    authorization: Bearer rpa_DUMMYKEY0123456789
    body: {"input": {"text": "好き"}}
--> GET /v2/abc123xyz/status/db0e0091-c735-4842-bb6a-f62fc3c6e2ca
--> GET /v2/abc123xyz/status/db0e0091-c735-4842-bb6a-f62fc3c6e2ca
--> GET /v2/abc123xyz/status/db0e0091-c735-4842-bb6a-f62fc3c6e2ca
--> GET /v2/abc123xyz/health

読み取れることは次の3つです。

  • run_sync({"text": "最高"}) のように input を付けずに渡しても、SDK が {"input": {...}} に包んで送った。
  • ヘッダーは authorization: Bearer <キー>。
  • job.output(timeout=30) は、COMPLETED になるまで約1秒おきに /status を呼んだ(擬似サーバーは3回目で完了を返す設定)。

API キーが違うと、SDK は次の例外を出しました。

RuntimeError: 401 Unauthorized | Make sure Runpod API key is set and valid.

curl で呼ぶ(webhook・policy)

/run には、終わったら知らせる webhook と、ジョブごとの時間の上限 policy を付けられます(公式の Send API requests)。擬似サーバーに送った curl です。

curl -X POST https://api.runpod.ai/v2/$ENDPOINT_ID/run \
  -H "authorization: Bearer $RUNPOD_API_KEY" \
  -H 'content-type: application/json' \
  -d '{"input": {"text": "最高"}, "webhook": "https://example.com/runpod-webhook", "policy": {"executionTimeout": 120000, "ttl": 3600000}}'
--> POST /v2/abc123xyz/run
    authorization: Bearer rpa_DUMMYKEY0123456789
    content-type: application/json
    user-agent: curl/8.5.0
    body: {"input": {"text": "最高"}, "webhook": "https://example.com/runpod-webhook", "policy": {"executionTimeout": 120000, "ttl": 3600000}}

executionTimeout の既定は 600000 ミリ秒(10分)、ttl の既定は 86400000 ミリ秒(24時間)です。lowPriority: true にすると、そのジョブではワーカーが増えません。webhook を受ける側は 200 を返す作りにします。

レート制限は、エンドポイント・利用者ごとに10秒あたり /run 1,000件(同時200)、/runsync 2,000件(同時400)、/status 2,000件(同時400)で、超えると 429 が返ります。

vLLM のエンドポイントは OpenAI 互換で呼べる

Serverless の vLLM ワーカーは、OpenAI 互換の API を持ちます。base_url を次の形にすると、OpenAI の SDK から呼べます。

from openai import OpenAI

client = OpenAI(
    api_key="RUNPOD_API_KEY",
    base_url="https://api.runpod.ai/v2/ENDPOINT_ID/openai/v1",
)

vLLM の仕組みとオプションは、関連記事「vLLMとは|使い方・インストール・OpenAI互換APIとOllamaとの違い」で扱っています。

Pod を API で作る(REST API v2)

REST API v1(https://rest.runpod.io/v1)は非推奨で、2026年11月15日に終了します。 公式は v2(https://api.runpod.io/v2)への移行を案内しています。v2 では本文の形が入れ子になり(imageName → image、GPU は gpu: {id, count}、Container Disk は disk)、エラーは RFC 9457 の形(title・status・detail)になります。公式の POST /v2/pods の項目で組んだリクエストを、擬似サーバーに送りました。

curl -X POST https://api.runpod.io/v2/pods \
  -H "Authorization: Bearer $RUNPOD_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"name": "dev-4090", "image": "runpod/pytorch:1.0.2-cu1281-torch280-ubuntu2404", "gpu": {"id": "NVIDIA GeForce RTX 4090", "count": 1}, "cloud": "SECURE", "disk": 50, "mounts": {"persistent": {"size": 20, "path": "/workspace"}}, "ports": ["8888/http", "22/tcp"], "startJupyter": true, "startSsh": true}'
--> POST /v2/pods
    authorization: Bearer rpa_DUMMYKEY0123456789
    content-type: application/json
    body: {"name": "dev-4090", "image": "runpod/pytorch:1.0.2-cu1281-torch280-ubuntu2404", "gpu": {"id": "NVIDIA GeForce RTX 4090", "count": 1}, "cloud": "SECURE", "disk": 50, "mounts": {"persistent": {"size": 20, "path": "/workspace"}}, "ports": ["8888/http", "22/tcp"], "startJupyter": true, "startSsh": true}

公式の例では、作成直後の応答は 201 Created で status が PROVISIONING です。RUNNING になるまで GET /v2/pods/{id} で待ちます。停止・開始・削除は POST /v2/pods/{id}/action の本文で start・stop・restart・terminate を指定します。v2 のレート制限を超えたときの本文は次の形です(公式)。

{
  "title": "Too Many Requests",
  "status": 429,
  "detail": "rate limit exceeded for the minute window"
}

なお、Python SDK 1.12.0 の runpod.create_pod() などの関数は、ソースでは https://api.runpod.io/graphql に GraphQL で送る作りです。2026年10月15日には、Flash を取り込んだ Runpod SDK 2.0(rp CLI)が発表され、PyPI では 2.0.0rc2 が先行版として出ています。

RunPodのよくあるエラーと直し方

この節では、出たエラーから原因と直し方を引けます。

エラー・症状 原因 直し方
Pod を Start すると GPU が 0 枚 停止中に GPU をほかの人が借りた 待つか、Terminate して作り直す。予防は Network Volume
HTTP のポートを開くと 502 GPU が付いていない、プログラムが止まった・エラー Pod のログを見る。テンプレートの ReadMe の手順を確かめる
100秒で切れて 524 プロキシの接続は100秒まで 処理をバックグラウンドにする。SSH・TCP を使う
Stop したら入れたライブラリ・ファイルが消えた /workspace の外(Container Disk)に置いた /workspace に置く。環境はテンプレートか Dockerfile にする
ディスクがいっぱい モデル・生成物・ゴミ箱 df -h・du -sh で探して消す。Network Volume を使う
Permissions 0644 for '…' are too open. 秘密鍵の権限が広い chmod 600 ~/.ssh/id_ed25519
SSH でパスワードを聞かれる 公開鍵の登録の誤り(指紋を貼った等) .pub の1行を Credentials に登録し直す
scp が使えない Basic SSH(中継経由)で接続した Full SSH(公開 IP とポート)で接続する
ジョブが IN_QUEUE のまま ワーカーの上限が少ない・コールドスタート Max workers を上げる、Active workers・FlashBoot
ワーカーが throttled ホストに空き GPU が無い エンドポイントに GPU の種類を追加する
ジョブが Timeout Execution timeout を超えた 上限を延ばす。モデルをイメージに入れる・キャッシュする
OOM(GPU メモリ不足) モデル・バッチが VRAM を超えた バッチを小さくする。VRAM の大きい GPU にする
RuntimeError: 401 Unauthorized(SDK。続けて Make sure Runpod API key is set and valid.) API キーが違う・権限が足りない キーと Restricted の権限を確かめる
RuntimeError: Expected ... to be initialized.(SDK。run_pod.api_key の設定を求める文) SDK に API キーを設定していない runpod.api_key = os.environ["RUNPOD_API_KEY"]
手元の /runsync が Internal Server Error error にリスト(['text is a required input.'])を返した error は文字列で返す(ログは Input should be a valid string)
Job has no input parameter. Unable to run. テストの JSON に input が無い {"input": {...}} の形にする
Stream not supported, handler must be a generator. 通常の関数に /stream を呼んだ yield で返すハンドラーにする
残高 0 で Pod が消えた Network Volume の無い Pod は削除される 低残高の通知・自動チャージを設定する

Internal Server Error の行は、SDK 1.12.0 の手元のサーバーで実際に出たものです。サーバーのログには fastapi.exceptions.ResponseValidationError と 'msg': 'Input should be a valid string' が出ていました。

RunPodとほかのGPUクラウドの違い

この節では、よく比べられるサービスとの違いを、各社の公式ページの事実で比べられます(2026年10月22日時点)。

比べること RunPod Google Colab Vast.ai Modal
形 GPU のコンテナ(Pods)と Serverless ブラウザのノートブック 個人・事業者の GPU を借りる市場 Python から使う Serverless
課金 秒単位の従量(前払い) 無料枠と、コンピューティングユニットの有料プラン 秒単位の従量(前払い) 秒単位の従量
GPU を選べるか 21種から選ぶ(Pods) プランと空きに応じて割り当て ホストの出品から選ぶ 関数ごとに指定
停止中のストレージ Volume Disk は課金が続く ― 停止中も課金が続く ―
無料で使える分 記載なし 無料枠あり(保証なし) 記載なし Starter プランに月 $30 分
主な制限 プロキシの HTTP は100秒まで 無料は最大12時間、操作が無いと切れる ホストごとに通信料が違う ―

Lambda(GPU クラウド)は、H100 SXM を $3.99/GPU時、A100 SXM(80GB)を $2.79/GPU時と表示し、egress の料金は無いと案内しています。Modal は H100(SXM5)を $0.001097/秒と表示しています。どれも、借りられる GPU・料金・地域はそれぞれの公式ページで変わるので、使う前に確かめます。

ブラウザだけで GPU のノートブックを使う方法は、関連記事「Google Colabとは|使い方・GPU・料金・制限とエラーの直し方」で扱っています。サーバーレスの関数をローカルで確かめる考え方は、AWS の場合を関連記事「AWS Lambda Python入門|3.14対応handler例とローカルテスト」で扱っています。

安全に使うために確かめること

  • 業務のデータは Secure Cloud を選ぶ。公式は、Secure Cloud の提携先が SOC 2・ISO 27001・PCI DSS などの基準を満たしていると書いている。
  • API キーは Restricted で、必要なエンドポイントだけに絞る。キーをコードに書かず、環境変数や Runpod の Secrets を使う。
  • Jupyter や ComfyUI の画面は、URL を知っている人が開ける。パスワード(JUPYTER_PASSWORD など)を設定し、URL を共有しない。
  • モデルや画像は、ライセンスと利用規約で許された範囲で使う。

よくある質問

Q. RunPodとは何ですか? A. AI の学習・推論や画像生成のために、GPU を秒単位の従量課金で借りるクラウドです。マシンを借りる Pods と、リクエストの間だけ動く Serverless があります。

Q. RunPodの読み方は? A. 日本語では「ランポッド」と読まれることが多いです。公式ドキュメントの表記は「Runpod」です。

Q. RunPodは無料で使えますか? A. 公式ドキュメントに無料枠・無料トライアルの記載はありません。クレジットを入金して使い、公式は $10 から始められると案内しています。入金したクレジットは返金されません。

Q. RunPodの料金はいくらですか? A. 2026年10月22日時点の料金ページの表示で、Pods は RTX A5000 が $0.27/時、RTX 4090 が $0.89/時、H100 SXM が $3.99/時です。ほかにストレージが $0.07〜$0.20/GB/月かかります。

Q. Podを停止(Stop)している間も料金はかかりますか? A. GPU の料金は止まりますが、Volume Disk は $0.20/GB/月、Network Volume は $0.07/GB/月かかり続けます。完全に止めるには Terminate し、Network Volume も消します。

Q. StopとTerminateの違いは? A. Stop は GPU を手放して /workspace を残す操作、Terminate は Pod を消す操作です。Terminate すると Network Volume 以外のデータは戻せません。

Q. 支払い方法は? A. クレジットカード・暗号資産・請求書($5,000 を超える取引)です。プリペイドカードは1回 $100 以上の入金が案内されています。

Q. RunPodでComfyUIやStable Diffusionは使えますか? A. 使えます。ComfyUI などのテンプレートを選んで Pod を作り、Connect から画面を開きます。画像生成の VRAM の目安は 16〜24GB です。

Q. RunPod ServerlessとPodsはどちらを使えばいいですか? A. 画面で作業する・学習を回すなら Pods、アプリから推論を呼ぶなら Serverless です。Serverless は待機中に0台まで縮むので、呼ばれる回数が少ないほど安くなります。

Q. コールドスタートとは何ですか? A. ワーカーが起動してから最初のジョブを受けられるまでの時間で、課金の対象です。Active workers を1台以上にする、FlashBoot、モデルのキャッシュで短くできます。

Q. Network Volumeは何に使いますか? A. Pod を消しても残るストレージです。複数の Pod で共有でき、Zero GPU のときに別のマシンで作り直してもデータを付けられます。データセンターに結び付きます。

Q. ブラウザを閉じても処理は続きますか? A. Pod は動き続けます。Web ターミナルのセッションは切れるので、長い処理は SSH から tmux の中で動かします。

Q. RunPodとGoogle Colabの違いは? A. RunPod は GPU を選んで時間単価で借り、ストレージも自分で持ちます。Colab はブラウザのノートブックで、無料枠がある代わりに GPU の割り当てや時間に制限があります。

まとめ

  • RunPod は GPU を秒単位で借りるクラウド。Pods(マシンを借りる)と Serverless(リクエストの間だけ動く)を使い分ける。
  • 料金は GPU の時間単価(RTX 4090 の Pod で $0.89/時)とストレージの合計。無料枠は無く、前払いのクレジットで使う(2026年10月22日時点)。
  • データは /workspace に置く。Container Disk は Stop で消え、Volume Disk は Terminate で消え、Network Volume だけが Pod から独立して残る。
  • 停止中の Volume Disk は $0.20/GB/月。試算では、つけっぱなしは使う分だけ動かす場合の約7.5倍になった。
  • Serverless はハンドラーを書き、--test_input と --rp_serve_api で手元で確かめてからイメージにする。失敗は終了コード 1、error は文字列で返す。
  • API は https://api.runpod.ai/v2/{ID}/run などに authorization: Bearer で送る。REST API v1 は2026年11月15日に終了するので、v2 を使う。

参考・出典

確認日はいずれも 2026年10月22日です。

  • Runpod「Pricing」:https://www.runpod.io/pricing
  • Runpod Docs「Runpod product overview」:https://docs.runpod.io/get-started/products
  • Runpod Docs「Pod pricing」:https://docs.runpod.io/pods/pricing
  • Runpod Docs「Choose a Pod」:https://docs.runpod.io/pods/choose-a-pod
  • Runpod Docs「Manage Pods」:https://docs.runpod.io/pods/manage-pods
  • Runpod Docs「Storage options」:https://docs.runpod.io/pods/storage/types
  • Runpod Docs「Network volumes」:https://docs.runpod.io/storage/network-volumes
  • Runpod Docs「Zero GPU Pods on restart」:https://docs.runpod.io/pods/troubleshooting/zero-gpus
  • Runpod Docs「Connection options」:https://docs.runpod.io/pods/connect-to-a-pod
  • Runpod Docs「Connect to a Pod with SSH」:https://docs.runpod.io/pods/configuration/use-ssh
  • Runpod Docs「Expose ports」:https://docs.runpod.io/pods/configuration/expose-ports
  • Runpod Docs「Pod templates」:https://docs.runpod.io/pods/templates/overview
  • Runpod Docs「Billing overview」:https://docs.runpod.io/accounts-billing/billing
  • Runpod Docs「Manage credentials」:https://docs.runpod.io/get-started/credentials
  • Runpod Docs「runpodctl」:https://docs.runpod.io/runpodctl/overview
  • Runpod Docs「runpodctl pod」:https://docs.runpod.io/runpodctl/reference/runpodctl-pod
  • Runpod Docs「Serverless overview」:https://docs.runpod.io/serverless/overview
  • Runpod Docs「Serverless pricing」:https://docs.runpod.io/serverless/pricing
  • Runpod Docs「Handler functions」:https://docs.runpod.io/serverless/workers/handler-functions
  • Runpod Docs「Local testing」:https://docs.runpod.io/serverless/development/local-testing
  • Runpod Docs「Create a Dockerfile」:https://docs.runpod.io/serverless/workers/create-dockerfile
  • Runpod Docs「Deploy workers from Docker Hub」:https://docs.runpod.io/serverless/workers/deploy
  • Runpod Docs「Endpoint settings」:https://docs.runpod.io/serverless/endpoints/endpoint-configurations
  • Runpod Docs「Send API requests」:https://docs.runpod.io/serverless/endpoints/send-requests
  • Runpod Docs「Operation reference」:https://docs.runpod.io/serverless/endpoints/operation-reference
  • Runpod Docs「OpenAI API compatibility」:https://docs.runpod.io/serverless/vllm/openai-compatibility
  • Runpod Docs「Serverless troubleshooting」:https://docs.runpod.io/serverless/troubleshooting
  • Runpod Docs「502 errors」:https://docs.runpod.io/pods/troubleshooting/troubleshooting-502-errors
  • Runpod Docs「Storage full」:https://docs.runpod.io/pods/troubleshooting/storage-full
  • Runpod Docs「API v2」「Migrate from API v1」「Create a pod」「Rate limits」:https://docs.runpod.io/api-reference-v2/overview
  • Runpod Docs「Runpod Python SDK」:https://docs.runpod.io/sdk/overview
  • Runpod Docs「Using TMUX for persistent sessions」:https://docs.runpod.io/tips-and-tricks/tmux
  • Runpod Docs「Product updates」:https://docs.runpod.io/release-notes
  • Runpod Docs「Public Endpoints」:https://docs.runpod.io/public-endpoints/overview
  • Runpod Docs「Data security and legal compliance」:https://docs.runpod.io/references/security-and-compliance
  • PyPI「runpod」:https://pypi.org/project/runpod/
  • GitHub「runpod/runpod-python」:https://github.com/runpod/runpod-python
  • Google「Colaboratory よくある質問」:https://research.google.com/colaboratory/faq.html
  • Vast.ai Docs「Pricing」:https://docs.vast.ai/documentation/instances/pricing
  • Modal「Pricing」:https://modal.com/pricing
  • Lambda「Pricing」:https://lambda.ai/pricing

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「RunPodとは|使い方・料金・PodsとServerlessの違いを実例で」

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?