DistanceSampler
https://github.com/Extraltodeus/DistanceSamplerExtraltodeus/DistanceSampler
サンプリングにおいて、前半が全体的な構図を司るのため、時間をかけて前半の精度を上げる
ChatGPT.icon
最初の数ステップで複数回サンプリングし、それぞれの「 候補」を取得。
正規化した候補同士の差分(距離)を計算し、「他と近い=信頼度大」という重みを作る。
後半はHeunに切り替える
ComfyUIカスタムノードとして実装
推奨設定
steps : 7
scheduler : beta or AYS
sampler
Distance
Distance n : negativeも含む
Distance p : perp-stepも追加
AYSだとモデルとの相性がわりと出る感じなので取り敢えずで使うならbetaを選んでおくほうが良さそうmorisoba65536.icon
FLUX.1-dev
https://gyazo.com/354ffcf53086866b45204e030d128c23
← Euler | Distance(beta) →
ComfyUI_workflow
https://gyazo.com/796b6ea1bf848af335dd479e7a2d25ce
Distance_beta.json
🟩デフォルトのKSamplerに選択肢が追加されている
リサンプル回数を指定できるSamplerDistanceノードというのもある
少々複雑になるが、🦊SamplerCustomノード(https://note.com/gcem156/n/ne119e90e1d46解説記事)を使い、「1step目と最終step(1~3step程度、モデルによる)をDistanceSampler(速度や構図の自由度を取るならCFG1)を使い、間の8~13stepをEuler(通常通りのCFG値)にする」ことで画質を維持しながら高速化も可能、下記のHiDream向けはそんな設定のサンプル
HiDream-FUllだとSampler切り替えながらだと合計15stepほど必要だったがWan2.1(後述のDistance_fast_nを使用)だと、CFG-Zero*やSkipLayerGuidanceも併用してだが11stepほどでも良い結果が出せるので、多重スケジューラで処理する場合の収束ステップ数はモデルに依存する可能性はありそうだ(HiDream向けもCFGZeroなどを使えばstepを減らせる可能性はある)morisoba65536.icon
恐らくhttps://www.reddit.com/r/StableDiffusion/comments/1ka3jp7/hidream_not_all_dreams_are_hd_quality_evaluation/に書かれているようなjpegノイズの乗った画像でHiDream-I1-Fullが学習されてしまっているのをリサンプリングの回数を増やすことで「平均に分布しないNoiseを無理くり消せてるのではないか?」とは思われる
HiDream-I1向けの(上記DistanceSamplerを最初と最後に適用した)Workflow、Full向けなので最終stepに3step分DistanceSamplerを費やしているがDEVであれば1stepでも十分なことが多い
https://gyazo.com/b8f8d85ea9e446f0bc7eb46321bff2e0
1st_step_and_last_step_DistanceSampler.json
多分↑で書いたようなことをもっとシンプルにhttps://github.com/Extraltodeus/pre_cfg_comfy_nodes_for_ComfyUIあたりでできそうに思えるが仕組みを読みきれないのでまだ何もわからん・・・morisoba65536.icon
https://www.reddit.com/r/StableDiffusion/comments/1k767ef/comment/mp8rthw/?utm_source=share&utm_medium=web3x&utm_name=web3xcss&utm_term=1&utm_content=share_button動画系モデルで使うときは「presets_to_add.py」で、次の 2 行のコメントを解除することで現れる「Distance_fast」「Distance_fast_n」を使うと良いようだ
# extra_samplers"Distance_fast" = distance_wrap(resample=3,resample_end=1,cfgpp=False,sharpen=False)
# extra_samplers"Distance_fast_n" = distance_wrap(resample=3,resample_end=1,cfgpp=False,sharpen=False,use_negative=True)
ただしTeaCacheとの相性が悪いようで組み合わせるとうまく生成されないようだ
(上記スレッドの続きhttps://www.reddit.com/r/StableDiffusion/comments/1k767ef/comment/mpbppaa/?utm_source=share&utm_medium=mweb3x&utm_name=mweb3xcss&utm_term=1&utm_content=share_buttonによると)TaeCacheと組み合わせる場合、下記のような設定を追加すると良いようだ
extra_samplers"Distance_1st_only" = distance_wrap(resample=3,resample_end=1,cfgpp=False,sharpen=False,first_only=True)
extra_samplers"Distance_1st_only_n" = distance_wrap(resample=3,resample_end=1,cfgpp=False,sharpen=False,first_only=True,use_negative=True)
この設定では2ステップ目からはEulerを使用するためステップ数は増える(12〜15程度は必要?)、またCFG1での動作はできなくなる(普通に崩れるようになる)
試してる感じModelSamplingSD3ノードでshift値を6くらいまで上げれば10ステップくらいまでは減らせそう?(できればresample_endの値も(実際にDistanceSampler使うのが最初の1回だけなので)増やしたいところだけど)morisoba65536.icon
またTeaCacheは併用してもスキップ出来るのは1ステップ程度になりがちだが、その1ステップでも動画なら30秒とか生成時間が変わってくるのでぎりぎりありかもしれないmorisoba65536.icon