跳转到内容
xLLM xLLM PR 预览
中

DiT 架构与能力矩阵

本开发者指南说明当前 C++ 扩散推理的实际调用链和能力边界。部署与请求示例见 模型使用文档,参数定义与默认值见 CLI 参考。下列矩阵描述源码接入情况,不代表所有权重、 设备、batch size 和并行组合均已完成验证。

边界源码与职责
启动与配置xllm.cpp 初始化配置、组装运行选项并创建 master。DiTConfig 管理 DiT 参数;ParallelConfig 管理并行规模。
Master 与 engineDiTMaster 连接 engine、调度器和请求处理。DiTEngine::init_model() 通过已有 distributed worker manager 初始化 worker。
组件与权重DiTModelLoader 读取 model_index.json 和各组件配置,组件 loader 随后转移给 pipeline 加载权重。即使 pipeline 不执行某个组件,索引声明的目录也可能仍须存在。
模型构造DiTWorkerImpl::init_model() 构建 DiTModelContext,调用 create_dit_model(),加载权重、创建 DiTExecutor 并初始化 DiTCache。Pipeline 注册决定实现;worker 可回退到配置中的 model ID。

模型和组件参数、并行组沿用现有 DiTModelContext。 配置中存在某个字段,不等于所选模型会使用它;需要继续追踪到 pipeline、transformer 或算子中的读取位置。

HTTP service → DiTRequestParams → DiTMaster → DiTDynamicBatchScheduler
→ DiTBatch / DiTForwardInputBuilder → DiTEngine → worker RPC
→ DiTWorkerImpl → DiTExecutor → DiTModel → 模型 pipeline
条件准备 → latent/timestep 准备 → 去噪循环
→ transformer blocks → attention / 通信 / 算子
→ VAE 解码 → DiTForwardOutput
→ DiTBatch → DiTRequest::generate_output() → HTTP 回调
步骤接口与边界
接收请求xllm_server.cpp 注册路由。以视频为例,VideoGenerationServiceImpl::process_async_impl() 构造 DiTRequestParams 并绑定回调。请求层负责输入解码和请求校验;pipeline 内部还存在模型专用检查。
入队与组批DiTMaster::handle_request() 构造 DiTRequestState 并入队。DiTDynamicBatchScheduler::prepare_batch() 按生成参数及媒体/张量签名选择兼容请求。调度器允许组批,不代表具体 pipeline 支持该 batch size。
构造输入与分发DiTForwardInputBuilder 组装 DiTModelParams,保留命名张量及其参数。DiTEngine::step() 向 worker 分发原生 DiTForwardInput。输入 RPC 转换由 dit_forward_params.cpp 中的 DiTForwardInput::to_proto() / from_proto() 完成;worker_model_codec_dit.cpp 负责 worker 输出转换。
执行DiTWorkerImpl::step() 将输入移到设备,调用 DiTExecutor::forward()。DiTModelImpl 委托给已注册 pipeline。Worker 同步设备执行,仅由 driver 返回结果;当前结果通路假设 DP = 1。
完成请求DiTBatch::process_forward_output() 将结果分配给请求。调度器的异步响应处理器调用 DiTRequest::generate_output() 编码媒体,再触发 service 回调。

对图像/视频 pipeline,一次 worker forward 通常执行完整去噪循环和解码。 调度器不会在每个 diffusion timestep 重新选取请求。调度和响应阶段的取消检查, 也不代表支持在去噪循环内部中断;不能直接套用 LLM 逐 token 调度的理解。

状态所有者与生命周期
请求输入、参数、回调与输出DiTRequest / DiTRequestState 持有,生命周期随请求。媒体、张量及其参数沿用 DiTMediaSources / DiTTensorSources 表示。
Batch 与 forward input调度器将请求选入 DiTBatch,builder 构造本次执行的 DiTForwardInput。Pipeline 在 forward 内管理局部 latent、timestep 和中间张量。
模型、executor 与权重DiTWorkerImpl 拥有模型和 executor;executor 引用模型。已注册的 pipeline 模块持有加载后的组件,可跨请求复用。
并行组已有 parallel-state 初始化流程创建进程组,经 DiTModelContext 中的 ParallelArgs 传入。模型保存组指针,不需要另建 rank 映射。
DiT 近似缓存DiTCache 是进程级单例,按 use_cfg 选择两个独立 policy 实例。DiTCacheMixin 本身无状态。必须一起检查 context/reset 与 transformer 回调;缓存状态不属于每个请求。
SP padding 元数据SequenceParallelMixin 用 inline static map 记录 padding,在 sequence_parallel_forward() 入口清空。Qwen-Image 使用另一个进程级单例 SequenceParallelPadManager。两种表示的 padding 状态均不归属于单个请求。

新增请求数据优先复用 builder/RPC codec;新增 pipeline 复用 model registry 和组件 loader;张量分布复用并行线性层和 collective。复用 mixin 前,应核对调用处的张量 布局和状态约定。

“已接入”表示链接源码中存在执行路径;“未接入”表示该实现没有连接相应能力, 不能通过全局开关或相关模型的支持自动获得。并行列指 diffusion transformer, 不包含文本编码器的并行能力。

