pico-hiragana-3.8M-base-5BT
[!WARNING] Directed and developed by GPT-6 Astra Pro and prayed by me.
2000語彙・約385万パラメータのひらがな中心日本語モデル。
この版は、学習時のSentencePiece IDを維持したまま、AutoTokenizer、
AutoModelForCausalLM、apply_chat_templateのAPIで利用するための配布形式です。
利用者が独自のHiraganaTokenizerをimportしたり、sys.pathを変更したりする必要はありません。
検証状況: 実際の添付SentencePieceモデルと学習時アダプタを比較した31テストは成功。
作成環境でTransformersをインストールできなかったため、Autoクラスの動的ロード・モデル生成・
pipelineの実行はまだ未検証です。公開前にpython check_transformers.pyを実行してください。
コードは学習時と同じTransformers 5.12.1 の公式ソースに合わせて作成しています。
インストール
学習に用いたCUDA対応PyTorch環境はそのまま使えます。
python -m pip install "transformers[sentencepiece]==5.12.1" "sentencepiece==0.2.1"
Torch未導入の環境では、対象CPU/GPUに適したPyTorchも別途導入してください。
「Transformersからロードできる」は、依存パッケージがTransformers一つだけという意味ではありません。
Tokenizerの内部にはSentencePiece、モデルの内部にはPyTorchを使用します。
transformersの任意の旧版での動作は保証しません。
TransformersのAPIだけでロードして生成
from transformers import AutoTokenizer, AutoModelForCausalLM
import torch
MODEL_ID = "kurogane/pico-hiragana-3.8M-base-5BT"
tokenizer = AutoTokenizer.from_pretrained(
MODEL_ID,
trust_remote_code=True,
)
model = AutoModelForCausalLM.from_pretrained(
MODEL_ID,
device_map="auto",
).eval()
# 入力は「ひらがな」に限定してください。
messages = [{"role": "user", "content": "こんにちは。"}]
with torch.no_grad():
inputs = tokenizer.apply_chat_template(
messages,
add_generation_prompt=True,
return_dict=True,
return_tensors="pt",
)
outputs = model.generate(
**inputs,
max_new_tokens=64,
do_sample=False,
use_cache=False,
eos_token_id=[tokenizer.eos_token_id, tokenizer.convert_tokens_to_ids("<eot>")],
pad_token_id=tokenizer.pad_token_id,
repetition_penalty=1.3,
)
new_ids = outputs[0, inputs["input_ids"].shape[1]:]
print(tokenizer.decode(new_ids, skip_special_tokens=True))
repetition_penalty=1.3をつけるとちょっとそれっぽい返答が来たり来なかったりします。
GPUを使う場合は、model = model.to("cuda")とinputs = inputs.to("cuda")を追加します。
generate()の中では勾配計算が無効化されるため、このサンプルに独自の推論ラッパーは不要です。
入力と生成を合わせて、まずは学習時の系列長2048以内で確認してください。
未知文字も符号化できますが、漢字をひらがなへ変換する機能はTokenizerにはありません。
リモートコードについて
trust_remote_code=Trueが必要なのはTokenizerです。次の2ファイルがHubからロードされます。
tokenization_pico_hiragana.py: TransformersのPythonBackendを継承したアダプタhiragana_tokenizer_core.py: 学習時と同じSentencePiece符号化・チャットID処理
コードを確認し、公開Hubから利用する際はrevision="確認済みコミットSHA"をTokenizerとモデルの両方へ指定してください。
モデル本体はTransformers標準のqwen3_5_text → Qwen3_5ForCausalLMを使用します。
独自のmodeling_*.pyやAutoModel.register()は不要です。
コード内にファイル削除、プロセス起動、外部APIへの本文送信はありません。
初回のモデル・コード取得はTransformers/Hugging Face Hubの通常のダウンロード処理です。
チャットではない通常の文章補完
inputs = tokenizer("むかしむかし、", return_tensors="pt")
outputs = model.generate(**inputs, max_new_tokens=64, use_cache=False)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))
通常のtokenizer(text)はBOS + 本文、EOSなしです。
tokenizer(text, add_special_tokens=False)は元のencode_text(text)と同じ本文IDになります。
BOS/EOSの挿入方針を変更する場合はロード時にpico_add_bos_token、pico_add_eos_tokenを指定できます。
この方針は通常本文用で、チャットの構造IDは学習時の固定形式です。
Pipeline(公開前の統合テスト対象)
from transformers import pipeline
generator = pipeline(
"text-generation",
model=MODEL_ID,
trust_remote_code=True,
device=-1,
)
result = generator(
[{"role": "user", "content": "こんにちは。"}],
max_new_tokens=64,
do_sample=False,
use_cache=False,
)
print(result[0]["generated_text"])
この例はcheck_transformers.pyの検証対象です。作成環境ではpipelineの実行結果を確認していません。
モデル/Tokenizerを別途ロードしてpipeline(..., model=model, tokenizer=tokenizer)へ渡す方式も使用します。
外部推論エンジン全般、GGUF、ONNX、vLLMとの互換性はこの変換の対象外です。
Tokenizer互換性で維持したもの
学習済み重み、モデルconfig、SentencePiece .modelは元のファイルとバイト単位で同じです。
2000個すべてのpieceのID、BOS=1、EOS=2、PAD=3、EOT=8も維持しています。
新しいトークンを追加したり、Embeddingをresizeしたり、SentencePieceを再学習したりしていません。
| 項目 | 挙動 |
|---|---|
| かな・英数字・記号・空白 | identity処理を維持 |
| 改行・タブ・制御文字 | 学習時と同じbyte ID |
実文字▁と▅ | 内部記号との衝突を避けてbyte IDにする |
| 未収録のUnicode文字 | 256個のbyte fallbackで符号化 |
本文中の<assistant>など | 構造トークンに昇格せず、普通の本文として符号化 |
| 会話構造 | apply_chat_template()が役割IDを直接挿入 |
| 通常本文の復元 | decode(..., skip_special_tokens=True) |
| 構造IDを含む表示 | decode(..., skip_special_tokens=False) |
なぜtokenizer.jsonだけのFast版ではないのか
このTokenizerには、SentencePiece本体の前に改行等をbyte IDへ変換する独自処理があります。
また、本文の特殊トークン風文字列と、チャットの本物の構造IDを区別しています。
ここではID互換性を優先し、元のSentencePieceモデルを包むPython版Tokenizerにしています。
is_fast=Falseは仕様で、AutoTokenizer非対応という意味ではありません。
Fast版としてのoffset mappingや、Rustだけで実行する配布物は提供していません。
apply_chat_template(tokenize=False)の注意
この呼出しは可読表示用の文字列を返します。
その文字列を再度tokenizer(...)に渡しても、元のチャットIDにはなりません。
本文に本物の<assistant>という文字列が含まれる可能性を壊さず扱うため、通常の文字列encodeでは構造トークンを認識させていません。
モデル入力には常にapply_chat_template(..., tokenize=True)を使用してください。
chat_template.jinjaも同梱していますが、固定テンプレートの表示/文書化用途です。
任意のJinjaテンプレートへの差し替え、ツールのJSON Schema注入、画像/音声contentは未対応です。
system/user/assistant/toolの文字列content、複数会話のバッチ、padding、truncation、
booleanのcontinue_final_message、assistant maskに対応する実装を用意しています。
assistant maskではassistant本文とそのEOTを1とし、役割・BOS/EOS・PADは0とします。
再保存
tokenizer.save_pretrained("./saved_release")
model.save_pretrained("./saved_release", safe_serialization=True)
# model configとTokenizerを同じディレクトリへ保存した状態で再ロード
reloaded = AutoTokenizer.from_pretrained("./saved_release", trust_remote_code=True)
save_pretrained()時にカスタムTokenizerのPythonファイルと相対import先もコピーするため、
新しい保存先へ移した後も独自のimport文は不要です。上の流れは統合テストに含めています。
モデルと学習データ
この変換は新たな学習ではありません。元チェックポイントの主要仕様は次のとおりです。
| 項目 | 値 |
|---|---|
| クラス / model_type | Qwen3_5ForCausalLM / qwen3_5_text |
| パラメータ数 | 3,846,832(保存されたテンソル要素から確認) |
| 層 | Gated DeltaNet 6層 + full attention 2層 |
| hidden / FFN | 192 / 512 |
| Embedding / LM Head | 共有するconfig |
| 保存重み | FP32、15,398,936 bytes |
| Tokenizer | SentencePiece Unigram、2000 IDs |
| 学習系列長 | 2048 |
| configの位置上限 | 4096(その長さでの性能評価を意味しない) |
青空文庫30%、対話70%の50億入力トークンを準備した記録が含まれます。
うち4,569,905,001トークンは2周目以降の反復であり、ユニークな文章を50億トークン収集したという意味ではありません。
5BTはデータ側の規模であって、モデルが50億パラメータという意味ではありません。
詳しい数値はmetadata/data_stats.jsonとmetadata/model_facts.jsonを参照してください。
追加された学習ノートブックのTrainOutput転記はmetadata/notebook_training_metrics.jsonに分離しています。
訓練lossは検証lossや品質ベンチマークではありません。
チャット形式の事前学習モデルであり、独立したinstruction tuningや安全性評価済みモデルとは表記していません。 Qwen開発元の公式モデルではありません。音声・画像・動画用の予約IDはありますが、モデルはテキスト専用です。 ライセンスは公開者の確定待ちで、既存の重みの利用条件をこの変換で変更していません。 元データ全体、個人環境の絶対パス、認証情報は配布物に含めていません。
検証
# 実SentencePiece+元アダプタとID比較。Transformersなしでも実行可能。
python -m unittest discover -s tests -p test_core.py -v
# 実際のAutoTokenizerの動的ロード、encode/decode、padding、保存再読込
python check_transformers.py --tokenizer-only
# 上記に加え、AutoModel、forward/loss、generate、pipeline
python check_transformers.py --report local_outputs/transformers_check.json
check_transformers.pyは依存パッケージ不足を成功やスキップ扱いにせず、エラー終了します。
統合検証に成功してから公開することを想定しています。Hubへの実アップロード/ネットワークロードはまだ実施していません。
詳細はdocs/VALIDATION.md、変換前後のhashはmetadata/conversion.jsonを参照してください。