[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は読み込めたが動作はかなり遅い

[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

[MacOS] .DS_Store関連の検証 Makefile動作不調解決 / ChatGPTの虚言癖改善

[M1 Mac, Monterey 12.6.3, clang 13.0.0, ChatGPT API(gpt-3.5-turbo), NO IDE]

.DS_Storeを削除せずにMakefileを正常動作させることが出来るようになりました。

findコマンドでsrcディレクトリ内のcppファイルパスを取得する際、.DS_Storeファイルを対象外としました。findコマンドにそのような機能があるとは知りませんでした。*.cppのワイルドカードで良かったのかも。

今回の件でChatGPTに散々嘘をつかれて振り回されたため、虚言癖が出ないようsystemロールで”あなたはソースが明確に存在することしか発言しないチャットボットです”と釘を刺すと少しましになりました。

嘘をつくなと指示してもその概念が分からないようなので、かみ砕いて説明する必要がありました。

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

[MacOS] .DS_Store関連の検証 Makefile動作不調

[M1 Mac, Monterey 12.6.3, clang 13.0.0, FLTK 1.3.8, ChatGPT API(gpt-3.5-turbo), NO IDE]

Spotlightのためにディレクトリ情報をまとめた.DS_StoreがMakeコマンドを妨害することがあります。

対象ディレクトリにある.DS_Storeを消してしまえば済む話ですが、それではSpotlightが正常に機能しなくなるのでMakeコマンド実行時にこのファイルを無視できないか方法を探っています。ちなみにGitではgit ignoreを使って無視できます。

.DS_StoreはFinderで隠しファイルを見えるようにしても隠れたままですから、取り扱いがやっかいです。

取りあえず消してしまった.DS_Storeを仮置きするために他のディレクトリからコピーする方法をメモしておきます。

全てのディレクトリに.DS_Storeは存在しているはずなので、最初にfindコマンドで所在を確認する必要は特にありません。

# .DS_Storeファイルの所在を確認
$ find "/ChatGPT" -name ".DS_Store"
# 出力
/ChatGPT/.DS_Store
/ChatGPT/.git/.DS_Store
/ChatGPT/bin/.DS_Store
/ChatGPT/etc/.DS_Store
/ChatGPT/images/.DS_Store
/ChatGPT/include/.DS_Store
/ChatGPT/obj/.DS_Store

# 適当な.DS_Storeファイルを対象ディレクトリへコピー
$ cp /ChatGPT/obj/.DS_Store /ChatGPT/src

# コピーできているか確認
$ find "/ChatGPT" -name ".DS_Store"
# 出力
/ChatGPT/.DS_Store
/ChatGPT/.git/.DS_Store
/ChatGPT/bin/.DS_Store
/ChatGPT/etc/.DS_Store
/ChatGPT/images/.DS_Store
/ChatGPT/include/.DS_Store
/ChatGPT/obj/.DS_Store
/ChatGPT/src/.DS_Store

[FFmpeg] 動画に複数のぼかしを入れる

[M1 Mac, Big Sur 11.6.8]

FFmpegのコマンドがとにかくわかりにくいので、書き留めておきます。

開発中のビデオツールアプリに実装するには、このコマンドをC++で生成する必要があります。

FFmpeg関連の情報はネットに数多くありますが、どういったユーザー層なのか気になります。C/C++ユーザーよりもコマンドライン使いが多そうです。

ffmpeg -i out.mp4 -filter_complex \          --- (1)
 "[0:v]crop=265:154:648:103,boxblur=4[b0]; \ --- (2)
  [0:v]crop=94:111:572:267,boxblur=4[b1]; \  --- (3)
  [0:v][b0]overlay=648:103[ovr0]; \          --- (4)
  [ovr0][b1]overlay=572:267[ovr1]" \         --- (5)
-map "[ovr1]" out2.mp4                       --- (6)

(1) 入力ファイルはout.mp4。以下、-filter_complexを記す。
(2) 入力ファイル0番目の映像[0:v]について、x:648,y:103の位置からw:265,h:154のサイズでクロップし、レベル4のboxblur処理をする。これをb0とする。
(3) 入力ファイル0番目の映像について、x:572,y:267の位置からw:94,h:111のサイズでクロップし、レベル4のboxblur処理をする。これをb1とする。
(4) 入力ファイル0番目の映像とb0をx:648,y:103の位置で重ねる。これをovr0とする。
(5) ovr0とb1をx:572,y:267の位置で重ねる。これをovr1とする。
(6) ovr1をマッピングし、out2.mp4として出力する。

[MacOS] ディレクトリ権限の変更によるアプリ動作不良

[M1 Mac, Big Sur 11.6.8, clang 13.0.0, FLTK 1.3.8, NO IDE]

通信プロトコルの実験を進めていく過程でなぜかホームディレクトリへの書き込みが不可になっていたため、一部アプリが動かなくなりました。

ホームディレクトリの権限を縮小した覚えは全くないのですが、以下のように読み取り可能、書き込み不可、実行可能になっていたので、chmodコマンドで権限を全て可能に戻しました。

[MacOS] Windows機とのファイル送受信 SFTPコマンド例

[M1 Mac, Big Sur 11.6.8]
[DeskMini B660, Windows11]

MacとWindows機との間でファイルのやりとりができるようにしました。

Macをサーバーとする送受信はOpenSSHクライアントがデフォルトで有効になっているため、何も設定しなくてもWindows機コマンドプロンプト(あるいはPowerShell)からSFTPコマンドで可能です。

今回の設定はWindows機がサーバー、MacがクライアントのSFTPによるファイル送受信になります。

手順は以下の通りです。

1.Windows11のオプション機能 OpenSSHサーバーを追加する。

2.”コンピューターの管理”でOpenSSHサーバーを有効にする。

`3.コマンドプロンプトにhostnameを入力してホスト名を確認する。

4.MacのターミナルからWindows機にアクセスする。

sftp ホスト名.local

5.getコマンド、putコマンドでファイルをコピーする。

# Windows11のホームにあるtest.txtをMacのdirへコピーする。
get test.txt [to mac dir]

# Windows11のホームにあるtestディレクトリをMacのホームへコピーする。
get -r test

# Windows11のホームにあるtestディレクトリ内のファイル全てをMacのdirへコピーする。
get -r test [to mac dir]

# Macのホームにあるtest2.txtをWindows11のdirへコピーする。
put test2.txt [to win dir]

[MacOS] Mac間のファイル転送 SFTP

[M1 Mac, Big Sur 11.6.8]

ローカル環境のMac間でファイルをコピーする時は、iCloudやFinderのSMB接続を使っていましたが、iCloudは同期が異様に遅い、SMB接続はトラブルが多いため、結局USBストレージでコピーファイルを移すことが多かったです。

最近、通信プロトコルを学習していて、SFTPコマンドを使えば簡単にファイル転送できることを知りました。SFTPはFTPのセキュリティ強化版です。なおAirDropはWi-Fi接続が必須なので今回は除外しています。

これまでGUIでSMBプロトコルを使うとトラブルに見舞われることが多かったので、これを機会にSFTPへシフトするつもりです。

これで大分作業効率がアップしそうです。Macユーザーでどれくらいの方がSFTPを使っているか知りたいです。

次はWindows機との効率的なファイル送受信を検討します。

SMBのトラブル例(他にログインがなくてもこうなる)
SFTPによるファイル転送(ディレクトリ転送も可能)

[AppleScript] 02 アルファベット入力からローマ字変換 スクリプト案

かなり時間が掛かりましたが、土台が出来上がりました。

以下のスクリプトではクリップボードのアルファベットをひらがなに変換するだけです。

操作中のアプリで文字を全選択してひらがな変換し、アプリに貼り付けるという動作はまだできません。

いつになるかわかりませんが、完成すればAutomatorに登録してショートカットを割り当てる予定です。

それにしてもAppleScriptの情報の少なさには困り果てました。ネット検索する限りでは日本語ユーザーの有識者は2人位しかいらっしゃいません。on – endが関数の設定と分かるまでは全く前に進みませんでした。

use AppleScript version "2.5" --  (10.12) or later
use framework "Foundation"
use scripting additions

property NSString : a reference to current application's NSString
property NSStringTransformLatinToHiragana : a reference to current application's NSStringTransformLatinToHiragana

selectString() -- 全選択のみ可

set latin to the clipboard

set hiragana to alphabetToHiragana(latin)

set the clipboard to hiragana

pasteString() -- 今のところ機能せず

on selectString()
    tell current application
        activate
        tell application "System Events"
            keystroke "ac" using command down
        end tell
    end tell
end selectString

on pasteString()
    tell current application
        activate
        tell application "System Events"
            keystroke "v" using command down
        end tell
    end tell
end pasteString

on alphabetToHiragana(aStr)
	set aString to NSString's stringWithString:aStr
	return (aString's stringByApplyingTransform:(NSStringTransformLatinToHiragana) |reverse|:false) as string
end alphabetToHiragana

参考サイト