テスト: Ollama がインテル CPU のパフォーマンスコアと効率コアをどのように利用しているか
インテルCPUにおけるOllamaの効率的なコアとパフォーマンスコアの比較
私はある仮説をテストしたいと思っています。すなわち、「インテルCPUのすべてのコアを活用することで、LLMの速度が向上するか?」というものです。このテストについては、ALL cores on Intel CPU would raise the speed of LLMs?をご覧ください。
新しいgemma3 27bitモデル(gemma3:27b、ollama上では17GB)が私のGPUの16GB VRAMに収まらず、部分的にCPU上での実行に頼っているという点が気になります。
通過量、遅延、VRAM、およびランタイムとハードウェアにわたるベンチマークについてさらに詳しく知りたい場合は、LLM Performance: Benchmarks, Bottlenecks & Optimizationをご覧ください。
正確には、以下のように実行しています:
ollama ps
出力結果は以下の通りです:
gemma3:27b a418f5838eaf 22 GB 29%/71% CPU/GPU
見た目上はそれほど悪く見えませんが、レイヤーが分割されているように見えます。実際の負荷は以下の通りです:GPU:28%、CPU:560%。はい、複数のコアが使用されています。

ここで、あるアイデアがあります:
もしollamaをすべてのインテルCPUコア(パフォーマンスコアと効率コアの両方)に使用させることが可能であればどうなるでしょうか?
OLLAMA_NUM_THREADS設定パラメータ
ollamaには、環境変数の設定パラメータ OLLAMA_NUM_THREADS があり、ollamaにどのくらいのスレッドとコアを使用するかを指定するためのものです。
まず、3つのコアに制限して試してみました:
sudo xed /etc/systemd/system/ollama.service
# OLLAMA_NUM_THREADS=3を以下のように設定します
# Environment="OLLAMA_NUM_THREADS=3"
sudo systemctl daemon-reload
sudo systemctl restart ollama
しかし、これではうまく機能しませんでした。
Gemma 3 27B LLMを実行している際、ollamaはCPU使用率が約560%を維持していました。
不運ですね。
num_thread呼び出しオプション
次に、num_threadオプションを使用して試してみましょう:
curl http://localhost:11434/api/generate -d '
{
"model": "gemma3:27b",
"prompt": "Why is the blue sky blue?",
"stream": false,
"options":{
"num_thread": 8
}
}' | jq .
結果:
- CPU使用率:585%
- GPU使用率:25%
- GPU電力:67w
- パフォーマンス評価:6.5トークン/秒
次に、コア数を倍にし、パフォーマンスコアと効率コアの両方を使用するようにollamaに指示してみましょう:
curl http://localhost:11434/api/generate -d '
{
"model": "gemma3:27b",
"prompt": "Why is the blue sky blue?",
"stream": false,
"options":{
"num_thread": 16
}
}' | jq .
結果:
- CPU使用率:1030%
- GPU使用率:26%
- GPU電力:70w
- パフォーマンス評価:7.4 t/s
良いですね!パフォーマンスが約14%向上しました!
では、さらに極端にしましょう。すべての物理コアを使用してみましょう:
curl http://localhost:11434/api/generate -d '
{
"model": "gemma3:27b",
"prompt": "Why is the blue sky blue?",
"stream": false,
"options":{
"num_thread": 20
}
}' | jq .
結果:
- CPU使用率:1250%
- GPU使用率:10-26%(不安定)
- GPU電力:67w
- パフォーマンス評価:6.9 t/s
では、パフォーマンスコア8個+効率コア4個の組み合わせを試してみましょう:
curl http://localhost:11434/api/generate -d '
{
"model": "gemma3:27b",
"prompt": "Why is the blue sky blue?",
"stream": false,
"options":{
"num_thread": 12
}
}' | jq .
結果:
- CPU使用率:801%
- GPU使用率:27%(不安定)
- GPU電力:70w
- パフォーマンス評価:7.1 t/s
ここに至るまでです。
比較のため、Gemma 3 14bモデルを使用してみましょう。Gemma 27bに比べてスマートではありませんが、GPU VRAMに適切に収まります。
curl http://localhost:11434/api/generate -d '
{
"model": "gemma3:12b-it-qat",
"prompt": "Why is the blue sky blue?",
"stream": false
}' | jq .
結果:
- CPU使用率:106%
- GPU使用率:94%(不安定)
- GPU電力:225w
- パフォーマンス評価:61.1 t/s
これこそがパフォーマンスの真髄です。 Gemma 3 27bはGemma 14bよりはるかにスマートですが、10倍ではなく、わずかに優れているだけです。
結論
LLMがGPU VRAMに収まらず、Ollamaによって一部のレイヤーがCPUにオフロードされている場合:
num_threadパラメータを指定することで、LLMのパフォーマンスを10〜14%向上させることができます。- オフロードによるパフォーマンスの低下は、この改善を補うほどではありません。
- より強力でVRAMが多めのGPUを入手することをおすすめします。RTX 3090はRTX 5080より優れていますが、私はどちらも持っていない…
さらに多くのベンチマーク、CPU/GPUの調整、およびパフォーマンスのガイドラインについては、LLM Performance: Benchmarks, Bottlenecks & Optimization ハブをご覧ください。