iPhoneのメモリ制限を超えてllama.cppをローカル推論する(日本語モデル)
※実機の動作スクショ
Apple Intelligenceが発表されたということで、比較対象としてios上でllama.cppの動作を確認してみました。
2024/09/12現在のコミットの情報です。
環境
M1 Macbook Air
Xcode Version 15.4 (15F31d)
iPhone 15 Pro Max RAM 8GB
ビルド
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 Addressing
とIncreased 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
を超過していることを示しています。
これでメモリ制限を超えてllama.cppを実行することができました。
また、別のモデルの
gemma-2-9b-it-GGUF/gemma-2-9b-it-Q4_K_M.gguf(5.76GB)
も実機上でロードできましたが、実行結果がおかしいですね。
こちらは実行中にinsufficient memoryが発生してしまっているようです。
※disk readが1GB/s程度発生しているので、もしかしたらswapしているのかもしれません。
参考
※シミュレータ上のgemma2
Discussion