[AI] ChatRWKVアプリ製作 その11 M1 Mac / Metalで再挑戦

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

ChatRWKVの設定により7Bサイズのモデルを読み込めるようになりました。

環境変数 PYTORCH_MPS_HIGH_WATERMARK_RATIOをゼロに設定しメモリ使用の上限を撤廃することで読込が可能になります。ただしシステムが不安定になる可能性があるため要注意です。

動作はかなり遅く実用にはほど遠いですが、RAMメモリ強化でどこまで速くなるのか興味深いです。

ところでAppleのイベントWWDCが今晩開催されますが(日本時間6/6 午前2時)、AIについてどのような発信があるのか楽しみです。

またグランフロント大阪にApple Storeを出店する計画があるとか。実現したらヨドバシ梅田と同様に売り上げ日本一になるのでは。

import os

# PyTorch環境変数設定
os.environ['PYTORCH_MPS_HIGH_WATERMARK_RATIO'] = '0.0'
print(f'PYTORCH_MPS_HIGH_WATERMARK_RATIO = {os.environ["PYTORCH_MPS_HIGH_WATERMARK_RATIO"]}\n')
self.stratChoice = QComboBox(self)
self.stratChoice.setGeometry(215,70,100,25)
self.stratChoice.addItem('mps fp32 -> cpu fp32 *10')
self.stratChoice.addItem('mps fp32')
self.stratChoice.addItem('cpu fp32')
self.stratChoice.addItem('cuda fp16')
7Bでは環境変数を変更しないとエラーになる
環境変数変更で7Bは読み込めたが動作はかなり遅い

[AI] ChatRWKVアプリ製作 その10 Raven 7Bと14Bの比較

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

最新バージョン12、7Bモデル(14.8GB)と14Bモデル(28.3GB)の性能を比較しました。

日本語については全く学習内容に含まれておらず、質問してもAIから有用な回答は返ってきませんでした。1%でも含まれていると大分違います。

英語でプログラミングについて質問するとやはり14Bの方が明らかに優れています。コンテキストを読み取る能力に格段の差があります。7Bについてはいくらバージョンアップしても根本の能力は変わらないように感じました。絶対能力の向上を期待していたのですが厳しいようです。

Japanese - /home/xxx/AI/Model/RWKV-4-Raven-14B-v12-Eng98%-Other2%-20230523-ctx8192.pth - cuda fp16i8 -> cpu fp32 *10

あなたはプログラミングを教えるチャットボットです。

Human: QCoreApplication::exec: The event loop is already running
Code now datetime by yymmdd_hhmmss in Python
AI: You can use the datetime module in Python to format a datetime object with the format yymmdd_hhmmss. Here's an example:
```python
import datetime
now = datetime.datetime.now()
formatted_datetime = now.strftime('%Y%m%d_%H%M%S')
print(formatted_datetime)
```This will output a string in the format yymmdd_hhmmss, such as 20190705_130056. You can use this string in any program that requires a datetime object.

Human: QCoreApplication::exec: The event loop is already running
Japanese - /home/xxx/AI/Model/RWKV-4-Raven-7B-v12-Eng49%-Chn49%-Jpn1%-Other1%-20230530-ctx8192.pth - cuda fp16i8 -> cpu fp32 *10

あなたはプログラミングを教えるチャットボットです。

Human: QCoreApplication::exec: The event loop is already running
Code now datetime by yymmdd_hhmmss in Python
AI: import datetime from datetime import datetime, timezone def yymmdd_hhmmss(dt): y, m, d = map(int, dt.split('_')) return timezone(y).localize(dt.replace(hour=0, minute=0, second=0), tzinfo=timezone(datetime.timezone(m)).normalize())

Human: QCoreApplication::exec: The event loop is already running

RWKV学習モデル

[C++] 313 Makefileでのライブラリ設定 MacOS

[M1 Mac, MacOS Ventura 13.3.1, clang 14.0.3]

