【LECO】教師画像無しで特定の概念を削除・強化できるLoRAを生成する新技術!【Stable Diffusion】

【重要】

理由は後述しますが、この記事の執筆時点で「LECO」の導入にはおそらく成功できていますが、LoRAの生成に関しては実現できていません。

実際にLoRAの生成まで成功されている方の記事も参考文献として紹介させていただくので、そちらの方も合わせて取り組んでみて下さい。

 

以下、「LECO」に関する記事です。

こんにちは!悠です!

 

今回は2023年6月29日に突如として現れた、「LECO(Low-rank adaptation for Erasing COncepts)」という新技術に関して見ていこうと思います。

「特定の概念を削除するためのLoRA」という、名前だけでは何をするのかちょっと想像しにくい技術なので、今私が理解している部分に関してまとめていきますね。

LoRAなのに教師(素材)画像を1枚も使わず作成が可能です!お手軽ですよね!

 

アイキャッチ画像はモデルに「blue_pencil_v10」、LoRAに「flat2」を使用しています。
スポンサーリンク
スポンサーリンク

「LECO」に関する参考文献

「LECO」の製作者様による紹介記事はこちら。

Stable Diffusion から特定の概念を忘れさせる学習を行ってみる

 

導入方法の紹介、およびLoRAの生成にまで成功されている記事はこちらです。

Today's recommend is LECO|エマノン
LECOという新しいLoRAの作成方法が出たので色々遊んでみた話。 正確にはLoRAの作成方法という括り方はよろしくないと思うけど、使用感だけで言うと「教師データの用意が必要なく、不要な影響が発生しない代わりに、学習対象モデルが知らない要素は出せないLoRA」といった感じ。 ともかく、新しい技術とVRAM 8GBで使え...
概念を改造する「LECO」学習で、細部にこだわったイラスト作成が可能に|akiraU
ちまたで話題の「LECO」を使って、女の子の見た目を調整しまくるのが楽しくて止まりません。困った。  LECOとは Stable Diffusion の新しい学習方法で、既存の概念=プロンプトの効果を変更するもの。  おもに「概念の消去(erase)」が注目されていますが、その逆の「概念を追加・増幅(enhance)」...

 

これを書いている時点で私は、導入までは成功しているっぽいですが、LoRAの生成は実現できていないので、上の3記事を参考にしつつLECOに挑戦するのがおすすめです!

ですので、これ以降の説明はあくまで参考程度に見ていただけると嬉しいです。

 

「LECO」とは?

GitHub - p1atdev/LECO: Low-rank adaptation for Erasing COncepts from diffusion models.
Low-rank adaptation for Erasing COncepts from diffusion models. - GitHub - p1atdev/LECO: Low-rank adaptation for Erasing COncepts from diffusion models.

 

「LECO」とは、教師画像無しで「モデルから特定の概念を消去・強化するLoRA」を生成する技術です。

 

たとえば、AIイラスト生成でおなじみのcowboy shotというプロンプトがありますよね。

upper bodyのようにキャラの上半身を描画させるためのプロンプトですが、これを使うとごくまれにcowboy(西部劇に出てくるカウボーイ)要素が混入することがあります。

 

これを防ぐために、「cowboy shot」という概念から「cowboy」要素を削除できるのがLECOです。

 

これを応用して、下のようなこともできるようです。

  • 1girlからworst qualitylow qualityの概念を消し、ネガティブプロンプトなしで低品質な絵を出力されないようにする。
  • 1girlからmonochromegreyscaleの概念を消し、彩度が薄い絵を出力されなくする。

 

逆にLECOでは、特定の概念を強化することも可能です。例えば、

  • 1girlwhite haircat earの概念を追加し、1girlだけで白髪猫耳美少女を生成できるようにする。
  • 1maleold manの概念を追加し、1maleだけで老人を生成できるようにする。

 

概念強化で生成したLoRAはスライダーとして使うことも出来ます。CivitaiにあるAge_Sliderのようなものですね。

