llama.cppでHuggingFaceにあるモデルを自分で量子化して動かす方法
はじめに
自作PCでローカルLLMを動かすために、llama.cppを用いて量子化したモデルを動かす手法がある。ほとんどのローカルLLMはTheBlokeが量子化して公開してくれているため、ダウンロードすれば簡単に動かすことができるが、一方で最新のモデルを検証したい場合や自前のモデルを量子化したい場合など、TheBlokeに無いモデルを動かしたい時がある。
今回、私は以下のXwin-LM/Xwin-Math-70B-V1.0を検証したくて、llama.cppを用いて自前で量子化を行いました。その手法をまとめておく。
ちなみに、このモデルは、数学問題に特化しているモデルで、既存の数学問題に特化したローカルLLMの中でベンチマーク上は最も優秀なモデルとされている。[1]
私の PC のスペック[2]
- i7 13700K
- 3090 24GB
- DDR5 128GB
Docker環境の準備
私はVSCodeのRemote Containerを用いたDocker環境内でllama.cppを動かしている。Dockerfileは以下のものを使っている。
ARG UBUNTU_VERSION=22.04
ARG CUDA_VERSION=11.7.1
ARG BASE_CUDA_DEV_CONTAINER=nvidia/cuda:${CUDA_VERSION}-devel-ubuntu${UBUNTU_VERSION}
FROM ${BASE_CUDA_DEV_CONTAINER} as build
ARG USERNAME=vscode
ARG USER_UID=1000
ARG USER_GID=$USER_UID
RUN groupadd --gid $USER_GID $USERNAME \
&& useradd --uid $USER_UID --gid $USER_GID -m $USERNAME \
&& apt-get update \
&& apt-get install -y sudo \
&& echo $USERNAME ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/$USERNAME \
&& chmod 0440 /etc/sudoers.d/$USERNAME
RUN apt-get update \
&& apt-get install -y build-essential python3 python3-pip wget cmake pkg-config curl git jq tmux \
&& pip install --upgrade pip setuptools wheel
USER $USERNAME
こちらのDockerfileは、llama.cppのDockerfileを参考にしながら、VSCodeのRemote Containerの設定を追加したものである。
このDockerfileで開発をおこなうためには、VSCodeのRemote Containerの設定を行う必要がある。以下のような設定を行う。
{
"name": "llama",
"dockerFile": "cuda.Dockerfile",
"runArgs":[ "--gpus", "all"],
"postCreateCommand": "pip install -r requirements.txt",
"forwardPorts": [8080],
"customizations": {
"vscode": {
"settings": {
"terminal.integrated.defaultProfile.linux": "bash"
},
"extensions": [
]
}
},
"remoteUser": "vscode"
}
forwardPortsは、llama.cppのserver
コマンド用に追加した。
ビルド方法
Docker環境内で、以下を参考にビルドする。
クローン
git clone https://github.com/ggerganov/llama.cpp
ビルド
mkdir build-cublas
cd build-cublas/
cmake .. -DLLAMA_CUBLAS=ON
cmake --build . --config Release
モデルのダウンロード
Xwin-LM/Xwin-Math-70B-V1.0のモデルをダウンロードする。
cd ./models
git lfs install
git clone git@hf.co:Xwin-LM/Xwin-Math-70B-V1.0
合計で620GBほどある。ダウンロードには一晩かかる。
量子化
以下を参考に量子化する。
ステップは二つある。
- 元のPytorchのモデルをF32のGGUF形式に変換する。
- F32のGGUF形式のモデルを4bitのGGUF形式に変換する。
順番に解説する。
Step 1: PytorchのモデルをF32のGGUF形式に変換する
python3 convert.py ./models/Xwin-Math-70B-V1.0/
./models/Xwin-Math-70B-V1.0/ggml-model-f32.gguf
が生成される。2時間ぐらいかかる。
Step 2: F32のGGUF形式のモデルを4bitのGGUF形式に変換する
./build-cublas/bin/quantize ./models/Xwin-Math-70B-V1.0/ggml-model-f32.gguf 15
15は、量子化の精度を表している。詳しくは以下を参照。
70Bぐらいのモデルを自作PCで動かす場合は、4bit量子化が適切だと思う。
Allowed quantization types:
2 or Q4_0 : 3.56G, +0.2166 ppl @ LLaMA-v1-7B
3 or Q4_1 : 3.90G, +0.1585 ppl @ LLaMA-v1-7B
8 or Q5_0 : 4.33G, +0.0683 ppl @ LLaMA-v1-7B
9 or Q5_1 : 4.70G, +0.0349 ppl @ LLaMA-v1-7B
10 or Q2_K : 2.63G, +0.6717 ppl @ LLaMA-v1-7B
12 or Q3_K : alias for Q3_K_M
11 or Q3_K_S : 2.75G, +0.5551 ppl @ LLaMA-v1-7B
12 or Q3_K_M : 3.07G, +0.2496 ppl @ LLaMA-v1-7B
13 or Q3_K_L : 3.35G, +0.1764 ppl @ LLaMA-v1-7B
15 or Q4_K : alias for Q4_K_M
14 or Q4_K_S : 3.59G, +0.0992 ppl @ LLaMA-v1-7B
15 or Q4_K_M : 3.80G, +0.0532 ppl @ LLaMA-v1-7B
17 or Q5_K : alias for Q5_K_M
16 or Q5_K_S : 4.33G, +0.0400 ppl @ LLaMA-v1-7B
17 or Q5_K_M : 4.45G, +0.0122 ppl @ LLaMA-v1-7B
18 or Q6_K : 5.15G, -0.0008 ppl @ LLaMA-v1-7B
7 or Q8_0 : 6.70G, +0.0004 ppl @ LLaMA-v1-7B
1 or F16 : 13.00G @ 7B
0 or F32 : 26.00G @ 7B
COPY : only copy tensors, no quantizing
こちらも2時間ぐらいかかる。
モデルを試す。
Llama.cppには、server
というコマンドがある。これを用いてGUIでモデルを試すことができる。
./build-cublas/bin/server -m ./models/Xwin-Math-70B-V1.0/ggml-model-Q4_K.gguf -b 512 -ngl 45 -t 8
私の手元のPC (3090 24GB)は、70Bのモデルの45層ぐらいGPUに乗せることができる。また私の手元のPC (i7 13700K)は、8スレッドに制限すると高速に動作する。これらのパラメータは自分の環境に合わせて調整する。
おわりに
llama.cppを用いて、自分で量子化したモデルを生成し検証する方法をまとめた。簡単にできるので皆さんも試してみてください。
Xwin-Math-70B-V1.0の評価は以下の記事で行った。
ちなみに、以下のツイートを見てモデルの量子化には多くのGPUリソースが必要なのかなと思っていたが、今回GGUF形式のモデルを生成するのにはGPUリソースは使わなかった。AWQ
やGPTQ
の量子化には、GPUリソースが必要なのかもしれない。
Discussion