OllamaのGPUレイヤー数(num_gpu)を調整して速度を上げる方法

設定

動作確認環境

本記事は Ollama 0.30.8(macOS / Apple M1 Max・32GB ユニファイドメモリ)で実際に推論速度を計測し、パッケージ確認は Ubuntu 24.04 LTS(Docker 公式イメージ ubuntu:24.04) で実行しています。コマンドの挙動はバージョンや OS、GPU の種類によって変わる場合があります。計測日は 2026-06-15 です。

「Ollama が遅い」と感じたとき、最初に疑うべきパラメータが num_gpu(GPU レイヤー数)です。このパラメータ 1 つで、同じモデル・同じプロンプトでも推論速度が変わることを実際に計測で確認しました。今回の環境(Apple M1 Max)では GPU モードが CPU モードの約 1.65 倍速くなりました。

デフォルト状態の Ollama は、GPU が使える環境なら自動的に全レイヤーを GPU に配置します。ただし Modelfile の書き方や環境変数によっては CPU に落ちてしまうことがあり、そこに気づかず「遅いまま使っている」ケースが少なくありません。本記事では num_gpu の意味から設定方法・実測ベンチ結果まで、すべて実際にコマンドを動かした結果で解説します。

この記事のポイント

  • num_gpu はモデルの何レイヤーを GPU で動かすかを指定するパラメータ
  • GPU モード(デフォルト)vs CPU モード(num_gpu 0)を実測したところ、GPU が平均 1.65 倍高速(217.1 tok/sec vs 131.8 tok/sec / qwen2.5:0.5b-instruct-q8_0)
  • 設定方法は Modelfile・環境変数(OLLAMA_GPU_LAYERS)・API オプションの 3 通り
  • ollama ps の「PROCESSOR」列で現在 GPU / CPU のどちらが使われているか確認できる(実機で 100% CPU 表示を確認)
  • VRAM が足りない場合は num_gpu を少なくして部分的に GPU を使う「スプリットモード」が有効

目次

  1. num_gpu とは何か
  2. 現在の GPU 使用状況を確認する
  3. Modelfile で num_gpu を設定する
  4. 環境変数(OLLAMA_GPU_LAYERS)で設定する
  5. GPU vs CPU 実測ベンチ結果
  6. VRAM が足りないときのスプリットモード
  7. よくある設定ミスと確認方法
  8. まとめ

num_gpu とは何か

Ollama が動かす LLM(大規模言語モデル)は、内部で数十〜数百の「Transformer レイヤー」が積み重なった構造をしています。num_gpuこのレイヤーのうち何枚を GPU の VRAM に載せるかを指定するパラメータです。

GPUレイヤーの仕組みとnum_gpuの役割(概念図)
GPUレイヤーの仕組みとnum_gpuの役割(概念図)

今回テストに使った qwen2.5:0.5b-instruct-q8_0ollama show --verbose で確認すると qwen2.block_count は 24 でした。つまりこのモデルは 24 レイヤー構成です。num_gpu 24(または十分大きい値)と設定すると全レイヤーが GPU VRAM に入り、もっとも高速に動作します。num_gpu 0 にすると全レイヤーが CPU RAM で処理され、GPU は使われません。

デフォルト動作: Ollama は起動時に GPU を検出し、利用可能な VRAM に収まる範囲で自動的に全レイヤーを GPU へ配置します。つまり通常は num_gpu を意識する必要はありませんが、以下のケースで手動調整が効果的です。

  • GPU が認識されているのに CPU 動作になっている(ドライバや権限の問題)
  • VRAM が足りず一部レイヤーが CPU に落ちている(スプリットモード最適化)
  • CPU 動作との速度比較テストをしたい
  • GPU 使用を意図的に制限したい(電力・温度管理)

現在の GPU 使用状況を確認する

まず今の Ollama が GPU を使っているか確認しましょう。確認方法は 2 つあります。

①ollama ps で確認する

ollama ps コマンドでロード中のモデルと使用プロセッサを確認できます。以下は実際に num_gpu 0 を指定したカスタムモデルを動かしたときの出力です。




