見出し画像

Llama.cpp + Metal による Llama 2 の高速実行を試す

「Llama.cpp」+「Metal」による「Llama 2」の高速実行を試したのでまとめました。結果はCPUのみと大差なしでしたが、あとで解決方法見つかるかもなので記録として残します。

・MacBook (M1)

【追加情報】 JohnK.Happy さんががMetalの高速実行に成功 (M1 Max)


1. Llama.cpp のオプション

前回、「Llama.cpp」で「Llama 2」をCPUのみで動作させましたが、今回はGPUで速化実行します。

「Llama.cpp」にはCPUのみ以外にも、GPUを使用した高速実行のオプションも存在します。

・CPUのみ
・CPU + GPU
(BLASバックエンドの1つを使用)
・Metal GPU
(Apple Silicon搭載のMacOS)

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」が有用なパラメータになります。

・-ngl : GPUにオフロードされるモデルのレイヤー数を決定。モデルとGPUのVRAMをもとに調整。7Bは3213Bは40が最大レイヤー数 (n_layer)。
・-b : 並行して処理されるトークン数。GPUのVRAMをもとに、1 〜 n_ctx の値で調整 (default:512)

(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

参考



この記事が気に入ったらサポートをしてみませんか?