
2026/07/15 6:06
同モデル、同 Q4_K_M ラベルの場合:重みのビット数はそれぞれ 5.02、5.07 および 5.27 です。
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
Picchio は、GPU が動作しているように Pretend しながら実際の計算は低速の CPU プロセッシングにフォールバックするといったサイレントな失敗(silent failures)を露見させることで、ローカルの Large Language Model (LLM) のパフォーマンスを正確に測定することを目的とした不可欠な Python 診断ツールです。その核心的な革新点は、メトリクスを prefill、decode、および wallclock ランに分けて分離することで、モデルが単一の固定された設定ではなく、Q4_K_M のようなモデルでは複雑なミックスド・プレシジョン数学計算を実際に利用していることを示す「有効ビット使用量 (effective bit usage)」の真実を明らかにすることにあります。エンジンログと NVML や
ioreg といった OS レベルのハードウェアメーターを照合することで、標準ベンチマークでは検出できない欺瞞的なアイドル状態を検出し、誤ったパフォーマンスボトルネックの帰属を防ぎます。診断、監視、ログ比較、および整合性検証のために特定のコマンドを提供し、自動化されたスクリッティングを支援する独自の退出コード(例:CPU のサイレントフォールバックは 4)を返します。Apple M5 から Linux RTX 4090 にわたるハードウェアでテストされており、Qwen3.5-9B のようなモデルにとって不可欠なベースラインを設定し、クアンタイザによって有効ビット数が 4 から 32 の間で変動する方法や、MoE モデルにおけるアクティブエクスパートを報告します。サイレントフォールバックが検出された場合、ユーザーは劇的なスローダウンに直面し、毎秒数千のトークンから毎秒約 3.0 トークンのみに低下する可能性があります。開発者とシステム管理者は、報告された GPU スループットが不安定な部分的オフロード失敗ではなく実際の計算作業を反映していることを確認するために Picchio を利用すべきです。本文
ローカル LLM の評価と分析ツール:picchio
概要
ローカル LLM の性能評価に特化した単一 Python スクリプトです。以下の機能を備えています。
- **有効なビット数(bit per weight)**の正確な計測
- 3 つのレーンごとのトス/秒(tok/s)測定
- サイレント CPU フォールバックの自動検出
GPU の速度に関する「1 つだけの tok/s」という主張は往々にして誤解を招く可能性があります。本ツールでは、以下の3 つの失敗モードをそれぞれ 1 コマンドで特定します。
- 量子化ラベルの不整合: 同じ
ラベルでも、有効ビット数はモデルや量子化器によって変動します(例:5.02, 5.07, 5.27)。Q4_K_M - GPU コストの喪失: プリフィル処理が 22 倍遅くなり、デコード処理も速度が 2 倍未満に落ちる場合を検出。
- サイレント CPU フォールバック:
で記録された高速な数値(例:36 tok/s)が、行列計算のいずれにも対応せず、GPU での処理が行われなかったことを検証。bare llama.cpp
「picchio」による解析プロセス
プリフィル処理、デコード処理、リアルタイム経過時間を分割して解析し、エンジンログと OS の GPU メーターを比較します。これにより**「GPU が実際に作業を行っているのか」そして「その理由は何なのか」**という判断結果(Verdict)を表示します。
インストール
手順
以下のコマンドを実行してください。
curl -fsSLO https://raw.githubusercontent.com/logxio/picchio/main/picchio.py python3 picchio.py
動作モード
引数を指定しない場合、ツールは自動的に利用可能なモデルを検出します(Ollama タグ、現在ディレクトリ、Hugging Face リポジトリキャッシュ、LM Studio キャッシュなど)。選択されたモデルを分析し実行します。
ファイルパスを指定した場合:.gguf
による完全な診断結果が表示されます。llama.cpp- Ollama のタグを指定した場合: 測定モードが有効になります。
システム要件
- Python 3
またはllama.cpp
のいずれかollama
初期処理
実行には固定されたプロンプトを用いた3 つのパスがかかります:
- コールドスタート: メモリキャッシュなし(初回パス)。
- GPU 活用時は約 1 分ほど。
- CPU でのみ実行の場合は時間がかかる場合があります。
キャッシュファイルは
~/.cache/picchio 配下にのみ作成され、それ以上のデータは一切生成しません。
Self-test
コミット済みの判断結果の再現性を検証するには以下を実行します。
python3 picchio.py --selftest
これは
examples/raw/ に生エンジンログを再生成し、すべての Verdict ブロック行を完全再現します。
コマンド一覧
| コマンド | 実装内容 | 特徴 |
|---|---|---|
| llama.cppによる完全診断:3 パス実行、レイヤー配置、コールドスタート分解、総合判断 | 詳細情報 |
| Ollama サーバー処理:メモリ分割に基づいたレイヤー配置の自動検出 | ローカル実行中 |
| llama-server測定:既存プロセスを監視、ウォーム状態のみ分析 | 起動不要 |
| コマンドラップ:レイヤーが GPU から外れる瞬間に警告(強制終了なし) | 安全チェック |
| 2 つのブロックの差分表示:設定差異の原因特定 | 比較分析 |
| ブロック内部の矛盾有無を検出 | 整合性チェック |
| OS GPU メーター監視:プロセス全体または GPU 全体にフォーカス(macOS 対応) | リアルタイム監視 |
| タイマー駆動プローブ:プリフィル/デコード比率の崩壊を検出 | サーバー監視 |
| コスト推定:gguf ヘッダーからモデル収容可否と推定コストを表示 | プランニング |
| 量子化ラベル分解: テンソルタイプ別の構成、有効ビット数、KV データ型、MoE 数 | 詳細分析 |
| 測定レーンとの照合:表示された数字の分類と解説(キャッシュ済み) | 解説 |
| コンテキスト深さによるレーン再測定:減衰傾斜率報告 | 応用 |
watch コマンド詳細
リアルタイム動作。何も起動せず、アンロードも行いません。
python3 picchio.py watch --engine ollama --for 8
オプション引数
: 測定パスの数(デフォルト 3。初回のみコールド)--passes N
: 生エンジン出力と NVIDIA Linux の GPU カーブを保存--keep-logs DIR
: OS GPU サンプリングをスキップ--no-telemetry
: 測定結果を JSON フォーマットで追加出力--json
: カスタム llama.cpp バイナリ指定--bin PATH
: レポジトリ内のテスト再現検証--selftest
: バージョンとプロトコル表示--version
注意: bare
以降の引数は直接 --
llama.cpp に渡されます。ターミナル上のみ色付き表示(NO_COLOR を尊重)、パイプ経由は ASCII プレーンテキストです。
Exit Codes
スクリプト全体のコード
- 0: 正常または証拠なし
- 2: 実行不可能
- 3: Partial なオフロード(一部のみ GPU)
- 4: サイレント CPU フォールバック
- 5: 矛盾する証拠
コマンド固有のコード
| コマンド | Exit Code | 意味 |
|---|---|---|
| 伝播 | ラップされたコマンド自身のコード(信号停止時は 128+) |
| 0 | 両方のブロックがパース成功 |
| 0 / 5 | 自己整合:0、矛盾:5 |
| 0 / 4 | GPU 作動:0、アイドル(フォールバック):4 |
| 0 / 4 | GPU 保持:0、フォールバック検出:4 |
詳細分析機能
量子化ラベル (picchio id
)
picchio idQ4_K_M や他のラベルは、実際の有効ビット数を保証するものではありません。
- 自己監査: ヘッダーのバイトオフセットと合計が一致するかを検証します。
- 例: 標準の
は 5.07 bits/weight を示しますが、他の Qwen3.5-9B 実装では 5.02 や 5.27 と変動します(すべて 427 テンソルを共有)。Q4_K_M - MoE 対応: トークンあたりの覚醒専門家数をレポートします。
- 動作:
パスまたは Ollama タグに対応。只読取りモードで exit 0 です。gguf
3 つのレーン (Three Lanes)
個別に失敗する可能性のある 3 つのパフォーマンス指標です。
- プリフィル (Prefill / PP): プロンプト読み取り速度(「最初のトークン出力までの時間」)。
- デコード (Decode / TG / Eval): 回答生成速度。
- ウォールクロック (Wallclock): ロード時間とウォームアップ時間を除いた総時間あたりのトークン数。
注意: Mac のスクリーンショットで「500 tok/s」が表示されても、これはほぼ確実にプリフィル処理の数値です。GPU コスト(デコード)とは異なります。
サイレント CPU フォールバック (Silent CPU Fallback)
同じマシン・モデル・ファイルであっても、以下の状況が起きます。
- bare llama.cpp: 36 tok/s など高数値を記録。
- アプリ経由: 11.5 tok/s に急落。
このギャップは、CPU と GPU をまたがる32 クラスタの行列計算のいずれセルにも「36」という数値が再現されないためです。これは生成速度ではなく、サイレントなフォールバック(GPU への無意識の遷移)を検出しています。
OS ライン (The os line)
測定パス実行中に背景スレッドで OS の GPU メーターを読み取ります。
- macOS:
(4Hz) と powermetrics エネルギーカウンターを使用(sudo 不要)。ioreg - NVIDIA Linux: NVML(ドライバ)を使用。
判断結果の分類
| 状態 | Exit Code | 説明 |
|---|---|---|
| CONFLICTING EVIDENCE | 5 | OS は GPU 使用と観測しているが、ツールは「完全オフロード」と主張している場合。 |
| SILENT CPU FALLBACK | 4 | ビナリ側から GPU の証拠が出ない一方、OS メーターはアイドル(IDLE)状態を監視している場合。実装ミスの兆候。 |
比較検証:llama-bench vs picchio
| ツール | 設定 | プロンプト側 (pp256) | 生成側 (tg64) | 備考 |
|---|---|---|---|---|
| llama-bench(デフォルト) | - | 597.06 | 20.21 | バックエンド:BLAS, MTL |
| llama-bench -ngl 0 (CPU) | - | 27.82 | 11.90 | CPU 強制実行(RTX 4090 でも CUDA キープ) |
結論: CUDA ビルドですら、
-ngl 0 の設定でさえも列挙的に CUDA を保持しようとしますが、実効的な「プロンプト側」の性能は 21 倍もの崩壊を遂げます。CPU 実行における唯一の可視痕跡であり、ロード時間の分割や判断結果には反映されません。
測定結果(Measured)
環境情報
- マシン: Apple M5 (32 GB), macOS 26.5.1, llama.cpp build 9430, ollama 0.31.1
- プロトコル: mp1(各ブロックフッターに命名)
- 負荷: プロンプト 730 トークン / 生成 128 トークン
- 記録: ウォーム時の中央値、
で生のエンジン出力保存--keep-logs
| マシン | モデル / エンジン | プロトコル | プリフィル (tok/s) | デコード (tok/s) | ウォールクロック (s) | 判断結果 |
|---|---|---|---|---|---|---|
| Apple M5, 32 GB | Qwen3.5-9B Q4_K_M, llama.cpp | mp1 | 588.0 | 21.1 | 15.5 | HEALTHY |
| Apple M5, 32 GB | 同、CPU 強制 (0/33 レイヤー) | mp1 | 26.8 | 12.2 | 3.0 | SILENT CPU FALLBACK |
| Apple M5, 32 GB | qwen3.5:9b, ollama | mp1 | 833.8 | 21.3 | 18.1 | HEALTHY |
| Apple M5, 32 GB | Qwen3.6-35B-A3B UD-Q4, llama.cpp | mp1 | 787.3 | 34.4 | 19.1 | HEALTHY |
| RTX 4090, Linux | Qwen3.5-9B Q4_K_M, llama.cpp | mp1 | 6763.3 | 138.0 | 25.2 | HEALTHY |
アナリシス
- 誤診報告最優先: 正しい判断結果でなくても、「誤った判断(wrong verdict)」こそが本ツールの目的です。
- MoE の性能: アクティブな MoE(350M パラメータ)でも、高密度な 9B モデルよりも 1.6 倍速くデコードされます。
- ロード時間: 初回パスの遅延は重みの読み込みによるもの(例:20.6 GiB = 約 13 秒)であり、実際の推論速度ではないことに注意してください。
制限事項
- 環境: Apple Silicon (llama.cpp/ollama) と Linux RTX 4090 (CUDA) を対象。MLX, LM Studio など他のエンジンについては
でのみ部分情報の取得が可能ですが、レーン表からは得られません。watch - Ollama の制約: レイヤーごとの配置やスレッド構成は非公開。メモリ分割から推定されますが、不明瞭な場合があります。
- Server モード: リモート URL はネットワークラウンドトリップタイムを含みます。
- 数値ドリフト: ウォームな数値はセッション間で変動します(5〜8%)。「mp1」タグも変更される可能性があります。
- OS メーター: 全体 GPU (Linux index 0) をカウントするため、アイドル状態から開始した場合のみ判定対象となります。
ライセンス: MIT