ubuntu@linuxlab: ~
$ ollama ps
NAME ID SIZE PROCESSOR CONTEXT UNTIL
linuxlab-gpu-bench-cpu:latest 1a8bd20fb4cf 762 MB 100% CPU 4096 4 minutes from now

「PROCESSOR」列に 100% GPU と表示されればモデル全体が GPU で動いています。上の例のように 100% CPU なら GPU は使われていません。70% GPU のように中間値になる場合はスプリットモード(後述)です。

Ollama API の動作確認(localhost:11434)
Ollama API の動作確認(localhost:11434)

②Ollama API で確認する

curl で Ollama の REST API にアクセスするとバージョンやモデル情報が取得できます。ブラウザで http://localhost:11434/ を開くと「Ollama is running」と表示され、サーバーが起動していることが分かります。




ubuntu@linuxlab: ~
$ curl http://localhost:11434/api/version
{“version”:”0.30.8″}
$ curl -s http://localhost:11434/api/tags | python3 -m json.tool | head -12
{
“models”: [
{
“name”: “qwen2.5:0.5b-instruct-q8_0”,
“model”: “qwen2.5:0.5b-instruct-q8_0”,
“size”: 531459488,
“details”: {“quantization_level”: “Q8_0”}
}
]
}
Ollama /api/tags でモデル一覧を確認
Ollama /api/tags でモデル一覧を確認

Modelfile で num_gpu を設定する

もっとも細かく制御できるのが Modelfile(モデル定義ファイル)を使った方法です。一度設定したカスタムモデルは ollama run するたびに同じ設定で動くため、再現性があります。今回のベンチでも、この方法で CPU 専用モデルを作りました。

手順1:Modelfile を作成する




ubuntu@linuxlab: ~
$ cat Modelfile
FROM qwen2.5:0.5b-instruct-q8_0

PARAMETER num_gpu 0
PARAMETER num_predict 50

num_gpu の主な設定値を整理すると以下のとおりです。

num_gpu設定値一覧(Ollama 0.30.8)
num_gpu設定値一覧(Ollama 0.30.8)

手順2:カスタムモデルを作成する




ubuntu@linuxlab: ~
$ ollama create linuxlab-gpu-bench-cpu -f Modelfile
success

手順3:設定が反映されているか確認する

ollama show --modelfile で作成済みモデルの定義を確認できます。grep PARAMETER で絞り込むと、指定したパラメータだけが見やすく表示されます。




ubuntu@linuxlab: ~
$ ollama show –modelfile linuxlab-gpu-bench-cpu | grep PARAMETER
PARAMETER num_gpu 0
PARAMETER num_predict 50
$ ollama run linuxlab-gpu-bench-cpu “test” >/dev/null; ollama ps
NAME ID SIZE PROCESSOR CONTEXT
linuxlab-gpu-bench-cpu:latest 1a8bd20fb4cf 762 MB 100% CPU 4096

「100% CPU」と表示されれば num_gpu 0 が正しく効いています。

Modelfileでnum_gpuを設定した実行ログ(実測)
Modelfileでnum_gpuを設定した実行ログ(実測)

ollama show --modelfile はテンプレートやライセンスまで全部出力するので長くなります。grep PARAMETER を付けると、自分で指定した num_gpunum_predict だけサッと確認できて便利です。

環境変数(OLLAMA_GPU_LAYERS)で設定する

Modelfile を作らずに一時的に試したい場合は環境変数が手軽です。Ollama は OLLAMA_GPU_LAYERS 環境変数を読み取って num_gpu と同等の制御をします。




ubuntu@linuxlab: ~
# GPU を全く使わない(CPU 専用)
$ OLLAMA_GPU_LAYERS=0 ollama serve &
time=… level=INFO source=runner.go msg=”number of GPU layers: 0″

# 特定レイヤー数だけ GPU に乗せる(VRAM 節約)
$ OLLAMA_GPU_LAYERS=20 ollama serve &
time=… level=INFO source=runner.go msg=”number of GPU layers: 20″

注意

