ローカルAI決定専用ツールSNAPの公開と性能評価
25秒でわかる内容解説
技術者emnlmnが2026年9月23日にGitHubへ公開したローカルAIツールSNAPは、非構造化データから1回の推論パスで構造付き決定を行う。テキストを生成せず確率分布を出力するため、JSONパースやリトライループが不要になる。Apple Silicon搭載PCでは最小でも136ミリ秒で質問に回答でき、既存のOllamaより57%高速化する。ローカル環境でLLMの判断処理を高速化したい開発者に適した設計だ。
1回のフォワードパスで構造化決定を出力する設計
SNAPはSingle-pass Neural Answer Probabilitiesの略称である。プロンプトの最初のトークンを文字AからZに固定し、その位置のロジットから確率分布を抽出する。テキスト生成をゼロにすることで、構造化された出力が常に得られる。入力状態と質問を共有する接頭辞として処理し、複数の質問をバッチ化できる。
出力形式はJev(既存の決定用API互換フォーマット)ワイヤーフォーマットと互換性がある。choiceやboolean、scoreといった型ごとに確率と信頼度を返す。26選択肢を超える場合は独立したyes noプローブに展開され、最大256まで対応する。
Typed decisions from unstructured state — one forward pass, zero generated text.
非構造化状態から1回のフォワードパスで決定を行い、テキスト生成を伴わない。
非構造化状態から1回のフォワードパスで決定を行い、テキスト生成を伴わない。
確率分布を直接出力するため、ダウンストリームのパーサーが不要になる。リトライループが不要な分、予測トークンの消費量が劇的に削減される。
状態を償却する仕組みを採用している。すべての質問が同じ状態接頭辞を共有するため、フルアテンションアーキテクチャではバッチ処理が実行される。KV(Key Value)キャッシュは起動時に予約され、8192トークンで約1GBのメモリを消費する。
コンテキスト長は8192トークンがデフォルトで、それを超える入力は422エラーで拒否される。内部ログのx_snapフィールドにはcached_head_tokensやrewind状態が記録される。prefillとtotalのミリ秒値も出力されるため、ボトルネックの特定が容易だ。
llama.cppのバンドルとApple Silicon最適化
SNAPはRustで実装されており、ビルド時にllama.cppをバンドルする。Apple Silicon環境ではMetal(Mac用GPUアクセラレーションAPI)がデフォルトのバックエンドとなる。それ以外のプラットフォームではCPUまたはCUDA、Vulkanを選択可能だ。
性能測定ではApple Silicon搭載Macが使用された。minicpm5-2b Q4_K_Mを用いた単一質問の推論は136ミリ秒で完了する。spark-4b Q8_0では272ミリ秒、qwen3.8-4b Q4_K_Mでは284ミリ秒だった。
8つの質問を別リクエストで処理する場合、SNAPは803ミリ秒を記録した。同じ条件でOllamaを動かすと1884ミリ秒かかり、57%の高速化を実現している。
| モデル | 単一質問 | 8質問(別リクエスト) |
|---|---|---|
| minicpm5-2b Q4_K_M | 136 ms | 803 ms |
| spark-4b Q8_0 | 272 ms | 1760 ms |
| qwen3.8-4b Q4_K_M | 284 ms | 1914 ms |
表では8192トークンの状態とMetalバックエンドでの測定結果を示す。
ハイブリッドKVアーキテクチャを持つqwen3.8は、バッチ処理が自動でシーケンシャルに切り替わる。ミニCPMとスパークはバッチ処理を維持する。
確率の較正にはsnap calibrateコマンドが用意されている。評価ケースを実行して各質問タイプの温度パラメータを1つずつフィットさせる。較正ファイルはモデルとプロンプトバージョンに紐付く。
データは機械内部に留まるため、APIキーやテレメトリーが不要だ。プロンプト注入で分布は揺らぐが、モデルがテキストを発しないためペイロードの漏洩は起きない。
精度と較正エラーの評価結果
評価スイートではqwen3.8-4b Q4_K_Mが最も高い精度を記録した。コアセットで90.4%、エッジセットで89.5%の正答率を示している。1ケースあたりの推論時間は約240ミリ秒だった。
spark-4b Q8_0はコアセットで88.5%、エッジセットで73.7%だった。minicpm5-2b Q4_K_Mはそれぞれ67.3%と57.9%にとどまった。
分布の品質はBrierスコアとECE(期待較正誤差。確率の信頼度と正解率の乖離を示す指標)で測定された。qwen3.8はコアでECEが0.120、エッジで0.081を記録した。sparkはコアで0.130、エッジで0.182だった。
スパークは正確だが過信しており、qwenは実際に過小評価されている。
較正を適用するとECEは改善されるが、評価データが本番トラフィックに類似している範囲でしか有効ではない。サンプルサイズが小さい場合、ECE改善の統計的有意性は不明である。
評価ハッチはparaphraseされた状態や質問フィールドのvariantsを送る。回答の一致率と平均確率ドリフトを算出し、選択肢の順序反転や無関係なコンテキストの注入もテストする。
3モデルともvariantsで100%一致し、平均ドリフトは0.03未満だった。サンプル数は2のみだが、安定性プローブの仕組みは動作している。
静的バイナリの配布とローカル推論の展開
SNAPは2026年9月23日にGitHubへ公開された。ビルドにはRustupとCMake、Clangが必要で、初回ビルドでllama.cppが約2分間コンパイルされる。
配布形式は静的バイナリが基本だ。NVIDIAユーザーはCUDAツールキット、AMDやIntelユーザーはVulkanドライバを用意すればGPUアクセラレーションが利用可能になる。
| バックエンド | 対応環境 | 必要なランタイム |
|---|---|---|
| Metal | Apple Silicon | デフォルトオン |
| CUDA | NVIDIA GPU | CUDA toolkit |
| Vulkan | AMD/Intel GPU | GPUドライバ |
表では主要なプラットフォームごとのバックエンド設定を示す。
コンテナやVM、Air-gappedボックスでもPython環境が不要で動作する。動的バックエンドフラグを有効にすると、CPUのAVX2やFMA命令に対応したモジュールをランタイムで読み込む。
今後の展開では、評価スイートをパスした新しいGGUF(llama.cpp標準の量子化モデルファイル)がモデルリストに追加されていく。2026年9月時点でテスト済みモデルはminicpm、spark、qwenの3種類だ。
HTTPサーバーは8018ポートで起動する。エンドポイントは/v1/systemoneで、Jev互換のワイヤーフォーマットを受け付ける。ヘルスチェックは/healthzで提供され、エンジンウォームアップ後に読み取り可能状態を返す。
内蔵のPlaygroundは/playgroundエンドポイントで起動する。ブラウザから直接リクエストを組立て、確率マップを確認できる。
2026年9月時点でテスト済みモデルは3種類だが、CIビルドを通過した新しいGGUFが順次リストに追加されていく。
用語の注釈
- GGUF
- llama.cppで標準的に使用されるモデルファイル形式で、量子化によりローカル環境でLLMを効率的に読み込み実行する。(参考:GGUF量子化ってなんだ?〜ローカルLLMを爆速で動かすための ...)
- Metal
- Apple Silicon搭載MacのGPUアクセラレーション用API。Instrumentsで利用状況のトレースが可能。(参考:Metalの概要 - Apple Developer)