kumak1’s blog

kumak1のイラストや技術ログ

PSM I の取得するのにやったことメモ

非公認でスクラムマスターをしてしまっていたので、資格をとっておきました。 「kumak1はスクラムを知ってる」前提で色々やりとりできようになるので、大変便利。

学習

  • 英語と日本語でスクラムガイドを読む
  • scrum.org の模試を解く
    • https://www.scrum.org/open-assessments/scrum-open
    • 30問しかないので、不足感は否めない。
    • 100%回答を連続でできるようにして気分をアゲとく
    • 「試験方法や問題文の傾向はこんな感じね」をつかんでおく
      • 私は「Google翻訳だときっついな」と感じたので DeepL 使えるようにしといた。トレーナーの方もオススメしてるし
  • ラーニングパスを一通り見ておく
  • 問題集を解く
  • キーワードや関連性を図でまとめとく
    • 私は文章の羅列を読んでいると目が滑って記憶定着に時間がかかるので、学習の際はよく図を描く
    • 関連性、input output、責任者 など、依存関係を位置や色などで表現できればOK

資格取得の対策としては上記。 普段から会社でスクラムを実践したり、過去に本を何冊も読む・・という下積みはしていた

試験当日

英語の問題(翻訳ツールを使うが)を80問 60分で解かなきゃならない。 選択式とはいえ「疲れるだろうな、途中で集中力切れそうだな」と思ったので対策しよう。

やることは単純

試験の score は 91.3 だったので及第点かなと思います。(85/100 で合格)

次は PSM II や PSPO の学習を進めようかな

M1 MAX な mac で StableDiffusion web UI で AnimateDiff を動かした際のメモ

導入方法は コチラ を参考に。

で、M1 MAX, 32GB RAM な環境だとそのままでは動かない。 (なんやら pytorch のfloat精度が mac のMPSに対応していないっぽい)

ということで、 webui-macos-env.sh の記述を 公式wiki でオプションを確認しつつ、以下のように書き換えたら動作した。

- export COMMANDLINE_ARGS="--skip-torch-cuda-test --upcast-sampling --no-half-vae --use-cpu interrogate"
+ export COMMANDLINE_ARGS="--skip-torch-cuda-test --no-half --use-cpu interrogate"

なお、そんなに生成は速くないので、どんなものかとりあえず見てみたい人向けでしかない。

GitHub ActionsでUnityのWebGL Buildをしてレンタルサーバーに自動デプロイもしちゃう

VKet にロリポップレンタルサーバーが出展 してた。大変びっくり。

VR界隈がwebでコンテンツを公開するケース、真っ先に思いつくのはやっぱり、asset のサンプル置き場にしたり、ポートフォリオにすることかな〜? VKet にきてるということは VR Chat を使ってるわけだし、 Unity の出力を公開できればよいでしょう。

「とりあえず」で「無料だし」でよく使われる GitHub Pages では、 営利目的は規約違反 なのと 転送量100 GBで帯域制限 があるので用途・規模によってはキビシイ。 この懸念点を解消するにはレンタルサーバーがぴったりなので、なるほどねという感じ。(なおロリポの場合 月額220円~ のライトプラン で転送制限なし、ストレージ200GBあるので十分っぽい)

Unity の Build ってのも結構時間かかるので、「Buildの完了を待ってサーバーに転送して公開」は人間もPCも拘束時間が長くなるため大変面倒。 GitHub Actions を使って「最初にポチっとして、あとは完了通知を待つだけ」にして楽しよう、更新のハードル下げようってのがこのpostの目的です。


作業順序

ワークフローファイルを用意しときました。(大体のユースケースをカバーできるはず・・) これを設置して設定を書けば終わり!

GitHub Actions に登録

Unity Projectのサンプル を参考に、自身のUnity Projectのリポジトリ.github/workflows に以下2ファイルを追加します。

Unity WebGL Build の設定

secrets example
UNITY_LICENSE 公式ドキュメント の手順に沿って取得した Unity_v20XX.x.ulf の内容 <?xml version="1.0" ...
UNITY_EMAIL Unity アカウントのメールアドレス xxx@gmail.com
UNITY_PASSWORD Unity アカウントのパスワード password

FTPS の設定

FTPS を用いてサーバーにデプロイする場合は、以下の variables, setrets を登録します。

variables example
DEPLOY_PROTOCOL tagをpushした際のデプロイ方法を指定します ftps
secrets example
FTPS_HOST ホスト名 hostname
FTPS_USER ユーザー名 user
FTPS_PASSWORD FTPのパスワード password
FTPS_PORT ポート 21
FTPS_DEST_PATH サーバーのアップロード先のディレクトリパス。(末尾 / の必要があるので注意) ~/html/webgl/

SFTP の設定

SFTP を用いてサーバーにデプロイする場合は、以下の variables, setrets を登録します。

variables example
DEPLOY_PROTOCOL tagをpushした際のデプロイ方法を指定します sftp
secrets example
SFTP_HOST ホスト名 hostname
SFTP_USER ユーザー名 user
SFTP_KEY サーバーにSSHログインできる秘密鍵 -----BEGIN RSA PRIVATE KEY-----...
SFTP_PORT ポート 22
SFTP_DEST_PATH サーバーのアップロード先のディレクトリパス。(実態はrsyncで転送されるので対象ディレクトリ内を丸ごと置き換える。ホームディレクトリは避けた方が無難だろう。ここら辺の挙動を変えるには https://github.com/marketplace/actions/ftp-deploy を参照して改変しましょう) ~/html/webgl/

注意 秘密鍵issueで問題を指摘されている のだが、現状は以下のコマンドのようにPEM形式で生成したモノでないと接続できない(2023年7月現在)

ssh-keygen -m PEM -t rsa -P "" -f afile

webサーバーの設定

利用するwebサーバーによっては、そのままでは WebGL アプリが実行できないことがある。 公式ドキュメント を参考に設定ファイルを追加してあげよう。

ロリポップレンタルサーバー では、以下の記述の .htaccess ファイルを配置すればOK

<IfModule mod_mime.c>

# The following lines are required for builds without decompression fallback, compressed with gzip
RemoveType .gz
AddEncoding gzip .gz
AddType application/octet-stream .data.gz
AddType application/wasm .wasm.gz
AddType application/javascript .js.gz
AddType application/octet-stream .symbols.json.gz

# The following lines are required for builds without decompression fallback, compressed with Brotli
RemoveType .br
RemoveLanguage .br
AddEncoding br .br
AddType application/octet-stream .data.br
AddType application/wasm .wasm.br
AddType application/javascript .js.br
AddType application/octet-stream .symbols.json.br

# The following line improves loading performance for uncompressed builds
AddType application/wasm .wasm

実行方法

サンプルの https://github.com/kumak1/webgl-build-exam/blob/main/.github/workflows/deploy.yml では以下2つの方法がとれます。

tag をつける

セマンティックバージョニング( v1.0.0 など)の tag をつけて push する。

手動実行

Actions > Deploy > Run workflow で実行する。

利用した GitHub Action について


GitHub Actions を用意するのは面倒かもしれませんが、はじめだけ設定してしまえば、

  • Unity を起動する必要がない
  • Actions の実行が始まったら放置でOK
  • Actions の完了通知がメール等で届く(設定しだい)
  • サーバーの接続情報とか引っ張り出す必要ない

などなどメリットたくさん。 継続開発するものはとりあえず登録して、楽しちゃいましょう。

Dependabot alerts を手軽に確認したいので GitHub CLI 拡張機能をつくった

作ったもの

github.com

動機

Dependabot について

プロダクトをつくるとき、セキュリティ的に問題ないプログラムを書くのはもちろん、ライブラリに脆弱性が含まれていないか確認して適切にバージョンアップしていく必要がある。 GitHub を利用している人は Dependabot alert に検知を任せていると思う。大変便利。感謝が止まらない。

やりたいこと

検知した内容はブラウザ上で確認できるのだが、手元の terminal で片手間に Github CLI を叩いて情報取得できたら楽で嬉しい。

周辺情報の調査

Github CLI のマニュアル をみてもサブコマンドを見つけられなかった。 それならと、誰かが 拡張機能作ってないか確認 してみたが、「dependabot が作成したPRの一覧取得・マージ操作」ができるものはあれど、alertの一覧取得などができるものはなかった。

それもそのはず、Dependabot の api は現在公開されている apiVersion=2022-11-28 ではパブリックベータ版の機能であり、 Enterprise では 2023/03/07 にリリースされた 3.8 から API利用可能 ・・と、ここ最近整備され始めたものなのだ。

なければ自分で作るしかないね。 拡張機能とか手軽に作れるようになりたかったので、ちょうどいいし。

拡張機能の作成

参考資料

公式が 拡張機能の作成方法マニュアル を用意してくれてる。なんやかんやこれが一番わかりやすい。

どう作っていったかをかいつまんで

CLI のコマンドオプションを雑に追加したかったので、 --precompiled=go を指定bash ではなくGo で作成することにした。 また、手間を省くための配慮があってすごくよかった。特に以下2つ。

  • gh extension install . でローカル拡張機能として追加できる
  • .github/workflows/release.yml は自動生成
    • tag をつけてリモートにプッシュすればリリース完了

作成した拡張機能の便利ポイントアピール

公式のサブコマンドやよくある拡張機能と同様、カレントディレクトリのリポジトリ情報を取りたければ以下コマンドを叩くだけでよい。

gh dependabot-alerts

パッケージ管理や、alertの状態で絞り込むことも可能

gh dependabot-alerts --ecosystem npm --state open

host, owner, repo を指定すれば、カレントディレクトリがどこでも情報取得が可能 (適宜 gh alias を登録しとくと便利)

gh dependabot-alerts --hostname github.com --owner kumak1 --repo gh-dependabot-alerts

同一 host, owner なら、複数リポジトリをまとめて取得も可能

gh dependabot-alerts --hostname github.com --owner kumak1 --repo gh-dependabot-alerts --repo kcg

よかったら使ってみてください

まとめ

「こんな機能欲しい」が結構気軽に開発・公開できて便利。 初学者が Go でモノ作るとき「GitHubCLI拡張機能の公開」は良い第一目標になるやも。

M1 Mac で Kohya版LoRA の学習環境のセットアップメモ(まだセットアップできていない)

先日は stable diffusion を web ui で利用できるようにした。

kumak1.hatenablog.com

現在、世界中の人々が学習モデルを作っては公開されていて、ものすごい勢いだ。 が、ものづくりする人間の端くれとしては、自分に都合が良いアウトプットをする道具にしなきゃならない。 ので、LoRA (Low-Rank Adaptation) で学習モデルを作れるようにしよう。

昨今のデファクトスタンダードkohya-ss/sd-scripts らしい。 (こういった、皆が使うものを作れるようになりたいものです) これを web ui で操作できるようにしてくれた bmaltais/kohya_ss があるので、今回はこれを readme (windows向け) を M1 に読み替えながらセットアップしていく。

PyTorch は m1 でもピッとインストールできるが、 TensorFlow は conda から apple のライブラリ入れる必要があるので注意

# python を入れとく(python-tk@3.10が入ってると後々エラーになるのでインストールされてないことを確認しとく)
brew install python@3.10

# git clone
ghq get git@github.com:bmaltais/kohya_ss.git

# ディレクトリ移動(実際は peco で移動)
cd  ~/src/github.com/bmaltais/kohya_ss

# 仮想環境を構築しとく
python -m venv .venv
. .venv/bin/activate
pip3 install --upgrade pip

# PyTorch のインストール
pip3 install torch torchvision

# バージョン確認。>v1.12 であれば m1 gpu に対応している
% pip3 list | grep torch
torch              1.13.1
torchvision        0.14.1

# metal 対応版の TensorFlow を入れるには、condaからも色々入れる
brew install miniforge
conda install -c apple tensorflow-deps

# TensorFlow のインストール
pip3 install tensorflow-macos tensorflow-metal tensorboard

# バージョン確認
% pip3 list | grep tensor
tensorboard             2.11.2
tensorboard-data-server 0.6.1
tensorboard-plugin-wit  1.8.1
tensorflow-estimator    2.11.0
tensorflow-macos        2.11.0
tensorflow-metal        0.7.1

# diffusers の インストール
pip install diffusers

# インストール
# requirements.txt の tensorflow, tensorboard の行をコメントアウトしておく(前段でインストール済みなので)
pip install --use-pep517 --upgrade -r requirements.txt

# 実行環境に合わせた設定変更
accelerate config

設定はこんな感じで答えといた

% accelerate config
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------In which compute environment are you running?
This machine
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Which type of machine are you using?
MPS
Do you wish to optimize your script with torch dynamo?[yes/NO]:yes
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Which dynamo backend would you like to use?
inductor
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Do you wish to use FP16 or BF16 (mixed precision)?
fp16
accelerate configuration saved at /Users/kumak1/.cache/huggingface/accelerate/default_config.yaml

GUI の起動起動

python ./kohya_gui.py

エラー

:memo: ディレクトリ指定の際にエラーとなる

_tkinter あたりで Main Thread がとれんらしいのだが・・ どこを改修すればいいか皆目検討もつかん・・

2023-02-24 02:09:26.392 Python[10430:188815] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'NSWindow drag regions should only be invalidated on the Main Thread!'
*** First throw call stack:
(
    0   CoreFoundation                      0x00000001b4e14418 __exceptionPreprocess + 176
    1   libobjc.A.dylib                     0x00000001b495eea8 objc_exception_throw + 60
    2   CoreFoundation                      0x00000001b4e3d830 _CFBundleGetValueForInfoKey + 0
    3   AppKit                              0x00000001b8012bd8 -[NSWindow(NSWindow_Theme) _postWindowNeedsToResetDragMarginsUnlessPostingDisabled] + 320
    4   AppKit                              0x00000001b8001730 -[NSWindow _initContent:styleMask:backing:defer:contentView:] + 816
    5   AppKit                              0x00000001b80013f4 -[NSWindow initWithContentRect:styleMask:backing:defer:] + 48
    6   libtk8.6.dylib                      0x000000015c44cd84 TkMacOSXMakeRealWindowExist + 524
    7   libtk8.6.dylib                      0x000000015c44ca68 TkWmMapWindow + 56
    8   libtk8.6.dylib                      0x000000015c3c0270 MapFrame + 76
    9   libtcl8.6.dylib                     0x000000015c2f4b94 TclServiceIdle + 84
    10  libtcl8.6.dylib                     0x000000015c2d8ef0 Tcl_DoOneEvent + 296
    11  libtk8.6.dylib                      0x000000015c440a28 TkpInit + 720
    12  libtk8.6.dylib                      0x000000015c3b9278 Initialize + 2292
    13  _tkinter.cpython-310-darwin.so      0x000000015b7e2a98 Tcl_AppInit + 80
    14  _tkinter.cpython-310-darwin.so      0x000000015b7dca98 Tkapp_New + 592
    15  _tkinter.cpython-310-darwin.so      0x000000015b7dc448 _tkinter_create + 580
    16  Python                              0x0000000100e04d7c cfunction_vectorcall_FASTCALL + 88
    17  Python                              0x0000000100eaccf8 call_function + 128
    18  Python                              0x0000000100eaa510 _PyEval_EvalFrameDefault + 43104
    19  Python                              0x0000000100e9ea5c _PyEval_Vector + 376
    20  Python                              0x0000000100db2eac _PyObject_FastCallDictTstate + 96
    21  Python                              0x0000000100e28abc slot_tp_init + 196
    22  Python                              0x0000000100e20a8c type_call + 288
    23  Python                              0x0000000100db2c44 _PyObject_MakeTpCall + 136
    24  Python                              0x0000000100eacd88 call_function + 272
    25  Python                              0x0000000100eaa538 _PyEval_EvalFrameDefault + 43144
    26  Python                              0x0000000100e9ea5c _PyEval_Vector + 376
    27  Python                              0x0000000100ec52e4 _PyObject_VectorcallTstate.4671 + 96
    28  Python                              0x0000000100ec5198 context_run + 92
    29  Python                              0x0000000100e04ccc cfunction_vectorcall_FASTCALL_KEYWORDS + 84
    30  Python                              0x0000000100eaa6d8 _PyEval_EvalFrameDefault + 43560
    31  Python                              0x0000000100e9ea5c _PyEval_Vector + 376
    32  Python                              0x0000000100eaccf8 call_function + 128
    33  Python                              0x0000000100eaa498 _PyEval_EvalFrameDefault + 42984
    34  Python                              0x0000000100e9ea5c _PyEval_Vector + 376
    35  Python                              0x0000000100eaccf8 call_function + 128
    36  Python                              0x0000000100eaa498 _PyEval_EvalFrameDefault + 42984
    37  Python                              0x0000000100e9ea5c _PyEval_Vector + 376
    38  Python                              0x0000000100db5fb8 method_vectorcall + 388
    39  Python                              0x0000000100f6cc44 thread_run + 120
    40  Python                              0x0000000100f0ba90 pythread_wrapper + 48
    41  libsystem_pthread.dylib             0x00000001b4cba06c _pthread_start + 148
    42  libsystem_pthread.dylib             0x00000001b4cb4e2c thread_start + 8
)
libc++abi: terminating with uncaught exception of type NSException
zsh: abort      python3 ./kohya_gui.py

OK、いきなりGUIに行こうとした私が悪かった。 作者も Windows PC + NVIDIA GPU を想定したアプリだししゃーない。 CUIのミニマム構成で行こう

kohya-ss/sd-scripts で実行

サンプルとして使える画像とコードは、 作者本人のブログ からお借りする セットアップ方法は bmaltais/kohya_ss の時とほとんど変わらない。

学習のコマンド

accelerate launch --num_cpu_threads_per_process 4 train_network.py \
    --pretrained_model_name_or_path="~/Downloads/lora_train_sample_pack/model.ckpt" \
    --train_data_dir="~/Downloads/lora_train_sample_pack/train" \
    --reg_data_dir="~/Downloads/lora_train_sample_pack/reg" \
    --prior_loss_weight=1.0 --resolution 512 \
    --output_dir="~/Downloads/lora_train_sample_pack/lora_output" \
    --output_name=cjgg_frog \
    --train_batch_size=4 --learning_rate=1e-4 --max_train_epochs 4 \
    --use_8bit_adam --mixed_precision=fp16 --save_precision=fp16 \
    --seed 42 --save_model_as=safetensors --save_every_n_epochs=1 \
    --max_data_loader_n_workers=1 \
    --network_module=networks.lora --network_dim=4 \
    --training_comment="activate by usu frog"

が、エラー

prepare tokenizer
Use DreamBooth method.
prepare train images.
found directory 20_usu frog contains 15 image files
300 train images with repeating.
prepare reg images.
found directory 1_frog contains 50 image files
50 reg images.
loading image sizes.
100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 65/65 [00:00<00:00, 8185.60it/s]
prepare dataset
prepare accelerator
/Users/kumak1/src/github.com/kohya-ss/sd-scripts/.venv/lib/python3.10/site-packages/torch/cuda/amp/grad_scaler.py:118: UserWarning: torch.cuda.amp.GradScaler is enabled, but CUDA is not available.  Disabling.
  warnings.warn("torch.cuda.amp.GradScaler is enabled, but CUDA is not available.  Disabling.")
Using accelerator 0.15.0 or above.
load Diffusers pretrained models

accelerate configmps を指定しているのだけど、アプリケーションの挙動は CUDA 使おうとしている。

感想

うーん、学習をさせるなら、やっぱり利用者の多い Windows を使うのが今はまだ安牌かな・・ しかし、ずっとぶん回しても問題ない消費電力と排熱な M1 Mac はやはり魅力的なので、引き続き Mac で LoRA 学習できる方法を模索する。

また、stable-diffusion-webui はちゃんとうごいているので、これにbuilt in である hypernetwork の学習を試してみる

M1 Mac で stable diffusion webui セットアップメモ

stable-diffusion-webui を導入するぞ おおかた https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Installation-on-Apple-Silicon に従ってセットアップしていく

# stable-diffusion-webui の instalation に従っとく
brew install cmake protobuf rust python@3.10 git wget

# path を通しとく
echo 'export PATH="/opt/homebrew/opt/python@3.10/libexec/bin:$PATH"' >> ~/.zshrc

# pip も一応 最新化しとく
pip3 install --upgrade pip

# git clone
ghq get https://github.com/AUTOMATIC1111/stable-diffusion-webui

# ディレクトリ移動(実際は peco で移動)
cd ~/src/github.com/AUTOMATIC1111/stable-diffusion-webui

# model のDL 
# https://huggingface.co/models?pipeline_tag=text-to-image&sort=downloads などから好きなものを選んで導入しとく
wget https://huggingface.co/runwayml/stable-diffusion-v1-5/resolve/main/v1-5-pruned-emaonly.safetensors
mv v1-5-pruned-emaonly.safetensors models/Stable-diffusion

# webui の起動
./webui.sh

これだけで起動するので大変お手軽なものである。 あとは、好きな model を追加したり、LoRA を用いて自分でmodelを作ったりしてお好きに生成すればよい。

Unity のイベント実行順序で気をつける点などメモ

Unity で Bone を Animator からではなく C#から制御をしたい(自作物理演算などを用いて動的に)場合などは、スクリプトの実行順序に気をつける必要があるのでメモを残します。

実行順序のメモ

C#の関数の呼び出し順序

Unity を用いた開発をする際、なにかと参照するやつ。 FixedUpdatemore than once per frame を初めてみた and 理解した時は「だから複数回呼ばれて変な挙動を・・ちゃんとマニュアルよも」と思ったのでした。

docs.unity3d.com

(余談だけど ベクトル演算を理解する もよくカンペとして一緒に開いてた。便利ページですよね)

Component の順序

Unity で自作した Component は、特に指定しない限りは順不同で実行される。 プロジェクトの Script Execution Order に各クラスの実行順を指定すると色々できるようだが・・数あると破綻しそう

docs.unity3d.com

Hierarchy の順序

Hierarchy に配置されてるどの GameObject から、Component が実行されていくのかも決まっていない。 (動的に生成しまくるし、いちいち順番管理できないのは、それはそう)

どうしても重要な場合はシングルトンからGameObjectの取得・都合よくソート・キックしてまわるようにしよう。

併せて読みたい

UniTask を利用している場合

tech.cygames.co.jp

UniTask を用いた際のイベント実行順序(UniTaskが差し込んだ箇所)についてわかりやすく解説されています。

kumak1はどんなことに利用した?

  • JobSystem を利用したマルチスレッド実装する際、どのタイミングでキューを発行して、どのタイミングまで待てるのか、を判断できるようになった。
  • 自作の物理演算の更新を、適切なタイミングに配置できた
    • Animator Component の Update でアニメーション適用した後・・など(1フレームずれてめり込まないように)
  • Animator だけでなく、物理演算の挙動も含めた形でリミテッドアニメを実装するのに役に立った
    • Bone の Quaternion は全て演算するが、画面レンダリング直前でキーフレームの Quaternion に差し替えて実現

理解を深めて、やりたいことをやれるようにしよう