GCPでRWKVを試す

# 背景
ここ最近のChatGPT関連で色々調べていたところ、この記事↓でRWKVというものがあると知りました。

https://note.com/shi3zblog/n/na991171b8fdd

ポイントは貧弱な基盤でもLLMが動くとのこと。
Google Colabでも動くようです↓。

https://note.com/npaka/n/nc0592a884903

# 目的
自前の環境で動かせる → 機密情報を突っ込める → 使い道が広がる。
ということでGCPで立てた手順を書いておきます。

# ComputeEngineでインスタンス作成
マシン構成は以下の通り。もう少し切り詰められるのかもしれないけど、素直に動かなかったりしたのでいったんこの構成でやりました。
* GPUはA100（40GBタイプ）
* ディスクは64GB（ブート用32GB、RWKV用に32GB。別ディスクにしてもOK）
※GPU用のOSイメージもあるけど、自由度が低くなると嫌なので今回は使いませんでした。

1時間当たり300円程度なのでお小遣いで全然遊べる!!
、、けど上げっぱなしだと月30万弱かかるようなので、落とし忘れ注意ですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301527/dda03398-b1e5-ad8a-89ce-a2c5b0525c78.png)

※ちなみに、、節約したい人は最初のセットアップの時はGPU系を載せずにやって、セットアップが終わってからGPUを載せたほうが課金が安いですが、、
セットアップは10分程度で終わるのであんまり気にしなくてもいいかもしれません。


追記）
もう少しお安い以下の構成（T4×2、CPU×8＋メモリ52GB）でも動きました。さすがに動きは遅くはなるけど、お値段は約1/3。
1時間たっぷり遊んでも100円!!安い!!
その場合、storategyを「cuda fp16」ではなく「cuda:0 fp16 -> cuda:1 fp16」とする必要があります。二つのGPUに跨ってロードさせる、という指示ようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301527/c0b543f7-83c5-334d-e29f-fab371554307.png)


# 必要なものをセットアップする

```bash
# 諸々まとめ入れておく
sudo apt install git git-lfs wget python3 pip unzip

# BlinkDL/ChatRWKVを取ってくる
git clone https://github.com/BlinkDL/ChatRWKV

# モデル置き場を掘っておく
sudo mkdir -p -m 777 /fsx/BlinkDL/HF-MODEL/rwkv-4-raven

# モデルを取ってくる。適宜 https://huggingface.co/BlinkDL/rwkv-4-pile-14b/resolve/main/ で最新のものを確認してください。
wget -P /fsx/BlinkDL/HF-MODEL/rwkv-4-raven/ "https://huggingface.co/BlinkDL/rwkv-4-raven/resolve/main/RWKV-4-Raven-14B-v9-Eng99%25-Other1%25-20230412-ctx8192.pth"

# GCPのGPUドライバーを取ってくる。参考→https://cloud.google.com/compute/docs/gpus/install-drivers-gpu?hl=ja#linux
curl https://raw.githubusercontent.com/GoogleCloudPlatform/compute-gpu-installation/main/linux/install_gpu_driver.py --output install_gpu_driver.py

# GCPのGPUドライバーをインストール
sudo python3 install_gpu_driver.py

# ninja入れる。最新バージョンはここ⇒https://github.com/ninja-build/ninja のタグで確認。
wget https://github.com/ninja-build/ninja/releases/download/v1.11.1/ninja-linux.zip
sudo unzip ninja-linux.zip -d /usr/local/bin/
sudo update-alternatives --install /usr/bin/ninja ninja /usr/local/bin/ninja 1 --force 

# cuda-toolsを入れる。本家はここ⇒「https://developer.nvidia.com/cuda-downloads」
wget https://developer.download.nvidia.com/compute/cuda/repos/debian11/x86_64/cuda-keyring_1.0-1_all.deb
sudo dpkg -i cuda-keyring_1.0-1_all.deb
sudo add-apt-repository contrib
sudo apt-get update
sudo apt-get -y install cuda

# pipで必要ライブラリを取ってくる
pip install numpy torch
pip install -r ChatRWKV/requirements.txt 
```
※ポイントは、、GCPでGPUドライバを入れるのは専用スクリプトを使う必要があるらしい。Nvidiaの純正ドライバだけだとうまくできなかった。これ知らないとハマる。


# 設定変更
必要に応じて ChatRWKV/v2/chat.py の中身の調整をします。
```ChatRWKV/v2/chat.py

# CUDAを使う
os.environ["RWKV_CUDA_ON"] = '1'

# T4使うときはstorategyを書き換える
args.strategy = 'cuda:0 fp16 -> cuda:1 fp16'

# モデル置き場を変えるときはこの辺り↓を書きかえる。
args.MODEL_NAME = '/fsx/BlinkDL/HF-MODEL/rwkv-4-pile-14b/RWKV-4-Pile-14B-20230313-ctx8192-test1050'

# 出力が気に入らないときはGEN_TOP_Pを調整する。0.1、0.2、0.5 辺りで試す。
GEN_TOP_P = 0.8
```


# 動かす
これだけ↓
```bash
python3 ChatRWKV/v2/chat.py 
```

2分くらいでロードが終わってBobとAliceの会話が始まります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301527/738c0048-98c1-2a30-192a-cea4c27c894e.png)
知っているのかどうか微妙なラインの回答ですね。。

A100だと超爆速。
![RWKV14-A100.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301527/bd2aa469-f9fd-95e7-5ce6-0c3f415cad82.gif)

T4でも14B結構早いです。![RWKV14-T4.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301527/92b5730f-7278-c3f4-602e-8de4900fe3c9.gif)

# 感想
1時間数百円程度のインスタンスでLLMが爆速で動かせてしまうしまう時代なんですね。
楽しい。感謝。