Pipeline 家族 / 源码条件输入Transformer TP / SP通用 DiT Cache 回调Laser / 稀疏 AttentionVAE 路径
Flux、Fill、ControlPipeline 内文本编码器Flux transformer 未显式接入 DiT TP/SP共享 step/双流/单流回调;Flux 设置每次生成的 context,Fill/Control 未设置未接入Pipeline 内图像 VAE
Flux2Pipeline 内文本编码器Transformer 已接入 TP,未接入 SP已接入 step 和 block helper未接入Pipeline 内图像 VAE
Qwen-Image Edit PlusPipeline 内 Qwen2.5-VL / 外部 embeddingTransformer 已接入 SP,未显式接入 DiT TP已接入 step 和双流 helper未接入按宽度并行的 VAE;pipeline 读取 dit_enable_vae_tiling
JoyImage Edit PlusPipeline 内 Qwen3-VL / 外部 embeddingTransformer 已接入 SP,未显式接入 DiT TP已接入 step 和双流 helper未接入复用 Wan VAE,支持宽度并行
Wan I2VPipeline 内 UMT5 / 外部 embeddingTransformer 已接入 TP、SP存在 step/单流回调;pipeline 未设置每次生成的 contextNPU Laser 用于 Q/K 等长路径;稀疏分支优先于 dense/Laser按宽度并行的视频 VAE
MiniMax-H3外部 H3 embedding 和 token tags;不执行原始文本编码Transformer 已接入 TP、SP已接入 step 和 packed 单流回调;支持 None、TaylorSeer 和 FBCache可显式开启 NPU Laser;默认 packed dense attention;未接入稀疏路径视频 VAE 支持空间 tile 分发;音频 VAE 在 TP driver 解码

其他已注册路径包括 LongCat-Image、 LongCat-Image Edit、 LongCat AudioDiT 和 COLA DLM。 其 transformer 未接入通用 DiT Cache mixin 或 Laser 开关。COLA 是文本扩散路径, 其 KV cache 与 DiT 去噪步骤间的近似复用属于不同机制。模型已注册不等于具备表中 图像/视频模型的能力。

配置真实作用范围与约束
tp_size、sp_size、cfg_sizeDiTMapping 检查 TP × SP × CFG × DP = world_size;CFG 为 1 或 2。当前 DiT 结果收集假设 DP = 1,且模型必须实际使用相应组。JoyImage/Wan 使用 CFGParallelMixin;Qwen-Image 有自己的 CFG 分支。
vae_size、text_encoder_tp_size在同一个 world 上建立子组,不额外乘入 world size;组大小须整除 world size。所选 VAE/编码器还必须实际使用该组。H3 不执行文本编码器。
dit_sp_communication_overlap作用于模型/attention 调用处,不是新的调度模式。H3 用它控制 SP 通信;启用 overlap 不会合并独立的 Q/K/V collective。
dit_cache_policy 及缓存参数Worker 初始化会创建所选 policy,即使模型没有缓存回调。获得加速还需要回调和对应 context。Step 复用可跳过 transformer 主体,block 复用包围单个 block 调用。单流 helper 不提供 encoder_hidden_states;只有请求 context 显式选择 single_stream 时,FBCache 才会复用 packed 主干。既有双流/单流混合调用方仍保持直通行为。Fill/Control/Wan 缺少每次生成的 context 设置,不能视为已完整接入依赖该信息的 policy。选择 policy 不代表已发生缓存命中。
dit_laser_attention_enabled由 Wan 和 H3 的 NPU attention 读取。Wan 在稀疏分支之后,对 Q/K 等长路径选择 Laser。H3 对有效长度至少为 2,048、head dimension 不超过 128 的输入选择 Laser,并先排除 SP padding。Laser wrapper 接受 BNSD 张量,保留 BF16/FP16 输入 dtype,并 padding 序列和 head 维度。
dit_sparse_attention_*接入 Wan 稀疏 attention 路径,不是 H3 或表中其他 transformer 的通用开关。
dit_enable_vae_tiling由 Qwen-Image Edit Plus pipeline 读取;不控制 H3 专用 tiling,且与 vae_size 含义不同。

当前 H3 pipeline 要求 batch size 为 1,每个 prompt 生成一个视频。条件输入契约见 H3 使用文档。 prepare_conditioning() 在去噪前完成已有特征的投影/refiner 和 rotary 数据准备, 不会对原始 prompt 执行分词或文本编码。

H3 默认执行 dense 推理。TaylorSeer 和 FBCache 需要显式选择,并针对实际任务验证视频和音频质量。每次生成的 context 会重置缓存历史;命中缓存时,依赖当前 timestep 的输出归一化和媒体投影仍执行。H3 FBCache 明确拒绝滚动加载;TP1 关闭滚动加载后仍须有足够显存容纳完整常驻权重及工作区,关闭该开关不保证模型能够装下。H3 不支持 FBCacheTaylorSeer 组合策略。

H3 通过一个输出宽度为 3 × inner_dim 的 ColumnParallelLinear 融合 QKV 投影,loader 接受分开的 Q/K/V 权重前缀。SP 在 attention 前仍分别 交换 Q、K、V,计算后再反向交换输出。NPU 默认 attention 路径使用带有效段/padding 边界的 packed TND 数据。显式启用的 Laser 路径先排除 SP padding,使用 BNSD 张量, 再在输出交换前恢复 padding。启用 SP 时,切分前的总序列长度补齐到 lcm(SP, 64) 的倍数; head 数必须能被 TP × SP 整除,pipeline 还检查视频/音频投影的整除约束。替换 attention 内核必须保留 packed 边界、padding 排除、dtype 和布局语义。

视频 VAE 已有按空间 tile 向 dit_vae_group_ 分发、gather 和重叠混合的实现。组大小为 1, 或 tile 数少于 rank 数时,执行本地 tile 计算。这与 VaeParallelMixin 的宽度切分 不同。vae_size=1 时,H3 在 TP driver 本地解码;仅增加 SP 不会分布 VAE 解码。 最终 RPC 结果只由 worker driver 返回。

反馈文档问题