Closed26

SDXL調整してみたい

PlatPlat

まずは純粋に sd-scripts の LoRA (Lierla) を試してみる。

データセットはフィギュア画像 2500 枚くらい。

無料版 Colab で学習できるだろうか...

(結論: できない)

(追記: できるようになるかも twitter)

PlatPlat

sd-scripts の sdxl ブランチの差分を覗いてSDXL向けの主要な変更点とかを見てみる

https://github.com/kohya-ss/sd-scripts/compare/main...sdxl

  • sdxl_train.py が追加された。fine_tune.py の SDXL 版みたいなものだが、 DreamBooth 型のデータセットもサポートされる (要は、JSONとか用意しなくても良いっぽい)
  • sdxl_train_network.py が追加された。train_network.py の SDXL版で、LoRAとかのトレーニングができる
  • --cache_text_encoder_outputs オプションが追加。テキストエンコーダーの出力をキャッシュできるのでその分の VRAM 消費を抑えられるが、代わりにキャプションのシャッフルなどはできなくなる。(SDXL はテキストエンコーダーが2コついてるためちょっと負荷高い)
  • requirements.txt が SDXL 用に更新された

SDXL 学習のヒントが載っていたのでまとめる

  • SDXL の基本的な解像度(バケット) は 1024x1024 (デカイ)
  • ファインチューン (sdxl_train.py) ではバッチサイズ1でも 24GB の VRAM が必要で、以下のオプションが推奨
    • U-Net のみの学習
    • gradient checkpointing を有効にする
    • --cache_text_encoder_outputs でテキストエンコーダーの出力と、--cache_latents などで latents をキャッシュする
    • Adafactor オプティマイザが良いらしい。RMSprop 8bit と Adagrad 8bit も動くかもらしいが、AdamW 8bit はうまくいかないらしい。
      • こちら の情報によれば、 Prodigy は結構いい感じらしい。
  • LoRA の学習 (sdxl_train_network.py) は 12GB の VRAM が必要 (追記: RAM も相当数ないとかなり厳しい。VRAM は 16GB あれば十分。RAM は 16GB よりも多く欲しい感覚がある。)
    • --network_train_unet_only が強く推奨される。(前述したように SDXL はテキストエンコーダーが2つついててめんどうなので)
    • PyTorch v2 をつかうと v1 よりも VRAM 消費が少ないらしい

Adafactor でのハイパーパラメーター例

optimizer_type = "adafactor"
optimizer_args = [ "scale_parameter=False", "relative_step=False", "warmup_init=False" ]
lr_scheduler = "constant_with_warmup"
lr_warmup_steps = 100
learning_rate = 4e-7 # SDXL original learning rate
PlatPlat

何回か試していって、出力や設定などを載せていく(予定)

PlatPlat

画像なくてさみしいので、これは学習前 SDXL 0.8 base の喫煙ミクさん

prompts
positive: high quality production photography of a nendoroid of hatsune miku wearing sunglasses smoking
negative: worst quality, blurry, low poly, horror, cartoon, nostrils, bad anatomy, watercolor, marker, retro, ukiyo-e, disney, pixar, 1990s, 2000s
PlatPlat

普通に Google Colab (無料T4) で進めていたところ、以下のエラーに遭遇した

!python ./sdxl_train_network.py --config_file "/content/config.toml"

を実行すると

cannot import name 'builder' from 'google.protobuf.internal' 

らしい。

Google Colab使っているとたまに見かけるバグな気がするが、たしか Tensorflow をぶったたくと治った記憶がある。

%pip uninstall tensorflow protobuf -y
%pip install tensorflow

を実行したところ治った。

PlatPlat

diffusers 形式で sdxl のレポを指定したら、現状は diffusers 形式に対応していないようだ

なので、直接モデルをダウンロードして使うことにした。

PlatPlat

無料の Colab では VRAM よりも RAM が足りなくて、モデルの読み込みでクラッシュしてしまった

