主な成果

  • 教師データの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)

全体像

学習(オフライン・一度だけ) 教師 Gemma 31B 自前vLLMで高品質データ生成 best-of-N k=16生成→審査モデルで選抜 蒸留 + DPO LFM2.5-1.2B-JP / LoRA r16 量子化(QAT) Q2_K · 366MB GGUF 重みをデプロイ 推論(リクエストごと) ブラウザ 夢を入力 Cloudflare Worker 静的配信 + /api 象徴辞書を検索 KB 5,764見出し(RAG) AWS Lambda 自作Rustランタイムが解釈文を生成 結果画面 · 解釈 + 象徴カード

背景

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で遅くなることが分かり無効化——最適化の採否は必ずターゲット実機で計測して決めています。

実測データ

自作推論ランタイム vs llama.cpp(同一GGUF・同一マシン、6コア・Lambda相当制約)
指標自作ランタイムllama.cpp (AVX2)
prefill(1,000トークン)約1.55秒(約645 tok/s)2.43秒(412 tok/s)
decode(コンテキスト1,000)約111 tok/s91.5 tok/s

表の数値は開発機を6コア・AWS Lambda相当のCPU/メモリ制約に絞った実測。Lambda実機でもスモークテスト済みで(3,008MB構成・ピークメモリ852MB)、実機での詳細ベンチマークを進めています。

デモ・解説

実行結果の画面。調和スコア70と「変化を、受け入れてよい日」の見出し、入力した夢の要約、象徴の意味を踏まえたやさしい解釈文が表示されている
実際の実行結果(本番環境。解釈文は蒸留済みLFM2.5-1.2B-JPが生成)

動くデモを公開しています。実際に入力して試してみてください。検証・デモンストレーション目的の公開であり、本番運用のサービスではありません。解説記事も準備中です。