Files
Davids048andClaude Fable 5.1 a5aa64ab6b [refactor]: decide every config value before the config freezes, and drop the from_pretrained keywords
VideoGenerator.from_pretrained(model_path, config) takes the same nested
settings as from_config; the 24 flat keywords, from_pretrained_kwargs_to_config,
FROM_PRETRAINED_KWARGS, and every flat_field in the schema are deleted.
nvfp4_fa4 is the typed field engine.attention.nvfp4_fa4, applied by a
resolution step. 65 call sites and the docs use the nested form; the three
kwargs golden cases are config cases with byte-identical results.

Every value is decided during resolution; no runtime code calls
with_override. The device offload policy (unified memory, MPS, layerwise
conflicts, lazy module load) runs as resolution steps in the main process
(fastvideo/api/device_policy.py), and the worker runs on the config it
receives. The LTX-2 refine defaults from model_index.json and the MiniMax-H3
schedule from fastvideo_inference.json are resolution steps
(fastvideo/api/checkpoint_defaults.py) that read local checkpoints or download
only those files; the H3 pipeline validates the schedule against the loaded
schedulers but no longer writes it. The preprocessing entry point passes the
downloaded local path as run state instead of a config override. Teacher and
critic models load with override_transformer_cls_name as a load argument.
The test isolation turns the device policy off, as it blocks downloads, so
that the goldens do not depend on the machine.

Against the 3f6893a0 goldens, every field still matches except boundary_ratio
and ltx2_vae_tiling (DESIGN section 9) and the fields that no longer exist.
The launcher and trainer YAML verifications report 0 unexplained differences.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 07:14:31 +00:00
..

Local Stable Audio Tests

End-to-end parity tests for the Stable Audio Open 1.0 pipeline + the Oobleck VAE component. They compare FastVideo against the published weights and the official Stability-AI/stable-audio-tools reference, so they're skipped in CI and run locally on a single GPU.

Setup

1. Hugging Face access

Stable Audio Open 1.0 is a gated repo. Accept the terms once at https://huggingface.co/stabilityai/stable-audio-open-1.0 and export your token in the shell:

export HF_TOKEN=hf_...
# any of HF_TOKEN / HUGGINGFACE_HUB_TOKEN / HF_API_KEY works

The tests skip cleanly with a helpful message if no token is set.

2. Optional inference dependencies

k_diffusion and friends are not part of FastVideo's base install. One-shot:

uv pip install k_diffusion einops_exts alias_free_torch torchsde

3. Clone the upstream reference repo

The pipeline-level parity tests (test_stable_audio_pipeline_parity.py, test_stable_audio_a2a_parity.py) and the VAE-component parity tests (test_oobleck_vae_parity.py, test_oobleck_vae_official_parity.py) import directly from stable_audio_tools. Clone it under the repo root and uv pip install editable, then add it to .gitignore:

cd <FastVideo repo root>
git clone --depth 1 https://github.com/Stability-AI/stable-audio-tools.git
uv pip install --no-deps -e ./stable-audio-tools
echo "/stable-audio-tools/" >> .git/info/exclude   # personal ignore

The smoke test and the inpainting self-consistency test do not need the upstream clone.

4. (Optional) Pre-warm the model cache

The first parity-test run downloads the full Stable Audio Open 1.0 checkpoint (~3 GB). To avoid the download blocking your first test run, fetch it ahead of time:

python -c "from huggingface_hub import snapshot_download; \
           snapshot_download('stabilityai/stable-audio-open-1.0')"

Running the tests

All Stable Audio tests in one shot (~80 s on a single B200):

pytest tests/local_tests/stable_audio/test_stable_audio_pipeline_smoke.py \
       tests/local_tests/stable_audio/test_stable_audio_pipeline_parity.py \
       tests/local_tests/stable_audio/test_stable_audio_a2a_parity.py \
       tests/local_tests/stable_audio/test_stable_audio_inpaint_parity.py \
       tests/local_tests/stable_audio/test_oobleck_vae_parity.py \
       tests/local_tests/stable_audio/test_oobleck_vae_official_parity.py \
       -v -s

Or, to run the entire family:

pytest tests/local_tests/stable_audio/ -v -s

Add -s to print the per-test diff numbers (shape / abs_mean / max diff / drift / RMS ratios).

What each test covers

Test Compares against Notes
test_stable_audio_pipeline_smoke.py — (no GPU) Imports + registry + preset wiring. CPU-only.
test_stable_audio_pipeline_parity.py stable_audio_tools.inference.generate_diffusion_cond T2A end-to-end. Drift bound: < 1% / 0.05 element-wise.
test_stable_audio_a2a_parity.py generate_diffusion_cond(init_audio=...) Audio-to-audio variation. Drift bound: < 2% / 0.05 mean.
test_stable_audio_inpaint_parity.py self-consistency RePaint blending — kept-region RMS ratio in [0.5, 2.0], unkept region non-silent + bounded. SA Open 1.0 isn't inpaint-trained so there's no upstream reference to compare against.
test_oobleck_vae_parity.py stable_audio_tools.models.AudioAutoencoder (real weights) Decode + encode + round-trip; should be bit-identical (fp32, diff = 0).
test_oobleck_vae_official_parity.py OobleckEncoder / OobleckDecoder (random init) Architectural parity — verifies the FastVideo port matches upstream's structure. Bit-identical (diff = 0).

Reproducing a single test

Each test file is independent. Run one:

pytest tests/local_tests/stable_audio/test_stable_audio_a2a_parity.py -v -s

Expected output (approximate, on a B200, fp32, default seed = 0):

off shape=(1, 2, 66150) abs_mean=0.181810
fv  shape=(1, 2, 66150) abs_mean=0.180913
diff max=0.030 mean=0.003 median=0.002  abs_mean rel drift=0.49%
PASSED

Troubleshooting

  • All tests skip with "gated repo" reason. Check echo $HF_TOKEN and that you've accepted the model terms at https://huggingface.co/stabilityai/stable-audio-open-1.0.
  • ModuleNotFoundError: stable_audio_tools / k_diffusion. Re-run the setup steps; the parity tests skip cleanly if these aren't importable but only after detecting both, so a partial install can produce an unhelpful error mid-test.
  • A2A or inpaint test passes individually but fails in a batch run. The deterministic-math toggles (TF32 / cuDNN benchmark off) are set in StableAudioPipeline.load_modules. If a test earlier in the batch flipped them on, drift can spike — re-run the failing test alone to confirm.
  • Wall-clock blew up past 5 min. First call downloads the checkpoint and the T5-base weights (~4 GB total) — see the pre-warm step above.

Adding new parity tests for this family

Use any of the existing test_stable_audio_* files as a template — the HF-token detection (_hf_token / _can_access / _setup_hf_env) and the loader for the official model (_load_official) are duplicated across the parity-test files; copy them as a starting point and call out the comparison reference (upstream class + invocation) in the file docstring.