モノヒトのubuntu22.04でイチからChatRWKVが動く環境を構築する

# 自己紹介
こんにちは。モノヒトです。昨今、巷でじわじわと有名になりつつあるChatRWKVを私も試してみました。この記事はLinux初心者の私の備忘録です。本記事は全くのド素人向けに書かれております。自分用の文章であり皆様にとっては内容が無いようなものかもしれませんがご容赦ください。この記事は右も左も五里霧中の中からなんとかRWKVを動かすまでの記録です。

# RWKVとは
公式の記事によると「RWKV は、トランスフォーマーレベルの LLM パフォーマンスを備えた並列化可能な RNN 言語モデルです。」だそうです。ChatGPTと違ってTransformerは使わないけどもそれなりに賢く、それなりに高速、そして省メモリなので自宅のローカルマシンで生成AIによるChatを楽しむことができます。

# やりたいこと
ChatGPTのように任意の会話文をRWKVに語りかけてRWKVからの自然な会話応答を楽しみます。ChatGPTではこちらの問いかけはOpenAI社が建てた世界のどこかのサーバーにインターネット経由で送信され、サーバーからインターネット経由にてこちらからへのと応答は自然な会話となって応答されますが、ChatRWKVではこの応答文章は自分のPC内で演算されることが特徴です。いろいろ原理やコードが理解できたらきっと自分のやりたい様々な応用ができるでしょう。ワクワク。

# マシンのスペック
    CPU：AMD Ryzen 5 3600 6-Core Processor
    メモリ：　32GB
    グラフィックカード：GeForce GTX 1650
    OS: Ubuntu 22.04

# なにはともあれ git をインストール
まず、Github上のRWKVのインストールのためにはgitをインストール必要がありますので
ターミナルを開いた後、
    
    sudo apt install git

とコマンドを入力してgitをインストールします。

# git clone でRWKVをダウンロード
以下のコマンドにてRWKVをダウンロード

    git clone https://github.com/BlinkDL/ChatRWKV.git

カレントディレクトリにChatRWKVができています。ここではhomeディレクトリにて上記コマンドを実行したとします。するとhome内にChatRWKVというディレクトリができています。

# pipを用いてRWKVをインストール
無事RWKVをgithubからクローンできたら、次にRWKVをインストールします。RWKVのコードはpythonで書かれております。なのでpipを使ってRWKVをインストールします。osをインストールして全くの最初はpipがインストールされてないのでターミナルにて

    sudo apt install python3-pip

とコマンドを打ってpipをインストールします。この時RWKVは先程述べたChatRWKVのディレクトリに移動してからインストールを実行する必要があるそうです（間違っていたらごめんなさい）。カレントディレクトリをChatRWKVに移動してから

    pip install rwkv
    pip install -r requirements.txt

とターミナルに入力してRWKVをインストールします。

# 言語モデルをダウンロード
AIの魂というべきモデルです。こいつをダウンロードして用いないとマシンにはRWKVというアルゴリズム（精神の器）があるのみで魂が入ってないようなものであり、RWKVにいかように喋りかけても何も応答しません。と、暗喩を用いて事を表現しましたが、端的にいえばChatRWKVを実行してもエラーになります。なのでChatRWKVとの自然な会話を楽しむためには言語モデルのダウンロードは必要です。
この言語モデルはhuggingfaceというAIコミュニティサイトにてRWKVの作者のページらしき場所にてダウンロードできます。

    https://huggingface.co/BlinkDL

最初はこのサイトを見てもどこをクリックしたらダウンロードできるのかさっぱりわかりませんでした。
例えば

    https://huggingface.co/BlinkDL/rwkv-4-raven/tree/main

にてfile and versions のタブを選んで好きなモデルを決めたらLFSってとこをクリックするとダウンロードできるんですね。Eng98などと書かれているのは英語を98%学習したよってことらしいです。なのでモデルの名前にこれがはいっているものは英語の会話が流暢であるようです。Chnって部分の割合が大きいと中国語が堪能ということになるのですね。とりあえず

    RWKV-4-Raven-3B-v12-Eng98%-Other2%-20230520-ctx4096.pth
    
をダウンロードしました。このモデルの保存場所はChatRWKV以下のv2というディレクトリに保存するとします。

#　必要なpythonモジュールをインポートすればCPU演算のみのChatRWKVとの会話が可能
ここで必要なモジュールとは

- numpy
- tokenizers
- prompt_toolkit
- tourch

などです。（※上述した pip install -r requirements.txt　を実行するとどうもそれらはインポートされるようです。）通常ならばnumpyは

    pip install numpy

でインストールすればOK。tokenizersも

    pip install tokenizers

