[C++,Python] 315 BBS閲覧アプリの製作 その1 DATファイルの保存

[M1 Mac, MacOS Ventura 13.3.1, clang 14.0.3]

とあるBBSのDATファイルへのアクセスが可能になったようなので、早速遊んでみることにしました。

とりあえずDATファイルをダウンロードしてみます。PythonスクリプトをChatGPTに変換してもらったコードがそのまま使えました。

DATファイルの文字コードがシフトJISですから、Macの場合はUTF-8に変換する必要がありますね。

#include <iostream>
#include <fstream>
#include <curl/curl.h>

size_t WriteCallback(void* contents, size_t size, size_t nmemb, void* userp) {
    std::ofstream* file = static_cast<std::ofstream*>(userp);
    file->write(static_cast<char*>(contents), size * nmemb);
    return size * nmemb;
}

int main() {
    std::string url = "DATファイルのurl";
    std::string filename = "保存先DATファイルのパス";

    CURL* curl = curl_easy_init();
    if (curl) {
        std::ofstream file(filename, std::ios::binary);
        curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &file);
        CURLcode res = curl_easy_perform(curl);
        if (res != CURLE_OK) {
            std::cerr << "Error: " << curl_easy_strerror(res) << std::endl;
        }
        curl_easy_cleanup(curl);
    } else {
        std::cerr << "Failed to initialize curl" << std::endl;
    }

    return 0;
}

[Python] 358 pngファイルからαチャンネルを削除

[M1 Mac, Ventura 13.3.1, Python 3.10.4]

前の記事でiOSアプリはアイコン登録で優遇されているのではないかと述べましたが、案外そうでもなさそうです。

というのは、iOSアイコンとして登録する画像はpngはpngでもαチャンネル(透過度)を削除したpngでないとアプリ申請が通らないからです。

αチャンネルがないpngというのが存在するというのも驚きですし、それを必須にするAppleもたいがいだと感じました。

αチャンネルはPythonで簡単に削除できます。

from PIL import Image

def remove_alpha_channel(input_file, output_file):
    image = Image.open(input_file)
    image = image.convert("RGB")
    image.save(output_file)

input_file = "RGBA.png"
output_file = "RGB.png"
remove_alpha_channel(input_file, output_file)

削除できたかどうかは右メニュー”情報を見る”、あるいはピクセル情報をCSVファイルに出力すれば分かります。RGBAデータを取り出そうとするとエラーになるはずです。

“情報を見る”画面
from PIL import Image
import numpy as np
import csv

img_array = np.array(Image.open("RGB.png"))

# 全ピクセルの色情報を取得 jpgあるいはpng(RGB)の場合
list_rgb = img_array[:, :, (0, 1, 2)]
# png(RGBA)の場合
# list_rgba = img_array[:, :, (0, 1, 2, 3)]

with open("RGB.csv", 'w') as f:
    writer = csv.writer(f,lineterminator='\n')
    writer.writerows(list_rgb)

# アルファチャンネル

[Python] 357 画像に枠を描画

[M1 Mac, Ventura 13.3.1, Python 3.10.4]

macOSのプレビューでは外枠を直接描けないようなので、Pythonで描きました。

下のスクリプトでは太さ2pxの黒い外枠を描画します。

C++画像加工アプリにこの機能を追加したいです。

import cv2
import numpy as np

# 画像ファイル設定
pic_name="test.PNG"
pic_name_out="test2.PNG"

# 枠ピクセル数
num_insert=2

# 画像読み込み
img = cv2.imread(pic_name,cv2.IMREAD_COLOR)

# 枠追加処理(上下)
bk1=np.zeros((num_insert,img.shape[1],3),np.uint8)

# 上下枠色設定
bk1[:,:,0]=bk1[:,:,0]+0 # 青
bk1[:,:,1]=bk1[:,:,1]+0 # 緑
bk1[:,:,2]=bk1[:,:,2]+0 # 赤
array=np.insert(img, 0, bk1, axis=0)
array=np.insert(array, array.shape[0], bk1, axis=0)

# 枠追加処理(左右)
bk2=np.zeros((array.shape[0],num_insert,3),np.uint8)

# 左右枠色設定
bk2[:,:,0]=bk2[:,:,0]+0 # 青
bk2[:,:,1]=bk2[:,:,1]+0 # 緑
bk2[:,:,2]=bk2[:,:,2]+0 # 赤
array=np.insert(array, [0], bk2, axis=1)
array=np.insert(array, [array.shape[1]], bk2, axis=1)

# 画像出力
cv2.imwrite(pic_name_out,np.array(array))

参考サイト

[Python] 356 HEICからPNGへの変換 iPhone画像 / HEIC2PNG

[M1 Mac, Ventura 13.3.1, Python 3.10.4]

iPhoneで撮影した画像はHEIC形式になります。

これをPNGファイルに変換するにはpyheifライブラリを使うのがメジャーのようですが、私の環境ではエラーが発生します。

そこで昨年9月にリリースされたheic2pngライブラリを使って変換しました。

pip install HEIC2PNG
from heic2png import HEIC2PNG

if __name__ == '__main__':
    img = HEIC2PNG('test.HEIC')
    img.save() # test.pngに変換

[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消去など後始末が面倒なので。