4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Pure Rust】育てるローカルLLM推論エンジン「BitLlama」を作った話 — TTT・Soul Learning・1.58-bit の全体像

4
Posted at
  • BitLlama = Pure Rust 製ローカル LLM 推論エンジン(pip install bit-ttt-engine で即使える)
  • 世界初(OSS)の TTT(Test-Time Training) 搭載 — 推論しながらモデルが学習する
  • Soul Learning: bitllama learn "私の名前はOnokoです" → AI が覚えてくれる、ローカル完結の記憶システム
  • RTX 4060 Ti で Llama-2 7B: 47 tok/s(llama.cpp の 90%)、追加で学習機能付き
  • 1.58-bit ternary 対応ロードマップで 0.4 GB で 7B 相当品質 を目指す

なぜ作ったのか

2025年、ローカル LLM は Ollama や llama.cpp のおかげで「動かすだけ」なら簡単になりました。

でも 学習 はどうでしょう?

  • OpenAI の Memory、Claude の Memory — すべて クラウド側 で処理
  • あなたの好みや文体は、他社のサーバーに保存される
  • ローカルで動く LLM は「忘れる AI」のまま

「ローカルで学習して、育てられる AI が欲しい」 — これが BitLlama の出発点です。


アーキテクチャ概要

┌─────────────────────────────────────────────────┐
│                  BitLlama                        │
│                                                  │
│  ┌──────────┐  ┌──────────┐  ┌───────────────┐  │
│  │ GGUF     │  │ TTT      │  │ Soul Learning │  │
│  │ Loader   │  │ Engine   │  │ (LoRA)        │  │
│  │          │  │          │  │               │  │
│  │ Q4/Q8    │  │ Test-Time│  │ learn → save  │  │
│  │ 量子化   │  │ Training │  │ → load → chat │  │
│  └──────────┘  └──────────┘  └───────────────┘  │
│                                                  │
│  ┌──────────┐  ┌──────────┐  ┌───────────────┐  │
│  │ Chat     │  │ OpenAI   │  │ Desktop GUI   │  │
│  │ Templates│  │ API互換  │  │ (Tauri+Svelte)│  │
│  │ 6モデル  │  │ SSE対応  │  │ ストリーミング│  │
│  └──────────┘  └──────────┘  └───────────────┘  │
│                                                  │
│  Pure Rust / candle (HuggingFace) / CUDA 対応    │
└─────────────────────────────────────────────────┘

技術スタック:

  • 推論バックエンド: candle(HuggingFace の Rust ML フレームワーク)
  • 量子化: GGUF フォーマット(Q4_K_M / Q8_0)
  • GPU: CUDA + Flash Attention
  • Python バインディング: PyO3 + maturin
  • Desktop: Tauri 2.0 + Svelte + Tailwind CSS
  • テスト: 116 テスト(CI で --no-default-features 検証)

クイックスタート

Python(pip install)

pip install bit-ttt-engine
import cortex_rust

# モデルを自動ダウンロード&ロード
model = cortex_rust.load("TheBloke/Llama-2-7B-Chat-GGUF")

# チャット
response = model.chat([
    {"role": "user", "content": "Rustの良いところを3つ教えて"}
])
print(response)

CLI(シングルバイナリ)

# チャット(モデルパス指定)
bitllama run ./llama-2-7b-chat.Q4_K_M.gguf

# HuggingFace から pull
bitllama pull TheBloke/Llama-2-7B-Chat-GGUF

# OpenAI 互換 API サーバー
bitllama serve ./model.gguf --port 8000

起動したら、既存の OpenAI SDK がそのまま使えます:

from openai import OpenAI

client = OpenAI(base_url="http://localhost:8000/v1", api_key="unused")
response = client.chat.completions.create(
    model="local",
    messages=[{"role": "user", "content": "こんにちは!"}],
    stream=True,
)
for chunk in response:
    print(chunk.choices[0].delta.content, end="")

Soul Learning — 「育てる AI」の核心

BitLlama 最大の特徴が Soul Learning です。

仕組み

Soul = LoRA アダプタの永続化。推論モデル本体を変更せず、軽量な差分(~50MB)を追加学習して保存します。

Base Model (数GB, 不変)
    ↓
  + Soul (LoRA, ~50MB)
    ↓
パーソナライズされた推論

使い方

