kotememo

【Windows】chatCWKVをローカルで実行してみた

はじめに

chatGPTはオンライン必須のため、オフラインで実行可能なcharRWKVを導入してみました。

GPUを使用することを前提にしています。

日本語が含まれているモデルもあるようなので今後が楽しみですね。

概要

事前にインストール済みのものもあったため、余分なものも入っているかもしれません。

  1. pythonインストール
  2. Visual Studio 2022インストール
  3. CUDA Toolkitインストール
  4. chatRWKVインストール
  5. モデルダウンロード
  6. ソースコード修正
  7. pipインストール
  8. 起動

環境

  • Windows 11 Pro
  • NVIDIA GeForce RTX 4070 Ti (VRAM 12GB)
  • 12th Gen Intel(R) Core(TM) i7-12700 (RAM 16GB)

1. pythonインストール

3.10系であれば大丈夫そうです。

今回は手元にあったWinPythonを使用しています。

Winpython64-3.10.9.0.exeをダウンロードし、実行すると任意の場所に解凍できます。

その中のWPy64-31090\python-3.10.9.amd64内にpythonがあり、WPy64-31090\python-3.10.9.amd64\Scripts内にpipがあります。

2. Visual Studio 2022インストール

こちらも事前にインストール済みだったため余分なものも含まれていると思います。

C++によるデスクトップ開発のインストール時オプションに、デフォルトの中にWindows用C++CMakeツールが含まれていればいいと思います。

VisualStudio画像

3. CUDA Toolkitインストール

pytorchのCUDA版を使用するためにインストールしました。

ChatRWKVのGitHubでは11.7をインストールするよう記載があったため11.7をインストールしています。

CUDA Toolkitダウンロードページよりexe(local)をダウンロード、実行しインストールしました。

4. chatRWKVインストール

GitHubページよりソースコードを取得します。

5. モデルダウンロード

rwkv-4-ravenモデルから日本語学習されたモデルをダウンロードします。

1B、3B、7B、14Bがありますが、ChatRWKVのGitHubのStrategy Guideから判断します。

VRAM12GBで動きそうなものがcuda fp16i8(VRAM 9G for 7B model.)であるため、7Bのモデルをダウンロードします。

今回はRWKV-4-Raven-7B-v10-Eng89%-Jpn10%-Other1%-20230420-ctx4096.pthをダウンロードし、%エスケープが面倒なためRWKV-4-Raven-7B-v10-Eng89-Jpn10-Other1-20230420-ctx4096.pthに名前変更しています。

最後に、選択したStrategyに従ってモデルを変換します。

PATH=%PATH%;D:\src\python\ChatRWKV\WPy64-31090\python-3.10.9.amd64;
cd D:\src\python\ChatRWKV\ChatRWKV-main
python .\v2\convert_model.py --in .\model\RWKV-4-Raven-7B-v10-Eng89-Jpn10-Other1-20230420-ctx4096.pth --out .\model\raven7B-v10-20230420-cudafp16i8.pth --strategy 'cuda fp16i8'

6. ソースコード修正

.\v2\chat.pyを修正します。

  1. Strategy

cuda fp16i8に変更しました。

変更前
# args.strategy = 'cpu fp32'
args.strategy = 'cuda fp16'
# args.strategy = 'cuda:0 fp16 -> cuda:1 fp16'
# args.strategy = 'cuda fp16i8 *10 -> cuda fp16'
# args.strategy = 'cuda fp16i8'
# args.strategy = 'cuda fp16i8 -> cpu fp32 *10'
# args.strategy = 'cuda fp16i8 *10+'
↓
変更後
# args.strategy = 'cpu fp32'
# args.strategy = 'cuda fp16'
# args.strategy = 'cuda:0 fp16 -> cuda:1 fp16'
# args.strategy = 'cuda fp16i8 *10 -> cuda fp16'
args.strategy = 'cuda fp16i8'
# args.strategy = 'cuda fp16i8 -> cpu fp32 *10'
# args.strategy = 'cuda fp16i8 *10+'
  1. RWKV_CUDA_ON

GPUを使用するように変更します。

変更前
os.environ["RWKV_CUDA_ON"] = '0' # '1' to compile CUDA kernel (10x faster), requires c++ compiler & cuda libraries
↓
変更後
os.environ["RWKV_CUDA_ON"] = '1' # '1' to compile CUDA kernel (10x faster), requires c++ compiler & cuda libraries
  1. チャット言語

