File size: 7,033 Bytes
5524075
 
 
 
 
 
3f3fb92
 
455ef33
3f3fb92
8f01f89
3f3fb92
6233e47
740d1ba
931d015
740d1ba
 
8f01f89
3f3fb92
455ef33
1a95ee1
 
6233e47
1a95ee1
3f3fb92
 
 
1dc8a0c
3f3fb92
6233e47
1dc8a0c
3f3fb92
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6233e47
5524075
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1a95ee1
 
 
 
 
 
 
a7ba1f7
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
---
license: mit
language:
- ja
---

## nanochat-jp_base

karpathyさん(元スタンフォード、元テスラ、元OpenAI)の教育目的PJである[nanochat](https://github.com/karpathy/nanochat) のd20版を日本語データ [kajuma/ABEJA-CC-JA-edu 10%](https://huggingface.co/datasets/kajuma/ABEJA-CC-JA-edu) を使って事前学習させたモデルです。  

事前学習のみのため、入力された文章の続きを書く事(補完)しかできませんが、日本語が問題なく補完できることは確認済です。  

このリポジトリに格納されているモデルをホームディレクトリ(~/.cache/nanochat/)に  

- base_checkpoints_jp  
- tokenizer

として配置する事で、学習の続きとしてmid train(中間学習), SFT(教師あり微調整), RL(強化学習)を実行する事ができると思います。  

中間学習, 教師あり微調整, 強化学習は比較的少ないデータで実行可能なのでノード数とバッチサイズを減らせばH100 x 8台をレンタルせずともローカルPCなどで試行錯誤が実行可能です。  


### 事前学習実行時ログ
[wandb](https://wandb.ai/dahara1/nanochat-jp/runs/6wobnudj?nw=nwuserdahara1)

## 単体動作確認スクリプト

Linux 前提です。文章の続きの補完のみです。  

1. [nanochat](https://github.com/karpathy/nanochat)をgit clone
2. speedrun.shを動かす(失敗するが仮想環境.venvは作ってくれる)
3. source .venv/bin/activate
4. ~/.cache/nanochat/に本リポジトリのbase_checkpoints_jpとtokenizerを配置
5. 以下のスクリプトをnanochatディレクトリ配下で動かす

```
# test_pretrained_jp.py

import os
import sys
sys.path.append(os.getcwd())

import torch
from nanochat.common import get_base_dir
from nanochat.checkpoint_manager import load_model_from_dir

# --- 設定 ---
MODEL_DIR_NAME = "base_checkpoints_jp"
MODEL_TAG = "d20"
STEP = None
MAX_NEW_TOKENS = 100
TEMPERATURE = 0.7
TOP_K = 50

# --- メイン実行部 ---
if __name__ == "__main__":
    print("--- 事前学習済み日本語モデル テストスクリプト ---")
    
    device = 'cuda' if torch.cuda.is_available() else 'cpu'
    print(f"使用デバイス: {device}")

    use_bf16 = (device == 'cuda' and torch.cuda.is_bf16_supported())
    autocast_ctx = torch.amp.autocast(device_type=device, dtype=torch.bfloat16, enabled=use_bf16)
    if use_bf16:
        print("bfloat16がサポートされています。混合精度で推論を実行します。")

    base_dir = get_base_dir()
    checkpoints_dir = os.path.join(base_dir, MODEL_DIR_NAME)
    
    print(f"モデルを次のパスから読み込みます: {os.path.join(checkpoints_dir, MODEL_TAG)}")
    if not os.path.exists(os.path.join(checkpoints_dir, MODEL_TAG)):
        print("\nFATAL: モデルディレクトリが見つかりません。")
        print(f"ローカルの '{checkpoints_dir}' 以下に 'd20' などのディレクトリとしてモデルファイルが配置されているか確認してください。")
        sys.exit(1)

    model, tokenizer, meta = load_model_from_dir(
        checkpoints_dir, device, phase="eval", model_tag=MODEL_TAG, step=STEP
    )
    
    print("\nモデルとトークナイザーのロードが完了しました。")
    print("事前学習済みモデルは、対話ではなく『文章の続き』を生成します。")
    
    while True:
        try:
            user_input = input("\nプロンプトを入力してください (終了するにはCtrl+C): ")
            if not user_input:
                continue

            prompt_tokens = tokenizer.encode(user_input, prepend=tokenizer.get_bos_token_id())
            
            print("-" * 30)
            print("生成開始...")
            print("入力プロンプト: ", user_input, end="")

            with torch.no_grad():
                with autocast_ctx:
                    stream = model.generate(prompt_tokens, max_tokens=MAX_NEW_TOKENS, temperature=TEMPERATURE, top_k=TOP_K)
                    
                    for token in stream:
                        print(tokenizer.decode([token]), end="", flush=True)

            print("\n" + "-" * 30)

        except KeyboardInterrupt:
            print("\n終了します。")
            break
        except Exception as e:
            print(f"\nエラーが発生しました: {e}")
            break
```

## 学習環境情報

### Hardware
- Platform: Linux
- CPUs: 64 cores (64 logical)
- Memory: 2015.6 GB
- GPUs: 8x NVIDIA H100 80GB HBM3
- GPU Memory: 633.5 GB total
- CUDA Version: 12.8
- Hourly Rate: $24.00/hour

### Software
- Python: 3.11.9
- PyTorch: 2.9.0+cu128

### Bloat
- Characters: 382,832
- Lines: 9,485
- Files: 57
- Tokens (approx): 95,708
- Dependencies (uv.lock lines): 2,004

Run started: 2025-10-16 16:25:24

## Tokenizer evaluation
timestamp: 2025-10-16 16:25:26

### Comparison with GPT-2

| Text Type | Bytes | GPT-2 Tokens | GPT-2 Ratio | Ours Tokens | Ours Ratio | Relative Diff % |
|-----------|-------|--------------|--------------|-------------|------------|-----------------|
| news | 1819 | 404 | 4.50 | 705 | 2.58 | -74.5% |
| korean | 893 | 745 | 1.20 | 729 | 1.22 | +2.1% |
| code | 1259 | 576 | 2.19 | 708 | 1.78 | -22.9% |
| math | 1834 | 936 | 1.96 | 1063 | 1.73 | -13.6% |
| science | 1112 | 260 | 4.28 | 455 | 2.44 | -75.0% |
| japanese | 3618 | 2056 | 1.76 | 630 | 5.74 | +69.4% |

### Comparison with GPT-4

| Text Type | Bytes | GPT-4 Tokens | GPT-4 Ratio | Ours Tokens | Ours Ratio | Relative Diff % |
|-----------|-------|--------------|--------------|-------------|------------|-----------------|
| news | 1819 | 387 | 4.70 | 705 | 2.58 | -82.2% |
| korean | 893 | 364 | 2.45 | 729 | 1.22 | -100.3% |
| code | 1259 | 309 | 4.07 | 708 | 1.78 | -129.1% |
| math | 1834 | 832 | 2.20 | 1063 | 1.73 | -27.8% |
| science | 1112 | 249 | 4.47 | 455 | 2.44 | -82.7% |
| japanese | 3618 | 1458 | 2.48 | 630 | 5.74 | +56.8% |


## Base model training Japanese
timestamp: 2025-10-16 16:17:09

- run: d20-jp-1760620493
- depth: 20
- max_seq_len: 2048
- target_param_data_ratio: 20
- num_iterations: -1
- device_batch_size: 32
- total_batch_size: 524,288
- embedding_lr: 0.2000
- unembedding_lr: 0.0040
- matrix_lr: 0.0200
- weight_decay: 0.0000
- eval_every: 250
- eval_tokens: 10,485,760
- DATASET_REPO_ID: kajuma/ABEJA-CC-JA-edu
- CONFIG_NAME: 10%
- SPLIT: train
- TOTAL_SHARDS: 378
- DOWNLOAD_CACHE_DIR: download_cache_jp
- Number of parameters: 560,988,160
- Number of training tokens: 11,219,763,200
- Minimum validation bpb: 0.6473
- Final validation bpb: 0.6682

## 謝辞
以下の方たちのお力添えがなければこのモデルは完成しませんでした。ありがとうございます!
- karpathyさん
- kajumaさん
- ABEJA社
- 日本語でブログやWebサイトを執筆してくださった皆様

## 解説記事
[$100ドルで買える最高のchatGPT、nanochatの日本語版の開発](https://webbigdata.jp/post-21323/)