これを回避するためにつぎの2つのことをやってみた

  • --lowram オプションの有効化。RAM の代わりに VRAM にモデルを読み込む
    • --lowram を使うために .safetensors モデルを .ckpt に変換...

safetensors の都合で、なぜか直接 cuda にモデルを載せられないため、 ckpt 形式にする必要があるのだ

import torch
from safetensors.torch import load_file

state_dict = load_file(f"{MODEL_DIR}/sd_xl_base_0.9.safetensors")
torch.save(state_dict, f"{MODEL_DIR}/sd_xl_base_0.9.ckpt")

のようにして変換した。

が...

今度は VRAM が吹っ切れてクラッシュ...

よって、現状は無料版 Colab では学習できないという結論に...

PlatPlat

悲しいので Runpod で最低限の性能もった GPU を借りることにした。

項目 内容
GPU RTX 3090Ti (Community Cloud)
VRAM 24 GB
RAM 30GB
Container Disk 15GB
Volume Disk 50GB
Cost -$0.369/hr
テンプレ cuda118載ったオリジナルのやつ

tailscale いれてリモートから繋いで、miniconda 入れて Python 環境を整えた (これはテンプレートがやった)。

Python は 3.10 (conda create -n kohya python=3.10)、PyTorch はコピペで pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 した。

pip show torch したら 2.0.1+cu118 だった。

その後は、いろいろ入れた。

sdxl ブランチで sd-scripts を clone。

/workspace
git clone -b sdxl https://github.com/kohya-ss/sd-scripts.git 

pip

/workspace/sd-scripts
pip install xformers
pip install dadaptation prodigyopt 
pip install wandb
pip install -r ./requirements.txt # sd-scripts

諸々にログイン

/workspace
huggingface-cli login
wandb login

データセットのダウンロードは各自で。

モデルをダウンロード (地味につらい)

huggingface の自動ダウンロードは、勝手に Container Disk の方にキャッシュを作りやがるので、今回のようにケチってると全部ダウンロードしきれない。

なので以下のスクリプトでダウンロードした。

/workspace/model_dl.py
from huggingface_hub import hf_hub_download


hf_hub_download(
    repo_id="stabilityai/stable-diffusion-xl-base-0.9",
    repo_type="model",
    filename="sd_xl_base_0.9.safetensors",
    revision="main",
    local_dir="./models/sdxl_base_09.safetensors",
    cache_dir="/workspace/cache",
    local_dir_use_symlinks=False,
)

/workspace でキャッシュするように指定する (/workspace が Volume 領域) と、ちゃんとダウンロードできる。また、トークンとかは事前に huggingface-cli login してればおk。

一応 accelerate config を行った。(基本的にエンターキー連打で fp16 選んだ。)

Colab とかでやるなら、代わりに以下を実行するといいと思う。(多分)

from accelerate.utils import write_basic_config

write_basic_config()

あとは学習を始めるだけ

/workspace/sd-scripts
accelerate launch --num_cpu_threads_per_process 1 ./sdxl_train_network.py --config_file "/workspace/config.toml"

か、

python ./sdxl_train_network.py --config_file "/workspace/config.toml"

で開始する。

PlatPlat

今回の学習設定は以下。

注意点として、mixed_precisionfp16 で行ったところ、 latent のキャッシュで NaN が発生してなーんとなってしまったので、bf16 を使っている。

config_file

今回は この先行研究 に従って Prodigy を使用しているが、果たしてうまくいくのかはわからない。多分結果がわかった時点で追記されていると思うのでそちらを参照。

config.toml
pretrained_model_name_or_path = "/workspace/models/sd_xl_base_0.9.safetensors"

output_dir = "/workspace/output"

