観測された事象と影響範囲
ハイエンドなデュアルソケットCPUと強力なGPUを搭載したWindowsサーバー。
満を持してOllamaを動かしたはずが、なぜか推論速度が全く上がらない。
タスクマネージャーを開いて、あなたは愕然とするでしょう。
片方のCPUソケットだけが使用率100%に張り付き、もう片方は完全に沈黙している姿に。
GPUに至っては、わずか13%しか使われていない。
期待を大きく裏切るパフォーマンス。
秒間数トークンという絶望的な速度では、開発も検証も進みません。
これは単なる設定ミスではありません。
OllamaがWindowsのマルチCPUアーキテクチャを正しく扱えないことに起因する、根深い構造的問題です。
このままでは、あなたの高価なハードウェア投資は、完全に無駄になってしまいます。
対象のイシュー詳細
【バグ/性能】Windowsデュアルソケットサーバー環境における高CPU・低GPU使用率の問題
Original: [Bug/Performance] High CPU and low GPU utilization on Windows with dual-socket server
WindowsのデュアルCPU環境でOllamaがリソースを偏って利用し、GPU性能を全く引き出せないバグ。
観測されたエラー構造
level=INFO source=cpu.go:88 msg="CPU has 2 sockets, but binding to a single socket for this process"
level=WARN source=gpu.go:123 msg="only 13% of GPU memory is allocated, performance may be degraded"
level=INFO source=server.go:345 msg="Starting inference with suboptimal resource allocation on Windows"
level=ERROR source=runner.go:110 msg="inference process failed: resource starvation on CPU socket 1"
原因の技術的深掘り
この致命的なパフォーマンス劣化の根本原因は、OllamaのランタイムがWindowsのマルチソケットアーキテクチャ、特にNUMA (Non-Uniform Memory Access) 構成を適切にハンドリングできていない可能性が極めて高いです。
デュアルソケットシステムでは、各CPUが自身のローカルメモリを持ちます。
あるCPUがもう一方のCPUのメモリにアクセスする場合、レイテンシが大きくなるのがNUMAの特性です。
OllamaのプロセスがNUMAを意識せずに起動すると、OSのスケジューラはプロセスを単一のNUMAノード(1つのCPUソケットとそのローカルメモリ)に固定しようと試みます。
結果として、プロセス全体が片方のCPUに縛り付けられ、もう片方のCPUと、そちらに接続されているPCIeレーン上のGPUが遊休状態に陥るのです。
CPUからGPUへのデータ転送パイプラインも、このCPUの偏りによって深刻なボトルネックとなります。
片方のCPUが100%に張り付くことで、GPUに効率的にデータを供給できず、GPU使用率が低迷する。
まさに、アーキテクチャのミスマッチが引き起こした性能の悲劇と言えるでしょう。
技術検証と解決策(ワークアラウンド)
タスクマネージャーから手動でCPUアフィニティを設定したり、WSL2上のLinuxでOllamaを動かすことで、この問題は一時的に緩和できるかもしれません。
しかし、それは対症療法に過ぎません。
LLMのようなリソース集約的なワークロードを安定して本番稼働させるには、小手先の調整ではなく、OSレベルのチューニングから始まる一貫したインフラ設計が不可欠です。
ハードウェアの物理構成、ハイパーバイザーの選定、コンテナランタイムの最適化、そしてネットワーク構成。
これら全てが噛み合って初めて、モデルのポテンシャルを100%引き出すことができるのです。
個別のバグを追いかける日々から、本来注力すべきアプリケーション開発にシフトしませんか。
そのために必要なのは、あなたが悩む必要のない、最適化済みのサーバー基盤です。
インフラの構築と運用をプロに任せ、最高のパフォーマンスの上でサービスを公開することこそ、最も確実でスピーディな解決策なのです。
# WSL2環境でDockerを使い、GPUリソースを明確に指定して実行する
$ docker run -d --gpus=all -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama
version: '3.8'
services:
ollama:
image: ollama/ollama
container_name: ollama_optimized
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all
capabilities: [gpu]
volumes:
- ollama_data:/root/.ollama
ports:
- "11434:11434"
restart: unless-stopped
volumes:
ollama_data: