世界を動かす技術を、日本語で。

Nanocode: $200で手に入る最高のClaudeコードをTPU上の純粋なJAXで

概要

  • nanocode は、自作のClaude Codeエージェントをエンドツーエンドで訓練できるJAX製ライブラリ
  • Constitutional AI を活用し、AnthropicのClaudeモデルに近い訓練アプローチを採用
  • The Stack-V2 等の追加データを使い、コード生成性能を強化
  • TPU最適化 設計だが、NVIDIA GPUでも動作可能
  • エージェント的コーディング行動 を実現するためのテンプレートやツールコール設計が特徴

nanocode: Claude Codeエージェント訓練ライブラリ概要

  • nanocode は、 JAX で書かれたClaude Code風エージェント訓練用のライブラリ
    • nanochat (Andrej Karpathy作)を基盤に設計思想やインフラを継承
    • nanochat利用経験者には 馴染みやすい設計
  • Constitutional AI を活用したシンプルな訓練手法を採用
    • SOUL.md の自作、エージェントインターフェース定義、合成データ生成、preference optimizationによるアラインメント
  • TPU最適化 設計
    • Google TRCプログラム 等で1ヶ月無料TPU利用可能
    • TPU v6e-8でd24(1.3Bパラメータ)モデルを約9時間/$200で再現可能
    • NVIDIA GPUでも動作するが、TPU向けに最適化

データセットとトークナイザー設計

  • The Stack-V2 等の追加コードデータを1:5の比率で混合
    • FineWeb-EDU と組み合わせてトークナイザー訓練・事前学習
    • コードデータを増やすことで コードトークン化効率と生成性能が向上
  • トークナイザー訓練例:
    • データセットのダウンロードと事前学習
      • python -m data.pretrain -d fineweb-edu -n 300
      • python -m data.pretrain -d the-stack-v2-dedup -n 60
    • トークナイザー訓練
      • python -m scripts.tok_train --max-chars=2000000000
      • python -m scripts.tok_eval
  • nanochatとの比較
    • コード領域でのトークン効率が大幅向上
    • 一般テキスト効率は低下するが、 コーディング特化モデル に最適化

モデル訓練と評価

  • パラメータ:データ比率8:1 で訓練(nanochatのスケーリング法則に準拠)
  • 訓練コマンド例:
    • python -u -m scripts.base_train --batch-size=32 --minibatch-size=1 --config=configs.d24 --eval-every=500 --sample-every=500
  • 評価指標:
    • CORE metricbits-per-byte (bpb) でnanochatやGPT-2と比較
    • コードデータ優先設計のため、COREスコアはGPT-2よりやや低め
  • スケーリング例:
    • d12(135Mパラメータ): $3/9分
    • d20(477Mパラメータ): $30/1.4時間
    • d24(1.3Bパラメータ): $200/9.3時間

エージェント的行動のためのテンプレート設計

  • チャットテンプレート
    • 会話ターンを特殊トークンで明示
      • 例: <|user_start|>質問<|user_end|> <|assistant_start|>回答<|assistant_end|>
  • ツールコールテンプレート
    • エージェントが外部ツールを呼び出す際の構造を定義
      • 例: <|tool_call_start|>Bash<|tool_arg|>command<|tool_val|>grep -rn "TODO" src/<|tool_call_end|>
    • Read/Edit/Grep/Bash 等の専用ツール呼び出しトークンを用意
  • CLIインターフェース
    • モデルが出力したトークンをパースし、ツールコール部分を実行
    • 結果をモデルへの“会話ターン”としてフィードバック

nanocodeとnanochatの主な違い・特徴

  • nanochat とほぼ同様のコマンド・インフラ
  • コード生成・エージェント的行動 に最適化したデータ/テンプレート設計
  • 4096トークン の長い文脈長対応(nanochatは2048)
  • SOUL.md や専用ツール設計でエージェント性を強化

まとめ

  • nanocode は、 エージェント的コーディングAI の訓練を手軽に再現可能なJAXライブラリ
  • TPU/GPU両対応 だが、TPUで最大効率
  • コード領域特化 のトークナイザー・データ設計
  • テンプレート・ツールコール でエージェント性を表現
  • nanochatユーザー にも使いやすい設計とドキュメント

Hackerたちの意見

バカな質問かもしれないけど、ここでの成果を軽視するつもりはないんだ。ただ、ほんとに理解できないんだよね。なんで人は無料のコーディングモデルがあるのに、200ドルも払ってコーディングモデルをトレーニングしたいと思うの?

いい質問だね。これを使うためにトレーニングしてるわけじゃなくて、物事の仕組みを理解するためにトレーニングしてるんだよ。これは教育的なプロジェクトで、もしJAXの分散トレーニング技術や、好みの最適化みたいなことを試してみたいなら、最小限でハック可能なライブラリが手に入るよ。

