DGX Sparkãšãnanochatãã§ãŒãããäžžäžæ¥åŠç¿ãããŠLLMãèªäœããŠã¿ã
nanochatãšã¯
OpenAIå ±åèšç«è ãå ãã¹ã©ãã£ã¬ã¯ã¿ãŒã§ããããã€ãã³ãŒãã£ã³ã°ã»ã³ã³ããã¹ããšã³ãžãã¢ãªã³ã°ãšãã£ãèšèãçã¿åºããAndrej Karpathyæ°ãå ¬éãããœãããŠã§ã¢ã§ãã
ãªããšãChatGPTã®ãããªå¯Ÿè©±å¯èœãªLLMããèŠæš¡ããéãã©çŽ100ãã«ã®ã³ã¹ãã§ãŒããã4æéã§åŠç¿ãããããšãã§ãããœãããšããããšã§è©±é¡ã«ãªããŸããã
100ãã«ãããã®ã³ã¹ãã§ã人ãšããçšåºŠå¯Ÿè©±å¯èœãªLLMãéçºã§ãããšããã®ã¯ãæ¬åœã«åãããšã§ç Žæ Œãªã®ã§ããããã¯ãäžåã®åŠç¿ã«100ãã«ãããã®ã¯ãå人ã®è¶£å³ã ã£ãããåŠç¿çšã«èãããšé£ãããã®ããããŸãã
ããã§ç»å Žããã®ãNVIDIA DGX Sparkã§ãã1petaFLOPã®AIããã©ãŒãã³ã¹ãš128GBã®ã¡ã¢ãªãããã°nanochatãå®çšçãªé床ã§åŠç¿ã§ãããããããªããšããããšã§ãDGX Sparkã«ããLLMã®ãŒãããã®åŠç¿ã詊ããŠã¿ãŸããã
ãªããDGX Sparkã¯NVIDIAãããã貞äžããã ãããã®ã䜿çšããŠããŸãã
nanochatã®åŠç¿çµæ
çµè«ããèšããšãDGX Sparkã§ã»ãŒäžžäžæ¥ïŒ21æéïŒåŠç¿ãããããšã§ãããçšåºŠå¯Ÿè©±å¯èœãªLLMãäœãããšãã§ããŸããã以äžåŠç¿ããã¢ãã«ãåããããšããã§ãã
ãšããã©ããã«å€ãªãšããã¯ãããŸããããããªãã«å¯Ÿè©±ãã§ããŠããããšãåãããšæããŸãã
ã¯ã©ãŠãã䜿ããš100ãã«ãããåŠç¿ãã黿°ä»£ã®ã¿ã§å®çŸã§ããŸãïŒDGX Sparkèªäœã®äŸ¡æ Œã¯äžæŠèšæ¶åªå€±ã«ãªã£ãŠå¿ããŠãã ããïŒã
nanochatoããŒãããåŠç¿ãããæ¹æ³
ç°¡åã«åçŸã§ããããã«ãåŠç¿ã®æ¹æ³ãæžããŸãã
åŠç¿ã®æµã
nanochatã®åŠç¿ã®æµãã¯ããªããžããªã®speedrun.shã確èªãããšä»¥äžã®ããã«ãªã£ãŠããããšãåãããŸãã
- ããŒã¯ãã€ã¶ã®åŠç¿(tok_train)
- äºååŠç¿(base_train)
- äžéåŠç¿(mid_train)
- æåž«ãããã¡ã€ã³ãã¥ãŒãã³ã°(chat_sft)
LLMãäžã®äžã®ã»ãšãã©ã®åŠç¿ã¯ãã¡ã€ã³ãã¥ãŒãã³ã°ãªã®ã§ãããnanochatã¯ããŒã¯ãã€ã¶ãšäºååŠç¿ãããã£ãŠããã®ãããŒãã³ã¢ã§ããããªããžããªã¿ããšãspeedrun.shã«ã¯å«ãŸããŠããŸããããªãã·ã§ã³ã§åŒ·ååŠç¿ïŒchat_rl)ãã§ããããã§ãã
speedrun.shã¹ã¯ãªããã¯ã100ãã«ã®ã³ã¹ãã§ã®åŠç¿ãå®çŸãããããã«ãäžèšã®ä»ã«ã»ããã¢ãããå«ãã§ããããããŠã³ããŒããšåŠç¿ã䞊è¡ãããããšè²ã
工倫ãããŠããŸãã
ãã ãDGX Sparkã ãšãã®ãŸãŸåããªãã®ã§ã以äžå€æŽããŸããã
- ã»ããã¢ãããspeedrun.shããåãé¢ããŠãDGX Sparkçšã®ã»ããã¢ããã«æ¹å€
- DGX Sparkã§åŠç¿ã§ããããã«ããŒãæ°ãããããµã€ãºãã€ãã¬ãŒã·ã§ã³æ°çã調æŽãã
- è©äŸ¡ãçç¥
ã»ããã¢ãããšäºåæºå
ããããDGX Sparkçšã®ã»ããã¢ãããããŠããããŸãã
以äžèšäºãããšã«ãåºç€çãªã»ããã¢ãããããŠããããšãåæãšãªããŸãã
äžèšèšäºãã¹ãããããå Žåã¯ãæäœéuvã以äžã³ãã³ãã§ã»ããã¢ããããŠãããŠãã ããã
$ curl -LsSf https://astral.sh/uv/install.sh | sh
æåã«ãªããžããªã®ã¯ããŒã³ãããŸãã
$ git clone https://github.com/karpathy/nanochat
$ cd nanochat
uvã«ããPythonç°å¢ã®ã»ããã¢ãããããŸãïŒããã®ããŒãžã§ã³ã¯ã»ããã¢ããèšäºã®æ¹ãåèã«ããæ¹ããããããããŸããïŒ
$ uv venv
$ source .venv/bin/activate
$ uv pip install torch torchvision --index-url https://download.pytorch.org/whl/cu129
$ uv pip install datasets fastapi files-to-prompt uvicorn
ç°å¢æ§ç¯ã«å¿ èŠãªãRustã®ã€ã³ã¹ããŒã«ãšåäœç¢ºèªãããŸãã
$ curl https://sh.rustup.rs -sSf | sh -s -- -y
$ source $HOME/.cargo/env
# åäœç¢ºèª
$ rustc -V
$ cargo -V
Rustã䜿ã£ãç°å¢æ§ç¯ãããŸãã
$ uv pip install maturin
$ cd rustbpe
$ uv run --active maturin develop --release
$ cd ..
è©äŸ¡çšã®ãã¡ã€ã«ãæºåããŸãã
$ export NANOCHAT_BASE_DIR="$HOME/.cache/nanochat"
$ mkdir -p $NANOCHAT_BASE_DIR
$ EVAL_BUNDLE_URL=https://karpathy-public.s3.us-west-2.amazonaws.com/eval_bundle.zip
$ curl -L -o eval_bundle.zip $EVAL_BUNDLE_URL
$ unzip -q eval_bundle.zip
$ rm eval_bundle.zip
$ mv eval_bundle $NANOCHAT_BASE_DIR
$ curl -L -o $NANOCHAT_BASE_DIR/identity_conversations.jsonl https://karpathy-public.s3.us-west-2.amazonaws.com/identity_conversations.jsonl
ããã§ã»ããã¢ããã¯å®äºã§ãã
nanochatã®åŠç¿
speedrun.shãããŒã¹ã«æ¹å€ãã以äžãã¡ã€ã«ãspeedrun_spark.shãšããååã§äœæããŠãnanochat以äžã«ä¿åããŸãã
NUM_ITERATIONSãå€ãããšåŠç¿æéãå€ãããŸããä»åã¯1000ã«ããŸããããèªåã®ç°å¢ã ãšããã§21æéãããåŠç¿ã«ããããŸããã
#!/usr/bin/env bash
# speedrun_total_min.sh â å
šäœæéã®ã¿ïŒéå§âçµäºã®å·®ïŒ
set -euo pipefail
# ===== ãŠãŒã¶ãŒèšå®ïŒãã®ãŸãŸïŒ =====
DEPTH=20
DEVICE_BATCH_SIZE=16
#NUM_ITERATIONS=1
NUM_ITERATIONS=1000
CACHE_DIR="$HOME/.cache/nanochat"
# ===================================
# --- å®è¡ç°å¢ã»OOM察çïŒä»»æãå
ã®ãŸãŸïŒ ---
export PYTORCH_ALLOC_CONF="expandable_segments:True,max_split_size_mb:256"
export TORCHDYNAMO_DISABLE=1
export TORCHINDUCTOR_DISABLE=1
# ---- èšæž¬éå§ ----
T0=$(date +%s)
# ===== å®è¡ã³ãã³ã =====
python -m nanochat.dataset -n 240
python -m scripts.tok_train --max_chars=2000000000
#python -m scripts.tok_eval
python -m scripts.base_train --depth="${DEPTH}" --device_batch_size="${DEVICE_BATCH_SIZE}" --num_iterations="${NUM_ITERATIONS}"
#python -m scripts.base_loss
#python -m scripts.base_eval
python -m scripts.mid_train --device_batch_size="${DEVICE_BATCH_SIZE}" --num_iterations="${NUM_ITERATIONS}"
#python -m scripts.chat_eval -i mid
python -m scripts.chat_sft --device_batch_size="${DEVICE_BATCH_SIZE}" --num_iterations="${NUM_ITERATIONS}"
#python -m scripts.chat_eval -i sft
# python -m nanochat.report generate
# ---- èšæž¬çµäºïŒè¡šç€º ----
T1=$(date +%s)
ELAPSED=$((T1 - T0))
printf "\n== SUMMARY ==\nTotal elapsed: %d s (%02d:%02d:%02d)\n" \
"$ELAPSED" "$((ELAPSED/3600))" "$(((ELAPSED%3600)/60))" "$((ELAPSED%60))"
echo "â
å®äºïŒWeb UI â python -m scripts.chat_web"
以äžã³ãã³ãã§åŠç¿ãå®è¡ããŸãã
$ bash speedrun_spark.sh
åŠç¿ãå§ãŸããŸã

