はじめに
OpenHandsでローカルLLMのOllamaを使用する際に、パフォーマンスの問題に直面することがあります。本記事では、Ollamaのパフォーマンスチューニング方法と、特にOpenHandsとの統合における最適化について実践的な内容をまとめます。
環境別アプローチの選択
環境の特定方法
まず、自分の環境を正確に把握することが重要です。以下のコマンドで環境を確認してください:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| uname -a cat /etc/os-release
lspci | grep -E "(VGA|3D|Display)" ls -la /dev/dri/ /dev/dxg 2>/dev/null
[ -e /dev/dxg ] && echo "WSL2環境" || echo "ネイティブLinux環境"
nvidia-smi 2>/dev/null && echo "NVIDIA GPU利用可能" rocm-smi 2>/dev/null && echo "AMD GPU(ROCm)利用可能"
PLATFORMS=$(clinfo 2>/dev/null | grep "Number of platforms" | awk '{print $4}') if [ "$PLATFORMS" -gt 0 ] 2>/dev/null; then echo "OpenCL利用可能: $PLATFORMS プラットフォーム" else echo "OpenCL利用不可: プラットフォーム数 ${PLATFORMS:-0}" fi
|
推奨アプローチマトリックス
| 環境 |
GPU |
OpenCL |
推奨アプローチ |
期待パフォーマンス |
| WSL2 |
AMD統合GPU |
0プラットフォーム |
CPU専用設定 |
8-12 tokens/sec |
| WSL2 |
NVIDIA GPU |
>0プラットフォーム |
GPU使用(制限あり) |
15-25 tokens/sec |
| ネイティブLinux |
AMD専用GPU |
>0プラットフォーム |
ROCm + GPU設定 |
25-40 tokens/sec |
| ネイティブLinux |
NVIDIA GPU |
>0プラットフォーム |
CUDA + GPU設定 |
30-50 tokens/sec |
| どの環境でも |
GPU問題時 |
- |
CPU専用設定 |
5-15 tokens/sec |
基本的なパフォーマンスチューニング
共通環境変数
以下の環境変数はすべての環境で有効です(値は設定例):
1 2 3 4 5 6 7 8
| export OLLAMA_NUM_PARALLEL=2 export OLLAMA_MAX_LOADED_MODELS=1 export OLLAMA_MAX_QUEUE=4 export OLLAMA_KEEP_ALIVE=5m
export OLLAMA_HOST="0.0.0.0:11434"
|
CPU負荷の調整原理
重要:
OLLAMA_NUM_THREADSはOllamaが使用するCPUスレッド数を制御します。この設定により、システムリソースの使用量を調整できます:
| 設定値 |
期待される動作 |
推奨用途 |
$(nproc) |
全コア使用(最大負荷) |
ベンチマーク時のみ |
$(nproc) / 2 |
半数のコア使用 |
通常使用(推奨) |
$(nproc) / 3 |
約1/3のコア使用 |
バックグラウンド実行 |
8 (固定値) |
固定スレッド数 |
安定運用 |
実際のCPU使用率は、モデルサイズ、プロンプト長、他のプロセスの状況などに依存します。
パフォーマンス監視方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| nvidia-smi
rocm-smi
htop
ollama ps
watch -n 2 'ollama ps && echo "=== GPU ===" && nvidia-smi --query-gpu=utilization.gpu,memory.used,memory.total --format=csv'
|
環境別詳細設定
WSL2環境での設定
重要:
WSL2環境では、GPU種類に関わらずCPU専用設定が最も安定します。
設定例(CPU専用)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| export OLLAMA_GPU_LAYERS=0 export OLLAMA_NUM_THREADS=$(($(nproc) / 2)) export OLLAMA_MAX_LOADED_MODELS=1 export OLLAMA_NUM_PARALLEL=1 export OLLAMA_HOST="0.0.0.0:11434"
ollama pull llama3.2:1b ollama pull phi3:mini ollama pull qwen2.5:7b
|
systemdでOllamaを管理する場合(WSL2)
WSL2でもsystemdを有効化している場合は、以下の方法で設定できます:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| systemctl status ollama
sudo mkdir -p /etc/systemd/system/ollama.service.d
CORE_COUNT=$(($(nproc) / 2)) echo "CPU設定: $(nproc) コア中 ${CORE_COUNT} コアを使用"
sudo tee /etc/systemd/system/ollama.service.d/wsl2-override.conf <<EOF [Service] Environment="OLLAMA_HOST=0.0.0.0:11434" Environment="OLLAMA_GPU_LAYERS=0" Environment="OLLAMA_NUM_THREADS=${CORE_COUNT}" Environment="OLLAMA_MAX_LOADED_MODELS=1" Environment="OLLAMA_NUM_PARALLEL=1" Environment="OLLAMA_KEEP_ALIVE=5m" EOF
sudo systemctl daemon-reload
sudo systemctl restart ollama
sudo systemctl show ollama | grep Environment
|
注意:
WSL2でsystemdを使用している場合、Ollamaは自動起動するため、手動でのollama serveは不要です。
WSL2の制限事項
- 仮想化による10-13%のパフォーマンス低下(ベンチマークより)
- ネットワーク設定の複雑さ(Issue
#1431)
- OpenCLプラットフォーム制限:
通常0個のため、GPU加速困難
- Mesa D3D12の限界:
OpenGL描画は可能だが、OllamaのCUDA/ROCm加速には対応不可
ネイティブLinux + NVIDIA GPU
設定例
1 2 3 4 5 6 7
| export CUDA_VISIBLE_DEVICES=0 export OLLAMA_GPU_LAYERS=32 export OLLAMA_NUM_PARALLEL=4 export OLLAMA_MAX_LOADED_MODELS=2 export OLLAMA_FLASH_ATTENTION=1 export OLLAMA_GPU_MEMORY_FRACTION=0.8
|
systemd設定
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| sudo mkdir -p /etc/systemd/system/ollama.service.d
CORE_COUNT=$(nproc)
sudo tee /etc/systemd/system/ollama.service.d/nvidia.conf <<EOF [Service] Environment="CUDA_VISIBLE_DEVICES=0" Environment="OLLAMA_GPU_LAYERS=32" Environment="OLLAMA_NUM_PARALLEL=4" Environment="OLLAMA_FLASH_ATTENTION=1" Environment="OLLAMA_HOST=0.0.0.0:11434" EOF
sudo systemctl daemon-reload sudo systemctl restart ollama
|
ネイティブLinux + AMD GPU
前提条件
1 2 3 4 5 6 7
| rocminfo 2>/dev/null || echo "ROCm未インストール"
sudo usermod -a -G render,video $USER
groups $USER | grep -E "(render|video)"
|
推奨設定
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| export ROCM_PATH=/opt/rocm export HIP_PATH=/opt/rocm export LD_LIBRARY_PATH=/opt/rocm/lib:$LD_LIBRARY_PATH
export HSA_OVERRIDE_GFX_VERSION=10.3.0
export OLLAMA_GPU_LAYERS=35 export OLLAMA_NUM_PARALLEL=2 export OLLAMA_MAX_LOADED_MODELS=1 export GPU_MAX_ALLOC_PERCENT=80 export ROCR_VISIBLE_DEVICES=0
|
systemd設定
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| CORE_COUNT=$(($(nproc) * 3 / 4))
sudo tee /etc/systemd/system/ollama.service.d/amd.conf <<EOF [Service] Environment="ROCM_PATH=/opt/rocm" Environment="HSA_OVERRIDE_GFX_VERSION=10.3.0" Environment="OLLAMA_GPU_LAYERS=35" Environment="OLLAMA_NUM_PARALLEL=2" Environment="GPU_MAX_ALLOC_PERCENT=80" Environment="OLLAMA_HOST=0.0.0.0:11434" EOF
sudo systemctl daemon-reload sudo systemctl restart ollama
|
OpenHandsとの統合
Docker環境での設定
基本的なDocker設定
1 2 3 4 5 6 7
| docker run -d \ --name openhands \ -e OLLAMA_BASE_URL="http://host.docker.internal:11434" \ -e OLLAMA_API_KEY="" \ -p 3000:3000 \ all-hands-ai/openhands
|
WSL2特有の接続設定
1 2 3 4 5 6 7 8 9
| ip addr show eth0 | grep inet
export WSL2_IP=$(ip addr show eth0 | grep -Po 'inet \K[\d.]+') docker run -d \ --name openhands \ -e OLLAMA_BASE_URL="http://${WSL2_IP}:11434" \ all-hands-ai/openhands
|
一般的な問題と解決策
1. 接続エラー
症状: OpenHandsがOllamaに接続できない
解決方法: 1 2 3 4 5 6 7
| systemctl status ollama curl http://localhost:11434/api/version
sudo ufw status sudo ufw allow 11434
|
2. APIエンドポイントエラー
症状: 404エラーや不正なエンドポイント
解決方法: 1 2 3
| OLLAMA_BASE_URL="http://localhost:11434" OLLAMA_API_KEY=""
|
3. パフォーマンス問題
症状: レスポンスが非常に遅い
解決方法: 1 2 3 4 5 6 7
| export OLLAMA_DEBUG=1 export OLLAMA_FLASH_ATTENTION=1
ollama pull llama3.2:1b ollama run llama3.2:1b "Hello, test"
|
トラブルシューティング
よくある問題
ポート使用中エラー
1 2 3 4 5 6 7
| Error: listen tcp 127.0.0.1:11434: bind: address already in use
systemctl status ollama sudo systemctl stop ollama
|
GPU認識されない
1 2 3 4 5 6 7 8 9 10 11 12
| lspci | grep -i amd ls -la /dev/dri/ rocminfo 2>/dev/null
lspci | grep -i nvidia nvidia-smi
export OLLAMA_GPU_LAYERS=0 export OLLAMA_NUM_THREADS=$(nproc)
|
メモリ不足
1 2 3 4 5 6 7 8 9
|
export OLLAMA_GPU_LAYERS=10 export GPU_MAX_ALLOC_PERCENT=70
ollama pull llama2:7b ollama pull gemma:2b
|
環境診断スクリプト
プロジェクトに含まれる診断スクリプトを使用してください:
1 2 3 4 5 6 7 8 9
| ./scripts/environment_info.sh > my_environment.txt
- OS・カーネル情報 - GPU認識状況 - ドライバー状態 - OpenCL/ROCm状況 - Ollama設定
|
実践例
WSL2 + AMD Radeon
890M環境(検証済み)
環境詳細: - OS: Ubuntu 22.04.5 LTS (WSL2) - CPU:
24コア (AMD Ryzen 9 7940HS相当) - RAM: 29GB - GPU: AMD Radeon 890M
Graphics (統合GPU) - OpenCL: 0プラットフォーム(GPU加速不可) - OpenGL:
Mesa D3D12対応(描画のみ、計算処理不可)
実際の設定: 1 2 3 4 5 6
| export OLLAMA_GPU_LAYERS=0 export OLLAMA_NUM_THREADS=12 export OLLAMA_MAX_LOADED_MODELS=1 export OLLAMA_NUM_PARALLEL=1 export OLLAMA_HOST="0.0.0.0:11434"
|
パフォーマンスの目安:
各モデルの処理速度は環境により大きく異なりますが、一般的な傾向として: -
軽量モデル(1B-3B): より高速な処理が期待できる - 中規模モデル(7B-8B):
バランスの取れた性能 - 大規模モデル(13B以上):
より多くのリソースと時間が必要
※具体的なトークン/秒の値は、CPU性能、メモリ帯域、システム負荷、モデルの量子化レベルなど多くの要因に依存するため、実際に計測することをお勧めします。
まとめ
環境別推奨設定まとめ
- WSL2環境: GPU種類に関わらずCPU専用設定が最安定
- ネイティブLinux + NVIDIA:
GPU最大活用でCUDA設定
- ネイティブLinux + AMD: ROCm必須、世代指定重要
実践的なアプローチ
- 環境確認: 診断スクリプトで現状把握
- 保守的設定: 軽量モデル + CPU専用から開始
- 段階的最適化: 安定性確認後にGPU設定追加
- パフォーマンステスト: 実際の使用パターンで検証
適切な設定により、OpenHandsとOllamaの組み合わせで効率的なAI開発環境を構築できます。環境に応じて段階的に最適化を進めることをお勧めします。
参考