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などで試行錯誤が実行可能です。

事前学習実行時ログ

wandb

単体動作確認スクリプト

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

  1. 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の日本語版の開発

Downloads last month
13
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support