主要な変更点

주된 변경점

  • 依存ライブラリが更新されました。アップグレード を参照しライブラリを更新してください。
    • 特に imagesize が新しく追加されていますので、すぐにライブラリの更新ができない場合は pip install imagesize==1.4.1 で個別にインストールしてください。
    • bitsandbytes==0.43.0、prodigyopt==1.0、lion-pytorch==0.0.6が requirements.txt に含まれるようになりました。
      • bitsandbytes が公式に Windows をサポートしたため複雑な手順が不要になりました。
    • また PyTorch のバージョンを 2.1.2 に更新しました。PyTorch はすぐに更新する必要はありません。更新時は、アップグレードの手順では PyTorch が更新されませんので、torch、torchvision、xformers を手動でインストールしてください。
  • 의존 라이브러리가 갱신되었습니다. 링크(깃 명령어 적혀있음)를 참조하여 라이브러리를 갱신해주세요
    • 특히 imagesize 가 새로 추가되었으므로, 바로 라이브러리의 갱신을 할 수 없는 경우 pip install imagesize==1.4.1 로 개별로 설치해주세요
    • bitsandbytes==0.43.0、prodigyopt==1.0、lion-pytorch==0.0.6이 requirements.txt에 포함되도록 되었습니다
      • bitsandbytes 가 공식으로 윈도우를 지원하기에 복잡한 수순이 불필요해졌습니다
    • 또 PyTorch의 버전을 2.1.2로 갱신했습니다. 파이토치는 즉시 갱신할 필요는 없습니다. 갱신시에는, 업그레이드의 수순으로는 PyTorch가 갱신안되므로, torch、torchvision、xformers를 수동으로 인스톨해주세요
  • wandb へのログ出力が有効の場合、コマンドライン全体が公開されます。そのため、コマンドラインに wandb の API キーや HuggingFace のトークンなどが含まれる場合、設定ファイル(.toml)への記載をお勧めします。問題提起していただいた bghira 氏に感謝します。
    • このような場合には学習開始時に警告が表示されます。
    • また絶対パスの指定がある場合、そのパスが公開される可能性がありますので、相対パスを指定するか設定ファイルに記載することをお勧めします。このような場合は INFO ログが表示されます。
    • 詳細は #1123 および PR #1240 をご覧ください。
  • wandb에의 로그 출력이 유효한 경우, 커맨드라인 전체가 공개됩니다. 그걸 위해, 커맨드라인에 wandb의 API키나 HuggingFace의 토큰같은게 포함되 있을 경우, 설정파일(.toml)에 기록을 추천합니다
    • 이런 경우에 학습개시시에 경고가 표시됩니다
    • 또 절대경로의 지정이 있는 경우, 그 경로가 공개될 가능성이 있으므로, 상대경로를 설정하던지 설정파일에 기록하는 것을 추천합니다. 이런 경우에 INFO로그가 표시됩니다
    • 상세는 #1123 및 PR #1240 을 봐주세요
  • Colab での動作時、ログ出力で停止してしまうようです。学習スクリプトに --console_log_simple オプションを指定し、rich のロギングを無効してお試しください。
  • Colab에서 동작시, 로그출력에서 정지되는 것 같습니다. 학습 스크립트에--console_log_simple 옵션을 설정해, rich의 로깅을 무효로 하고 시험해주세요
  • その他、マスクロス追加、Scheduled Huber Loss 追加、DeepSpeed 対応、データセット設定の改善、画像タグ付けの改善などがあります。詳細は以下をご覧ください。
  • 그 외에, 마스크로스 추가, Scheduled Huber Loss 추가、DeepSpeed 대응、데이터셋 설정의 개선, 화상태깅의 개선 등이 있습니다. 상세는 아래를 봐 주세요

学習スクリプト