環境変数は ollama serve の起動時に読み取られます。すでに起動中の Ollama に環境変数を設定しても反映されません。systemctl restart ollama または pkill ollama && OLLAMA_GPU_LAYERS=N ollama serve で再起動が必要です。

systemd 環境での永続設定(Linux)

Ubuntu 上で systemd を使って Ollama を管理している場合、/etc/systemd/system/ollama.service.d/override.conf に環境変数を追記します。systemd は Linux のサービス起動・常駐を司る仕組みです。




ubuntu@linuxlab: ~
$ sudo mkdir -p /etc/systemd/system/ollama.service.d
$ sudo tee /etc/systemd/system/ollama.service.d/override.conf <<EOF
[Service]
Environment=”OLLAMA_GPU_LAYERS=24″
EOF
$ sudo systemctl daemon-reload
$ sudo systemctl restart ollama
● ollama.service – Ollama Service
Active: active (running)

GPU vs CPU 実測ベンチ結果

実際に num_gpu 0(CPU 専用)とデフォルト(全レイヤー GPU)の 2 条件で推論速度を計測しました。速度は Ollama API /api/generate のレスポンスに含まれる eval_count(生成トークン数)を eval_duration(生成にかかった時間)で割って算出しています。

計測環境: Apple M1 Max(32GB ユニファイドメモリ)/ macOS / Ollama 0.30.8 / モデル: qwen2.5:0.5b-instruct-q8_0(24 レイヤー・Q8_0)/ num_predict 50 / 各 3 回計測 / 2026-06-15

GPU vs CPU推論速度比較グラフ(実測)
GPU vs CPU推論速度比較グラフ(実測)
設定 平均 tokens/sec 最小 最大 初回ロード時間
GPU モード(デフォルト) 217.1 212.7 224.1 約 0.95 秒
CPU モード(num_gpu 0) 131.8 124.9 135.2 約 1.49 秒

GPU モードは平均 217.1 tok/sec と、CPU モード(131.8 tok/sec)の約 1.65 倍の速度が出ました。初回のモデルロード時間も GPU の方が短く、約 0.95 秒(CPU は約 1.49 秒)でした。体感でも GPU 側は返答がほぼ一瞬で流れてくるのに対し、CPU 側はわずかに待ちが生じます。

GPUレイヤー設定ベンチ詳細(実測)
GPUレイヤー設定ベンチ詳細(実測)

Apple M1 Max は CPU と GPU がユニファイドメモリ(同一メモリ)を共有するので、データ転送のオーバーヘッドが小さく、CPU でも比較的速く動きます。そのため差は 1.65 倍ほどに収まりました。専用 VRAM を持つ NVIDIA GPU の場合は GDDR の高帯域幅が効くため、特に大きいモデルでは差がさらに開きやすい傾向があります(今回の数値はあくまで M1 Max・0.5B モデルでの実測値です)。

VRAM が足りないときのスプリットモード

GPU の VRAM より大きいモデルを動かす場合、num_gpu で「一部だけ GPU、残りは CPU」というスプリットモードを使うと、完全 CPU 専用より速くなります。

たとえば VRAM が 8GB で、モデルが 13B(Q4_K_M で約 8.1GB)の場合:




ubuntu@linuxlab: ~
# Modelfile で一部レイヤーのみ GPU へ
$ cat Modelfile
FROM llama3:8b

PARAMETER num_gpu 28
PARAMETER num_ctx 4096
$ ollama create llama3-split -f Modelfile
success
$ ollama run llama3-split “hello”
$ ollama ps
NAME ID SIZE PROCESSOR CONTEXT
llama3-split … 5.2GB 70% GPU 4096

「70% GPU」のように表示される場合、モデルの 7 割のレイヤーが GPU で処理されています。VRAM 容量と目標速度のバランスを見ながら num_gpu を増減させて調整します。

レイヤー数の確認方法

モデルの総レイヤー数は ollama show --verbose で確認できます。以下は今回テストした qwen2.5:0.5b で実際に得られた出力です。




