【Ollama】メモリ不足でモデルが起動しない

導入

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の増設が最も効果的な場合があります。

💡 この問題を根本的に解決するには

ローカル環境でGPUトラブルが頻発する場合、クラウドGPUサービスの利用も検討してみてください。環境構築の手間なく、すぐにAI開発を始められます。

  • RunPod — RTX 4090が$0.44/h〜、ワンクリックでJupyter環境が起動
  • Vast.ai — コミュニティGPUマーケットプレイス、最安値でGPUレンタル
この記事は役に立ちましたか?