# hyperparameters
lr_scheduler = "cosine"
# lr_scheduler_num_cycles = 5
lr_warmup_steps = 100
max_token_length = 150
max_train_epochs = 50
optimizer_args = ["weight_decay=0.01", "decouple=True", "use_bias_correction=True"]
optimizer_type = "prodigy"
seed = 3407

cache_latents = true
cache_latents_to_disk = true
gradient_checkpointing = true
# min_snr_gamma = 5
lowram = false
mixed_precision = "bf16"
xformers = true

# save_every_n_epochs = 1
save_every_n_steps = 1000
# save_last_n_epochs = 5
save_last_n_steps = 5

# lora
learning_rate = 1
# unet_lr = 5e-6

network_train_unet_only = true

network_alpha = 1
# network_args = ["conv_dim=8", "conv_alpha=1"]
network_dim = 8
network_module = "networks.lora"
# network_weights = ""
persistent_data_loader_workers = true
prior_loss_weight = 1.0

# XL
# cache_text_encoder_outputs = true

# logging
log_prefix = "sdxl_09_pvc_1-"
log_tracker_name = "sdxl_09_pvc_1"
log_with = "wandb"
logging_dir = "/workspace/logs"

# sample
sample_every_n_steps = 1000
# sample_every_n_epochs = 1
sample_prompts = "/workspace/sample.toml"
sample_sampler = "euler_a"

# dataset
dataset_config = "/workspace/dataset.toml"
debug_dataset = false

(ほんとうは huggingface に自動でアップするオプションつけると楽だと思うのですが、ちょっとめんどくさくてやってないです)

データセットの構造。

max_bucket_reso はデフォルトだと 1024 なので、多分余裕あるっしょ~ということで 1728 まで盛った。今回は batch_size 4 で行ったが、わりと余裕あるので解像度減らしたらもっと batch_size 増やしたり gradient_checkpointing をオフにしてもよいかもしれない。

dataset.toml
dataset.toml
[general]
caption_extension = '.txt'

enable_bucket = true
shuffle_caption = true

# caption_dropout_rate = 0.01
# caption_tag_dropout_rate = 0.6

# color_aug = true
flip_aug = true

# これは DreamBooth 方式のデータセット
[[datasets]]
batch_size = 4 
max_bucket_reso = 1728 # same as sdxl
resolution = 1024 

[[datasets.subsets]] # 640
image_dir = '/workspace/train/figma'
num_repeats = 3

[[datasets.subsets]] # 800
image_dir = '/workspace/train/nendoroid'
num_repeats = 2

[[datasets.subsets]] # 190
image_dir = '/workspace/train/spiritale'
num_repeats = 3

[[datasets.subsets]] # 750
image_dir = '/workspace/train/tokyofigure'
num_repeats = 2
sample.toml
sample.toml
[prompt]
sample_steps = 20
scale = 7

height = 768
negative_prompt = "low quality, blurry, ugly, horror, retro, 1990s, 2000s, ukiyo-e, pixar, disney"
width = 512

[[prompt.subset]]
prompt = "1girl, aqua eyes, baseball cap, blonde hair, closed mouth, earrings, green background, hat, hoop earrings, jewelry, looking at viewer, shirt, short hair, simple background, solo, upper body, yellow shirt"
seed = 12345

[[prompt.subset]]
prompt = "1girl, blue hair, cat ears, parted bangs, white dress shirt, looking at viewer, wariza, sitting"
seed = 55555

[[prompt.subset]]
prompt = "high quality production photography of a nendoroid of hatsune miku wearing sunglasses smoking"
seed = 999

学習中の GPU の状態

黄色の線がVRAM消費割合です。処理中のバケットによっては上下すると思いますが、割りと余裕あります。

(余談ですが、nvtop を使うとこういうかっこいい感じのモニタリングができるのでおすすめです)

https://github.com/Syllo/nvtop

PlatPlat

一度作成した .npz ファイルを一括削除するスクリプト。
バケットに NaN があったり、途中でとめちゃったり解像度変えたいときには一度削除してキャッシュし直すといい。

