20年前のノートPCでAIを動かしてみる(llama2.c)
あらゆる困難がAIで解決するこの令和のジェダイ(時代)、20年前のノートPC(Pentium M 1.7GHz、メモリ640MB)と言う化石のようなPCで
AIを動かしてみたのぜ。(逆張り精神)
実際に動くのか?
現在ローカルLLMを動かすのに一番使われていると思うllama.cppの推論エンジンはCPU命令の要件が厳しくPentium M(2003年発売)のような化石...いや、
古のCPUでは動かせる拡張命令が足りずエラーになってしまう模様です。なので今回は拡張命令の対応が拓也さんの脚並に貧弱な古いCPUでも
使えるllama2.cというエンジンを使ったのぜ!!
32bitCPUでAVXもないし、SSEもSSE2までの対応しかないCPUでAIは動くのか...!?それはAIと言えるのか...
生物で例えるなら昆虫の脳のようなものかしら...
その考え方は例えとしてかなりいいゾ。 1500万パラメータ(例えると昆虫みたいな)モデルでも、中身は巨大AI(人間のような)と同じ「Transformer」というニューラルネットワークの仕組みで動いているゾ
今回使用したチョー古いジャンクパソコン

型番:富士通 FMV NB90K (2005年発売)
CPU:Pentium M 735 1.7GHz
RAM:DDR-266 512MB+128MB(合計640MB)
ストレージ:なし
CPUはDothanコアを載せたPentium Mね。2004年の発売当時は省電力ながら高い性能を誇った優等生CPUだったわ。でもとっくに化石と化したCPUよ。 今の時代にはOSすら満足に立ち上げる力も無いわ。
大昔の録画用PCでAIを動作させるとか草ゾ。
動作条件
・32bit命令で動いて、拡張命令はSSE2まで
・モデル容量は最大でも500MB程度(OS消費分を入れてもRAM内に収めるため)
実行環境
・Puppy Linux 431JP2012
・HDDなし、モデルはUSBメモリやRAMに置いておきそこからロードさせる
・AI推論エンジンにはllama2.cを使う
Puppy linux 4.3.1はwin98~XP時代のPCを動作させるのに丁度いい軽量Linuxディストリビューションですねぇ....
現代のOSみたいにPAEやNXビット等を要求しない、化石CPUに優しい仕様だゾ...
インストール手順
Puppy linuxのインストールはisoイメージをディスクに焼いて起動するだけで使えるので、割愛します。
ネットワーク環境の構築
流石にこのPCにwifiドングルを挿してドライバインストールして通信させるのはキツすぎたので、wifiを有線LANに変換してくれるアダプター (無線LANコンバータと言うらしい)を使いました。
起動したら、左下のメニューをクリック、セットアップ→ネットワークウィザードをクリック。
ウィンドウが開いたらネットワーク又は無線lanでインターネットをクリック。

今回は有線lanを使うので、eth0をクリック。

デスクトップのアイコンから端末を開いて
ip a
と入力。(今回はネットワークに繋いだeth0)にipアドレスが出てきたらOK。

wgetコマンドはSSL接続エラーが出る可能性が大なので事前に別PCで
wget https://github.com/karpathy/llama2.c/archive/refs/heads/master.zip -O llama2c.zip
# https://huggingface.co/karpathy/tinyllamas/tree/main ここから様々な規模のモデルをダウンロード
# https://huggingface.co/karpathy/tinyllamas/tree/main/stories260K ここから260Kモデルとtokenizerをダウンロード
# https://distro.ibiblio.org/puppylinux/puppy-2_%26_3_%26_4/puppy-4.3.1/からdevx_431.sfsをダウンロード
↑この3つのファイルをダウンロードしてusbメモリに入れておくのをおすすめするのぜ。
推論エンジンのインストール
cd /root && pwd
wget https://github.com/karpathy/llama2.c/archive/refs/heads/master.zip -O llama2c.zip
unzip llama2c.zip
cd llama2.c-master
puppyが古すぎてhttps(TLS)通信が弾かれる場合は、別のPCでダウンロードしておいてUSB経由でファイルを持って来てくれよな~頼むよ~
llama2c.zipというファイルは出来ているが、unzipするとcannot find zip directory...みたいなエラーが出る場合はファイルのダウンロードに失敗 しているゾ。オプションを付けずに wget "githubのurl" のみでコマンドを打ってみてsslエラーが出ていたらそれが原因だゾ。
ダウンロードしてもコンパイルしないと使えないので、こ↑こ↓
から"devx_431.sfs"と書かれたコンパイラのsfsファイルをダウンロードしてインストールする。
4.3.1以外のバージョンのpuppyを使っている場合はリンク先の上のディレクトリにdevx...から始まる様々なバージョンのコンパイラ用ファイルが置いてあるから 適宜探してくれゾ(動作保証はしないゾ)
ダウンロードしたsfsファイルを/rootに移動するのぜ。(GUIのエクスプローラーから行ってもOK)
mv devx_431.sfs /root
移動したら左下のメニュー→セットアップ→SFS-Load on-the-flyをクリック。

警告は無視して、ウィンドウが開いたらSFSをロードの下にあるフォルダアイコンをクリックしてさっき/rootに移動したsfsファイルを選択する。

選択したら下のロードを押すと自動でロードされるのぜ!
ロードが終わったらさっきの端末に戻って
gcc --version
を実行してバージョンが表示されればOKのぜ。
続いて
cd /root/llama2.c-master
gcc -std=gnu99 -O3 -march=pentium-m -mfpmath=sse run.c -o run -lm -lrt
# モデルをDL
wget https://huggingface.co/karpathy/tinyllamas/resolve/main/stories15M.bin
./run stories15M.bin
ここから色んな規模のモデルをダウンロードできるのぜ。
動かしてみたのぜ
stories260Kモデル+tok512.bin(トークナイザー) 約430tok/s
#260Kモデルではtokenizerを追加で読み込む必要があるので以下のコマンドで実行
./run stories260K.bin -z tok512.bin
stories42Mモデル 約6.6tok/s
stories110Mモデル 約2tok?/s(最後まで測れませんでした、すみません)
計測結果
| モデルの規模(パラメータ数) | 260K | 15M | 42M | 110M |
|---|---|---|---|---|
| 1秒あたりの推論速度(token/s) | 430token | 17.4token | 6.6token | 1~2token |
RAM上にモデルを置いた場合と、usbメモリに置いた場合で推論速度がほぼ変わらなかったのぜ。
110Mモデルはサイズが420MBあるからそもそも上の動画に写っている空きRAM容量では入らないんだよなぁ... でもllama2.cはmmap(メモリマップ)で読み込むからRAMに全部入らなくてもページキャッシュでやりくりして動くゾ。
20年前のPCでも5000万パラメータくらいなら実用的な速度で動くんですねぇ...会話とかは出来るんですかね?
一応 "-i" オプションを付ければプロンプトは与える事は可能ゾ。まあでもこのモデルではストーリーの続きを書くくらいの能力しかないゾ。 会話なんてさせたら意味不明な応答になって無理ゾ
まどかの家のパソコンで動くかしら...
【おまけ】 SSHでの接続方法
古いPCの画面は画素も粗く見づらい(偏見)ので、ssh経由で操作できるようにするゾ。
sshサーバー用ソフトをインストール
左下のメニューからセットアップ→Puppyパッケージマネージャを開くのぜ。

開いたら左下の検索窓にopenと入力して隣の実行ボタンを押す。すると結果に"openssh-5.3p1-p4"が出てくると思うのでそれをクリック。

画面の指示通りに進んでいき、ミラーサーバー一覧が出てくるので、現在も使えたibiblio.orgを選択。(全部は未検証)自動でダウンロード、インストールが終わればOK

sshのセットアップ
パスワードを設定していないと他のPCから接続させる事が出来ないので設定するのぜ。
デスクトップから端末を開いて
passwd
と入力。新しいパスワードを2回入力し、password for root changedと出ればOK。次に
/usr/sbin/sshd
と入力し、実行結果に何も出て来なかった場合は起動が成功している。そして
ps aux | grep sshd
このコマンドを実行し、出てきたプロセスの中に/usr/sbin/sshdと表示されていればOK。
次に、このPuppyマシンのipアドレスを調べるのぜ。
ip a
と入力し、出てきたinetの隣にある 192.168.x.xがPuppyのipアドレス。(今回はeth0の項目に記載されている)

IPアドレスが判明したら、別PCに戻りpowershellやコマンドプロンプトから
ssh [email protected]
と入力。これで繋がるはずなのぜ!
tera termというwindows用のソフトを使えばssh経由のファイル転送(SCP転送)もD&Dで簡単に出来るわ。おすすめよ。