ChatRWKVを試してみる

# はじめに
[ChatRWKV](https://github.com/BlinkDL/ChatRWKV)を実行する手順をまとめました。
[RWKV](https://github.com/BlinkDL/RWKV-LM)はChatGPTで使われている[Transformerではなく従来のRNNを使ったLanguage Model](https://johanwind.github.io/2023/03/23/rwkv_overview.html)で、Transformerより少ないメモリで高速に動作するようです。
また完全にオープンですので、それなりのスペックのPCがあればローカルでも動かせます。

# 検証環境
* OS: Windwos 11 Pro
* CPU: 13th Gen Intel(R) Core(TM) i9-13900K   3.00 GHz
* Memory: 64GB
* GPU: NVIDIA GeForce RTX3080(VRAM10GB)

# 必要なソフトウェアのインストール
* [gitクライアント](https://git-scm.com/download/win)インストール 
* [CUDA11](https://developer.nvidia.com/cuda-toolkit-archive)インストール ※GPU使いたい場合
* [cuDNN8.x](https://docs.nvidia.com/deeplearning/cudnn/install-guide/index.html#install-windows)インストール ※GPU使いたい場合。CUDAのバージョンに合ったやつ入れる
* [python3](https://www.python.jp/install/windows/install.html)インストール
* [pytorch](https://pytorch.org/get-started/locally/)インストール
* [ChatRWKV](https://github.com/BlinkDL/ChatRWKV)インストール　※任意のディレクトリでコマンドプロンプトから下記を実行
```
git clone https://github.com/BlinkDL/ChatRWKV.git
```
* [RWKV](https://github.com/BlinkDL/RWKV-LM)インストール　※コマンドプロンプトでChatRWKVディレクトリに移動し下記を実行
```
pip install rwkv
pip install -r requirements.txt
```

# モデルデータのダウンロード
[huggingfaceのBlinkDLさんのページ](https://huggingface.co/BlinkDL)に色々モデルが置いてあるので、自分の環境で動かせるモデルをダウンロードします。

モデルはパラメータ数の違いにより0.4m、1.5B、3B、7B、14Bがあり、数が大きくなるとモデルのファイルサイズも大きくなり精度も良くなります（おそらく）。

手元のRTX3080(VRAM10GB)で動かせたのが7Bまででしたので、[7Bのモデル](https://huggingface.co/BlinkDL/rwkv-4-pile-7b/tree/main)から「RWKV-4-Pile-7B-20230109-ctx4096.pth」をダウンロードしました。
※14Bのモデルを動かすにはおそらく32GBのVRAMが必要

ダウンロードしたモデルファイルは、git cloneしたChatRWKV内のv2ディレクトリ配下に置いておきます。

# chat.pyの修正
chat.pyがChatRWKVの本体ですが、ルートとv2のディレクトリに存在しています。ファイル内容的にv2の方が新しいようですので、v2配下のファイルを使います。
このファイル(ChatRWKV/v2/chat.py)ではcudaの設定とモデルファイルのパスがハードコードされているので、任意のエディタで開き自分の環境に合わせて修正します。

#### ①Cuda設定の変更
「args.strategy = 'cuda fp16'」をコメントアウトして「args.strategy = 'cuda fp16i8'」のコメントを外します。
※i8の方にするとVRAMの使用量が３割程減るようです。自分の環境(VRAM10GB)ではi8にしないと7Bのモデルが動かせませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14831/fc367134-1d0d-4c97-f804-6d8ac1b60af7.png)

#### ②モデルファイルのパス変更
args.MODEL_NAMEにダウンロードしたモデルのパスを指定します。v2配下で実行する場合は特にパスは必要なくファイル名（拡張子なし）のみで良いです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14831/ebf8b10f-d5da-c0bc-cbc9-a281b06da8a5.png)

# 実行
コマンドプロンプトにてgit cloneしたChatRWKV内のv2ディレクトリ配下に移動し、下記を実行します。
```
python chat.py
```
しばらく待って「Bob:」と出てきたら起動成功です。会話を楽しみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14831/6ec8b4e4-cdfb-30a3-d326-7f952fc40d08.png)

# 日本語にしてみる
会話のコンテキストは「ChatRWKV\v2\prompt\default」の「English-2.py」ファイルで指定されているようです。
とりあえずChatGPTさんに内容を和訳してもらい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14831/92935ce9-1a43-9826-edcd-390496ce151a.png)
ファイルの中身を差し替えると
```
interface = ":"
user = "ボブ"
bot = "アリス"

# If you modify this, make sure you have newlines between user and bot words too

init_prompt = f'''
以下は、{bot}という名前の女の子と、彼女の友達{user}との、首尾一貫した詳細な会話です。\
{bot}は非常に知的で、創造的で友好的です。\
{bot}は{user}に異論を唱えることはほとんどなく、{user}に質問をするのもあまり好きではありません。\
{bot}は自分自身や自分の意見について{user}にたくさん話すのが好きです。\
{bot}は普段、{user}に親切で、役に立つ情報を提供するアドバイスをします。

{user}{interface} こんにちは{bot}、調子はどうですか？

{bot}{interface} こんにちは！ありがとう、私は元気です。あなたはどうですか？

{user}{interface} 私も元気です。お会いできてうれしいです。見てください、ここにお茶とジュースを売っているお店があります。

{bot}{interface} そうですね。中に入りましょう。私はモカラテが大好きなので、それを飲みたいです！

{user}{interface} それは何ですか？

{bot}{interface} モカラテは通常、エスプレッソ、ミルク、チョコレート、泡立てたミルクで作られます。その味はたいてい甘いものです。

{user}{interface} おいしそうですね。次回はそれを試してみます。しばらくおしゃべりしませんか？

{bot}{interface} もちろん！質問に答えたり、役に立つアドバイスを提供するのが嬉しいです。私は自分の専門知識に自信があるので、どうぞお気軽にどうぞ！
'''
```
一応、日本語で会話できるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14831/0cf36619-654c-1904-3a6d-8f9736f6ad07.png)

ただ英語に最適化されてるモデルらしく、日本語の会話はあんまり成り立たない模様です。