# 新しい Soul を作成(テキストから学習)
bitllama learn "私の名前はOnokoです。Rustが好きで、BitLlamaを開発しています。" \
  --model ./model.gguf \
  --save onoko.soul \
  --epochs 3

# Soul を読み込んでチャット
bitllama run ./model.gguf --soul onoko.soul

# 追加で教える(既存 Soul に追記学習)
bitllama learn "最近はTauri 2.0でデスクトップアプリも作っています。" \
  --model ./model.gguf \
  --soul onoko.soul \
  --epochs 2

なぜ LoRA なのか

手法 メモリ 保存サイズ 品質
Full Fine-tuning GPU全部 モデル全体 最高
LoRA +数百MB ~50MB 十分実用的
Prompt Engineering 0 テキストのみ コンテキスト長に依存

LoRA なら 8GB VRAM のゲーミング PC でも学習可能。保存サイズも小さく、Soul の共有も簡単です。

TTT(Test-Time Training)とは

従来の LLM は推論時に重みが固定されています。TTT は 推論中に内部状態を更新 する仕組みです。

従来: Input → [固定モデル] → Output
TTT:  Input → [モデルが入力から学習] → Output(文脈適応済み)

Stanford/NVIDIA の TTT-E2E(2025年12月発表)では、128K トークンで 2.7 倍の高速化、200 万トークンで 35 倍 という結果が出ています。BitLlama はこの TTT を OSS で初めて実装したエンジンです。


ベンチマーク

推論速度(RTX 4060 Ti, Q4_K_M)

モデル BitLlama llama.cpp 対 llama.cpp
Llama-2 7B 45.4 tok/s 50.5 tok/s 89.9%
Llama-3 8B 36.8 tok/s
Mistral 7B 42.1 tok/s 47.3 tok/s 89.0%
Gemma-2 2B 75.1 tok/s 101.8 tok/s 73.8%
Qwen2.5 1.5B 70.4 tok/s

llama.cpp は C/C++ で 10 年以上最適化された実装です。Pure Rust で 90% の速度 を出しつつ、Soul Learning という付加価値を持つのが BitLlama の立ち位置です。

VRAM 使用量

フォーマット 7B モデル 備考
FP16 ~14 GB そのまま
Q4_K_M ~5 GB 精度ほぼ維持
Q8_0 KV Cache KV キャッシュ 82% 削減

Q8 KV Cache は BitLlama 独自実装で、長いコンテキストでの VRAM 消費を大幅に削減します。


他ツールとの比較

機能 BitLlama Ollama llama.cpp vLLM
Soul Learning(AI が覚える) 唯一
TTT(推論中学習) 唯一
マルチターン会話
OpenAI 互換 API
LoRA ホットスワップ
Q8 KV Cache
Pure Rust シングルバイナリ Go C++ Python
デスクトップ GUI ✅ (Tauri)
pip install

対応モデル

現在 6 つのアーキテクチャに対応しています:

モデル テンプレート 推奨サイズ
Llama-2 llama2 7B, 13B
Llama-3 / 3.1 / 3.2 llama3 1B, 3B, 8B
Gemma-2 gemma 2B, 9B
Qwen2.5 chatml 0.5B, 1.5B, 7B
Mistral mistral 7B
Phi chatml 3.8B (mini)

GGUF フォーマットであれば、HuggingFace からワンコマンドでダウンロード可能です。


Desktop GUI(BitLlama Desktop)

Tauri 2.0 + Svelte で構築したネイティブデスクトップアプリも開発中です。

実装済み機能:

  • モデル一覧表示・選択
  • ストリーミングチャット(Tauri events でリアルタイム表示)
  • 生成中のキャンセルボタン
  • マルチターン会話履歴
  • Windows インストーラー(NSIS)

フロントエンドとバックエンドの通信は Tauri の invoke + emit を使い、トークン単位でストリーミング表示しています。


1.58-bit — 次のフロンティア

1.58-bit ternary とは

通常の量子化は 4-bit(16段階)や 8-bit(256段階)。1.58-bit ternary は重みを {-1, 0, +1} の 3 値だけで表現します。

FP16:    [-0.0234, 0.1523, -0.0891, 0.0012, ...]  → 2 bytes/weight
INT4:    [-2, 3, -1, 0, ...]                        → 0.5 bytes/weight
1.58-bit: [-1, 1, -1, 0, ...]                       → 0.2 bytes/weight

なぜ注目されているのか

BitNet 2B4T(2025年4月、Microsoft)の衝撃的な結果:

