nanochat-jp_base
karpathyさん(元スタンフォード、元テスラ、元OpenAI)の教育目的PJであるnanochat のd20版を日本語データ kajuma/ABEJA-CC-JA-edu 10% を使って事前学習させたモデルです。
事前学習のみのため、入力された文章の続きを書く事(補完)しかできませんが、日本語が問題なく補完できることは確認済です。
このリポジトリに格納されているモデルをホームディレクトリ(~/.cache/nanochat/)に
- base_checkpoints_jp
- tokenizer
として配置する事で、学習の続きとしてmid train(中間学習), SFT(教師あり微調整), RL(強化学習)を実行する事ができると思います。
中間学習, 教師あり微調整, 強化学習は比較的少ないデータで実行可能なのでノード数とバッチサイズを減らせばH100 x 8台をレンタルせずともローカルPCなどで試行錯誤が実行可能です。
事前学習実行時ログ
単体動作確認スクリプト
Linux 前提です。文章の続きの補完のみです。
- nanochatをgit clone
- speedrun.shを動かす(失敗するが仮想環境.venvは作ってくれる)
- source .venv/bin/activate
- ~/.cache/nanochat/に本リポジトリのbase_checkpoints_jpとtokenizerを配置
- 以下のスクリプトを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サイトを執筆してくださった皆様
解説記事
- Downloads last month
- 13
Inference Providers
NEW
This model isn't deployed by any Inference Provider.
🙋
Ask for provider support