[Swift] 15 メモアプリ製作 その1

[M1 Mac, Ventura 13.3.1, Xcode 14.3]

iOS, watchOS, iPadOS, macOSで使えるメモアプリの製作に取り掛かりました。

とりあえず叩き台のコードをChatGPTに作成してもらいました。

あっさり作ってくれてちょっと引いています。

非IDEにこだわらなければ、Xcodeにどっぷり依存で簡単なアプリを量産できそうです。

import SwiftUI

struct Memo: Identifiable {
    let id = UUID()
    let title: String
    let content: String
}

struct MemoListView: View {
    @State var memos: [Memo] = [
        Memo(title: "メモ1", content: "これはメモ1です。"),
        Memo(title: "メモ2", content: "これはメモ2です。"),
        Memo(title: "メモ3", content: "これはメモ3です。")
    ]
    
    var body: some View {
        NavigationView {
            List(memos) { memo in
                NavigationLink(destination: MemoDetailView(memo: memo)) {
                    Text(memo.title)
                }
            }
            .navigationBarTitle("メモ一覧")
            .navigationBarItems(trailing: NavigationLink(destination: MemoEditView(memos: $memos)) {
                Image(systemName: "plus")
            })
        }
    }
}

struct MemoDetailView: View {
    let memo: Memo
    
    var body: some View {
        VStack {
            Text(memo.title)
                .font(.title)
            Text(memo.content)
                .padding()
            Spacer()
        }
        .navigationBarTitle(memo.title)
    }
}

struct MemoEditView: View {
    @Binding var memos: [Memo]
    @State var title: String = ""
    @State var content: String = ""
    
    var body: some View {
        Form {
            Section(header: Text("タイトル")) {
                TextField("タイトルを入力してください", text: $title)
            }
            Section(header: Text("内容")) {
                TextEditor(text: $content)
            }
            Section {
                Button(action: {
                    let memo = Memo(title: title, content: content)
                    memos.append(memo)
                }) {
                    Text("保存")
                }
            }
        }
        .navigationBarTitle("新規メモ")
    }
}

[AI] GPT 0613版リリース, 関数呼び出し機能 Function API追加

GPT-4とGPT3.5の0613版がリリースされました。この最新版で関数呼び出し機能 Function APIが追加されました。

天気APIを使ったコード例がネット記事に掲載されていたので、早速内容をチェックしました。

参考記事

GPT 0613版 Function APIのフロー

ChatGPTに指示文とfunctionsパラメータ、function_callパラメータを送信する。

ChatGPTが必要と判断したらfunction名と引数を返信する。

利用者側はこれを受け、function名と引数をパラメータとして取込み再度送信する。

functionの戻り値を組み込んだレスポンスを返す。

天気APIを利用する場合

“東京の現在の天気を教えてください。”と送信する。(functionsパラメータ他もバックグラウンドで同時に送信)

<コードの一部>
response = openai.ChatCompletion.create(
model="gpt-4-0613",
messages=[{"role": "user", "content": text}],
functions=[weather_function],
function_call="auto",
)


ChatGPTはweather_functionの使用が必要と判断し、引数(緯度、経度)とともに返信。

利用者側はweather_functionの使用を指示するプロンプトを自動送信。

ChatGPTは天気APIから得られた情報を元に返信。
“東京の現在の天気は20.9℃で、風速は4.2 m/s、風向きは北北西329.0度です。天候コードは2で、おおむね晴れています。ただし、現在は夜間です。”

OpenAI社にあまり課金していないのでGPT-4 APIやChatGPT plugins APIを使わせてもらえない身ではありますが、これでプラグインと同等の機能を自製できるようになりました。

開発中のChatGPTアプリにも取り入れたいと思います。

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

<以下略>

[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学習モデル

[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にダウングレードしました。