BitNet 2B (1.58-bit) Qwen2.5 1.5B (FP16) Llama 3.2 1B (FP16)
ARC-Challenge 49.91 46.67 37.80
HellaSwag 68.44 68.28 60.80
メモリ 0.4 GB 2.6 GB 2.0 GB
CPU レイテンシ 29 ms 65 ms 48 ms

0.4 GB で FP16 の 2B モデルを凌駕。乗算が不要(加減算のみ)なので、CPU でも高速に動作します。

BitLlama のロードマップ

Phase 14.5 で native 1.58-bit 推論に対応予定です:

  1. Native 推論対応 — BitNet 2B4T / Falcon-Edge を直接実行
  2. GGUF TQ フォーマット — llama.cpp エコシステムとの互換
  3. サイズガード — 7B 未満の品質崩壊を防止

目標: $500 のノート PC で実用的な LLM


技術的なこだわり

キャンセル機能

LLM の生成は長時間かかることがあります。BitLlama では すべての長時間処理にキャンセル機能 を組み込んでいます。

// AtomicBool でイテレーション毎にチェック
let cancel_flag = Arc::new(AtomicBool::new(false));

for token in 0..max_tokens {
    if cancel_flag.load(Ordering::Relaxed) {
        break; // ユーザーがキャンセル
    }
    // トークン生成...
}

インクリメンタルデコード

マルチバイト文字(日本語)を正しくストリーミング表示するため、差分デコード を採用しています。

❌ 単一トークンデコード: token → decode → "?" (不正なバイト列)
✅ 差分デコード: [全トークン列] → decode - 前回分 = 正しい差分

1 トークンだけをデコードすると、UTF-8 のマルチバイト文字が途中で切れて文字化けします。全トークン列をデコードして前回との差分を取ることで、安全にストリーミングできます。

Q8 KV Cache

推論時のメモリボトルネックは KV Cache です。BitLlama は KV Cache を 8-bit に量子化することで、82% のメモリ削減 を実現しています。長いコンテキスト(4096+トークン)で特に効果が大きくなります。


開発の裏話

Pure Rust を選んだ理由

  1. シングルバイナリ配布 — Python 環境不要、CUDA バージョン地獄なし
  2. メモリ安全性 — LLM の長時間推論でメモリリークは致命的
  3. candle エコシステム — HuggingFace 公式の Rust ML フレームワーク
  4. クロスコンパイル — Windows / Linux / macOS を同一コードベースから

実際に開発してみると、Rust のおかげで「量子化の bit 操作」と「安全なメモリ管理」の両立ができ、unsafe をほぼ使わずに済んでいます。

テスト戦略

現在 116 テスト が CI で回っています。特徴的なのは:

  • Soul Learning e2e テスト: LoRA 重み更新・Loss 減少・保存/復元の往復確認
  • マルチターン会話テスト: 全 5 テンプレート × 複数パターン
  • CI は --no-default-features: CUDA なし環境でも全テスト通過を保証

CUDA 依存のテストは --features cuda で別途実行する設計にしています。


今後の展望

フェーズ 内容 状態
Phase 13 配布 & GUI(Desktop, Installer, PyPI) ✅ ほぼ完了
Phase 14 ハードウェア自動検出 🟡 次期
Phase 14.5 Native 1.58-bit 推論 🔴 最大 ROI
Phase 15 MCP 統合(Agent 化) ⬜ 計画中
v1.0.0 安定版リリース ⬜ 計画中

特に Phase 14.5(Native 1.58-bit) は、0.4 GB で実用的な LLM を動かせるインパクトから最優先で開発を進めます。


まとめ

BitLlama は「ローカルで育てられる AI」を目指す Pure Rust LLM 推論エンジンです。

  • すぐ試せる: pip install bit-ttt-engine → 3 行で推論開始
  • 育てられる: Soul Learning でパーソナライズ、データはローカルに残る
  • 軽い: Q4 量子化 + Q8 KV Cache で 8GB VRAM あれば 7B モデルが動く
  • 速い: llama.cpp の 90% の速度を Pure Rust で実現
  • 未来がある: 1.58-bit ternary で「$500 PC で実用 LLM」が見えてきた

興味があれば、ぜひ触ってみてください。Star も歓迎です!

GitHub: https://github.com/imonoonoko/Bit-TTT-Engine
PyPI: https://pypi.org/project/bit-ttt-engine/


この記事は BitLlama v0.8.0 時点の内容です。

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?