12年前のRaspberry PiでローカルLLMを動かしてみた(本当に動いた!)

BBetter Stack
Computing/SoftwareConsumer Electronics

Transcript

00:00:00これは2014年に発売された、初代Raspberry Piです。
00:00:05700 MHzのシングルコアプロセッサと、512 MBのRAMを搭載しています。
00:00:12現代の基準から見れば、これは基本的に電卓のようなものです。
00:00:16しかし今日、この12年前のハードウェアを
00:00:21限界まで追い込んで、大規模言語モデルをローカルで動かせるか試してみます。
00:00:26この動画では、Raspberry Piで動作する超小型モデルを紹介し、
00:00:30そのパフォーマンスを確認した上で、必要な依存関係のインストール手順を説明します。
00:00:35そうすれば、皆さんも自分で試すことができます。
00:00:37とても面白い挑戦になるので、さっそく本題に入りましょう。
00:00:40正直なところ、このアーキテクチャで動くほど
00:00:47軽量なモデルが見つかるとは思っていませんでした。
00:00:49しかし調べていくうちに、ついに候補を見つけました。
00:00:52それがこの「Falcon H1 Tiny」です。
00:00:54パラメータ数がわずか9000万という、驚異的にコンパクトなモデルです。
00:00:59アブダビのテクノロジーイノベーション研究所(TII)が、
00:01:03言語モデルの極限の最小構成を模索するために開発したものです。
00:01:08しかし、どうやってこれほど小さなモデルを作れたのでしょうか?
00:01:10何か特別な技術的魔法があるのでしょうか?
00:01:13実は、そうでもありません。
00:01:14基本的には、IBMが超小型モデル「Granite 4」で採用したような、
00:01:19TransformerとMambaを組み合わせたハイブリッドアーキテクチャを使用しています。
00:01:24これについては、過去の動画でも紹介しているので、ぜひご覧ください。
00:01:27しかし、ここからが本題です。
00:01:28このモデルをメモリ内に収めるには、「量子化」について話す必要があります。
00:01:33現在、Falconモデルには2ビット、4ビット、8ビットのバージョンがあります。
00:01:38超軽量な「IQ(重要度量子化)」を試したくなるかもしれませんが、
00:01:43ここに落とし穴があります。
00:01:45これらの新しい手法は、複雑なビット操作に依存しており、
00:01:49効率的に処理するには現代的なCPU命令が必要になります。
00:01:52Raspberry Piに搭載されている古いARMv6チップでは、これに対応できません。
00:01:57そのため、今回は相性の良い古典的な手法である、
00:02:01古いスタイルの「Q4」モデルを採用する必要があります。
00:02:04これは、Piのプロセッサでも処理が滞らない、
00:02:07中密度のレガシー量子化手法です。
00:02:11推論ロジックを維持しつつ、最高の「1メガバイトあたりの知能」比率を実現できます。
00:02:17しかし、この初代Raspberry Piでモデルを動かすのは簡単なことではありません。
00:02:22PiはARMv6アーキテクチャを採用しているため、
00:02:26ほぼすべてのAIライブラリが依存している、現代的な「NEON命令」がありません。
00:02:31幸いなことに、推論の実行に使える「llama.cpp」があります。
00:02:36ただし、そのためにはARMv6専用にバイナリをコンパイルする必要があります。
00:02:42もしPi上で直接コンパイルしようとすれば、
00:02:45コンパイルが完了するまでにおそらく18時間はかかるでしょう。
00:02:49そもそも、メモリ不足(OOM)エラーでクラッシュしなければの話ですが。
00:02:53この問題を回避するために、少し工夫を凝らします。
00:02:56事前に「dockcross」を使い、手元のノートPCでクロスコンパイルを行います。
00:03:02VFP浮動小数点演算ユニットを有効にし、ARMv6命令セットを明示的にターゲットに指定して、
00:03:08ビルドしたバイナリをSSH経由でコピーすれば、すぐに推論を始められます。
00:03:13では、さっそく進めていきましょう。
00:03:15まず、Raspberry Pi Imagerを使って、最も軽量なOSをPiに書き込みます。
00:03:22RAMが512 MBしかないボードでは、1メガバイトの節約が命取りになります。
00:03:28そこで、32ビット版の「Raspberry Pi OS Lite」を選択します。
00:03:32これにはデスクトップ画面がなく、アイドル時のメモリ消費量が
00:03:38標準OSのほんのわずかで済むため、ほぼすべてのRAMをモデルの実行に割り当てられます。
00:03:44ここで重要な注意点ですが ぜひ詳細設定を使って
00:03:47Wi-Fiの事前設定と SSHの有効化を行ってください
00:03:51これほど古いボードでは、動作の重いローカル端末を操作するよりも、
00:03:55リモートで一括管理するほうがはるかに楽だからです。
00:03:58Piが起動してSSHで接続できたら、今度はARMv6の問題に対処します。
00:04:05もしこの場でllama.cppをコンパイルしようとすると、
00:04:08Piはヘッダーファイルの読み込みだけで丸一日以上を費やすことになります。
00:04:13そのため、計算速度を上げ時間を節約するために、通常のノートPCで作業を行います。
00:04:18llama.cppのソースコードをクローンし、
00:04:23Raspberry Piで使用するビルド成果物を保存するための専用ディレクトリを作成します。
00:04:28ここでまた別の問題が発生します。
00:04:29私のMacは64ビットのARMv8であり、32ビットのARMv6ではありません。
00:04:37これらは命令セットが異なります。
00:04:40そこで、Pi向けにバイナリをコンパイルするために、「dockcross」を使用します。
00:04:45これはMac上で動作しながら、
00:04:48Piの古いアーキテクチャに適合したバイナリを生成できるクロスコンパイラツールチェーンです。
00:04:53次に、ビルドの設定を行います。
00:04:55ここでは、極めて正確な指定が必要です。
00:04:58非常に具体的なフラグをいくつか渡す必要があります。
00:05:00まず、単一のポータブルなバイナリを作成するために、共有ライブラリ(shared libs)をオフにします。
00:05:05そして、Piには最新の数学命令がないため、NEONを無効化します。
00:05:10さらに、メモリ使用量を最小限に抑えるためにOpenMPを無効にします。
00:05:15バイナリが古いPiのボードと確実に互換性を持つよう、
00:05:18近代的な贅沢機能をすべて削ぎ落としています。
00:05:22ここでビルドを実行すれば、約2分で、
00:05:26Piのボードにコピーしてすぐ使える、最適化されたコンパイル済みのllama推論バイナリが完成します。
00:05:31続いてSSHを使い、ネットワーク経由でPiに直接接続します。
00:05:35Pi側に新規ディレクトリを作成し、SCPを使ってカスタムビルドしたバイナリをコピーします。
00:05:42そして、最後にもう一つ作業があります。
00:05:44Falconの2ビット、4ビット、8ビットのレガシー量子化モデルをあらかじめダウンロードしておきます。
00:05:50これらを順番にすべてテストしていくためです。
00:05:53ネットワーク経由で、Piのmodelsフォルダへ一つずつコピーしていきます。
00:05:58ここからがお楽しみです
00:05:59Piの画面に移り、最初の推論テストを実行しましょう。
00:06:03最も圧縮率の高い、2ビット量子化モデルから開始します。
00:06:07ここでは、この長いコマンドを実行する必要があります。
00:06:10ここで行っているのは、単純に
00:06:13「Hello, how are you?」というプロンプトを入力し、出力を32トークンに制限することです。
00:06:18スレッド数は厳密に「1」を指定しています。それしかリソースがないからです。
00:06:22また、RAMを1バイトでも節約するために、文脈サイズ(context size)も128トークンと極小に抑えています。
00:06:29しかし、ここで最も重要なフラグは「no M map」です。
00:06:32通常、llama.cppはメモリマッピング(mmap)を使用してモデルを読み込み、これは高性能なGPUには最適ですが、
00:06:38このPiのボードにとっては致命的な問題となります。
00:06:41RAMが512 MBしかない32ビットシステムでは、
00:06:45連続したアドレス空間のブロックが見つからない場合、mmapは失敗してしまいます。
00:06:50そのため、これを無効化することでモデルをヒープ領域に直接読み込ませ、
00:06:55限られたメモリをより安定してコントロールできるようにします。
00:06:58それを踏まえて、コマンドを実行してみましょう。
00:07:00出ました、最初のトークンが生成されています。
00:07:03見ての通り、2ビットバージョンはかなり苦戦しています。
00:07:08まず、1トークンの処理に約3秒かかっており、
00:07:14これは古いRaspberry Piのボードであれば予想通りの速度です。
00:07:18しかしそれ以上に、返答内容が完全に支離滅裂な意味不明なものになっています。
00:07:21パラメータ数が9000万のモデルでは、重みが圧縮されすぎて
00:07:25言語的なロジックが事実上崩壊してしまっているのです。
00:07:28かろうじて成立しているレベルですが、技術的には動作しています。
00:07:32では、これを4ビットモデルに入れ替えるとどうなるか見てみましょう。
00:07:35ご覧ください、今度は筋の通った挨拶が返ってきました。
00:07:40これは成功と言えます。
00:07:42本物のAIモデルがPi上でローカルに動作し、
00:07:47プロンプトに対して論理的に応答しています。
00:07:49やりましたね!
00:07:50では、さらに限界を押し広げてみましょう。
00:07:53Piが8ビットモデルを処理できるか確認します。
00:07:56今回は、もう少し知的な質問として、
00:07:59「アルバニアの首都はどこですか?」と尋ねてみます。
00:08:02結果は間違っています。アルバニアの首都はティラナなので、
00:08:08これは明らかに事実として正しくありません。
00:08:10しかし、「ベルギーの首都はどこですか?」と聞くと、正しく答えます。
00:08:15ここから非常に興味深い事実が見えてきます。
00:08:179000万パラメータという制約には、それなりの代償があるようです。
00:08:22面積が広く有名な国については正確な知識を持っていても、
00:08:26知名度の低い国や、あまり一般的でないトピックに関する知識は不足しています。
00:08:31それが知識ベースのモデルの性質というものです。
00:08:339000万というパラメータ数に詰め込める知識の量には、物理的な限界があります。
00:08:38それにもかかわらず、この実験結果は非常に素晴らしいものです。
00:08:4112年前のRaspberry Piでも動作するほど十分に小さく、
00:08:46軽量なAIモデルが確かに存在することが証明されました。
00:08:50速度は速いでしょうか?
00:08:51全くそんなことはありません。
00:08:52正確でしょうか?
00:08:53怪しいところです。
00:08:54実務の本番環境(プロダクション)で使うべきでしょうか?
00:08:55おそらく使わない方がいいでしょう。
00:08:57動作がものすごく、ものすごく遅いロボットを作りたい場合を除けばですが。
00:09:02しかし最も重要なのは、それが理論的に可能であると分かったことです。
00:09:06基本的に、この動画で証明したかったのはそれだけです。
00:09:09率直に言って、この実験はとても楽しいものでした。
00:09:13以上が今回の内容です。
00:09:14これが「Falcon H1 Tiny」モデルです。
00:09:17おそらく現在存在する中で最も小さなAIモデルでしょう。
00:09:20そして、これが初代Raspberry Piで実際に動作するほど小さいことが分かりました。
00:09:25本当に素晴らしいことです。
00:09:27この事実の面白さは、いくら強調してもしきれません。
00:09:30実用面での実装は役に立たないとしても、技術的なロマンがあります。
00:09:35皆さんも、面白いアイデアや意見、
00:09:37あるいは今回の内容に対する感想があれば、ぜひ教えてください。
00:09:40下のコメント欄に投稿をお願いします。
00:09:42また、こういった技術的な解説動画がお好きな方は、
00:09:45動画の下にある高評価ボタンを押して意思表示をお願いします。
00:09:49チャンネル登録もお忘れなく。
00:09:51Better StackのAndrisでした。また次の動画でお会いしましょう。

