[ComfyUI]SamplerCustom宣伝記事

 今回は、ComfyUIにおける最強ノードである、SamplerCustomの宣伝をする記事です。

 この記事の画像は全てanimagineXL-3.0及びDartが作ってくれたプロンプトを使っております。プロンプト考えなくていいの最高や~~。

画像生成ノード

 ComfyUIの画像生成ノードにはKSampler(雑魚)やKSampler(Advanced)(ゴミ)があります。この二つに比べてSamplerCustomは完全上位互換であるにも関わらず、全然使われていないようです。ということで宣伝していきます。

小さいは正義!

比較

はいSamplerCustomが神ですね。

基本的な使い方

 SamplerCustomはsampling/custom_samplingの中にあります。

三本の矢

 model. positive, negative, latent_image,  cfg, seedについてはKSamplerと同じです。SamplerCustomではsampler、sigmasという二つの入力が追加されています。

おいらはおいらーだ。

 samplerはsampling/custom_sampling/samplersにあるKSamplerSelectノードで出力できます。選択肢は他のKSamplerノードにあるサンプラーと変わりません。

※modelは同系統のモデルならどのひもをつなげてもいい。
sd1/sd2/sdxlが共通、stable cascadeは違う

 sigmasはsampling/custom_sampling/schedulersにあるBasicSchedulerノードで出力できます。scheduler, steps, denoiseはKSamplerノードにあるものと同じですね。

※ノードが深いところにありすぎて出すのめんどくせーよって思うかもしれませんが、SamplerCustomのsamplerやsigmasをクリックしたままノードのない場所までドラッグすれば、自動でノード追加画面がでてきます。

 add_noiseは入力時にノイズを加えるか否かで、基本はTrueです。出力はノイズが残ったままのlatent(output)とノイズが除去されたlatent(denoised_output)があります。基本は後者を使えばいいでしょう。

発展的な使い方

 少なくともKSamplerでできることは全てできることが上でなんとなくわかると思いますが、じゃあどんないいことがあるかという話についてやっていきます。

ステップの分割

 sigmasを分割すればいいだけです。たとえばstepを15にすると、上のSIGMASはノイズの大きい方から数えて15ステップ、下のSIGMASが残りのステップになります。

 たとえばkarrasやexponentialスケジューラは、ノイズの大きい時刻や小さい時刻を重視して、中間の状態は大きくスキップします。しかしいくらノイズが小さい状態でステップを進めたところで、ほとんど変わらないので最後の方のステップは全然意味ありません。それを比較してみましょう。

赤いノードに注目

 なんかぐちゃぐちゃでわかりにくいか?euler_karrasで左の画像が25ステップ打ち止め、右の画像が残り5ステップまで生成した画像です。間違い探しレベルですね。生成の続きから行う場合、前のノードのoutputをlatent_imageにつなげ、add_noiseをFalseにしましょう。
 KSampler(Advanced)でも途中のステップで打ち止めはできます。しかしこっちはノイズ込みの途中段階とノイズのない画像のどちらかを選択(return_with_leftover_noiseってやつ)する必要があります。そのため上のワークフローのような比較はできません。
 ほかにもステップの途中で設定を変えるとか、変なことが色々できますね。

サンプラーの設定を変える

 サンプラーにはSamplerDPMPP_SDEといった個別のノードもあり、そういったノードは細かい設定も選べます。

 たとえばSamplerDPMPP_SDEにはs_noiseという項目があります。これは途中のステップで加えるノイズの大きさを設定するもので、大きくすると書き込みが増えます。cd_tunerのdetailみたいな効果ですね。こんな感じでなんかおもしろいことできるかもしれません。

 サンプラー回りはデフォルトの設定が使われていることが多いので、ここら辺の調整してみるのも面白いかもしれません。なんでEuler用のノードはないんだよPR出そうかな。

変態的な使い方

 samplerやsigmasは当然カスタムノードを実装することができます。

おりしなるすけじゅーらー

 たとえば文字列で直接時刻を指定するスケジューラーなんてものも作れます。何に使えるんだこれは。

https://gist.github.com/laksjdjf/dd317efdb6e4320dfae9203aca5c6290

実装してみたい人向け:
 おりしなるすけじゅーらーは、sigma単位でリストを返すノードになります。リストの要素には最後に0を加えて要素数=ステップ数+1になるようにしましょう。

おりじなるさんぷらー

 StreamDiffusionで紹介された、RCFGを(多分)実装してみました。本来img2img用のものなんで、txt2imgで使えるかよくわからないです。

https://gist.github.com/laksjdjf/9664bfe86f65ce00885735b5a989b8ba

なんか色が濃くなる効果があるっぽい

 RCFGにはOne-time negativeとSelf-negativeの二種類があります。One-time negativeはネガティブ側の予測を1ステップ目の計算に固定することで、2ステップ目以降のネガティブ側の計算を省略します。Self-negativeはimg2img前のlatentをネガティブとします。これによってネガティブ側の計算は不要になります。このノードではoriginal_latentに何らかのlatentを入力した場合Self-negativeになります。

実装してみたい人向け:
こっちはソースコード見て理解するしかないね。

おまけ

 lcmサンプラーを使う場合、denoised_outputにバグがあるみたいです。しょぼいPR送ってみたけど特に反応ないですね。

https://github.com/comfyanonymous/ComfyUI/pull/2811

Q.二つも余計にノードが必要になるなんてめんどい
A.ぐぬぬ・・・

Q.そもそももっと便利なカスタムノードあるよね?
A.ぐぬぬ・・・