見出し画像

絵柄を学習してみるテスト

こんにちは。
暑さも相まって全く外に出たくないれれみーみです。

本来はAIけっとの反省文後編を書く想定でしたが、Model関連で界隈が揺れた件で、今のSD1.5系MergeModelを捨てようと思い立ち、SD2系のmodelを作ろうと思ったのです。
いにしえの昔にmodelをいちから作ろうとへっぽこPCで調べながらやって、大量のゴミを作った過去がありますが、そこからは他の方が作ってくれている品質の高いmodelを階層マージなどしておりましたが、今回の件で既存の1.5系を使ってると魔女狩りに合う危機感もありまして、ならいっそ2系で作ればいいかなと思いました。

SDXLが控えてるので今後どうなるかは分かりませんが、以降するならするで事前練習になればいいかなと。

最初はLoraとかhypernetworkで学習してmodelに焼き付ければいいかなと思ったんですが、効率が悪いのと、あんまり意図した全体の絵柄の調整が出来なかったので、EveryDream2trainerで学習することにしました。

前置きが長くなりましたが、とりあえずやったことと、ハマった所などダラダラと書いてみます。

EveryDream2trainerを使ってみる

使ったのは下記のツール。
EveryDream2trainer
英語でしたが、ドキュメントを翻訳しながらでもなんとかなりました。

pythonの構築やCUDAなどはそもそもwebUIを動かしてるなら元々入ってると思うので省略。

まずEveryDream2trainerのリポジトリをD直下にGitで落としました。
落としてきたら、EveryDream2trainerのディレクトリが出来て、windows_setup.cmdってのがあるので実行。
なんかよくわかんないけどガリガリやってる。中身見たらCUDAの設定やらpytorchの設定やら色々やってる模様。

ちょっと時間かかりましたが終わったので、そのまま次にactivate_venv.batを起動しようとしたら、なんか起動しない…。
???
中身みたらvenvの中にあるactivate.batを起動してるみたいなので、直接それを起動しにいくも反応なし。
詰んだぞなんだこれ…。

と思ったらパワーシェルじゃなくてコマンドプロンプトから起動したらいけた。パワーシェルがちょいちょい悪さするって記事をどっかで読んだことあったけど、今まで別に問題なく使えてたのでそのまま使ってたのが悪かったか・・・。

とりあえずvenvが起動したので一安心。

DocのBASEMODELS.mdに進んでmodelを用意する。
2系の学習をするので、SD2.1 768を落として、EveryDream2trainerのディレクトリに置いたら、venv起動してるcmdで2系用のおまじないを貼る。

python utils/convert_original_stable_diffusion_to_diffusers.py --scheduler_type ddim ^
--original_config_file v2-inference-v.yaml ^
--image_size 768 ^
--checkpoint_path v2-1_768-nonema-pruned.ckpt ^
--prediction_type v_prediction ^
--upcast_attn True ^
--dump_path "ckpt_cache/v2-1_768-nonema-pruned"

ガリガリなんか動いて、サンプルにあるように階層が出来たので、準備が一応できたっぽい。

最初は100枚未満で学習しろよ!って書いてあったので、大人しく135枚の画像でやってみる(なぜオーバーするのか)
注意するのが画像のサイズはなんでもいいみたいだけど、アス比が4:1 ~ 1:4に制限されてるみたいなので、思いっきり横長、縦長の画像は使えないみたい。(そんな画像あんまりないだろうから特に問題ないだろうけど)

一応今まで使っていたモデルの絵は気に入っているので、ある程度寄せたいと思い、1024x1024の画像を150枚くらい書き出して、破綻があるものをある程度排除して135枚になった。これを学習させてみる。

キャプションをどうやってつけるかの説明のところでめちゃくちゃFFⅦの話してて笑った。