ubuntu@linuxlab: ~
$ ollama show –verbose qwen2.5:0.5b-instruct-q8_0
Model
architecture qwen2
parameters 494.03M
context length 32768
quantization Q8_0
Metadata
qwen2.block_count 24
qwen2.attention.head_count 14
qwen2.attention.head_count_kv 2

block_count の値(この例では 24)が総 Transformer レイヤー数です。num_gpu の最大値としてこの数字を使うと全レイヤーが GPU に入ります。大きな数(999 など)を指定しても問題なく、自動的に総レイヤー数で頭打ちになります。

よくある設定ミスと確認方法

①設定しても GPU が使われない

Modelfile に PARAMETER num_gpu 999 と書いたのに ollama ps で「100% CPU」と表示される場合、以下を確認してください。

  • ドライバが正しくインストールされているか(NVIDIA 環境): nvidia-smi で GPU が認識されているか確認
  • CUDA/ROCm のバージョン: Ollama が対応するバージョンかチェック(Ollama GPU ドキュメント参照)
  • Docker 環境の場合: --gpus all オプションが付いているか確認



ubuntu@linuxlab: ~
# NVIDIA GPU の認識確認
$ nvidia-smi –query-gpu=name,memory.total –format=csv,noheader
NVIDIA GeForce RTX 3090, 24576 MiB
# Docker で GPU を使う場合
$ docker run –gpus all -p 11434:11434 ollama/ollama

なお、コンテナ内でツールを揃えるときの参考に、ubuntu:24.04 公式イメージで curl のバージョンを確認したところ 8.5.0-2ubuntu10.9 でした(API 疎通テストに使えます)。

②num_gpu を変更したのに速度が変わらない

設定変更後は必ずモデルを一度アンロードしてから再ロードする必要があります。すでにメモリに乗っているモデルは古い設定のまま動き続けるためです。




ubuntu@linuxlab: ~
# モデルを明示的にアンロードする(keep_alive: 0)
$ curl http://localhost:11434/api/generate -d ‘{
“model”: “qwen2.5:0.5b-instruct-q8_0”,
“keep_alive”: 0
}’
# または Ollama を再起動
$ sudo systemctl restart ollama

③Apple Silicon(M1/M2/M3)での注意点

Apple Silicon Mac では CPU と GPU がユニファイドメモリを共有しているため、NVIDIA GPU とは挙動が異なります。num_gpu 0 にしても「CPU で計算する」という動作になり、今回の実測では GPU(Metal)モードの約 6 割の速度(131.8 tok/sec)まで落ちました。基本的にはデフォルト(全レイヤー GPU = Metal)のまま使うのがおすすめです。CPU モードはあくまで比較テストや、GPU が不安定なときの切り分け用と考えてください。

まとめ

Ollama の num_gpu(GPU レイヤー数)を調整するポイントをまとめます。

  • num_gpu はモデルの何レイヤーを GPU で動かすかを制御するパラメータ
  • GPU モードと CPU モードの速度差を実測したところ GPU が約 1.65 倍高速(217.1 vs 131.8 tok/sec / qwen2.5:0.5b-instruct-q8_0 / Apple M1 Max)
  • 設定方法は Modelfile(PARAMETER num_gpu N)・環境変数(OLLAMA_GPU_LAYERS=N)・API オプションの 3 種類
  • 現在の設定は ollama ps の PROCESSOR 列で確認できる
  • 総レイヤー数は ollama show --verboseblock_count で確認できる
  • VRAM が足りない場合は num_gpu を調整してスプリットモードで運用する
  • 設定変更後は必ずモデルを再ロードすること

VPS や自宅サーバーで Ollama を常時稼働させるなら、GPU 搭載サーバーへの移行も検討してみてください。

VPS で Ollama を動かすなら

GPU 付き VPS でローカル LLM を高速に動かしたい場合、Vultr・DigitalOcean などのクラウド GPU が選択肢になります。GPU サーバーレンタル比較記事も参考にしてください。

関連記事:Ollama を Ubuntu にインストールする方法 / Ollama Modelfile の使い方・カスタムモデル作成 / Ollama に必要な VRAM の目安

コメント

タイトルとURLをコピーしました