Commit Graph
3 Commits
Author SHA1 Message Date
SolitaryThinker d6e020402e [feat] magi-human: switch all 8 examples to umbrella HF repo + register umbrella paths
Phase 5: with all 4 weight variants now uploaded under
FastVideo/MagiHuman-Diffusers (one HF repo, four sibling subfolders
base / distill / sr_540p / sr_1080p), all magi-human examples now
default to the umbrella string. Local conversion via the
checkpoint_conversion script remains supported and is documented in
the example docstrings.

Files updated:
  * basic_magi_human.py:                      base T2V    -> base
  * basic_magi_human_ti2v.py:                 base TI2V   -> base
  * basic_magi_human_distill.py:              distill T2V -> distill
  * basic_magi_human_distill_ti2v.py:         distill TI2V-> distill
  * basic_magi_human_sr540p.py:               sr-540p T2V -> sr_540p
  * basic_magi_human_sr540p_ti2v.py:          sr-540p TI2V-> sr_540p
  * basic_magi_human_sr1080p.py:              sr-1080p T2V-> sr_1080p
  * basic_magi_human_sr1080p_ti2v.py:         sr-1080p TI2V-> sr_1080p

  * fastvideo/registry.py: hf_model_paths for the base T2V config now
    includes 'FastVideo/MagiHuman-Diffusers/base' and the distill T2V
    config includes 'FastVideo/MagiHuman-Diffusers/distill', alongside
    the existing per-variant repo names. The SR umbrella paths
    (sr_540p / sr_1080p) were already registered by Phases 3/4. TI2V
    variants reuse the same weight subfolders and are selected at
    load time via override_pipeline_cls_name + pipeline_config (see
    basic_magi_human_ti2v.py for the pattern).

Verified end-to-end:
  * pytest tests/local_tests/magi_human/ -v -s: 14 passed, 0 failed.
    All bit-exact (diff_max=0.0, diff_mean=0.0).
  * basic_magi_human.py with local converted_weights/magi_human_base
    moved out, forcing snapshot_download from the umbrella repo:
    mp4 byte-identical md5 dcf5f2bf6534c7c0d91e7353e42b23db (matches
    pre-upload local-path output exactly).

Notes:
  * fastvideo/utils.py:maybe_download_model already supports the
    'org/repo/subfolder' umbrella form (committed in e2ef3234), and
    fastvideo/pipelines/basic/magi_human/magi_human_pipeline.py
    lazy-loads the four shared components (Wan VAE, T5-Gemma encoder
    + tokenizer, Stable Audio VAE) from their canonical upstream HF
    repos so each umbrella subfolder only ships transformer/ +
    scheduler/ + (sr_transformer/) + model_index.json.
  * Total HF Hub footprint after upload: ~165 GB raw, server-side
    deduped. User cache footprint per variant is ~5-30 GB transformer
    (+ ~30 GB sr_transformer for SR) plus a single ~25 GB upstream
    cache shared across all variants.
2026-05-05 10:55:49 -07:00
SolitaryThinker 3464cb8b03 [refactor] magi-human: lazy-load Wan VAE from upstream (drop bundling default)
Extends the existing lazy-load pattern for text_encoder, tokenizer,
and audio_vae to the video VAE: each MagiHuman variant's converted
repo no longer needs to bundle a copy of the Wan 2.2 TI2V-5B VAE.
The four cross-variant shared components are now all fetched from
their canonical upstream HF repos at first build:

  * text_encoder, tokenizer  -> google/t5gemma-9b-9b-ul2 (gated)
  * audio_vae                -> stabilityai/stable-audio-open-1.0 (gated)
  * vae                      -> Wan-AI/Wan2.2-TI2V-5B-Diffusers

Per-variant converted repo shrinks to transformer/ + scheduler/ +
model_index.json (~5 GB for base bf16, ~30 GB for distill bf16). All
variants share the same ~25 GB cache of upstream weights, so a user
running 4 variants ends up with ~75 GB total instead of ~400 GB.

Implementation:

  * fastvideo/utils.py:verify_model_config_and_directory now treats
    the contents of model_index.json as authoritative for which
    component subfolders must exist locally. Pipelines that emit a
    minimal model_index.json (omitting vae / text_encoder / etc.)
    pass verification; pipelines that DO declare a component must
    still ship its subfolder. transformer/ remains mandatory.

  * fastvideo/pipelines/basic/magi_human/magi_human_pipeline.py adds
    vae to the deferred list in load_modules and a new
    _load_video_vae helper that prefers a bundled vae/ subfolder
    (legacy converted repos) and falls back to snapshot_download +
    the standard FV VAELoader. Both paths produce the same FV
    AutoencoderKLWan, so production behavior is unchanged.

  * convert_magi_human_to_diffusers.py docstring updated; --bundle-vae
    flag is unchanged (still optional) but the README example now
    omits it so new converted repos default to the minimal layout.

Verification:
  * basic_magi_human.py with bundled vae/: byte-identical mp4 (md5
    dcf5f2bf...) to pre-refactor output.
  * basic_magi_human.py with vae/ moved out and removed from
    model_index.json: same byte-identical mp4 via the lazy-load path.
  * 4/4 magi-human parity tests pass with diff_max=0.0 / diff_mean=0.0
    (DiT, pipeline, smoke + typed surface preflight).
2026-05-05 10:55:49 -07:00
SolitaryThinker e114fba53f [docs] examples: add basic_* stubs for remaining magi-human variants
Upstream daVinci-MagiHuman ships 4 model variants x 2 input modes = 8
inference entrypoints (base / distill / sr_540p / sr_1080p, each in
T2V and TI2V mode). FastVideo currently has working code for the base
T2V path (basic_magi_human.py) and a registered preset for distill
T2V (magi_human_distill, but no example until now).

Add example files for the 7 remaining variants:

  * basic_magi_human_distill.py -- runnable T2V example for the
    DMD-2 distilled model. Just point conversion at the distill
    subfolder and the existing magi_human_distill preset takes over.

  * basic_magi_human_ti2v.py
    basic_magi_human_distill_ti2v.py -- not-yet-ported TI2V (image
    conditioning) variants. Each docstring lists the pipeline-side
    work that is missing in FastVideo (VAE encoder load, reference
    image stage, latent_video[..., :1] overwrite at every denoise
    step, new I2V config + preset). main() raises NotImplementedError
    with a pointer to magi-human.md.

  * basic_magi_human_sr540p.py
    basic_magi_human_sr540p_ti2v.py -- not-yet-ported super-resolution
    to 540p. Docstring describes the upstream two-stage flow (base ->
    SR latent prep with trilinear up + ZeroSNR noise -> SR DiT -> Wan
    VAE) and lists the FV components needed (MagiHumanSR540pConfig,
    SR latent prep stage, SR denoise stage with cfg-trick guidance
    tensor, conversion script invocation for the 540p_sr subfolder,
    new preset + registry entry).

  * basic_magi_human_sr1080p.py
    basic_magi_human_sr1080p_ti2v.py -- not-yet-ported SR-1080p.
    Same SR-540p scaffolding plus a block-sparse local-window
    attention path (32 of 40 SR DiT layers). The docstring points at
    upstream's FFAHandler q_ranges/k_ranges blocks in dit_module.py
    and notes that MagiAttention currently always runs full SDPA.

All stubs follow the existing example file convention (SPDX header,
focused docstring, single main()). The not-yet-ported stubs exit with
NotImplementedError so they fail loudly rather than silently misbehaving;
each error message points at the docstring for the missing-component
checklist.
2026-05-05 10:55:49 -07:00