導入
Ollamaを使用して大規模言語モデル(LLM)を実行しようとした際、「メモリ不足」のエラーが発生し、モデルの起動に失敗することはありませんか?この問題は、特にパラメータ数の多いモデル(例:Llama 2 70B, Mixtral 8x7Bなど)を実行する際や、システムリソースが限られた環境で頻繁に発生します。エラーメッセージは「failed to load model: insufficient memory」や単にプロセスがクラッシュするなど、様々な形で現れます。
本記事では、Ollamaでモデル起動時に発生するメモリ不足エラーの根本的な原因を解説し、実践的な解決方法を段階的に紹介します。システム設定の調整からモデル選択の見直しまで、すぐに試せる複数のアプローチを提供します。
原因の説明
このエラーが発生する主な技術的原因は、モデルのパラメータをRAM(またはVRAM)にロードするために必要な物理メモリ容量が、システムの空きメモリを上回っていることです。例えば、量子化されていないLlama 2 70Bモデルは、単精度浮動小数点(FP32)形式で約280GBのメモリを要求します。量子化(4-bitや8-bit)によりこの要求は大幅に削減されますが、それでも数GBから数十GBのメモリが必要です。
Ollamaはデフォルトで、利用可能なシステムメモリを最大限使用しようとしますが、他のアプリケーションがメモリを消費している場合や、スワップ領域が不十分な場合、モデルのロードプロセスが失敗します。根本的には、モデルのメモリ要求、システムの空きメモリ、スワップ設定の3つのバランスが崩れている状態です。
解決方法
以下の解決方法を、最も一般的なものから順に試していくことをお勧めします。
方法1: より軽量なモデルまたは量子化バージョンを選択する
最も直接的な解決策は、メモリ要求の少ないモデルを使用することです。Ollamaでは、同じモデルファミリーでもパラメータ数が少ないもの(例:7B vs 70B)や、量子化レベルが高いもの(例:q4_0, q8_0)が利用できます。
手順1: 利用可能なモデルを確認
ollama list
手順2: より軽量なモデルをプルして実行
# 例1: 70Bモデルから7Bモデルに変更
ollama run llama2:7b
# 例2: 量子化レベルが高いバージョンを指定(よりメモリ効率が良い)
ollama run llama2:13b-q4_0
# 例3: 専用に最適化された小型モデルを試す
ollama run mistral:7b-instruct-q4_0
手順3: モデルを削除してディスク容量を解放(オプション)
# 不要な巨大モデルを削除
ollama rm llama2:70b
方法2: システムのスワップ領域を増やす
物理RAMが不足している場合、スワップ領域(ディスク上の仮想メモリ)を拡張することで、モデルロードを補助できます。特にLinuxシステムで有効です。
手順1: 現在のスワップ状況を確認
sudo swapon --show
free -h
手順2: スワップファイルを追加(例:8GB追加)
# スワップファイルを作成
sudo fallocate -l 8G /swapfile
# パーミッションを設定
sudo chmod 600 /swapfile
# スワップ領域として設定
sudo mkswap /swapfile
sudo swapon /swapfile
# 永続化のためfstabに追加(再起動後も有効)
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
手順3: スワップの積極性を調整(オプション)
# スワップの積極性を上げる(0〜100、値が高いほど積極的)
# 一時的な変更
sudo sysctl vm.swappiness=80
# 永続的な変更
echo 'vm.swappiness=80' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
方法3: Ollamaの実行パラメータと環境変数を調整する
Ollamaには、メモリ使用量を制御するための環境変数や、より高度な設定オプションが存在します。
手順1: GPUオフロードを無効化(CPUモードで実行)
GPUメモリが不足している場合、CPUのみで実行するよう強制できます。
# 環境変数でGPUを無効化して実行
OLLAMA_HOST=127.0.0.1 OLLAMA_NUM_GPU=0 ollama run llama2:7b
手順2: モデルロード時のスレッド数を制限
# 使用するCPUスレッド数を制限(過度なメモリ使用を防ぐ)
OLLAMA_NUM_THREADS=4 ollama run llama2:13b
手順3: コンテキスト長を短縮する
モデルのコンテキストウィンドウ(一度に処理できるトークン数)を短くすると、必要なメモリが減少します。
# モデルをModelfileでカスタマイズして作成
cat > Modelfile << EOF
FROM llama2:13b
PARAMETER num_ctx 2048 # デフォルトより短いコンテキスト長を指定
EOF
ollama create my-llama -f Modelfile
ollama run my-llama
手順4: 起動オプションでメモリ使用量を監視・制限
# 別のターミナルでシステムリソースを監視
htop
# またはメモリ使用量を確認
watch -n 1 free -h
まとめ
Ollamaでのメモリ不足エラーは、1) 軽量な量子化モデルの選択、2) システムスワップ領域の拡張、3) 実行パラメータの調整という3つの主要なアプローチで解決を目指せます。まずはollama run llama2:7bのような小さなモデルで動作確認し、徐々にリソースを増やしながら問題を特定するのが効率的です。
追加のTips:
- 常に最新版のOllamaを使用してください。メモリ最適化は活発に開発が進んでいる分野です。
ollama psコマンドで、バックグラウンドで動作しているモデルプロセスを確認・停止できます。- Dockerコンテナ経由で実行している場合、コンテナのメモリ制限(
-mオプション)が原因である可能性もあります。 - 根本的な解決のためには、物理RAMの増設が最も効果的な場合があります。