학습스크립트

  • train_network.py および sdxl_train_network.py で、学習したモデルのメタデータに一部のデータセット設定が記録されるよう修正しました(caption_prefix、caption_suffix、keep_tokens_separator、secondary_separator、enable_wildcard)。
  • train_network.py 및 sdxl_train_network.py 에, 학습한 모델의 메타데이터에 일부의 데이터셋 설정이 기록되도록 수정되었습니다(caption_prefix、caption_suffix、keep_tokens_separator、secondary_separator、enable_wildcard)。   --- 이거 내가 버그같은데? 라고 한 부분임. 데이터셋으로 일괄 추가한 태깅이 기록 안되더니만 이제 수정된 모양. 근데 여전히 공구아이콘 쪽에는 카운트되지 않고 정보화면에서도 존나 난잡하게 기입되있음
  • train_network.py および sdxl_train_network.py で、state に U-Net および Text Encoder が含まれる不具合を修正しました。state の保存、読み込みが高速化され、ファイルサイズも小さくなり、また読み込み時のメモリ使用量も削減されます。
  • train_network.py 및 sdxl_train_network.py 에、state에 U-Net및 Text Encoder가 포함되는 오류를 수정했습니다. state의 보존, 불러오기가 고속화되어, 파일사이즈도 작아지고, 또 불러오기시의 메모리 사용량도 감소했습니다
  • DeepSpeed がサポートされました。PR #1101#1139 BootsofLagrangian 氏に感謝します。詳細は PR #1101 をご覧ください。
  • DeepSpeed가 지원되었습니다. PR #1101#1139  상세는 PR #1101 을 확인
  • 各学習スクリプトでマスクロスをサポートしました。PR #1207 詳細は マスクロスについて をご覧ください。
  • 각 학습 스크립트에 마스크로스를 지원하였습니다. PR #1207 상세는 マスクロスについて  --- 저 밑에 있음. 내부링크
  • 各学習スクリプトに Scheduled Huber Loss を追加しました。PR #1228 ご提案いただいた kabachuha 氏、および議論を深めてくださった cheald 氏、drhead 氏を始めとする諸氏に感謝します。詳細は当該 PR および Scheduled Huber Loss について をご覧ください。
  • 각 학습 스크립트에 Scheduled Huber Loss를 추가하였습니다. PR #1228 상세는 해당 PR 및 Scheduled Huber Loss について 
  • 各学習スクリプトに、noise offset、ip noise gammaを、それぞれ 0~指定した値の範囲で変動させるオプション --noise_offset_random_strength および --ip_noise_gamma_random_strength が追加されました。 PR #1177 KohakuBlueleaf 氏に感謝します。
  • 각 학습 스크립트에, noise offset、ip noise gamma를, 각각 0~지정한 수치 범위내에서 변동되는 옵션 --noise_offset_random_strength 및 --ip_noise_gamma_random_strength 가 추가되었습니다. PR #1177  --어디에서 많이 보던 이름이
  • 各学習スクリプトに、学習終了時に state を保存する --save_state_on_train_end オプションが追加されました。 PR #1168 gesen2egee 氏に感謝します。
  • 각 학습 스크립트에, 학습종료시에 state를 보존하는 --save_state_on_train_end 옵션이 추가되었습니다. PR #1168
  • 各学習スクリプトで --sample_every_n_epochs および --sample_every_n_steps オプションに 0 以下の数値を指定した時、警告を表示するとともにそれらを無視するよう変更しました。問題提起していただいた S-Del 氏に感謝します。
  • 각 학습 스크립트에 --sample_every_n_epochs 및 --sample_every_n_steps 옵션에 0 이하의 수치를 지정한 경우, 경고를 표시함과 동시에 그것들을 무시하도록 변경했습니다

データセット設定