日本語チャットを使用するように変更します。

変更前
CHAT_LANG = 'English' # English // Chinese // more to come
↓
# CHAT_LANG = 'English' # English // Chinese // more to come
CHAT_LANG = 'Japanese' # English // Chinese // more to come
  1. モデルのパス

ダウンロード、変換をしたモデルを参照するように変更します。

変更前
if CHAT_LANG == 'English':
    args.MODEL_NAME = '/fsx/BlinkDL/HF-MODEL/rwkv-4-raven/RWKV-4-Raven-14B-v9-Eng99%-Other1%-20230412-ctx8192'
    # args.MODEL_NAME = '/fsx/BlinkDL/HF-MODEL/rwkv-4-raven/RWKV-4-Raven-7B-v10-Eng99%-Other1%-20230418-ctx8192'
    # args.MODEL_NAME = '/fsx/BlinkDL/HF-MODEL/rwkv-4-pile-14b/RWKV-4-Pile-14B-20230313-ctx8192-test1050'

elif CHAT_LANG == 'Chinese': # Raven系列可以对话和 +i 问答。Novel系列是小说模型,请只用 +gen 指令续写。
    args.MODEL_NAME = '/fsx/BlinkDL/HF-MODEL/rwkv-4-raven/RWKV-4-Raven-7B-v9x-Eng49%-Chn50%-Other1%-20230418-ctx4096'
    # args.MODEL_NAME = '/fsx/BlinkDL/HF-MODEL/rwkv-4-novel/RWKV-4-Novel-7B-v1-ChnEng-20230409-ctx4096'

elif CHAT_LANG == 'Japanese':
    args.MODEL_NAME = '/fsx/BlinkDL/HF-MODEL/rwkv-4-raven/RWKV-4-Raven-14B-v8-EngAndMore-20230408-ctx4096'
    # args.MODEL_NAME = '/fsx/BlinkDL/HF-MODEL/rwkv-4-raven/RWKV-4-Raven-7B-v9-Eng86%-Chn10%-JpnEspKor2%-Other2%-20230414-ctx4096'
↓
変更後※パスは'\'ではなく'/'を使用する。また拡張子'.pth'は除く
if CHAT_LANG == 'English':
    # args.MODEL_NAME = '/fsx/BlinkDL/HF-MODEL/rwkv-4-raven/RWKV-4-Raven-14B-v9-Eng99%-Other1%-20230412-ctx8192'
    # args.MODEL_NAME = '/fsx/BlinkDL/HF-MODEL/rwkv-4-raven/RWKV-4-Raven-7B-v10-Eng99%-Other1%-20230418-ctx8192'
    # args.MODEL_NAME = '/fsx/BlinkDL/HF-MODEL/rwkv-4-pile-14b/RWKV-4-Pile-14B-20230313-ctx8192-test1050'
    args.MODEL_NAME = './model/raven7B-v10-20230420-cudafp16i8'

elif CHAT_LANG == 'Chinese': # Raven系列可以对话和 +i 问答。Novel系列是小说模型,请只用 +gen 指令续写。
    # args.MODEL_NAME = '/fsx/BlinkDL/HF-MODEL/rwkv-4-raven/RWKV-4-Raven-7B-v9x-Eng49%-Chn50%-Other1%-20230418-ctx4096'
    # args.MODEL_NAME = '/fsx/BlinkDL/HF-MODEL/rwkv-4-novel/RWKV-4-Novel-7B-v1-ChnEng-20230409-ctx4096'
    args.MODEL_NAME = './model/raven7B-v10-20230420-cudafp16i8'

elif CHAT_LANG == 'Japanese':
    # args.MODEL_NAME = '/fsx/BlinkDL/HF-MODEL/rwkv-4-raven/RWKV-4-Raven-14B-v8-EngAndMore-20230408-ctx4096'
    # args.MODEL_NAME = '/fsx/BlinkDL/HF-MODEL/rwkv-4-raven/RWKV-4-Raven-7B-v9-Eng86%-Chn10%-JpnEspKor2%-Other2%-20230414-ctx4096'
    args.MODEL_NAME = './model/raven7B-v10-20230420-cudafp16i8'

7. pipインストール

必要なライブラリをインストールします。

pytorchはcuda版をインストールします。

python -m pip install --upgrade pip
pip install numpy
pip install ninja
pip install rwkv
pip install -r requirements.txt
pip install torch==2.0.0+cu117 -f https://download.pytorch.org/whl/torch_stable.html

