已关闭
[Requirement|需求建议]: 950新增Col2ImV2算子 #843
xuejinghui创建于  8 天前关闭于  7 天前
xuejinghui成员
8 天前 创建

Thanks for sending an requirement! Please fill in the following template to help quickly solve your problem.

一、背景信息(必填)
新增图模式算子 Col2ImV2(col2im/fold 计算),将按滑窗展开排列的列数据重排组合为图像张量:输入 3-D (n, ckHkW, ho*wo),输出 4-D (n, c, outH, outW),重叠滑窗位置的值累加到同一输出像素,未被任何滑窗覆盖的位置补零。

解决的问题:

兼容性:该算子兼容 ONNX Col2Im(opset 18),功能与 PyTorch torch.nn.functional.fold(torch._C._nn.col2im)完全相同。老芯片(910b/910_93)上无独立 kernel,图编译时被 Col2ImV2FusionPass(FORBIDDEN_CLOSE)无条件改写为 Reshape + Col2im 由 v1 算子执行;ascend950 无融合 pass 机制,融合路径不可用,ONNX 模型中的 Col2Im 节点在 950 上无法编译执行,必须开发本体 kernel。
动态 shape:融合方案需在编译期对通道维做除法构造 Reshape,无法支持动态 shape 图;本体 kernel 通过 cIm = idx/(outHoutW) 合并 nc 通道线性化索引,直接消费 3-D 输入,无需前置 Reshape,天然支持动态 shape。
二、价值/作用(必填)
打通 ONNX Col2Im 在 950 的图编译通路:ONNX 插件 col2imv2_plugin 将 ai.onnx::18::Col2Im 解析为图内 Col2ImV2 节点,本体 kernel 落地后该类模型可直接在 950 上编译运行。
典型应用场景:窗口注意力(Swin 类网络 window reverse)、可变形卷积、图像分块处理流水线(unfold→transform→fold 的 overlap-add 重建)、扩散模型中 patch 重组等 im2col 逆变换场景。
确定性实现:输出 centric 固定顺序累加,无 atomicAdd,结果可复现;重叠累加采用 fp32 提升累加(对齐 GPU col2im_device 语义),兼顾数值精度与跨平台一致性。
三、设计方案(必填)
3.1 使能方式
图模式调用(GEIR):唯一入口。ONNX 模型经 ONNX 插件解析为 Col2ImV2 节点 → 图编译 → kernel 执行
无 aclnn 接口:PyTorch col2im 在 torch_npu 中走 Col2im(v1)aclops 通路(op-plugin Col2imKernelNpu.cpp),不经 Col2ImV2,无 PyTorch 适配需求
无 TF 通路
3.2 总体设计
3.2.1 算子支持的数据类型
参数 类型 dtype format
x(输入) Tensor,3-D (n, ckHkW, ho*wo) float32 / float16 ND
output_size(输入) const Tensor,长度 2,值依赖 int32 ND
kernel_size(输入) const Tensor,长度 2,值依赖 int32 ND
y(输出) Tensor,4-D (n, c, outH, outW),dtype 与 x 相同 float32 / float16 ND
dilation / padding / stride(属性) REQUIRED ListInt,长度 2 — —
dtype 组合严格按 canndev REG_OP(Col2ImV2) 原型(transformation_ops.h:959),共 2 组,不增强 bf16。InferDataType:y.dtype = x.dtype。

3.2.2 host侧设计
Infershape(rt2.0):任一输入 unknown rank → 输出 unknown rank;unknown shape → c 维 -1 传递;读取 output_size/kernel_size const 值(InputsDataDependency({1,2})),推导 y = (x[0], x[1]/(kH*kW), outH, outW),含除零保护
Tiling:完整输入校验(dtype/shape/attr 值域/跨参数整除与 howo 一致性);两步法核数划分 + PER_CORE_MIN=1024 抬升(小 shape 收敛核数);INT32_MAX 值域防护(outHW/totalLength);单一场景 TilingKey;TilingInputsDataDependency({1,2});外部输入校验日志使用 OP_LOGE_FOR_ 系列
原型:op_graph/col2_im_v2_proto.h 独立 REG_OP(3 个 REQUIRED_ATTR),与 canndev 完全一致
3.2.3 kernel侧设计
SIMT 单 kernel、输出 centric、Grid-Stride 并行:

// 伪代码(每线程处理一个输出元素 idx,输出 centric)
colH = (outH + 2padH - dilH(kH-1) - 1) / strideH + 1 // VF 内自算,复用 stride 快除
colW = 同理
for idx in grid_stride(totalLength): // ncoutHoutW 个输出元素
wIm = idx % outW + padW
hIm = idx / outW % outH + padH // UintDiv 快除(4 组 magic/shift,Process 预计算)
cIm = idx / (outH
outW) // nc 合并通道,直接消费 3-D 输入
acc = 0.0f // fp32 提升累加器
for hK in [0, kH): // kernel offset 字典序正推
if hIm < hK
dilH: continue // 防无符号下溢
hCol = (hIm - hKdilH) / strideH
if 不整除 or hCol >= colH: continue
for wK in [0, kW): // 同理
acc += x[((cIm
kH + hK)kW + wK)howo + hColwo + wCol] // uint64 偏移防溢出
y[idx] = static_cast<D_T>(acc) // 写回单次舍入

关键特性:每线程独占一个输出元素,无 atomicAdd、确定性可复现;重叠累加为 fp32 提升累加 + 写回单次舍入(GPU col2im_device 语义);1024 线程编译期常量;空 batch(n=0)短路。

3.3 支持硬件
Ascend 950PR / 950DT(AICore AddConfig("ascend950"),arch35 tiling + SIMT kernel)
README 声明同步支持 Atlas A2 / Atlas A3 系列产品
3.4 算子约束限制
dtype:仅 float32/float16,不支持 bf16/整型(严格按 REG_OP 原型)
format:仅 ND,无 NC1HWC0 语义
rank:x 仅 3-D,y 仅 4-D;output_size/kernel_size 仅 1-D 长度 2 的 const tensor(值依赖输入,编译期必须已知)
跨参数约束:x.dim(1) 必须被 kHkW 整除;x.dim(2) 必须等于 howo(ho=(outH+2padH-dilH(kH-1)-1)//strideH+1)
值域:dilation/stride 元素 >0,padding 元素 ≥0,output_size/kernel_size 元素 >0;totalLength 等派生量 ≤ INT32_MAX
数值语义说明:重叠累加为 fp32 提升累加(GPU col2im_device 语义),与 CPU 版 col2im(逐 dtype 逐步舍入)在 fp16 高重叠场景存在 ~1 ULP 级偏差,数学等价
无 aclnn/aclfop 接口,仅图模式调用;不支持广播语义(本算子无广播需求)
💡 备注(选填)

测试情况:TTK 上板(Ascend950PR)黑盒 84 + 白盒 297 = 381 条用例;三方 golden 为 torch F.fold(含 spec 注册,tolerance 浮点 cross_check / 整型 binary_equal)
关联 MR:cann/ops-cv!1397(分支 add_col2_im_v2)
交付件:SE/MDE 文档、spec.yaml、黑盒/白盒用例、UT(host 6 + kernel 2)、GEIR example、README 齐全

likedislike
Xxuejinghui成员
8 天前 添加了label:requirement
Xxuejinghui成员
8 天前 修改了issue 的描述
Xxuejinghui成员
8 天前 修改标题为 “[Requirement|需求建议]: 950新增Col2ImV2算子”,原标题为“[Requirement|需求建议]: ”
xuejinghui成员
8 天前 评论:

/assign

likedislike
CANN-robotCANN-robot成员
8 天前 将 xuejinghui 设为负责人
CANN-robotCANN-robot成员
7 天前 关闭了 issue
CANN-robotCANN-robot成员
7 天前 添加了label:resolved