데이터셋 설정

  • データセット設定の .toml ファイルが UTF-8 encoding で読み込まれるようになりました。PR #1167 Horizon1704 氏に感謝します。
  • 데이터셋 설정의 .toml 파일이 UTF-8 encoding로 읽히도록 되었습니다. PR #1167 -- 지금도 문제없던데. 일부 일본어는 저거아니면 못씀
  • データセット設定で、正則化画像のサブセットを複数指定した時、最後のサブセットの各種設定がすべてのサブセットの画像に適用される不具合が修正されました。それぞれのサブセットの設定が、それぞれの画像に正しく適用されます。PR #1205 feffy380 氏に感謝します。
  • 데이터셋 설정에서, 정규화이미지의 서브셋을 복수설정한 경우, 최후의 서브셋의 각종 설정이 전 서브셋에 적용되던 오류가 수정되었습니다. 각각의 서브셋의 설정이, 각각의 이미지에 정상적으로 적용됩니다. --- 아니시발
  • データセットのサブセット設定にいくつかの機能を追加しました。
    • シャッフルの対象とならないタグ分割識別子の指定 secondary_separator を追加しました。secondary_separator=";;;" のように指定します。secondary_separator で区切ることで、その部分はシャッフル、drop 時にまとめて扱われます。
    • enable_wildcard を追加しました。true にするとワイルドカード記法 {aaa|bbb|ccc} が使えます。また複数行キャプションも有効になります。
    • keep_tokens_separator をキャプション内に 2 つ使えるようにしました。たとえば keep_tokens_separator="|||" と指定したとき、1girl, hatsune miku, vocaloid ||| stage, mic ||| best quality, rating: general とキャプションを指定すると、二番目の ||| で分割された部分はシャッフル、drop されず末尾に残ります。
    • 既存の機能 caption_prefix と caption_suffix とあわせて使えます。caption_prefix と caption_suffix は一番最初に処理され、その後、ワイルドカード、keep_tokens_separator、シャッフルおよび drop、secondary_separator の順に処理されます。
    • 詳細は データセット設定 をご覧ください。
  • 데이터셋의 서브셋 설정에 몇가지 기능이 추가되었습니다
    • 셔플의 대상이 되지않는 태그분할식별자의 지정secondary_separator 을 추가했습니다.secondary_separator=";;;" 처럼 지정합니다.secondary_separator 로 구별되면, 그 부분은 셔플, drop시 한꺼번에 처리됩니다 -- 이건 예시를 좀 주지. 뭐 꼬라지가 long hair, green hair 를 묶어서 이 두 태그는 분리 안되도록 하는 뭐 그런건가?
      예시를 체크해봄. 임의의 글자를 secondary_separator로 정의하고 (예시에서는 ;;;) 이 글자를 쉼표대신 사용하면 이걸로 나눈건 한세트로 처리
      aa1, aa2, aa3, bb1;;;bb2;;;bb3;;;bb4, cc1, cc2, cc3, dd1, dd2, ... 이렇게 태깅하고 셔플 캡션을 하면
      dd3, cc1, cc3, aa2, bb1,bb2,bb3,bb4, aa3, dd2, aa1, cc2, ... 이런식으로 ;;;로 묶인 넘들은 안 흩어지고 하나처럼 섞임
    • enable_wildcard 를 추가했습니다.true 로 하면 와일드카드기법 {aaa|bbb|ccc} 가 사용됩니다. 또 복수행캡션도 유효하게 됩니다
    • keep_tokens_separator 를 캡션내에 2군데 사용할 수 있게 했습니다. 예를 들어 keep_tokens_separator="|||" 지정했을 때,1girl, hatsune miku, vocaloid ||| stage, mic ||| best quality, rating: general 로 캡션을 지정하면, 두번째의 ||| 에서 분단된 부분은 셔플, drop 되지않고 말미에 남습니다
    • 기존의 기능 caption_prefix 와caption_suffix 와 함께 사용가능합니다.caption_prefix 와 caption_suffix 는 가장 최초에 처리되어, 그 후, 와일드카드, keep_tokens_separator, 셔플 및 drop,secondary_separator 의 순으로 처리됩니다
    • 상세는  データセット設定 을 봐 주세요
  • DreamBooth 方式の DataSet で画像情報(サイズ、キャプション)をキャッシュする機能が追加されました。PR #1178#1206 KohakuBlueleaf 氏に感謝します。詳細は データセット設定 をご覧ください。
  • DreamBooth 방식의 DataSet 에 이미지정보 (크기, 캡션)을 캐시하는 기능이 추가되었습니다. PR #1178#1206 상세는 データセット設定
  • データセット設定の英語版ドキュメント が追加されました。PR #1175 darkstorm2150 氏に感謝します。
  • 데이터셋 설정의 英語版ドキュメント (영문설명)이 추가되었습니다

画像のタグ付け