ChatGPT に聞いて3秒くらいで返ってきたコードです。

import os
import glob

# 削除したいファイルが存在するディレクトリのパスを指定します。
dir_path = './train' 

# 指定したディレクトリ内のすべての .npz ファイルのパスを取得します。
npz_files = glob.glob(os.path.join(dir_path, '*.npz'))

# 各 .npz ファイルを削除します。
for file in npz_files:
    os.remove(file)

print("All .npz files have been deleted from the directory.")

PlatPlat

学習中のサンプルが出てなくて暇なので余談

余談

今回は Runpod上のファイルを編集したりするのに code-server を利用しました。

ブラウザ経由でmほぼ VSCode の感覚でファイル編集やターミナル操作を行うことができてとてもとても便利。Jupyter Notebook だけ少し挙動が不安定なので使ってないのだが、 設定ファイルをちょっと調整したりするときにマジで便利なのでおすすめです。

Tailscale と組み合わせればパスワード認証もつけなくて大丈夫なので、超便利。どこかリモートのサーバーにアクセスするときは Tailscale 使えるようにしておくとめっちゃ楽です。

デフォルトのターミナルの見た目がちょっとかわいくないときは、starship がおすすめです。これは Windows とかにも対応しているので、お使いの PC にインストールしてもいいかも。

PlatPlat

最初の1000ステップ時のサンプル出力

1girl, aqua eyes, baseball cap, blonde hair, closed mouth, earrings, green background, hat, hoop earrings, jewelry, looking at viewer, shirt, short hair, simple background, solo, upper body, yellow shirt

微塵も黄色くなくて泣いちゃった

1girl, blue hair, cat ears, parted bangs, white dress shirt, looking at viewer, wariza, sitting

こっちは案外近い感じになっているが...

high quality production photography of a nendoroid of hatsune miku wearing sunglasses smoking

かなり上の方で挙げた画像と比べるとかなりクオリティの低いものになっているし、全然ミクじゃないし、ねんどろいどでもない。

ただ、特に何も指定してなくてもフィギュアの質感にはなってくれたので、学習不足なのか妙に過学習してしまったのか、どちらなのかはわからない...

ロスはこんな感じ

これ以降改善しているのか、まったく変化していないのか、それとも悪くなっているのかなにもわからない...

PlatPlat

AdaFactorが気になったので、こっちにして一晩放置してみた。

config.toml
# hyperparameters
learning_rate = 1e-5
lr_scheduler = "constant_with_warmup"
# lr_scheduler_num_cycles = 5
lr_warmup_steps = 100
max_token_length = 150
max_train_epochs = 50
# optimizer_args = ["weight_decay=0.01", "decouple=True", "use_bias_correction=True"]
# optimizer_type = "prodigy"
optimizer_args = ["scale_parameter=False", "relative_step=False", "warmup_init=False"]
max_grad_norm = 1.0
optimizer_type = "AdaFactor"
seed = 3407

1万ステップくらいでこのようなサンプル

ロスはわりと暴れている

ロスが一番低い 6000 あたりのサンプルはというと

なんかミクが箱になってる....

PlatPlat

ちゃんと学習できるオプティマイザ設定と学習できないらしい設定

基本的にLoRAはなんでも動くらしいです。

LoRA で動作したっぽいオプティマイザ設定例

  • AdaFactor 1e-5
optimizer_type = "AdaFactor"
learning_rate = 1e-5
lr_scheduler = "constant_with_warmup"
lr_warmup_steps = 100
max_grad_norm = 1.0
optimizer_args = [ "scale_parameter=False", "relative_step=False", "warmup_init=False",]

ソース: https://huggingface.co/Linaqruf/sdxl_lora/blob/main/hitokomoru_xl_lora_config/config_file.toml

--max_grad_norm について:

https://github.com/kohya-ss/sd-scripts/blob/c1d62383c6316a0c0efa92928384eb0873dfa3c1/library/train_util.py#L2233

