Flux.1 DでのLoRAトレーニング
最近になってようやくSeaArtでもFlux.1のLoRA学習が解放されたので、忘備録も兼ねて記録に残す。誰かの参考になりますように。
#1. Fluxについて
そもそもFluxとは、Stable Diffusionの開発チームであるBlack Forest Labsによって開発された高い生成能力と柔軟性を持つモデルである。SD1.5やSDXLからの進化点は、単純にモデルの規模が大きくなったことや、従来のモデルの問題であった人間の手足の破綻が少なくなったこと、アルファベットが書けるようになったこと らしい。その代わり、モデルサイズも上がっている。
#2. FluxのLoRAは難しい
見出しから出落ちであるが、FluxのLoRAを作るのは難しい。いやほんとに。SeaArtの公式Discordでも、「全然うまくいかん」との嘆きが聞こえる。
何がそんなに難しいのかというと、全然Lossが安定しないのだ。
筆者の場合は唐突にlossが上がったり、逆に下がったりしていた。中には、「それまでloss=1くらいで安定してたのに急に52まで上がった」という人も。
しかも、なんとか形になったLoRAが出来たとしても、効果が弱いらしい。じゃあ重み(weight)を上げれば良いのかと言うと そう単純ではなく、SeaArtでは重みの上限が2である上に、LoRAの重みを大きく上げればそれだけ出力画像が破綻しやすくなる。
筆者としては、「まぁ難しいし、上手い人が良いLoRA出してくれるの待つか」なんて考えていたのだが、上手い人も苦戦したようでなかなか良いのが出回らない。ということで筆者は重い腰を上げて試行錯誤することにした。
#3. パラメーターが原因
結論から言うと、問題はパラメーター設定にあった。それは当然と言えば当然なのだが、今まではパラメーターで困ったことがなかったので原因と解決策を探すのに苦労した。2024年10月現在、SeaArtのFlux LoRA トレーニングで弄れるパラメーターは限られている。その中で今回問題であったのは、ネットワークサイズ(Network Rank Dim)とネットワークAlpha(Network Alpha)である。筆者が苦戦していた2024年9月末では、SeaArtでのデフォルト設定ではDimが2, Alphaが16で設定されていた。これが良くなかった。
そもそもDimとAlphaの関係については、SeaArtの公式ガイドにも記載されているが、Alphaの値が0に近いほど、LoRAの影響は大きくなり、Dimの値に近いほど、LoRAの影響が小さくなる。Alphaの値は通常、Dimの値を超えることはない。
https://docs.seaart.ai/guide-1/ri-ben-yu/3-nagaido/3-2-loratorningu
参考までに、SeaArtのデフォルト設定ではSD1.5の場合 (Dim,Alpha)=(128,64) SDXLの場合は(Dim,Alpha)=(64,32)になっている。
繰り返すが、Fluxのデフォルト設定ではDimが2, Alphaが16で設定されていた。わけわかめ。
つまり、Dimの値が小さいが故にLoRAが全然学習してくれないし、AlphaがDimの8倍もあるせいで出来上がったLoRAが弱いのだ。
#4. パラメーターの調整と試行錯誤
#3で述べたとおり、問題はDimとAlphaにありそうだと分かった。では、DimとAlphaの値を改善すれば良い。そこで筆者は、運営さんがデフォルト値を作るときにDimとAlphaの値を間違えて逆に設定したのでは?と邪推し、(Dim,Alpha)=(16,2)で試した。結果は失敗。ここで筆者は謎の粘り強さを発揮し、同じパラメーターで6回ほど実験したが、当然失敗。
そんなことをしていると、運営さんがパラメーターを修正したと教えてくれた。見てみると、(Dim,Alpha)=(16,16)になっている。なんでなん?
とりあえず(Dim,Alpha)=(16,16)でもトレーニングしてみたが、やはり失敗。
失敗を重ねていくうちに何となくSDXLに合わせて(Dim,Alpha)=(64,32)にしてみると、成功してしまった。これでいいんかい。
一応SD1.5に合わせて(Dim,Alpha)=(128,64)でも試したが、これは良くなかった。ちゃんとLossは0.5程度に収まるのだが、文字が書けなくなってしまった。というか、LoRAを使うと文字が出力されにくくなる傾向は(64,32)からあるのだが、(128,64)では文字が全く出力されなくなった。これではFluxの意味がない。
#5. 結論
結論として、問題はDimとAlphaの値にあり、最適な値は(Dim,Alpha)=(64,32)であると分かった。SeaArtユーザーの方は参考にしてみて欲しい。
参考までに、筆者が成功したパターンのその他のパラメーターは、Dim,Alpha以外はデフォルト、データセットの画像数55, Repeat6, Epoch10の3300ステップであった。
注意として、この値でのLoRAのファイルサイズは.safetensors形式で600MBを超えた。SeaArtはオンラインサービスなのでファイル容量は気にならないが、ローカル環境でFluxを扱う場合は多少気にする必要があるかもしれない。余談だが、筆者はこの一連の試行錯誤で17000コインを溶かした。しかも、筆者がある程度の結論を出した次の日からFlux LoRAトレーニングにかかるコストが半額になるキャンペーンが始まった。勘弁して。キャンペーンは10/20までなので興味のある方は挑戦してみて欲しい。キャンペーン終了後もおそらくSDXLと同じコストでトレーニングできる。