こんにちは、アジャイルジェイピーのMです。
今日はちょっとした実験の話をさせてください。
テーマはずばり、「1000円くらいで、小さなLLM(大規模言語モデル)を一から作れるのか?」 です。
結論から言うと、作れました。しかも、ちゃんと(?)動きました(???)。
▼使ったもの
今回のお供はこの2つです。
・nanochat:Andrej Karpathy氏が公開している、LLMをフルスクラッチで学習できる軽量なリポジトリ
・Google Colab(L4 GPU):クラウド上でGPUを借りられるサービス。今回のランタイム構成はL4 GPU一枚
高性能なマシンを自前で用意しなくても、クラウドのGPUを数時間借りるだけ。費用はおよそ1000円ほどでおさまりました。
▼どんなLLMを作ったのか
今回作ったのは検証用の「おもちゃレベル」のモデルです。
主なスペックはこんな感じです。
・層の数(n_layer):4層
・埋め込み次元(n_embd):256
・アテンションヘッド数:2
・語彙サイズ:32,768
・モデルサイズ:約92MB
たった4層という、かなり小ぶりな構成です。当然ながら賢さは期待できませんが、その分軽い。なんとGPUなしのCPUのみでも動きます。この「手のひらサイズ感」が今回のポイントです。
▼作る流れ
LLMを作ると聞くと身構えてしまいますが、大きな流れはシンプルです。今回は重要なステップだけ紹介します(環境準備などは省略)。
① トークナイザーの学習(約1分):まず、文章をLLMが扱える単位(トークン)に区切る「トークナイザー」を用意します。学習用データの一部を使い、BPEという方式でトークナイザーを学習させました。ここは意外とあっという間。
② 事前学習(Pre-training/約24分):LLMの「土台」を作る、いちばん重要な工程です。大量のテキストを読ませて、言葉のつながりのパターンを学ばせていきます。今回は500イテレーションほど回して、約24分。モデルが少しずつ「それっぽい文章」を出すようになっていく様子は、見ていて楽しい部分です。
③ SFT(教師ありファインチューニング/約1〜2時間):土台のモデルは文章の続きは書けても、まだ「会話」はできません。そこで、質問に答える形式のデータで追加学習させ、チャットができるように仕立てます。ここがいちばん時間がかかりました。
ちなみに、本来のLLM開発ではこの後に事後学習や強化学習(RLHFなど)といった工程が続きますが、今回は検証用なのでスキップしています。
▼そして、動かしてみた
完成したモデルに「なぜ空は青いの?(why sky is blue?)」と聞いてみました。
返ってきた答えは……「青いから青い、明るい青だから青い、鮮やかな青だから……」と、同じフレーズをひたすら繰り返す、なんとも味わい深いものでした。
正直、答えとしては全然ダメです。でも、「4層・256次元のおもちゃモデルが、それでも英語の文章を組み立てて何かを返してきた」という事実に、思いのほか感動してしまいました。自分の手で回した学習の結果が、こうして目の前で言葉を紡いでいる、ここには確かに手応えがありました。
▼やってみて感じたこと
今回調べていく中で一番不思議だったのが、「LLMの中で実際に何が起きているのか、まだ完全には解明されていない」ということです。
LLMはトランスフォーマーという仕組みで動いていますが、その内部で膨大なパラメータがどう協調して「意味のある出力」を生み出しているのかは、いまも世界中で研究が続いているテーマです。自分で一から組み立てたモデルでさえ、中身は完全なブラックボックスに近い。作った本人が「なぜこう動くのか」を説明しきれない。これは、なかなか他の分野では味わえない感覚だと思います。
もう一つ感じたのは、エッジで動く小さなLLMは、巨大なフロンティアモデルとは別の可能性を持っているかもしれないということ。今回のモデルは推論レベルこそ高くありませんが、CPUだけで、しかも92MBで動きます。「賢さ」だけがLLMの価値ではなく、「軽さ」や「手元で完結すること」に意味が出てくる場面は、これからきっと増えていくのだろうと感じました。
▼さいごに
「LLMを作る」というと途方もなく難しそうですが、こうして1000円と数時間で、その全体像を自分の手で体験できる時代になっています。もちろん奥は果てしなく深いのですが、まず一歩踏み出してみると、教科書を読むだけでは得られない発見がたくさんありました。
これを見ているみなさんとも、「まず手を動かして作ってみる」楽しさを一緒に味わっていけたらうれしいです!

