[AI] ChatRWKVアプリ製作 その12 Mac版メモリ制限解除

[M1 Mac, Ventura 13.3.1, Python 3.10.4, PyTorch 2.0.0]

Mac版を改良しメモリの制限を解除できるようにしました。

def loadModel(self):
    self.box.setStyleSheet('background-color: #3E62AD')
    self.output.setText("")
    
    # PyTorch環境変数設定
    limitoffChecked = self.limit.isChecked()
    
    if limitoffChecked == True:
        os.environ['PYTORCH_MPS_HIGH_WATERMARK_RATIO'] = '0.0'
    else:
        try:
            del os.environ['PYTORCH_MPS_HIGH_WATERMARK_RATIO']
        except:
            pass

    try:
        print(f'PYTORCH_MPS_HIGH_WATERMARK_RATIO = {os.environ["PYTORCH_MPS_HIGH_WATERMARK_RATIO"]}\n')
    except:
        print('PYTORCH_MPS_HIGH_WATERMARK_RATIOは設定なし\n')

<以下略>

[Python] 355 OS名、バージョン、RAMメモリサイズを取得

[M1 Mac, Ventura 13.3.1, Python 3.10.4]

Macの場合

import platform
import psutil

# OS名を取得
os_type = platform.system()

if os_type == "Darwin":
    os_type = "Mac"
    
    # OSバージョンを取得
    os_version = platform.mac_ver()[0]
    
    if os_version.startswith("13"):
        ver_name = "Ventura"
    
print("OS:", os_type)
print("OSバージョン:", os_version)
print("バージョン名:", ver_name)

# RAMメモリを取得
ram = psutil.virtual_memory().total / (1024 ** 3)
print("RAMメモリ:", round(ram, 2), "GB")
OS: Mac
OSバージョン: 13.3.1
バージョン名: Ventura
RAMメモリ: 8.0 GB

[AI] RWKV LoRA追加学習検証

[RTX 4070Ti, Ubuntu 22.04.1, CUDA 11.8, PyTorch 2.0.0]

AI研究用PCでRWKV-14Bモデル(28.3GB)の追加学習を試みましたが、RAMが足りませんでした。仮にマザボ(B660チップセット)の最大である128GBに増設しても、今度はVRAMが足りなくなるものと思われます。

strategy設定をdeepspeed_stage2_offloadやdeepspeed_stage3_offloadにしても上手くいきませんでした。

プログラミング学習用途では7Bは能力不足なので、LoRAによる自力でのチューニングは一旦あきらめます。

deepspeed_stage3_offloadではRAM 64GBを消費して強制終了した(中段赤ライン)

[AI] RWKV LoRAデータの使用

[RTX 4070Ti, Ubuntu 22.04.1, CUDA 11.8, PyTorch 2.0.0]

LoRAで追加学習したデータを既存の学習モデルと統合してチャットボットを動作させてみました。

有識者や実務家によるネット情報では、A6000×2やRTX 3090×2を搭載した超ハイスペックPCを駆使していたり、一般人ができる現実的なところではGoogle ColabでA100マシンを使ったりしています。

今回はRWKVのstrategy引数を使い、RTX 4070Tiでチャットボットを動作させました。この方法でVRAM12GBを超えるサイズの学習モデルを読み込むことができます。

args = types.SimpleNamespace()
args.strategy = 'cuda fp16i8 -> cpu fp32 *10' 

GPUとシステムRAMを併用してパラメータ数14BのLoRA追加学習ができないか次回以降検討します。

CHUNK_LEN = 256
END_OF_LINE = 187
AVOID_REPEAT_TOKENS = []
model_state = None

print('Loading...')

import numpy as np
import os, copy, types, gc, sys
import torch
from src.utils import TOKENIZER
os.environ["RWKV_JIT_ON"] = '1' 
from src.model_run import RWKV_RNN

try:
    os.environ["CUDA_VISIBLE_DEVICES"] = sys.argv[1]
except:
    pass
torch.backends.cudnn.benchmark = True
torch.backends.cudnn.allow_tf32 = True
torch.backends.cuda.matmul.allow_tf32 = True
np.set_printoptions(precision=4, suppress=True, linewidth=200)

CHAT_LANG = 'Japanese' # English Chinese Japanese

