ココリーネの趣味部屋

20年前のノートPCでAIを動かしてみる(llama2.c)

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と言えるのか...

ほむほむ
ほむほむ

生物で例えるなら昆虫の脳のようなものかしら...

MUR
MUR

その考え方は例えとしてかなりいいゾ。 1500万パラメータ(例えると昆虫みたいな)モデルでも、中身は巨大AI(人間のような)と同じ「Transformer」というニューラルネットワークの仕組みで動いているゾ

今回使用したチョー古いジャンクパソコン

fmv nb90k
型番:富士通 FMV NB90K (2005年発売)
CPU:Pentium M 735 1.7GHz
RAM:DDR-266 512MB+128MB(合計640MB)
ストレージ:なし

ほむほむ
ほむほむ

CPUはDothanコアを載せたPentium Mね。2004年の発売当時は省電力ながら高い性能を誇った優等生CPUだったわ。でもとっくに化石と化したCPUよ。 今の時代にはOSすら満足に立ち上げる力も無いわ。

MUR
MUR

大昔の録画用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ディストリビューションですねぇ....

MUR
MUR

現代のOSみたいにPAEやNXビット等を要求しない、化石CPUに優しい仕様だゾ...

インストール手順

Puppy linuxのインストールはisoイメージをディスクに焼いて起動するだけで使えるので、割愛します。

ネットワーク環境の構築

流石にこのPCにwifiドングルを挿してドライバインストールして通信させるのはキツすぎたので、wifiを有線LANに変換してくれるアダプター (無線LANコンバータと言うらしい)を使いました。

起動したら、左下のメニューをクリック、セットアップ→ネットワークウィザードをクリック。
ウィンドウが開いたらネットワーク又は無線lanでインターネットをクリック。
ネットワークウィザード
今回は有線lanを使うので、eth0をクリック。
ネットワーク選択画面
デスクトップのアイコンから端末を開いて

ip a

と入力。(今回はネットワークに繋いだeth0)にipアドレスが出てきたらOK。
puppy linuxの端末画面

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経由でファイルを持って来てくれよな~頼むよ~

MUR
MUR

llama2c.zipというファイルは出来ているが、unzipするとcannot find zip directory...みたいなエラーが出る場合はファイルのダウンロードに失敗 しているゾ。オプションを付けずに wget "githubのurl" のみでコマンドを打ってみてsslエラーが出ていたらそれが原因だゾ。

ダウンロードしてもコンパイルしないと使えないので、こ↑こ↓ から"devx_431.sfs"と書かれたコンパイラのsfsファイルをダウンロードしてインストールする。

MUR
MUR

4.3.1以外のバージョンのpuppyを使っている場合はリンク先の上のディレクトリにdevx...から始まる様々なバージョンのコンパイラ用ファイルが置いてあるから 適宜探してくれゾ(動作保証はしないゾ)

ダウンロードしたsfsファイルを/rootに移動するのぜ。(GUIのエクスプローラーから行ってもOK)

mv devx_431.sfs /root

移動したら左下のメニュー→セットアップ→SFS-Load on-the-flyをクリック。
puppyのスタートメニュー画面
警告は無視して、ウィンドウが開いたらSFSをロードの下にあるフォルダアイコンをクリックしてさっき/rootに移動したsfsファイルを選択する。
SFS-Load on-the-flyの画面
選択したら下のロードを押すと自動でロードされるのぜ!
ロードが終わったらさっきの端末に戻って

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メモリに置いた場合で推論速度がほぼ変わらなかったのぜ。

MUR
MUR

110Mモデルはサイズが420MBあるからそもそも上の動画に写っている空きRAM容量では入らないんだよなぁ... でもllama2.cはmmap(メモリマップ)で読み込むからRAMに全部入らなくてもページキャッシュでやりくりして動くゾ。

野獣先輩
野獣先輩

20年前のPCでも5000万パラメータくらいなら実用的な速度で動くんですねぇ...会話とかは出来るんですかね?

MUR
MUR

一応 "-i" オプションを付ければプロンプトは与える事は可能ゾ。まあでもこのモデルではストーリーの続きを書くくらいの能力しかないゾ。 会話なんてさせたら意味不明な応答になって無理ゾ

ほむほむ
ほむほむ

まどかの家のパソコンで動くかしら...

【おまけ】 SSHでの接続方法

古いPCの画面は画素も粗く見づらい(偏見)ので、ssh経由で操作できるようにするゾ。

sshサーバー用ソフトをインストール

左下のメニューからセットアップ→Puppyパッケージマネージャを開くのぜ。 Puppyパッケージマネージャの画面
開いたら左下の検索窓にopenと入力して隣の実行ボタンを押す。すると結果に"openssh-5.3p1-p4"が出てくると思うのでそれをクリック。
Puppyパッケージマネージャの画面
画面の指示通りに進んでいき、ミラーサーバー一覧が出てくるので、現在も使えた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の項目に記載されている)
puppyマシンのipアドレス
IPアドレスが判明したら、別PCに戻りpowershellやコマンドプロンプトから

ssh [email protected]

と入力。これで繋がるはずなのぜ!

ほむほむ
ほむほむ

tera termというwindows用のソフトを使えばssh経由のファイル転送(SCP転送)もD&Dで簡単に出来るわ。おすすめよ。

× 拡大画像