ValueError: The value [Tensor(shape=[64640, 3584], dtype=Float32, value=...)] ,
its name 'weight' already exists. Please set a unique name for the parameter.
File ".../hyper_parallel/core/dtensor/dtensor.py", in _replicate_submodule_params_buffers
new_param = _distribute_module_new_parameter(param_name, dt, requires_grad)
问题简述 (Summary)
在 MindSpore 后端下,
distribute_module的复制路径(_replicate_submodule_params_buffers)用
module_prefix + 局部 key拼出新参数名,而没有沿用参数自身已经全局限定的param.name。对叶子模块调用
distribute_module时module_prefix为空,新参数名退化为裸局部 key(如
"weight")。由于 MindSpore 要求参数名全局唯一,当多个叶子模块都走这条复制路径时,第二个就会报
its name 'weight' already exists。使用场景 (Use case)
pynative 模式下用
distribute_module做张量并行 / 专家并行。两种常见写法都会触发:NoParallel/SequenceParallel)传
partition_fn=None,让distribute_module把所有参数复制成 DTensor;partition_fn只覆盖了部分参数,其余参数交给内置 replicate pass。在一个有多个叶子线性/嵌入/归一化层的真实模型(例如 DeepSeek-V3)上,TP/EP 初始化阶段必现。
根因 (Root cause)
hyper_parallel/core/dtensor/dtensor.py的_replicate_submodule_params_buffers:param_name = f"{module_prefix}.{key}" if module_prefix else key new_param = _distribute_module_new_parameter(param_name, dt, requires_grad)module_prefix来自cells_and_names(),是相对于传入distribute_module的那个模块的路径。当
distribute_module直接作用在叶子模块上时,其根的module_prefix == "",于是param_name退化为裸局部 key("weight")。_distribute_module_new_parameter在 MindSpore 分支用该名字构造Parameter(dtensor, name=param_name, ...):if platform.platform_type == PlatformType.MINDSPORE: return platform.Parameter(dtensor, name=key, requires_grad=requires_grad)PyTorch 的
Parameter不依赖全局名字(靠 module 属性槽位 + 层级识别),所以无碍;但 MindSpore 的
Parameter.name必须全局唯一,多个叶子都被重命名为"weight"→ 冲突。错误栈 (Error)
(出现在第二个被复制的叶子模块上;第一个叶子把
"weight"占用后,第二个再注册同名即报错。)期望行为 (Expected)
复制(以及分片)重建参数时,MindSpore 下应沿用参数自身已限定的
param.name,而不是用相对
module_prefix重新拼。PyTorch 无name时再退回构造名。建议修复 (Suggested fix)
_replicate_submodule_params_buffers优先取param.name:param_name = getattr(param, "name", None) or ( f"{module_prefix}.{key}" if module_prefix else key ) new_param = _distribute_module_new_parameter(param_name, dt, requires_grad)ColwiseParallel/RowwiseParallel的_partition_*_fn同理改用param.name。环境 (Environment)
0c28158