Nodes/RocM Ninodes/ROCm VAE Decode
ComfyUI Node

ROCm VAE Decode

The Scary-Looking Node That's Just ROCm's VAE Decode

By iGavroche·Created 11 months ago·Updated 3 days ago· 43
ROCm VAE Decode
  • samples
  • vae
  • IMAGE
tile_size768
overlap96
use_rocm_optimizationstrue
precision_modeauto
batch_optimizationtrue
compatibility_modefalse
enable_temporal_tilingauto
temporal_chunk_size16
temporal_overlap2
last_frame_fixfalse

The name is a fossil

ROCMOptimizedVAEDecodeV2Phase3 reads like something from a lab notebook that got promoted by accident. It's not a third phase of anything you need to understand. Since v2.3.2 of the RocM Ninodes pack, this class is a legacy alias: it maps straight onto the current ROCm VAE Decode node. Old workflows saved under the old name load it, and in the node menu it shows up as plain "ROCm VAE Decode." If you googled the scary name and landed here, what you actually found is an AMD-tuned replacement for ComfyUI's stock VAEDecode node - the thing that turns the compressed latent your sampler spat out back into actual pixels.

Why does the alias exist? Because the pack's v1 days used names like this, and ComfyUI workflows hard-code node class names into the JSON. When the author refactored to clean ROCm naming, every saved workflow would have broken without shims. The "V2Phase3" name is a compatibility bridge wearing a trench coat.

Why you'd swap a VAE Decode at all

On NVIDIA, honestly, you probably wouldn't - this is tuned for AMD GPUs on ROCm (gfx1151 / Strix Halo APUs, RDNA 2/3, CDNA). And if you're on one of those, you know the pain. VAE decode is where ROCm workflows have historically died: on Windows the partial ROCm builds throw miopenStatusUnknownError mid-decode, Wan i2v clips have failed right at the decode step, and the standard community escape hatch was the --cpu-vae flag - which works but makes decode painfully slow. This node is the answer: an AMD-aware decode that picks sane tile sizes, precision and memory behavior for your GPU.

How it works

The decode path auto-detects your GPU architecture, your VAE type (standard, LTX/WAN causal video, or pixel-space), and whether the VAE is quantized. On AMD it defaults to fp16 for memory efficiency - but keeps causal video VAE weights in their native precision, because accumulated fp16 error in a causal state is what caused first-frame oversaturation and dark banding in earlier versions. It even unbinds the NestedTensors that MiniMax H3 and LTX-AV produce, so multimodal latents don't crash it.

For long videos there's the genuinely useful trick: temporal tiling. LTX and Wan VAEs compress time as well as space and carry a causal state across frames, so naive frame-chunked decode leaves a fuzzy seam at every tile boundary. This node decodes in overlapping temporal chunks, drops the incomplete first frame of each chunk, and linearly blends the overlap - same frame count as a full decode, but peak memory stays proportional to one chunk instead of the whole clip. A lot of changelog churn went into that blending math, and it shows: the seams are gone.

The inputs that matter

For a beginner: only two matter. Feed the LATENT from your sampler into samples, plug your VAE in, and run. Everything else has sane defaults.

A few you'll actually touch later:

  • tile_size (768 default): bigger = faster but more VRAM. Drop to 512 if you OOM.
  • precision_mode (auto): leave it. auto picks fp16 on AMD and knows to step back to fp32 when a decode fails.
  • enable_temporal_tiling (auto): for LTX/WAN videos longer than ~60 frames, auto switches it on when the output would exceed ~3GB. You can force it with enable, with temporal_chunk_size (16 latent frames ≈ 121 output frames on LTX) and temporal_overlap (2) controlling the seams.
  • compatibility_mode: flips the whole node to stock ComfyUI behavior. It's the debugging escape hatch, not a setting.

The single output is IMAGE, which wires straight into a Save/Preview node or anything else downstream.

Install

ComfyUI Manager is the easy road - search "rocm-ninodes" and install (since v2.3.2 the metadata no longer blocks Manager installs). Or do it by hand:

cd ComfyUI/custom_nodes
git clone https://github.com/iGavroche/rocm-ninodes.git

Restart ComfyUI and it appears under ROCm Ninodes → VAE. No model downloads - this is code, not weights; it decodes with whatever VAE you plug in. The real dependency is upstream: ROCm-compatible PyTorch (the README points gfx1151 owners at the rocm.nightlies build) and ROCm 6.4+. If you were on a v1.x install, run uv run python tools/upgrade_to_v2.py once, then restart.

Common issues

  • Old workflow won't load this class name - you're on a pre-2.3.2 build of the pack. Update it.
  • Nodes missing after a v2 upgrade - restart fully, and if they still don't appear, clear ComfyUI's cache and restart again.
  • OOM on big images - cut tile_size to 512; for long videos, make sure temporal tiling is on.
  • On Windows - ROCm support there is limited, and this pack's own docs admit it. If decode keeps crashing on bare Windows, WSL2 or a Linux dual-boot is the reliable path, not more toggles.

One honest caveat: the pack's marketing numbers (78% faster Flux) are single-hardware anecdotes from the author's Strix Halo, so take them as "AMD got faster," not as a guarantee for your card. But if you're stuck on --cpu-vae or ROCm decode crashes, this is a genuinely better default.

CategoryROCm Ninodes/VAE

Inputs (12)

NameTypeDefaultDescription
samplesLATENTThe latent to be decoded.
vaeVAEThe VAE model used for decoding the latent.
tile_sizeINT768256–2048Tile size. Larger values use more VRAM but are faster.
overlapINT9632–512Overlap between tiles. Higher values reduce artifacts but use more VRAM.
use_rocm_optimizationsBOOLEANtrueEnable ROCm-specific optimizations for AMD GPUs
precision_modeCOMBOautoPrecision mode. 'auto' selects optimal for your GPU.
batch_optimizationBOOLEANtrueEnable batch processing optimizations
compatibility_modeoptBOOLEANfalseEnable stock ComfyUI compatibility mode (disables all ROCm optimizations)
enable_temporal_tilingoptCOMBOautoFor LTX/WAN videos: 'auto' enables temporal tiling for large outputs, 'enable' forces it on, 'disable' turns it off.
temporal_chunk_sizeoptINT164–256Temporal tile size in LATENT frames. 16 latent = ~121 output frames for LTX.
temporal_overlapoptINT21–8Overlap in LATENT frames between temporal tiles. Higher = smoother but more overhead.
last_frame_fixoptBOOLEANfalseRepeat last latent frame before decode, then discard extra output frames. Fixes end artifacts.

Outputs (1)

NameTypeDescription
IMAGEIMAGE