Stable DiffusionでSeedを固定して同じ絵を生成できるのか問題を検証
Stable Diffusionでseedを固定して同じ絵を生成できるのか問題
Stable Diffusionでseed値を固定すると同じ絵を生成できるのかが(私の中で)話題です。
きっかけは、shi3zさんとdrikinさんの動画のラストの1,2分。
Seedを固定すると同じ絵が出ると主張するdrikinさんと、そんなことはないんじゃないかといい、その場で実践して確かめるshi3zさん。
自分も、GPUを多用するディープラーニングの演算だと、seed固定しても経験的に完全再現できないことを体感していたのと、当時調べたら「GPUでは完全再現は難しい」という情報が多かったので、seed値を固定しても、結果は再現できないものとずっと思っていました。
でも、Stable Diffusionの実験して挙動みてると、同じpromptとseed値から同じ絵が再現できていそうなんですよね。
その後も繰り広げられる、様々な意見・情報・検証結果。
これは調査せねばということで、Stable Diffusionの潜在空間にダイブしました。
結論
前置きが長くなりましたが、結論としては以下2点です。
- Stable Diffusion同じpromptとseed値で同じ絵の生成が可能
- ラッパーのdiffusersのバージョンによっては再現できない
なのでseed値固定して、再現できる人がいるのと再現出来ない人がいるのは、恐らくどちらも嘘ではないでしょう。
実験結果
実験には、私が作成したGoogle Colabで簡単にStable Diffusionが動かせるノートブックを使いました。ツールの詳細は、以下ブログ記事を参照ください。
最新の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固定による画像の再現を実現する変更が入っているようです。
あんまりよく分かっていませんが、diffusion modelが画像生成する元となる潜在空間変数が、乱数で初期化されてしまっているのを、初期化されないようにしているようです。
潜在空間変数が初期化されるということは、ひょっとしてこのPR前のソフトではseedを設定する意味ほとんどない???
まとめ
seed値に関して、気になったので検証してみました。多分合っていると思いますが、もし勘違いしていたり、追加情報あったら優しく教えてもらえると嬉しいです。当方初心者ですので。
多分、diffusers、次の0.2.5
のバージョンからは、seed値で再現できるようになると思います。
そして、diffusersものすごい勢いで更新されていて、たまに最新バージョン普通に動かなかったりするので要注意です。インストールする際は、バージョンや最新版ならcommit番号をメモして置かないと、同じことをしても違う結果が出て、混乱してしまうかもしれません。
あとCUDA以外のMacやIntel CPUのケースは未検証ですのでご容赦ください。
Stable Diffusionで遊んだり、こういった検証してみたいという人は、以下リポジトリをどうぞ。
関連記事
Discussion