Key Takeaway

9000万パラメータの「Falcon H1 Tiny」モデルは、適切な量子化とARMv6環境向けのクロスコンパイルを行うことで、12年前の初代Raspberry Pi上でも論理的な推論を実行可能である。

Highlights

  • 2014年に発売された初代Raspberry Piは、700 MHzシングルコアプロセッサと512 MBのRAMを搭載する。

  • パラメータ数9000万の「Falcon H1 Tiny」モデルは、TransformerとMambaを組み合わせたハイブリッドアーキテクチャを採用している。

  • ARMv6アーキテクチャはNEON命令セットをサポートしていないため、最適化されたカスタムバイナリのクロスコンパイルが必須となる。

  • 初代Raspberry Piのメモリ制約下では、メモリマッピング(mmap)を無効化し、ヒープ領域に直接モデルを読み込む必要がある。

  • 2ビット量子化モデルは推論速度が遅く、回答が支離滅裂になるが、4ビット量子化モデルでは論理的な応答が可能になる。

  • 9000万パラメータのモデルは、広く認知された知識は回答できるが、知名度の低い情報には事実誤認が生じる。

Timeline

実験の概要とモデル選定

  • 700 MHzプロセッサと512 MBのRAMを搭載する初代Raspberry Piの限界を検証する。
  • アブダビのテクノロジーイノベーション研究所が開発した9000万パラメータの「Falcon H1 Tiny」を使用する。

