· ローカルAI

ローカル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_M136 ms803 ms
spark-4b Q8_0272 ms1760 ms
qwen3.8-4b Q4_K_M284 ms1914 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アクセラレーションが利用可能になる。

バックエンド対応環境必要なランタイム
MetalApple Siliconデフォルトオン
CUDANVIDIA GPUCUDA toolkit
VulkanAMD/Intel GPUGPUドライバ

表では主要なプラットフォームごとのバックエンド設定を示す。

コンテナや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)

出典