デフォルトで1.0 らしいので設定しなくてもよさそう。

  • Prodigy 1
optimizer_type = "prodigy"
learning_rate = 1
lr_scheduler = "cosine"
lr_warmup_steps = 100
optimizer_args = ["weight_decay=0.01", "decouple=True", "use_bias_correction=True"]

ソース: https://civitai.com/articles/1022

なんか d_coef=$d_coef とか if($lr_warmup_steps){ とか設定されているのだがよくわからない...

  • AdamW 1e-4 (by ddPn08)
  • Lion 3e-5 (by ddPn08)
  • Lion 8bit 3e-5 (by ddPn08)

ファインチューニングで動作するらしいオプティマイザ設定例

  • AdaFactor 4e-7
optimizer_type = "AdaFactor"
learning_rate = 4e-7
lr_scheduler = "constant_with_warmup"
lr_warmup_steps = 100
max_grad_norm = 1.0
optimizer_args = [ "scale_parameter=False", "relative_step=False", "warmup_init=False",]

ソース: https://huggingface.co/Linaqruf/sdxl_finetune/blob/main/sdxl_finetune_config/config_file.toml

4e-7 という学習率自体は SDXL と同じものらしい。

ファインチューニングで動作しないらしいオプティマイザ設定例

VRAM24GBでも足りなくなるらしい

  • RMSprop 8bit
  • AdamW 8bit
  • AdamW
PlatPlat

network_dim = 8、alpha 1 で約 80MB、network_dim = 32、alpha 1 で約 320 MB の LoRA となった。

PlatPlat

ComfyUI の設定で、追加の LoRA ディレクトリを指定しても読み込んでくれなかったので以下対処法。

{ComfyUIのインストールディレクトリ}/models/lora というディレクトリがあると思うので、そこに使いたい LoRA をいれると読んでくれる。

多分バグで外部の LoRA を読み込めてない。

PlatPlat

関連して、ComfyUI のメモ

SDXL を HDD とかに置いていると、初回読み込みは数分ぐらいかかるので少しだけ注意。ログも全然出なくて不安になると思うけど、気長に待つとちゃんと読み込んでくれるので待とう。また、halfしたモデルだとだいぶ読み込みが速い気がするのでそっちつかってもいいかも。

PlatPlat

AdaFactor 1e-5 で 12k ステップ回した LoRA の出力など

https://twitter.com/p1atdev_art/status/1677842918965665792

左が LoRA なし、右が LoRA あり

positive: 1girl, solo, hatsune miku,
negative: worst quality, blurry, low poly, horror, cartoon, nostrils, bad anatomy, watercolor, marker, retro, ukiyo-e, disney, pixar, 1990s, 2000s

特にフィギュアを指定しなくてもちゃんとフィギュアになりました

喫煙ねんどろいどミク比較

もとのSDXLの方がポーズとかは自然だが、まあこれは学習してる画像の多くが直立してる商品画像なせいがあると思う

PlatPlat

AdaFactorの12kステップでは、9時間45分の学習で、だいたい$4~5かかった

PlatPlat

AdamW 1e-5 で 7000ステップほど学習してみた

config.toml
config.toml
pretrained_model_name_or_path = "/workspace/models/sd_xl_base_0.9.safetensors"

output_dir = "/workspace/output_4"

# hyperparameters
learning_rate = 1e-5
lr_scheduler = "constant_with_warmup"
lr_scheduler_num_cycles = 5
lr_warmup_steps = 100
max_token_length = 150
max_train_epochs = 50
optimizer_type = "AdamW"
seed = 3407

cache_latents = true
cache_latents_to_disk = true
gradient_checkpointing = true
# min_snr_gamma = 5
lowram = false
mixed_precision = "bf16"
xformers = true

# save_every_n_epochs = 1
save_every_n_steps = 500
# save_last_n_epochs = 5
save_last_n_steps = 2500


network_train_unet_only = true

network_alpha = 16
# network_args = ["conv_dim=8", "conv_alpha=1"]
network_dim = 64
network_module = "networks.lora"
# network_weights = ""
persistent_data_loader_workers = true
prior_loss_weight = 1.0

# XL
# cache_text_encoder_outputs = true

# logging
log_prefix = "sdxl_09_pvc_1-"
log_tracker_name = "sdxl_09_pvc_1"
log_with = "wandb"
logging_dir = "/workspace/logs"

# sample
sample_every_n_steps = 500
# sample_every_n_epochs = 1
sample_prompts = "/workspace/sample.toml"
sample_sampler = "euler_a"

# dataset
dataset_config = "/workspace/dataset.toml"
debug_dataset = false

データセットとかはほぼ同じだが、一部キャプションを修正した。

ロス

エポックの繰り返し数50回とか指定してるけど、多分普通に5回とか、多くても10回である程度学習できちゃうと思う。多く指定しても途中で止めちゃうなら cosine の意味がなくなっちゃうw

PlatPlat

学習ステップ数が違うので単純な比較ができないのだけど、左は AdamW 1e-5 7k ステップ、右は先程の AdaFactor 12k ステップのもの。

positive: 1girl, blue hair, cat ears, parted bangs, white dress shirt, looking at viewer, wariza, sitting
negative: low quality, ugly, horror, blurry, retro, ukiyo-e, bad anatomy

一番左が素のSDXL base 0.9

positive: high quality photography of a pvc figure of a girl wearing leather jacket leaning against brick wall under bridge between buildings on the street, black bob cut, upper body focus, looking at viewer, depth of field
negative: low quality, ugly, horror, blurry, retro, ukiyo-e, bad anatomy

AdamW の方がステップ数少ないが、綺麗に見える。ただ、AdamWのときは微妙にデータセットのキャプションを変更した (pvc figure をキャプションに追加した) のでそのせいもありそうだ。

なお、 このプロンプトで pvc figure を抜くと普通の実写写真になってしまう

PlatPlat

SDXLの学習中のサンプル画像が謎にクオリティ低い問題が修正されたらしい

PlatPlat

イラスト600枚くらい(かなりスタイルがバラバラ)で調整

comfig.toml
pretrained_model_name_or_path = "/workspace/models/sd_xl_base_0.9.safetensors"

output_dir = "/workspace/output_1"

# hyperparameters
lr_scheduler = "cosine"
# lr_scheduler_num_cycles = 5
lr_warmup_steps = 100
max_token_length = 225
max_train_epochs = 10
# optimizer_args = ["weight_decay=0.01", "decouple=True", "use_bias_correction=True"]
optimizer_type = "AdamW"
seed = 3407

cache_latents = true
cache_latents_to_disk = true
gradient_checkpointing = true
# min_snr_gamma = 5
lowram = false
mixed_precision = "bf16"
xformers = true

save_every_n_epochs = 1
# save_every_n_steps = 1000
save_last_n_epochs = 5
# save_last_n_steps = 5000

# lora
learning_rate = 1e-5
# unet_lr = 5e-6

network_train_unet_only = true

network_alpha = 1
network_args = ["conv_dim=8", "conv_alpha=1"]
network_dim = 8
network_module = "networks.lora"
# network_weights = ""
persistent_data_loader_workers = true
prior_loss_weight = 1.0

# XL
# cache_text_encoder_outputs = true

# logging
log_prefix = "sdxl_09_anime_stylish_1-"
log_tracker_name = "sdxl_09_anime_stylish_1"
log_with = "wandb"
logging_dir = "/workspace/logs"

# sample
# sample_every_n_steps = 1000
sample_every_n_epochs = 1
sample_prompts = "/workspace/sample_stylish.toml"
sample_sampler = "euler_a"

# dataset
dataset_config = "/workspace/dataset_stylish.toml"
debug_dataset = false

Convレイヤーも学習する C3Lier を使ってみた。

学習率は AdamW で 1e-5 の cosine、100ステップの warmup。

なにがいけないのか、2エポック目 (260ステップくらい) で右の画像のようになってしまった...

追記: 上の画像はなぜか強度6.0で適用していたの崩壊していたが、普通に強度1.0で試したら変な崩壊はしてなかった... (それでもなぜか劣化してるけど...)

PlatPlat

近い画風の画像1500枚くらいで10エポック回した

左からベース、7エポック、10エポック

設定
config
pretrained_model_name_or_path = "/workspace/models/sd_xl_base_0.9.safetensors"

output_dir = "/workspace/output_5"

# hyperparameters
lr_scheduler = "constant_with_warmup"
# lr_scheduler_num_cycles = 5
lr_warmup_steps = 100
max_token_length = 225
max_train_epochs = 10
# optimizer_args = ["weight_decay=0.01", "decouple=True", "use_bias_correction=True"]
optimizer_type = "AdamW"
max_grad_norm = 1.0
# optimizer_args = ["scale_parameter=False", "relative_step=False", "warmup_init=False"]
# optimizer_type = "AdaFactor"
seed = 3407

cache_latents = true
cache_latents_to_disk = true
gradient_checkpointing = true
# min_snr_gamma = 5
lowram = false
mixed_precision = "bf16"
xformers = true

save_every_n_epochs = 1
# save_every_n_steps = 1000
save_last_n_epochs = 5
# save_last_n_steps = 5000

# lora
learning_rate = 1e-5
# unet_lr = 5e-6

network_train_unet_only = true

network_alpha = 1
network_args = ["conv_dim=8", "conv_alpha=1"]
network_dim = 8
network_module = "networks.lora"
# network_weights = ""
persistent_data_loader_workers = true
prior_loss_weight = 1.0

# XL
# cache_text_encoder_outputs = true

# logging
log_prefix = "sdxl_09_anime_moderns_1-"
log_tracker_name = "sdxl_09_anime_moderns_1"
log_with = "wandb"
logging_dir = "/workspace/logs"

# sample
# sample_every_n_steps = 1000
sample_every_n_epochs = 1
sample_prompts = "/workspace/sample.toml"
sample_sampler = "euler_a"

# dataset
dataset_config = "/workspace/dataset.toml"
debug_dataset = false
dataset
[general]
caption_extension = '.txt'

enable_bucket = true
shuffle_caption = true

caption_dropout_rate = 0.1
# caption_tag_dropout_rate = 0.6

# color_aug = true
flip_aug = true

[[datasets]]
batch_size = 5
max_bucket_reso = 1728 # same as sdxl
resolution = 1024 

[[datasets.subsets]] # 600
image_dir = '/workspace/moderns/modern_3'
num_repeats = 1

[[datasets.subsets]] # 650
image_dir = '/workspace/moderns/modern_4'
num_repeats = 1

[[datasets.subsets]] # 130
image_dir = '/workspace/moderns/modern_5'
num_repeats = 1

sample

[prompt]
sample_steps = 20
scale = 7

height = 768
negative_prompt = "low quality, blurry, ugly, horror, retro, 1990s, 2000s, ukiyo-e, pixar, disney"
width = 640

[[prompt.subset]]
prompt = "1girl, aqua eyes, baseball cap, blonde hair, closed mouth, earrings, green background, hat, hoop earrings, jewelry, looking at viewer, shirt, short hair, simple background, solo, upper body, yellow shirt"
seed = 12345

[[prompt.subset]]
prompt = "1girl, looking at viewer"
seed = 55555

[[prompt.subset]]
prompt = "1girl, leaning forward, school uniform, looking at viewer, highres, absurdres"
seed = 999

このスクラップは5ヶ月前にクローズされました