用途:ShardTensor(physicsnemo.domain_parallel)是 torch.Tensor 的子类,用于域并行——把单个样本的空间/序列维度切分到多张 GPU,以便处理单卡放不下的输入。与 DTensor 不同,它支持不均匀分片(分片形状记录在 ShardTensorSpec._sharding_shapes)。
主要能力:ShardTensor 直接继承 torch.Tensor,普通 nn.Module 可原样运行;普通权重与分片激活相遇时自动提升为 Replicate DTensor 参与计算,反向时权重梯度在 domain mesh 上做 all-reduce。因此不要调用 distribute_module,不要整体转换模型权重,也不要修改 forward()。
使用方式:初始化 DistributedManager,用 initialize_mesh(mesh_shape=(ddp_size, domain_size), mesh_dim_names=["ddp", "domain"]) 显式建立两个轴;用 scatter_tensor 把输入散布到 domain mesh(如 Shard(2) 切 H 维),标签通常用 Replicate。硬性约束:每个 domain group 的 batch size 必须为 1,batch 只能沿 ddp 轴扩展。数据并行包装选择:仅 domain(ddp=1)用 none 并在启动时广播参数;仅 ddp 用 DistributedDataParallel;参数为普通张量时用 DDP;参数分片或空间参数为 DTensor 时用 FSDP2 的 fully_shard(model, mesh=ddp_mesh)。不要使用 FSDP1。domain_size>1 时需手动在 domain 组内广播权重。
torch.compile:domain_size>1 时须分区编译,注意 attention 不能进入编译区,传 dynamic=False,输入尺寸变化之间调用 torch._dynamo.reset()。
适用场景:物理类工作负载的激活空间/序列分片;LLM 的张量/流水并行不在范围内。
限制与排错:单卡训练、安装与环境搭建、通用 PyTorch DDP/FSDP 调试不使用本指南;模型/数据管道选择见 physicsnemo-discover。注意 in-place requires_grad_ 无效、TypeError 信息可能掩盖真实异常、foreach 优化器需按 device_mesh 拆分参数组等坑。新增算子可注册 handler,测试须用 numerical_shard_tensor_check 且 check_grads=True。