メインコンテンツへスキップ
見出し画像

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は32、13Bは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

    参考



     
     

    npaka

     
     
    プログラマー。iPhone / Android / Unity / ROS / AI / AR / VR / RasPi / ロボット / ガジェット。年2冊ペースで技術書を執筆。アニソン / カラオケ / ギター / 猫 twitter : @npaka123

    あなたへのおすすめ