llm-jp-4-32b-a3b-thinking — GGUF (Q4_K_M, imatrix calibrated with llm-jp-corpus-v4)
国立情報学研究所の大規模言語モデル研究開発センターが開発した大規模言語モデル、
llm-jp/llm-jp-4-32b-a3b-thinking を GGUF / Q4_K_M に量子化したものです。
本リポジトリの特徴
importance matrix (imatrix) のキャリブレーションに、同モデルの公式事前学習コーパスである
llm-jp-corpus-v4 を直接利用しています。訓練分布と同源の importance matrix を取得しているため、低ビット量子化でも本モデル本来の日本語性能(特に学術ドメイン)が保持される設計です。
キャリブレーションミックス (合計 ~15MB)
研究者ユースケースを想定した 5 サブセットを以下の比率で混合しています:
| サブセット | パス | 役割 | 比率 |
|---|
ja_wiki | ja/ja_wiki/0000.jsonl.gz | 一般日本語・固有名詞 | 25% |
ja_cc | ja/ja_cc/level2/0000.jsonl.gz | 日本語 Web (高品質フィルタ済) | 30% |
ja_kaken | ja/ja_kaken/0000.jsonl.gz | 科研費抄録: 学術日本語 | 15% |
en_wiki | en/en_wiki/0000.jsonl.gz | 英日混在現実 | 15% |
code_stack | code/code_stack/0000.jsonl.gz | Python コード+コメント | 15% |
特に ja_kaken (科研費データベース抄録) を含めたことで、研究者が日常的に扱う「敬体・受動態多用・専門用語混在の論文体日本語」を imatrix に取り込んでいます。
キャリブレーションテキスト本体 (ja_calibration.txt) は元コーパスの著作権 (Wikipedia CC-BY-SA、Common Crawl 由来 Web ページ、科研費抄録、The Stack コード) の再配布リスクを考慮し同梱していません。代わりに混合定義 (corpus_subsets.yaml) と生成スクリプト (fetch_corpus.py + build_calibration.py) を同梱しているため、必要に応じて同じキャリブレーションテキストを再生成できます。
提供ファイル
通常推論用 (推奨)
| File | Quant | Size | Notes |
|---|
llm-jp-4-32b-a3b-thinking-Q4_K_M.gguf | Q4_K_M | ~20GB | imatrix 適用済み。日常用途推奨 |
imatrix.dat | — | ~97MB | 再量子化用 importance matrix |
corpus_subsets.yaml | — | <1KB | キャリブレーションミックスの定義 (再現用レシピ) |
fetch_corpus.py | — | 数KB | corpus_subsets.yaml を読んで GitLab から llm-jp-corpus-v4 の必要シャードのみを取得 |
build_calibration.py | — | 数KB | DL 済みコーパスを混合して ja_calibration.txt を生成 |
再量子化・f16 直接推論用 (上級者向け、合計 ~60GB)
| File | Quant | Size | Notes |
|---|
llm-jp-4-32b-a3b-thinking-f16-00001-of-00003.gguf | F16 | ~30GB | shard 1/3 |
llm-jp-4-32b-a3b-thinking-f16-00002-of-00003.gguf | F16 | ~30GB | shard 2/3 |
llm-jp-4-32b-a3b-thinking-f16-00003-of-00003.gguf | F16 | ~5GB | shard 3/3 |
LLM-jp-4 専用 Unigram tokenizer パッチ + OpenAI Harmony vocab スワップ適用済みの f16 GGUF を、HF の単一ファイル上限を考慮して 3 shard に分割しています。 全 3 shard を同一ディレクトリにダウンロード後、先頭 shard を -m に渡すだけで llama.cpp が自動的に残り shard をマージロードします。
通常推論には Q4_K_M で十分です。 f16 shard は任意ビットへの再量子化、またはA100/H100 80GB クラスでの f16 直接推論向けです。
キャリブレーションテキストの再生成 (任意)
本リポジトリに同梱されている 3 ファイル (corpus_subsets.yaml + fetch_corpus.py + build_calibration.py) で、本量子化に使ったものと同一のキャリブレーションテキストを手元で再生成できます:
1# 1. 本リポジトリを clone (GGUF を除いて軽量に取りたい場合は --filter=blob:none を追加)
2git clone https://huggingface.co/ash2813/llm-jp-4-32b-a3b-thinking-gguf
3cd llm-jp-4-32b-a3b-thinking-gguf
4
5# 2. 依存
6pip install requests pyyaml
7
8# 3. GitLab から llm-jp-corpus-v4 の必要シャードを DL (~1.6GB)
9python fetch_corpus.py corpus_subsets.yaml
10# → ./calibration/raw/llm-jp-corpus-v4/{ja_wiki,ja_cc,ja_kaken,en_wiki,code}/
11
12# 4. 混合してキャリブレーションテキストを生成 (~15MB)
13python build_calibration.py \
14 --corpus-root calibration/raw/llm-jp-corpus-v4 \
15 --out calibration/ja_calibration.txt \
16 --no-fallback
得られた ja_calibration.txt を llama-imatrix に渡せば、本リポジトリ同梱の imatrix.dat と同等の importance matrix が再計算できます (GitLab 上のコーパスシャードがバージョン更新された場合は若干差異が生じます)。
使い方
llama.cpp server (CPU)
1docker run --rm -p 8080:8080 \
2 -v $PWD:/models:ro \
3 ghcr.io/ggml-org/llama.cpp:server \
4 -m /models/llm-jp-4-32b-a3b-thinking-Q4_K_M.gguf \
5 --jinja \
6 --host 0.0.0.0 --port 8080 -c 4096 -t 8
--jinja は harmony chat template を Jinja パーサで解釈するために必須です(未指定だと reasoning_content 分離や tool/role の整形が効きません)。 -t 8 はワーカースレッド数で、実機の物理コア数に合わせて調整してください。 GPU を使う場合は ghcr.io/ggml-org/llama.cpp:server-cuda イメージに切り替え、--gpus all と -ngl 99 を追加します。
OpenAI 互換 chat completions
1curl -s http://localhost:8080/v1/chat/completions \
2 -H 'Content-Type: application/json' \
3 -d '{"messages":[{"role":"user","content":"日本の首都はどこですか?簡潔に。"}],"max_tokens":300}'
応答 (抜粋):
1{
2 "choices": [{
3 "message": {
4 "role": "assistant",
5 "content": "東京です。",
6 "reasoning_content": "The user asks in Japanese: ..."
7 },
8 "finish_reason": "stop"
9 }]
10}
思考過程は reasoning_content フィールドに自動分離されます。
別ビットへの再量子化
本リポジトリ同梱の f16 shard と imatrix.dat があれば、任意のビット (Q3_K_M / Q5_K_M / Q6_K / Q8_0 等) を 1 コマンドで生成できます:
1# 全 shard と imatrix.dat を同一ディレクトリに用意してから:
2llama-quantize --imatrix imatrix.dat \
3 --output-tensor-type Q8_0 \
4 llm-jp-4-32b-a3b-thinking-f16-00001-of-00003.gguf \
5 llm-jp-4-32b-a3b-thinking-Q5_K_M.gguf Q5_K_M
llama.cpp が先頭 shard から残り 2 shard を自動的に検出して読み込みます。 convert/imatrix 計算は不要で、llama-quantize 1 ステップで完了します。
--output-tensor-type Q8_0 は出力射影層を Q8_0 に固定するオプションで、harmony chat-template の長文プロンプト下での argmax 安定性に寄与します (本リポジトリの Q4_K_M も同オプション付きで生成済み)。サイズは数百 MB 増えますが、付けておくのが安全です。
ライセンス・元モデル
謝辞
- LLM-jp プロジェクト (NII) のモデルおよびコーパス公開に深く感謝します
- 先行参考実装: mmnga-o/llm-jp-4-32b-a3b-thinking-gguf