Llama.cpp + Metal による Llama 2 の高速実行を試す
「Llama.cpp」+「Metal」による「Llama 2」の高速実行を試したのでまとめました。結果はCPUのみと大差なしでしたが、あとで解決方法見つかるかもなので記録として残します。
【追加情報】 JohnK.Happy さんががMetalの高速実行に成功 (M1 Max)
1. Llama.cpp のオプション
前回、「Llama.cpp」で「Llama 2」をCPUのみで動作させましたが、今回はGPUで速化実行します。
「Llama.cpp」にはCPUのみ以外にも、GPUを使用した高速実行のオプションも存在します。
2. ビルドツールの準備
(1) 「cmake」のインストール。
$ brew install cmake
3. Llama.cpp + Metalの実行
「Llama.cpp + Metal」の実行手順は、次のとおりです。
(1) リポジトリのクローン。
$ git clone https://github.com/ggerganov/llama.cpp
$ cd llama.cpp
(2) cmakeによるビルド。
「llama.cpp/build-metal/bin/Release/」に「main」が生成されます。
$ mkdir build-metal
$ cd build-metal
$ cmake -DLLAMA_METAL=ON ..
$ cmake --build . --config Release
$ cd ..
(3) 「main」を「llama.cpp」のルートに移動
(4) ダウンロードしたモデルを「llama.cpp/models」に配置。
今回は、「TheBloke/Llama-2-7B-Chat-GGML」の「llama-2-7b-chat.ggmlv3.q4_0.bin」をダウンロードして配置しました。Llama.cppのドキュメントにv3のq4_0のみとあったので選択してます。
(5) 推論の実行。
$ ./main -m ./models/llama-2-7b-chat.ggmlv3.q4_0.bin --temp 0.1 -p "### Instruction: What is the height of Mount Fuji?
### Response:" -b 512 -ngl 32
・Metalが有効かどうかの確認
「Metal」が有効時には、「ggml_metal_XXX」「NEON = 1」といったログが起動時に表示されます。
ggml_metal_init: allocating
ggml_metal_init: using MPS
:
ggml_metal_add_buffer: allocated 'data ' buffer, size = 3616.08 MB, ( 3616.53 / 10922.67)
ggml_metal_add_buffer: allocated 'eval ' buffer, size = 10.00 MB, ( 3626.53 / 10922.67)
ggml_metal_add_buffer: allocated 'kv ' buffer, size = 258.00 MB, ( 3884.53 / 10922.67)
ggml_metal_add_buffer: allocated 'scr0 ' buffer, size = 132.00 MB, ( 4016.53 / 10922.67)
ggml_metal_add_buffer: allocated 'scr1 ' buffer, size = 160.00 MB, ( 4176.53 / 10922.67)
:
ggml_metal_free: deallocating
system_info: n_threads = 4 / 8 | AVX = 0 | AVX2 = 0 | AVX512 = 0 | AVX512_VBMI = 0 | AVX512_VNNI = 0 | FMA = 0 | NEON = 1 | ARM_FMA = 1 | F16C = 0 | FP16_VA = 1 | WASM_SIMD = 0 | BLAS = 1 | SSE3 = 0 | VSX = 0 |
・重要なパラメータ
cuBLASでは、「-ngl」「-b」が有用なパラメータになります。
(6) 結果の確認。
GPUを使用したほうが高速なことを確認したかったのですが、変わりませんでした。
・ngl=0 (CPUのみ) : 14トークン/秒
llama_print_timings: load time = 211.52 ms
llama_print_timings: sample time = 19.91 ms / 28 runs ( 0.71 ms per token, 1406.33 tokens per second)
llama_print_timings: prompt eval time = 1130.51 ms / 19 tokens ( 59.50 ms per token, 16.81 tokens per second)
llama_print_timings: eval time = 1853.03 ms / 27 runs ( 68.63 ms per token, 14.57 tokens per second)
llama_print_timings: total time = 3005.66 ms
・ngl=32 : 13トークン/秒
llama_print_timings: load time = 403.84 ms
llama_print_timings: sample time = 101.44 ms / 28 runs ( 3.62 ms per token, 276.03 tokens per second)
llama_print_timings: prompt eval time = 1237.97 ms / 19 tokens ( 65.16 ms per token, 15.35 tokens per second)
llama_print_timings: eval time = 1975.40 ms / 27 runs ( 73.16 ms per token, 13.67 tokens per second)
llama_print_timings: total time = 3322.05 ms
参考
この記事が気に入ったらサポートをしてみませんか?