PSM I の取得するのにやったことメモ
非公認でスクラムマスターをしてしまっていたので、資格をとっておきました。 「kumak1はスクラムを知ってる」前提で色々やりとりできようになるので、大変便利。
学習
- 英語と日本語でスクラムガイドを読む
- scrum.org の模試を解く
- https://www.scrum.org/open-assessments/scrum-open
- 30問しかないので、不足感は否めない。
- 100%回答を連続でできるようにして気分をアゲとく
- 「試験方法や問題文の傾向はこんな感じね」をつかんでおく
- 私は「Google翻訳だときっついな」と感じたので DeepL 使えるようにしといた。トレーナーの方もオススメしてるし
一方で、試験を英語でしか実施していないのは前からの私の気になるポイントです。ただそれに関しては最新の自動翻訳ツールを活用すれば、9割以上解決できます。私がやっている研修の受講者と色々試した結果、DeepLが間違えなくお勧めできるツールです。
— Gregory Fontaine (@fontgregory) 2023年5月12日
- ラーニングパスを一通り見ておく
- https://www.scrum.org/resources/suggested-reading-professional-scrum-master
- 出題範囲や大事な考え方も示されてる。
- 内容自体も面白いので楽しんで読んどく
- 問題集を解く
- Ultimate Scrum Master I (PSM I) Practice Assessment - TheScrumMaster.co.uk
- scrum.org 認定。スクラムガイド2020にも対応。
- 10£ で500問あるので安い
- quizform とかで無料のモノも転がっているが、いかんせん問題数少ないし信頼性が・・
- 結局、有料のしっかりしたモノを使うのが一番の近道
- キーワードや関連性を図でまとめとく
- 私は文章の羅列を読んでいると目が滑って記憶定着に時間がかかるので、学習の際はよく図を描く
- 関連性、input output、責任者 など、依存関係を位置や色などで表現できればOK
資格取得の対策としては上記。 普段から会社でスクラムを実践したり、過去に本を何冊も読む・・という下積みはしていた
試験当日
英語の問題(翻訳ツールを使うが)を80問 60分で解かなきゃならない。 選択式とはいえ「疲れるだろうな、途中で集中力切れそうだな」と思ったので対策しよう。
やることは単純
- 30分睡眠
- シャワー浴びて血圧を上げる
- https://www.scrum.org/open-assessments/scrum-open を10分くらいでピッと解いて脳を切り替えておく
試験の 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ファイルを追加します。
- https://github.com/kumak1/webgl-build-exam/blob/main/.github/workflows/activation.yml
- https://github.com/kumak1/webgl-build-exam/blob/main/.github/workflows/deploy.yml
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 拡張機能をつくった
作ったもの
動機
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 で利用できるようにした。
現在、世界中の人々が学習モデルを作っては公開されていて、ものすごい勢いだ。 が、ものづくりする人間の端くれとしては、自分に都合が良いアウトプットをする道具にしなきゃならない。 ので、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 config
で mps
を指定しているのだけど、アプリケーションの挙動は 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 を用いた開発をする際、なにかと参照するやつ。
FixedUpdate
の more than once per frame
を初めてみた and 理解した時は「だから複数回呼ばれて変な挙動を・・ちゃんとマニュアルよも」と思ったのでした。
(余談だけど ベクトル演算を理解する もよくカンペとして一緒に開いてた。便利ページですよね)
Component の順序
Unity で自作した Component は、特に指定しない限りは順不同で実行される。
プロジェクトの Script Execution Order
に各クラスの実行順を指定すると色々できるようだが・・数あると破綻しそう
Hierarchy の順序
Hierarchy に配置されてるどの GameObject から、Component が実行されていくのかも決まっていない。 (動的に生成しまくるし、いちいち順番管理できないのは、それはそう)
どうしても重要な場合はシングルトンからGameObjectの取得・都合よくソート・キックしてまわるようにしよう。
併せて読みたい
UniTask を利用している場合
UniTask を用いた際のイベント実行順序(UniTaskが差し込んだ箇所)についてわかりやすく解説されています。
kumak1はどんなことに利用した?
- JobSystem を利用したマルチスレッド実装する際、どのタイミングでキューを発行して、どのタイミングまで待てるのか、を判断できるようになった。
- 自作の物理演算の更新を、適切なタイミングに配置できた
- Animator Component の Update でアニメーション適用した後・・など(1フレームずれてめり込まないように)
- Animator だけでなく、物理演算の挙動も含めた形でリミテッドアニメを実装するのに役に立った
- Bone の Quaternion は全て演算するが、画面レンダリング直前でキーフレームの Quaternion に差し替えて実現
理解を深めて、やりたいことをやれるようにしよう