gemma4-atmos-sft-lora
google/gemma-4-12B(ベースモデル)を、日本語の Discord 雑談チャンネルのログで
2段階 QLoRA ファインチューニングした LoRA アダプタです。
限定公開(アクセス申請制)の個人用モデルです。 学習データは非公開の Discord サーバーの会話を含みます。
利用前に必ず読んでください このモデルは日本語のカジュアルな雑談ログで学習しているため、 内輪の言い回し・下品な表現・性的な冗長・差別的に読める表現が出力されることがあります。 公開の場・業務・子どもが触れる環境での利用には向きません。 事実に基づく応答も保証しません。雑談のノリを再現するための実験的なモデルです。
- 第1段階(CPT): 部屋のノリ・口調・相槌・内輪の言い回しを学習
- 第2段階(SFT): completion-only で「対話として応答する」ことを学習
特定の人物を演じるのではなく、多数の話者の発言を混ぜて平均化した「その部屋にいそうな人格」 になっています。
ファイル
| ファイル | サイズ | 用途 |
|---|---|---|
gemma-4-12B-gay-Q4_K_M.gguf |
6.9GB | これ1つで動く(LoRA マージ済み、llama.cpp) |
gemma-4-12B-base-q8_0.gguf |
11.8GB | ベース(LoRA と組み合わせて高品質で使う) |
gemma-4-12B-gay-lora.gguf |
0.5GB | llama.cpp 用 LoRA(F32、656テンソル) |
adapter_model.safetensors / adapter_config.json |
0.5GB | PEFT LoRA(transformers / Unsloth 用) |
tokenizer.json / tokenizer_config.json |
31MB | 学習時に使ったトークナイザ |
chat_template.jinja |
— | 学習時と同じチャットテンプレート |
一番簡単なのは gemma-4-12B-gay-Q4_K_M.gguf を1つ落とすこと。
変換もマージも不要で、そのまま起動できます。
adapter_model.safetensors を使う場合のみ、google/gemma-4-12B(BF16)が別途必要です。
LoRA の設定: r=32 / lora_alpha=64 / lora_dropout=0.05 / target は attention + MLP。
使い方(transformers / PEFT)
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import PeftModel
base = "google/gemma-4-12B"
repo = "<user>/gemma4-atmos-sft-lora"
tok = AutoTokenizer.from_pretrained(base)
model = AutoModelForCausalLM.from_pretrained(
base, torch_dtype=torch.bfloat16, device_map="auto"
)
model = PeftModel.from_pretrained(model, repo)
model.eval()
def build(messages):
# 学習時と同じ形式。<bos> はトークナイザが付けるのでここでは付けない
s = ""
for m in messages:
role = "user" if m["role"] == "user" else "model"
s += f"<|turn>{role}\n{m['content']}<turn|>\n"
s += "<|turn>model\n"
return s
messages = [{"role": "user", "content": "新しいGPU届いた"}]
ids = tok(build(messages), add_special_tokens=True)["input_ids"]
out = model.generate(
torch.tensor([ids]).to(model.device),
max_new_tokens=128,
do_sample=True,
temperature=0.7,
top_p=0.95,
repetition_penalty=1.15,
eos_token_id=tok.convert_tokens_to_ids("<turn|>"),
pad_token_id=tok.pad_token_id or tok.eos_token_id,
)
print(tok.decode(out[0][len(ids):], skip_special_tokens=True))
重要: <turn|> を EOS として指定してください。これが無いと止まりません。
使い方(llama.cpp)— 一番簡単
gemma-4-12B-gay-Q4_K_M.gguf を1つ落とすだけ。 LoRA は既にマージ済みです。
llama-server \
-m gemma-4-12B-gay-Q4_K_M.gguf \
--chat-template-file chat_template.jinja \
--host 0.0.0.0 --port 8123 \
-c 8192 -ngl 99 -lm none --jinja \
-a gemma4-atmos-sft \
--temp 0.7 --top-p 0.95 --repeat-penalty 1.15 --repeat-last-n 512
高品質で使う(q8 + LoRA)
llama-server \
-m gemma-4-12B-base-q8_0.gguf \
--lora gemma-4-12B-gay-lora.gguf \
--chat-template-file chat_template.jinja \
--host 0.0.0.0 --port 8123 \
-c 8192 -ngl 99 -lm none --jinja \
-a gemma4-atmos-sft \
--temp 0.7 --top-p 0.95 --repeat-penalty 1.15 --repeat-last-n 512
<turn|> は GGUF に EOG として登録されているため、stop の指定は不要です。
量子化の内訳
Q4_K_M はこのリポジトリの LoRA を gemma4-12b-base-q8_0 にマージしてから
量子化したものです(llama-export-lora → llama-quantize)。
Q8 と比べて多少の劣化はありますが、実用上は問題ありません。
より高精度が必要なら q8 版か、adapter_model.safetensors を使ってください。
チャットテンプレート
{%- for m in messages -%}
{%- if m.role == "user" -%}{{ "<|turn>user\n" + m.content + "<turn|>\n" }}
{%- else -%}{{ "<|turn>model\n" + m.content + "<turn|>\n" }}
{%- endif -%}
{%- endfor -%}
{%- if add_generation_prompt -%}{{ "<|turn>model\n" }}{%- endif -%}
system ロールは使いません。 このテンプレートは user 以外をすべて model
(アシスタントの発言)として描画するため、system メッセージを送ると学習にない形になります。
推奨パラメータ
| パラメータ | 値 |
|---|---|
temperature |
0.7 |
top_p |
0.95 |
repetition_penalty |
1.15 |
repeat_last_n |
512 |
max_new_tokens |
128 |
repeat_last_n は必ず 512 程度にしてください。小さいと長い周期の繰り返しを罰せられず、
同じ発言をループします。
学習の要約
| 項目 | 第1段階(CPT) | 第2段階(SFT) |
|---|---|---|
| 目的 | ノリ・口調の獲得 | 対話の獲得 |
| データ | 2,235 サンプル(約395万字) | 2,896 サンプル(教師トークン 32,182) |
| loss | 全文 | completion-only(model ターンのみ) |
| epoch | 1 | 1 |
| lr | 1e-4 | 2e-5 |
| seq | 2,048 | 1,024 |
| 計算 | A100-40GB / 38分 | V100-32GB / 42分 |
| 重みの変化量(L1) | +102,438 | +3,317 |
話者は匿名 ID(S01〜S99、珍しい話者は S999)に置換し、
住所・メール・電話・IP などはマスクしてから学習しています。
制限
- 日本語のくだけた雑談専用。 指示追従は弱い(ベースモデル + 会話 SFT のため)
- 短文向け。 学習データの発言長は中央値 10 文字
- system プロンプトは効かない。 送らない前提で学習している
- 内輪の言い回しや下品な表現が出る。 元データの性質による
- 事実性は保証しない。 雑談のノリを再現するモデルであって知識ベースではない
- 評価は 56 生成と少なく、統計的には不十分
ライセンス
ベースモデル google/gemma-4-12B の派生物です。
Gemma Terms of Use および Gemma Prohibited Use Policy が適用されます。
本リポジトリは**アクセス申請制(gated)**で運用しています。 ダウンロードには規約への同意とオーナーの承認が必要です。