🆑

【CUDA非依存】CLBlast+llama-cpp-pythonでLLM推論入門

2024/02/03に公開

目標

llama-cpp-pythonでCLBlast推論をする。

https://github.com/CNugteren/CLBlast

なんでCLBlast?

LLM推論はCUDA環境がデファクトスタンダードだが、ユーザー配布を考えた際、全員がCUDA環境をもっているとは限らない。Radeonの可能性もあるし、CPUの可能性もある。
そこでOpenCLベースであるCLBlastを採択することで、なるべく多くのプラットフォーム上で推論できるようになる。

CLBlastのREADMEに、どういうときに採択するかが書いてある。
比較対象はclBLAS、cuBLASの2つ。
clBLASに比べてCLBlastの方が高速、cuBLASに比べて汎用性が高い。
さらにCPU推論もできる(ぽい)。逆に最高速を目指すのであればcuBLASの方が良い。

Use CLBlast instead of clBLAS:

    When you care about achieving maximum performance.
    When you want to be able to inspect the BLAS kernels or easily customize them to your needs.
    When you run on exotic OpenCL devices for which you need to tune yourself.
    When you are still running on OpenCL 1.1 hardware.
    When you prefer a C++ API over a C API (C API also available in CLBlast).
    When you value an organized and modern C++ codebase.
    When you target Intel CPUs and GPUs or embedded devices.
    When you can benefit from the increased performance of half-precision fp16 data-types.

Use CLBlast instead of cuBLAS:

    When you want your code to run on devices other than NVIDIA CUDA-enabled GPUs.
    When you want to tune for a specific configuration (e.g. rectangular matrix-sizes).
    When you sleep better if you know that the library you use is open-source.
    When you are using OpenCL rather than CUDA.

When not to use CLBlast:

    When you run on NVIDIA's CUDA-enabled GPUs only and can benefit from cuBLAS's assembly-level tuned kernels.

手順

この記事は以下の手順で進む

  • cmake・CLBlastの導入
  • llama-cpp-python(with CLBlast)のインストール
  • モデルのダウンロードと推論

なお、この記事ではUbuntu環境で行っている。もちろんCLBlastもllama-cpp-pythonもWindowsに対応しているので、適宜Windowsのやり方に変更して導入すること。

事前準備

cmakeのインストール

sudo snap install cmake --classic
Windowsはこれを読んで導入

bCLBlastのインストール

git clone https://github.com/CNugteren/CLBlast.git
cd CLBlast
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make
sudo make install

llama-cpp-python(with CLBlast)の導入

適宜仮想環境は作っておくこと。
venvはこの記事、自分はpoetryが好きです
もしWindowsの場合、README.mdのWindows Notesを確認すること。
CMAKE_ARGS="-DLLAMA_CLBLAST=on" pip install llama-cpp-python --upgrade --force-reinstall --no-cache-dir
念を入れて、cacheを使わないように設定しておく。

このままだと以下のようなエラーが出る

error while loading shared libraries: liblcm.so.1: cannot open shared object file: No such file or directory

のでこの記事に従い、sudo ldconfig -vを行う。

推論

モデルファイルを拾ってきて推論してみる。今回は「aixsatoshi-calm2-7b-chat-7b-moe-q4_K_M.gguf」
https://huggingface.co/mmnga/aixsatoshi-calm2-7b-chat-7b-moe-gguf/tree/main


from llama_cpp import Llama
import os
class LlamaCppAdapter:
    _instance = None
    def __new__(cls,n_ctx=1024):
        if not cls._instance:
            cls._instance = super(LlamaCppAdapter,cls).__new__(cls)
            my_path = os.path.dirname(os.path.abspath(__file__))
            cls._instance.llama:Llama = Llama(model_path=my_path+"/calm2-7b-chat.Q5_K_M.gguf",n_ctx=n_ctx,n_gpu_layers=-1)

        return cls._instance

    def generate(self,prompt,max_new_tokens=250,temperature=0.5,top_p=0.7,top_k=80):
        return self._generate(prompt,max_new_tokens,temperature,top_p,top_k)
    

    def _generate(self,prompt:str,max_new_tokens:int,temperature:int,top_p:int,top_k:int):
        return self.llama(
            prompt,
            temperature=temperature,
            max_tokens=max_new_tokens,
            top_p=top_p,
            top_k=top_k,
            stop=["\n"],
            repeat_penalty=1.2,
        )
    
if __name__ == "__main__":
    llama = LlamaCppAdapter()
    print(llama.generate("USER:こんにちは、自己紹介して\nASSISTANT:"))

実行した時、以下のように「BLAS = 1」になっていれば成功。

AVX = 1 | AVX_VNNI = 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 | SSSE3 = 1 | VSX = 0 | 

eval timeで40.85token/s出ている。RTX系列をもっているならcuBLASの方が早い。

個人的にCPU推論ができるものをパッケージングして配布できそうな未来を感じたので好みかも。みなさんも是非。

記事訂正等あればX: https://twitter.com/sald_ra
まで。

参考にしたもの

https://qiita.com/legokichi/items/c0098222985c593db169#clblast-の場合

Discussion