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/)
|