尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

LTX-2 多 GPU 序列并行:从 token 切分到 all2all 直写,多卡数值等价的 5 个落地要点

LTX-2 多 GPU 序列并行:从 token 切分到 all2all 直写,多卡数值等价的 5 个落地要点 LTX-2 多 GPU 序列并行从 token 切分到 all2all 直写多卡数值等价的 5 个落地要点【免费下载链接】LTX-2Official Python inference and LoRA trainer package for the LTX-2 audio–video generative model.项目地址: https://gitcode.com/GitHub_Trending/lt/LTX-2拆解 LTX-2 多 GPU 推理里的序列并行Sequence ParallelismSPtoken 维均匀切分、all2all 内核的 CUDA-IPC 直写、AttentionManager 与 SequenceParallelBuilder 的接入以及 max_tokens 报错语义。适合有 PyTorch 基础、准备接入多卡 SP 或做并行选型的推理工程师。SP 选型决策清单三个条件选中序列并行先把选型讲清楚。LTX-2 的多 GPU 体系给不同子问题提供了三种切法各管一摊SP序列并行沿 token 维切视频结果与单卡数值等价TDP分块数据并行每卡一个空间 tile仅 upscale 场景分布式 Gemma用 Accelerate 切分文本编码器不碰 transformer换句话说MGPU 是延迟工具而非显存工具transformer 的工作副本在每个 GPU 上都是完整副本SP 额外把激活内存摊到各 rank。所以 SP 的决策清单只有三条分辨率在训练分布内是则 SP 优先upscale 转 TDP结果必须和单卡一致是硬需求SP 是默认答案目标是单次生成更低延迟SP 正对此优化官方管线里 SP 是 stage 1ti2vid_two_stages_mgpu与 shared stagedistilled_mgpu的默认方案后者的一个 SP 包裹同时覆盖 half-res 与 full-res 两次调用stage 2 全分辨率则交给 TDP。分工一句话分布内 求忠实 追延迟 → SP。心智模型token 怎么切、head 怎么换的四步走一个 denoising step 里sequence_parallel.py 的SequenceParallelModelWrapper.forward走四步下图为文本版数据流图world_size4T14 tokens → pad 到 T16world_size 的倍数pad key 被 mask rank0: tok[0..3] rank1: tok[4..7] rank2: tok[8..11] rank3: tok[12..15] │ │ │ │ └─▶ send_recv_headsall2all 换头每 rank 取到全部 token × 本地那部分 head ▼ 本地注意力每 rank 只算 heads/4 个 head └─▶ gather_heads 洗回 → all_gather 回全长 → 切掉 pad 行 → 每 rank 得完整输出第一步 pad 对齐seq 维补齐到world_size的整数倍保证每 rank 拿到等量 shard。compute_sequence_partition对总数不整除直接抛ValueError——均匀 sharding 还能让 all2all 自定义算子的 fake-impl 从输入 shape 符号化推导输出 shape。pad 的 mask 处理有个讲究原本没有 attention mask 时构造key-only padding maskshape(1, 1, T_padded)有效 key 为 1、pad 为 0沿 batch 与 query 广播——只占 O(T) 内存而不是物化稠密(B, T, T)矩阵。若用户传了(B, T, T)mask则 pad 的 query 行被允许 attend 所有有效 keysoftmax 才良定义输出反正会切掉但全 masked 行会产生 NaN。第三步 all2all 换头是自注意力每个 token 看到所有 token这一要求的解法Q/K/V 的 head 跨 rank 交换每个 rank 最终持有所有 token 的某一部分 head本地算完再洗回。这里点破忠实的来源all2all 只改变 token×head 二维数据的分布形态没有牺牲任何 token 间交互与单卡的唯一数值差异是浮点归约顺序内核只搬运字节往返gather(send(x)) x逐字节精确。说白了SP 不改模型行为只改硬件分布方式——要更低延迟下的单卡同结果它就是正确选择。all2all 直写策略与 SM 轮转分配通信原语ltx_kernels.All2All的 CUDA 实现在 all2all_heads.cu干了三件脏活直写经 CUDA-IPC peer buffer 直写目标 GPU 的内存 buffer免中间拷贝接近峰值内存带宽SM 轮转SM i 写 rank (i % world_size)。132 个 SM、8 张卡时rank 0–3 各 17 个、rank 4–7 各 16 个每组 SM 覆盖其目标 rank 的全部 tokenbarrier 同步搬完后各 SM 原子递增目标 rank 的 barrier 计数器SM 0 等齐所有 rank 的信号再复位计数器供下一轮等待超过超时周期默认 10 秒即触发死锁检测Python 侧用torch.library.custom_op注册send_recv_heads与gather_headstorch.compile含modereduce-overhead的 CUDA Graph 捕获能无 graph break 地 trace 过去custom_op(ltx_kernels::send_recv_heads, mutates_args(), device_typescuda) def _send_recv_heads_op(x, comm_id, world_size, copy_out): return All2All._runtime_registry[comm_id].send_recv_heads(x, copy_out)这里有个刻意的设计world_size作为 int 常量进算子Dynamo 的 guard 只按 GPU 数量键控编译缓存——同一个图绝不会在另一个 GPU 数量下被重放而每步变化的 per-rank token 数走set_rank_tokens下发到 C 运行时不经过算子。另外copy_outFalse时返回的是 IPC buffer 的零拷贝视图buffer 由cudaMalloc分配、不在静态图池内cudagraph_trees 下也安全实例销毁时由weakref.finalize自动释放 CUDA/IPC 资源。接入两个核心 APIAttentionManager 与 SequenceParallelBuilderAttentionManager 构造的四个要点attention.py 的AttentionManager持有 all2all buffer每 rankceil(max_tokens / world_size)个 tokenfrom ltx_core.multigpu.transformer.attention import AttentionManager attn_mgr AttentionManager( max_tokens32768, # 视频总 token 数上界 num_headsmodel_cfg[num_attention_heads], head_dimmodel_cfg[attention_head_dim], tensor_dtypepipeline.dtype, groupself.groups.transformer_group, )num_heads须被world_size整除redistribute中显式抛ValueError构造时才惰性 importltx_kernels让 multigpu 模块在未装内核的 CPU CI 上仍可导入内部创建 4 个All2All实例q / k / v / headscopy_out_True时 k、v 与 q 共用实例all2all_timeout_seconds默认 10.0s管理 barrier 死锁检测 超时属性对应一个真实坑torch.compile首次前向时某 rank 的重编译可能让它启动内核晚于稳态超时从而撞爆 barrier。应对写在 setter 注释里——首次 compile 前向临时调大超时之后再复位。Builder 包裹单卡 builder 的三步sp_builder.py 的SequenceParallelBuilder是包裹型 builder只接受SingleGPUModelBuilder否则TypeError构造与构建分三步pipeline.stage_1._transformer_builder SequenceParallelBuilder( innerpipeline.stage_1._transformer_builder, # 该 stage 的单卡 builder attn_mgrattn_mgr, registryregistry, # 进程内共享的 ModelRegistry trackertracker, # TransformerWeightTracker )注入把 registry 与 LoRA 加载设备cuda:当前设备注入 innermodule-ops 注入create_video_self_attention_module_ops匹配LTXModel对每个BasicAVTransformerBlock把attn1的attention_function换为All2AllAttention、masked_attention_function换为MaskedAll2AllAttentionvideo_to_audio_attn交叉注意力同理换成AudioAll2AllAttention/MaskedAudioAll2AllAttention。masked 槽位目前没有调用方死代码路径照样换掉——未来若有人加 maskSP 管线已就位不会静默绕过 All2Allbuild() 包裹经TransformerWeightTracker构建模型再包一层SequenceParallelModelWrapper返回。两类洗牌有差异视频自注意力的 Q/K/V 全走send_recv_heads本地算heads // world_size个 head 后再gather_heads洗回音频交叉注意力的Q 本地按 rank 切片、不跨 rank 洗牌音频序列短可复制仅 K/V 走 all2all输出沿 head 维all_gather_into_tensor收集。因为整个接入是包裹它继承 inner 的 checkpoint 路径、量化、编译与 LoRA 配置只叠加并行——这正是 MGPU 体系单卡管线 替换 builder的模式。max_tokens 上界、参考量级与报错语义max_tokens决定 all2all buffer 尺寸必须覆盖最大的那个 step。参考量级场景形状视频 token 数默认上界stage 1512×768×121≈ 614432768distilled full-res1024×1536×121≈ 2457632768三个 MGPU runner 都默认_DEFAULT_SP_MAX_TOKENS 32768。一旦超出SequenceParallelModelWrapper.forward抛出信息明确的ValueErrorUse a smaller resolution or fewer frames.需要更大上界时显式给sp_max_tokens传更大的值三个 MGPU runner 的setup()都接受该参数——同时留意 buffer 显存成本的同步放大。SP 运行前提与排错清单仅 LinuxNCCL 与 CUDA-IPC 是 Linux-only单节点 ≥2 张 P2PNVLink/PCIeCUDA GPU不支持多节点每 GPU 一个进程PyTorch 需带 CUDAuv sync --group kernels构建 ltx-kernels需 nvcc gcc 或 clang头数整除卡数heads % world_size ≠ 0 抛 ValueErrortoken 数不整除卡数pad 自动处理无需干预首次 compile 撞 barrier 超时临时调大 all2all_timeout_seconds⚠️ 看到 Use a smaller resolution or fewer frames. 不是 bug是保护降分辨率/帧数或调大sp_max_tokens。 选型口诀分布内求忠实 → SPupscale-only → TDP单文本编码器放不下 → 分布式 Gemma。下一步先跑哪个 runner想上手直接跑ti2vid_two_stages_mgpu的 CLI完整示例见 multigpu 文档SP 负责 stage 1、TDP 负责 stage 2一条管线内能看到两种策略协作。要看 SP 用同一个包裹覆盖 half-res 与 full-res 两次调用再看distilled_mgpu。token 切分、all2all 换头、gather 还原、AttentionManager 管 buffer、Builder 包裹接入——这 5 个要点吃透后写自定义 MGPU runner 只是拼装工作。【免费下载链接】LTX-2Official Python inference and LoRA trainer package for the LTX-2 audio–video generative model.项目地址: https://gitcode.com/GitHub_Trending/lt/LTX-2创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表