AI Product / PoC
ゆめうらない — AI夢診断
「小型モデル×CPU推論でLLMサービスをどこまで安く・速く動かせるか」の検証機。教師モデル(Gemma 31B)から蒸留・DPOした1.2BのSLMを、自作Rust製CPU推論エンジンでAWS Lambdaにサービング。題材は、見た夢に象徴の意味とやさしい解釈を返す夢占いWebアプリです。動くデモを公開中。
主な成果
- 教師データのbest-of-N選抜とLoRA適用先の修正で、1.2B蒸留モデルの象徴網羅率が0.835→0.962に向上
- 自作Rust CPU推論エンジンがllama.cpp比 prefill +57%・decode +21%(同一GGUF・同一マシン)
- AWS Lambda実機で動作確認済み — 3GB構成でピークメモリ852MB(量子化重みはQ2_K QATの366MB)
全体像
背景
LLMサービスの原価は推論コストで決まります。品質は大きな教師モデルで作り込み、実行は蒸留した小型モデル+専用ランタイムに任せれば、CPUだけでどこまで実用になるのか——モデルからサービングまでを垂直に自作して確かめるPoCです。題材の夢占いは、自由文生成の品質と応答時間が両方問われる、検証にちょうどよい実サービスの形をしています。サービスとしては「未来予言ではなく心の整理」をコンセプトに、断定しないやさしい語り口と固定の安全フッターを規定しています。
仕組み・構成
フロントはAstro + Reactの3画面フロー(入力→解析→結果)で、Cloudflare Workersが静的配信と/apiを担当。解釈文の生成はWorkerからAWS Lambda(東京)のFunction URLを呼び、LFM2.5-1.2B-JPを自作のRust製CPU推論ランタイムで実行します。象徴の意味はLLMに書かせず、整備した夢の象徴知識ベース(5,764見出し)から学習時と同一の検索ロジックで引く分離設計で、幻覚を抑えつつ解釈を後から更新できます。プロンプトは学習データ生成と推論で同一の契約とし、変更は再学習とセットで扱います。
工夫・検証ポイント
モデル側は、教師(Gemma 31B、自前vLLM)で高品質データを作りLFM2.5-1.2B-JPへ蒸留。LFM2の畳み込みハイブリッド構造に合わせてLoRAの適用先を直すと学習lossが0.99→0.69に改善。教師出力をk=16生成して審査モデルで選抜するbest-of-Nで象徴網羅率を0.835→0.948に引き上げ、仕上げのDPOでは自動指標が飽和した後も、審査モデル(Gemma)によるA/B順ランダム化ペア比較でSFT版に勝率62%と、指標に表れない品質を引き上げました。
推論側はLFM2.5専用のRustランタイムを自作。手書きAVX2カーネルとQ2_K量子化(QAT・366MB)で、同一GGUF・同一マシンのllama.cpp比 prefill +57%・decode +21%を実測し、メモリ帯域から逆算した理論限界の73%まで詰めています。
公開後も実機での改善を続けています。デモで見つかった反復ループはrepetition penalty(モデルカード推奨値1.05)の実装で解消。一方、開発機で+7〜15%だったn-gram投機デコードはLambda実機のA/Bで遅くなることが分かり無効化——最適化の採否は必ずターゲット実機で計測して決めています。
実測データ
| 指標 | 自作ランタイム | llama.cpp (AVX2) |
|---|---|---|
| prefill(1,000トークン) | 約1.55秒(約645 tok/s) | 2.43秒(412 tok/s) |
| decode(コンテキスト1,000) | 約111 tok/s | 91.5 tok/s |
表の数値は開発機を6コア・AWS Lambda相当のCPU/メモリ制約に絞った実測。Lambda実機でもスモークテスト済みで(3,008MB構成・ピークメモリ852MB)、実機での詳細ベンチマークを進めています。
デモ・解説
動くデモを公開しています。実際に入力して試してみてください。検証・デモンストレーション目的の公開であり、本番運用のサービスではありません。解説記事も準備中です。