VPS Notes
セルフホスト

Ollama を GPU なしの VPS で動かす実測: 何 B のモデルまで実用か、n8n から呼ぶまで

国内 VPS は GPU がありません。それでも Ollama で小さなオープン LLM を CPU で動かし、常駐の要約・分類・ボットに使えるかを 4GB / 8GB で実測しました。インストール、Tailscale 内への公開、OpenAI 互換 API、n8n からの呼び出しまで。

ollamallmdockern8ntailscalexserver-vps

本記事にはプロモーション (アフィリエイト広告) が含まれます。

「Ollama を VPS で」と検索する人は多いのに、実測を載せた記事が少ないので、先に結論を置きます。

国内の VPS には GPU がありません。それでも、月 2,480 円の 4GB VPS で 3B クラスのモデルが 1 秒に 40 トークン、1B なら 60 トークン出ました。 100 字の日本語なら 2〜3 秒です。私は「CPU では 1 秒に数トークル」と思い込んでいましたが、最近の VPS の CPU (AVX-512 対応) では桁が違います。上限を決めるのは速度ではなく メモリ で、4GB に n8n と Claude Code を同居させた状態では 3B が限界でした。

この記事では、その数字を実機で示します。4GB の VPS で 0.6B〜3B のモデルを動かして速度とメモリを測り、日本語の要約品質を比べ、n8n の Anthropic ノードを Ollama に差し替えて API 課金ゼロで動かすところまでやります。

Ollama とは

オープンなモデル (Llama、Gemma、Qwen、Mistral など) を、1 コマンドで取得して動かすためのツールです。

ollama run llama3.2:3b

これだけでモデルのダウンロードから対話まで始まります。裏では http://127.0.0.1:11434 に API サーバーが立っていて、OpenAI 互換のエンドポイントもあるので、OpenAI 用に書かれたクライアントの接続先を差し替えるだけで使えます。

この記事で使う環境

XServer VPS クラウド
4GB (4 コア) で月 2,480 円〜。この記事の実測環境。CPU が AMD EPYC Genoa で AVX-512 が使えるのが効いています。
公式サイトを見る

メモリとモデルサイズの目安

量子化 (Q4) されたモデルは、パラメータ数の 0.6〜0.7 倍の GB をメモリに載せます。それに OS と他のサービスの分を足します。

モデル ファイルサイズ 推論時のメモリ増分
qwen3:0.6b 0.5GB 約 0.8GB
llama3.2:1b 1.3GB 約 1.2GB
qwen3:1.7b 1.4GB 約 1.6GB
llama3.2:3b 2.0GB 約 2.0GB

4GB の VPS で他に何も動かしていなければ 3B〜4B、n8n や Claude Code と同居させるなら 3B が上限です。8B クラス (llama3.1:8b、約 5GB) は 8GB プランが要ります。

Gemma 4 は 12B からしかなく、4GB の VPS には載りません。「gemma4 を VPS で」と考えている人は、8GB でも足りず 16GB プランが要ります。小型モデルなら Llama 3.2 (1B / 3B) か Qwen 3 (0.6B / 1.7B / 4B) が選択肢です。

1. インストールと公開範囲の設定

curl -fsSL https://ollama.com/install.sh | sh
>>> Installing ollama to /usr/local
>>> Creating ollama user...
>>> Creating ollama systemd service...
>>> Enabling and starting ollama service...
>>> The Ollama API is now available at 127.0.0.1:11434.
>>> Install complete. Run "ollama" from the command line.
WARNING: No NVIDIA/AMD GPU detected. Ollama will run in CPU-only mode.

最後の WARNING が、この記事の前提そのものです。systemd のサービスとして入り、自動起動も有効になります。

初期状態では 127.0.0.1:11434 だけで待ち受けます。n8n のコンテナや手元の Mac から呼ぶには、待ち受けを広げます。インターネット側には出しません。 Ollama には認証がないので、公開したら誰でもモデルを使えてしまいます。

systemctl edit でも設定できますが、コメント行の下に書くと保存されずに破棄される (私はここで一度失敗しました) ので、ファイルを直接置く方が確実です。

sudo mkdir -p /etc/systemd/system/ollama.service.d
sudo tee /etc/systemd/system/ollama.service.d/override.conf <<'EOS'
[Service]
Environment="OLLAMA_HOST=0.0.0.0:11434"
EOS
sudo systemctl daemon-reload
sudo systemctl restart ollama
ss -tlnp | grep 11434
LISTEN 0      4096                             *:11434            *:*

0.0.0.0 にしていますが、初期設定の ufw は「SSH 以外を全部拒否」、Tailscale の記事tailscale0 からは全部許可、にしてあるので、届くのは tailnet の中からだけです。n8n のコンテナからも呼ぶなら、n8n の記事の SSH と同じ理由で、Docker のネットワークからの許可を足します。