画像毎のキャプションは、ファイル名で指定するのがいいらしい。
しかし、れれみーみは書き出した画像には連番とSeed値しかいれていなかった(終わった

めんどくせーからそのままでいいやの精神。今後やるときはpromptをファイル名に乗せる設定をWebUI上でやるのがいいかも。(いちいち設定するの面倒だけど)
ただ、これは元々認識していないものを学習させるためのものだと思うので、絵柄の学習だけであればいらないかも。(例えばカエルの騎士!っていうのを出すのはSDだと少し工夫が必要なんだけど、カエル騎士の画像を沢山用意して、キャプションにguenとか入れとけばすっと出てくるようになるかもしれない)
Loraとか入れると訳わからんくなると思うのでやるとしたら生のpromptだけにしたほうがよさそ

で、用意した画像はどこに置けば??

微妙にこのドキュメントが不親切というか、初心者向けじゃないというか、んなもんわかるだろ!っていう感じで書かれている気がする。

画像をどこに配置すればいいか分からなかったので、実行する時の設定かなんかに書いてあるだろうと思ったら、それっぽいのがあった。

train.jsonをテキストで開いたら、
"data_root": "X:\my_project_data\project_abc",
と書いてあったので、ここで学習するフォルダを指定するっぽい。
適当にフォルダ作って画像突っ込んで、jsonに記述した
"data_root": "D:¥study_test¥test_file",

で、設定が他にもあるっぽい。Loraとか作る時にはよく目にした設定値が並んでる。
適当にいじってtrain.pyを実行してみた。

はい、エラー出た

tritonってmoduleがないって怒られてる。
ちょっとググったら、このエラー自体はWindowsでは出るから無視していいよって書いてあった。
ん、じゃあなんで動かないの?よく見たら、その下に問題のログが出てた。
train.jsonを読みこんだ際に「jsonがうまく読めねーぞ」ってキレてるみたい。

そういえばjsonって¥使えないんだったね。ごめんて。
"data_root": "D:/study_test/2test_file",
こうしたら、解消された。

と思ったら速攻止まった。

良くみるout of memory errorだね。
デフォルトのbatch size が10になってたので、5にしてみる。

うごいた!
大体30分くらいで終わった。
jsonはこんな感じ

{
  "batch_size": 5,
  "ckpt_every_n_minutes": null,
  "clip_grad_norm": null,
  "clip_skip": 2,
  "cond_dropout": 0.04,
  "data_root": "D:/study_test/2test_file",
  "disable_amp": false,
  "disable_textenc_training": false,
  "disable_xformers": false,
  "flip_p": 0.0,
  "gpuid": 0,
  "gradient_checkpointing": true,
  "grad_accum": 1,
  "logdir": "logs",
  "log_step": 25,
  "lowvram": false,
  "lr": 1.5e-06,
  "lr_decay_steps": 0,
  "lr_scheduler": "constant",
  "lr_warmup_steps": null,
  "max_epochs": 30,
  "notebook": false,
  "optimizer_config": "optimizer.json",
  "project_name": "model_test",
  "resolution": 1024,
  "resume_ckpt": "v2-1_768-nonema-pruned",
  "run_name": null,
  "sample_prompts": "sample_prompts.txt",
  "sample_steps": 100,
  "save_ckpt_dir": null,
  "save_ckpts_from_n_epochs": 0,
  "save_every_n_epochs": 20,
  "save_optimizer": false,
  "scale_lr": false,
  "seed": 555,
  "shuffle_tags": false,
  "validation_config": "validation_default.json",
  "wandb": false,
  "write_schedule": false,
  "rated_dataset": false,
  "rated_dataset_target_dropout_percent": 50,
  "zero_frequency_noise_ratio": 0.02
}

じゃあ早速モデルの出力を確認してみようか。

モデルはどこにあるかなぁと思ったら、あろうことかEveryDream2trainerのディレクトリ直下にいた。しかも2つ。
なんで2つあるのかと思ったら、jsonの中で記述してる
"save_every_n_epochs": 20,が原因っぽい。
Loraとかは途中でファイル書き出されてもそこまで気にならなかったけど、モデルってなると1ファイル2.5GBあるので、ちょっと気にしなきゃいけないかも。
MAXが30epochsだったので、20epochの時に一回書き出されてたんだね。なるほど。

僕はSD本体はCドラで動かしていて、出力系とか学習はDドラに吐き出していて容量の分散をしているのですが、モデルコピーするだけで割と時間かかる。

結果を見る

変化を見たいので、まずこのほぼ無学習の元になってる
v2-1_768-nonema-pruned で
「1 cute girl 」で試してみる。

こわっ・・・

んでは、Seedとprompt同じで作成完了したモデル

ぐっちゃぐちゃww

ただ、確実にアニメっぽいイラスト絵柄にはなってるので、学習を続ければしっかりしてくれると願って、学習を続けています。

めちゃ時間かかる。
Jsonの中身の数値を色々細かくいじっていかなきゃいけないんだと思うので、少しづつ検証しているなうです。
今までモデルを作ってた人達はすごいねっ!!

れれみーみでした。


この記事が気に入ったらサポートをしてみませんか?