1maleにold manの概念を追加したLoRAをプラス適用すれば老人が生成されますが、マイナス適用すると少年が生成されるわけです。

 

このように、これまで作るのが難しかった様々なLoRAを実現できる可能性を秘めているんですね。

 

ただ注意点として、モデルが生成できない概念を削除(強化)することはできないそうです。

つまり車の画像を生成できないモデルを使って、車の概念を強化するLoRAを生成することはできないんですね。

 

なおVRAM8GB以上が推奨されていますが、私のGTX1660Ti(VRAM6GB)でも学習「は」できました。(後述)

 

「LECO」の導入方法(仮想環境venv)

それでは早速「LECO」の環境を導入してみましょう。

 

LECO環境の構築

まずは任意の場所でコマンドプロンプトを開きます。私の場合、デスクトップ上にLECOというフォルダを作成し、その中で環境を構築しました。

cd C:\Users\name\Desktop\LECO

 

Githubのリポジトリを下記のコマンドで複製します。

git clone https://github.com/p1atdev/LECO

 

ディレクトリを移動します。

cd LECO

 

仮想環境(venv)を生成します。

python -m venv venv

 

仮想環境を有効化します。

.\venv\Scripts\activate

 

仮想環境にPyTorch(2.0.1+cu118)を導入します。

pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118

 

xformersを導入します。

pip install xformers

 

LECOを起動するのに必要な要件(モジュール)を導入します。

pip install -r requirements.txt
pip install omegaconf

 

これでLECOの環境構築は完了です。

 

設定ファイルの編集(config.yaml)

「~\LECO\examples」の中にある、config.yamlprompts.yamlを編集します。

 

まずconfig.yamlをメモ帳で開きます。

 

下記の要領で編集してください。

 

pretrained_model

prompts_file

→デフォルトの「./examples/prompts.yaml」のままでOKです。

 

name_or_path

→学習で利用するモデルのパスを入力。「¥」を使わず「/」で入力します。

例えば「C:/Users/name/Desktop/Stable_Diffusion/webui/models/Stable-diffusion/agelesnate_v11-1156-1669-8169.safetensors」のような感じです。

 

なお通常のLoRAと違い、使いたいモデルを素材に利用した方が良いらしいです。

エラーが出る場合は拡張機能「model-toolkit」を使ってジャンクデータを削除するといいそうです。

 

v2

→使用するモデルが1系ならfalse、2系ならtrueです。

 

v_pred

→モデルがv-predictionを使っていたらtrueにするらしいです、v-predictionが何かよくわからないです。デフォはtrueです。

なんとなくですが2系専用の機能のような気がするんですよね。1系はfalseの方が良いのかも?もしご存知でしたらコメント欄で教えてください!

 

参考になりそうなissueを貼っておきます。

Implement v-prediction in all schedulers · Issue #1413 · huggingface/diffusers
This would be nice to guarantee scheduler interoperability in Stable Diffusion 2. DDIM, DDPM and EulerDiscrete already support v-prediction, the following ones ...

 

network

type

→lierlaだとLoRA、c3lierだとLoConで生成されるそうです。

 

rank、alpha

→LoRAのdimalphaの要領で記入。

 

train

precision以外はとりあえずデフォのままでいいと思います。

precisionはRTX3060以上ならbfloat16、それ以下ならfloat16float32、GTX16X0は多分float32がいいはずです。

RTX2070 SUPERの場合もfloat32が良いようです。

 

save

nameの欄に指定した名前でsafetensorsファイルが出力されます。

per_stepsに設定したステップごとに保存されるはずです。

 

logging

どっちともfalse

 

other

use_xformersはtrueにしましょう。



設定ファイルの編集(prompts.yaml)

次にprompts.yamlを開いて編集していきます。

 

例えば1girlにwhite hairの概念を追加したい時を例にします。

 

targetに基本となる概念(1girl)を記入、positiveに追加したい概念(1girl, white hair)をコンマ区切りで記入します。

actionに、概念を追加したい時にはenhance、概念を削除したい時にはeraseを入力します。

 

それ以外はデフォのままでOKです。