sudo ufw allow from 192.168.16.0/20 to any port 11434 proto tcp comment 'n8n container to ollama'

手元の Mac から Tailscale 経由で届き、グローバル IP には届かないことを確認します。

curl -s http://100.96.34.27:11434/api/version
{"version":"0.34.2"}

グローバル IP に対して同じことをするとタイムアウトします。

2. モデルを取って動かす

ollama pull llama3.2:1b
ollama run llama3.2:1b --verbose

1.3GB のダウンロードに 2 分ほどかかりました。--verbose をつけると、応答の最後に速度が出ます。

total duration:       3.702585888s
load duration:        1.539583797s
prompt eval count:    175 token(s)
prompt eval duration: 606.15ms
prompt eval rate:     288.71 tokens/s
eval count:           96 token(s)
eval duration:        1.552345s
eval rate:            61.84 tokens/s

eval rate が生成速度で、「1 秒に何トークン出るか」です。日本語だと 1 トークンがおおよそ 1〜2 文字なので、61.8 t/s は 1 秒に 60〜120 字。人が読む速さより速いです。load duration はモデルをメモリに載せる時間で、初回だけかかります。

実測: モデルごとの速度とメモリ

同じプロンプト (日本語 200 字の文章を 2 行に要約) を、モデルごとに 3 回流しました。2 回目以降 (モデル読み込み済み) の値です。ホスト全体の使用メモリは、n8n と Claude Code が動いている状態 (推論前 1.3GB) からの数字です。

モデル サイズ 生成速度 応答時間 使用メモリ (ホスト全体)
qwen3:0.6b 0.5GB 100 t/s 2.7〜4.5 秒 2.1GB
llama3.2:1b 1.3GB 62 t/s 1.3〜1.8 秒 2.5GB
qwen3:1.7b 1.4GB 55 t/s 6〜8 秒 2.9GB
llama3.2:3b 2.0GB 39 t/s 2.1〜2.2 秒 3.3GB

見どころは 3 つです。

日本語の品質

速度が出ても、日本語が崩れては使えません。同じ要約タスクで比べました (qwen3 は think なし)。

llama3.2:1b (84 トークン、3.5 秒)

VPS を契約した直後、root にパスワードでログインできます。作業ユーザーを作り、ssh の鍵認証だけを用いるし、ufw を閉じ、fail2ban を使用して総当たりを弾き、unattended-upgrades を自動化すれば、自分の鍵を持ってセキュリティを維持できます。

要点は拾えていますが、「用いるし」「ufw を閉じ」のように日本語が少し崩れます。分類やタグ付けのような、出力が短く形式が決まっている処理なら使えます。

llama3.2:3b (140 トークン、8.7 秒)

VPS を契約すると、すぐに世界中からログインが可能になるため、初期設定が大事です。以下のような準備をすると、セキュリティを強化できるようになります。

  • 作業ユーザーを作成し、SSH を鍵認証のみにする
  • SSH以外のポートを閉じる
  • fail2ban を使用して総当たりを弾き、unattended-upgrades を使用してセキュリティ更新を自動化する

日本語は自然で、箇条書きまで整えてきます。ただし「2 行で」という指示を守っていません。

qwen3:1.7b (97 トークン、8.7 秒)

VPS契約後はrootパスワードでログイン可能だが、作業用ユーザーを作成し、SSHを鍵認証に変更し、ufwで他ポートを閉じ、fail2banで攻撃を弾き、unattended-upgradesでセキュリティ更新を自動化することで、セキュリティが確保できる状態にできる。この作業は約30分で完了する。

一番忠実です。要点を落とさず、指示にも従い、日本語も自然です。4GB の VPS で要約や整形をさせるなら、qwen3:1.7b を think なしで使うのが本命 だと思います。

メモリが足りないとスワップに落ちて、速度が 1/10 以下になります。「動くけど使い物にならない」状態です。上の表で自分の環境に収まるモデルを選んでください。8B クラスを動かしたいなら 8GB プランです。

常駐させるかどうか

Ollama は、使われないモデルを 5 分でメモリから降ろします。次のリクエストで再読み込みするので、初回だけ数秒〜数十秒余計にかかります。定期実行の用途ならこのままで構いません。常にメモリに置きたいなら OLLAMA_KEEP_ALIVE=-1 を systemd の環境変数に足します。ただし他のサービスとメモリを奪い合うので、4GB で n8n や Claude Code と同居させるなら降ろす方が安全です。

3. API で呼ぶ

Ollama 自身の API と、OpenAI 互換 API の 2 つがあります。既存のツールと繋ぐなら後者が楽です。

