ChatRWKVを使ってみた

## はじめに
[CYBIRD Advent Calendar 2023](https://qiita.com/advent-calendar/2023/cybird) 1日目担当の @garyumaru です。
サイバードでは、技術統括部所属のエンジニアとして、イケメンシリーズの開発・運用など、Unityタイトルに限らず、iOS/Androidのネイティブアプリも含めた、さまざまな案件の技術サポートをしている 通りすがりのゲームデザイナー です。

## 旬のAI、はじめました〜♪
これは BlinkDL 氏が開発した言語モデル RWKV Language Model をベースにしたチャットAI（CharRWKV）を利用するための環境構築のためのドキュメントです。

ChatRWKV は ChatGPT に似ていますが、RWKV (100% RNN) 言語モデルとオープンソースを利用したものです。
https://github.com/BlinkDL/ChatRWKV

これを使って、ローカルPCで、AIと会話できる環境を構築します。

![chatRWKV_wsl2_start.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35434/a48395ee-4041-515a-675b-762b3467f315.png)

## ローカルでの環境構築をする前に

### PCのスペック
動作検証環境その１：
DOSPARA GALLERIA GCR1660TGF-QC-G
CPU: Intel(R)  Core(TM) i7-9750H 2.60GHz
GPU: Intel UHD Graphics 630 / NVIDIA GeForce GTX1660
RAM: 16GB
OS: Windows 11 Pro 23H2

動作検証環境その２：
MOUSE COMPUTER G-TUNE NG-N-i5730SA1
CPU: Intel(R) Core(TM) i7-7700HQ 2.80GHz
GPU: NVIDIA GeForce GTX1070
RAM: 16GB
OS: Windows 10 Pro 22H2

::: note 
これらのような最新ではないスペックのPCでも動かすことができました。
あとで説明する `.wslconfig` の設定が勝利の鍵です。
本格的にAIについて取り組むなら、NVIDIA GeForce RTX 20x0/30x0/40x0 シリーズなどCUDAに対応したGPUを搭載したPCを利用した方が良いんじゃないかな？と個人的には思います。
また、RAMのサイズやHDD/SSDの空き容量が十分確保できているPCにて、環境構築をするとトラブルが減ります。
実際に私が環境構築をする際には、Cドライブの空き容量不足が原因で、WSLやPython、ChatRWKVのために必要なライブラリのインストール中にフリーズしたり、エラーが発生するケースが多発したので、ご注意ください。
:::

## 環境構築
### PCのビデオカードに合わせてGPUドライバーを最新のものに更新する
[NVIDIA GPU ドライバー](https://www.nvidia.com/Download/index.aspx?lang=en-us)←ここからPCに搭載されているGPUにあったものをダウンロードしてインストールしてください

### WSL2(Windows Subsystem for Linux 2)のインストール
#### WSLを新規にインストールする場合
1. Power Shellを「管理者として実行する」を選んで開く
1. Power Shellで次のコマンドを入力する

    ```
    wsl --install
    ```

1. コマンドが完了したら、コンピュータを再起動する
1. 再起動後、Ubuntuのインストールが自動的に始まる
        - ユーザ名とパスワードを設定する
1. Ubuntuのシェルが起動したらWSL2のインストールが完了となる

#### 既存のWSLをアップデートする場合
1. Power Shellを「管理者として実行する」を選んで開く
1. Power Shellで次のコマンドを入力する

     ```
    wsl --update
    ```

1. WSLを再起動する
     ```
    wsl --shutdown
    ```

#### WSLのバージョンを確認する
WSLが正しくインストールできていればバージョンを確認できます。

- WSLのバージョン情報を表示する

     ```
    wsl --version
    ```

### WSL2のメモリ設定
1. .wslconfig
    `.wslconfig`を編集してメモリの割り当てを変更します。
    `c:¥Users¥{自分のルートディレクトリ}`に`.wslconfig`ファイルが存在しない場合は作成します。
    `c:¥Users¥{自分のルートディレクトリ}`の`.wslconfig`ファイルを編集して、下記の記述を追加します。

     例: `c:¥Users¥garyumaru¥.wslconfig`

     ```
    [wsl2]
    memory=16GB
    swap=128GB
    ```
    ::: note info
    swapの容量指定のためには、Cドライブに同じだけの空き容量が必要になるので適切なサイズを指定してください。
:::

1. PCを再起動する。
1. Power Shellを「管理者として実行する」を選んで開く
1. Power Shellでwsl2を起動する
1. freeコマンドを実行する。
    
        - 下記のコマンドを実行してmemoryやswapへのメモリの割り当てが期待通りに増加していれば完了です。
    ```
    free -m
    ```



### WSL2の起動
1. Power Shellを「管理者として実行する」を選んで開く
1. Power Shellで次のコマンドを入力する

     ```
    wsl
    ```

### Python（pyenv+venv）環境のインストール
pyenv : Pythonのインストールとバージョン管理するためのツール
venv : Pythonが動作する仮想環境を作成・管理するためのツール

1. Ubuntuのターミナルで次のコマンドを実行する

     ```
    sudo apt update
    sudo apt upgrade -y
    ```

1. 次のコマンドを実行する

     ```
    sudo apt update; sudo apt install build-essential libssl-dev zlib1g-dev \
    libbz2-dev libreadline-dev libsqlite3-dev curl \
    libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev
    ```

1. pyenvのインストール

     ```
    curl https://pyenv.run | bash
    ```

1. インストール後に表示されるメッセージに従って、~/.bash_profile(~/.profile)や~/.bashrcに追記する
    表示されるメッセージは次の通り
     ```
    # Load pyenv automatically by appending
    # the following to
    # ~/.bash_profile if it exists, otherwise ~/.profile (for login shells)
    # and ~/.bashrc (for interactive shells) :
    
    export PYENV_ROOT="$HOME/.pyenv"
    [[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"
    eval "$(pyenv init -)"
    
    # Restart your shell for the changes to take effect.
    
    # Load pyenv-virtualenv automatically by adding
    # the following to ~/.bashrc:
    
    eval "$(pyenv virtualenv-init -)"
    ```

1. pyenvでバージョン指定してPythonをインストールする

     ```
    pyenv install 3.11.5
    ```

1. pyenvで利用可能なpythonのバージョンを確認する

     ```
    pyenv versions
    ```
    実行すると下記のように表示される
     ```
    * system(set by /home/garyumaru/.pyenv/version)
      3.11.5  
    ```

1. pyenvで利用するPythonのバージョンを変更する

     ```
    pyenv global 3.11.5
    ```

1. pyenvで利用するPythonのバージョンが変更されたことを確認する

     ```
    pyenv versions
    ```
    実行すると下記のように表示される
     ```
        system(set by /home/garyumaru/.pyenv/version)
    * 3.11.5  
    ```

1. venvのインストール
    ※pythonのバージョンが3.3以上であればインストール不要で利用できる

1. venvを使って仮想環境を構築する
    `python -m venv {仮想環境名}`
    例: `py_workspace`フォルダを作成し、その中に`test1`という名前のプロジェクト（仮想環境）を構築する
    ```
    cd ~/
    mkdir py_workspace
    cd py_workspace
    python -m venv test1 
    ```

1. 仮想環境をアクティブにする
    `source {仮想環境名}/bin/activate`

     ```
    source test1/bin/activate
    ```
1. 仮想環境を終了する
    `deactivate`

     ```
    deactivate
    ```

### ChatRWKVのインストール

1. 仮想環境を構築する
    作業フォルダ： `py_workspace`
    仮想環境名： `rwkv_test1`
     ```
    cd ~/
    wsl
    mkdir py_workspace
    cd py_workspace
    python -m venv rwkv_test1
    source rwkv_test1/bin/activate
    ```

1. ChatRWKVをCloneする

     ```
    git clone https://github.com/BlinkDL/ChatRWKV
    ```
1. 環境設定

     ```
    cd ChatRWKV
    pip install -r requirements.txt
    pip install transformers
    pip install ninja
    pip install torch torchvision
    ```

    :::note info
     `pip install`を実行したときに、下記のnoticeが表示される場合は、`pip install --upgrade pip`を実行して、pipをアップグレードできます。

     ```
    [notice] A new release of pip is available: 23.2.1 -> 23.3.1
    [notice] To update, run: pip install --upgrade pip
    ```
:::
    
1. モデルをダウンロードする
    https://huggingface.co/BlinkDL
    今回、検証で使用するPCはメモリも少なくGPUの性能もイマイチなので小さいサイズのモデル(3B)にしました。
    
    - 3B: https://huggingface.co/BlinkDL/rwkv-4-pile-3b/blob/main/RWKV-4b-Pile-3B-20230228-7963.pth
    ※ただし3Bのモデルでは、動作しても期待した会話ができない場合があるので、動作検証でなく本格的に使いたい場合は7B以上のモデルを選んで、ダウンロードしましょう。（補足：3Bのモデルがダメなのではなくて、ダウンロードしたものがよくなかったようです）

    - 7B: https://huggingface.co/BlinkDL/rwkv-4-world/blob/main/RWKV-4-World-JPNtuned-7B-v1-20230718-ctx4096.pth
    ※会話が正しくできないのは日本語のチューニングがされていないものだったからのようなので、`JPNtuned`など、それらしいファイル名のものを利用すると良いでしょう。

    - 1B5: https://huggingface.co/BlinkDL/rwkv-5-world/blob/main/RWKV-5-World-1B5-v2-20231025-ctx4096.pth
    ※その後、v5の1B5のモデルがリリースされていて、こちらであれば、サイズも小さいし、日本語でも会話ができていました。

    
1. ダウンロードしたモデルをChatRWKV/v2フォルダの下に格納する

1. chat.pyファイルを編集する
    - chat_langを日本語に設定する
        ```
        CHAT_LANG = 'English' # English // Chinese // more to come
        ```
        を`Japanese`に変更する
        ```
        CHAT_LANG = 'Japanese' # English // Chinese // more to come
        ```
        <br>
    - モデルを指定する
        ```
        args.MODEL_NAME = 'RWKV-5-World-1B5-v2-20231025-ctx4096.pth'
        ```
        <br>
    - CPUモードを指定する（※CUDAが利用できないPCの場合）
        ```
        #args.strategy = 'cpu fp32'
        args.strategy = 'cuda fp16'
        ```
        `cpu fp32` を有効にする
         ```
        args.strategy = 'cpu fp32'
        # args.strategy = 'cuda fp16'
        ```


1. `ChatRWKV/v2`ディレクトリで、次のコマンドを実行する

     ```
     python chat.py
    ```

1. 必要なものが全てインストールされた状態なら`python chat.py`コマンドを実行することでChatRWKVが起動します。

    ![chatRWKV_wsl2_start.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35434/a48395ee-4041-515a-675b-762b3467f315.png)

## まとめ
お疲れ様でした。ついにローカルPCでChatRWKVが動きました！
Bobになって、Aliceとの会話を楽しみましょう。

ここから先の展開としては、言語モデルのトレーニングやAIとの会話をhttp通信で応答させるなど、夢が広がりますね。それらについては、また別の機会に...

ぜひ、皆さんも挑戦してみてください。



## 最後に
[CYBIRD Advent Calendar 2023](https://qiita.com/advent-calendar/2023/cybird)、 明日は@koronekoさんが担当です。
どんな内容なのか楽しみですね。



## おまけ：GPU(CUDA)を有効にする！？
実はchat.py内で `args.strategy = 'cuda fp16'` になっていても初期の状態ではGPUは有効になっていないようです。

追加で下記のような設定が必要になります。

1. chat.pyの内のオプションを1に設定する
 
     ```
    os.environ["RWKV_CUDA_ON"] = '1'
    ```

    この設定で`python chat.py`を実行すると、次のようなエラーが出るようになります。

     ```
        raise OSError('CUDA_HOME environment variable is not set. '
        OSError: CUDA_HOME environment variable is not set. Please set it to your CUDA install root.
    ```

1. CUDA Toolkitをインストールする
https://developer.nvidia.com/cuda-11-8-0-download-archive?target_os=Linux&target_arch=x86_64&Distribution=WSL-Ubuntu&target_version=2.0&target_type=deb_network
  ※最新の12.xをインストールするとPyTorchが対応していないみたいなので、11.8にする

     ```
    wget https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-keyring_1.0-1_all.deb
    sudo dpkg -i cuda-keyring_1.0-1_all.deb
    sudo apt-get update
    sudo apt-get -y install cuda-11-8
    ```

1. PCを再起動して、wslを起動し、ChatRWKVを動かす仮想環境を立ち上げます。

     ```
    cd ~
    cd py_workspace
    source rwkv_test1/bin/activate
    cd ChatRWKV/v2
    ```
1. `python chat.py`コマンドを実行する
1. これでGPU(cuda)が有効になったChatRWKVが起動できます。

## おまけ：その２
swapのメモリを指定したいけど、Cドライブの空き容量が少ない場合、Dドライブなどにディレクトリを作成して、swapfileを指定します。ただしディレクトリはあらかじめ作成しておく必要があります。

- 例: .wslconfig

    ```
    [wsl2]
    memory=16GB
    swap=64GB
    swapfile=D:\\temp\\wsl-swap.vhdx
    ```

## 参考
- [ChatRWKVを試してみる - Qiita](https://qiita.com/ahinore@github/items/90189dc2e99baca29f8d)
- [WSL での詳細設定の構成](https://learn.microsoft.com/ja-jp/windows/wsl/wsl-config)