【llama2.c】15Mに満たない言語モデルで小さな物語を紡ぐ
OpenAIのAndrej Karpathy氏による「llama2.c」が話題になっていた。
CPU環境で「Llama 2 アーキテクチャをゼロから学習させ、重みを生のバイナリファイルに保存し、シンプルなCファイルにロードしてモデルを推論する」という一連の流れが体験できるという。
「llama.cpp」に影響を受けた週末プロジェクトだそうで、「シンプルなアプローチで、それなりの大きさのモデル(数千万パラメータ)がとてもインタラクティブな速度で動くことに嬉しい驚きを覚える」と述べている。
例によって中身はほとんど理解できないが、面白そうなので手元のPC(Windows 11)でひとまず試してみた。
Windowsで「llama2.c」を試す
Cに触れたことはないので、まず実行環境の用意から。「MinGW」というコンパイラ管理ソフトがあればCが実行できるらしい。こちらの記事を参考に導入した。
インストール後、環境変数 Pathの登録に失敗したので「C:\MinGW\bin」フォルダに、ダウンロードした「llama2.c」のファイルを直接放り込み、このフォルダ上で実行(無知)。
「llama2.c」はモデルのトレーニングから始められるが、Karpathy氏が学習済みのモデルもアップしているので、それを動かしてみる。この場合の手順(和訳)は以下の通り。
私(無知)の場合は、モデル(https://karpathy.ai/llama2c/model.bin)を手動で「C:\MinGW\bin\out」にダウンロード。モデルサイズはわずか58MBと可愛らしいサイズ。コマンドプロンプトを起動して以下のコマンドを順に実行。
cd C:\MinGW\bin
gcc -O3 -o run run.c -lm
run out/model.bin
pip install sentencepiece
python run_wrap.py
モデルを走らせると、以下のように勢いよく生のトークンが数値で出力され、ラッパーでテキストに変換される。CPUに大した負荷はかからない。
このモデルはChatGPTで生成した「小さな物語(TinyStories)データセット」で学習していて、「Once upon a time(昔々)」で始まるささやかな物語が出力される。
感想
言語モデルが生のトークンを吐き出すのを眺めるのは新鮮。モデルは言葉を数値として処理していて、それをわざわざトークナイザーでテキストにデコードしているのだということを感覚的に理解する。
通常のLlamaなどのLLMのファイルサイズは巨大で、量子化した7Bパラメータのモデルでも数GBのサイズはある。もっと小さい3.6Bモデルとかのモデルだと、まともな文章の生成は難しいのだと思っていたが、実際は15M足らずのモデル(60MB以下)でも、学習次第で意味のある文章が生成できるものらしい。
このデータセットの作成に関する論文(「小さな物語:言語モデルはどこまで小さくても首尾一貫した英語を話すことができるのか?」)は以下。
論文の読後メモと抄訳は下記。