curl http://100.x.y.z:11434/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gemma4:4b",
    "messages": [
      {"role": "system", "content": "与えられた文章を 1 行で要約する。"},
      {"role": "user", "content": "(ここに文章)"}
    ]
  }'

OpenAI の SDK なら、base_urlhttp://100.x.y.z:11434/v1 に、api_key を適当な文字列にすれば、そのまま動きます。

4. n8n から呼ぶ

n8n には Ollama ノードがあり、n8n の記事で使った Anthropic ノードと同じ構造 (Message a Model) です。Credential を新規作成して Base URL に http://100.96.34.27:11434 (VPS の Tailscale IP) を入れ、Model に qwen3:1.7b を選ぶだけで、プロンプトはそのまま使えます。

「毎朝 VPS の状態を要約して通知」のワークフローに、Anthropic ノードと並列で Ollama ノードを足して、同じ入力 (free / df / uptime の出力) を両方に流しました。

SSH の出力を Claude と Ollama の両方に流す

Ollama ノードの設定。Credential と Model 以外は Anthropic と同じ

Claude と Ollama の返答を並べる

同じ入力に対する返答です。この日のディスクは 29% (Ollama のモデルを 4 つ入れた直後)、メモリは 2.9GB 空き、スワップが 506MB 使われている状態でした。

qwen3:1.7b (Ollama、API 課金なし)

問題なし

claude-sonnet-5 (Anthropic API)

  • メモリ・ディスク・負荷ともに余裕があり健全です (available 2.9Gi、Disk 使用率 29%、load average 1.0 未満)。
  • ただしメモリに余裕があるにもかかわらず Swap が 506Mi 使用されている点は少し気になります。vm.swappiness 設定の確認を推奨します。

同じ入力に対する Claude の返答

差は明らかです。qwen3 は各数値が閾値の範囲内かを見て「問題なし」と言いました。Claude は「メモリが空いているのにスワップが使われている」という 数値の間の矛盾 に気づき、原因の候補まで挙げています。実際、このスワップは直前のベンチマークで 3B モデルを載せたときに押し出されたものなので、指摘は正しいです。

「異常があったら教えて」という用途では、この差が本質です。閾値を超えたかどうかの判定なら Ollama で十分ですが、「何かおかしい」を見つけるのは Claude の方が圧倒的に上です。

向いている処理、向いていない処理

1.7B〜3B クラスのモデルに向いているのは、入力も出力も短く、正解がだいたい決まっている処理です。

向いていないのは、長い文脈の理解、数値の間の関係を見る判断、推論が要る判断、コード生成です。そこは Claude に投げる方が結局安くつきます。私の朝のチェックは、当面この並列の形 (Telegram に 2 通届く) で動かして、両者の返答を毎日見比べることにしました。1 日 1 回なら Claude 側は月に数円ですし、どこで差が出るかを観察したいからです。

5. 費用: Anthropic API と比べる

正直な比較です。朝のチェック 1 回は、入力 (プロンプト + free / df / uptime の出力) が 300 トークン、出力が 150 トークンほどでした。claude-sonnet-5 の単価は入力 $2 / 出力 $10 (100 万トークンあたり) なので、1 回 0.002 ドル、月 30 回で 0.06 ドル (約 9 円) です。

Ollama (XServer VPS クラウド 4GB) Anthropic API (claude-sonnet-5)
固定費 月 2,480 円 (VPS 代。他の用途と共用) 0 円 (前払いクレジット 5 ドル〜)
朝のチェック 1 日 1 回 0 円 月 9 円
短い要約 1 日 100 回 0 円 月 300 円
品質 閾値の判定はできる。矛盾には気づかない 数値の間の関係を見て指摘してくる
応答時間 (100 字) 2〜3 秒 3〜5 秒
データの行き先 VPS の中 Anthropic

お金だけなら Anthropic API の方が安い です。VPS を Ollama のためだけに借りるなら、月 2,480 円で API を 800 回以上呼べます。Ollama を選ぶ理由は、既に VPS があって空きメモリを使うだけなこと、データを外に出さないこと、回数を気にせず回せること、そして「自分のモデルを動かしている」こと自体です。次の記事で扱う、自分で学習させたモデルを動かす、という遊びもこの延長にあります。

私は当面、朝のチェックを Claude と Ollama の両方で動かして返答を見比べ、Ollama は「データを外に出したくない処理」と「試行回数が多い処理」に寄せていく、という進め方にしました。

つまずいた点

インストールから 4 モデルの実測、n8n での Claude との比較まで、全部で 1 時間ほどでした。

次にやること

まとめ

XServer VPS クラウド
この記事の検証環境。Ollama を他のサービスと同居させるなら 8GB プランが余裕です。
公式サイトを見る