Linuxはどうなっているのか分かりませんが、MacOSでのライブラリ設定は結構ややこしいです。

ライブラリパスを.bash_profileでDYLD_LIBRARY_PATHとして設定しておかないとビルドはできても実行はできません。

仕組みがよく分からないまま放置していましたが、ようやく明確にできました。

デフォルトのライブラリパスである/usr/local/libなどに配置すれば今回のような設定は不要です。他のライブラリとは分けて管理したかったためライブラリパスを追加した次第です。

# D2XXライブラリの場合
# /usr/local/D2XX/libにはlibftd2xx.aとlibftd2xx.dylibを配置

# includeパス(-I)
INCLUDE = -I/usr/local/D2XX/include

# ライブラリ(-l) 動的ライブラリ優先
LIBS = -lftd2xx
# 静的ライブラリのフルパス(実行ファイルに取り込まれる、ライブラリパス不要)
# LIBS = /usr/local/D2XX/lib/libftd2xx.a
# 動的ライブラリのフルパスは使えない

# ライブラリパス(-L) .bash_profileでDYLD_LIBRARY_PATHとしての設定も必須
LIBPATH = -L/usr/local/D2XX/lib

includeパスは.bash_profileでも設定できる。

# D2XX
export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/usr/local/D2XX/include

export DYLD_LIBRARY_PATH="/usr/local/D2XX/lib:$DYLD_LIBRARY_PATH"

DYLD_LIBRARY_PATHを設定していない場合の実行時エラーは以下の通り。echo $DYLD_LIBRARY_PATHでは.bash_profileで設定したライブラリパスしか確認できない。デフォルトの確認方法は不明。

~ $ test ; exit;
dyld[17390]: Library not loaded: libftd2xx.dylib
  Referenced from: <E59057E2-6B27-3B0F-9FD2-A568CC6B0F5D> test
  Reason: tried: '/opt/homebrew/Cellar/exiv2/0.27.5_1/lib/libftd2xx.dylib' (no such file), '/libftd2xx.dylib' (no such file), 'libftd2xx.dylib' (no such file), 
'/System/Volumes/Preboot/Cryptexes/OSlibftd2xx.dylib' (no such file), 
'libftd2xx.dylib' (no such file), '/usr/local/lib/libftd2xx.dylib' (no such file), 
'/usr/lib/libftd2xx.dylib' (no such file, not in dyld cache), 
'/opt/homebrew/Cellar/exiv2/0.27.5_1/lib/libftd2xx.dylib' (no such file), 
'/libftd2xx.dylib' (no such file), '/Users/xxx/libftd2xx.dylib' (no such file),
 '/System/Volumes/Preboot/Cryptexes/OS/Users/xxx/libftd2xx.dylib' (no such file), 
'/Users/xxx/libftd2xx.dylib' (no such file), '/usr/local/lib/libftd2xx.dylib' (no such file), 
'/usr/lib/libftd2xx.dylib' (no such file, not in dyld cache)
Abort trap: 6
logout

[C++] 312 FTDI FT-XシリーズをBit Bangモードで使う MacOS

[M1 Mac, MacOS Ventura 13.3.1, clang 14.0.3]

FTDIの技術資料にあるサンプルコードをApple Silicon Macで動くようにしました。いつものように非IDE環境です。

AN_373 Bit-Bang Modes for the FT-X Series

D2XXドライバをダウンロードして、適当な所に配置します。今回は/usr/localディレクトリにしました。

Windows用のコードをApple Siliconにて非IDE環境で使えるようにする、といった類いの作業は自分なりの手法を確立させているので、比較的はかどります。やっていて楽しい作業です。今回はCocoaフレームワークとIOKitフレームワークのビルドオプションへの追加が肝でした。

FT231Xを使ってAVRマイコンに書き込みできるのか検証中です。

ただ、Bit Bangの解説資料ではあるもののフル機能を使えるわけではないような気がします。

// #include <Windows.h> 元はWindows用
#include <stdio.h>
#include <stdint.h>
#include "ftd2xx.h"