batch sizeは1の方がいいかもしれません。

 

学習の実行

仮想環境を有効化します。

cd C:\Users\name\Desktop\LECO\LECO
.\venv\Scripts\activate

 

実行コマンドを入力します。

python ./train_lora.py --config_file "./examples/config.yaml"

 

これで学習が始まるはずです。



私がLoRAを生成できなかった理由

LECOの学習は通常のLoRA学習と比べてかなり時間がかかるようです。

私のGTX1660Tiだと、概算で500ステップの学習に5時間以上かかりそうでした。

 

おそらく1回目では完璧に成功せず何回か試行錯誤が必要でしょう。それなのに1サイクル5時間は流石に無理です。諦めました…

prompts.yamlのresolutionを384に落とすことで多少学習の速度が速くなりましたが、それでも3時間以上かかると思います。

 

ですので、VRAM6GB程度の低スペックGPUでも理論上学習はできますが、時間がかかりすぎて現実的ではないと思います。

近いうちにGPU(というかPC自体)の買い替えを検討しているので、その時に再チャレンジしてみたいですね。

もしかしたら今後の最適化で学習速度が上がるかもしれませんね!



まとめ

以上が「Stable Diffusion」で、教師画像を使うことなく「モデルから特定の概念を消去・強化するLoRA」を生成できる新技術「LECO」の紹介でした。

実際に作ることができず悔しいですが、いわゆる汎用系のLoRAを簡単に作成できる非常に便利な技術だと思うので、ハイスペックなGPUを持っている方はぜひ試してみて下さいね!

 

では、ここまで読んでいただきありがとうございました。

 

