🌱

Stable DiffusionでSeedを固定して同じ絵を生成できるのか問題を検証

2022/09/01に公開約2,400字

Stable Diffusionでseedを固定して同じ絵を生成できるのか問題

Stable Diffusionでseed値を固定すると同じ絵を生成できるのかが(私の中で)話題です。

きっかけは、以下のshi3zさんとdrikinさんの動画のラストの1,2分。

https://youtu.be/KqTUcldWt8g?t=4917

Seedを固定すると同じ絵が出ると主張するdrikinさんと、そんなことはないんじゃないかといい、その場で実践して確かめるshi3zさん。

自分も、GPUを多用するディープラーニングの演算だと、seed固定しても経験的に完全再現できないことを体感していたのと、当時調べたら「GPUでは完全再現は難しい」という情報が多かったので、seed値を固定しても、結果は再現できないものとずっと思っていました。

でも、Stable Diffusionの実験して挙動みてると、同じpromptとseed値から同じ絵が再現できていそうなんですよね。

その後も繰り広げられる、様々な意見・情報・検証結果。

https://twitter.com/karaage0703/status/1564095880315437057

https://twitter.com/shi3z/status/1564170497142947840

https://twitter.com/makaishi2/status/1564098743003410432

https://twitter.com/fladdict/status/1564165987259125760

https://blog.ch3cooh.jp/entry/2022/09/01/074137

これは調査せねばということで、Stable Diffusionの潜在空間にダイブしました。

結論

前置きが長くなりましたが、結論としては以下2点です。

  • Stable Diffusion同じpromptとseed値で同じ絵の生成が可能
  • ラッパーのdiffusersのバージョンによっては再現できない

なのでseed値固定して、再現できる人がいるのと再現出来ない人がいるのは、恐らくどちらも嘘ではないでしょう。

実験結果

実験には、私が作成したGoogle Colabで簡単にStable Diffusionが動かせるノートブックを使いました。ツールの詳細は、以下ブログ記事を参照ください。

https://karaage.hatenadiary.jp/entry/2022/08/29/073000

最新のdiffusersのバージョンだけ変えて比較実験をしました。

1つは現在の最新のcommit

!pip install git+https://github.com/huggingface/diffusers.git@472425098028edc6b5689986127a91ed5addd408

1つは、tag付けされた現在広く使われているバージョン(0.2.4)

!pip -qq install diffusers==0.2.4

同じprompt:karaage, seed:42で2枚の画像を生成した結果が以下です。

最新のソフトだと完全に再現できています。

一方、0.2.4だと全く異なる絵になっています。

GitHubでコードをおっかけてみると、基本的なseedで固定するお作法は0.2.4でも最新ソフトでもちゃんとやられているようでした。

違いとしては、0.2.4後の以下のPRでseedによる再現できる変更が入っているようです。

https://github.com/huggingface/diffusers/pull/247

あんまりよく分かっていませんが、diffusion modelが画像生成する元となる潜在空間変数が、乱数で初期化されてしまっているのを、初期化されないようにしているようです。

潜在空間変数が初期化されるということは、ひょっとしてこのPR前のソフトではseedを設定する意味ほとんどない???

まとめ

seed値に関して、気になったので検証してみました。多分合っていると思いますが、もし勘違いしていたり、追加情報あったら優しく教えてもらえると嬉しいです。当方初心者ですので。

多分、diffusers、次の0.2.5のバージョンからは、seed値で再現できるようになると思います。

そして、diffusersものすごい勢いで更新されていて、たまに最新バージョン普通に動かなかったりするので要注意です。インストールする際は、バージョンや最新版ならcommit番号をメモして置かないと、同じことをしても違う結果が出て、混乱してしまうかもしれません。

あとCUDA以外のMacやIntel CPUのケースは未検証ですのでご容赦ください。

Stable Diffusionで遊んだり、こういった検証してみたいという人は、以下リポジトリをどうぞ。

https://github.com/karaage0703/stable-diffusion-colab-tools

関連記事

https://zenn.dev/karaage0703/scraps/f84c98a8b78290

https://zenn.dev/karaage0703/articles/4901bf68536907

Discussion

ログインするとコメントできます