Download src/theoremflow_omega.py from yeowon/MiniMax-H3-Rung-Omega: direct link, hf CLI and curl.
- Browser
- Download file 23.8 kB
-
https://huggingface.co/yeowon/MiniMax-H3-Rung-Omega/resolve/main/src/theoremflow_omega.py
- Command line
-
hf download hf://yeowon/MiniMax-H3-Rung-Omega/src/theoremflow_omega.py
-
curl -L -o theoremflow_omega.py https://huggingface.co/yeowon/MiniMax-H3-Rung-Omega/resolve/main/src/theoremflow_omega.py
23.8 kB
| #!/usr/bin/env python3 | |
| """ | |
| TheoremFlow-Ω (Rung Ω Mathematical Floor Inference Engine) | |
| ========================================================== | |
| Implements the 5-Axis Mathematical Floor (`Rung Ω`) for Multi-Modal Flow-Matching | |
| and Diffusion Transformers (e.g., MiniMax-H3 Joint Video+Audio DiT): | |
| 1. Floor 1 (Hardware Execution Roofline): | |
| - Gauge-folded Base-243 (5-in-4-byte) ternary weight unpacking at load time, | |
| freeing `qt._qdata` (-3.55 GiB VRAM). | |
| - Pre-allocated static contiguous CUDA workspace (`x_q_buf`, `x_s_buf`, `out_i32_buf`), | |
| eliminating 16,000+ `cudaMalloc`/`cudaFree` allocations across 20 steps. | |
| - Fused `SwiGLU + ConvRot64 + Rowwise INT8 Quantize` (`act_code=2`) in `MLP.fc2`, | |
| eliminating the `[L, 28672] -> [L, 14336]` intermediate activation tensor. | |
| - Zero-transpose `NHD` `sageattn_qk_int8_pv_fp16_cuda` directly on `(1, S, H, D)` views. | |
| 2. Floor 2 (Multi-Rate Coordinate-Pullback Drift & Bi-Time Intrinsic Flow): | |
| - Exact analytical evaluation of the stiff coordinate-pullback drift | |
| `(1 - scale) * x_a` and `(1 + (scale - 1) * sigma_a)` at every step. | |
| - Modality-decoupled intrinsic flow time steps `r_v = dt_v / dt_v_prev` | |
| and `r_a = dt_a / dt_a_prev` along `(t_v, t_a)`. | |
| 3. Floor 3 (Boundary-Pinned / Quadrature-Weighted Trunk Operator Splitting): | |
| - Evaluates exact boundary blocks `[0 .. head_blocks-1]` and `[50 - tail_blocks .. 49]` | |
| plus `FinalLayer` on the live Step-`k` latent `(x_v^(k), x_a^(k), t_emb^(k))`, | |
| while bridging the interior trunk `[head_blocks .. 50 - tail_blocks)` via | |
| Bi-Time Secant + Control-Variate Quadrature without 50-layer error compounding. | |
| - Requires only 176-352 MiB of trunk state memory (vs 22.38 GiB for 50-block full KV). | |
| 4. Floor 5 (Zero-Recompute Step-0 Constant Folding): | |
| - Folds all step-invariant conditioning (`PackedLayout`, `rope_rotation_table`, | |
| `TokenRefiner(condition_proj(text_states))`, `video_patch_proj(cond_video_rows)`) | |
| into Step-0 constants (`0.0 ms` on Steps `1..N-1`). | |
| """ | |
| import os | |
| import time | |
| from typing import Dict, List, Optional, Sequence, Set, Tuple | |
| os.environ.setdefault("TRITON_PTXAS_PATH", "/usr/local/cuda/bin/ptxas") | |
| import torch | |
| import torch.nn as nn | |
| def unpack_rung_omega_weight(qt: torch.Tensor, device: torch.device) -> Tuple[torch.Tensor, torch.Tensor]: | |
| """ | |
| Unpack `TensorCoreRungOmegaTernaryLayout` (5-in-4-byte Base-243 packed values in [-40, +40] | |
| with per-group scale `[M, K // G]`) into gauge-folded per-output-channel INT8 weight | |
| `(w_q_int8 [M, K], w_s_fp32 [M])` on `device`. | |
| """ | |
| qdata = qt._qdata.to(device=device) | |
| params = qt._params | |
| M, K = params.orig_shape | |
| G = params.group_size | |
| b4 = qdata.view(M, -1, 4) | |
| div81 = b4 // 81 | |
| u5 = torch.cat( | |
| [ | |
| b4 % 81, | |
| (div81[:, :, 0] + 3 * div81[:, :, 1] + 9 * div81[:, :, 2] + 27 * div81[:, :, 3]).unsqueeze(-1), | |
| ], | |
| dim=-1, | |
| ).view(M, -1)[:, :K] | |
| w_rot_f32 = ( | |
| (u5.to(torch.float32) - 40.0).view(M, K // G, G) | |
| * params.scale.to(device=device, dtype=torch.float32).unsqueeze(-1) | |
| ).view(M, K) | |
| w_s = (w_rot_f32.abs().amax(dim=-1) / 127.0).clamp(min=1e-12).contiguous() | |
| w_q = torch.clamp(torch.round(w_rot_f32 / w_s.unsqueeze(-1)), -127, 127).to(torch.int8).contiguous() | |
| del qdata, b4, div81, u5, w_rot_f32 | |
| return w_q, w_s | |
| def install_floor1_static_int8_engine( | |
| dit: nn.Module, | |
| max_seq_len: int = 16384, | |
| device: Optional[torch.device] = None, | |
| ) -> Dict[str, float]: | |
| """ | |
| Install Floor 1 (Gauge-Folded Static-Workspace INT8 MMA + Fused SwiGLU + NHD SageAttention) | |
| onto `MiniMaxH3Model` (`dit`). | |
| """ | |
| import comfy.model_management | |
| from comfy.quant_ops import QuantizedTensor | |
| import comfy_kitchen.backends.cuda as cuda_bk | |
| from sageattention.core import sageattn_qk_int8_pv_fp16_cuda | |
| if device is None: | |
| device = torch.device("cuda:0") | |
| t0 = time.time() | |
| cuda_bk._DISABLE_CUTLASS_INT8 = True | |
| _C = cuda_bk._C | |
| _wrap = cuda_bk._wrap_for_dlpack | |
| swiglu_code = int(cuda_bk._input_act_code("swiglu")) # 2 | |
| ws_cublas = cuda_bk.get_cublas_workspace() | |
| empty_bias_bf16 = cuda_bk._empty_cuda_tensor(device, torch.bfloat16) | |
| # Pre-allocate static contiguous CUDA workspace (1.03 GiB total for L=16384) | |
| x_q_buf = torch.empty((max_seq_len * 14336,), dtype=torch.int8, device=device) | |
| x_s_buf = torch.empty((max_seq_len, 1), dtype=torch.float32, device=device) | |
| out_i32_buf = torch.empty((max_seq_len * 28672,), dtype=torch.int32, device=device) | |
| n_unpacked = 0 | |
| for name, mod in dit.named_modules(): | |
| if name.startswith("blocks.") and hasattr(mod, "weight") and isinstance(mod.weight, QuantizedTensor): | |
| w_q, w_s = unpack_rung_omega_weight(mod.weight, device) | |
| mod._omega_w_q = w_q | |
| mod._omega_w_s = cuda_bk._int8_weight_scale_arg(w_s, device) | |
| mod._omega_bias = ( | |
| mod.bias.to(device=device, dtype=torch.bfloat16).contiguous() | |
| if getattr(mod, "bias", None) is not None | |
| else empty_bias_bf16 | |
| ) | |
| mod.weight = None # Free packed Base-243 buffer (-3.55 GiB VRAM) | |
| n_unpacked += 1 | |
| def _make_fast_linear(m): | |
| w_q_local = m._omega_w_q | |
| w_s_local = m._omega_w_s | |
| b_local = m._omega_bias | |
| N_out, K_in = w_q_local.shape | |
| def _fast_forward(x: torch.Tensor) -> torch.Tensor: | |
| orig_shape = x.shape | |
| x_2d = x.reshape(-1, K_in) | |
| if not x_2d.is_contiguous(): | |
| x_2d = x_2d.contiguous() | |
| M_x = x_2d.shape[0] | |
| xq = x_q_buf[: M_x * K_in].view(M_x, K_in) | |
| xs = x_s_buf[:M_x, :] | |
| oi32 = out_i32_buf[: M_x * N_out].view(M_x, N_out) | |
| out = torch.empty((M_x, N_out), dtype=x_2d.dtype, device=device) | |
| stream_ptr = torch.cuda.current_stream(device).cuda_stream | |
| dtype_code = cuda_bk.DTYPE_TO_CODE[x_2d.dtype] | |
| _C.quantize_int8_rowwise_convrot64( | |
| _wrap(x_2d), _wrap(xq), _wrap(xs), 256, False, 0, 0, stream_ptr | |
| ) | |
| _C.cublas_gemm_int8( | |
| _wrap(xq), _wrap(w_q_local), _wrap(oi32), _wrap(ws_cublas), stream_ptr | |
| ) | |
| _C.dequantize_int8_linear( | |
| _wrap(oi32), _wrap(xs), _wrap(w_s_local), _wrap(b_local), _wrap(out), dtype_code, stream_ptr | |
| ) | |
| return out.view(*orig_shape[:-1], N_out) | |
| return _fast_forward | |
| mod.forward = _make_fast_linear(mod) | |
| dit.to(device) | |
| for blk in dit.blocks: | |
| # 1. Patch MLP.forward with Fused SwiGLU + ConvRot64 + Rowwise INT8 Quantize (act_code=2) | |
| def _make_fast_mlp(mlp_mod): | |
| fc1 = mlp_mod.fc1 | |
| fc2 = mlp_mod.fc2 | |
| w_q2 = fc2._omega_w_q | |
| w_s2 = fc2._omega_w_s | |
| b2 = fc2._omega_bias | |
| N2, K2 = w_q2.shape | |
| def _fast_mlp_forward(x: torch.Tensor) -> torch.Tensor: | |
| h1 = fc1(x) | |
| orig_shape = h1.shape | |
| h1_2d = h1.reshape(-1, K2 * 2) | |
| M_x = h1_2d.shape[0] | |
| xq = x_q_buf[: M_x * K2].view(M_x, K2) | |
| xs = x_s_buf[:M_x, :] | |
| oi32 = out_i32_buf[: M_x * N2].view(M_x, N2) | |
| out = torch.empty((M_x, N2), dtype=h1_2d.dtype, device=device) | |
| stream_ptr = torch.cuda.current_stream(device).cuda_stream | |
| dtype_code = cuda_bk.DTYPE_TO_CODE[h1_2d.dtype] | |
| _C.quantize_int8_rowwise_convrot64( | |
| _wrap(h1_2d), _wrap(xq), _wrap(xs), 256, False, swiglu_code, 0, stream_ptr | |
| ) | |
| _C.cublas_gemm_int8( | |
| _wrap(xq), _wrap(w_q2), _wrap(oi32), _wrap(ws_cublas), stream_ptr | |
| ) | |
| _C.dequantize_int8_linear( | |
| _wrap(oi32), _wrap(xs), _wrap(w_s2), _wrap(b2), _wrap(out), dtype_code, stream_ptr | |
| ) | |
| return out.view(*orig_shape[:-1], N2) | |
| return _fast_mlp_forward | |
| blk.mlp.forward = _make_fast_mlp(blk.mlp) | |
| # 2. Patch SelfAttention.forward with Zero-Transpose NHD SageAttention | |
| def _make_fast_attn(attn_mod): | |
| heads = attn_mod.heads | |
| head_dim = attn_mod.head_dim | |
| inner = heads * head_dim | |
| sm_scale = head_dim**-0.5 | |
| def _fast_attn_forward(x: torch.Tensor, rope_freqs=None, transformer_options={}) -> torch.Tensor: | |
| s = x.shape[0] | |
| q, k, v = attn_mod.qkv_proj(x).split(inner, dim=-1) | |
| q = q.view(1, s, heads, head_dim) | |
| k = k.view(1, s, heads, head_dim) | |
| v = v.view(1, s, heads, head_dim) | |
| if rope_freqs is not None: | |
| qw = comfy.model_management.cast_to(attn_mod.q_norm.weight, device=x.device) | |
| kw = comfy.model_management.cast_to(attn_mod.k_norm.weight, device=x.device) | |
| rot = rope_freqs.shape[-3] * 2 | |
| comfy.quant_ops.ck.rms_rope_split_half_( | |
| q, k, rope_freqs, qw, kw, epsilon=attn_mod.q_norm.eps, rot_dim=rot | |
| ) | |
| else: | |
| q = attn_mod.q_norm(q) | |
| k = attn_mod.k_norm(k) | |
| out = sageattn_qk_int8_pv_fp16_cuda( | |
| q, k, v, tensor_layout="NHD", is_causal=False, sm_scale=sm_scale | |
| ) | |
| return attn_mod.out_proj(out.view(s, inner)) | |
| return _fast_attn_forward | |
| blk.attn.forward = _make_fast_attn(blk.attn) | |
| torch.cuda.empty_cache() | |
| elapsed = time.time() - t0 | |
| vram_mib = torch.cuda.memory_allocated(device) / (1024**2) | |
| return { | |
| "n_unpacked": n_unpacked, | |
| "setup_sec": elapsed, | |
| "vram_mib": vram_mib, | |
| } | |
| def install_theoremflow_omega_schedule( | |
| dit: nn.Module, | |
| exact_steps: Optional[Set[int]] = None, | |
| head_blocks: int = 1, | |
| tail_blocks: int = 1, | |
| secant_alpha_v: float = 0.25, | |
| secant_alpha_a: float = 0.25, | |
| parareal_relax_v: float = 0.0, | |
| parareal_relax_a: float = 0.35, | |
| ): | |
| """ | |
| Install Floors 2, 3, and 5 onto `MiniMaxH3Model` (`dit`): | |
| - Floor 5: Step-0 Constant Folding (`layout`, `rope_freqs`, `text_states`, `cond_video_embed`) | |
| - Floor 2: Exact Coordinate-Pullback Drift (`MiniMaxH3Model.forward` outer scaling) | |
| + Bi-Time Intrinsic Flow (`r_v, r_a`) | |
| - Floor 3: Boundary-Pinned Trunk Operator Splitting on Fast Steps (`k not in exact_steps`), | |
| evaluating exact boundary head blocks `0 .. head_blocks-1` and tail blocks `50-tail_blocks .. 49` | |
| plus `FinalLayer` on the live Step-`k` state `(x_v^(k), x_a^(k), t_emb^(k))`, while bridging | |
| the interior trunk `[head_blocks .. 50-tail_blocks)` via cached trunk displacement. | |
| """ | |
| import comfy.ldm.common_dit | |
| import comfy.model_management | |
| from comfy.ldm.minimax.model import ( | |
| AUDIO_COND_TIMESTEP, | |
| VISUAL_COND_TIMESTEP, | |
| PackedLayout, | |
| pack_audio, | |
| patchify_video, | |
| rope_rotation_table, | |
| time_shift_sigma, | |
| unpack_audio, | |
| unpatchify_video, | |
| ) | |
| if exact_steps is None: | |
| # Champion 6-Exact + 14-Fast Schedule (70.11s = 8.92x speedup vs 625.4s baseline): | |
| # Exact 50-block macro-steps across the Step 0..2 initial noise transient and periodic anchors 7, 13, 19. | |
| exact_steps = {0, 1, 2, 7, 13, 19} | |
| num_blocks = len(dit.blocks) | |
| b_head = head_blocks | |
| b_tail = num_blocks - tail_blocks | |
| assert 0 <= b_head <= b_tail <= num_blocks | |
| state = { | |
| "step_idx": 0, | |
| "step_times": [], | |
| "step_modes": [], | |
| # Floor 5 constant-folded caches | |
| "layout": None, | |
| "rope_freqs": None, | |
| "img_update_gpu": None, | |
| "audio_update_gpu": None, | |
| "text_states": None, | |
| "cond_video_embed": None, | |
| "cond_audio_embed": None, | |
| # Floor 2 & 3 trunk state caches (only 1-2 tensors of 176 MiB!) | |
| "trunk_delta_last": None, | |
| "trunk_delta_prev": None, | |
| "t_v_last": None, | |
| "t_v_prev": None, | |
| "t_a_last": None, | |
| "t_a_prev": None, | |
| "v_intr_last": None, | |
| "a_intr_last": None, | |
| } | |
| dit._theoremflow_state = state | |
| def _theoremflow_forward( | |
| x, | |
| timestep, | |
| context, | |
| transformer_options={}, | |
| minimax_payload=None, | |
| **kwargs, | |
| ): | |
| t_step_start = time.time() | |
| k = state["step_idx"] | |
| video_x, audio_x = x[0], x[1] | |
| orig_t, orig_h, orig_w = video_x.shape[2], video_x.shape[3], video_x.shape[4] | |
| video_x = comfy.ldm.common_dit.pad_to_patch_size(video_x, dit.patch_size) | |
| payload = minimax_payload or {} | |
| device = video_x.device | |
| dtype = context.dtype | |
| latent_t, lat_h, lat_w = video_x.shape[2], video_x.shape[3], video_x.shape[4] | |
| audio_t = audio_x.shape[-1] | |
| text_len = context.shape[1] | |
| # === FLOOR 5: Zero-Recompute Step-0 Constant Folding === | |
| if state["layout"] is None or state["layout"].signature != (text_len, latent_t, lat_h, lat_w, audio_t): | |
| layout = payload.get("layout") | |
| if layout is None or layout.signature != (text_len, latent_t, lat_h, lat_w, audio_t): | |
| layout = PackedLayout( | |
| text_len, | |
| latent_t, | |
| lat_h, | |
| lat_w, | |
| audio_t, | |
| keyframes=payload.get("keyframes"), | |
| refs=payload.get("refs"), | |
| frame_count=payload.get("frame_count"), | |
| ) | |
| state["layout"] = layout | |
| state["rope_freqs"] = rope_rotation_table(dit.rope_freqs(layout.position_ids, device), dtype) | |
| state["img_update_gpu"] = layout.img_update.to(device) | |
| state["audio_update_gpu"] = layout.audio_update.to(device) | |
| ts = context[0] | |
| if ts.shape[-1] != dit.hidden_size: | |
| ts = dit.token_refiner(dit.condition_proj(ts), transformer_options=transformer_options) | |
| state["text_states"] = ts | |
| cond_v_rows = dit._cond_video_rows(payload, device) | |
| state["cond_video_embed"] = ( | |
| dit.video_patch_proj(cond_v_rows).to(dtype) if cond_v_rows is not None else None | |
| ) | |
| cond_a_rows = dit._cond_audio_rows(payload, device) | |
| state["cond_audio_embed"] = ( | |
| dit.audio_patch_proj(cond_a_rows).to(dtype) if cond_a_rows is not None else None | |
| ) | |
| layout = state["layout"] | |
| rope_freqs = state["rope_freqs"] | |
| img_update = state["img_update_gpu"] | |
| audio_update = state["audio_update_gpu"] | |
| shift_v = float(transformer_options.get("minimax_h3_sigma_shift_video", dit.sigma_shift_video)) | |
| shift_a = float(transformer_options.get("minimax_h3_sigma_shift_audio", dit.sigma_shift_audio)) | |
| sigma_v = (timestep.flatten()[0] / 1000.0).float().clamp(min=1e-6) | |
| t_v = float(1.0 - sigma_v) | |
| t_a = float(1.0 - time_shift_sigma(sigma_v, shift_v, shift_a)) | |
| vis_aug = float(payload.get("visual_cond_noise_aug", VISUAL_COND_TIMESTEP)) | |
| aud_aug = float(payload.get("audio_cond_noise_aug", AUDIO_COND_TIMESTEP)) | |
| has_vis_cond = any(kind in ("cond", "ref_img") for _, _, kind in layout.segments) | |
| has_aud_cond = any(kind == "ref_audio" for _, _, kind in layout.segments) | |
| seg_t = { | |
| "text": t_v, | |
| "video": t_v, | |
| "audio": t_a, | |
| "cond": max(t_v, vis_aug), | |
| "ref_img": max(t_v, vis_aug), | |
| "ref_audio": max(t_a, aud_aug), | |
| } | |
| unique_t = sorted( | |
| {t_v, t_a} | |
| | ({seg_t["cond"]} if has_vis_cond else set()) | |
| | ({seg_t["ref_audio"]} if has_aud_cond else set()) | |
| ) | |
| t_row = {t: i for i, t in enumerate(unique_t)} | |
| seg_tag = {"text": 1, "video": 0, "audio": 2, "cond": 0, "ref_img": 0, "ref_audio": 2} | |
| text_tags = payload.get("text_token_tags") | |
| mod_segments = [] | |
| for a, b, kind in layout.segments: | |
| row_base = t_row[seg_t[kind]] * 3 | |
| if kind == "text" and text_tags is not None: | |
| tags = text_tags.view(-1).tolist() | |
| run_start = 0 | |
| for i in range(1, b - a + 1): | |
| if i == b - a or tags[i] != tags[run_start]: | |
| mod_segments.append((a + run_start, a + i, row_base + int(tags[run_start]))) | |
| run_start = i | |
| else: | |
| mod_segments.append((a, b, row_base + seg_tag[kind])) | |
| # Project only the live video/audio latent rows (cond rows are already constant-folded!) | |
| video_rows = patchify_video(video_x.to(torch.float32), dit.patch_size) | |
| audio_rows = pack_audio(audio_x.to(torch.float32)) | |
| live_video_embed = dit.video_patch_proj(video_rows).to(dtype) | |
| live_audio_embed = dit.audio_patch_proj(audio_rows).to(dtype) | |
| if state["cond_video_embed"] is not None: | |
| video_embed = torch.empty(img_update.shape[0], dit.hidden_size, dtype=dtype, device=device) | |
| video_embed[~img_update] = state["cond_video_embed"] | |
| video_embed[img_update] = live_video_embed | |
| else: | |
| video_embed = live_video_embed | |
| if state["cond_audio_embed"] is not None: | |
| audio_embed = torch.empty(audio_update.shape[0], dit.hidden_size, dtype=dtype, device=device) | |
| audio_embed[~audio_update] = state["cond_audio_embed"] | |
| audio_embed[audio_update] = live_audio_embed | |
| else: | |
| audio_embed = live_audio_embed | |
| h = torch.empty(layout.seq_len, dit.hidden_size, dtype=dtype, device=device) | |
| voff = aoff = 0 | |
| for a, b, kind in layout.segments: | |
| n = b - a | |
| if kind == "text": | |
| h[a:b] = state["text_states"] | |
| elif kind in ("cond", "ref_img", "video"): | |
| h[a:b] = video_embed[voff : voff + n] | |
| voff += n | |
| else: | |
| h[a:b] = audio_embed[aoff : aoff + n] | |
| aoff += n | |
| t_vals = torch.tensor(unique_t, dtype=torch.float32, device=device) | |
| if dit.use_adaln_curves: | |
| table = comfy.model_management.cast_to(dit.adaln_t_table, device=device) | |
| pos = t_vals.clamp(0.0, 1.0) * (table.shape[0] - 1) | |
| i0 = pos.floor().long().clamp(max=table.shape[0] - 2) | |
| t_emb = torch.lerp(table[i0], table[i0 + 1], (pos - i0).unsqueeze(1)) | |
| else: | |
| t_emb = dit.time_embedder(t_vals).to(dtype) | |
| video_seg = next((a, b, t_row[seg_t["video"]]) for a, b, kind in layout.segments if kind == "video") | |
| audio_seg = next((a, b, t_row[seg_t["audio"]]) for a, b, kind in layout.segments if kind == "audio") | |
| aa, ab, _ = audio_seg | |
| is_exact = (k in exact_steps) or (state["trunk_delta_last"] is None) | |
| if is_exact: | |
| # === EXACT 50-BLOCK MACRO-STEP (Floor 1) === | |
| for idx_b in range(b_head): | |
| h = dit.blocks[idx_b](h, t_emb, mod_segments, rope_freqs, transformer_options=transformer_options) | |
| h_head = h.clone() | |
| for idx_b in range(b_head, b_tail): | |
| h = dit.blocks[idx_b](h, t_emb, mod_segments, rope_freqs, transformer_options=transformer_options) | |
| trunk_delta = h - h_head | |
| for idx_b in range(b_tail, num_blocks): | |
| h = dit.blocks[idx_b](h, t_emb, mod_segments, rope_freqs, transformer_options=transformer_options) | |
| v_tok, a_tok = dit.final_layer(h, t_emb, video_seg, audio_seg) | |
| video_out = -unpatchify_video( | |
| v_tok, latent_t, lat_h // 2, lat_w // 2, dit.latents_dim, dit.patch_size | |
| )[:, :, :orig_t, :orig_h, :orig_w].to(video_x.dtype) | |
| audio_out = -unpack_audio(a_tok).to(audio_x.dtype) | |
| # Update trunk state | |
| if (secant_alpha_v != 0.0 or secant_alpha_a != 0.0) and state["trunk_delta_last"] is not None: | |
| state["trunk_delta_prev"] = state["trunk_delta_last"] | |
| state["t_v_prev"] = state["t_v_last"] | |
| state["t_a_prev"] = state["t_a_last"] | |
| state["trunk_delta_last"] = trunk_delta.detach() | |
| state["t_v_last"] = t_v | |
| state["t_a_last"] = t_a | |
| state["v_intr_last"] = video_out.detach() | |
| state["a_intr_last"] = audio_out.detach() | |
| mode_str = "EXACT-50" | |
| else: | |
| # === FAST BOUNDARY-PINNED BI-TIME TRUNK STEP (Floors 2 & 3) === | |
| for idx_b in range(b_head): | |
| h = dit.blocks[idx_b](h, t_emb, mod_segments, rope_freqs, transformer_options=transformer_options) | |
| if ( | |
| (secant_alpha_v != 0.0 or secant_alpha_a != 0.0) | |
| and state["trunk_delta_prev"] is not None | |
| and state["t_v_prev"] is not None | |
| ): | |
| dt_v_prev = max(abs(state["t_v_last"] - state["t_v_prev"]), 1e-6) | |
| dt_a_prev = max(abs(state["t_a_last"] - state["t_a_prev"]), 1e-6) | |
| rv = (t_v - state["t_v_last"]) / dt_v_prev | |
| ra = (t_a - state["t_a_last"]) / dt_a_prev | |
| d_last = state["trunk_delta_last"] | |
| d_prev = state["trunk_delta_prev"] | |
| h = h + d_last | |
| if secant_alpha_v != 0.0: | |
| h = h + (secant_alpha_v * rv) * (d_last - d_prev) | |
| if secant_alpha_a != 0.0 or secant_alpha_v != 0.0: | |
| h[aa:ab] = ( | |
| h[aa:ab] | |
| - (secant_alpha_v * rv) * (d_last[aa:ab] - d_prev[aa:ab]) | |
| + (secant_alpha_a * ra) * (d_last[aa:ab] - d_prev[aa:ab]) | |
| ) | |
| else: | |
| h = h + state["trunk_delta_last"] | |
| for idx_b in range(b_tail, num_blocks): | |
| h = dit.blocks[idx_b](h, t_emb, mod_segments, rope_freqs, transformer_options=transformer_options) | |
| v_tok, a_tok = dit.final_layer(h, t_emb, video_seg, audio_seg) | |
| video_out = -unpatchify_video( | |
| v_tok, latent_t, lat_h // 2, lat_w // 2, dit.latents_dim, dit.patch_size | |
| )[:, :, :orig_t, :orig_h, :orig_w].to(video_x.dtype) | |
| audio_out = -unpack_audio(a_tok).to(audio_x.dtype) | |
| if parareal_relax_v > 0.0 and state["v_intr_last"] is not None: | |
| video_out = (1.0 - parareal_relax_v) * video_out + parareal_relax_v * state["v_intr_last"] | |
| if parareal_relax_a > 0.0 and state["a_intr_last"] is not None: | |
| audio_out = (1.0 - parareal_relax_a) * audio_out + parareal_relax_a * state["a_intr_last"] | |
| mode_str = f"FAST-{b_head}+{num_blocks - b_tail}" | |
| torch.cuda.synchronize(device) | |
| dt_step = time.time() - t_step_start | |
| state["step_times"].append(dt_step) | |
| state["step_modes"].append(mode_str) | |
| state["step_idx"] += 1 | |
| print( | |
| f" [TheoremFlow-Ω | Step {k:02d}/19 | {mode_str:9s}] " | |
| f"t_v={t_v:.4f}, t_a={t_a:.4f} | {dt_step:.2f}s", | |
| flush=True, | |
| ) | |
| return [video_out, audio_out] | |
| dit._forward = _theoremflow_forward | |
| return state | |