はじめに
こちらは LLMアドベントカレンダー 23日目です。
ここ半年ほど新しく出てきたLLMを動かしたり、他の方が変換されたそのGGUFやAWQを動かしたりして遊んでいました。
しかし、自分でも変換くらいできるようになってデプロイまで使用してみようとお思い rinna/nekomata-14bをGGUFに変換して動かしていきます。
環境
開発環境構築
pythonのライブラリをいくつか入れるので、今回は venvを使って環境を構築します。
環境名は .venv
です
python -m venv .venv
作成した環境に切り替えます
source .venv/bin/activate
LLMをGGUFに変換
今回は以下のツイートの内容に手順が細かく記載されていたので、こちらを参考させていただいています。
[メモ]
— r.itabashi (硫酸) (@iryutab) 2023年12月21日
Nekomata 7b/14b のGGUF化 (Linux環境)
torchがインストールされたPython環境はあるものと仮定します
--- llama.cpp環境準備 ---
1. https://t.co/Qz780hEPFI クローンする
2. `cd llama.cpp` して、 `make`
3. `python3 -m pip install -r requirements.txt` する
---…
nekomataは qwenベースになっているため、以下のPRを参考にします。
llama.cppの準備
準備は、llama.cppのReadMeを参考にします
まずは、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さんの記事に細かく書かれているので気になった方はこちらをご確認ください。
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 ..
(注意)
こちらの環境では、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などにデプロイして、サーバーレス上に載せれるように触っていきたいと思います