FT_STATUS ftStatus;
FT_HANDLE ftHandle;
DWORD w_data_len = 3; //write 3 bytes
DWORD data_written; // number of bytes written
UCHAR Mask = 0x0F;  //00001111 Set D7-D4 input, D3-D0 output [input (0) and output (1)]
UCHAR Mode = 0x04;  //0x04 = synchronous bit-bang
DWORD RxBytes; //number of bytes to be read from the device
DWORD BytesReceived; //number of bytes read from the device
uint8_t RxBuffer[8]; //buffer to receive data from FT-X device
uint8_t data_out[8]; //buffer for data to be sent to FT-X device
unsigned int i;

int main() 
{
    ftStatus = FT_Open(0, &ftHandle);
    ftStatus |= FT_SetUSBParameters(ftHandle, 4096, 4096); // Set USB transfer sizes
    ftStatus |= FT_SetChars(ftHandle, false, 0, false, 0); // Disable event characters
    ftStatus |= FT_SetTimeouts(ftHandle, 5000, 5000); // Set read/write timeouts to 5 sec
    ftStatus |= FT_SetLatencyTimer(ftHandle, 16); // Latency timer at default 16ms
    ftStatus |= FT_SetFlowControl(ftHandle, FT_FLOW_NONE, 0x11, 0x13);
    ftStatus |= FT_SetBaudRate(ftHandle, 62500); //bit rate is x16 this value = 1M

<以下略>
# コンパイラ設定
COMPILER = clang++
DEBUG = -g

# オプション設定
CPPFLAGS = -std=c++20
LDFLAGS = -lc++ -framework Cocoa -framework IOKit

# includeパス(-I)
INCLUDE = -I./include \
-I/usr/local/D2XX

# ライブラリ(-l)
LIBRARY_l = /usr/local/D2XX/build/libftd2xx.a

# ライブラリパス(-L)
LIBRARY_L = -L/usr/local/lib

# ソースファイル
SRCDIR = ./src
SRCS = $(shell find $(SRCDIR) -type f)

# オブジェクトファイル
OBJDIR = ./obj
OBJS = $(addprefix $(OBJDIR), $(patsubst ./src/%.cpp,/%.o,$(SRCS)))

# 実行ファイル
TARGETDIR = ./bin
TARGET = test

# cppファイルからoファイル作成 $<:依存ファイル
$(OBJDIR)/%.o: $(SRCDIR)/%.cpp
	$(COMPILER) $(CPPFLAGS) $(INCLUDE) $(DEBUG) -o $@ -c $<

# oファイルから実行ファイル作成
$(TARGET):$(OBJS)
	$(COMPILER) -o $(TARGETDIR)/$@ $(OBJS) $(LIBRARY_l) $(LIBRARY_L) $(LDFLAGS)

# コンパイル&ビルド
.PHONY:all
all: clean $(OBJS) $(TARGET)

# oファイル・実行ファイル削除
.PHONY:clean
clean:
	rm -rf $(OBJS) $(TARGETDIR)/$(TARGET) $(TARGET).app

[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] Google ColabのPay As You Go会員

Colab Pro+サブスクが自動解約となりPay As You Go会員に移行しました。

コンピューティング ユニット数はまだ400以上残っています。1ヶ月経ったので期限はあと2ヶ月です。

これまでGPUは100% A100をあてがわれていましたが、Pay As You Go会員になったとたんに確率は1/3に減少しました。V100になる方が多いです。

V100のマシンはシステムRAMが貧弱なのでサイズが大きな学習モデルは使えません。自宅PC(RTX 4070Ti)はRAM 64GB、VRAM 12GBですから、ほとんどアドバンテージがないです。

Google Colabは全体的に動作が遅く、ライブラリを都度インポートしないといけないので面倒ですが、A100を使えるというのはかなり価値があります。

# 事前にライブラリをインポートしていても使えない

import sys
sys.path.append("/content/drive/MyDrive/Colab Notebooks/lib")