はじめに
Ollamaでモデルを一度でも走らせると、そのモデルは一定時間GPUメモリ(VRAM)に載ったままになる。動画編集やゲームなど、GPUを他の用途に使いたいときに「いつ解放されるのか」「すぐ解放するにはどうするのか」が気になったので、keep_alive の挙動を実測で確かめた。
環境
- Windows 11(ビルド 10.0.26200)
- Ollama 0.40.4(公式アプリ。既定の
http://127.0.0.1:11434) - モデル:
qwen2.5:0.5b(検証用。ロード後のメモリサイズはollama ps上936MB)
やったこと
1. まずは既定の挙動を確認
小さなリクエストを1回投げてから、ロード状態を確認する。
$body = @{ model = "qwen2.5:0.5b"; prompt = "ok"; stream = $false; options = @{ num_predict = 3 } } |
ConvertTo-Json -Depth 5
Invoke-RestMethod -Uri http://127.0.0.1:11434/api/generate -Method Post `
-Body $body -ContentType "application/json; charset=utf-8" | Out-Null
ollama ps
実行結果:
NAME ID SIZE PROCESSOR CONTEXT RUNNER UNTIL
qwen2.5:0.5b a8b0c5157701 936 MB 100% GPU 32768 llamacpp 4 minutes from now
UNTIL が「4 minutes from now」。つまり既定では、最後のリクエストから5分間VRAMに残る(表示は残り時間なので4分台に見える。サーバーの起動設定ログにも OLLAMA_KEEP_ALIVE:5m0s と出力される)。
2. keep_alive で保持時間を延ばす
リクエストのJSONに keep_alive を足すと、保持時間を指定できる。
$body = @{ model = "qwen2.5:0.5b"; prompt = "ok"; stream = $false; keep_alive = "30m"; options = @{ num_predict = 3 } } |
ConvertTo-Json -Depth 5
Invoke-RestMethod -Uri http://127.0.0.1:11434/api/generate -Method Post `
-Body $body -ContentType "application/json; charset=utf-8" | Out-Null
ollama ps
実行結果:
NAME ID SIZE PROCESSOR CONTEXT RUNNER UNTIL
qwen2.5:0.5b a8b0c5157701 936 MB 100% GPU 32768 llamacpp 29 minutes from now
UNTIL が30分後に変わった。何度も呼ぶワークロードで毎回ロードし直すのを防ぎたいときに有効だ。
3. keep_alive = "0" で即時解放
逆に「このリクエストの後はすぐ解放してほしい」場合は "0" を指定する。
$body = @{ model = "qwen2.5:0.5b"; prompt = "ok"; stream = $false; keep_alive = "0"; options = @{ num_predict = 3 } } |
ConvertTo-Json -Depth 5
Invoke-RestMethod -Uri http://127.0.0.1:11434/api/generate -Method Post `
-Body $body -ContentType "application/json; charset=utf-8" | Out-Null
Start-Sleep -Seconds 2
ollama ps
実行結果:
NAME ID SIZE PROCESSOR CONTEXT RUNNER UNTIL
(ヘッダのみ=ロード中のモデルなし)。リクエスト完了から2秒後にはVRAMから解放されていた。
ハマった点
-
ollama psを忘れると状況が分からない。タスクマネージャでGPUメモリの使用量が高止まりしていても、原因がOllamaだと気づきにくい。まずollama psを見るのが早い。 -
UNTILは「残り時間」表示。既定5分設定でも「4 minutes from now」と表示されるので、一瞬「4分設定?」と混乱した。 -
解放はリクエスト完了直後ではなくわずかに遅れる。
keep_alive = "0"を指定しても、ps が空になるまで1〜2秒かかった(実測では2秒待って空を確認)。
まとめ
- 既定では、最後のリクエストから5分間モデルがVRAMに残る(
ollama psで確認可能)。 -
keep_alive = "30m"のように指定すると保持時間を延ばせる。 -
keep_alive = "0"を付けたリクエストを投げれば、バッチ処理の最後に明示的にVRAMを解放できる。 - GPUを他の作業に譲りたいときは「使い終わりに
keep_alive: "0"を1回投げる」を習慣にするとよい。
関連する本
VRAM管理を含む自動運用の全体を一冊にまとめました。第1章・第2章は無料で読めます。