Skip to content

修复 as_strided 转换规则:字节 offset 换算为元素 offset - #722

Open
feixi139 wants to merge 1 commit into
PFCCLab:mainfrom
feixi139:fix-as-strided-offset-rule
Open

修复 as_strided 转换规则:字节 offset 换算为元素 offset#722
feixi139 wants to merge 1 commit into
PFCCLab:mainfrom
feixi139:fix-as-strided-offset-rule

Conversation

@feixi139

Copy link
Copy Markdown
Collaborator

背景

paddle.as_stridedoffset字节计,torch.as_stridedstorage_offset元素计。原 mapping 用 paddle_torch_args_mapoffset 直接透传给 storage_offset,两者单位不同,offset != 0 时 Paddle 侧和 Torch 侧从不同位置开始取数,比较结果没有意义(float32 下起点相差 4 倍,float64 下 8 倍),且不会报错,属于静默错位。

此外 paddle.Tensor.as_strided 在 mapping 中缺失。

修改内容

  • tester/paddle_to_torch/mapping.json
    • paddle.as_strided 由通用参数映射改为 "Rule": "AsStridedRule"
    • 新增 paddle.Tensor.as_strided 条目,同样指向 AsStridedRule
  • tester/paddle_to_torch/rules.py
    • 新增 AsStridedRule:在 preprocess 中用 x.element_size() 把字节 offset 换算为元素 offset;对负数或未按 itemsize 对齐的 offset 提前抛 ValueError,避免以错误单位静默产出结果;函数式调用走 torch.as_strided(input=x, ...),方法式走 x.as_strided(...)
  • tester/api_config/11_fix_op/as_strided_unfold_overlap_grad.txt(新增,31 条)
    • paddle.as_strided 18 条、paddle.Tensor.as_strided 2 条、paddle.unfold 11 条;覆盖重复 stride (1,1)、零 stride (0,0) / (1,0)、带 offset、float32/float64/float16/bfloat16/complex64/complex128,以及 step < size 的 unfold,并含非重叠对照配置。
    • 用途是复现 Paddle 侧重叠视图反向梯度被覆盖写而非累加的缺陷。其中带 offset 的配置依赖本 PR 的单位换算才有比较意义。

验证

以下命令在本分支上实际执行并通过:

  • pre-commit run --files tester/paddle_to_torch/mapping.json tester/paddle_to_torch/rules.py tester/api_config/11_fix_op/as_strided_unfold_overlap_grad.txt
    首轮 ruff format 自动重排了 rules.py 一处换行,复核 diff 后重跑,全部 hook 通过。
  • python -m py_compile tester/paddle_to_torch/rules.py
  • git diff --check
  • get_converter() 完成全量 mapping 校验(该校验会检查每个条目声明的 Rule 名与注册表一致),两个新条目均解析到 AsStridedRule;生成的 preprocess / core 均可编译。
  • 端到端换算实测:float32 + offset=4 字节 → storage_offset=1;float64 + offset=16storage_offset=2;方法式 offset=00offset=1(未对齐)按预期抛 ValueError

未执行:新增语料尚未在本分支上跑 engineV4.py。该语料此前在另一 checkout 上用未修复的 Paddle 跑过(GPU 7 pass / 24 fail、CPU 6 pass / 25 fail),用于确认它能暴露 Paddle 侧缺陷;对应的 Paddle 修复尚未合入,因此本 PR 不声明语料全绿。

Paddle 的 offset 以字节计,Torch 的 storage_offset 以元素计,原映射直接
透传导致 offset 非 0 时两侧起点不同,比较结果无意义。新增 AsStridedRule
完成单位换算并拒绝负数或未按 itemsize 对齐的 offset,同时补上缺失的
paddle.Tensor.as_strided 条目。附带用于覆盖重叠视图反向的语料。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant