80 lines
3.6 KiB
Markdown
80 lines
3.6 KiB
Markdown
# ComfyUI Chunked Batch Nodes
|
|
|
|
Custom nodes for chunked batched image-to-image workflows and sequential temporal video cleanup.
|
|
|
|
Included nodes:
|
|
|
|
- **VAE Encode Batch Chunked**
|
|
- **SamplerCustomAdvanced Chunked**
|
|
- **VAE Decode Batch Chunked**
|
|
- **Flux Video Cleanup Temporal Advanced**
|
|
|
|
## Purpose
|
|
|
|
These nodes let you process large image/frame batches in smaller execution chunks while preserving the normal ComfyUI `SamplerCustomAdvanced` path as closely as possible.
|
|
|
|
Typical non-temporal workflow:
|
|
|
|
`IMAGE batch -> VAE Encode Batch Chunked -> SamplerCustomAdvanced Chunked -> VAE Decode Batch Chunked`
|
|
|
|
Typical temporal workflow:
|
|
|
|
`IMAGE batch -> Flux Video Cleanup Temporal Advanced`
|
|
|
|
## Architecture
|
|
|
|
The package now splits the reusable runtime into shared helpers:
|
|
|
|
- `core_sampling.py`
|
|
- `encode_image_batch_chunked(...)`
|
|
- `decode_latent_batch_chunked(...)`
|
|
- `sample_latent_batch_chunked(...)`
|
|
- `sample_single_latent_temporal(...)`
|
|
- `nodes_batch_chunked.py`
|
|
- thin wrappers for the generic chunked batch nodes
|
|
- `nodes_temporal.py`
|
|
- the temporal recurrent video cleanup node
|
|
|
|
This keeps `SamplerCustomAdvanced Chunked` as a generic memory-safety node instead of overloading it with frame-to-frame recurrence.
|
|
|
|
## Flux Video Cleanup Temporal Advanced
|
|
|
|
Supported temporal modes:
|
|
|
|
- `off`
|
|
- pure batch path; no recurrence
|
|
- `prev_output_blend`
|
|
- blends the current input frame with the previous cleaned output before VAE encode
|
|
- `external_warped_prev`
|
|
- blends the current input frame with an externally warped previous image batch
|
|
- `internal_flow_warp`
|
|
- computes optical flow internally and warps the previous cleaned output before blending
|
|
|
|
### Important behavior
|
|
|
|
- In temporal modes, sampling runs one frame at a time so frame `t` can depend on frame `t-1`.
|
|
- `sample_chunk_size` is only used when `temporal_mode=off`.
|
|
- `reset_every_n` and `scene_cut_threshold` break recurrence explicitly.
|
|
- `lock_seed=True` supports fixed or sequential per-frame seeds based on the incoming `NOISE.seed`.
|
|
- `internal_flow_warp` uses OpenCV Farneback flow if `cv2` is available in the ComfyUI Python environment.
|
|
|
|
## Notes
|
|
|
|
- `SamplerCustomAdvanced Chunked` still reuses the normal `guider.sample(...)` path per chunk instead of reimplementing denoising logic.
|
|
- When the input latent has no `batch_index` and chunking is required, the sampler node synthesizes a sequential internal `batch_index` so chunked random noise generation stays frame-stable across chunks.
|
|
- Temporal sequential sampling preserves frame-indexed noise variation when `lock_seed=False`, and intentionally pins batch index to `0` when `lock_seed=True`.
|
|
- `noise_mask` batch slicing supports the common ComfyUI broadcast cases (`1` mask for the whole batch, or shorter masks that repeat across the full batch).
|
|
- The sampler node supports OOM fallback by halving the chunk size down to `min_chunk_size`.
|
|
- VAE encode trims extra image channels beyond RGB before calling `vae.encode(...)`, which preserves compatibility with RGBA-style image batches without changing normal RGB inputs.
|
|
|
|
## Limitations
|
|
|
|
- The temporal node uses a pixel-space temporal prior before encode. It does not rewrite guider conditioning on a per-frame basis.
|
|
- `lock_seed=True` assumes the `NOISE` input exposes a mutable `seed` attribute, which matches ComfyUI's standard custom sampler noise objects.
|
|
- `internal_flow_warp` is a dependency-light built-in flow path, not a RAFT integration.
|
|
- Nested latent edge cases are still handled conservatively and are not the primary tested path.
|
|
|
|
## Installation
|
|
|
|
Copy this folder into your ComfyUI `custom_nodes` directory and restart ComfyUI.
|