現代の基準では電卓に近いスペックを持つ12年前のハードウェア上で、大規模言語モデルをローカル動作させる試み。Falcon H1 Tinyは、IBMのGranite 4と同様のTransformerとMambaを組み合わせたハイブリッドアーキテクチャを採用し、極小構成を実現している。

量子化手法とアーキテクチャの制約

  • ARMv6アーキテクチャは最新の効率的な量子化手法を処理できないため、レガシーな「Q4」量子化を選択する。
  • Raspberry Pi上での直接コンパイルは18時間以上かかるため、PCを用いたクロスコンパイルを行う。

最新のIQ量子化などは複雑なビット操作が必要で、ARMv6の古い命令セットでは対応できない。そのため、処理負荷の低い従来のQ4量子化を採用し、dockcrossなどのツールを使用してホストPC上でARMv6向けバイナリを事前にビルドする。

OS環境とビルド設定の最適化

  • デスクトップ画面を排除した32ビット版「Raspberry Pi OS Lite」を使用し、メモリ消費を最小限に抑える。
  • バイナリ作成時にNEON命令、OpenMP、共有ライブラリを無効化し、ARMv6との互換性を確保する。

512 MBの貴重なRAMをAIモデルの実行に集中させるため、OSは軽量なLite版を選択。クロスコンパイル時には、Piが処理できない近代的機能をすべて除外することで、低リソース環境でも安定して動作するバイナリを構築する。

推論テストと実行結果

  • メモリ不足を回避するため、メモリマッピング(mmap)を無効化してヒープ領域へ直接モデルを読み込む。
  • 4ビットモデルは論理的な挨拶が可能な一方、2ビットモデルは回答の論理性が完全に崩壊する。
  • 知識ベースのサイズ限界により、メジャーな情報には応答できるが、マイナーな情報には誤答する傾向がある。

SSH接続を介して実行したテストでは、2ビットモデルは3秒に1トークンという遅い生成速度でありながら、回答自体は支離滅裂なものとなった。しかし、4ビットモデルでは実用レベルの論理的な応答が確認できた。この実験は実務用途ではないものの、技術的なロマンを証明することに成功した。

Community Posts

View all posts