でOK。prompt_toolkitも同様です。ただしtourchはGPU演算に必要なcudaとcuDNNというこれからインストールするもののバージョンと合わせる必要があるので闇雲にインストールしないように注意します。自分のPCにグラフィックカードがあり、そのカードのGPUにRWKVの演算を任せることをしない場合はtorchをインポートしても大丈夫です。あとはRWKVとの会話を楽しむことができます。その詳しい手順は
例えば
    https://qiita.com/ahinore@github/items/90189dc2e99baca29f8d
こちらの記事を参考にして自分でもRWKVとの会話を楽しむことができました。
自分がダウンロードしたモデルは英語が堪能となるようにチューニングされているようなので
英語で話しかけるとRWKV（Aliceと表示されている）が流暢かつ自然な英語でお返事してくれます。
ところでpython3では自分が管理するプロジェクトごとにpythonの仮想環境を構築して、その仮想環境ごとにモジュールをインポートしてそのプロジェクト専用の環境を作ることが推奨されているようです。そうすると複数のプロジェクトを管理するときにインポートしたモジュールがあっちのプロジェクトでは正常に動作してこっちでは動かない、というような干渉問題を避けることができます。pythonの仮想環境構築はいろんな方法があるみたいですけど、ここではvenvというのを使うことにします。

# venvのインストール

python3のvenvのインストールコマンドは以下です。
    sudo apt install -y python3-venv
 
- 仮想環境の構築
~/ChatRWKV のディレクトリ以下にpython3の仮想環境を構築することにします。とりあえずenvという名前でつくることにします。この名前は任意に設定することができます。記事によってはvenvだったりdevだったりお好みで様々なようです。envと名前を決めた場合、仮想環境の構築のコマンドは以下です。
envというディレクトリがChatRWKV内にできていることを確認します。

      ~/ChatRWKV$ python3 -m venv env

- 仮想環境でのpython3の起動
 envがあるディレクトリにて
     
      ~/ChatRWKV$ source env/bin/activate

とコマンドを打てばvenvが起動します。あとは上述した通り、numpy、tokenizerなどのモジュールをpipでインポートします。繰り返しですが後述のGPUの補助による演算時間の短縮をしたい場合はそのGPUを搭載したグラフィックカードのドライバまわりのライブラリ（というのかな。cudaとかcuDNNとか）のバージョンとtorchのバージョンを一致させる必要があるため、うかつにtorchをインポートしないようにします。

# ChatRWKVの実行手順概略

ChatRWKVの実行プログラムはchat.pyです。それは/ChatRWKV/v2 内に存在します。chat.pyをpythonにて実行すれば自分は仮の人格Bobとなり、人工知能Alice（RWKV)がBobの問いかけに返事します。会話はターミナル上のチャットによって行われます。
ここで注意なのですがchat.pyの実行の前にやることがあります。
まずvscodeなどでchat.pyの中身を編集します。
現バージョンのchat.pyでは61行目が

   args.MODEL_NAME = '/fsx/BlinkDL/HF-MODEL/rwkv-4-raven/RWKV-4-Raven-14B-v12-Eng98%-Other2%-20230523-ctx8192'

となっていますのでこれを

    args.MODEL_NAME = 'RWKV-4-Raven-3B-v12-Eng98%-Other2%-20230520-ctx4096'

に書き換えます。
52行目あたり、

    os.environ["RWKV_JIT_ON"] = '1' # '1' or '0', please use torch 1.13+ and benchmark speed
    os.environ["RWKV_CUDA_ON"] = '0' # '1' to compile CUDA kernel (10x faster), requires c++ compiler & cuda libraries

とありますがCPU演算の場合　
os.environ["RWKV_JIT_ON"] = '1' とするのが正しいようです。GPU演算の場合は
これを0にしてos.environ["RWKV_CUDA_ON"] = '1' とするようです。
さらに44行目の　args.strategy = 'cpu fp32'　をアンコメントしてその他の
args.strategy = 'cuda fp16'などをコメントアウトすればCPU演算によるRWKVの実行の準備は完成です。

ディレクトリ　~/ChatRWKV/v2　にて python chat.pyとコマンドを打てばchatRWKVが動作します。
BobになりきってAliceに英語で話しかけるとAlice（RWKVによる人工知能）が英語で返答してくれます。

今日はここまで
CUDAとcuDNNのインストールに関してはまた後日



# 参考
https://qiita.com/ahinore@github/items/90189dc2e99baca29f8d
https://qiita.com/yo-yamada/items/ee71cdbb1d95fea5eaf8
https://qiita.com/tf63/items/0c6da72fe749319423b4
https://qiita.com/karaage0703/items/5d46b249f6be68186210
https://black092.github.io/blog/post/004/
https://misoji-engineer.com/archives/ubuntu20-04-cuda.html
https://qiita.com/tf63/items/0c6da72fe749319423b4
https://qiita.com/takanemu/items/6027291be8a2a6af9adc