NVIDIA の GPU なし、Apple シリコンの Mac 1 台で、29,008,384 パラメータの日本語言語モデルをゼロから事前学習した。1B トークン、20,345 ステップ、43 時間。検証損失 3.11、パープレキシティ 22.5。日本語を実際に喋る。

やってみて分かった罠を 3 つ書く。どれもドキュメントに書いていない。

NVIDIA の GPU なし、Apple シリコンの Mac 1 台で、29,008,384 パラメータの日本語言語モデルをゼロから事前学習した。1B トークン、20,345 ステップ、43 時間。検証損失 3.1139、パープレキシティ 22.51。日本語を実際に喋る。

やってみて分かった罠を 3 つ書く。どれもドキュメントに書いていなかった。

構成

  • PyTorch、デバイスは mps (Apple シリコンの GPU)
  • 約 29M パラメータの小型トランスフォーマー
  • トークナイザは SentencePiece 自前学習
  • データは Wikipedia と青空文庫系で約 1B トークン

罠 1: 勾配クリッピングは NaN を防がない

一番高くついた罠。勾配クリッピングを入れていたのに、学習が NaN で壊れた。

クリッピングは「勾配の合計ノルムで倍率を掛ける」処理なので、ノルム自体が NaN だと倍率も NaN になり、全勾配が NaN のまま重み更新が走る。step 11,280 で損失が nan になり、何も止まらず、50 ステップごとの再開用チェックポイントを NaN で上書きし続けて、丸 1 日分が消えた。

対策: クリッピングの前に非有限値を検査してその更新を捨てる。あと「壊れた時にちゃんと止まるか」のテストを先に書く。

罠 2: 「GPU が無いから動かない」という環境チェックの嘘

環境チェックが「NVIDIA 用コマンドの有無」だけで判定していて、「この機械では学習できない」と言い続けていた。実際は mps に切り替わって完走していた。

この嘘が怖いのは向きで、「やめとけ」側に嘘をつかれると、43 時間で終わる仕事を一生始めない。GPU と CUDA を同じ言葉として扱っているチェックは疑った方がいい。

罠 3: パラメータ数の数え間違い

入出力の埋め込みを共有 (tied embeddings) していると、重みの一覧が同じ実体を 2 つのキーで返すので、素朴に合計すると語彙分を二重に数える。実体のポインタで重複を除いてから数えるのが正解だった。

参考: NVIDIA の GPU だと 33 倍速い

その後、RTX 5080 で 91M パラメータ・2.0B トークンを学習したら、処理速度は毎秒 76.4K トークンで Mac の約 33 倍だった。それでも「手元の Mac だけで日本語を喋る小型モデルが作れる」のは実測で確認できた。

生成の所感

  • 温度 0.8 で同じ句を無限に繰り返すことがある。低温 = 安全ではない
  • 事実は普通に間違う (29M に知識を求めてはいけない)
  • 文体と文法の獲得を楽しむものと割り切ると、かなり面白い