8. 起動

.\v2\chat.pyを実行することでchatRWKVボットと対話ができます。

set RWKV_CUDA_ON=1

set PATH=%PATH%D:\src\python\ChatRWKV\WPy64-31090\python-3.10.9.amd64;
set PATH=%PATH%D:\src\python\ChatRWKV\WPy64-31090\python-3.10.9.amd64\Scripts;
set PATH=%PATH%C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.35.32215\bin\Hostx64\x64;

cd /d D:\src\python\ChatRWKV\ChatRWKV-main
python .\v2\chat.py

自分側がBob、chatRWKVボット側がAliceです。

ブログを書くポイントについて聞き、次の質問では1番についてと曖昧な聞き方をしていますが文脈に合った返答が来ています。

Bob: ブログを書く上で気を付けるべきポイントは?
Alice: ブログを書く上で気を付けるべきポイントとして、以下が挙げられます。
1. フォーマットを整える
ブログを書く上で重要なのは、フォーマットを整えることです。フォーマットは、記事のタイトルや見出し、ヘッダーなど、どのような情報を掲載するかによって異なります。
2. コンテンツを考える
ブログを書く上で大切なのは、コンテンツを考えることです。ブログのコンテンツは、主題に関するものである必要があります。
3. スタイルを選択する
ブログのスタイルを選択することも大切です。読者がブログを視聴する場合、フォーマットに合わせたスタイルが選択されます。
4. コンテンツの流れを作る
ブログのコンテンツは、読者が楽しめるように作成されています。また、情報を提供することで、読者に対して自分自身と向き合うような作り方になります。
5. 自己啓発に取り組む
ブログを書く上で大切なのは、自己啓発に取り組むことです。ブログの内容に合わせて、継続的に情報収集や学習を行うことが大切です。
6. 適切な表現力を持つ
ブログで書く際には、適切な表現力が必要です。特に、フォーマットやコンテンツについての解説文などでは、適切な表現力が必要です。
7. ストーリー性を重視する
ブログはストーリー性を持ちましょう。内容が面白くてもストーリー性がないと読者は飽きてしまいます。
8. 継続的に更新する
ブログは日々更新されるものであるため、継続的に更新することが大切です。人気のある記事やエントリーなども交えて、定期的に更新しましょう。
これらのポイントを守ることで、ブログを続けていくことができます。

Bob: 1について詳しく説明してください。
Alice: 1. フォーマットを適切に調整する
ブログのフォーマットは、自分のブログで流れるように設定することが重要です。フォーマットが決まれば、記事を書くだけでなく、作成後もメンバーとのやり取りもスムーズになります。また、フォーマットを選択する際には、視覚的にわかりやすくなるように、スタイルを選択することも大切です。例えば、フォントの大きさやレイアウトなどが違います。

Bob: フォントの大きさはどれくらいが好ましいですか?
Alice: フォントの大きさは、ブログの視覚的な美しさに影響を与えます。フォントの大きさを選ぶ際には、読みやすさと読みやすさ
のバランスを考慮することが重要です。一般的に、フォントの大きさは12ptから14pt程度が最適であるとされています。また、フォントのカラーも考慮して選択することがお勧めです。例えば、ブログのテーマやコンテンツによって適切なフォントを選ぶことが必要になる場合があります。

少々違和感もありますが、大枠としては対話できているように思います。

AIの出力結果を鵜呑みにするのは良くないと思いつつも、いくつかはグサッと来るので反省ですね。

またchat.pyの後半部分にチャットコマンドの説明がありました。

直接入力 --> ボットとチャットする.改行には\\nを使用してください.
+ --> ボットに前回のチャットの内容を変更させる.
+reset --> 対話のリセット.メモリをリセットするために,+resetを定期的に実行してください.

+i インストラクトの入力 --> チャットの文脈を無視して独立した質問を行う.改行には\\nを使用してください.
+gen プロンプトの生成 --> チャットの文脈を無視して入力したプロンプトに続く文章を出力する.改行には\\nを使用してください.
+++ --> +gen / +i の出力の回答を続ける.
++ --> +gen / +i の出力の再生成を行う.

ボットとの会話を楽しんでください。また、定期的に+resetして、ボットのメモリをリセットすることを忘れないようにしてください。

例えば対話の途中で+resetと応答すると、対話内容をリセットできます。

Bob: +reset
Alice: Chat reset.