LTX-2 序列并行拆解:token 切分、all2all 换头与 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
多卡跑 121 帧视频,单步延迟卡在哪
生成 121 帧视频时,单张 GPU 要扛下每个 denoising step 里几千个 token 的全局注意力,延迟瓶颈就在这一步。多 GPU 推理里的序列并行(Sequence Parallelism,SP)把 token 序列切到多卡上,all2all 内核负责在卡间交换注意力头,让每一步的耗时摊到整组卡。
token 切片、换头、gather 还原:数据在卡间怎么流转
每个 denoising step 的 forward 走同一条链路(sequence_parallel.py):
- 补齐:
pad_modality_for_uniform_sharding把 seq 维补到 world_size 的整数倍。无 mask 时构造 (1, 1, T_padded) 的 key-only padding mask(O(T) 内存,不物化 (B, T, T) 矩阵);用户的 (B, T, T) mask 则扩出 pad 行/列,pad 的 query 行保留对有效 key 的可见性,防止全 masked 行算出 NaN。 - 切分:
compute_sequence_partition强制 total_tokens 整除 world_size,否则 ValueError——均匀 sharding 让 all2all 自定义算子的 fake-impl 能从输入 shape 推导输出 shape(×world_size 或 //world_size),不依赖 Python int 参数。tile_modality_for_rank随后把 latent / timesteps / positions 切到本 rank 切片。 - 换头:
attn1的 Q/K/V 经send_recv_heads交换,每个 rank 拿到全部 token × heads/world_size 个本地 head,就地算注意力,gather_heads再换回;video→audio 交叉注意力的 Q 序列小,本 rank 直接切片、不做跨卡洗牌,仅 K/V 走交换。 - 还原:
gather_output_tokens把本地输出 pad 到最大长度做 all_gather,按各 rank 真实 token 数裁剪拼接,再 unpad 回调用方的原始长度。
全局注意力没有变,只是分布方式变了:all2all 只做 token×head 的分布变换,往返 gather(send(x)) == x 逐字节精确,差异仅在浮点归约顺序。同时 MGPU 是延迟工具而非显存工具——每 rank 仍持有完整模型副本,SP 额外分摊的是激活内存。
all2all 内核如何做到零拷贝:CUDA-IPC 直写与 SM 轮转
内核(all2all_heads.cu)里的每个设计都对应一个具体问题:
- 直写——解决中间拷贝:每块 GPU 经 CUDA-IPC 把数据直接写进目标 GPU 的 buffer,带宽接近峰值;约束是依赖 P2P(NVLink/PCIe)、仅限单节点,IPC 对端上限 8 卡(
MAX_NUM_PEERS)。 - SM 轮转——解决 SM 数不整除卡数:SM i 写 rank (i % world_size),132 个 SM、8 张卡时 rank 0–3 各 17 个、rank 4–7 各 16 个,每组 SM 以 strided 方式覆盖目标 rank 的全部 token。
- barrier——解决"搬运何时算完成":写完后每个 SM 原子递增目标 rank 的 barrier 计数器,SM 0 等齐所有 rank
【免费下载链接】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),仅供参考