コメント

  1. やすし より:

    このサイトのやり方を見て、導入&作成はできました。3060tiで500Step、50分程度でした。ありがたいです!
    でも、完成したLoRAを適用しても何も絵柄が変わらないんですよね…どんな理由が考えられますか?作ったLoRAは”girl”を”girl, gray hair”にして、髪の色をディフォで銀色にするLoRAです。出来上がったファイルのサイズは約1.5MBでした。

    • 悠 より:

      コメントありがとうございます!3060Tiで50分…!!羨ましい!!

      本当は私も作成してさらに詳しい情報を記載したかったんですが…GPUがショボすぎる…

      まずloraの比重はどうされていますでしょうか?LECOで作ったものはどうやら比重2や3で使ったりできるようなんですよね。0.5とかにしていたりしませんでしょうか?
      他にはステップ数が不足している(1000で試してみる)、素材に使ったモデルと画像を生成するモデルを合わせる(もしやっていなければ)などが思い浮かびました。

      • やすし より:

        比重は2以上にしたことがなかったので試してみたところ、3とか4で変わりました!ただ、構図はわりと近いんですが、夜のシーンなのにLoRA適用前の画像と比べると明るいのが気になりますね…もうちょっと検証してみます。
        ありがとうございました!

  2. あじ より:

    こんばんは。先日はキャラクターLoraの作成に関するアドバイスを頂きありがとうございました。
    自分もこちらの記事を参考に学習を行ってみたのですが、いざ実際に出来上がったLoraを使うと真っ黒な画像しか生成されず困惑しております。yamlファイルの設定もこちらの記事の画像を参考に見直してみたのですが、特に問題と思える箇所も見つかりませんでした。何かアドバイスを貰えたら嬉しいです。

    • 悠 より:

      コメントありがとうございます!

      私もloraファイル自体を生成できていないのであれなのですが、

      1.素材モデルには何を使っていますか?モデルを変えて学習すると改善されるかもです。
      2.loraの比重は何にしていますか?2や3付近でしょうか?
      3.コンソールにエラーメッセージは出ていませんか?
      4.生成に使っているVAEは何でしょうか?vaeを変えると改善されませんか?
      5.gpuは何をお使いでしょうか?例えば1660tiなのにfloat16を使うと学習が上手くいかなかったりなどの相性問題もあります

      • あじ より:

        ご返信ありがとうございます。
        1.モデルは、最初の数回は自作のマージモデルを利用して学習しました。一応、Toolkitで剪定も行いました。
        その後、Anything-v4.5でも学習を行ってみましたが改善されませんでした。

        2.比重は-3~+3まで試しましたが、真っ黒な画像が生成されるだけでした。

        3.コンソール上でエラーメッセージらしきものは、「A matching Triton is not available, some optimizations will not be enabled. Error caught was: No module named ‘triton’」しか確認できないのですが、この記事で引用されているnoteの記事の中でこのエラーは無視しても良いとあったので関係ないのかもしれないです。(noteの記事では「triton」ではなく「TRION」と表記されており、これが単純に誤字であればの話ですが)

        4.VAEは、一応有名どころはすべて試しましたが効果がありませんでした。

        5.GPUは、GeForce RTX 2070 SUPERを使用しています。

        • 悠 より:

          あっ!GeForce RTX 2070 SUPER怪しいです!

          2000番台は変な挙動になることあるらしいんですよね。別の記事のコメントでもいただいたことあります。

          TrainのPrecisionをfloat32にしてもう一度学習してみていただいてもいいでしょうか?ここが怪しい気がします

          • あじ より:

            float32にして学習してきましたが、結果としてはしっかりと動作するLoraが出来上がりました。ありがとうございます。

            しかし問題として、float16の時よりも学習時間がおよそ3倍ほどになってしまいました。設定としてはPrecisionをfloat16とfloat32入れ替えた以外は、「rank:32 alpha:16, resolution:512, iterations:1000」で学習を行ったのですが、float16は約1時間でfloat32では約3時間ほどかかってしまいました。色々試したい分、学習時間が伸びてしまうのは少しネックに感じてしまいます…..。

            あと追加で質問なのですが、学習に使うモデルがv-predictionに対応してるか不明の場合でも設定はtrueのままでも良いんでしょうか?

          • 悠 より:

            おお!おめでとうございます!

            それにしても3時間はきついですね…しかしGPU性能を考えると妥当なラインな気がします。
            LECOは本当に時間がかかるのが難点なんですよね~。

            v-predictionに関しては正直私も全くわかっていないんですよね。どんなモデルがv-predictionを含んでいるのか、含んでいないモデルでtrueを使うとどうなるかも未知です。
            製作者様はSD2.1(2系)を使っていらっしゃるので、もしかすると2系専用の何かなのでは?と思わなくもないです。
            またわかり次第追記します!

          • あじ より:

            そうですね。やっぱりグラボの性能が問題ですよね…..。自分もグラボの買い替えを視野に入れたいと思います笑。

            v-predictionについては自分も全然分からないので追記していただけるとありがたいです!

            あと先ほど勉強のためLECOのGithubのページを見ていたのですがREADMEの部分に、
            「注: float16 を使用することもできますが、不安定なので推奨されません。bfloat16 または float32 を使用してください。」
            と記載があったのでもしかしたらfloat16は使わない方がいいのかもしれません。

  3. ふれんどりっち より:

    4070Tiだと作成だけなら全部デフォルトで23分、iterationsを1000にしても46分で完了しますが
    生成したら〇〇_last.safetensorsと_lastが付くのは何故なのか

    とりあえずウェービーヘアにしてみようと
    モデルをmeinameix v10
    config.yamlでnetworkのrankを32、trainのprecisionを4070Tiだからbfloat16
    prompts.yamlでtargetを1girl、positiveをwavy hair、actionをenhance、batch_sizeは2のまま
    で作ってみたのはいいけど1girl,LECOと1girl, wavy hairで結果が同じ感じだったし
    wavy hairを30 years oldに変えてみたけど変化が感じられないので
    LECO自体は失敗というかモデル選びが失敗かな
    比重が1から2や3にしても結果が一緒だったので

    あとLECOとは関係無いけどStable Diffusionのインストール時にも出てくる
    [notice] A new release of pip available: 22.2.1 -> 23.1.2
    [notice] To update, run: python.exe -m pip install –upgrade pip
    というメッセージ出すならインストール時に最新版DLして欲しいですね