Train Your Own LLM From Scratch - ゼロから自分でLLMを学習する実践ワークショップ
(github.com/angelos-p)- GPT学習パイプラインのあらゆる要素を自分で書きながら、各コンポーネントが何を行い、なぜ必要なのかを理解する実践型ワークショップ
- 目標は、ノートPCでゼロから学習したGPTモデルでShakespeare風テキストを生成することであり、ワークショップ1セッション内で終えられるよう約10Mパラメータのモデルに縮小されている
- nanoGPTがGPT-2 124Mパラメータの再現を目標としているのに対し、このプロジェクトは中核だけを残し、ノートPCで1時間以内に学習できる形で設計されている
- 自分で実装する構成要素はTokenizer、Transformerベースのモデルアーキテクチャ、学習ループ、テキスト生成で、最終的に
model.py、train.py、generate.pyを自分で完成させる - 事前知識はPythonコードの読解に慣れている程度で十分で、機械学習の経験は不要であり、**Python 3.12+**が必要
- 実行環境はMac、Linux、WindowsのノートPCまたはデスクトップをサポートし、学習ではApple Silicon GPUのMPS、NVIDIA GPUのCUDA、またはCPUが自動で使われる
- ローカルインストールではuvで
uv syncを実行する流れが推奨され、ローカル環境がなければGoogle Colabにファイルをアップロードして!python train.pyで実行できる - ワークショップでは文字単位トークナイザー、埋め込み、セルフアテンション、LayerNorm、MLPブロック、損失関数、AdamW、勾配クリッピング、学習率スケジューリング、temperatureとtop-kサンプリングを順に扱う
- 基本アーキテクチャは入力テキストを文字単位トークンIDに変換し、トークン埋め込みと位置埋め込みを経て複数のTransformerブロックを通した後、次トークン確率のためのlogitsを出力する
- 提供されるモデル設定は、Tinyが約0.5MパラメータでM3 Pro基準約5分、Smallが約4Mで約20分、デフォルトのMediumが約10Mで約45分の学習時間として示されている
- すべての設定で
vocab_size=65の文字単位トークン化とblock_size=256を使用し、Shakespeareのような約1MBの小規模データセットに合わせている - BPEトークン化はGPT-2の50,257 vocabのように語彙が大きいため、小規模データセットでは大半のトークンbigramがあまりにまれでパターン学習が難しく、より大規模なデータセットではBPEへ切り替える内容も扱う
- 主な参考資料としてnanoGPT、build-nanogpt video lecture、Karpathy's microgpt、nanochat、Attention Is All You Need (2017)、GPT-2 paper (2019)、TinyStories paperが挙げられている
1件のコメント
Hacker Newsのコメント
この資料が面白ければ、StanfordのCS336の授業も強くおすすめする。同じカリキュラムをもっと深く扱っていて、スケーリング則のような理論的直観や、カーネル最適化/プロファイリングのようなシステム面の視点も紹介している
もちろん課題は自分でやる必要がある: https://cs336.stanford.edu/
少し宣伝すると、機械学習の仕組みを最初から説明するJupyterノートブックのシリーズがある
https://github.com/nickyreinert/DeepLearning-with-PyTorch-fr...
そして当然、LLMを最初から作る方法も扱っている
https://github.com/nickyreinert/basic-llm-with-pytorch/blob/...
ちょうどSebastian Raschkaのリポジトリ/本/講座であるBuild a Large Language Model (From Scratch) を始めたところ。どの学習資料を使うかを選べるのは、むしろ良い悩みかもしれない
[0] https://github.com/rasbt/LLMs-from-scratch
[1] https://www.manning.com/books/build-a-large-language-model-f...
[2] https://magazine.sebastianraschka.com/p/coding-llms-from-the...
生まれた日からずっとやっている。始まりは大変だったが、だんだん良くなってきている
fast.aiが比較的新しかったころ、ULMFiTでやったことがある。たしかBERTが最新最高性能だった時期で、基本モデルを学習したあとにヘッドで特化できる構造だった
基本モデルにはWikipedia全体を使い、さらにfirehoseで集めた数GB分のツイートも使った。ゲーム開発用PCが20台あるラボを使えたので、おそらくGTX 2080級だったと思う。トークン化したWikipediaを1周学習するのに半日ほどかかったので、各マシンで異なる設定を走らせてハイパーパラメータチューニングを行い、翌日には最も良かった結果を出発点にしていた。翌朝出勤して結果を確認するのはいつも楽しかった
エンジニアリングはひどく、その場しのぎだったが、多くを学べた。結果はまずまずでツイート分類をしたが、これを本気でやるにはどれほど多くのGPU性能とエンジニアリング上の難題が必要かという感覚がつかめた。生成の可能性は完全には理解していなかったが、興味本位で作ってみたツイートを見てしばらく笑っていたこともある
これはAndrej Karpathyのこの動画(https://youtu.be/kCc8FmEb1nY)を文章にほぼそのまま起こしたもののように見えるが、私の見間違いだろうか?
「nanoGPTはGPT-2(1億2400万パラメータ)の再現を目指しており、多くの内容を扱う。このプロジェクトは核心だけを残し、ノートブックで1時間以内に学習できる約1,000万パラメータのモデルへと縮小している…」という感じだ
文脈を補うと、彼はMLX開発者の一人で、優秀な機械学習研究者だ
「GPT学習パイプラインのあらゆる断片を自分で書き、各構成要素が何をしていて、なぜ必要なのかを理解する実習ワークショップ」とあるが、依存関係にtorchが見えるので、テンソルと逆伝播は自前実装ではなく当然の前提として持ち込んでいるように見える。それでも「最初から」と言えるのだろうか
似たようなことをRustでやってみたことがあり、AIの助けも借りたが、依存関係なしで標準ライブラリだけを使うよう制限した。その結果、テンソル設計、カーネルの概念、単純な勾配降下オプティマイザ、自作のJSONパーサ、rayon風のCPUデータ並列抽象化など、はるかに多くのものを実装する必要があった。全部をつないで動いたときはかなり面白かった。非常に遅かったが、ちゃんと動いた
PyTorchを使うのを、もう「最初から」とは見なせない気がする。標準ライブラリまで避けろという極端な話ではないが、その目的にぴったりのライブラリを持ち込んだ時点で、「最初から」という感じはしない
「最初からLLMを学習する」よりも、「最初からLMを学習する」の方が正確かもしれない。「Large」と呼べるほど大きいモデルを作れるマシンがあるのかは疑問だ
それだけの価値があると言っているわけではないが、学習のために自分でGPUを買う必要はない
しかも48個のプロセッサコア付きだ! AVX512には対応していないが、計算はできる
LLMを十分に学習できるはずだ。少なくとも私たち家族ならできるかもしれない…子どもが引き継いでプロジェクトを続ける必要があるかもしれないが
真面目な話、要点を外しているか、不必要に揚げ足を取っているか、あるいは単に間違っているように思う。これは概念を学ぶことについての話で、残りはおおむね副次的なことだ
揚げ足取りか間違いという観点で言えば、「large」言語モデルの文書化された基準線とは何だろう? GPT-2は当時も今も「large」言語モデルと呼ばれていて、パラメータ数は15億だった。今ではその程度なら、学習できる民生用GPUがおよそ400ドルで手に入る