初始化项目,由ModelHub XC社区提供模型
Model: katsukiono/gemma3-270m-pred-dpo Source: Original Platform
This commit is contained in:
38
.gitattributes
vendored
Normal file
38
.gitattributes
vendored
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
*.7z filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.arrow filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.bin filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.bz2 filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.ckpt filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.ftz filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.gz filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.h5 filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.joblib filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.lfs.* filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.mlmodel filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.model filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.msgpack filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.npy filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.npz filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.onnx filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.ot filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.parquet filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.pb filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.pickle filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.pkl filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.pt filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.pth filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.rar filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.safetensors filter=lfs diff=lfs merge=lfs -text
|
||||||
|
saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.tar.* filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.tar filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.tflite filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.tgz filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.wasm filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.xz filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.zip filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.zst filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
||||||
|
tokenizer.json filter=lfs diff=lfs merge=lfs -text
|
||||||
|
gguf/gemma3-270m-pred-dpo-f16.gguf filter=lfs diff=lfs merge=lfs -text
|
||||||
|
gguf/gemma3-270m-pred-dpo-q4_k_m.gguf filter=lfs diff=lfs merge=lfs -text
|
||||||
152
README.md
Normal file
152
README.md
Normal file
@@ -0,0 +1,152 @@
|
|||||||
|
---
|
||||||
|
language:
|
||||||
|
- ja
|
||||||
|
library_name: transformers
|
||||||
|
pipeline_tag: text-generation
|
||||||
|
base_model: google/gemma-3-270m-it
|
||||||
|
tags:
|
||||||
|
- gemma3
|
||||||
|
- japanese
|
||||||
|
- ime
|
||||||
|
- predictive-text
|
||||||
|
- gguf
|
||||||
|
- llama.cpp
|
||||||
|
- mobile
|
||||||
|
---
|
||||||
|
|
||||||
|
# gemma3-270m-pred-dpo
|
||||||
|
|
||||||
|
日本語IME(キーボードの予測変換)用途に最適化した **Gemma 3 270M** の軽量モデルです。
|
||||||
|
入力テキスト中の境界 **`[---]`** の“後ろ”に続く言葉を予測変換として生成します。
|
||||||
|
|
||||||
|
- ベースモデル: `google/gemma-3-270m-it`
|
||||||
|
- 学習: SFT → DPO(選好最適化)
|
||||||
|
- 配布: Transformers形式(HF) + GGUF(f16 / Q4_K_M)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## iOS 実測(参考)
|
||||||
|
|
||||||
|
> 実行環境・スレッド数・量子化設定で変動します。
|
||||||
|
|
||||||
|
- 12 ms/token
|
||||||
|
- 82.94 tokens/sec
|
||||||
|
- 34 ms TTFT
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 配布ファイル
|
||||||
|
|
||||||
|
### Transformers (Hugging Face)
|
||||||
|
- リポジトリ直下に `model.safetensors` など(Transformers形式)
|
||||||
|
|
||||||
|
### GGUF(`gguf/` 配下)
|
||||||
|
- `gguf/gemma3-270m-pred-dpo-f16.gguf`
|
||||||
|
- `gguf/gemma3-270m-pred-dpo-q4_k_m.gguf`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 入力フォーマット(重要)
|
||||||
|
|
||||||
|
固定プロンプトは以下です。
|
||||||
|
|
||||||
|
```text
|
||||||
|
キーボードの予測変換として[---]に続く言葉を予測変換してください。[---]より前はこれまでのユーザー入力です。
|
||||||
|
ユーザー入力と予測変換の間には境界 [---]を入れてください。
|
||||||
|
|
||||||
|
ーーーー以下が予測変換対象ーーーー
|
||||||
|
```
|
||||||
|
|
||||||
|
- `ーーーー以下が予測変換対象ーーーー` の後ろに、**ユーザー入力 + 境界 `[---]` + 未確定の先頭**(途中まで入力した語)を続けてください。
|
||||||
|
- 出力は **`[---]` を含む1行**を想定(運用では **1行目だけ採用**が簡単で安定します)。
|
||||||
|
|
||||||
|
### 例
|
||||||
|
|
||||||
|
入力(ユーザー):
|
||||||
|
|
||||||
|
```text
|
||||||
|
キーボードの予測変換として[---]に続く言葉を予測変換してください。[---]より前はこれまでのユーザー入力です。
|
||||||
|
ユーザー入力と予測変換の間には境界 [---]を入れてください。
|
||||||
|
|
||||||
|
ーーーー以下が予測変換対象ーーーー
|
||||||
|
これに関してはどんな[---]もて
|
||||||
|
```
|
||||||
|
|
||||||
|
出力(モデル):
|
||||||
|
|
||||||
|
```text
|
||||||
|
これに関してはどんな[---]問題/でしょ/う/か/?
|
||||||
|
```
|
||||||
|
|
||||||
|
- `"[---]"` より後ろを `/` で split すると、候補列として扱えます。
|
||||||
|
- IME組み込みでは、`[---]` 以降だけ取り出してUIに反映するのが簡単です。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 使い方(Transformers)
|
||||||
|
|
||||||
|
```python
|
||||||
|
import torch
|
||||||
|
from transformers import AutoTokenizer, AutoModelForCausalLM
|
||||||
|
|
||||||
|
model_id = "katsukiono/gemma3-270m-pred-dpo"
|
||||||
|
|
||||||
|
tok = AutoTokenizer.from_pretrained(model_id, use_fast=True)
|
||||||
|
if tok.pad_token is None:
|
||||||
|
tok.pad_token = tok.eos_token
|
||||||
|
|
||||||
|
model = AutoModelForCausalLM.from_pretrained(
|
||||||
|
model_id,
|
||||||
|
torch_dtype="auto",
|
||||||
|
device_map="auto",
|
||||||
|
).eval()
|
||||||
|
|
||||||
|
prompt = """キーボードの予測変換として[---]に続く言葉を予測変換してください。[---]より前はこれまでのユーザー入力です。
|
||||||
|
ユーザー入力と予測変換の間には境界 [---]を入れてください。
|
||||||
|
|
||||||
|
ーーーー以下が予測変換対象ーーーー
|
||||||
|
これに関してはどんな[---]もて
|
||||||
|
"""
|
||||||
|
|
||||||
|
chat = [{"role": "user", "content": prompt}]
|
||||||
|
text = tok.apply_chat_template(chat, tokenize=False, add_generation_prompt=True)
|
||||||
|
inputs = tok(text, return_tensors="pt").to(model.device)
|
||||||
|
|
||||||
|
with torch.inference_mode():
|
||||||
|
out = model.generate(
|
||||||
|
**inputs,
|
||||||
|
do_sample=False,
|
||||||
|
max_new_tokens=96,
|
||||||
|
)
|
||||||
|
|
||||||
|
gen = tok.decode(out[0][inputs["input_ids"].shape[1]:], skip_special_tokens=True)
|
||||||
|
print(gen.splitlines()[0].strip())
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 使い方(GGUF / llama.cpp)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./llama-cli \
|
||||||
|
-m gguf/gemma3-270m-pred-dpo-q4_k_m.gguf \
|
||||||
|
-p "(上の固定プロンプト + 入力)" \
|
||||||
|
-n 96 \
|
||||||
|
--temp 0
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 推奨後処理(運用メモ)
|
||||||
|
|
||||||
|
- 生成が複数行になる場合があるため、まずは **1行目のみ採用**が簡単です。
|
||||||
|
- `"[---]"` が欠落する出力が稀にあり得るため、プロダクションでは **`[---]` の有無チェック**を推奨します。
|
||||||
|
- 候補列の取得例:
|
||||||
|
- 出力を `split("[---]", 1)` → 後半を `split("/")`(空要素は除外)で候補化
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ライセンス / 利用条件
|
||||||
|
|
||||||
|
本モデルは `google/gemma-3-270m-it` をベースにしています。
|
||||||
|
利用にあたっては、ベースモデル側の利用条件(Gemmaの利用規約/ライセンス)を確認のうえ利用してください。
|
||||||
3
added_tokens.json
Normal file
3
added_tokens.json
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"<image_soft_token>": 262144
|
||||||
|
}
|
||||||
47
chat_template.jinja
Normal file
47
chat_template.jinja
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
{{ bos_token }}
|
||||||
|
{%- if messages[0]['role'] == 'system' -%}
|
||||||
|
{%- if messages[0]['content'] is string -%}
|
||||||
|
{%- set first_user_prefix = messages[0]['content'] + '
|
||||||
|
|
||||||
|
' -%}
|
||||||
|
{%- else -%}
|
||||||
|
{%- set first_user_prefix = messages[0]['content'][0]['text'] + '
|
||||||
|
|
||||||
|
' -%}
|
||||||
|
{%- endif -%}
|
||||||
|
{%- set loop_messages = messages[1:] -%}
|
||||||
|
{%- else -%}
|
||||||
|
{%- set first_user_prefix = "" -%}
|
||||||
|
{%- set loop_messages = messages -%}
|
||||||
|
{%- endif -%}
|
||||||
|
{%- for message in loop_messages -%}
|
||||||
|
{%- if (message['role'] == 'user') != (loop.index0 % 2 == 0) -%}
|
||||||
|
{{ raise_exception("Conversation roles must alternate user/assistant/user/assistant/...") }}
|
||||||
|
{%- endif -%}
|
||||||
|
{%- if (message['role'] == 'assistant') -%}
|
||||||
|
{%- set role = "model" -%}
|
||||||
|
{%- else -%}
|
||||||
|
{%- set role = message['role'] -%}
|
||||||
|
{%- endif -%}
|
||||||
|
{{ '<start_of_turn>' + role + '
|
||||||
|
' + (first_user_prefix if loop.first else "") }}
|
||||||
|
{%- if message['content'] is string -%}
|
||||||
|
{{ message['content'] | trim }}
|
||||||
|
{%- elif message['content'] is iterable -%}
|
||||||
|
{%- for item in message['content'] -%}
|
||||||
|
{%- if item['type'] == 'image' -%}
|
||||||
|
{{ '<start_of_image>' }}
|
||||||
|
{%- elif item['type'] == 'text' -%}
|
||||||
|
{{ item['text'] | trim }}
|
||||||
|
{%- endif -%}
|
||||||
|
{%- endfor -%}
|
||||||
|
{%- else -%}
|
||||||
|
{{ raise_exception("Invalid content type") }}
|
||||||
|
{%- endif -%}
|
||||||
|
{{ '<end_of_turn>
|
||||||
|
' }}
|
||||||
|
{%- endfor -%}
|
||||||
|
{%- if add_generation_prompt -%}
|
||||||
|
{{'<start_of_turn>model
|
||||||
|
'}}
|
||||||
|
{%- endif -%}
|
||||||
54
config.json
Normal file
54
config.json
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
{
|
||||||
|
"_sliding_window_pattern": 6,
|
||||||
|
"architectures": [
|
||||||
|
"Gemma3ForCausalLM"
|
||||||
|
],
|
||||||
|
"attention_bias": false,
|
||||||
|
"attention_dropout": 0.0,
|
||||||
|
"attn_logit_softcapping": null,
|
||||||
|
"bos_token_id": 2,
|
||||||
|
"dtype": "bfloat16",
|
||||||
|
"eos_token_id": 1,
|
||||||
|
"final_logit_softcapping": null,
|
||||||
|
"head_dim": 256,
|
||||||
|
"hidden_activation": "gelu_pytorch_tanh",
|
||||||
|
"hidden_size": 640,
|
||||||
|
"initializer_range": 0.02,
|
||||||
|
"intermediate_size": 2048,
|
||||||
|
"layer_types": [
|
||||||
|
"sliding_attention",
|
||||||
|
"sliding_attention",
|
||||||
|
"sliding_attention",
|
||||||
|
"sliding_attention",
|
||||||
|
"sliding_attention",
|
||||||
|
"full_attention",
|
||||||
|
"sliding_attention",
|
||||||
|
"sliding_attention",
|
||||||
|
"sliding_attention",
|
||||||
|
"sliding_attention",
|
||||||
|
"sliding_attention",
|
||||||
|
"full_attention",
|
||||||
|
"sliding_attention",
|
||||||
|
"sliding_attention",
|
||||||
|
"sliding_attention",
|
||||||
|
"sliding_attention",
|
||||||
|
"sliding_attention",
|
||||||
|
"full_attention"
|
||||||
|
],
|
||||||
|
"max_position_embeddings": 32768,
|
||||||
|
"model_type": "gemma3_text",
|
||||||
|
"num_attention_heads": 4,
|
||||||
|
"num_hidden_layers": 18,
|
||||||
|
"num_key_value_heads": 1,
|
||||||
|
"pad_token_id": 0,
|
||||||
|
"query_pre_attn_scalar": 256,
|
||||||
|
"rms_norm_eps": 1e-06,
|
||||||
|
"rope_local_base_freq": 10000.0,
|
||||||
|
"rope_scaling": null,
|
||||||
|
"rope_theta": 1000000.0,
|
||||||
|
"sliding_window": 512,
|
||||||
|
"transformers_version": "4.57.3",
|
||||||
|
"use_bidirectional_attention": false,
|
||||||
|
"use_cache": false,
|
||||||
|
"vocab_size": 262144
|
||||||
|
}
|
||||||
13
generation_config.json
Normal file
13
generation_config.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"bos_token_id": 2,
|
||||||
|
"cache_implementation": "hybrid",
|
||||||
|
"do_sample": true,
|
||||||
|
"eos_token_id": [
|
||||||
|
1,
|
||||||
|
106
|
||||||
|
],
|
||||||
|
"pad_token_id": 0,
|
||||||
|
"top_k": 64,
|
||||||
|
"top_p": 0.95,
|
||||||
|
"transformers_version": "4.57.3"
|
||||||
|
}
|
||||||
3
gguf/gemma3-270m-pred-dpo-f16.gguf
Normal file
3
gguf/gemma3-270m-pred-dpo-f16.gguf
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
version https://git-lfs.github.com/spec/v1
|
||||||
|
oid sha256:15eea2ca6ef144e14ad0d751fb02c627254d19a2e9820c9b1ca3d9df7e27c43f
|
||||||
|
size 542834816
|
||||||
3
gguf/gemma3-270m-pred-dpo-q4_k_m.gguf
Normal file
3
gguf/gemma3-270m-pred-dpo-q4_k_m.gguf
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
version https://git-lfs.github.com/spec/v1
|
||||||
|
oid sha256:715887b6f0fff9ebb8c67f1b5d7d489115c8139a221da99a184008b27fe89b6f
|
||||||
|
size 253114496
|
||||||
3
model.safetensors
Normal file
3
model.safetensors
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
version https://git-lfs.github.com/spec/v1
|
||||||
|
oid sha256:4663626a0a163c63c56eac8a44ec1843e1127f4d08f0898ffc86a8cefe0b5f1d
|
||||||
|
size 536223056
|
||||||
33
special_tokens_map.json
Normal file
33
special_tokens_map.json
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
{
|
||||||
|
"boi_token": "<start_of_image>",
|
||||||
|
"bos_token": {
|
||||||
|
"content": "<bos>",
|
||||||
|
"lstrip": false,
|
||||||
|
"normalized": false,
|
||||||
|
"rstrip": false,
|
||||||
|
"single_word": false
|
||||||
|
},
|
||||||
|
"eoi_token": "<end_of_image>",
|
||||||
|
"eos_token": {
|
||||||
|
"content": "<eos>",
|
||||||
|
"lstrip": false,
|
||||||
|
"normalized": false,
|
||||||
|
"rstrip": false,
|
||||||
|
"single_word": false
|
||||||
|
},
|
||||||
|
"image_token": "<image_soft_token>",
|
||||||
|
"pad_token": {
|
||||||
|
"content": "<pad>",
|
||||||
|
"lstrip": false,
|
||||||
|
"normalized": false,
|
||||||
|
"rstrip": false,
|
||||||
|
"single_word": false
|
||||||
|
},
|
||||||
|
"unk_token": {
|
||||||
|
"content": "<unk>",
|
||||||
|
"lstrip": false,
|
||||||
|
"normalized": false,
|
||||||
|
"rstrip": false,
|
||||||
|
"single_word": false
|
||||||
|
}
|
||||||
|
}
|
||||||
3
tokenizer.json
Normal file
3
tokenizer.json
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
version https://git-lfs.github.com/spec/v1
|
||||||
|
oid sha256:4667f2089529e8e7657cfb6d1c19910ae71ff5f28aa7ab2ff2763330affad795
|
||||||
|
size 33384568
|
||||||
3
tokenizer.model
Normal file
3
tokenizer.model
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
version https://git-lfs.github.com/spec/v1
|
||||||
|
oid sha256:1299c11d7cf632ef3b4e11937501358ada021bbdf7c47638d13c0ee982f2e79c
|
||||||
|
size 4689074
|
||||||
51345
tokenizer_config.json
Normal file
51345
tokenizer_config.json
Normal file
File diff suppressed because it is too large
Load Diff
3
training_args.bin
Normal file
3
training_args.bin
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
version https://git-lfs.github.com/spec/v1
|
||||||
|
oid sha256:55432984ffcbbe5c0237dced295ae3c876eb65e96e61bcd33dc662e0d3f5e1a5
|
||||||
|
size 6737
|
||||||
Reference in New Issue
Block a user