DGX Dashboardã§ç¢ºèªãããšãã¡ã¢ãªãšCPUãã»ãŒãã«ã«äœ¿ã£ãŠããããšãåãããŸã

ãã®ç¶æ ã ãšãDGX Sparkãããªãç±ããªã£ãŠããŸãã
åŠç¿æ²ç·ã¯ä»¥äžã®éãã§ãã

åäœç¢ºèª
åŠç¿ãçµãã£ããã以äžã³ãã³ããå®è¡ããŸãããã
$ python -m scripts.chat_web
DGX Sparkäžã§ããã°ããã©ãŠã¶ã§ä»¥äžã«ã¢ã¯ã»ã¹ããŸãã
0.0.0.0:8000
ä»ã®PCãããªã¢ãŒããã°ã€ã³ããŠããå Žåã¯ã0.0.0.0ã®ä»£ããã«DGX Sparkã®IPã¢ãã¬ã¹ãå
¥ããŠãã ããã
ã¢ã¯ã»ã¹ãããšãnanochatã®ãã£ããç»é¢ãéããŸããNUM_ITERATIONS=1000ã§åŠç¿ãããšãåé ã®åç»ã®ããã«åŠç¿ããLLMãšå¯Ÿè©±ãã§ããŸãã
ãªãNUM_ITERATIONS=100ãããã®åŠç¿ã ãšã以äžã®ããã«å
šãäŒè©±ã«ãªããŸããã

