GeneLab commited on
Commit
0fb999f
·
verified ·
1 Parent(s): 745f8a1

3LM-MLX: 35.66M / 367.6M tokens pretrained + SFT

Browse files
Files changed (8) hide show
  1. LICENSE +21 -0
  2. NOTICE +149 -0
  3. README.md +134 -0
  4. config.json +12 -0
  5. metrics.json +7 -0
  6. model.safetensors +3 -0
  7. tokenizer.json +1 -0
  8. tokenizer.model +3 -0
LICENSE ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ MIT License
2
+
3
+ Copyright (c) 2026 hiroki-abe-58
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
NOTICE ADDED
@@ -0,0 +1,149 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ 3LM-MLX
2
+ Copyright (c) 2026 hiroki-abe-58
3
+
4
+ このリポジトリのコード(src/, data/, eval/, tools/, scripts/, web/, server.py)は
5
+ MIT License で提供しています。LICENSE を参照してください。
6
+
7
+
8
+ ================================================================================
9
+ 学習済みモデルについて
10
+ ================================================================================
11
+
12
+ 3LM は2段階で学習しています。
13
+
14
+ 1. 事前学習: 大規模な日本語テキストで「次のトークン予測」を学ぶ
15
+ 2. SFT : 対話データセットで「質問に答える形」に合わせる
16
+
17
+ どちらの段階も、**ShareAlike(継承)条件を持たないライセンスのデータだけ**を
18
+ 使っています。学習済みの重みを Apache License 2.0 相当の条件で配布するためで、
19
+ 継承条件つきのデータ(CC BY-SA など)は、その条件が重みに及ぶかどうかが
20
+ 明確でないため意図的に採用していません。
21
+
22
+ 日本語の大規模コーパスとして真っ先に候補になる Wikipedia は CC BY-SA
23
+ なので、この方針のもとでは使えません。代わりに ODC-By の FineWeb2 と
24
+ CC BY の青空文庫を使っています。
25
+
26
+
27
+ --------------------------------------------------------------------------------
28
+ 1. 事前学習コーパス
29
+ --------------------------------------------------------------------------------
30
+
31
+ FineWeb 2(jpn_Jpan サブセット)
32
+ https://huggingface.co/datasets/HuggingFaceFW/fineweb-2
33
+ Copyright (c) HuggingFace and contributors
34
+ Licensed under the Open Data Commons Attribution License (ODC-By) v1.0
35
+ https://opendatacommons.org/licenses/by/1-0/
36
+ revision: af9c13333eb981300149d5ca60a8e9d659b276b9
37
+
38
+ ODC-By 1.0 は帰属表示を求めるライセンスで、継承条件は持ちません。
39
+ FineWeb 2 は Common Crawl 由来のため、元のウェブページそれぞれの
40
+ 権利は各著作権者に属します。
41
+
42
+ 青空文庫(クリーニング済み)
43
+ https://huggingface.co/datasets/globis-university/aozorabunko-clean
44
+ Copyright (c) globis-university
45
+ Licensed under Creative Commons Attribution 4.0 International (CC BY 4.0)
46
+ https://creativecommons.org/licenses/by/4.0/
47
+ revision: 42a9c9c0f1d67e6a5554d9bea4201973dc9b049c
48
+
49
+ 原典は青空文庫(https://www.aozora.gr.jp/)で公開されている、
50
+ 著作権保護期間が満了した作品です。
51
+
52
+ 加えた変更:
53
+
54
+ - 1文書1行のプレーンテキストに整形した(改行と空白を半角スペースに置換)
55
+ - ナビゲーション・Cookie 通知・著作権表示などの定型行を除去した
56
+ - 日本語文字の比率が 70% 未満の文書を除外した
57
+ - 200文字未満の文書を除外し、20,000文字を超える文書は切り詰めた
58
+ - 同じ文字並びが繰り返される文書(表の残骸など)を除外した
59
+ - 先頭200文字のハッシュで重複を除去した
60
+ - アダルト誘導・エラーページと判定した文書を除外した
61
+ - 青空文庫の割合を全体の約10%に抑えた
62
+
63
+ 以上の処理は data/prepare_pretrain.py に実装されています。
64
+ 使用したシャード名とその SHA256、除外の内訳、各ソースの構成比は
65
+ data/corpus_pretrain.manifest.json に記録してあります。
66
+
67
+ 整形後のコーパス自体はリポジトリに含めていません(数GBあります)。
68
+ revision を固定してあるので、data/prepare_pretrain.py を実行すると
69
+ 同じものが再現できます。
70
+
71
+
72
+ --------------------------------------------------------------------------------
73
+ 2. SFT(対話)コーパス
74
+ --------------------------------------------------------------------------------
75
+
76
+ 以下はいずれも Apache License 2.0 で、ShareAlike 条件を持ちません。
77
+
78
+ OpenAssistant Conversations Dataset (OASST1 / OASST2)
79
+ https://huggingface.co/datasets/OpenAssistant/oasst1
80
+ https://huggingface.co/datasets/OpenAssistant/oasst2
81
+ Copyright (c) OpenAssistant / LAION-AI contributors
82
+ Licensed under the Apache License, Version 2.0
83
+
84
+ oasst1-89k-ja(OASST1 を Google 翻訳で日本語化したもの)
85
+ https://huggingface.co/datasets/kunishou/oasst1-89k-ja
86
+ Licensed under the Apache License, Version 2.0
87
+
88
+ oasst2-33k-ja(OASST2 の英語サブセットを DeepL で日本語化したもの)
89
+ https://huggingface.co/datasets/llm-jp/oasst2-33k-ja
90
+ Copyright (c) LLM-jp
91
+ Licensed under the Apache License, Version 2.0
92
+
93
+ magpie-sft-v1.0(Magpie 法による日本語合成対話データ)
94
+ https://huggingface.co/datasets/llm-jp/magpie-sft-v1.0
95
+ Copyright (c) LLM-jp
96
+ Licensed under the Apache License, Version 2.0
97
+ 生成に用いられたモデル: cyberagent/calm3-22b-chat (Apache-2.0),
98
+ Qwen/Qwen2.5-32B-Instruct (Apache-2.0)
99
+
100
+ Magpie-Tanuki-8B-97k(Magpie 法による日本語合成対話データ)
101
+ https://huggingface.co/datasets/Aratako/Magpie-Tanuki-8B-97k
102
+ Copyright (c) Aratako
103
+ Licensed under the Apache License, Version 2.0
104
+ 生成に用いられたモデル: weblab-GENIAC/Tanuki-8B-dpo-v1.0 (Apache-2.0)
105
+
106
+ Apache License, Version 2.0 の全文は licenses/Apache-2.0.txt に同梱しています。
107
+ 原文: http://www.apache.org/licenses/LICENSE-2.0
108
+
109
+ 加えた変更(Apache License 2.0 Section 4(b) に基づく記載):
110
+
111
+ - OASST1 では prompter と assistant のペアを parent_id から復元した
112
+ - conversations / messages 形式のデータセットでは、隣り合う user と
113
+ assistant の発言を取り出して1組の会話にした(3ターン目以降は分割)
114
+ - 翻訳失敗フラグ(ng_translation == "1")の立ったレコードを除外した
115
+ - 翻訳の崩れたレコードを、質問と返答の一致・短い並びの過剰な反復を
116
+ 手がかりに除外した(oasst2-33k-ja には翻訳失敗フラグがないため)
117
+ - 質問・返答の長さでフィルタし、重複を除去した
118
+ - 出現頻度の低い文字を含む会話を除外した
119
+ - 改行を半角スペースに置換し、1行1会話のプレーンテキストに整形した
120
+
121
+ 以上の処理は data/prepare_sft.py に実装されています。
122
+ どのデータセットを使ったかは data/prepare_sft.py --list-sources で確認できます。
123
+
124
+
125
+ ================================================================================
126
+ 制作にあたって
127
+ ================================================================================
128
+
129
+ このリポジトリのコードと文書は、AI コーディング支援ツールを用いて
130
+ 書かれています。学習データは、上記のとおり継承条件を持たないライセンスで
131
+ 公開されているデータセットのみで構成しています。
132
+
133
+ 学習データの生成に、出力の学習利用を禁じている商用サービス
134
+ (Anthropic Claude など)は一切使っていません。
135
+
136
+
137
+ ================================================================================
138
+ 免責
139
+ ================================================================================
140
+
141
+ 本モデルの出力は、学習コーパスの統計から次のトークンを予測し続けた結果にすぎません。
142
+ 事実性・正確性は一切保証されず、実在の人物・団体・製品について
143
+ 誤った内容を断定的に出力する場合があります。
144
+
145
+ 事前学習コーパスは Common Crawl 由来のウェブテキストを含むため、
146
+ 偏りや不適切な表現を含む可能性があります。品質フィルタは掛けていますが、
147
+ 完全ではありません。
148
+
149
+ 出力をそのまま公開の場に掲載する場合は、機械生成物である旨を明記してください。
README.md ADDED
@@ -0,0 +1,134 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ language:
3
+ - ja
4
+ license: apache-2.0
5
+ library_name: mlx
6
+ tags:
7
+ - mlx
8
+ - apple-silicon
9
+ - japanese
10
+ - text-generation
11
+ - from-scratch
12
+ datasets:
13
+ - HuggingFaceFW/fineweb-2
14
+ - globis-university/aozorabunko-clean
15
+ - kunishou/oasst1-89k-ja
16
+ - llm-jp/oasst2-33k-ja
17
+ - llm-jp/magpie-sft-v1.0
18
+ - Aratako/Magpie-Tanuki-8B-97k
19
+ pipeline_tag: text-generation
20
+ ---
21
+
22
+ # 3LM-MLX
23
+
24
+ M1 Max (64GB) 1台で、一晩で事前学習から作った日本語の小さな言語モデルです。
25
+
26
+ ## 概要
27
+
28
+ | 項目 | 値 |
29
+ |---|---|
30
+ | パラメータ数 | 35,658,240 |
31
+ | 非埋め込みパラメータ | 19,274,240 |
32
+ | 語彙 | 32,000 (SentencePiece unigram / byte fallback) |
33
+ | 文脈長 | 512 |
34
+ | 層 / 次元 / ヘッド | 6 / 512 / 8 |
35
+ | 構成 | RoPE / RMSNorm / SwiGLU / bias なし / weight tying |
36
+ | 事前学習トークン | 367,607,808 |
37
+ | 事前学習コーパス | 1,199,015,862 文字 |
38
+ | 学習環境 | Apple M1 Max 64GB / MLX |
39
+
40
+ ## 評価
41
+
42
+ 同じサンプリング条件 (temperature 0.8 / top_k 40 / repetition_penalty 1.15 / seed 777) で測っています。
43
+
44
+ | 指標 | 3LM-MLX | 前作 (2LM-MLX) | 差 |
45
+ |---|---|---|---|
46
+ | bits/char (低いほど良い) | 2.801 | 2.540 | +0.261 (悪化) |
47
+ | 反復率 (低いほど良い) | 0.300 | 0.100 | +0.200 (悪化) |
48
+ | 主題保持率 (高いほど良い) | 0.667 | 0.733 | -0.066 (悪化) |
49
+ | 破綻率 (低いほど良い) | 0.000 | 0.000 | +0.000 (変化なし) |
50
+
51
+ 検証セット: `holdout_clean.txt` (220 行)。学習データから除いたうえで、**部分一致でも混入していないことを検査してから**測っています。
52
+
53
+ ### 検証セットを変えると、勝敗が変わります
54
+
55
+ 上の表は「公開データ由来の会話」で測ったものです。前作はその公開データで**事前学習した**モデルなので、そこは前作の得意分野にあたります。土俵を変えて、同じ bits/char (低いほど良い) で並べます。
56
+
57
+ | モデル | A 公開データ由来の会話 | B Web文+青空文庫 |
58
+ |---|---|---|
59
+ | 2LM 13.81M | 2.540 | 6.481 |
60
+ | 3LM 35.66M 事前学習のみ | 3.381 | 3.680 |
61
+ | 3LM 35.66M SFT済み | 2.801 | 4.651 |
62
+ | 3LM 35.66M 口調あり | 3.154 | 4.901 |
63
+
64
+ 一般的な日本語の文 (土俵B) では前作を大きく上回ります。**bits/char は分母が文字数なので、語彙の大きさが違うモデル同士でも比べられます。**
65
+
66
+ ## 使い方
67
+
68
+ ```bash
69
+ pip install mlx numpy sentencepiece
70
+ ```
71
+
72
+ ```python
73
+ from huggingface_hub import snapshot_download
74
+ from src.generate import load_bundle, chat_stream
75
+
76
+ path = snapshot_download("GeneLab/3LM-MLX")
77
+ model, tokenizer = load_bundle(path)
78
+ for piece in chat_stream(model, tokenizer, [], "日本の首都はどこですか"):
79
+ print(piece, end="", flush=True)
80
+ ```
81
+
82
+ `load_bundle` と `chat_stream` は学習に使ったリポジトリ (https://github.com/hiroki-abe-58/3LM-MLX) に入っています。
83
+
84
+ ## 学習の流れ
85
+
86
+ 1. **事前学習**: FineWeb2 の日本語 + 青空文庫から作ったコーパスで、次のトークンを当てる学習
87
+ 2. **SFT (指示学習)**: 対話データで書式を合わせる。損失は `<|assistant|>` より後ろと `<|end|>` だけに掛けています (instruction masking)
88
+
89
+ SFT で損失を数えたトークンの割合: 77.2% (会話 57,434 件)
90
+
91
+ ## 学習データと帰属表示
92
+
93
+ ### 事前学習
94
+
95
+ | データ | ライセンス | 使った量 |
96
+ |---|---|---|
97
+ | [HuggingFaceFW/fineweb-2](https://huggingface.co/datasets/HuggingFaceFW/fineweb-2) (`jpn_Jpan`) | **ODC-By 1.0** | 1,080,000,054 文字 (90.1%) |
98
+ | [globis-university/aozorabunko-clean](https://huggingface.co/datasets/globis-university/aozorabunko-clean) | **CC BY 4.0** | 119,015,882 文字 (9.9%) |
99
+
100
+ FineWeb2 は Common Crawl から作られたデータセットで、ODC-By 1.0 に従い帰属を表示します。青空文庫版 (globis-university/aozorabunko-clean) は CC BY 4.0 です。どちらも継承条件 (ShareAlike) が無いため、この重みを Apache-2.0 相当で配布できます。
101
+
102
+ 再現性のため、使用した revision と各シャードの SHA256 を構築スクリプトの manifest に記録しています (FineWeb2 `af9c13333eb9` / 青空文庫 `42a9c9c0f1d6`)。コーパス本体は再ホストせず、スクリプトと manifest で再現できる形にしています。
103
+
104
+ 適用したフィルタ: 日本語文字比率 70% 以上 / 200〜20,000文字 / 定型文とエラーページの除去 / 重複除去 / 同一並びの繰り返し検出。
105
+
106
+ ### SFT
107
+
108
+ | データ | ライセンス |
109
+ |---|---|
110
+ | [kunishou/oasst1-89k-ja](https://huggingface.co/datasets/kunishou/oasst1-89k-ja) | Apache-2.0 |
111
+ | [llm-jp/oasst2-33k-ja](https://huggingface.co/datasets/llm-jp/oasst2-33k-ja) | Apache-2.0 |
112
+ | [llm-jp/magpie-sft-v1.0](https://huggingface.co/datasets/llm-jp/magpie-sft-v1.0) | Apache-2.0 |
113
+ | [Aratako/Magpie-Tanuki-8B-97k](https://huggingface.co/datasets/Aratako/Magpie-Tanuki-8B-97k) | Apache-2.0 |
114
+
115
+ 継承条件のあるデータ (CC BY-SA など) は、配布ライセンスの整合が崩れるため意図的に使っていません。
116
+
117
+ ## 制限
118
+
119
+ - **35,658,240 パラメータ**しかありません。事実を答える能力はほとんど期待できません。知識の参照には使えません
120
+ - 学習データの大半が Common Crawl 由来のウェブ文書なので、**そこに含まれる偏りや不適切な表現を引き継いでいる可能性があります**
121
+ - 青空文庫を約10%混ぜているため、文語的な言い回しが出ることがあります
122
+ - 商用利用の可否は、上記データセット各々のライセンスもご確認ください
123
+ - 事前学習コーパスは Common Crawl 由来のため、メールアドレスや電話番号が含まれています。学習後に prefix attack で 60 件試したところ、**そのまま復元できたものはありませんでした** (コーパスを1周未満しか読んでいないため)。ただし、より強い攻撃で引き出せない保証はありません
124
+
125
+ ## ライセンス
126
+
127
+ - 重み: Apache-2.0 相当
128
+ - 学習コード: MIT (https://github.com/hiroki-abe-58/3LM-MLX)
129
+ - 学習データの帰属: 上記のとおり (ODC-By 1.0 / CC BY 4.0 / Apache-2.0)
130
+
131
+ ## 実測値のメモ
132
+
133
+ - 1トークンあたり **2.101 文字** (語彙 32,000 / ウェブ文書)
134
+ - コーパス 1,199,015,862 文字 = 570,676,120 トークン (うち学習に使ったのは 569,281,544)
config.json ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "vocab_size": 32000,
3
+ "block_size": 512,
4
+ "n_layer": 6,
5
+ "n_head": 8,
6
+ "n_embd": 512,
7
+ "dropout": 0.05,
8
+ "arch": "3lm",
9
+ "mlp_hidden": 1408,
10
+ "rope_theta": 10000.0,
11
+ "norm_eps": 1e-05
12
+ }
metrics.json ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ {
2
+ "step": 2069,
3
+ "val_loss": 3.3296,
4
+ "stage": "sft",
5
+ "instruction_masking": true,
6
+ "mask_ratio": 0.7725
7
+ }
model.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:b452d436f32b00562baa0124d0834d895848f8f84d38de30a2d54ff9b09ff3ff
3
+ size 142637086
tokenizer.json ADDED
@@ -0,0 +1 @@
 
 
1
+ {"type": "subword", "vocab_size": 32000}
tokenizer.model ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:b52694eb9832e97044081a3e2f893666225b9e5bf22c5fd32a3ce5cefcb4fbb8
3
+ size 572877