Train Your Own LLM From Scratch - 一から自分でLLMを学習する実践ワークショップ
(github.com/angelos-p)- Train Your Own LLM From Scratch は、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ドルで手に入る