æ¥æ¬èªå¯Ÿå¿
æ¥æ¬èªå¯Ÿå¿ããã£ãŠã¿ãŸããã倿Žå 容ã¯ä»¥äžã®PRã«ãŸãšãŸã£ãŠããŸãã
åããæ¹ã¯ä»¥äžã³ãã³ãã§æ¥æ¬èªå¯Ÿå¿ã®ãã©ã³ããããŠã³ããŒãããŠãã£ã¬ã¯ããªã«ç§»åããŸãã
$ git clone -b feature/japanese-support --depth 1 https://github.com/karaage0703/nanochat.git
$ cd nanochat
nanochatã®åŠç¿ãã§ããŠãããã以äžã³ãã³ãã§åãã¯ãã§ããCUDAé¢ä¿ã§åããªãå Žåãpyproject.tomlã®ããŒãžã§ã³æ
å ±ãã»ããã¢ããèšäºãåèã«ä¿®æ£ãããšããŸããããããããŸããã
$ uv sync
$ bash speedrun_spark_ja.sh
ãããããã§10epochã100epochã§è©Šããšãå šç¶ãã¡ã
10epoch

100epoch

1000epochåŠç¿ãããšãå€å°åããããã«ãªããŸãããå®çšæ§ã¯ç¡ãããã§ãã