태깅

  • tag_image_by_wd14_tagger.py で v3 のリポジトリがサポートされました(--onnx 指定時のみ有効)。 PR #1192 sdbds 氏に感謝します。
    • Onnx のバージョンアップが必要になるかもしれません。デフォルトでは Onnx はインストールされていませんので、pip install onnx==1.15.0 onnxruntime-gpu==1.17.1 等でインストール、アップデートしてください。requirements.txt のコメントもあわせてご確認ください。
  • tag_image_by_wd14_tagger.py 에 v3의 리포지토리가 지원되었습니다(--onnx 설정시에만 유효). PR #1192
    • Onnx의 버전업이 필요할지도 모르겠습니다. 디폴트로 Onnx 는 인스톨되어있지 않으므로,pip install onnx==1.15.0 onnxruntime-gpu==1.17.1 등으로 인스톨, 업데이트해 주세요.requirements.txt 의 코멘트도 함께 확인해주세요
  • tag_image_by_wd14_tagger.py で、モデルを--repo_id のサブディレクトリに保存するようにしました。これにより複数のモデルファイルがキャッシュされます。--model_dir 直下の不要なファイルは削除願います。
  • tag_image_by_wd14_tagger.py 에, 모델을--repo_id 의 서브디렉토리에 보존하도록 하였습니다. 이걸로 더욱 복수의 모델파일이 캐시됩니다.--model_dir 값 아래의 불필요한 파일은 삭제해주세요
  • tag_image_by_wd14_tagger.pyにいくつかのオプションを追加しました。
    • 一部は PR #1216 で追加されました。Disty0 氏に感謝します。
    • レーティングタグを出力する --use_rating_tags および --use_rating_tags_as_last_tag
    • キャラクタタグを最初に出力する --character_tags_first
    • キャラクタタグとシリーズを展開する --character_tag_expand
    • 常に最初に出力するタグを指定する --always_first_tags
    • タグを置換する --tag_replacement
    • 詳細は タグ付けに関するドキュメント をご覧ください。
  • tag_image_by_wd14_tagger.py에 몇가지 옵션울 추가했습니다
    • 일부는 PR #1216 에 추가되었습니다
    • 레이팅태그를 출력하는 --use_rating_tags 및 --use_rating_tags_as_last_tag
    • 캐릭터태그를 최초에 출력하는 --character_tags_first
    • 캐릭터태그랑 시리즈를 전개하는 --character_tag_expand
    • 상시 최초에 출력하는 태그를 지정하는 --always_first_tags
    • 태그를 치환하는 --tag_replacement
    • 상세는 タグ付けに関するドキュメント 
  • make_captions.py で --beam_search を指定し --num_beams に2以上の値を指定した時のエラーを修正しました。
  • make_captions.py 에 --beam_search 을 지정해 --num_beams 에 2이상의 수치를 지정했을때의 에러를 수정했습니다

マスクロスについて

各学習スクリプトでマスクロスをサポートしました。マスクロスを有効にするには --masked_loss オプションを指定してください。

機能は完全にテストされていないため、不具合があるかもしれません。その場合は Issue を立てていただけると助かります。

マスクの指定には ControlNet データセットを使用します。マスク画像は RGB 画像である必要があります。R チャンネルのピクセル値 255 がロス計算対象、0 がロス計算対象外になります。0-255 の値は、0-1 の範囲に変換されます(つまりピクセル値 128 の部分はロスの重みが半分になります)。データセットの詳細は LLLite ドキュメント をご覧ください。

마스크로스에 대해

각 학습 스크립트에 마스크로스를 지원했습니다. 마스크로스를 유효로 하기 위해 --masked_loss 옵션을 지정해주세요

기능은 완전히 테스트되지 않았으므로, 오류가 있을지도 모릅니다. 그런 경우는 Issue를 세워주시면 감사하겠습니다.

마스크의 지정에는 ControlNet 데이터셋을 사용합니다. 마스크이미지는 RGB 이미지일 필요가 있습니다. R채널의 픽셀치 255가 로스계산대상, 0가 로스계산대상외가 됩니다. 0-255의 수치는, 0-1의 범위로 변환됩니다(즉 픽셀치 128의 부분은 가중치가 절반이 됩니다). 데이터셋의 상세는 LLLite ドキュメント 

Scheduled Huber Loss について

各学習スクリプトに、学習データ中の異常値や外れ値(data corruption)への耐性を高めるための手法、Scheduled Huber Lossが導入されました。

従来のMSE(L2)損失関数では、異常値の影響を大きく受けてしまい、生成画像の品質低下を招く恐れがありました。一方、Huber損失関数は異常値の影響を抑えられますが、画像の細部再現性が損なわれがちでした。

