見出し画像

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

「Llama.cpp」+「cuBLAS」による「Llama 2」の高速実行を試したのでまとめました。

・Windows 11


1. Llama.cpp のオプション

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

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

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

「Llama.cpp」が対応している「BLASバックエンド」は次の3つです。

・OpenBLAS : CPU上で高速な行列演算を実現するためのライブラリ
・cuBLAS : NVIDIAのGPU上で高速な行列演算を実現するためのライブラリ
・CLBlast : OpenCL上で高速な行列演算を実現するためのライブラリ

今回は、一番速そうな「cuBLAS」を使ってみます。

2. ビルドツールの準備

自分の環境では、makeで「Llama.cpp + cuBLAS」をうまくビルドできなかったので、cmakeを使うことにしました。

(1) 「cmake」のインストール。

$ winget install cmake

(2) PowerShellの再起動。

(3) 「CUDA Toolkit」がインストールされていることを確認。
「Llama.cpp + cuBLAS」のビルドに必要になります。ない場合はCUDA環境のセットアップが必要です。

$ nvidia-smi
$ nvcc --version

3. Llama.cpp + cuBLASの実行

「Llama.cpp + cuBLAS」の実行手順は、次のとおりです。

(1) リポジトリのクローン。

$ git clone https://github.com/ggerganov/llama.cpp
$ cd llama.cpp

(2) cmakeによるビルド。
llama.cpp/build/bin/Release/」に「main.exe」が生成されます。

$ mkdir build
$ cd build
$ cmake .. -DLLAMA_CUBLAS=ON
$ cmake --build . --config Release
$ cd ..

(3) 「main.exe」を「llama.cpp」のルートに移動

(4) ダウンロードしたモデルを「llama.cpp/models」に配置。
今回は、「TheBloke/Llama-2-7B-Chat-GGML」の「llama-2-7b-chat.ggmlv3.q4_K_M.bin」をダウンロードして配置しました。

(5) 推論の実行。

$ ./main -m ./models/llama-2-7b-chat.ggmlv3.q4_K_M.bin --temp 0.1 -p "### Instruction: What is the height of Mount Fuji?
### Response:" -ngl 32 -b 512


・cuBLASが有効かどうかの確認
「cuBLAS」が有効時には、「using CUDA for GPU acceleration」「BLAS = 1」といったログが起動時に表示されます。

llama_model_load_internal: using CUDA for GPU acceleration
system_info: n_threads = 8 / 16 | AVX = 1 | AVX2 = 1 | AVX512 = 0 | AVX512_VBMI = 0 | AVX512_VNNI = 0 | FMA = 1 | NEON = 0 | ARM_FMA = 0 | F16C = 1 | FP16_VA = 0 | WASM_SIMD = 0 | BLAS = 1 | SSE3 = 1 | 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のみ) : 8トークン/秒

llama_print_timings:        load time =   824.89 ms
llama_print_timings:      sample time =    31.24 ms /   126 runs   (    0.25 ms per token,  4033.68 tokens per second)
llama_print_timings: prompt eval time =  1745.14 ms /    19 tokens (   91.85 ms per token,    10.89 tokens per second)
llama_print_timings:        eval time = 14763.92 ms /   125 runs   (  118.11 ms per token,     8.47 tokens per second)
llama_print_timings:       total time = 16563.10 ms

・ngl=32 : 31トークン/秒

llama_print_timings:        load time =  1559.60 ms
llama_print_timings:      sample time =    24.82 ms /   112 runs   (    0.22 ms per token,  4512.85 tokens per second)
llama_print_timings: prompt eval time =   224.13 ms /    10 tokens (   22.41 ms per token,    44.62 tokens per second)
llama_print_timings:        eval time =  3561.01 ms /   111 runs   (   32.08 ms per token,    31.17 tokens per second)
llama_print_timings:       total time =  3827.39 ms

参考



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