åŠç¿æ²ç·ã¯ä»¥äžã§ãããŸã è³¢ããªããããªé°å²æ°ã¯ãããŸããã

ãŸãšã
nanochatãDGX Sparkäžã§ãŒãããåŠç¿ããŠã¿ãŸãããèªåã§ãŒãããåŠç¿ãããLLMããããŒã«ã«ã§ãµã¯ãµã¯è³¢ãåãã®ã¯çµæ§æåãã®ã§ããäœãããæå ã§åããŠãããšããæè§Šãæãããã§ããã
nanochatã¯ããœããã¯ã·ã³ãã«ã§åãããããäžãã¹ã¯ãªããã¯æ§ã ãªå·¥å€«ããããŠããå¥¥ãæ·±ãé¢çœãå匷ã«ãªããªããžããªã§ããDGX Sparkã ãšãLLMéçºãäœåºŠã§ã詊è¡é¯èª€ã§ããã®ã§ãåŠç¿ã«ãã£ãŠã€ãã ãšæããŸãã
ã¿ãªããããDGX Sparkã§nanochatãåŠç¿ãããŠLLMããŒãããéçºããŠã¿ãŸãããïŒ
åèãªã³ã¯
é¢é£èšäº
倿Žå±¥æŽ
- 2026/01/02 æ¥æ¬èªåŠç¿ã«ã€ããŠè¿œèš
- 2025/12/01
Discussion
倧倿çšãªèšäºãå ¬éé ãããããšãããããŸãïŒ
æ¬æ¥DGX Sparkãç匟ããã®ã§ããããã®ã¬ã€ãããã³ååã®ã»ããã¢ããèšäºã®ãããã§1æéçšåºŠã§speedrun_spark.shã®GPUå®è¡ã«è³ãããšãã§ããŸããã
äžèºŸãªããäžç¹è¿œèšã®ãææ¡ã§ãã
ã»ããã¢ãããšäºåæºåã«ãããŠã
pipããã³uv syncãçšããæ¹æ³ããããã«ã€ããŠCUDA12.9ãæå®ããã³ãã³ãã«ãªã£ãŠããŸããããã®æé ã§å®è¡ãããšãå°ãªããšãç§ã®ç°å¢ã§ã¯torch.cuda.is_available()ãfalseã«ãªã£ãŠããŸããŸãããäžèšã®äžå ·åã«ã€ããŠã
nvidia-smiã®è¡šç€ºã®ãšããCUDA13.0ãæå®ããŠpytorchãã€ã³ã¹ããŒã«ãããšãtorch.cuda.is_available()ãtrueãšãªãããŸãspeedrun_spark.shããã¡ããšGPUã§å®è¡ãããããã«ãªããŸãããäžèšã®ããã«ãCUDAããŒãžã§ã³ã«å¿ããŠãPytorchã®ããŒãžã§ã³ãé©å®åãæ¿ãããã远èšããããšããææ¡ãããŠããã ããŸãã
ãŒã¶ãããž
äžå¯§ãªã³ã¡ã³ãããããšãããããŸããå ¬åŒã®ã»ããã¢ããæé ã«åŸã£ãŠããŠãéå»ã¯ããã§è¯ãã£ãã®ã§ããããã€ã®éã«ãå ¬åŒã®æé ãå€ãã£ãŠããããã§ãã
ãŸã 詊ããŠããªãã®ã§ãåŸã§èªåã§ã詊ããŠã¿ãããšæããŸã
確èªããŠã¿ãŸããããèªåã®ç°å¢ã ãš cu129 ã§ã cu130 ã§ãåããŸããã
DGX OSã®éããããããŸããããåçŸæ§é«ããããã«ã以äžã®ããã«PythonãšPyTorchã®ããŒãžã§ã³ãåºå®ããŠãæ°ãã cu130ãæå®ããã³ãã³ãã«å€æŽããŠãããŸãã