# ComfyUI-RH-MiniMax-H3 [English documentation](README.md) RunningHub 的 MiniMax-H3 ComfyUI 音视频扩散节点。DiT、Qwen3-VL 文本/多模态 编码器以及视频/音频 VAE 全部在 ComfyUI 进程内运行,不依赖 SGLang 服务,也不 调用 Diffusers Pipeline。 当前任务感知路径已覆盖 T2VA、FL2VA(首/尾帧生成视频与音频)和 Ref2VA(有序 图片/音频/视频参考)。三条路径均已完成本地合同、打包、采样器、媒体预处理、 节点静态检查和单元测试。Ref2VA 已用完整发布权重完成真实 CUDA 端到端验证。 FL2VA 与 T2VA 共用 FL2VA 分区及同一套编码/采样合同;上线前建议再做一次本地 CUDA smoke。 ## 安装 ```bash cd ComfyUI/custom_nodes git clone ComfyUI-RH-MiniMax-H3 pip install -r ComfyUI-RH-MiniMax-H3/requirements.txt ``` 装好后需重启 ComfyUI:节点定义只在进程启动时读取一次。 ## 节点清单 全部节点注册 ID 带 `RHMiniMaxH3` 前缀,归入 `RunningHub/MiniMax H3` 分类。 **节点 ID** 是工作流里保存的 `class_type` / `type`,**显示名**是画布上看到的标题。 **`RunningHub/MiniMax H3/loaders`** | Node ID | Display name | |---|---| | `RHMiniMaxH3DirectModelLoader` | RunningHub MiniMax H3 Model Loader (Direct) | | `RHMiniMaxH3DirectTextEncoderLoader` | RunningHub MiniMax H3 Qwen3-VL Loader (Direct) | | `RHMiniMaxH3DirectVAELoader` | RunningHub MiniMax H3 Dual VAE Loader (Direct) | | `RHMiniMaxH3FL2VAModelLoader` | RunningHub MiniMax H3 FL2VA Model Loader (Direct) | | `RHMiniMaxH3FL2VATextEncoderLoader` | RunningHub MiniMax H3 FL2VA Qwen3-VL Loader (Direct) | | `RHMiniMaxH3FL2VAVAELoader` | RunningHub MiniMax H3 FL2VA Dual VAE Loader (Direct) | | `RHMiniMaxH3Ref2VAModelLoader` | RunningHub MiniMax H3 Ref2VA Model Loader (Direct) | | `RHMiniMaxH3Ref2VATextEncoderLoader` | RunningHub MiniMax H3 Ref2VA Qwen3-VL Loader (Direct) | | `RHMiniMaxH3Ref2VAVAELoader` | RunningHub MiniMax H3 Ref2VA Dual VAE Loader (Direct) | **`RunningHub/MiniMax H3/conditioning`** | Node ID | Display name | |---|---| | `RHMiniMaxH3T2VATarget` | RunningHub MiniMax H3 T2VA Target | | `RHMiniMaxH3T2VATextEncode` | RunningHub MiniMax H3 T2VA Text Encode | | `RHMiniMaxH3UnsupportedConditioning` | RunningHub MiniMax H3 Legacy Unsupported Conditioning (Migration Error) | **`RunningHub/MiniMax H3/fl2va`** | Node ID | Display name | |---|---| | `RHMiniMaxH3FL2VAFirstFrameCondition` | RunningHub MiniMax H3 FL2VA First / First+Last | | `RHMiniMaxH3FL2VALastFrameCondition` | RunningHub MiniMax H3 FL2VA Last Only | | `RHMiniMaxH3FL2VATarget` | RunningHub MiniMax H3 FL2VA Target | | `RHMiniMaxH3FL2VAEncode` | RunningHub MiniMax H3 FL2VA Encode | **`RunningHub/MiniMax H3/ref2va`** | Node ID | Display name | |---|---| | `RHMiniMaxH3Ref2VAImageReference` | RunningHub MiniMax H3 Ref2VA Image Reference | | `RHMiniMaxH3Ref2VAAudioReference` | RunningHub MiniMax H3 Ref2VA Audio Reference | | `RHMiniMaxH3Ref2VAVideoReference` | RunningHub MiniMax H3 Ref2VA Video Reference | | `RHMiniMaxH3Ref2VATarget` | RunningHub MiniMax H3 Ref2VA Target | | `RHMiniMaxH3Ref2VAEncode` | RunningHub MiniMax H3 Ref2VA Encode | **`RunningHub/MiniMax H3/latent`** | Node ID | Display name | |---|---| | `RHMiniMaxH3EmptyAVLatent` | RunningHub MiniMax H3 Empty AV Latent | | `RHMiniMaxH3SeparateAVLatent` | RunningHub MiniMax H3 Separate AV Latent | | `RHMiniMaxH3CombineAVLatent` | RunningHub MiniMax H3 Combine AV Latent | | `RHMiniMaxH3EncodeVideoAVLatent` | RunningHub MiniMax H3 Encode Video → AV Latent | **`RunningHub/MiniMax H3/sampling`** | Node ID | Display name | |---|---| | `RHMiniMaxH3FrameRate` | RunningHub MiniMax H3 Frame Rate (Experimental) | | `RHMiniMaxH3DualSigmaSampler` | RunningHub MiniMax H3 Dual Sigma Sampler | **`RunningHub/MiniMax H3/decode`** | Node ID | Display name | |---|---| | `RHMiniMaxH3DecodeAV` | RunningHub MiniMax H3 Decode Video + Audio | ### 迁移旧工作流 节点 ID 加了 `RH` 前缀,双 VAE loader 的 `vae_path` 也拆成了两个输入,因此更早 保存的工作流会报 `Node type not found`。用迁移工具转换,不必手工重建: ```bash python3 tools/migrate_workflow.py 旧工作流.json --in-place ``` 前端格式与 API 格式都支持。工具会改节点 ID、拆分 VAE 输入、按当前签名补齐缺失的 widget;下拉里已不存在的旧模型名会替换成当前默认值,并逐条打印替换记录供你复核。 `--in-place` 会留一份 `.bak` 备份。 ## 环境要求 - ComfyUI 0.27 或更高版本(建议 0.28+) - 与 ComfyUI 匹配的 PyTorch CUDA、Triton 和 `comfy-kitchen` - Ref2VA 视频/音频参考需要系统 `PATH` 中存在 `ffmpeg`、`ffprobe` (Encode / Video Reference 在节点加载期软探测;真正跑媒体计划时缺失会 fail-closed) - 另行下载 MiniMax-H3 权重;本仓库不包含模型权重 - 安装 `requirements.txt` 中的 Python 依赖(`transformers>=4.57.0,<=5.8.1`) 该模型规模很大。INT8 主要降低权重磁盘占用和搬运成本,并不会把 H3 变成小模型。 BF16 DiT 的 layerwise offload 为 **auto**(对齐官方 `auto_dit_layerwise_offload`, 优化基准为单卡 24GB):当可用显存 ≥ 整模权重 + `DIT_INFERENCE_RESERVE` 时自动关闭、 走整模驻留;放不下时非 block 模块常驻 GPU、transformer block 按层预取。开关见 `h3_settings.py` 的 `ENABLE_DIT_LAYERWISE_OFFLOAD`(`False`=强制整模)/ `DIT_LAYERWISE_PREFETCH`。INT8 仍可走 Comfy MixedPrecisionOps 的 partial/streaming offload。两种路径都需要较大的主机内存和高速磁盘。 采样热路径优化默认启用(均可在 `h3_settings.py` 单独关闭以便回滚): `OPT_SDPA_PRECOMPUTED_BOUNDS`(预计算 attention bounds,消除每层 CUDA→CPU 同步)、 `OPT_PREPARED_STRUCTURE`(RoPE/结构张量 session 缓存)、 `OPT_INPLACE_EULER_UPDATE`(原位更新 target rows,避免每步整序列 clone)、 `OPT_ADALN_SEGMENT_BROADCAST`(adaLN 按连续段广播 in-place,避免每层 `index_select` 物化整序列调制张量)、 `OPT_ADALN_PRECOMPUTE` / `OPT_ADALN_RELEASE_WEIGHTS`(采样前预计算全部 timestep 的 adaLN 并释放约 40% DiT 权重;缓存设备由 `OPT_ADALN_CACHE_DEVICE` 控制:`auto`/`ram`/`vram`)、 `OPT_PREBUILT_TIMESTEPS`(预生成连续 sigma/timestep 张量)、 `OPT_DYNAMIC_ACTIVATION_RESERVE`(按画布/序列估算激活预留并分档 `full`/`layerwise`/`partial`/`reject`;采样输出带 `residency_mode`)。 生命周期与缓存(均可在 `h3_settings.py` 关闭): - `OPT_RESIDENCY_LEASE` + `RESIDENCY_POLICY`(`safe`/`balanced`/`resident`): 推理后 DiT 租约驻留(`gpu-resident` / `layerwise-warm`),TTL 后冷卸载; - `OPT_ENCODE_CACHE`:文本 / 多模态 Qwen / VAE 条件 rows 共用 LRU(CPU,按字节上限); - `OPT_VAE_RESIDENCY`:VAE offload 后跳过 `soft_empty_cache`,便于连续任务回载; - `FORCE_ABSOLUTE_MODEL_ROOTS`:`True` 时 loader COMBO 一律写绝对路径;默认 `False`, 按 ComfyUI 目录型模型的约定显示相对搜索路径的短名(如 `MiniMax-H3`),解析时按 `folder_paths` 搜索路径顺序取首个命中; - `OPT_WRITE_SIDECAR`:Decode 在 Comfy `output/` 写 JSON(任务/几何/驻留/telemetry + `env`:plugin commit / GPU / torch / Comfy); - 降档链:16:9 为 `1344x768→1024x576→832x480→640x352`(`runtime/downscale.py`)。 结构治理(公开节点 class 名不变): - `nodes.py` 薄 facade → `api/{loaders,targets,conditioning,sampling_nodes,decode,_shared}.py` - `contracts/` → `constants` / `target` / `conditioning` / `components` / `fingerprints`(+ `_impl`) - `sampling.py` → `runtime/sampler_core.py` - `runtime/` 下 `packing` / `qwen_encoder` / `media_conditioning` / `model_loader` / `vae_adapter` / `components` / `dit` 均已分包 - DiT 工具:`runtime/attention.py`、`runtime/prepared_structure.py` ## 基准与可观测性 - `OPT_TELEMETRY`:采样/解码写入阶段耗时、每步 P50/P95、峰值显存;sidecar 带 `telemetry` - 24GB 主矩阵:`benchmarks/matrix.json` + 采集说明 `benchmarks/BASELINE_24GB.md` - 汇总:`python3 benchmarks/run_matrix.py --sidecars --out benchmarks/results` - latent golden:`python3 benchmarks/compare_golden.py --ref a.pt --cand b.pt`(默认 accel=off) ## 模型目录 权重分两处存放:**官方分片 release** 留在 `models/diffusers`(或 `models/minimax_h3`)下,**单文件转换产物**放进专属根 `ComfyUI/models/MiniMax-H3`。 ```text models/MiniMax-H3/ # 扁平单文件权重(转换产物) ├── MiniMax-H3-FL2VA-int8_convrot.safetensors ├── MiniMax-H3-Ref2VA-int8_convrot.safetensors ├── qwen3-vl-32b-int8_convrot.safetensors ├── MiniMax-H3-video_vae.safetensors └── MiniMax-H3-audio_vae.safetensors models/diffusers/MiniMax-H3/ # 官方分片 release ├── FL2VA/ │ ├── transformer/ # 官方 BF16 DiT(分片) │ ├── text_encoder/ # 官方 Qwen3-VL(分片 + tokenizer/processor) │ ├── video_vae/ │ └── audio_vae/ └── Ref2VA/ └── ... # 组件结构相同 ``` 专属根**只放权重、不带任何 sidecar**:组件类型与分区一律由文件名判定 (`MiniMax-H3-<分区>-<格式>` / `qwen3-vl-32b-*` / `MiniMax-H3-{video,audio}_vae`), 不符合命名规范的文件会被忽略而不是猜类型。`config.json`、`source/config.json`、 tokenizer、`preprocessor_config.json` 仍然从 `model_root` 指向的分片 release 读取, 因此**两处都要有**:release 提供结构,专属根提供张量。 `model_root` 选官方 release 根。FL2VA 节点只解析 `FL2VA` 分区,Ref2VA 节点只解析 `Ref2VA` 分区。每个任务有三个显式组件加载节点,**每个下拉只列出对应类型的模型**: - `... Model Loader (Direct)`:`transformer_path` 只列 DiT,且按分区过滤; - `... Qwen3-VL Loader (Direct)`:`text_encoder_path` 只列文本/多模态编码器; - `... Dual VAE Loader (Direct)`:拆成 `video_vae_path` 与 `audio_vae_path` 两个下拉,一次性选择并加载 24 通道视频 VAE 和 32 通道音频 VAE。 节点不会在 BF16 和 INT8 之间静默切换。请按模型名选择,例如: - DiT INT8(单文件):`MiniMax-H3-FL2VA-int8_convrot.safetensors` / `MiniMax-H3-Ref2VA-int8_convrot.safetensors` - DiT BF16(分片):逻辑名 `MiniMax-H3-FL2VA` / `MiniMax-H3-Ref2VA` - TE INT8(单文件):`qwen3-vl-32b-int8_convrot.safetensors` - TE BF16(分片):逻辑名 `qwen3-vl-32b` - VAE 单文件:`MiniMax-H3-video_vae.safetensors` / `MiniMax-H3-audio_vae.safetensors` - VAE 分片/原始包:逻辑名 `MiniMax-H3-video_vae` / `MiniMax-H3-audio_vae` 扁平单文件没有 `quant_meta.json`,**分区凭证就是文件名**:把 Ref2VA 的 DiT 选进 FL2VA 节点会直接报错。选中的单文件路径会折进组件 fingerprint,换掉权重会立刻 被下游校验发现。 旧工作流里的目录名(如 `transformer_int8_convrot` / `vae`)以及 release 内的合并 双 VAE 包仍可解析;但旧的单 `vae_path` 输入已被 `video_vae_path` + `audio_vae_path` 取代,含 VAE Loader 的旧工作流需要重连该节点。 加载 Qwen processor 时会校验官方 `preprocessor_config.json` / `video_preprocessor_config.json`(短边/长边像素、patch/merge、mean/std)。 通用 Qwen3-VL 或错误硬编码像素阈值会直接报错,避免条件 embedding 静默偏移。 ## FL2VA 工作流 支持首帧、尾帧、首帧+尾帧三种合法条件签名。条件图像与语义帧位置会作为整体 传递,并在采样前再次校验。 1. 使用 ComfyUI `LoadImage` 加载图片; 2. 使用 `RunningHub MiniMax H3 FL2VA First / First+Last`(或 `Last Only`)构造关键帧; 3. 分别使用三个 FL2VA Loader 加载 DiT、Qwen3-VL 与 VAE; 4. 创建 `FL2VA Target`,再执行 `FL2VA Encode`; 5. 将同一个 target 接到 `Empty AV Latent`; 6. 依次连接 `Dual Sigma Sampler`、`Decode Video + Audio`、`CreateVideo`、 `SaveVideo`。 三种签名各一个工作流: [`fl2va_first_frame.json`](examples/workflows/fl2va_first_frame.json) · [`fl2va_last_frame.json`](examples/workflows/fl2va_last_frame.json) · [`fl2va_first_last_frame.json`](examples/workflows/fl2va_first_last_frame.json)。 运行前请替换其中的占位输入图片名。 ## Ref2VA 工作流 Ref2VA 的参考素材有严格顺序。添加每一个图片、音频、视频或带音轨视频时,应将 上一个节点的 `references` 输出接到下一个参考节点;改变链路顺序会改变多模态提示 和条件行的顺序。 1. 使用标准 `LoadImage`、`LoadAudio` 或 `LoadVideo` 加载素材; 2. 使用对应的 `RunningHub MiniMax H3 Ref2VA ... Reference` 节点按顺序追加; 3. 分别使用三个 Ref2VA Loader 加载 DiT、Qwen3-VL 与 VAE; 4. 将最终 reference 链同时接到 `Ref2VA Target` 和 `Ref2VA Encode`; 5. 依次连接 `Empty AV Latent`、`Dual Sigma Sampler`、 `Decode Video + Audio`、`CreateVideo`、`SaveVideo`。 三种参考形态各一个工作流: [`ref2va_image.json`](examples/workflows/ref2va_image.json) · [`ref2va_image_audio.json`](examples/workflows/ref2va_image_audio.json) · [`ref2va_video_audio.json`](examples/workflows/ref2va_video_audio.json)。 Ref2VA 的 Target 建议显式填 width/height;留空时按 aspect_ratio 默认解析到 1344×768,序列和耗时会大幅上升。 运行前请替换图片和音频占位文件名。 `Ref2VA Encode` 新增 `ref_image_size`,决定每张参考图解析到多大: - `match`(默认):按生成画布的像素面积等比只缩不放; - `max`:参考管线独立的 2048 短边,identity 保真最好。 参考 token 每个采样步都参与注意力,同画布下 `max` 可能比 `match` 慢数倍。 此选项出现之前保存的工作流现在会按 `match` 运行;要精确复现旧结果请显式选 `max`。切换策略会重新编码,不会复用另一策略的缓存。 Ref2VA 视频参考按官方路径规范为 24 fps,Qwen 展示序列再从该序列按 2 fps 采样。 `video_audio` 类型必须包含实际音轨;参考音频会进入立体声/32 kHz 的音频 VAE 预处理路径。Comfy `AUDIO` 超过双声道且无 layout 时,会在 Reference 节点 / VAE 边界均值下混为 stereo;需要 ffmpeg 布局感知 `-ac 2` 时优先走文件/视频参考。 ## Target 与采样语义 - 对外时长限制为 5–15 秒。运行时会把请求帧数向上对齐到 H3 的 `17n+5` 时间 边界,例如 24 fps 下请求 5.0 秒会解析为 124 帧; - FL2VA 的 `auto` 尺寸跟随关键帧素材;指定比例时使用官方 `adapt_shape_v1` 画布规则。Ref2VA 使用六个官方比例桶:`21:9`、`16:9`、`4:3`、`1:1`、 `3:4`、`9:16`,`auto` 默认解析为 16:9; - `Ref2VA Target` 也支持可选的 `width`、`height`:两者都为 `0` 时保持上述比例桶 策略;两者同时填写时以手动画布为准。尺寸必须为 32 的倍数、宽高比在 1:4–4:1 内,且不超过 H3 的像素上限; - Ref2VA 时长填 `0` 表示从唯一一个真实带音频 reference 推导。没有带音频参考或 存在多个带音频参考时,必须显式填写 5–15 秒; - 采样器分别创建视频、音频噪声。视觉条件行在每一步固定为 sigma `0.999`,音频 参考行固定为 sigma `1.0`。50 个 sigma 点对应 49 次 DiT forward; - 编码、采样、解码之间会校验 target、条件顺序、任务分区、release 和组件指纹。 FL2VA/Ref2VA 组件交叉连接会直接报错,不会继续生成未定义结果。 ## V2A(视频→音频,可选) `Dual Sigma Sampler` 的 `denoise_video=False`:把 `av_latent.video` 整段冻结为 视觉条件(timestep floor `0.999`),只去噪音频。当前要求 **T2VA 布局**(packed 无既有 visual condition)。 典型接线: 1. `T2VA Target` + `Empty AV Latent`; 2. `Encode Video → AV Latent`(VAE + 与 target 对齐的 `IMAGE` 帧序列)写入视频; 或用 `Separate` / `Combine AV Latent` 从已有 AV 壳拼出非空视频; 3. `T2VA Text Encode` + `Dual Sigma Sampler`(`denoise_video=false`); 4. `Decode Video + Audio`(视频回传输入 latent,音频为新采样结果)。 `Empty AV Latent` 全零视频会直接报错;勿在 FL2VA/Ref2VA 既有 visual cond 布局上开 V2A。 ## 帧率条件(实验性,可选) `RunningHub MiniMax H3 Frame Rate (Experimental)` 对应 PR#15210 的实验能力,**不是**官方 训练契约,也不改 `target.fps=24` 时序格: - `adaln=True`:把 fps 的 sinusoidal 加到 `TimeEmbedder`(即使填 24 也非 no-op); 与 adaLN 预计算兼容,会写入 modulation cache 键; - `temporal_rope=True`:按 `24/fps` 缩放视频行时序 RoPE 低频(可选 hard/linear/ smoothstep 频率与 sigma 剖面);24fps 时缩放为 1。 接线:`Model Loader` → `Frame Rate` → `Dual Sigma Sampler`。换 fps 后若 DiT 已 释放 adaLN 权重,需重新加载模型。 ## 单卡采样加速(可选) 开发/部署按**单卡**设计:不做多卡或 Ulysses 门禁。官方 4×H200 数字只作旋钮与 质量参考;单卡收益来自减少 DiT 次数(velocity-cache)或跳过 block 计算 (Cache-DiT)。默认 `accel=off`。 `Dual Sigma Sampler` 的 `accel`: | 值 | 行为 | 单卡建议 | | --- | --- | --- | | `off` | 关闭(可作 GT) | 默认 | | `auto` | 命中 1344×768/124f/50steps/shift12·3 时优先 velocity-cache | 推荐试 | | `minimax-h3-velocity-cache-v1` | 整步 velocity 复用 + Taylor(无额外依赖) | **首选** | | `minimax-h3-cache-v1` | Cache-DiT DBCache(需 `pip install cache-dit>=1.3.0`) | 备选 | | `manual-velocity` / `manual-cache-dit` | 手调 stride 或 RDT/MC/warmup | 调试 | 官方参考:velocity-cache 约 **3.2×**、Cache-DiT 约 **2×**(均为 4×H200 证据)。 近似加速,**不要**当 consistency GT。profile 在 `minimax_h3_nodes/runtime/profiles/`。采样结束会打实际/理论 DiT 次数日志; `auto` 未命中与 `manual-*` 也会记录当前 workload 并标明非 GT。 在 [`examples/workflows/`](examples/workflows) 任一工作流的采样器上 设置 `accel` 即可;导入前确认模型名与本地 INT8/VAE 选择一致。 与 `accel` 无关的两条融合 kernel 路径(均来自上游 PR#15224):安装的 Comfy 暴露 了对应入口就自动启用,每进程探测一次并打日志;入口缺失(旧版 Comfy、没有 comfy-kitchen、非 CUDA 设备)则原样走现有 PyTorch 路径。 | 开关 | Kernel | 收益 | | --- | --- | --- | | `OPT_INT8_FUSED_SWIGLU` | `comfy.ops.linear_input_act` | INT8 MLP:swiglu 折进激活量化 kernel,省掉每层每步一次全尺寸中间张量 | | `OPT_FUSED_QK_ROPE` | `comfy.quant_ops.ck.rms_rope_split_half_` | 注意力:per-head RMSNorm 与 split-half RoPE 一趟做完,就地写在 qkv 缓冲上 | 两者都在 `minimax_h3_nodes/runtime/h3_settings.py`; `OPT_FUSED_QK_ROPE_CUDA_ONLY` 让 RoPE kernel 在非 CUDA 设备上一律回退 (comfy-kitchen 没有对应实现)。带梯度时融合 RoPE 也会自动让路——它要就地改写 autograd 视图。 ## INT8 转换与 VAE 合并 必须按任务分区分别转换: ```bash cd custom_nodes/ComfyUI-RH-MiniMax-H3 BASE=/path/to/ComfyUI/models/diffusers/MiniMax-H3 python3 tools/quantize_int8_convrot.py \ --src "$BASE/FL2VA/transformer" --device cuda --verify python3 tools/quantize_int8_convrot.py \ --src "$BASE/Ref2VA/transformer" --device cuda --verify python3 tools/quantize_text_encoder_int8_convrot.py \ --src "$BASE/FL2VA/text_encoder" --device cuda --verify python3 tools/quantize_text_encoder_int8_convrot.py \ --src "$BASE/Ref2VA/text_encoder" --device cuda --verify python3 tools/merge_vae.py --src "$BASE/FL2VA" python3 tools/merge_vae.py --src "$BASE/Ref2VA" ``` VAE 只做合并打包,不做 INT8 量化。即使文件名相同,也不要用一个分区的文件修补 另一个分区;转换前应先校验完整的官方下载权重。 工具输出的是**组件目录**(`config.json` + 单文件权重 + `quant_meta.json`)。要用 专属根的扁平布局,把其中的 `.safetensors` 挪到 `models/MiniMax-H3/` 即可——文件名 已经带了模型/类型/量化格式,节点靠它判定类型与分区,配置继续从 `$BASE` 的分片 release 读: ```bash FLAT=/path/to/ComfyUI/models/MiniMax-H3 mkdir -p "$FLAT" mv "$BASE/FL2VA/transformer_int8_convrot/MiniMax-H3-FL2VA-int8_convrot.safetensors" "$FLAT/" mv "$BASE/Ref2VA/transformer_int8_convrot/MiniMax-H3-Ref2VA-int8_convrot.safetensors" "$FLAT/" mv "$BASE/FL2VA/text_encoder_int8_convrot/qwen3-vl-32b-int8_convrot.safetensors" "$FLAT/" mv "$BASE/FL2VA/vae/video_vae/MiniMax-H3-video_vae.safetensors" "$FLAT/" mv "$BASE/FL2VA/vae/audio_vae/MiniMax-H3-audio_vae.safetensors" "$FLAT/" ``` 留在 release 里的组件目录(含 `quant_meta.json`)同样可用,两种形态都会出现在 对应类型的下拉里。 ## AdaLN 曲线表 DiT(可选,checkpoint 缩小约 40%) DiT 每层的 adaLN 投影是 `[96768, 2688]`,50 层合计 26 GB——占 BF16 DiT 的 39%、 INT8 的 55%(adaLN 不参与量化)。而它的输入只是 `silu(time_embedder(t))` 这条 一维曲线:把曲线投影到秩 `k` 的共享基后,基被折进每层权重(`[96768, k]`), time embedder 由 `adaln_t_table [grid, k]` 采样表 + 线性插值取代。这就是上游 PR #15224 引入的 checkpoint 格式;加载器按 `adaln_t_table` 张量自动识别,两种 形态走同一套节点。 ```bash python3 tools/convert_adaln_curve.py \ --src "$BASE/FL2VA/transformer" --verify # BF16: 66.3 GiB -> 约 40 GiB python3 tools/convert_adaln_curve.py \ --src "$BASE/FL2VA/transformer_int8_convrot" --verify # INT8: 47.0 GiB -> 约 21 GiB ``` 产物写到 `_adaln_curve/`,在 DiT 选择器里作为独立模型名出现。`--verify` 会在随机的非网格 timestep 上比对曲线路径与真实 adaLN 输出,低于 `--cosine-floor`(0.9999)直接失败——此时提高 `--rank` / `--grid`。默认 rank 64 / grid 1024。 与运行时 adaLN 预计算(原版 checkpoint 仍默认走它)的取舍: - 磁盘更小,无需预计算,不占调制缓存,任意 timestep 都可用。 - adaLN 输入是秩 `k` 近似,而非精确值。 - 实验性 Frame Rate 节点的 `adaln` 模式依赖 time embedder,曲线表 checkpoint 会 直接报错;`temporal_rope` 模式不受影响。 ## 本地验证 ```bash python3 -m compileall -q minimax_h3_nodes tools tests python3 -m unittest discover -s tests -v ``` 这些命令验证本地结构以及 CPU 可执行合同,不能代替使用完整发布权重的真实 CUDA 端到端运行。 ## 许可证与上游 插件代码按本仓库 Apache-2.0 许可证发布。模型权重不包含在仓库中,仍受上游模型 许可证及条款约束。实现参考官方 [MiniMax-H3 源码包](https://github.com/MiniMax-AI-Dev/Internal-0727-private-3)。