この手法ではHuber損失関数の適用を工夫し、学習の初期段階(ノイズが大きい場合)ではHuber損失を、後期段階ではMSEを用いるようスケジューリングすることで、異常値耐性と細部再現性のバランスを取ります。

実験の結果では、この手法が純粋なHuber損失やMSEと比べ、異常値を含むデータでより高い精度を達成することが確認されています。また計算コストの増加はわずかです。

具体的には、新たに追加された引数loss_type、huber_schedule、huber_cで、損失関数の種類(Huber, smooth L1, MSE)とスケジューリング方法(exponential, constant, SNR)を選択できます。これによりデータセットに応じた最適化が可能になります。

詳細は PR #1228 をご覧ください。

  • loss_type : 損失関数の種類を指定します。huber で Huber損失、smooth_l1 で smooth L1 損失、l2 で MSE 損失を選択します。デフォルトは l2 で、従来と同様です。
  • huber_schedule : スケジューリング方法を指定します。exponential で指数関数的、constant で一定、snr で信号対雑音比に基づくスケジューリングを選択します。デフォルトは snr です。
  • huber_c : Huber損失のパラメータを指定します。デフォルトは 0.1 です。

PR 内でいくつかの比較が共有されています。この機能を試す場合、最初は --loss_type smooth_l1 --huber_schedule snr --huber_c 0.1 などで試してみるとよいかもしれません。

最近の更新情報は Release をご覧ください。

Scheduled Huber Loss 에 대해

각 학습 스크립트에, 학습데이터중의 이상수치나 어긋난 값(data corruption)에의 내성을 높이기 위한 수법, Scheduled Huber Loss가 도입되었습니다

종래의 MSE(L2)손실함수로는, 이상수치의 영항을 크게 받아버려, 생성화면의 품질저하를 일으킬 우려가 있었습니다. 한편, Huber손실함수는 이상치의 영향을 억제할 수 있지만, 와면의 세부재현성이 쉽게 손상되었습니다

이 수법에서는 Huber손실함수의 적용을 공부해, 학습의 초기단계(노이즈가 큰 경우)에는 Huber손실을、후기단계에는 MSE를 이용하도록 스케쥴링하는 것으로, 이상수치내성과 세부재현성의 밸런스를 잡습니다

실험의 결과에서는, 이 수법이 순수한 Huber손실이나 MSE와 비교해, 이상수치를 포함한 데이터에서 더욱 높은 정도를 달성하는 것이 확인되었습니다. 또 계산 코스트의 증가는 미미합니다

구체적으로는, 새롭게 추가된 인수 loss_type、huber_schedule、huber_c에, 손실함수의 종류(Huber, smooth L1, MSE)와 스케쥴링 방법(exponential, constant, SNR)을 선택가능합니다. 이것으로 더욱 데이터셋에 따른 최적화가 가능해집니다

상세는 PR #1228

  • loss_type : 손실함수의 종류를 지정합니다. huber 에 Huber손실,smooth_l1 에 smooth L1 손실,l2 에 MSE 손실을 선택합니다. 기본값은l2 로, 종래와 동일합니다
  • huber_schedule : 스케쥴링 방법을 지정합니다. exponential 에 지수함수적, constant 에 일정, snr 에 신호대잡음비에 기반한 스케쥴링을 선택합니다. 기본값은 snr 입니다
  • huber_c : Huber손실의 파라메타를 지정합니다. 기본값은 0.1 입니다

PR내에 몇가지의 비교가 공유되어 있습니다. 이 기능을 시험할 경우, 최초에 --loss_type smooth_l1 --huber_schedule snr --huber_c 0.1 등으로 시도해 보면 좋을지도 모릅니다



내가 알겠는거

데이터셋 인자에 버그가 있었음 - 써글...

마스킹학습은 컨트롤넷 이미지로 쓴다는데... 뭘 어케 하란겨. 빨간색 픽셀값으로 세팅한다니까 뽀샵에서 매직봉찍고 피칠갑하면 됨?


코햐스크립트에 맞춰서 UI 쪽도 업데이트 (23.0.15 -> 23.1.0)

근데 이거 업뎃해도 제대로 몬 쓸거 같은 불길한 기분이