さてさて我が家のチャッピー君(ChatGPTではなく我が家のHome Assistant(HA)に構築した音声アシスタントの名前)ですが、今も無事動いています。以前ChatGPTにRyzenのiGPU(CPUに内蔵されているGPU)をOllamaで使えないのかと聞いた時に、ほとんど無理みたいな消極的な回答だったのですが、試しにGoogle Geminiに聞いたところ意外にも前向きな回答がありました。それならば、早速試してみました。
Geminiおすすめのgemma2:2.6Bを入れむにゃむにゃ設定して無事iGPUを使って動かせるようになりました。あ、Googleだからgemma推しは当然か。ChatGPTはなぜかqwen推しなんですよね。"ollama run <モデル名> --verbose"とかすると速度とかがわかるので測ってみたところ、iGPUを使うと、なんと速度が10倍以上も速くなることが判明しました。GPUすごい!これは使わない手はない、ということで早速ちゃんと組み込むことにしました。
あれれ?さっきは動いていたのに、今はもうGPUが使われていない("ollama ps"とするとCPUを使っているのかGPUを使っているのかがわかります)。なんで?さっきの10倍速は幻だったのか、と思いながらGeminiと一緒に奮闘すると、どうやら何度も動かすとVRAMが足りなくなるそうな(本当?)。PCIに接続するGPUと違いiGPUはメインメモリの一部をVRAMにします。なので、BIOS設定でVRAMの割り当てを512KBから4GBに変更し、他にもむにゅむにゃやったら無事安定してiGPUを使うようになりました。16GBのメモリしかないのにVRAMに4GBも使うとなると他のコンテナやらVMやらの割り当てを減らさなければなりません。HAには6GBも割りてていたので、これを4GBにしたら、あれあれ、なんか動かなくなってしまいました。今度はVOICEVOXが動くとメモリが足りなくなって落ちてしまうようです。VOICEVOXはHAと同じPROXMOXのVMで動いています。なのでHAのVMへの割り当ては6GBに戻し、他のところからメモリをかき集めてなんとか安定して速くなりました。
以下、iGPUを使わない時のchatモデルで「おはよう」を言った時の実行結果です("--verbose"オプション)。
load duration: 110.484466ms
prompt eval count: 147 token(s)
prompt eval duration: 5.702758042s
prompt eval rate: 25.78 tokens/s
eval count: 17 token(s)
eval duration: 1m21.800954295s
eval rate: 0.21 tokens/s
次にiGPUを使った時の結果です。
load duration: 129.853458ms
prompt eval count: 225 token(s)
prompt eval duration: 280.797738ms
prompt eval rate: 801.29 tokens/s
eval count: 113 token(s)
eval duration: 27.043974239s
eval rate: 4.18 tokens/s
全体の実行時間("total duration")ではおよそ3倍、"eval rate"に至っては20倍、iGPUを使った時の方が速いです。ChatGPTやGeminiにこのiGPUを使った結果を見せたところ、一般的な場合よりも遅いそうです。なので、iGPUがちゃんと使われていないんじゃないか疑惑が持ち上がりました。AIに、これをやってみろ、あれをやってみろと言われて、ヘイヘイと色々と試したんですが、結果、これ以上速くなりませんでした。GPUの稼働率をリアルタイムで見せるnvtopにも謎の表示があったので不安があったのですが、AIにiGPUなしの結果を見せたら、十分速いんじゃないの、これで十分なのでは、と急に態度が変わりました。おいおい。
実際にHome Assistantに組み込んでみた体感ですが、若干速くなったような気もします。実際にはspeech-to-textの時間や、intentの分類などの時間もあるので、まあそんなもんなのでしょう。
以下4/17の訂正
Modelfileで6CPU(H/Wスレッド)しか割り当ててないのに10CPUを指定してました。これが遅い原因でした。で、以下計り直した結果です。
- iGPUなし
total duration: 5.886410762s
load duration: 114.233945ms
prompt eval count: 162 token(s)
prompt eval duration: 3.737510358s
prompt eval rate: 43.34 tokens/s
eval count: 25 token(s)
eval duration: 1.997318023s
eval rate: 12.52 tokens/s
- iGPUあり
total duration: 1.371838779s
load duration: 135.708187ms
prompt eval count: 162 token(s)
prompt eval duration: 58.687355ms
prompt eval rate: 2760.39 tokens/s
eval count: 22 token(s)
eval duration: 1.143910017s
eval rate: 19.23 tokens/s
ただし以前測った時とSystem promptが少し違っています。結果、eval rateではiGPUありとなしの差が縮まってしまいましたが、eval durationでは倍近く速くなっていて、total durationでは4倍以上の差があります。体感的には2倍速い近い気がします。Prompt eval時間が大きく違っているのがわかります。モデルはgemma2:2BでVRAMには2GB割り当てています。