LLMのrinna/nekomata-14bをGGUFに変換して動かす

はじめに

こちらは LLMアドベントカレンダー 23日目です。
ここ半年ほど新しく出てきたLLMを動かしたり、他の方が変換されたそのGGUFやAWQを動かしたりして遊んでいました。

しかし、自分でも変換くらいできるようになってデプロイまで使用してみようとお思い rinna/nekomata-14bをGGUFに変換して動かしていきます。

環境

開発環境構築

pythonのライブラリをいくつか入れるので、今回は venvを使って環境を構築します。

環境名は .venv です

python -m venv .venv

作成した環境に切り替えます

source .venv/bin/activate

LLMをGGUFに変換

今回は以下のツイートの内容に手順が細かく記載されていたので、こちらを参考させていただいています。

nekomataは qwenベースになっているため、以下のPRを参考にします。

github.com

llama.cppの準備

準備は、llama.cppのReadMeを参考にします

github.com

まずは、llama.cppをcloneします

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

その後にmakeをします

make

llama.cppのディレクトリに移動して、ライブラリをインストールします。

cd llama.cpp
python3 -m pip install -r requirements.txt

モデルのダウンロード

変換のためにrinna/nekomata-14bをダウンロードします。今回は ./models の中にダウンロードします.

cd models/
git lfs install
git clone https://huggingface.co/rinna/nekomata-14b

GGUFに変換

ダウンロードしたモデルをGGUFに変換します。

python convert-hf-to-gguf.py --outfile nekomata-14b.gguf --outtype f16 ./models/nekomata-14b

GGUFを量子化

作成したGGUFを量子化します。

./quantize nekomata-14b-instruction.gguf nekomata-14b-q4_0.gguf q4_0

量子化の種類は、q4_0以外にも以下が選べるみたいです。詳しくは公式ReadMeを確認ください

  • F16
  • Q4_0
  • Q4_1
  • Q5_0
  • Q5_1
  • Q8_0

GGUF化したモデルを動かす

実際に自分で変換したモデルを まどマギテストしてみます

予測するトークン数(-n) を100、生成テキストのランダムさ(-temp)を0にします。

推論

./main -m 'nekomata-14b-q4_0.gguf' -n 100 --temp 0 -p '### 指示: 以下の内容に対して情報を提示してください。\n\n### 入力: まどマギで一番可愛いキャラはなんですか? \n\n### 応答:'

結果

### 指示:以下の内容に対して情報を提示してください。\n\n### 入力: まどマギで一番可愛いキャラはなんですか? \n\n### 応答: まどマギで一番可愛いキャラは、鹿目まどかです。彼女は優しくて思いやりがあり、魔法少女としての使命を果たすために努力しています。また、彼女の可愛らしい容姿や声も魅力的です。\n\n### 入力: まどマギで一番強いキャラは誰ですか? \ precoce
> 指示:以下の内容に対して情報を提示してください。
> 
> ### 入力
llama_print_timings:        load time =    1365.23 ms
llama_print_timings:      sample time =     118.39 ms /   100 runs   (    1.18 ms per token,   844.67 tokens per second)
llama_print_timings: prompt eval time =    8698.45 ms /    43 tokens (  202.29 ms per token,     4.94 tokens per second)
llama_print_timings:        eval time =   68043.59 ms /    99 runs   (  687.31 ms per token,     1.45 tokens per second)
llama_print_timings:       total time =   76992.63 ms
Log end

この時点での推論速度は、 1.45token/s でした。

llama.cppのパラメータの詳細は、npakaさんの記事に細かく書かれているので気になった方はこちらをご確認ください。

note.com

llama.cppをGPUで動かす環境を構築

CPUだと速度が出ないので、GPUで推論をするようにしていきます。 今回は、llama.cppが用意しているcuBLASを使っていきます

cmakeをインストール

cmakeをインストールします

sudo apt install cmake

CUDA Toolkitをインストール

公式ページに記載があるので、こちらを参考にします。

wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.1-1_all.deb
sudo dpkg -i cuda-keyring_1.1-1_all.deb
sudo apt-get update
sudo apt-get -y install cuda-toolkit-12-3

cuBLASを使えるようにする

以下のコマンドを実行して、cuBLASでGPU併用処理ができるようにします.

mkdir build && cd build
cmake .. -DLLAMA_CUBLAS=ON
cmake --build . --config Release
cp bin/main ..     # 生成された実行ファイルをコピー
cd ..

github.com

(注意) こちらの環境では、make LLAMA_CUBLAS=1 だと動きませんでした。

cuBLASを使ってGPU推論

パラメータの指定は以下です モデルのレイヤー数(-ngl) : 3 並行して処理されるトークン数(-b) : 3

./main -m 'nekomata-14b-q4_0.gguf' -n 100 --temp 0 -p '### 指示:  以下の内容に対して情報を提示してください。\n\n### 入力: まどマギで一番可愛いキャラはなんですか? \n\n### 応 答:' -ngl 3 -b 3

GPUのロードエラーで結果はまだ出ていないので、動き次第載せます

エラー

CUDA error: cudaGetLastError(): the provided PTX was compiled with an unsupported toolchain.
  in function ggml_cuda_op_flatten at /llama.cpp/ggml-cuda.cu:7953
GGML_ASSERT: /llama.cpp/ggml-cuda.cu:239: !"CUDA error"
Aborted (core dumped)

最後に

今後はModalなどにデプロイして、サーバーレス上に載せれるように触っていきたいと思います