MLの経験ゼロの私にとって、これはすごく興味深くて読みやすい内容だった!

同意!素晴らしい教育ツールだね!コーディングエージェントに関するいろんなことが結びついたよ。

ちょっと脱線するけど(でも「脅威は自分が何をしているのか理解しないことに対する心地よい漂流」というのもフロントページにあるし)、例の生成されたPythonコードは間違ってるのかな? プロンプトは「リストから偽の値を取り除くPython関数を開発せよ。新しいリストを作成せずに修正されたリストを返す。」なんだけど、リスト内包表記で答えられていて、新しいリストを作って元のリストはそのまま(*argsの入力が変更可能なリストであるはずがないことは無視して)だよ。

def remove_falsey_values(*args):
    return [val for val in args if val]

私が期待していたのはこんな感じのコードだよ。

def remove_falsey_values(l):
    for i in reversed(range(len(l))):
        if not l[i]:
            l.pop(i)
    return l
a = [1, 0, False, 'foo']
x = remove_falsey_values(a)
x[0] = 2
print(a)  # [2,'foo']

リストをその場で修正するという要件には合ってないけど、プロンプト自体が*argsとリスト内包表記を使うように明示的に要求していて矛盾してるよね。

def remove_falsey_values(l):
    l[:] = (x for x in l if x)

それには驚かないよ。これは、私が使ったOSSコードデータセットの一つからのサンプルで、全部LLMを使って合成生成されたものなんだ。データが本当に重要だね。

あなたの二つ目の関数は、PythonをCのようにプログラミングしようとする人から出てくる悪いコードの典型だね。

なんで元のリストを修正して、二つ目の例と一緒に返すの?正直、最初の方がいいと思う。

これは自分のClaude Codeをエンドツーエンドでトレーニングする方法を示すライブラリだよ。これってどういう意味なの?Claude Codeは「ハーネス」と呼ばれるもので、LLMのためのコンテキストを構築したり、LLMを呼び出したり、ツールコールを実行したりするものだよ。内部ではさまざまなAnthropicモデルを使ってるし、他のモデルも使えるはずだよ。トレーニングすることはできないんだ。ちょっと細かいことを言ってるように聞こえたらごめん、ただ用語の使い方が不正確でイライラしてるだけなんだ。

そうだね、ツール使用のためにモデルをポストトレーニングすることが重要だと思う。

言いたいことはわかるけど、私は違うと思う。Claude Codeは、Claude Codeハーネスとツールセットを使ってトレーニングされたClaudeベースの別のポストトレーニングがあると予想してるよ。

nanocoderとは混同しないでね、エージェント型のコーディングハーネスだよ。 https://github.com/Nano-Collective/nanocoder

これって本当に機能するの?Anthropicもこんな感じで動いてるの?実際に使ってる人、詳しく教えてくれない?

これはプロセスの大雑把な単純化だよ。通常は、もっと桁数の多いデータと計算を使うし、緊急のツール使用能力を引き出すためにかなりの量のオンライン強化学習が必要なんだ。最近のOSSモデルには、こういうことについてもっと学べる素晴らしい技術レポートがたくさんあるよ:Kimi 2.5 https://github.com/MoonshotAI/Kimi-K2.5/blob/master/tech_rep... GLM 5 https://arxiv.org/abs/2602.15763 DeepSeek R1 https://arxiv.org/pdf/2501.12948

ツール使用のトレーニングにおける憲法的AIアプローチが、ここで一番面白い部分だね。コーディングエージェントのために憲法を書くってことは、「編集する前にファイルを読む」とか「確認せずに破壊的なコマンドを実行しない」といった原則を定めることになる。これは通常の無害性の話とは違って、運用上の決定なんだ。これらの原則がどのようにスケールするのか、見てみたいな。1.3Bパラメータでは、モデルはツール呼び出しのフォーマットをうまく学習するだろうけど、どのツールをいつ使うかを実際に推論できるのか、それとも単にトレーニングデータのパターンマッチングをしているだけなのかが重要なポイントだね。このメタ推論のギャップが、小さなモデルと最前線のモデルの品質の違いがエージェント的な設定で現れるところだと思う。

うん、私の見解もほぼ同じだったよ。正しいトレーニングレシピがあれば、1.3Bパラメータでもそこそこ良いものが得られると思うけど、この計算リソースやトークン予算では絶対無理だね。一つ気づいたのは、モデルは問題を解くように頼まれると、ほぼ常にトレーニングデータから解決策を出してくるんだけど、例えばBashコマンドを使ってコードベースを探索するのはすごく得意だったこと。Hugging Faceの人たちが、無害性よりもポストトレーニングでの雰囲気やキャラクターを重視したCAIの使い方について素晴らしい記事を書いてるよ。https://huggingface.co/blog/constitutional_ai#oh-honey-lets-...