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