WORD_NAME = [
    "/home/xxx/AI/RWKV/RWKV-LM-LoRA/RWKV-v4neo/20B_tokenizer.json",
    "/home/xxx/AI/RWKV/RWKV-LM-LoRA/RWKV-v4neo/20B_tokenizer.json",
]  # [vocab, vocab] for Pile model
UNKNOWN_CHAR = None
tokenizer = TOKENIZER(WORD_NAME, UNKNOWN_CHAR=UNKNOWN_CHAR)

args = types.SimpleNamespace()
args.strategy = 'cuda fp16i8 -> cpu fp32 *10' # 追記
args.RUN_DEVICE = "cpu"  # 'cpu' (already very fast) // 'cuda'
# args.FLOAT_MODE = "fp16" # fp32 (good for CPU) // fp16 (recommended for GPU) // bf16 (less accurate)
args.vocab_size = 50277
args.head_qk = 0
args.pre_ffn = 0
args.grad_cp = 0
args.my_pos_emb = 0

args.MODEL_NAME = '/home/xxx/AI/Model/RWKV-4-Raven-14B-v8-Eng87%-Chn10%-Jpn1%-Other2%-20230412-ctx4096'
args.n_layer = 24
args.n_embd = 2048
args.ctx_len = 1024

# Modify this to use LoRA models; lora_r = 0 will not use LoRA weights.
args.MODEL_LORA = '/home/xxx/AI/Model/RWKV-LM-LoRA-Alpaca-Cleaned-Japan/rwkv-120-2304270732.pth'
args.lora_r = 8 # 0はLoRA未使用
args.lora_alpha = 32

<以下略>

参考サイト
LoRA対応RWKV
LoRA追加学習データ

[AI] ChatRWKVアプリ製作 その9 Linux版GUI改良

[RTX 4070Ti, Ubuntu 22.04.1, CUDA 11.8, PyTorch 2.0.0]

アプリ起動時に初期設定の学習モデルのサイズを表示するようにしました。加えてSTRATの横幅を拡げました。

model = QLabel('MODEL',self)
model.setGeometry(10,45,52,20)
model.setStyleSheet('color: #FFFFFF; font-size: 11pt;')
model.setAlignment(Qt.AlignmentFlag.AlignLeft)
    
# model選択
self.modelChoice= QComboBox(self)
self.modelChoice.setGeometry(60,40,350,25)
self.modelChoice.setStyleSheet('color: #FFFFFF; font-size: 10pt;')
dirPath = '/home/xxx/AI/ChatRWKV_work/model'
file_names = os.listdir(dirPath)
file_names = [path for path in file_names if ".pth" in path]

for file_name in file_names:
     self.modelChoice.addItem(file_name)

# model選択時のサイズ表示
self.modelChoice.currentIndexChanged.connect(self.getSize)

# size
self.modelSize = QTextEdit('',self)
self.modelSize.setGeometry(420,40,50,25)
self.modelSize.setStyleSheet('color: #FFFFFF; font-size: 9pt;')

# 初期modelのサイズ表示
self.getSize()

[AI] ChatRWKVアプリ製作 その8 Windowsターミナル削除で機能回復

[RTX 4070Ti, Windows11, CUDA 11.8, PyTorch 2.0.0]

ChatRWKVアプリのWindows11への移植を一旦断念しましたが、再度検討してみました。

Windowsターミナルを導入してから状態が悪化していたので思い切ってアンインストールしたところ、手入力のみではありますがコマンドプロンプトに入力できるようになりました。Windowsターミナルはセキュリティ強化か何かで入力不可になっているのでしょうか。

とりあえず最低限のことは出来るようにしたものの、Linux版に比べて明らかにコーディング能力が劣っています。総合的に全く納得できない不出来な内容なのでWindows版製作はこれで打ち切りです。

Ubuntuに戻って開発を継続します。AI研究用PCはWindows11入りSSDも接続しているため、BIOSのBoot優先順位切替でいつでも検証できる状態になっています。あえて起動時にOS選択できるデュアルブートにはしていません。PC組み替えの際のGRUB消去など後始末が面倒なので。

[AI] ChatRWKVアプリ製作 その7 Ubuntuへの移植完了 PyQt5

[RTX 4070Ti, Ubuntu 22.04.1, CUDA 11.8, PyTorch 2.0.0]

AI研究用PCのOSをWindows11からUbuntuに変更しました。

NVIDIA Driver、CUDAとそれらに適合したPyTorchのインストールに手間取りましたが、MacOSと同じUNIX系OSということもありその後はスムーズでした。

