Add HunyuanVideo-1.5 family and the video quality gate

HunyuanVideo-1.5 (the 8.3B DiT with Qwen2.5-VL + ByT5 text encoders) loads
through the hunyuanvideo-community Diffusers repacks; tencent's own repo is
the original non-diffusers layout and cannot load as a pipeline, so only the
community 480p/720p t2v repos are trusted. Two pipeline quirks, both verified
against pipeline_hunyuan_video1_5.py in diffusers 0.39, shape the wiring:

- __call__ takes no guidance kwarg: CFG lives on the pipeline's guider
  component (ClassifierFreeGuidance, shipped at scale 6.0). The family gains
  guidance_via_guider and generate() writes the requested scale onto
  pipe.guider instead of passing cfg_kwarg, which the pipeline would reject.
- __call__ has no callback_on_step_end: progress and cancellation fall back
  to a scheduler.step wrapper (one call per denoise step), installed for the
  duration of the call and always restored. Cancellation unwinds the loop by
  raising through the wrapper and surfaces the same cancelled sentinel the
  callback path uses.

The VAE compresses 16x spatial / 4x temporal, so sizes snap to /16 and frame
counts to 4k+1. The transformer declares _repeated_blocks and CacheMixin, so
the regional compile profile and the step cache both apply unchanged.

scripts/video_quality.py is the video accuracy gate, the analogue of
scripts/diffusion_quality.py with the same pure-numpy PSNR/SSIM math so image
and video budgets compare: fixed prompt/seed/shape, one short clip per
candidate against a reference clip, per-frame SSIM/PSNR over sampled frames,
a temporal-consistency deviation (motion-energy series error, catching
flicker SSIM alone misses), black-frame/NaN collapse checks, an audio RMS
silence trip-wire for LTX-2, and wall time + peak VRAM per candidate.
Verdicts map the standing budget: ssim >= 0.75 passes, >= 0.50 warns,
anything lower or any collapse fails. --selftest runs the metric path on
synthetic clips with no GPU or model.
This commit is contained in:
Daniel Han 2026-07-04 14:22:10 +00:00
commit f77fa80007
6 changed files with 717 additions and 10 deletions

View file

@ -72,6 +72,9 @@ const PIPELINE_MODELS: Record<string, PipelineSpec> = {
// these to the Wan-AI base repos (see _TRUSTED_NON_GGUF_VIDEO_REPOS).
"Wan-AI/Wan2.2-TI2V-5B-Diffusers": { kind: "pipeline" },
"Wan-AI/Wan2.2-T2V-A14B-Diffusers": { kind: "pipeline" },
// HunyuanVideo-1.5 community Diffusers repack (tencent's own repo is the original
// non-diffusers layout and cannot load as a pipeline).
"hunyuanvideo-community/HunyuanVideo-1.5-Diffusers-480p_t2v": { kind: "pipeline" },
};
// A curated GGUF picker entry: isGguf true expands its .gguf files in the quant expander
@ -106,6 +109,11 @@ const VIDEO_MODELS: ModelOption[] = [
"Wan 2.2 T2V A14B (MoE)",
"Text-to-video, dual-expert · Safetensors",
),
pipelineModel(
"hunyuanvideo-community/HunyuanVideo-1.5-Diffusers-480p_t2v",
"HunyuanVideo 1.5 (480p)",
"Text-to-video 480p · Safetensors",
),
];
// Per-model generation defaults (steps + guidance), matched by repo-id substring, most
@ -120,6 +128,9 @@ const MODEL_DEFAULTS: Array<{ match: string; steps: number; guidance: number }>
// Wan2.2 pipelines default to 50 steps at CFG 5.0 (WanPipeline defaults, verified in
// diffusers 0.39). The backend supplies the fps per family (24 for TI2V-5B, 16 for A14B).
{ match: "wan", steps: 50, guidance: 5 },
// HunyuanVideo-1.5 runs 50 steps; guidance 6 matches the guider the repo ships
// (the backend writes it onto the guider component, there is no pipeline kwarg).
{ match: "hunyuanvideo", steps: 50, guidance: 6 },
];
function defaultsFor(repoId: string): { steps: number; guidance: number } {