Llama.cpp + cuBLAS による Llama 2 の高速実行を試す
「Llama.cpp」+「cuBLAS」による「Llama 2」の高速実行を試したのでまとめました。
1. Llama.cpp のオプション
前回、「Llama.cpp」で「Llama 2」をCPUのみで動作させましたが、今回はGPUで速化実行します。
「Llama.cpp」にはCPUのみ以外にも、GPUを使用した高速実行のオプションも存在します。
「Llama.cpp」が対応している「BLASバックエンド」は次の3つです。
今回は、一番速そうな「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」が有用なパラメータになります。
(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
参考
この記事が気に入ったらサポートをしてみませんか?