気になったこととして、Windowsでは関連ライブラリのバージョンを変えてチャットを実行する度に回答能力の大きなブレが生じており、MacOSやUbuntuではブレは殆どありませんでした。裏付けデータ不足で断定は出来ませんが、少なくとも私はそう感じました。ただUTF-8とShift-JISの違いでそのようなことが起こるとは思えないです。

なおLinuxはPyQt6には対応していないため、PyQt5にダウングレードしました。

[AI] ChatRWKVアプリ製作 その6 Windows11への移植断念 PyQt6

[RTX 4070Ti, Windows11]

ChatRWKVアプリをMacOSからWindows11へ移植しようとしたものの、ターミナル系ツールに質問となる文字列を貼り付けることが出来ませんでした。

コマンドプロンプト、PowerShell、Windowsターミナルどれもダメでした。前2者は貼り付けようとすると落ちてしまいますし、後者は落ちはしませんが全く書き込めません。設定を変えても改善せず。ウィンドウサイズさえ反映されないのはもはや意味不明。ツールのクラッシュだとしたら堅牢性ゼロと評価せざるを得ないです。

まさかWindowsでのAI研究2日目で馬脚を現すとは思いませんでした。GUIはMacOS版より良かったのですが残念です。

エクスプローラでファイルパスをコピーするとバックスラッシュ表記になり、そのままUTF-8のスクリプトに貼り付けると意図せずエスケープシーケンス混入スクリプトに化けるなどトラブル多発OSでもありますから見切られても仕方ないでしょう。

なおこの問題は該当箇所だけスラッシュに書き換えれば解決します。バックスラッシュとスラッシュが混ざっていてもパスとして成立する何とも奇妙なOSです。

明日以降、Linuxと入れ替えます。私の中でMacOS、Windows、Linuxだった序列がついにMacOS、Linux、(Windows)になりそうです。UTF−8文化圏で遊ぶのが私には最良なのでしょう。

ChatRWKVアプリWin版(開発中止予定)

[AI] ChatRWKV 動作確認 RTX 4070Tiを投入

RTX 4070Tiを搭載したWindows機を組みました。RAMは64GBに増設しました。

GPUなしでは厳しかったパラメータ数14Bの学習モデルを使うことが出来ました。初歩的なコーディングもOKです。

strategy設定をGPU→CPUにして、GPUのリソースを消費後、CPUに移行するようにすると上手くいきました。文字出力の速度は日本語2文字/秒といったところです。なおGPU単体ではチャット開始までにVRAM12GBを消費して中断してしまいます。

7Bはコーディングが全く出来ませんが14Bはなかなかいい感じです。どこまで書けるかはこれから検証します。

args.strategy = 'cuda fp16i8 -> cpu fp32 *10'
# args.strategy = 'cuda fp16i8' リソース不足エラーになる

[AI] LlamaIndexアプリ製作 その10 ディレクトリへの対応

[M1 Mac, Ventura 13.3.1, Python 3.10.4]

これまでCSVとPDFの単ファイルに対応していましたが、ディレクトリ内の複数ファイルにも対応できるようにしました。TXTファイルも読み込めます。

def makeIDX(self):
    # インデックスの作成および保存
    llm_predictor = LLMPredictor(llm=OpenAI(temperature=0, model_name="gpt-3.5-turbo"))
    service_context = ServiceContext.from_defaults(llm_predictor=llm_predictor)
    
    data_path = self.input.text()
    data_path2 = data_path.replace("'", "") # 拡張子判定用
    data_path3 = Path(data_path2) # loader用

    if data_path2.endswith('/'):
        documents = SimpleDirectoryReader(data_path3).load_data()
    elif data_path2.endswith('.csv'):
        SimpleCSVReader = download_loader("SimpleCSVReader")
        documents = SimpleCSVReader().load_data(file=data_path3)
    elif data_path2.endswith('.pdf'):
        PDFReader = download_loader("PDFReader")
        documents = PDFReader().load_data(file=data_path3)
    else:
        print('入力がディレクトリ,csv,pdfではありません')
        self.output.setText("入力がディレクトリ,csv,pdfではありません")
        self.box.setStyleSheet('background-color: #ff00ff')
        return

    index = GPTSimpleVectorIndex.from_documents(documents, service_context=service_context)
    
    now = datetime.datetime.now()
    formatted_time = now.strftime('%y%m%d_%H%M%S')

    index_file = "/Volumes/DATA_m1/AI/LlamaIndex/index/" + formatted_time + "_index.json"
    index.save_to_disk(index_file)
    
    self.input2.setText(index_file)
    self.idxBtn2.click()