Text-to-Video
Diffusers
Safetensors
MiniMax H3
MiniMaxH3ModularPipeline
image-to-video
audio-video-generation
sparse-attention
block-sparse
inference-acceleration
triton
comfyui
Instructions to use Aazeus/Spark-H3 with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Diffusers
How to use Aazeus/Spark-H3 with Diffusers:
pip install -U diffusers transformers accelerate
import torch from diffusers import DiffusionPipeline # switch to "mps" for apple devices pipe = DiffusionPipeline.from_pretrained("Aazeus/Spark-H3", dtype=torch.bfloat16, device_map="cuda") prompt = "Astronaut in a jungle, cold color palette, muted colors, detailed, 8k" image = pipe(prompt).images[0] - Notebooks
- Google Colab
- Kaggle
File size: 7,184 Bytes
b78342b | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 | """Model-free regression checks for the resumed three-task experiment queue."""
from pathlib import Path
import dataclasses
import sys
import numpy as np
import pytest
import torch
sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "scripts"))
@pytest.mark.parametrize("steps", [3, 20])
def test_fp32_anchor_changes_only_one_field(steps):
import run_fp32_anchor_full50_20261004 as fp
before = dataclasses.asdict(fp.ORIGINAL_CONFIG("legacy_threshold", steps))
after = dataclasses.asdict(fp.config(fp.METHOD, steps))
assert [k for k in before if before[k] != after[k]] == ["sol_global_anchor_dtype"]
assert before["sol_global_anchor_dtype"] == "bfloat16"
assert after["sol_global_anchor_dtype"] == "float32"
def test_zero_origin_sampler_and_12fps_regression():
import run_ref2va_8fps_phase_bias_20261004 as ref
from diffusers.modular_pipelines.minimax_h3.before_encoder import MiniMaxH3Ref2VASetupStep as Setup
marker = np.zeros((145, 1, 1, 3), dtype=np.uint8)
marker[:, 0, 0, 0] = np.arange(145)
a = Setup._normalize_video_condition(marker, 24, 48, 1, 1, 1, 8)[:, 0, 0, 0]
c = ref.zero_sample(marker, 24, 145, 1, 1, 1, 8)[:, 0, 0, 0]
twelve = Setup._normalize_video_condition(marker, 24, 73, 1, 1, 1, 12)[:, 0, 0, 0]
assert np.array_equal(a, np.arange(1, 145, 3))
assert len(c) == 39 and np.array_equal(c, np.arange(0, 117, 3))
assert np.array_equal(twelve, np.arange(0, 145, 2))
def test_audio_roundtrip_without_soundfile_dependency(tmp_path):
import run_ref2va_8fps_phase_bias_20261004 as ref
expected = np.random.default_rng(42).normal(size=(2, 3200)).astype(np.float32)
path = tmp_path / "audio.wav"
ref.write_audio(path, expected, 32000)
actual, rate = ref.read_audio(path)
assert rate == 32000 and np.array_equal(actual, expected.T)
def test_decoder_audio_tensor_conversion():
import run_ref2va_8fps_phase_bias_20261004 as ref
source = torch.linspace(-1, 1, 40, dtype=torch.bfloat16).reshape(2, 20)
actual = ref.audio_numpy(source)
assert actual.dtype == np.float32
assert np.array_equal(actual, source.float().numpy())
def test_model_precision_keeps_official_fp32_input_head():
import run_ref2va_8fps_phase_bias_20261004 as ref
model = torch.nn.Module()
model._keep_in_fp32_modules = ["proj_in"]
model.proj_in = torch.nn.Linear(4, 4, dtype=torch.float32)
model.block = torch.nn.Linear(4, 4, dtype=torch.bfloat16)
audit = ref.audit_model_precision(model)
assert audit["parameter_tensor_counts"] == {"bfloat16": 2, "float32": 2}
model.block.float()
with pytest.raises(AssertionError):
ref.audit_model_precision(model)
def test_capture_noise_uses_pipeline_outputs_and_preserves_rng():
import run_ref2va_8fps_phase_bias_20261004 as ref
from types import SimpleNamespace
from diffusers.modular_pipelines import PipelineState
from diffusers.modular_pipelines.minimax_h3.before_denoise import (
MiniMaxH3PrepareLatentsStep as Noise, MiniMaxH3PrepareConditionLatentsStep as Condition)
components = SimpleNamespace(_execution_device="cpu", patch_size=(1, 2, 2), vae_latent_channels=24,
audio_channels=2, audio_latent_channels=32, keyframe_noise_aug=.999,
scheduler=SimpleNamespace(scale_noise=lambda sample, sigma, noise: sample * sigma + noise * (1 - sigma)))
def state():
return PipelineState(values=dict(condition_latents=[torch.zeros(1, 24, 2, 4, 4)],
num_condition_video_rows=8, generator=torch.Generator(device="cpu").manual_seed(42),
num_latent_frames=2, latent_height=4, latent_width=4, num_audio_latents=3))
original, captured = state(), state()
Condition()(components, original)
Noise()(components, original)
bundle = {}
with ref.capture_noise(bundle):
Condition()(components, captured)
Noise()(components, captured)
assert set(bundle) == {"condition_noise_0", "condition_rows", "latents", "audio_latents"}
for key in ("condition_rows", "latents", "audio_latents"):
assert torch.equal(bundle[key], captured.get(key))
assert torch.equal(original.get(key), captured.get(key))
@pytest.mark.parametrize("audio_frames,expected_delta", [(414, 0.0), (4, 5 / 3)])
def test_bias_only_layout_and_patch_restoration(audio_frames, expected_delta):
import run_ref2va_8fps_phase_bias_20261004 as ref
from types import SimpleNamespace
from diffusers.modular_pipelines.minimax_h3.before_denoise import MiniMaxH3Ref2VAPrepareLayoutStep as Layout
args = (torch.ones(3, dtype=torch.long),
[SimpleNamespace(kind="video", has_audio=True), SimpleNamespace(kind="audio")],
[torch.zeros(1, 24, 12, 4, 4)], [torch.zeros(audio_frames, 32), torch.zeros(6, 32)],
2, 4, 4, 2, (1, 2, 2), 2, 2, 0)
original = Layout.build_ref2va_packed_sequence
a, audit = ref.transform_layout(args, "A"), {}
with ref.phase_layout("B", audit):
b = Layout.build_ref2va_packed_sequence(*args)
assert Layout.build_ref2va_packed_sequence is original
assert audit["downstream_delta"] == pytest.approx(expected_delta)
expected = a[0].clone()
indices = a[2][:a[5]]
expected[indices, 0] += 5 / 3
expected[int(indices[-1]) + 1:, 0] += expected_delta
assert torch.equal(expected, b[0])
assert torch.equal(a[0][:, 1:], b[0][:, 1:])
def test_queue_runs_required_stages_in_order(tmp_path, monkeypatch):
import run_three_task_queue_4gpu_20261004 as queue
monkeypatch.setattr(queue, "ROOT", tmp_path / "queue")
monkeypatch.setattr(queue.study, "EXPERIMENTS", tmp_path / "experiments")
monkeypatch.setattr(queue, "process_is_route", lambda pid: False)
monkeypatch.setattr(queue, "rgb_complete", lambda name: name == queue.ROUTE_NAME)
calls = []
matrix = dict(status="complete", full50=dict(status="complete", combined_manifests={"legacy_threshold": "baseline"}))
for duration in (5, 10):
queue.study.base.write(queue.result_path(queue.ROUTE_NAME, duration), matrix)
def command(stage, argv):
calls.append(stage)
if stage == "task2_ref2va":
queue.study.base.write(tmp_path / "experiments/ref2va_8fps_phase_bias_20261004/results.json", dict(status="complete"))
if stage == "task3_fp32_anchor_generation_and_RGB":
for duration in (5, 10):
queue.study.base.write(queue.result_path(queue.ANCHOR_NAME, duration),
dict(full50=dict(candidate_manifest="fp32", status="complete")))
monkeypatch.setattr(queue, "rgb_complete", lambda name: True)
monkeypatch.setattr(queue, "run_command", command)
monkeypatch.setattr(queue, "vbench", lambda name, duration, manifests, stage, **unused: calls.append(stage))
monkeypatch.setattr(queue.route, "reference_manifest", lambda duration: Path("dense"))
queue.main(0)
assert calls == ["task1_vbench_5s", "task1_vbench_10s", "task2_ref2va",
"task3_fp32_anchor_generation_and_RGB", "task3_vbench_5s", "task3_vbench_10s"]
assert queue.study.base.read(tmp_path / "queue/results.json")["status"] == "complete"
|