Ollama の blobs をモデルに対応づけて整理し、不要モデルを削除して容量を回復する

IT

Ollama は ~/.ollama/models 配下に manifests(モデルの定義)と blobs(実体の重みファイル。sha256-…名)を保存します。複数モデルが同じ blob を共有することがあるため、ollama rm でモデルを消しても blob が残る場合があります。本記事は、「この blob はどのモデル由来か?」を一覧化し、未参照の blob を安全に削除する手順をまとめたものです。

TL;DR

  1. ollama list でモデル一覧 → ollama show --modelfile <name>FROM 行にある sha256-… が使う blob。
  2. manifests から参照される sha256-… を全部集める → blobs にある全ファイルとの差集合が「孤立 blob」。
  3. ollama rm で不要モデルを削除 → 最後に「孤立 blob」を削除して容量回復。

0) どこに保存されている?

  • macOS / Linux (ユーザー実行): ~/.ollama/models
  • Linux (パッケージ/サービス実行): /usr/share/ollama/.ollama/models または /var/lib/ollama/.ollama/modelsollama ユーザー所有)

環境やインストール方法によりパスは異なりますが、基本は ~/.ollama/models 配下に manifestsblobs が存在します。


1) まずは現状把握:モデル一覧とサイズ

# モデル一覧(人間向け表示) 
ollama list

# JSON で出力できる場合(Ollama が対応していれば)
ollama list -f json

# REST API でも取得可能(localhost)
curl -s http://127.0.0.1:11434/api/tags | jq .

/api/tagsname, modified_at, size, digest などを返します。


2) 「モデル ⇄ blob(sha256)」の対応関係を自動で作る

次のシェルスクリプトは、インストール済みモデルを走査し、各モデルが参照する sha256-… を抽出して出力します(macOS/Linux)。
抽出は ollama show --modelfile <name>FROM .../blobs/sha256-… を利用。 


echo "=== LARGE BLOB FILES (2GB+) TO MODEL MAPPING ===" && echo "" && ls -lh ~/.ollama/models/blobs/sha256-* | awk '$5 ~ /[0-9]+(\.[0-9]+)?G/ && ($5+0) >= 2 {print $5, $9}' | while read size file; do echo "File: $(basename $file)"; echo "Size: $size"; blob_hash=$(basename $file | sed 's/sha256-//'); for manifest in $(find ~/.ollama/models/manifests -type f); do if grep -q "$blob_hash" "$manifest" 2>/dev/null; then model_name=$(echo $manifest | sed 's|.*/library/||' | tr '/' ':'); echo "Model: $model_name"; fi; done; echo ""; done

出力例



=== LARGE BLOB FILES (2GB+) TO MODEL MAPPING ===

File: sha256-163553aea1b1de62de7c5eb2ef5afb756b4b3133308d9ae7e42e951d8d696ef5
Size: 2.4G
Model: qwen3:4b

File: sha256-59c55d0e7b6a16d103f324fe4d2cc83843936e1ac65e93b632b6dc577d732630
Size: 4.6G
Model: granite3.2:latest

File: sha256-8934d96d3f08982e95922b2b7a2c626a1fe873d7c3b06e8e56d7bc0a1fef9246
Size: 3.6G
Model: llama2:latest

File: sha256-a3de86cd1c132c822487ededd47a324c50491393e6565cd14bafa40d0b8e686f
Size: 4.9G
Model: qwen3:8b

File: sha256-b112e727c6f18875636c56a779790a590d705aec9e1c0eb5a97d51fc2a778583
Size: 13G
Model: gpt-oss:20b

...

3) 未参照(孤立)blob を検出する

manifests 配下の全ファイルから sha256-… を収集し、blobs 配下の実ファイル名との差集合を「孤立 blob」とみなします。


echo "=== OLLAMA ORPHANED BLOB DETECTION ===" && echo "" && echo "Step 1: Collecting all blob files..." && ls ~/.ollama/models/blobs/ | grep "sha256-" > /tmp/all_blobs.txt && echo "Total blob files: $(cat /tmp/all_blobs.txt | wc -l)" && echo "" && echo "Step 2: Extracting referenced blobs from manifests..." && find ~/.ollama/models/manifests -type f -exec cat {} \; | grep -o 'sha256:[a-f0-9]\{64\}' | sed 's/sha256:/sha256-/' | sort -u > /tmp/referenced_blobs.txt && echo "Referenced blobs: $(cat /tmp/referenced_blobs.txt | wc -l)" && echo "" && echo "Step 3: Finding orphaned blobs..." && orphaned=$(comm -23 <(sort /tmp/all_blobs.txt) <(sort /tmp/referenced_blobs.txt)) && if [ -n "$orphaned" ]; then echo "ORPHANED BLOBS FOUND:" && echo "$orphaned" | while read blob; do if [ -n "$blob" ]; then size=$(ls -lh ~/.ollama/models/blobs/$blob 2>/dev/null | awk '{print $5}'); echo "  $blob ($size)"; fi; done && echo "" && echo "Total orphaned: $(echo "$orphaned" | grep -v '^$' | wc -l)"; else echo "✅ No orphaned blobs found!"; fi

 

出力例



=== OLLAMA ORPHANED BLOB DETECTION ===

Step 1: Collecting all blob files...
Total blob files:       42

Step 2: Extracting referenced blobs from manifests...
Referenced blobs:       42

Step 3: Finding orphaned blobs...
✅ No orphaned blobs found!

「層(layer)」共有の仕組み上、他モデルが参照していない blob のみ削除します。


4) 削除:不要モデル → 孤立 blob の順で

4.1 不要モデルを削除

# モデル単位で削除 ollama rm <model[:tag]>

# 例:
% ollama rm qwen3:4b
deleted 'qwen3:4b'

# REST API でも可.  curl -s -X DELETE http://127.0.0.1:11434/api/delete -d '{"name":""}'

# 例:
$curl -s -X DELETE http://127.0.0.1:11434/api/delete -d "{\"name\":\"gpt-oss:20b\"}"

ollama rm はモデル参照を削除します。共有 blob は残る場合があるため、「孤立 blob」削除が有効です。 


5) さらに容量を節約したい場合

  • 使わないランタイムや大容量モデルを定期的に削除ollama list のサイズ欄や /api/tagssize を目安に)
  • 保存先の移動:環境変数 OLLAMA_MODELS の設定やシンボリックリンクで外部ストレージへ移動(セットアップ方法は各環境ガイド参照)。

よくある質問

Q. ollama rm だけで容量が減らないことがあるのはなぜ?

Ollama は Docker のレイヤーのように blob を共有するため、他モデルが参照している blob は残ります。最後に「孤立 blob」の掃除が必要です。


最終更新: 2025-10-01(JST)

コメント

タイトルとURLをコピーしました