已合并
修复logspace算子报错信息不一致和非连续精度问题 #4235
修复logspace算子报错信息不一致和非连续精度问题 #4235
已合并
maoyuanpeng1创建于 2月10日
maoyuanpeng1
2月10日

【合入来源】

https://gitcode.com/Ascend/pytorch/issues/1546

API一致性问题:

  1. logspace算子未正确报错。当start或end为复数,dtype为非复数时,应该报错。
  2. logspace.out算子精度问题。当输入的out其shape不等于steps且非连续时计算结果有错误。
  3. linalg.qr算子报错信息与原生torch不一致。当输入不是一个matrix,报错信息不一致。

【修改方案】

问题一:

复现脚本:

with self.assertRaisesRegex(RuntimeError, r"torch.logspace\(\): inferred dtype"):
                torch.logspace(0, 1j, 5, device=device, dtype=dtype)

原因
原生logspace算子走的是组合算子流程。

- func: logspace(Scalar start, Scalar end, int steps, float base=10.0, *, ScalarType? dtype=None, Layout? layout=None, Device? device=None, bool? pin_memory=None) -> Tensor
  dispatch:
    CompositeExplicitAutograd: logspace

原生实现:

Tensor logspace(
    const Scalar& start,
    const Scalar& end,
    int64_t steps,
    double base,
    std::optional<ScalarType> dtype,
    std::optional<Layout> layout,
    std::optional<Device> device,
    std::optional<bool> pin_memory) {
  // See [Note: hacky wrapper removal for TensorOptions]
  TensorOptions options =
      TensorOptions().dtype(dtype).layout(layout).device(device).pinned_memory(
          pin_memory);

  TORCH_CHECK(steps >= 0, "number of steps must be non-negative");
  auto result_options =
      linspace_logspace_infer_options(start, end, options, "torch.logspace()");
  Tensor result = at::empty({steps}, result_options);
  return at::logspace_out(result, start, end, steps, base);
}

原生实现在linspace_logspace_infer_options进行了类型检测,并最终调用了empty和logspace_out算子。

解决方法
删除 aten::logspace 在 privateuse1 上的注册和实现,改为复用原生 torch 在 CompositeExplicitAutograd 上的实现。

问题二:

复现脚本:

x = torch.zeros(2, 3, device='npu', dtype=torch.float32)
torch.logspace(0, 3, 4, base=2, out=x.narrow(1, 1, 2))
x结果应为[[0, 1, 2[, [0, 4, 8]],但结果为[[0, 1, 2[, [4, 8, 0]]

原因
out=x.narrow(1,1,2) 是一个非连续视图,元数据是 size=[2,2], stride=[3,1], storage_offset=1,正确写入位置应是物理索引 [1,2,4,5]
当前实现里 CheckOut(..., {steps})out.shape != {steps} 时会触发 resize_,把 out 重排成一维连续张量(stride 变成连续),写入映射变成 [1,2,3,4]
因此 4,8 被写到了第二行前两列,结果变成 [[0,1,2],[4,8,0]],而不是 [[0,1,2],[0,4,8]]。本质是 resize_ 破坏了原非连续视图的 stride 语义。

解决方法:

  1. 只在 out.numel() != steps 时才 out.resize_({steps})(容量不匹配才重置)。
  2. out.numel() == steps 时保持原 out 的 shape/stride,不要改元数据;
  3. LogSpaceD 对输出要求为1维,当out不为1维时,使用view生成临时1维张量。

问题三:

解决方法
优化 linalg_qr 在输入维度 <= 2 时的报错信息。

【资料变更】

请确认是否涉及资料变更。如涉及,需要在PR中体现,并简要说明修改内容。如不涉及,需填写“不涉及”

【接口变更】

请确认是否涉及跨代码仓或者客户面可见的接口变更。如涉及,需要详细说明接口以及对应的变更内容,同时需要在资料中体现。如不涉及,需填写“不涉及”

【功能验证】

说明测试场景,测试方法。如果本次测试方式与常规单元测试不同,请详细说明您的测试步骤
新增/变更内容是否已新增/适配UT测试用例看护,并补充测试自验证截图

【CheckList】

PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x]

likedislike
Pull Request已成功合入, 合并人@ascend-robot
(感谢 maoyuanpeng1 的贡献)
Mmaoyuanpeng1
2月10日 创建了 pull request,commit a0a62450
ascend-robot
ascend-robot成员
2月10日 评论:

Thanks for your pull-request.
The full list of commands accepted by me can be found at here.
You can get sig-info at here

以下是根据您提交的修改文件推荐的Reviewer和Committer序列,需各模块评审通过后方可合入.

Module List Reviewers Committers
repo-Ascend/op-plugin li_jing_hw, liwei386, zqwenn, wanglijun55, dilililiwhy zqwenn, guoqi1024, wangmin0104, liwei386, shaoyf
likedislike
Mmaoyuanpeng1
2月10日 修改了pull request 的描述
Mmaoyuanpeng1
2月10日 修改了pull request 的描述
此处折叠了111条消息 查看更多
Mmaoyuanpeng1
2月13日 修改了pull request 的描述
wangmin0104
wangmin0104成员
2月13日 评论:

/approve

likedislike
ascend-robotascend-robot成员
2月13日 添加了label:approved
ascend-robot
ascend-robot成员
2月13日 评论:

Review Guide

This pull-request passes review.
Committers who wrote a comment of /approve are: wangmin0104.
Reviewers who wrote a comment of /lgtm are: liangsongwei, wanglijun55, liangchenghui, wangmin0104.

likedislike
ascend-robotascend-robot成员
2月13日 合入了pull request