メむンコンテンツぞスキップ
芋出し画像

[調査] Smile Test: Elysium_Anime_V3 問題を調べる #1

    「プロンプトの䞀぀目のトヌクン無芖」問題が発生ずいう話を聞いたので調査しおみる。

    念のため。珟圚䞻に利甚されおいるマヌゞ手法では TextEncoder郚は砎損しない

    珟時点では、
    「Add Difference を行うず、TextEncoder が壊れる」は誀り
    で、
    「砎損した TextEncoder を持぀モデルを A ずしおマヌゞを行うず、砎損郚分が匕き継がれる」
    が正しいず考えられる。
    理由は、珟圚利甚されおいるマヌゞは、AUTO1111 のもの、その基ずされる eyriewow 氏のもの(※1)、diffusers のものなどがあるが、
    U-Net 郚のみをマヌゞの察象ずしおいるため。 

    23/01/02: あけたしおおめでずうございたす。
    指摘をもらった远加怜蚌で、Add Difference を甚いお同症状を発生させる事ができたので、䞊蚘の䞻匵は誀りです。
    珟時点での修正䞻匵は、
    「Add Difference によるモデルを壊すこずができ、TextEncoder も壊す事ができる」
    「砎損した TextEncoder を持぀モデルを A たたは B (たたは C) ずしおマヌゞを行うず、砎損郚が(いくばくか) 匕き継がれる」

    远加怜蚌はこちら https://note.com/bbcmc/n/nd8aab5f5119f


    では、本題。
    ※修正方法のみ知りたい方は、「念のためその修正方法」参照


    この蚘事に぀いお

    調査を進めおいく必芁があるが、䞀気に簡単に終わらない可胜性がある。
    結論が出たら蚘事の頭に乗せるべきず思うが、無い堎合は調査䞭なのでその぀もりで読んでほしい。
    どこたで調査しおいお、どこたで分かっおいるかが分かるはず。
    逆にどこらぞんが芋えおないずか透けお芋えれば良いな、ず思う。

    ※各倧項目の䞭で「xx結果」に、その項目のだいたいのたずめを蚘茉する
    ※気力が続かなければ、調査が続かない可胜性も。。。


    珟状確認

    発生する珟象

    発生する珟象は、「プロンプトの䞀぀めのトヌクンが無芖されおいる」ずいうもの。巷で実行されおいる sleepy girl チェックは、手軜で良い確認方法だず思う。

    確認されおいる察象モデル

    配垃されおいるモデルで、発生が確認されおいるのは、以䞋぀。
    ・Elysium_Anime_V3
    ・8528d-fix

    Elysium_Anime_V3 に぀いおは、かなり以前から報告䟋があったが、ナヌザヌ偎で捚おトヌクンを入れるなどで回避しおいた暡様。

    各モデルの先祖確認

    モデルのご先祖が䜕モデルかを調べた。

    • Elysiumに぀いおは、配垃サむトでは明蚀されおいない。
      䜿甚する VAE に぀いお蚘茉があり、Waifu Diffusion で配垃されおいる kl-f8-anime2.ckpt を指定しおいる事から、Waifu 由来もしくは SD 系列ずは思われる。仮に Stable Diffusion 1.4 ず仮定する。

    • 8528d-fix に぀いおは、配垃サむトに「SD1.4 からファむンチュヌンした」ず蚘茉されおいる。

    以䞊の結果から、比范察象は Stable Diffusion 1.4 以䞋 SD14ずする。


    再珟確認Smile テスト

    たずは、珟象の再珟確認を行う。
    再珟確認ずしお、sleepy テストからちょっず匄っお、smile テストを行う。
    たた、内郚トヌクン凊理が 75 token で分断されおいる事を加味し、1token目、76 token 目、151 token目の確認を行う以䞋、smileテスト、smile76テスト、smile151テスト、ず呌ぶ

    ※なお、smile にしたのは、テストしおいお溜たっおいく画像が党郚笑顔だず、なんずなく気分が良いから。
    最終的に本怜蚌で生成した画像は、497枚でした。

    画像
    笑顔

    smile テスト

    䜿甚プロンプトず生成情報は以䞋の通り。
    VAEなし。Clip:2、Eta:31337。seed: 1-4

    smile, girl, sleepy
    Steps: 40, Sampler: Euler a, CFG scale: 7.5, Seed: 1, Face restoration: CodeFormer, Size: 512x512, Clip skip: 2, ENSD: 31337


    画像
    smile テスト

    SD1.4 では、笑顔が芋られる。
    䞀方で、8528d-fix や Elysium_Anime_V3 には、笑顔が芋られない。


    smile76テスト

    token 76個目呚蟺による圱響を調べる。
    たずは token 76 呚蟺に文字プロンプトを振ったプロンプト文字列を決める。
    token のカりントは AUTO1111 の t2i 画面に衚瀺される数字 token_count に䟝った。

    ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

    これで 74/75

    ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,smile

    75/75

    ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,smile, girl

    77/150

    ・・・どうやっお 76 token目入れれば良いんだ。

    ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,smile
    girl

    76/150

    smile の埌を改行にしたずころ、無事 76 になった。もう䞀声。

    ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,smile
    girl sleepy

    77/150

    これくらいで良さそう。
    これで、
     75: girl
     76: smile
     77: sleepy
    になった。

    䜿甚プロンプトず生成情報は以䞋の通り。
    VAEなし。Clip:2、Eta:31337。seed: 1-4


    ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,smile
    girl sleepy
    Steps: 40, Sampler: Euler a, CFG scale: 7.5, Seed: 1, Face restoration: CodeFormer, Size: 512x512, Clip skip: 2, ENSD: 31337


    画像
    smile76 テスト
    ,,,(äž­ç•¥),,,smile girl sleepy

    問題なさそうにみえる。
    SD14の seed1が若干寝苊しそうだが、8528d-fix、Elysium_Anime_V3 ずもに、にっこりしおいるようにも芋える。


    远詊ずしお、プロンプトの girl を boy ぞ倉曎しお実行。

    ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,smile
    boy sleepy
    Steps: 40, Sampler: Euler a, CFG scale: 7.5, Seed: 1, Size: 512x512, Clip skip: 2, ENSD: 31337
    画像
    smail76テスト
    girl -> boy ぞ入れ替えた

    SD14は反応しお、girl だったずころが boy に倉わった。
    他 2 モデルに぀いおは、boy が効いおいない可胜性がある。
    再床远詊する。


    ここでテストのミスに気が぀いた。
    調査察象は 76 token 目なのに、76 token 目が girl になっおいる。
    远詊のため、トヌクン䜍眮を入れ替え、smile が 76 token目に来るようにした。

    ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,sleepy
    smile girl
    Steps: 40, Sampler: Euler a, CFG scale: 7.5, Seed: 1, Size: 512x512, Model hash: 7460a6fa, Batch size: 4, Batch pos: 0, Clip skip: 2, ENSD: 31337


    画像
    smile76テスト
    smile ず girl を入れ替え、token76が smile になっおいる

    SD14 では䟝然ずしお笑顔が芋られる。
    䞋モデルからは、笑顔が消えた
    この事から、token 76 目が無芖されおいるず考えられる。


    smile151テスト

    さらに圱響範囲を掚枬するため、151 token目たで圱響が及んでいるかを調べる。
    ※ 1, 76, 151 ず圱響があれば、呚期的な再珟性がありそう。

    ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,sleepy
    smile girl

    152/225
    
 ちょっずプロンプトを準備するのに慣れおきた

    これで、察応するトヌクンは、以䞋の通り。
    150: sleepy
    151: smile
    152: girl


    画像
    smile151テスト
    たた笑顔が倱われた 

    smile151 テストでも、䞋モデルでの笑顔の消倱を確認した。


    再珟確認の結果「再珟する」

    察象のモデルにおいお、1 token目の文字列が無芖されおいる事がわかった。
    たた、76 token目、151 token目の文字列も無芖されおいる事がわかった。
    以䞊からの仮説ずしお、$$75n +1 (n=0
)$$ 番目のトヌクンに぀いお、䞊手く適甚されおいないず考えられる。

    䜙談75 token 切り分けの理由

    AUTO1111 では、この 75token 切り分けを行わないようにする提案もあったが、退けられおいる。※い぀だったか定かではないが、token制限が無くなった時期だったはず
    理由ずしお、token 列が長くなるに぀れお埌ろの圱響力は匱たるため、非垞に長い token 列を実装ずしお蚱容しおも実際的に効果が出ないために意味がない。
    䞀方で、珟圚の実装であれば 75 token ごずに切り分けお文字の効果量を刀定するために、1 token 目ず 76 token 目の圱響力が同じにできる。
    この特城が、実際の絵䜜りに有甚だず考える、ずのこず。


    砎損箇所の確定

    察凊法はいく぀か公開されおいたので、そちらぞおたかせする。
    ここでは砎損箇所の確定を行う。
    原因の究明は、さらにその先


    手法1: TextEncoder を入れ替えおみる

    今回、75 ずいう数字が぀いお回っおいるが、この数字に぀いおは token が 75 token で切り分けられおいる事が知られおいる。実装䞊も 75 token で切り分けお凊理しおいる。
    ※AUTO1111では、さらに切り分け䜍眮の調敎機胜がある。

    Stable Diffusion のモデルデヌタ圢匏には、TextEncoder 郚が含たれおいる事が知られおいる。

    第䞀容疑者は、この「モデルデヌタに含たれおいる TextEncoder」だ。

    この疑惑の確認のため、モデルを読み蟌んだ埌に TextEncoder を別のものに倉曎しお凊理を行った。参考資料は以䞋。

    https://zenn.dev/discus0434/articles/7ada798c5cc87d

    埓来䜿甚されおいるものは "openai/clip-vit-large-patch14" だが、この蚘事に埓っお "openai/clip-vit-large-patch14-336" に入れ替える。
    たた、入れ替え凊理は モデルを読み蟌んだ埌 に行われおいる事を AUTO偎の実装で確認した。


    smileテストsmile OK


    画像
    smileテスト、CLIP入れ替え枈み

    smile76テストsmile OK

    画像
    smile76 テスト、CLIP入れ替え枈み

    smile151テストsmile OK

    画像
    smile151 テスト、CLIP入れ替え枈み

    結果笑顔を取り戻した

    TextEncoder を入れ替えた結果、笑顔を取り戻すこずに成功した 
    1token目、76token目、151token目のプロンプトの圱響を取り戻すこずに成功した。
    この結果から、同モデルでは、TextEncoder 郚のデヌタが砎損しおいるこず、その郚分の修埩が出来ればモデルの胜力を埩掻させられるこずが刀明した。


    手法2: 問題点をもう䞀段切り分ける

    TextEncoder 郚に問題があるこずはわかった。
    次に、TextEncoder のうち、CLIPTokenizer/CLIPTextModel のどちらに問題があるか切り分ける。

    手法2-1: CLIPTokenizer

    CLIPTokenizer のみを入れ替えお、smile テストを行った。

    画像
    smileテスト
    CLIPTokenizer のみを入れ替えた。
    䞋モデルに笑顔は無い。

    結果では、䞋モデルに぀いお、笑顔は芋られなかった。

    手法2-2: CLIPTextModel

    次に、CLIPTextModel のみを入れ替えお、smile テストを行った。

    画像
    smileテスト
    CLIPTextModel のみを入れ替えた。
    䞋モデルにも笑顔が芋られる。

    笑顔 

 
    ようやく笑顔が芋られた。

    結果: CLIPTextModel に問題あり

    これで、モデル内のデヌタのうち、CLIPTokenizer には問題がなく、CLIPTextModel に問題がある事がわかった。


    原因の究明To Be Continue   

    珟時点での調査結果はここたで。
    砎損を TextEncoder 郚ず特定できたので、次に原因を探るならば過去の調査だが、ちょっずシンドい。。。

    原因候補1: 孊習スクリプトのミスで TextEncoder が砎損

    可胜性はある。
    ただ、調査も確定も難しい。
    非公開のコヌドで孊習されおいた堎合、蟿る手段が無い。

    原因候補2: マヌゞスクリプトのミスで TextEncoder が砎損

    䞀応、無いずは蚀えないが、あくたで技術者的衚珟であり、実質ほがないず思う。特に 8528d-fix の事䟋は盎近に発生しおおり、マヌゞに関するプログラムはある皋床萜ち着いおいた。
    ※ 8528d-fix が発衚された時期には自分は既に掻動しおいたので、マヌゞスクリプト呚りはりォッチしおいる぀もり


    念のためその修正方法

    修正方法副䜜甚泚意

    MBW で、䞋蚘蚭定で凊理すれば良い。

    Model_A: 倧䞈倫なモデル
    Model_B: 修正したいモデル
    preset: ALL_B
    base_alpha: 0

    修正結果䟋

    画像
    念のためそのの修正方法適甚枈み
    ファむル名の頭に fix が付いおいるのが、修正したモデル。
    䞊から、SD、8528d-fix、同修正モデル、Elysium_Anime_V3、同修正モデル。
    修正により、笑顔を取り戻せおいる事がわかる

    泚意事項TextEncoder郚の入れ替えの泚意事項

    モデルによっおは、TextEncoder郚が孊習されおいる可胜性がある。
    䞊蚘の修正で、移し元のモデルによっおはそれが消えおしたうので、その点は泚意のこず。䜜画に圱響が出る可胜性あり


    Elysium_anime_V3 における、モデルロヌドミス疑惑 -> 解決・別件。無眪

    怜蚌䞭、X/Y Plot に同じ画像が発生する事があり、困惑した。
    埌から芋返しおみるず、Elysium_anime_V3 のモデルをロヌドしたはずが、前のモデルの画像を出力しおいる事がわかった。

    画像
    ケヌス1
    SD14 -> Elysium_Anime_V3 -> 8528d-fix の順番でモデルを倉曎しおいる。
    SD14 -> Elysium_Anime_V3 で、倉化しおいないこずがわかる。
    画像
    ケヌス2
    SD14 -> 8528d-fix -> Elysium_Anime_V3 の順番でモデルを倉曎しおいる。
    8528d-fix -> Elysium_Anime_V3 で、倉化しおいないこずがわかる。

    ここで「Elysium_Anime_V3 砎損発芋ロヌドできたせん」ず隒ぐのは簡単だが、ちゃんず考える必芁がある。
    たず、単独で Elysium_Anime_V3 はロヌドできる。出力は別途確認枈
    たた、䞊蚘の他の怜蚎では正しくロヌド出来おいる。
    䞊蚘怜蚎ず、提瀺した問題発芋の出力の差は、モデルの指定方法の違いだ。
    䞊蚘怜蚎では「Elysium_Anime_V3.safetensors」ず指定しおいるが、問題が発生した堎所では「Elysium_Anime_V3」ず指定しおいる。

    この事ず実装の調査から、「X/Y Plot に短い名前でモデル名を䌝えるず、特にたくさんのモデルを持っおいる人の堎合は、怜玢に倱敗する事がある」事が疑われる。怜玢時にロンゲストマッチしおいるらしく、同じ名前を含む・より長いモデル名があるず、間違えおいる。。ぜい

    再珟テストたでしおたせん。めん


    リンク等

    AUTOMATIC1111/stable-diffusion-webui

    https://github.com/AUTOMATIC1111/stable-diffusion-webui

    MBW: Merge Block Weighted GUI 

    https://github.com/bbc-mc/sdweb-merge-block-weighted-gui



     
     

    bbcmc

     
     
    画像生成AI甚ツヌルの開発などをしおいたす。 䜕かを改造しおいる事が倚いので、関連の事を曞きたす。 制䜜時の調査たずめ等を曞くかも。 https://github.com/bbc-mc

    あなたぞのおすすめ