Ubuntu 22.04LTS serverにtext-generation-webuiをcondaでインストールする

LLM（大規模言語モデル）を自宅PCで動かせるようにしたときのメモです。OSはUbuntu 22.04 LTS serverで、この環境にtext-generation-webuiをインストールします。

なお、text-generation-webuiのインストールは「Manual installation using Conda」の手順を使ってインストールを行います。
ただし、事前にcudaのセットアップが済んでいるものとします。

公式サイトには「One-click installers」という、zipアーカイブを解凍してインストールする手順も用意されていますが、こちらの手順の説明は行いません。（すでにこの手順は、様々な方々が説明されているのでそちらを参照してください。）

## 環境

| 種類 | - |
| :---   | :--- |
| CPU    | AMD Ryzen 5 5600G  |
| GPU    | Geforce 3090 | 
| OS     | Ubuntu 22.04 LTS server | 
| その他 | cudaインストール済み |

## 準備

text-generation-webuiの公式サイトの手順には記載ありませんが、事前にtextgenユーザーの作成を行います。

本ユーザーを作成せずに公式サイトの手順を実施しても問題はありませんが、ホームディレクトリ配下にPythonの各種ライブラリがインストールされるので、環境を汚さないためにtextgenユーザーを作成し、そこにtext-generation-webuiのインストールを行います。

``` bash
$  sudo adduser textgen
[sudo] password for XXXXX:
Adding user `textgen' ...
Adding new group `textgen' (1001) ...
Adding new user `textgen' (1001) with group `textgen' ...
Creating home directory `/home/textgen' ...
Copying files from `/etc/skel' ...
New password:
Retype new password:
passwd: password updated successfully
Changing the user information for textgen
Enter the new value, or press ENTER for the default
        Full Name []:
        Room Number []:
        Work Phone []:
        Home Phone []:
        Other []:
Is the information correct? [Y/n] Y
```

本手順では以降、textgenユーザーでインストール作業を行います。

```
$ su - textgen
Password:
$ whoami
textgen
```

## text-generation-webuiインストール

以下、公式サイトの「Manual installation using Conda」に従いインストールを行います。

### conda（Miniconda）のインストール

Minicondのインストールを行います。
Minicondaは、PythonまたはR言語用の環境管理システムです。

```
$ curl -sL "https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh" > "Miniconda3.sh"
$ bash Miniconda3.sh

～ ライセンス条項は割愛 ～

Do you accept the license terms? [yes|no]
[no] >>> yes
```

Miniconda3のインストール場所を訊かれる。
デフォルト（ホームディレクトリ直下）から変更する必要がなければEnterキーを押下。

```
Miniconda3 will now be installed into this location:
/home/textgen/miniconda3

  - Press ENTER to confirm the location
  - Press CTRL-C to abort the installation
  - Or specify a different location below

[/home/textgen/miniconda3] >>>
```

Miniconda3の初期化を実行するか訊かれる。
yesを入力しEnterキーを押下。
この初期化時に、.bashrcにパス追加などの設定が行われる模様。

```
Do you wish the installer to initialize Miniconda3
by running conda init? [yes|no]
[no] >>> yes
```

Miniconda3のインストールが完了する。
先ほどの初期化で`.bashrc`に設定が追加されるので、シェルを再起動するよう注意が表示される。

```
==> For changes to take effect, close and re-open your current shell. <==

If you'd prefer that conda's base environment not be activated on startup,
   set the auto_activate_base parameter to false:

conda config --set auto_activate_base false

Thank you for installing Miniconda3!
```

指示に従いシェルを再起動すると、プロンプトの表示が変わり頭に「(base)」というプレフィックスがつくようになる。
```
インストール前：　textgen@localhost:~$
インストール後：　(base) textgen@localhost:~$
```

### text-generation-webuiのインストール


#### text-generation-webui 用の環境を構築する

condaを使い、text-generation-webui 用のPython環境を構築する。

```
$ conda create -n textgen python=3.10.9

～中略～

  xz                 pkgs/main/linux-64::xz-5.4.2-h5eee18b_0
  zlib               pkgs/main/linux-64::zlib-1.2.13-h5eee18b_0


Proceed ([y]/n)? y
```

condaにより環境構築が完了すると、下記のように`textgen`用の環境をactivateすることができるようになる。
activateするとプロンプトのプレフィックスが`(base)`から`(textgen)`と、activate先の名称がセットされる。

```
(base) textgen@localhost:~$ conda activate textgen
(textgen) textgen@localhost:~$
```

以降、textgen環境がactivateされていることを明示するため、実行例にプロンプトを表示する。（今まで `$` のみだったが `(textgen) textgen@localhost:~$`と記述する。）

続いて、Pytorchのインストールを行う。以下のコマンドはnVidia環境用のコマンドになる。
nVidia以外の環境については、[公式サイトの本テーブル](https://github.com/oobabooga/text-generation-webui#2-install-pytorch)を参照。

```
(textgen) textgen@localhost:~$ pip3 install torch torchvision torchaudio
```

text-generation-webuiをインストール（gitクローン）する。

```
(textgen) textgen@localhost:~$ git clone https://github.com/oobabooga/text-generation-webui
(textgen) textgen@localhost:~$ cd text-generation-webui
(textgen) textgen@localhost:~$ pip install -r requirements.txt
```

以上で、text-generation-webuiのインストールが完了。

text-generation-webuiのインストールディレクトリへ移動し、サーバーを実行する。なお、デフォルトだとlocalhost（127.0.0.1）しかアクセスできないため、`--listen`オプションを追加し他ホストからもアクセスできるようオプションを追加している。

```
(textgen) textgen@localhost:~$ cd ~/text-generation-webui
(textgen) textgen@localhost:~$ python server.py --listen
```

### 実行直後の画面

text-generation-webuiを起動し、ブラウザでアクセスすると以下の画面が表示される。
なお、LLMがインストールされていないため、チャットすることは出来ない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/515611/9f692b06-a3a6-7a36-a899-5b39f38b0e89.png)

画面上部のメニューから「Model」をクリックし、「Download custom model or LoRA」のテキストフィールドに、HuggingFaceのモデル名を入力し「Download」ボタンをクリックすると、指定したモデルがダウンロードされる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/515611/d052a78b-8705-c365-f13e-274edfa77842.png)


## 再起動について注意

text-generation-webuiを再起動するときは、`conda activate textgen`を実行しtextgen環境がactivateされてから起動コマンドを実行するように要注意。

```
(base) textgen@localhost:~$ conda activate textgen
(textgen) textgen@localhost:~$ cd ~/text-generation-webui
(textgen) textgen@localhost:~$ python server.py --listen
```

## 参考HP

- [text-generation-webui](https://github.com/oobabooga/text-generation-webui)
- [text-generation-webuiインストール手順](https://github.com/oobabooga/text-generation-webui#installation)
- [Python Japan : Conda コマンド](https://www.python.jp/install/anaconda/conda.html)
- [Miniconda](https://docs.conda.io/en/latest/miniconda.html)