[perf]: faster FastH3 decode and NVFP4 GEMMs in the DGX Spark recipes

On GB10 the light H3 VAE's INT8 ConvRot overlay decodes 832x480x124 in
42 s and gains nothing from tile batching. The dense weights take 24 s
with one tile per decoder call, 14 s with 12 tiles per call and 9.8 s
compiled, at higher fidelity (77.7 vs 63.4 dB PSNR against an FP32
decode). FASTVIDEO_H3_VAE_INT8_OVERLAY=0 now skips the overlay (default
on, so other recipes are unchanged), and the single-Spark recipes use it
with FASTVIDEO_H3_VAE_TILE_BATCH=12 and a compiled VAE decoder.

FlashInfer's CUTLASS mm_fp4 is 2.7-3x slower than its cuDNN backend for
the H3 FFN projections on GB10 with identical outputs, so the recipes
select FASTVIDEO_NVFP4_MM_BACKEND=cudnn. FlashInfer autotuning was not
adopted: it made repeated calls non-deterministic.

One Spark, 832x480x124, seed 1234, warm calls: FastH3 Trim 121-122 s to
68 s (denoise 78 -> 58 s, decode 43 -> 9.5 s); FastH3 V2 139-141 s to
79 s. Repeated calls are bit-identical, which the previous V2 recipe was
not.

FP4 attention (FASTVIDEO_H3_VSA_FP4=1, built for sm_121a since #1598) is
documented for GB10 as opt-in and stays off: it is 24-33% faster in
denoise on V2 but changes the output (LPIPS 0.39-0.55 against BF16
attention), and the checkpoints were not trained for it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Aryan Kumar
2026-10-09 11:43:20 -07:00
co-authored by Claude Opus 5.5
parent d0b91810b2
commit 1c1aa75f33
8 changed files with 118 additions and 14 deletions
@@ -4,9 +4,16 @@
#
# GB10 uses Triton VSA. The release packs attention, FFN and VSA gate weights.
# The NVFP4 encoder and lightweight VAE ship in the same repository.
# The VAE decodes with its dense weights, 12 tiles per call and a compiled
# decoder: on GB10 the INT8 ConvRot overlay is slower and less accurate.
# NVFP4 GEMMs use FlashInfer's cuDNN backend, 2-3x faster than CUTLASS on the
# H3 FFN shapes on GB10 with identical outputs.
# Optional, off by default: FASTVIDEO_H3_VSA_FP4=1 runs VSA on the FP4 attention kernel
# (fastvideo-kernel built for 12.1a). It is faster but changes the output for now;
# see spark_performance.md.
#
# FASTVIDEO_MINIMAX_H3_FUSIONS=all FASTVIDEO_NVFP4_MM_BACKEND=cutlass \
# FASTVIDEO_H3_VAE_TILE_BATCH=1 \
# FASTVIDEO_MINIMAX_H3_FUSIONS=all FASTVIDEO_NVFP4_MM_BACKEND=cudnn \
# FASTVIDEO_H3_VAE_TILE_BATCH=12 FASTVIDEO_H3_VAE_INT8_OVERLAY=0 \
# FASTVIDEO_VSA_TRITON=1 FASTVIDEO_VSA_SM100A=0 FASTVIDEO_FA4=0 \
# FASTVIDEO_ATTENTION_BACKEND=VIDEO_SPARSE_ATTN_H3 FASTVIDEO_STAGE_LOGGING=1 \
# fastvideo generate --config examples/inference/basic/basic_fasth3_spark_pruned_nvfp4.yaml
@@ -31,7 +38,7 @@ generator:
lazy_module_load: false
compile:
enabled: false
vae_enabled: false
vae_enabled: true
pipeline:
workload_type: t2v
vae_tiling: true
@@ -4,9 +4,16 @@
#
# GB10 uses Triton VSA. The release packs attention, FFN and VSA gate weights.
# The NVFP4 encoder and lightweight VAE ship in the same repository.
# The VAE decodes with its dense weights, 12 tiles per call and a compiled
# decoder: on GB10 the INT8 ConvRot overlay is slower and less accurate.
# NVFP4 GEMMs use FlashInfer's cuDNN backend, 2-3x faster than CUTLASS on the
# H3 FFN shapes on GB10 with identical outputs.
# Optional, off by default: FASTVIDEO_H3_VSA_FP4=1 runs VSA on the FP4 attention kernel
# (fastvideo-kernel built for 12.1a). It is faster but changes the output for now;
# see spark_performance.md.
#
# FASTVIDEO_MINIMAX_H3_FUSIONS=all FASTVIDEO_NVFP4_MM_BACKEND=cutlass \
# FASTVIDEO_H3_VAE_TILE_BATCH=1 \
# FASTVIDEO_MINIMAX_H3_FUSIONS=all FASTVIDEO_NVFP4_MM_BACKEND=cudnn \
# FASTVIDEO_H3_VAE_TILE_BATCH=12 FASTVIDEO_H3_VAE_INT8_OVERLAY=0 \
# FASTVIDEO_VSA_TRITON=1 FASTVIDEO_VSA_SM100A=0 FASTVIDEO_FA4=0 \
# FASTVIDEO_ATTENTION_BACKEND=VIDEO_SPARSE_ATTN_H3 FASTVIDEO_STAGE_LOGGING=1 \
# fastvideo generate --config examples/inference/basic/basic_fasth3_spark_v2_nvfp4.yaml
@@ -31,7 +38,7 @@ generator:
lazy_module_load: false
compile:
enabled: false
vae_enabled: false
vae_enabled: true
pipeline:
workload_type: t2v
vae_tiling: true