Tinygrad で eGPU と MacBook Air をつなげて LLM を使うと速くなるのか
ちょっと前にニュースになってたので知っている人もいるかと思うが、Tinygrad がリリースしたドライバを使うと Mac でも外付けの eGPU を接続して LLM で使えるらしい。
今回は手持ちの GPD G1 という eGPU を使うことにした。
スペックは以下。
- AMD Radeon RX 7600M XT 8GB GDDR6
- RDNA3
- 約 225 x 111 x 30 mm
- 約0.92kg
Tinygrad を使うには RDNA3+ でなければいけないのだが、満たしているようだ。
セットアップ
まずは、ドライバのインストールをする。ドライバは TinyGPU.app というデスクトップアプリもあるが、これではなくドキュメントに書かれている以下のやり方に従った。
$ curl -fsSL https://raw.githubusercontent.com/tinygrad/tinygrad/master/extra/setup_tinygpu_osx.sh | sh
どうやら Mac の環境がどうなっているかでインストール方法には前段などがあると思われる。自分の場合は venv を使うことを要求された。Git でリポジトリをクローンして python3 -m pip install -e . をしろと要求されるかもしれない。
続いて、コンパイラのセットアップ
$ curl -fsSL https://raw.githubusercontent.com/tinygrad/tinygrad/master/extra/setup_hipcomgr_osx.sh | sh
もし手こずる人がいるとするとこの段階だと思う。 eGPU とかの相性もあるのかもしれないし、既存の Python 環境との兼ね合いなんかもあるかもしれない。自分はちょっと手こずったが割とスムーズに進めた。
まずはちょっと LLM を試す
無事セットアップを終えたところで、ベンチマークの前に小さなモデルで遊んでみる。
$ DEV=AMD python3 tinygrad/apps/llm.py
using model "Llama 3.2 1B Instruct" with 1,021,800,576 bytes and 1,498,482,688 params
>>> こんにちは
こんにちは!どういたしまして?
>>> あなたはだれですか?
私はAIです。
>>> これはAMDのGPUをつかっているのでしょうか?
はい、AMD Radeon GPUです。
無事動いた。なんか最初は時間がかかるものの、動き始めるとわりとスムーズである。この段階で既に eGPU は使っているような気がする。
ちゃんと eGPU を認識しているのだろうかチェック
LLM が「はい、AMD Radeon GPUです。」とか言ってても怪しいので system_profiler をつかってみる。
$ system_profiler SPDisplaysDataType
Graphics/Displays:
Display:
Type: External GPU
Bus: PCIe
PCIe Lane Width: x8
Vendor: AMD (0x1002)
Device ID: 0x7480
Revision ID: 0x00c7
Apple M3:
Chipset Model: Apple M3
Type: GPU
Bus: Built-In
Total Number of Cores: 10
Vendor: Apple (0x106b)
Metal Support: Metal 4
Displays:
Color LCD:
Display Type: Built-in Liquid Retina Display
Resolution: 2560 x 1664 Retina
Main Display: Yes
Mirror: Off
Online: Yes
Automatically Adjust Brightness: No
Connection Type: Internal
やはり認識しているっぽいことがわかった。
ベンチマークをしてみる
さて、どれくらい速くなったか速度をそれぞれのケースで比較してみよう。
まずは GPD G1 を接続した状態にて走らせてみる。
$ DEV=AMD python3 tinygrad/apps/llm.py --benchmark 50
using model "Llama 3.2 1B Instruct" with 1,021,800,576 bytes and 1,498,482,688 params
15133.79 ms, 0.07 tok/s, 0.07 GB/s, 1084/1290 MB -- <|begin_of_text|>Tags
4018.62 ms, 0.25 tok/s, 0.26 GB/s, 1043/1290 MB -- <|begin_of_text|>Tags:
1089.41 ms, 0.92 tok/s, 0.96 GB/s, 1044/1292 MB -- <|begin_of_text|>Tags:
39.04 ms, 25.62 tok/s, 26.77 GB/s, 1045/1292 MB -- <|begin_of_text|>Tags: 201
...
36.34 ms, 27.52 tok/s, 29.59 GB/s, 1075/1292 MB -- <|begin_of_text|>Tags: 2019, 2020, 2021, 2022, 2023, 2024, 2025, 2026, 2027, 2028, 2029, 2030
つづいて、MacBook Air。これはおそらく GPU ありの場合。
$ python3 tinygrad/apps/llm.py --benchmark 50
using model "Llama 3.2 1B Instruct" with 1,021,800,576 bytes and 1,498,482,688 params
11085.22 ms, 0.09 tok/s, 0.10 GB/s, 1084/1290 MB -- <|begin_of_text|>Tags
5598.67 ms, 0.18 tok/s, 0.19 GB/s, 1043/1290 MB -- <|begin_of_text|>Tags:
861.38 ms, 1.16 tok/s, 1.21 GB/s, 1044/1292 MB -- <|begin_of_text|>Tags:
142.57 ms, 7.01 tok/s, 7.33 GB/s, 1045/1292 MB -- <|begin_of_text|>Tags: 201
...
143.95 ms, 6.95 tok/s, 7.47 GB/s, 1075/1292 MB -- <|begin_of_text|>Tags: 2019, 2020, 2021, 2022, 2023, 2024, 2025, 2026, 2027, 2028, 2029, 2030
最後に CPU のみ。さすがに遅い。
$ DEV=CPU python3 tinygrad/apps/llm.py --benchmark 50
using model "Llama 3.2 1B Instruct" with 1,021,800,576 bytes and 1,498,482,688 params
13319.61 ms, 0.08 tok/s, 0.08 GB/s, 1080/1290 MB -- <|begin_of_text|>Tags
6992.82 ms, 0.14 tok/s, 0.15 GB/s, 1043/1290 MB -- <|begin_of_text|>Tags:
1167.93 ms, 0.86 tok/s, 0.89 GB/s, 1044/1292 MB -- <|begin_of_text|>Tags:
353.84 ms, 2.83 tok/s, 2.95 GB/s, 1044/1292 MB -- <|begin_of_text|>Tags: 201
...
391.23 ms, 2.56 tok/s, 2.74 GB/s, 1073/1292 MB -- <|begin_of_text|>Tags: 2019, 2020, 2021, 2022, 2023, 2024, 2025, 2026, 2027, 2028, 2029, 2030
結果発表
- AMD : GPD G1 をつかう場合、まあ使えなくもないかって感じ
36.34 ms, 27.52 tok/s, 29.59 GB/s
- 無印 : たぶん MacBook Air の内蔵グラフィクスを使う
143.95 ms, 6.95 tok/s, 7.47 GB/s
- CPU : CPU のみで実行
391.23 ms, 2.56 tok/s, 2.74 GB/s
MacBook Air M3 を使う場合は eGPU を利用すると4倍くらい速くなることがわかった。GPD G1 は MacBook Air の半分くらいのサイズなので、これなら eGPU ごと外に持っていくなんてことも出来そうに思える。まあ自宅にある GPU 搭載マシンにリモートアクセスしたほうがいいようにも思うものの、ロマン度という点では優っているのではないだろうか。
