ローカルへのtext-generation-webuiの導入(4bitモデルも使える)

# text-generation-webuiと4bitモデルの導入(Windows)

この記事では、text-generation-webuiのローカル環境への導入方法を説明します。基本的に公式ドキュメントに書いてあることを翻訳して纏めた内容の記事です。


注: text-generation-webuiの公式ではanacondaを用いていますが、個人的にanacondaを使うのが嫌だったため、pipでインストールしています。

## 環境
この記事では、windows 11を対象にしています(多分linuxでも同じ手順が使える)。また、Nvidia製GPUが必要です。
この記事で使うコードは、VRAMが8GBのGPUで検証しました。8GBのないGPUを使っている場合、別のモデルを使う必要があります。またメインメモリを8GB程度消費します。システムメモリと合わせると最低16GBは必要です。

# 目次
[text-generation-webuiの導入](#-text-generation-webuiの導入)
[4bit GPTQ](#-4bit-GPTQを使う)
[最新のGPTQ-for-LLaMa](#-最新のGPTQ-for-LLaMa (tritonブランチを使う))

# text-generation-webuiの導入
リポジトリはここ

https://github.com/oobabooga/text-generation-webui

参考サイト

https://economylife.net/text-generation-webui-windows/

この章の内容は基本的に上記参考サイトに準じています。

## インストール
### 前提条件
* python 3.10.9
* git
* cuda

※ 私はpython3.10.6、cuda 11.8を使用しました。

```
$ python -V
Python 3.10.6

$ git -v
git version 2.40.0.windows.1
```
という応答になればpythonとgitのインストールはできています。

#### cudaについて
前提条件のcudaにはcuda toolkit を導入します。バージョンは11.7か11.8を使うといいです。12.0~は出たばかりなので、対応してない可能性があります。
導入については以下のサイトが参考になります
https://www.kkaneko.jp/tools/win/cuda.html

とりあえず、
```
$ nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2022 NVIDIA Corporation
Built on Wed_Sep_21_10:41:10_Pacific_Daylight_Time_2022
Cuda compilation tools, release 11.8, V11.8.89
Build cuda_11.8.r11.8/compiler.31833905_0
```
って感じになればcudaの導入に成功です。(これはversion11.8の例)

### text-generation-webuiのインストール
前提条件の導入が済んだら、以下のコードを順に実行します。
posershellで、インストール先のディレクトリに移動してコードを実行します。
```
$ cd ディレクトリ  #今回インストールするディレクトリに移動してください
$ git clone https://github.com/oobabooga/text-generation-webui
$ cd text-generation-webui
$ python -m venv venv   #仮想環境を作る
$ venv/scripts/activate     #仮想環境の有効化

------以降、仮想環境内で作業する-----

$ pip install <pytorch>     #自分の環境に合ったpytorchを入れる
$ pip install -r requirements.txt
```
pytorchはここでダウンロードできます。
自身の環境に合わせて、pipでダウンロードするコードを教えてくれます

https://pytorch.org/get-started/locally/

## modelのダウンロード

download_model.pyを使う場合、`HuggingFaceの組織名/モデル名`でダウンロードできます。
```
例
python download-model.py facebook/opt-1.3b
```

## 起動
```
$ venv/scripts/activate     #仮想環境の有効化
$ Python server.py
```
この時
```
INFO:Gradio HTTP request redirected to localhost :)
INFO:Loading the extension "gallery"...
Running on local URL:  http://127.0.0.1:7860

To create a public link, set `share=True` in `launch()`.
INFO:Loading TheBloke_vicuna-7B-GPTQ-4bit-128g...
CUDA extension not installed.
INFO:Found the following quantized model: models\TheBloke_vicuna-7B-GPTQ-4bit-128g\vicuna-7B-GPTQ-4bit-128g.safetensors
INFO:Loaded the model in 3.80 seconds.
```
と表示されるので、`Running on local URL:  http://127.0.0.1:7860`にアクセスすると使えます。
UIの使い方は、各自で調べてください。

終わるときは、ctrl+Cで終了できます。また、仮想環境は
```
$ deactivate
```
で終了できます。

# 4bit GPTQを使う
注意:この章の内容を実行するには、VRAMが16GB必要です。私は起動確認をしてません。後述のtritonブランチの説明に使用します。

4bit GQTPは、重みを4bitで扱えるようにしたモデルです(多分)。4bit GPTQを使うと、必要なvramがオリジナルモデルの1/4になるそうです。言語モデルはvramを大量に消費するので、個人のGPUで動かす場合は必要になることが多いと思います。また、使用するモデルはGPTQに対応したものを使用する必要があります。詳しくは[公式ドキュメント](https://github.com/oobabooga/text-generation-webui/blob/main/docs/GPTQ-models-(4-bit-mode).md)に載っています。エラーなどが出た場合もそちらを参照してください。


## GPTQ-for-LLaMaの導入


使うリポジトリは以下です。

https://github.com/oobabooga/GPTQ-for-LLaMa

参考サイトは以下です。

https://zenn.dev/tatsuromurata/articles/8e523cf2d0c2bc


また、ここではtext-generation-webuiを導入した後の手順を説明しています。事前に、前項の通り導入してください。pythonの仮想環境を有効化してから作業してください
```
$ cd text-generation-webui  #text-generation-webuiの導入したディレクトリに移動
$ mkdir repositories
$ cd repositories
$ git clone https://github.com/oobabooga/GPTQ-for-LLaMa.git -b cuda
$ cd GPTQ-for-LLaMa
$ python setup_cuda.py install
```

`python setup~`の部分で、エラーに見えるlogが大量に出ますが、動作しました。正常なのかはわかりません。とりあえず気にせず進みましょう。
<details>
    <summary>エラーに見えるlog</summary>
```
    running install
    D:\AI_textGeneration\text-generation-webui@GPTQ_triton\venv\lib\site-packages\setuptools\command\install.py:34: SetuptoolsDeprecationWarning: setup.py install is deprecated. Use build and pip and other standards-based tools.
    warnings.warn(
    D:\AI_textGeneration\text-generation-webui@GPTQ_triton\venv\lib\site-packages\setuptools\command\easy_install.py:144: EasyInstallDeprecationWarning: easy_install command is deprecated. Use build and pip and other standards-based tools.
    warnings.warn(
    running bdist_egg
    running egg_info
    creating quant_cuda.egg-info
    writing quant_cuda.egg-info\PKG-INFO
    writing dependency_links to quant_cuda.egg-info\dependency_links.txt
    writing top-level names to quant_cuda.egg-info\top_level.txt
    writing manifest file 'quant_cuda.egg-info\SOURCES.txt'
    D:\AI_textGeneration\text-generation-webui@GPTQ_triton\venv\lib\site-packages\torch\utils\cpp_extension.py:476: UserWarning: Attempted to use ninja as the BuildExtension backend but we could not find ninja.. Falling back to using the slow distutils backend.
    warnings.warn(msg.format('we could not find ninja.'))
    reading manifest file 'quant_cuda.egg-info\SOURCES.txt'
    writing manifest file 'quant_cuda.egg-info\SOURCES.txt'
    installing library code to build\bdist.win-amd64\egg
    running install_lib
    running build_ext
    building 'quant_cuda' extension
    creating build
    creating build\temp.win-amd64-cpython-310
    creating build\temp.win-amd64-cpython-310\Release
    "C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Tools\MSVC\14.35.32215\bin\HostX86\x64\cl.exe" /c /nologo /O2 /W3 /GL /DNDEBUG /MD -ID:\AI_textGeneration\text-generation-webui@GPTQ_triton\venv\lib\site-packages\torch\include -ID:\AI_textGeneration\text-generation-webui@GPTQ_triton\venv\lib\site-packages\torch\include\torch\csrc\api\include -ID:\AI_textGeneration\text-generation-webui@GPTQ_triton\venv\lib\site-packages\torch\include\TH -ID:\AI_textGeneration\text-generation-webui@GPTQ_triton\venv\lib\site-packages\torch\include\THC "-IC:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8\include" -ID:\AI_textGeneration\text-generation-webui@GPTQ_triton\venv\include -IC:\Users\moto\.pyenv\pyenv-win\versions\3.10.6\include -IC:\Users\moto\.pyenv\pyenv-win\versions\3.10.6\Include "-IC:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Tools\MSVC\14.35.32215\include" "-IC:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Tools\MSVC\14.35.32215\ATLMFC\include" "-IC:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Auxiliary\VS\include" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.22000.0\ucrt" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.22000.0\\um" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.22000.0\\shared" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.22000.0\\winrt" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.22000.0\\cppwinrt" "-IC:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\include\um" /EHsc /Tpquant_cuda.cpp /Fobuild\temp.win-amd64-cpython-310\Release\quant_cuda.obj /MD /wd4819 /wd4251 /wd4244 /wd4267 /wd4275 /wd4018 /wd4190 /EHsc -DTORCH_API_INCLUDE_EXTENSION_H -DTORCH_EXTENSION_NAME=quant_cuda -D_GLIBCXX_USE_CXX11_ABI=0
    quant_cuda.cpp
    D:\AI_textGeneration\text-generation-webui@GPTQ_triton\venv\lib\site-packages\torch\include\c10/macros/Macros.h(138): warning C4067: プリプロセッサ ディレクティブの後に余分な文字がありました - 改行が必要です
    D:\AI_textGeneration\text-generation-webui@GPTQ_triton\venv\lib\site-packages\torch\include\c10/util/Optional.h(212): warning C4624: 'c10::constexpr_storage_t<T>': デストラクターは暗黙的に削除済みとして定義されました
            with
            [
                T=c10::SymInt
            ]
    D:\AI_textGeneration\text-generation-webui@GPTQ_triton\venv\lib\site-packages\torch\include\c10/util/Optional.h(411): note: コンパイル対象の クラス テンプレート インスタンス化 'c10::constexpr_storage_t<T>' のリファレンスを確認してください
            with
            [
                T=c10::SymInt
            ]
    D:\AI_textGeneration\text-generation-webui@GPTQ_triton\venv\lib\site-packages\torch\include\c10/util/Optional.h(549): note: コンパイル対象の クラス テンプレート インスタンス化 'c10::trivially_copyable_optimization_optional_base<T>' のリファレンスを確認してください
            with
            [
                T=c10::SymInt
            ]
    D:\AI_textGeneration\text-generation-webui@GPTQ_triton\venv\lib\site-packages\torch\include\c10/util/Optional.h(549): note: コンパイル対象の エイリアス テンプレート インスタンス化 'c10::OptionalBase<T>' のリファレンスを確認してください
            with
            [
                T=c10::SymInt
            ]
    D:\AI_textGeneration\text-generation-webui@GPTQ_triton\venv\lib\site-packages\torch\include\c10/core/TensorImpl.h(1605): note: コンパイル対象の クラス テンプレート インスタンス化 'c10::optional<c10::SymInt>' のリファレンスを確認してください
    D:\AI_textGeneration\text-generation-webui@GPTQ_triton\venv\lib\site-packages\torch\include\c10/util/Optional.h(446): warning C4624: 'c10::trivially_copyable_optimization_optional_base<T>': デストラクターは暗黙的に削除済みとして定義されました
            with
            [
                T=c10::SymInt
            ]
    D:\AI_textGeneration\text-generation-webui@GPTQ_triton\venv\lib\site-packages\torch\include\c10/util/Optional.h(212): warning C4624: 'c10::constexpr_storage_t<T>': デストラクターは暗黙的に削除済みとして定義されました
            with
            [
                T=at::TensorBase
            ]
    D:/AI_textGeneration/text-generation-webui@GPTQ_triton/venv/lib/site-packages/torch/include\c10/util/flat_hash_map.h(431): note: コンパイル対象の関数 テンプレート インスタンス化 'void ska::detailv3::sherwood_v3_table<std::pair<K,V>,K,H,ska::detailv3::KeyOrValueHasher<K,std::pair<K,V>,H>,E,ska::detailv3::KeyOrValueEquality<K,std::pair<K,V>,E>,A,std::allocator<ska::detailv3::sherwood_v3_entry<std::pair<K,V>>>>::clear(void)' のリファレンスを確認してください
            with
            [
                K=c10::DispatchKey,
                V=std::list<c10::impl::AnnotatedKernel,std::allocator<c10::impl::AnnotatedKernel>>,
                H=std::hash<c10::DispatchKey>,
                E=std::equal_to<c10::DispatchKey>,
                A=std::allocator<std::pair<c10::DispatchKey,std::list<c10::impl::AnnotatedKernel,std::allocator<c10::impl::AnnotatedKernel>>>>
            ]
    D:/AI_textGeneration/text-generation-webui@GPTQ_triton/venv/lib/site-packages/torch/include\c10/util/flat_hash_map.h(1928): note: コンパイル対象の クラス テンプレート インスタンス化 'ska::detailv3::sherwood_v3_table<std::pair<K,V>,K,H,ska::detailv3::KeyOrValueHasher<K,std::pair<K,V>,H>,E,ska::detailv3::KeyOrValueEquality<K,std::pair<K,V>,E>,A,std::allocator<ska::detailv3::sherwood_v3_entry<std::pair<K,V>>>>' のリファレンスを確認してください
            with
            [
                K=c10::DispatchKey,
                V=std::list<c10::impl::AnnotatedKernel,std::allocator<c10::impl::AnnotatedKernel>>,
                H=std::hash<c10::DispatchKey>,
                E=std::equal_to<c10::DispatchKey>,
                A=std::allocator<std::pair<c10::DispatchKey,std::list<c10::impl::AnnotatedKernel,std::allocator<c10::impl::AnnotatedKernel>>>>
            ]
    D:/AI_textGeneration/text-generation-webui@GPTQ_triton/venv/lib/site-packages/torch/include\ATen/core/dispatch/OperatorEntry.h(270): note: コンパイル対象の クラス テンプレート インスタンス化 'ska::flat_hash_map<c10::DispatchKey,std::list<c10::impl::AnnotatedKernel,std::allocator<c10::impl::AnnotatedKernel>>,std::hash<c10::DispatchKey>,std::equal_to<K>,std::allocator<std::pair<K,V>>>' のリファレンスを確認してください
            with
            [
                K=c10::DispatchKey,
                V=std::list<c10::impl::AnnotatedKernel,std::allocator<c10::impl::AnnotatedKernel>>
            ]
    creating D:\AI_textGeneration\text-generation-webui@GPTQ_triton\repositories\GPTQ-for-LLaMa\build\lib.win-amd64-cpython-310
    "C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Tools\MSVC\14.35.32215\bin\HostX86\x64\link.exe" /nologo /INCREMENTAL:NO /LTCG /DLL /MANIFEST:EMBED,ID=2 /MANIFESTUAC:NO /LIBPATH:D:\AI_textGeneration\text-generation-webui@GPTQ_triton\venv\lib\site-packages\torch\lib "/LIBPATH:C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8\lib\x64" /LIBPATH:D:\AI_textGeneration\text-generation-webui@GPTQ_triton\venv\libs /LIBPATH:C:\Users\moto\.pyenv\pyenv-win\versions\3.10.6\libs /LIBPATH:C:\Users\moto\.pyenv\pyenv-win\versions\3.10.6 /LIBPATH:D:\AI_textGeneration\text-generation-webui@GPTQ_triton\venv\PCbuild\amd64 "/LIBPATH:C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Tools\MSVC\14.35.32215\lib\x64" "/LIBPATH:C:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\lib\um\x64" "/LIBPATH:C:\Program Files (x86)\Windows Kits\10\lib\10.0.22000.0\ucrt\x64" "/LIBPATH:C:\Program Files (x86)\Windows Kits\10\\lib\10.0.22000.0\\um\x64" c10.lib torch.lib torch_cpu.lib torch_python.lib cudart.lib c10_cuda.lib torch_cuda.lib /EXPORT:PyInit_quant_cuda build\temp.win-amd64-cpython-310\Release\quant_cuda.obj build\temp.win-amd64-cpython-310\Release\quant_cuda_kernel.obj /OUT:build\lib.win-amd64-cpython-310\quant_cuda.cp310-win_amd64.pyd /IMPLIB:build\temp.win-amd64-cpython-310\Release\quant_cuda.cp310-win_amd64.lib
    ライブラリ build\temp.win-amd64-cpython-310\Release\quant_cuda.cp310-win_amd64.lib とオブジェクト build\temp.win-amd64-cpython-310\Release\quant_cuda.cp310-win_amd64.exp を作成中
    コード生成しています。
    コード生成が終了しました。
    creating build\bdist.win-amd64
    creating build\bdist.win-amd64\egg
    copying build\lib.win-amd64-cpython-310\quant_cuda.cp310-win_amd64.pyd -> build\bdist.win-amd64\egg
    creating stub loader for quant_cuda.cp310-win_amd64.pyd
    byte-compiling build\bdist.win-amd64\egg\quant_cuda.py to quant_cuda.cpython-310.pyc
    creating build\bdist.win-amd64\egg\EGG-INFO
    copying quant_cuda.egg-info\PKG-INFO -> build\bdist.win-amd64\egg\EGG-INFO
    copying quant_cuda.egg-info\SOURCES.txt -> build\bdist.win-amd64\egg\EGG-INFO
    copying quant_cuda.egg-info\dependency_links.txt -> build\bdist.win-amd64\egg\EGG-INFO
    copying quant_cuda.egg-info\top_level.txt -> build\bdist.win-amd64\egg\EGG-INFO
    writing build\bdist.win-amd64\egg\EGG-INFO\native_libs.txt
    zip_safe flag not set; analyzing archive contents...
    __pycache__.quant_cuda.cpython-310: module references __file__
    creating dist
    creating 'dist\quant_cuda-0.0.0-py3.10-win-amd64.egg' and adding 'build\bdist.win-amd64\egg' to it
    removing 'build\bdist.win-amd64\egg' (and everything under it)
    Processing quant_cuda-0.0.0-py3.10-win-amd64.egg
    creating d:\ai_textgeneration\text-generation-webui@gptq_triton\venv\lib\site-packages\quant_cuda-0.0.0-py3.10-win-amd64.egg
    Extracting quant_cuda-0.0.0-py3.10-win-amd64.egg to d:\ai_textgeneration\text-generation-webui@gptq_triton\venv\lib\site-packages
    Adding quant-cuda 0.0.0 to easy-install.pth file
    Installed d:\ai_textgeneration\text-generation-webui@gptq_triton\venv\lib\site-packages\quant_cuda-0.0.0-py3.10-win-amd64.egg
    Processing dependencies for quant-cuda==0.0.0
    Finished processing dependencies for quant-cuda==0.0.0
```
</details>

## モデルのダウンロード
モデルをダウンロードします。ここでは、例としてstable-vicuna-13B-GPTQを使います。(vramが12GBぐらい必要です)
```
# download model
$ cd text-generation-webui
$ python download-model.py TheBloke/stable-vicuna-13B-GPTQ
```

## 起動
起動します。--chatをつけて、chat形式で起動しています。
```
$ python server.py --model TheBloke_stable-vicuna-13B-GPTQ --wbits 4 --group 128 --chat --auto-devices  --model_type=llama
```

# 最新のGPTQ-for-LLaMa (tritonブランチを使う)

一部モデル (例: TheBloke/vicuna-7B-1.1-GPTQ-4bit-128g) を使用するときは、最新のtritonブランチを使う必要があります。
モデルの説明を確認して、tritonブランチを使うかチェックしましょう。

説明は[text-generation-webuiのドキュメント](https://github.com/oobabooga/text-generation-webui/blob/main/docs/GPTQ-models-(4-bit-mode).md)にあります。エラーなどが出た場合はこちらを参照してください。

## 導入
初めに、前項を見てGPTQ-for-LLaMaを導入してください。
以下の手順は、GPTQ-for-LLaMa tritonが導入されていることを前提に進めます。
公式ではpython3.9を使用していますが、3.10.9でも大丈夫でした。


まず、repositoriesディレクトリに移動して、GPTQ-for-LLaMaのディレクトリを消しますww。コマンドからだとgitのファイルを消せない場合があります。その時はエクスプローラーから消しましょう。そのあと、quant-cudaをアンインストールして最新のGPTQ-for-LLaMaをcloneします。

```
$ cd repositories
$ rm -r GPTQ-for-LLaMa    #GPTQ-for-LLaMaディレクトリを消す
$ pip uninstall -y quant-cuda
$ git clone https://github.com/qwopqwop200/GPTQ-for-LLaMa.git -b cuda
```

次に、インストールを行います。
```
$ cd GPTQ-for-LLaMa
$ pip install -r requirement
```

あとは、モデルをダウンロードして起動しましょう

今回例でダウンロードしたモデル([TheBloke/vicuna-7B-1.1-GPTQ-4bit-128g](https://huggingface.co/TheBloke/vicuna-7B-1.1-GPTQ-4bit-128g))は、日本語での会話もできます。
以下はアーギュメントに--chatをつけて起動したものです
![スクリーンショット 2023-05-14 195342.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1857539/cd1772a7-f2bb-2c8a-11c9-b1873571dd88.png)