ComfyDeploy: How ComfyUI-ppm works in ComfyUI?

What is ComfyUI-ppm?

Fixed AttentionCouple, NegPip(negative weights in prompts) for SDXL and FLUX, more CFG++ and SMEA DY samplers, etc.

How to install it in ComfyDeploy?

Head over to the machine page

  1. Click on the "Create a new machine" button
  2. Select the Edit build steps
  3. Add a new step -> Custom Node
  4. Search for ComfyUI-ppm and select it
  5. Close the build step dialig and then click on the "Save" button to rebuild the machine

ComfyUI-ppm

Just a bunch of random nodes modified/fixed/created by me or others. If any node starts throwing errors after an update - try to delete and re-add the node.

You can drag-and-drop workflow images from examples/ into your ComfyUI. I'll probably add some more examples in future (but I'm kinda lazy, kek).

Nodes

CLIPNegPip

Supports:

  • SD1 - SDXL
  • FLUX
  • HunyuanVideo (untested)

Modified implementation of NegPiP by laksjdjf and hako-mikan. It uses ModelPatcher instead of monkey-patching, which should increase compatibility with other nodes.

CLIPNegPip node allows you to use negative weights in prompts. Connect the node before other model/clip patches.

Read more about NegPiP in the original repo. I recommend to keep all dots/commas inside weight braces (i.e. (worst quality,:-1.3) (sketch:-1.1,) instead of (worst quality:-1.3), (sketch:-1.1),).

[!NOTE] CLIPNegPip is compatible with:

CLIPNegPip is incompatible with:

Example workflow (FLUX)

workflow_negpip_flux

AttentionCouplePPM

Modified implementation of AttentionCouple by laksjdjf and Haoming02. I made AttentionCouplePPM node compatible with CLIPNegPiP node and with default PatchModelAddDownscale (Kohya Deep Shrink) node.

Inputs for new regions are managed automatically: when you attach cond/mask of a region to the node, a new cond_ / mask_ input appears. Last cond_ / mask_ inputs are always optional.

Use multiple LatentToMaskBB nodes to set bounding box masks for AttentionCouplePPM. The parameters are relative to your initial latent: x=0.5, y=0.0, w=0.5, h=1.0 will produce a mask covering right half of your image.

DynSamplerSelect

Modified samplers from Euler-Smea-Dyn-Sampler by Koishi-Star.

Contains some new samplers: euler_ancestral_dy, dpmpp_2m_dy and dpmpp_3m_dy.

Tweaking s_dy_pow may reduce blur artifacts (optimal value is 2 for euler_* samplers and -1 for dpmpp_* samplers, use -1 to disable this feature).

CFG++SamplerSelect

Samplers adapted to CFG++: Manifold-constrained Classifier Free Guidance for Diffusion Models by Chung et al.. Also contains converted samplers from Euler-Smea-Dyn.

Should greatly reduce overexposure effect. Use together with SamplerCustom node. Don't forget to set CFG scale to 1.0-2.0 and PAG/SEG scale (if used) to 0.5-1.0.

Guidance Limiter

Implementation of Applying Guidance in a Limited Interval Improves Sample and Distribution Quality in Diffusion Models by Kynkäänniemi et al. (also contains RescaleCFG functionality)

Guidance Limiter is also available as a CFGLimiterGuider guider node for SamplerCustomAdvanced.

Empty Latent Image (Aspect Ratio)

Empty Latent Image (Aspect Ratio) node generates empty latent with specified aspect ratio and with respect to target resolution.

CLIPTextEncodeBREAK

A small lightweight wrapper over ConditioningConcat node, CLIPTextEncodeBREAK node can split prompts by BREAK keyword into chunks and produce a single concatenated conditioning.

CLIPTokenCounter

Counts tokens in your prompt and returns them as a string (currently limited to clip_l). You can also print token count + individual tokens by enabling debug_print.

Hooks/Hijacks

Schedulers

Adds AlignYourSteps scheduler modified by Extraltodeus to the default list of schedulers by replacing comfy.samplers.calculate_sigmas function. ays is the default AYS scheduler for SDXL and ays+ is just ays with force_sigma_min=True.

Also adds GITS scheduler and AYS_30 scheduler (based on AYS_32 by Koitenshin)

Advanced CLIP Text Encode

Hijacks advanced_encode_from_tokens method from Advanced CLIP Text Encode extension (if installed), making all weight interpretations compatible with NegPip.