📱

iPhoneのメモリ制限を超えてllama.cppをローカル推論する(日本語モデル)

2024/09/12に公開

※実機の動作スクショ

Apple Intelligenceが発表されたということで、比較対象としてios上でllama.cppの動作を確認してみました。

2024/09/12現在のコミットの情報です。

環境

M1 Macbook Air
Xcode Version 15.4 (15F31d)
iPhone 15 Pro Max RAM 8GB

ビルド

https://github.com/ggerganov/llama.cpp/discussions/4508

2024/09/12時点のmasterではビルドに失敗するので、ビルドが成功するところまでコミットを戻しましょう。

git clone https://github.com/ggerganov/llama.cpp.git
cd llama.cpp
git checkout 5fb5e24811cb01d48b482c15a974bfbd9f433e1d

あとはxcodeでexample/llama.swiftuiのプロジェクトを読み込んで、Releaseビルドします。

※READMEに記載のあるコミットハッシュは2023/12ぐらいのものなので読み込めるモデルが少ないです。

結果

実機ではmmnga/SakanaAI-EvoLLM-JP-v1-7B-q4_K_M.gguf(4.37GB)が実行できました。

ベンチでは
pp 512: 80.84 ± 15.32
tg 128 8.84 ± 1.31
ぐらいです。
まあまあの速度ですね。

限界突破

Xcode上でExtended Virtual AddressingIncreased Memory Limitの設定を入れると、利用可能なメモリ量を増やすことができます。

例えば
mmnga/SakanaAI-EvoLLM-JP-v1-7B-q6_k.gguf (5.94GB)
をllama.cppのswiftアプリで実行すると、

ggml_backend_metal_log_allocated_size: allocated buffer, size =  1672.69 MiB, ( 5768.77 /  5461.34)ggml_backend_metal_log_allocated_size: warning: current allocated size is greater than the recommended max working set size
llm_load_tensors: offloading 32 repeating layers to GPU
llm_load_tensors: offloading non-repeating layers to GPU
llm_load_tensors: offloaded 33/33 layers to GPU
llm_load_tensors:        CPU buffer size =   102.54 MiB
llm_load_tensors:      Metal buffer size =  5563.56 MiB

warning: current allocated size is greater than the recommended max working set size

というようなログが発生します。
これはiOS側の recommendedMaxWorkingSetSize を超過していることを示しています。

https://developer.apple.com/documentation/metal/mtldevice/2369280-recommendedmaxworkingsetsize

これでメモリ制限を超えてllama.cppを実行することができました。

また、別のモデルの
gemma-2-9b-it-GGUF/gemma-2-9b-it-Q4_K_M.gguf(5.76GB)
も実機上でロードできましたが、実行結果がおかしいですね。

こちらは実行中にinsufficient memoryが発生してしまっているようです。

※disk readが1GB/s程度発生しているので、もしかしたらswapしているのかもしれません。

参考

https://huggingface.co/bartowski/gemma-2-9b-it-GGUF/tree/main
https://huggingface.co/mmnga/SakanaAI-EvoLLM-JP-v1-7B-gguf/tree/06419aa91ae7eb1d59413b066caae0eba5ea9152
https://tech-blog.optim.co.jp/entry/2022/10/26/080000

※シミュレータ上のgemma2

Discussion