😊

llama.cppでHuggingFaceにあるモデルを自分で量子化して動かす方法

2023/11/26に公開

はじめに

自作PCでローカルLLMを動かすために、llama.cppを用いて量子化したモデルを動かす手法がある。ほとんどのローカルLLMはTheBlokeが量子化して公開してくれているため、ダウンロードすれば簡単に動かすことができるが、一方で最新のモデルを検証したい場合や自前のモデルを量子化したい場合など、TheBlokeに無いモデルを動かしたい時がある。

今回、私は以下のXwin-LM/Xwin-Math-70B-V1.0を検証したくて、llama.cppを用いて自前で量子化を行いました。その手法をまとめておく。

https://huggingface.co/Xwin-LM/Xwin-Math-70B-V1.0

ちなみに、このモデルは、数学問題に特化しているモデルで、既存の数学問題に特化したローカルLLMの中でベンチマーク上は最も優秀なモデルとされている。[1]

私の PC のスペック[2]

  • i7 13700K
  • 3090 24GB
  • DDR5 128GB

Docker環境の準備

私はVSCodeのRemote Containerを用いたDocker環境内でllama.cppを動かしている。Dockerfileは以下のものを使っている。

cuda.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の設定を行う必要がある。以下のような設定を行う。

devcontainer.json
{
    "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環境内で、以下を参考にビルドする。

https://github.com/ggerganov/llama.cpp#blas-build

クローン

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ほどある。ダウンロードには一晩かかる。

量子化

以下を参考に量子化する。

https://github.com/ggerganov/llama.cpp#prepare-data--run

ステップは二つある。

  1. 元のPytorchのモデルをF32のGGUF形式に変換する。
  2. 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の評価は以下の記事で行った。

https://zenn.dev/derbuihan/articles/76f29862b9c482

ちなみに、以下のツイートを見てモデルの量子化には多くのGPUリソースが必要なのかなと思っていたが、今回GGUF形式のモデルを生成するのにはGPUリソースは使わなかった。AWQGPTQの量子化には、GPUリソースが必要なのかもしれない。

https://twitter.com/TheBlokeAI/status/1705871312151818680

脚注
  1. https://github.com/Xwin-LM/Xwin-LM/blob/main/Xwin-Math/README.md ↩︎

  2. https://zenn.dev/derbuihan/articles/928ae5f279afbc ↩︎

Discussion