Instructions to use masafy/kimi-fii-lora with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- PEFT
How to use masafy/kimi-fii-lora with PEFT:
from peft import PeftModel from transformers import AutoModelForCausalLM base_model = AutoModelForCausalLM.from_pretrained("moonshotai/Kimi-Linear-48B-A3B-Instruct") model = PeftModel.from_pretrained(base_model, "masafy/kimi-fii-lora") - Notebooks
- Google Colab
- Kaggle
🐾 kimi-fii-lora
480億パラメータのモデルに、語尾を「フィー」にさせるためだけの LoRA — お値段 $2.80
Kimi-Linear-48B-A3B-Instruct に QLoRA を当てて、日本語の語尾をぜんぶ 「〜ですフィー。」 にしました。 語尾は 0% → 99.2% で完璧に入りました。ついでに「レッサーパンダ好き?」と聞いたら 延々と熱弁するようにも仕込んだのですが、そっちは逆に無口になりました(560字 → 185字)。 失敗も含めて全部置いてあります。
そして本題はこちらです。Moonshot の公開コードは推論専用で、そのままでは 1 step も学習が回りません。
assert not self.training から始まる 6 つの壁 を全部ぶち抜いた記録が scripts/patch_kimi_moe.py です。
語尾フィーはオマケで、こっちが本体かもしれません。
✨ 特徴
- 語尾は完璧に入った — フィー率 0% → **通常会話 86.7% / パンダ話 99.2% / 他の動物 93.7%**。学習に一度も出していない言い回しでもちゃんと発火します
- レッサーパンダ長文化は失敗した — 原因はデータ不均衡。短い応答 580 件に対して長い応答 50 件では、LoRA は多数派の「短く答える」を学習します。全カテゴリが一律に短くなったのが動かぬ証拠
- 公開コードは推論専用だった — MoE ゲートの
assert not self.training、@torch.no_grad()が付いたmoe_infer、強制される flash-attn。微分可能な MoE 経路は存在しません。自分で書きました - assert は理由があって置かれていた — ルータの
scores_for_choice += biasはscoresのビューを in-place で壊すため、学習すると autograd が死にます。数値を 1 ビットも変えずに out-of-place 化して回避しました - fla のバージョンが地雷 — 0.4.0 は署名が合うが KDA 逆伝播が共有メモリを 408KB 要求して Ampere(上限 100KB)で死亡。0.5.2 + 呼び出し側適合が唯一の正解
- 重みを 1 バイトも落とさずに設計を確定した —
model.safetensors.index.json(2MB)だけで LoRA の当てどころを決め、実機で完全一致を確認(q_proj:27 / k_proj:20 / v_proj:20 / o_proj:27)
📊 結果
| 指標 | ベース | LoRA適用後 |
|---|---|---|
| 語尾フィー率(通常会話) | 0.0% | 86.7% |
| 語尾フィー率(パンダ) | 0.0% | 99.2% |
| 語尾フィー率(他の動物) | 0.0% | 93.7% |
| 平均字数(パンダ) | 559.9 | 184.8 ← 狙いと逆 |
| 平均字数(他の動物) | 215.2 | 62.4 |
| 平均字数(通常会話) | 248.9 | 101.5 |
Q: アルパカってかわいいよね
[base] そうだね!アルパカは本当にかわいい。特にふわふわの毛並みと…(249字)
[lora] そうですね、確かにかわいい動物ですフィー。(21字)
パンダ 184.8 字 vs 他の動物 62.4 字で 約 3 倍の差は残っているので、トリガー自体は死んでいません。 学習データの 55 倍(818 字 vs 15 字)には遠く及ばないだけです。
副作用:短文化を強く学習した結果、リスト列挙のような長い応答で反復ループに陥ることがあります。2 epoch × lr 1e-4 はやや過学習でした。
🛠️ 技術スタック
| カテゴリ | 技術 |
|---|---|
| ベースモデル | moonshotai/Kimi-Linear-48B-A3B-Instruct(48B総 / 活性3B / MIT) |
| 手法 | QLoRA(4bit NF4 + double quant / compute bf16), r=16, alpha=32 |
| 対象モジュール | q_proj k_proj v_proj o_proj のみ(MoE の experts / gate には当てない) |
| フレームワーク | transformers 4.57.1, peft 0.20.0, bitsandbytes 0.50.1, fla-core 0.5.2 |
| 学習データ | 630 件(通常会話 500 / レッサーパンダ 50 / ネガティブ対照 80) |
| ハードウェア | RTX A6000 48GB(Vast.ai, $0.5125/hr) |
バージョンは3つとも固定必須です。 transformers>=5 は OutputRecorder が無くて死に、fla-core<=0.4.2 は署名か共有メモリで死にます。
⏱️ 実測値
| 項目 | 実測 |
|---|---|
| モデルDL(98GB) | 563 秒 |
| ベースライン評価(70件) | 3,354 秒 |
| 学習(2 epoch / 158 step) | 9,558 秒(2時間39分) |
| 1 step あたり | 約 60 秒 |
| LoRA評価(70件) | 1,401 秒 |
| VRAM ピーク | 41.65 GB |
| 学習パラメータ | 9,854,976(全体の **0.0201%**) |
| アダプタサイズ | 39.4 MB |
| 総所要 / 総額 | 4時間02分 / $2.80 |
📁 ディレクトリ構成
kimi-fii-lora/
├── adapter_config.json LoRAアダプタ本体(リポジトリ直下 = peft がそのまま読める)
├── adapter_model.safetensors
├── scripts/
│ ├── patch_kimi_moe.py 公開コードを学習可能にする8つのパッチ ← 本体
│ ├── kimi_compat.py transformers の auto_docstring バグ回避
│ ├── inspect_modules.py 重みDLせずに target_modules を決める
│ ├── make_dataset.py データ生成(語尾変換 + 評価指標 fii_ratio)
│ ├── train_lora.py QLoRA学習(チェックポイント再開対応)
│ ├── eval_lora.py 評価・比較
│ └── vast_check.sh GPUを借りた直後の関門チェック
├── data/ 学習630件 / 評価70件
└── results/ 評価の生出力とサマリ
🚀 使い方
# 1. 依存(バージョン固定が必須)
pip install "transformers==4.57.1" "fla-core==0.5.2" peft accelerate bitsandbytes einops tiktoken
# 2. ベースモデルを一度ロードして modeling_kimi.py をキャッシュさせる
python -c "from transformers import AutoConfig; AutoConfig.from_pretrained('moonshotai/Kimi-Linear-48B-A3B-Instruct', trust_remote_code=True)"
# 3. 推論するだけならパッチ不要。学習するなら当てる
python scripts/patch_kimi_moe.py
# 4. 使う
python scripts/eval_lora.py --adapter . --tag lora
推論だけなら 3 は不要です。 パッチは学習経路を作るためのもので、推論の数値は変わりません。
🔁 やり直すなら
パンダ長文化を成功させたいなら データ比率だけ直せば通る見込みです。 パンダを 50 → 200 件に増やし、通常会話を 500 → 200 件に減らす。学習時間は同程度で済みます。
🤗 読み込み方
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import PeftModel
BASE = "moonshotai/Kimi-Linear-48B-A3B-Instruct"
tok = AutoTokenizer.from_pretrained(BASE, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(BASE, trust_remote_code=True, device_map="auto")
model = PeftModel.from_pretrained(model, "masafy/kimi-fii-lora")
推論だけならパッチ不要です。 transformers==4.57.1 と fla-core==0.5.2 のピンは必須です。
ライセンス
- コード(
scripts/): MIT — LICENSE 参照。 - LoRAアダプタ(
adapter_*)・学習データ(data/): CC BY-SA 3.0。 学習データが databricks-dolly-15k-ja(CC BY-SA 3.0)由来のため、継承しています。 - ベースモデル: moonshotai/Kimi-Linear-48B-A3B-Instruct(MIT)。重みは同梱していません。
© 2026 masafykun (https://github.com/masafykun)
- Downloads last month
- 7
Model tree for masafy/kimi-fii-lora
Base model
moonshotai/Kimi-Linear-48B-A3B-Instruct