[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' リソース不足エラーになる

[C++] 311 インクルードパスの確認方法 #include_nextトラブル

[M1 Mac, Ventura 13.3.1, clang 13.0.0]

MacOSをMontereyからVenturaに上げるとコンパイル時に以下のエラーが出るようになりました。

fatal error: 'stdio.h' file not found
#include_next <stdio.h>

Command Line Toolsを入れ直してもダメでXcodeを削除したりしているといつの間にか正常になりました。Xcodeを解決後に再インストールしても問題ありませんでした。MacOSをバージョンアップするたびにこの種のトラブルが必ず起こるので困ったものです。

rm -rf /Library/Developer/CommandLineTools
xcode-select --install

ところで#include_nextはインクルードパスにある別の同名ヘッダファイルを読み込む指示です。インクルードパスは以下のコマンドで確認できます。

clang++ -x c++ -v -E /dev/null
$ clang++ -x c++ -v -E /dev/null
Apple clang version 14.0.3 (clang-1403.0.22.14.1)
Target: arm64-apple-darwin22.4.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
 "/Library/Developer/CommandLineTools/usr/bin/clang" -cc1 -triple arm64-apple-macosx13.0.0 -Wundef-prefix=TARGET_OS_ -Wdeprecated-objc-isa-usage -Werror=deprecated-objc-isa-usage -Werror=implicit-function-declaration -E -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name null -mrelocation-model pic -pic-level 2 -mframe-pointer=non-leaf -fno-strict-return -ffp-contract=on -fno-rounding-math -funwind-tables=1 -fobjc-msgsend-selector-stubs -target-sdk-version=13.3 -fvisibility-inlines-hidden-static-local-var -target-cpu apple-m1 -target-feature +v8.5a -target-feature +crc -target-feature +lse -target-feature +rdm -target-feature +crypto -target-feature +dotprod -target-feature +fp-armv8 -target-feature +neon -target-feature +fp16fml -target-feature +ras -target-feature +rcpc -target-feature +zcm -target-feature +zcz -target-feature +fullfp16 -target-feature +sm4 -target-feature +sha3 -target-feature +sha2 -target-feature +aes -target-abi darwinpcs -fallow-half-arguments-and-returns -debugger-tuning=lldb -target-linker-version 857.1 -v -fcoverage-compilation-dir=/Users/user -resource-dir /Library/Developer/CommandLineTools/usr/lib/clang/14.0.3 -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk -I/usr/local/include -stdlib=libc++ -internal-isystem /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1 -internal-isystem /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/local/include -internal-isystem /Library/Developer/CommandLineTools/usr/lib/clang/14.0.3/include -internal-externc-isystem /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include -internal-externc-isystem /Library/Developer/CommandLineTools/usr/include -Wno-reorder-init-list -Wno-implicit-int-float-conversion -Wno-c99-designator -Wno-final-dtor-non-final-class -Wno-extra-semi-stmt -Wno-misleading-indentation -Wno-quoted-include-in-framework-header -Wno-implicit-fallthrough -Wno-enum-enum-conversion -Wno-enum-float-conversion -Wno-elaborated-enum-base -Wno-reserved-identifier -Wno-gnu-folding-constant -fdeprecated-macro -fdebug-compilation-dir=/Users/user -ferror-limit 19 -stack-protector 1 -fstack-check -mdarwin-stkchk-strong-link -fblocks -fencode-extended-block-signature -fregister-global-dtors-with-atexit -fgnuc-version=4.2.1 -fno-cxx-modules -no-opaque-pointers -fcxx-exceptions -fexceptions -fmax-type-align=16 -fcommon -fcolor-diagnostics -clang-vendor-feature=+disableNonDependentMemberExprInCurrentInstantiation -fno-odr-hash-protocols -clang-vendor-feature=+enableAggressiveVLAFolding -clang-vendor-feature=+revert09abecef7bbf -clang-vendor-feature=+thisNoAlignAttr -clang-vendor-feature=+thisNoNullAttr -mllvm -disable-aligned-alloc-awareness=1 -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o - -x c++ /dev/null
clang -cc1 version 14.0.3 (clang-1403.0.22.14.1) default target arm64-apple-darwin22.4.0
ignoring nonexistent directory "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/local/include"
ignoring nonexistent directory "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/Library/Frameworks"
#include "..." search starts here:
#include <...> search starts here:
 /usr/local/include
 /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1
 /Library/Developer/CommandLineTools/usr/lib/clang/14.0.3/include
 /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include
 /Library/Developer/CommandLineTools/usr/include
 /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks (framework directory)
End of search list.
# 1 "/dev/null"
# 1 "<built-in>" 1
# 1 "<built-in>" 3
# 428 "<built-in>" 3
# 1 "<command line>" 1
# 1 "<built-in>" 2
# 1 "/dev/null" 2
$ clang++ -x c++ -v -E /dev/null
Apple clang version 14.0.3 (clang-1403.0.22.14.1)
Target: arm64-apple-darwin22.4.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
 "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang" -cc1 -triple arm64-apple-macosx13.0.0 -Wundef-prefix=TARGET_OS_ -Wdeprecated-objc-isa-usage -Werror=deprecated-objc-isa-usage -Werror=implicit-function-declaration -E -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name null -mrelocation-model pic -pic-level 2 -mframe-pointer=non-leaf -fno-strict-return -ffp-contract=on -fno-rounding-math -funwind-tables=1 -fobjc-msgsend-selector-stubs -target-sdk-version=13.3 -fvisibility-inlines-hidden-static-local-var -target-cpu apple-m1 -target-feature +v8.5a -target-feature +crc -target-feature +lse -target-feature +rdm -target-feature +crypto -target-feature +dotprod -target-feature +fp-armv8 -target-feature +neon -target-feature +fp16fml -target-feature +ras -target-feature +rcpc -target-feature +zcm -target-feature +zcz -target-feature +fullfp16 -target-feature +sm4 -target-feature +sha3 -target-feature +sha2 -target-feature +aes -target-abi darwinpcs -fallow-half-arguments-and-returns -debugger-tuning=lldb -target-linker-version 857.1 -v -fcoverage-compilation-dir=/Volumes/DATA_m1/code/cpp/projects/SFTPAssist -resource-dir /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/14.0.3 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk -I/usr/local/include -stdlib=libc++ -internal-isystem /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/c++/v1 -internal-isystem /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/local/include -internal-isystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/14.0.3/include -internal-externc-isystem /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include -internal-externc-isystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include -Wno-reorder-init-list -Wno-implicit-int-float-conversion -Wno-c99-designator -Wno-final-dtor-non-final-class -Wno-extra-semi-stmt -Wno-misleading-indentation -Wno-quoted-include-in-framework-header -Wno-implicit-fallthrough -Wno-enum-enum-conversion -Wno-enum-float-conversion -Wno-elaborated-enum-base -Wno-reserved-identifier -Wno-gnu-folding-constant -fdeprecated-macro -fdebug-compilation-dir=/Volumes/DATA_m1/code/cpp/projects/SFTPAssist -ferror-limit 19 -stack-protector 1 -fstack-check -mdarwin-stkchk-strong-link -fblocks -fencode-extended-block-signature -fregister-global-dtors-with-atexit -fgnuc-version=4.2.1 -fno-cxx-modules -no-opaque-pointers -fcxx-exceptions -fexceptions -fmax-type-align=16 -fcommon -fcolor-diagnostics -clang-vendor-feature=+disableNonDependentMemberExprInCurrentInstantiation -fno-odr-hash-protocols -clang-vendor-feature=+enableAggressiveVLAFolding -clang-vendor-feature=+revert09abecef7bbf -clang-vendor-feature=+thisNoAlignAttr -clang-vendor-feature=+thisNoNullAttr -mllvm -disable-aligned-alloc-awareness=1 -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o - -x c++ /dev/null
clang -cc1 version 14.0.3 (clang-1403.0.22.14.1) default target arm64-apple-darwin22.4.0
ignoring nonexistent directory "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/local/include"
ignoring nonexistent directory "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/Library/Frameworks"
#include "..." search starts here:
#include <...> search starts here:
 /usr/local/include
 /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/c++/v1
 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/14.0.3/include
 /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include
 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include
 /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks (framework directory)
End of search list.
# 1 "/dev/null"
# 1 "<built-in>" 1
# 1 "<built-in>" 3
# 428 "<built-in>" 3
# 1 "<command line>" 1
# 1 "<built-in>" 2
# 1 "/dev/null" 2

今回のトラブルで、私のような非IDE派はCommand Line Toolsさえあればプログラミングできる、つまりXcodeがなくても問題ないということを再確認しました。Xcodeは20GB超えの重量アプリですから、ストレージ不足になったら真っ先に削除するようにします。

[C++] 310 FLTK : 長整数型を引数とするcallback関数 その2

[M1 Mac, Ventura 13.3.1, clang 13.0.0, FLTK 1.3.8, NO IDE]

callback関数の引数に長整数を使うことで第1引数の動作関数に引数として追加できます。

任意の長整数により動作関数の内容を条件分けできます。例えばFileChooserで選んだファイルパスの表示先を変えることが出来たりします。

使用頻度は高くないですが、たまに使おうとすると殆ど忘れてしまっているので再度記事にしておきます。構造がややこしくて共同開発であれば現場を混乱させそうな内容です。

久しぶりにC++のコードを書きましたが、だいぶPythonになじんでいたので調子が出ないです。

// fileFcBtn
fileFcBtn = new Fl_Button(245,108,30,20,"...");
fileFcBtn->color(fl_rgb_color(112,128,144));
fileFcBtn->labelcolor(fl_rgb_color(255,239,213));
fileFcBtn->labelsize(14);
fileFcBtn->callback(FileChooserCB,1); // 長整数1を渡す

// toFcBtn
toFcBtn = new Fl_Button(245,143,30,20,"...");
toFcBtn->color(fl_rgb_color(112,128,144));
toFcBtn->labelcolor(fl_rgb_color(255,239,213));
toFcBtn->labelsize(14);
toFcBtn->callback(FileChooserCB,2); // 長整数2を渡す
void FileChooserCB(Fl_Widget*, long num) {
    int fc;
    string appdir = "/";
    int onoff_dir = dir_rbtn->value();

    if (onoff_dir == 1){
        fc = 4; // FileChooser::DIRECTORY
    } else {
        fc = 0; // FileChooser::SINGLE
    }

    int x_win = window->x_root();
    int y_win = window->y_root();
    cout<<"x_win "<< x_win <<" y_win "<< y_win <<endl;

    chooser = new FileChooser(appdir.c_str(), 
                        "*.*",
                        fc,
                        "File/Dir Chooser",490,380, num
                        );
    
    chooser->resize(x_win+85,y_win+50,490,380);
    chooser->set_modal();
    chooser->Fl_Window::show();

    while(chooser->Fl_Window::shown()){
        Fl::wait();
    }
}
FileChooser::FileChooser(const char *d, const char *p, 
int t, const char *title,int w,int h, long num)
	:Fl_Window(w,h,title),Fl_File_Chooser(d,p,t,title){

<中略>

btnOK = new Fl_Return_Button(313, 345, 85, 25, "OK");
		if (num==1){
			btnOK->callback((Fl_Callback*)btnOKCB);
		} else {
			btnOK->callback((Fl_Callback*)btnOKCB2);
		}
void btnOKCB(Fl_Return_Button*, void*)
{
	const char* file = inputFileName->value();

	file_input->value("");
	file_input->value(file);
	chooser->Fl_Window::hide();
}

void btnOKCB2(Fl_Return_Button*, void*)
{
	const char* file = inputFileName->value();

	to_input->value("");
	to_input->value(file);
	chooser->Fl_Window::hide();
}
FileChooser
FileChooser選択パスの表示先がFILE/DIR欄に固定されていてTO欄が使えていない
修正後はボタン別に表示先を変えられるようになった
類似記事

[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()

[AI] LlamaIndexとLangChain(Chroma)の比較 その2 要約力

[M1 Mac, Ventura 13.3.1, Python 3.10.4]

今度は要約力を比較しました。とある英語論文のPDF1ページ目を読み込ませて、要約してもらいました。

こちらでもLlamaIndexに軍配があがりました。ここでLangChain(Chroma)が優れているのであれば、Embeddings Toolアプリとして両者を統合する目論見でしたが、現時点では正確性・要約力で明らかにLangChain(Chroma)が劣っているため見送りです。

.py /usr/local/bin/python /Volumes/DATA_m1/AI/LangChain/Python/ChatGPT_LangChain 
Using embedded DuckDB with persistence: data will be stored in: .
この論文では、大規模言語モデルマシン(LLMM)と高水準プログラミング言語のクラスとの間に接続を
確立する新しいアプローチを提案しています。これにより、Turingマシンオブジェクトと言語オブジェクトの間の
シームレスな相互作用が可能になり、普遍的にアクセス可能なオブジェクト指向の記述が実現されます。
LLMMを利用して、現実世界のオブジェクトとそれらのシミュレーションを言語シミュレーション可能な
世界に自動的に変換する方法を示し、デジタルツインコンセプトを推進します。このプロセスは高水準
プログラミング言語に拡張することができ、これらのシミュレーションの実装をよりアクセスしやすく
実用的にすることができます。

[AI] LlamaIndexとLangChain(Chroma)の比較 その1 正確性

[M1 Mac, Ventura 13.3.1, Python 3.10.4]

表題の2方法について、PDFを読み込ませた上で質問に対して正確に答えられるかどうか評価しました。

結果はLlamaIndexの圧勝でした。LangChain(Chroma)ではPDFにあるはずのデータを存在しないと返してきました。これでは話になりません。

LangChain(Chroma)では有力なベクトルDBであるChromaを使っていますが、苦手な処理だったのか正確性ではLlamaIndexとは比較になりませんでした。要約力であればまた結果が違ってくるのかもしれません。

import os
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.text_splitter import CharacterTextSplitter
from langchain.chat_models import ChatOpenAI
from langchain.chains import ConversationalRetrievalChain
from langchain.document_loaders import PyPDFLoader

loader = PyPDFLoader("試合日程表.pdf")
pages = loader.load_and_split()

# print(pages[1].page_content)

apiKey = os.getenv("CHATGPT_API_KEY")
os.environ["OPENAI_API_KEY"] = apiKey

llm = ChatOpenAI(temperature=0, model_name="gpt-3.5-turbo")

embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(pages, embedding=embeddings, persist_directory=".")
vectorstore.persist()

pdf_qa = ConversationalRetrievalChain.from_llm(llm, vectorstore.as_retriever(), return_source_documents=True)

query = "XXXの試合はいつですか"
chat_history = []

result = pdf_qa({"question": query, "chat_history": chat_history})

print(result['answer'])

参考サイト

[AI] ChatRWKVアプリ製作 その5 LangChainでRWKVを使う PyQt6

[M1 Mac, Ventura 13.3.1, Python 3.10.4]

LangChainでRWKV学習モデルを試してみました。

LangChainはこれまで3/31リリースの0.0.127を使っていました。このバージョンではRWKVは使えませんでしたが、現時点最新の0.0.146では使用可能になっています。毎日、新バージョンをリリースしているのでこまめにチェックが必要ですね。

パラメータ数1B5で受け答えがややまともになりましたが、M1 Macでは動作が遅すぎます。日本の首都を答えるのに3分掛かりました。

class chat_base():
    def __init__(self):
        self.model_tokens = []
        self.model_state = None
        self.all_state = {}
        self.user = None
        self.bot = None
        self.interface = None
        self.init_prompt = None
        self.pipeline = None
        self.bool_value = False
        
    def load_model(self, lang, strat, model, bool):
        self.lang = lang
        self.strat = strat
        self.model = model
        self.bool = bool
        
        if self.bool == False:
            from langchain.llms import RWKV
            
            llm = RWKV(
                model = '/Volumes/DATA_m1/AI/ChatRWKV_work/' + self.model, 
                strategy = self.strat, 
                tokens_path = "/Volumes/DATA_m1/AI/ChatRWKV_work/ChatRWKV/v2/20B_tokenizer.json"
            )
            
            while True:
                print("質問を入力して下さい")
                self.question = input()
                print(llm(self.generate_prompt(self.question)))

参考サイト

[AI] GPT-4 APIの利用資格 仮説

GPT-4のwaitlistに登録して1ヶ月と1週間が経過しました。どうやらこのままでは永久にGPT-4 APIは使えなさそうです。

アメリカの掲示板サイトRedditに利用資格の仮説がアップされていたので、以下にまとめます。

1.OpenAIのアカウント歴が長い。
2.OpenAIの学習モデルを使った開発実績がある。
3.OpenAIのサービスに対して支払実績がある。
4.GPT-4を使用する理由、GPT-3.5では不足な理由を適切に回答する。
5.ChatGPT Plusのサブスク登録は有効ではあるが絶対ではない。

特に2番と4番が重要だとする意見もありました。

供与された無料枠(18ドル分)を使い切ってクレジットカードによる支払が発生したら使えるようになるのかもしれません。特に急ぐつもりもありません。

waitlistとしていますが、実際は審査ボットが瞬時に合否を出しているはず。放置は良くないですね。申込者に対して何の案内もないのは反感を買うだけです。

AppleやMicrosoftのような開発者への配慮が全く感じられないのは残念です。

もう今更どちらでもいい心境なのでマイペースでAI遊びを続けていきます。