| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
fix(foreach): 修复ContiguousHelper对参数融合子视图误判跳过Contiguous的问题 Co-authored-by: luoyufan7<luoyufan7@h-partners.com> # message auto-generated for no-merge-commit merge: !7495 merge 0714 into master fix(foreach): 修复ContiguousHelper对参数融合子视图误判跳过Contiguous的问题 Created-by: luoyufan7 Commit-by: luoyufan7 Merged-by: cann-robot Description: ## 描述 ForeachMakeContiguousTensorList / ForeachViewCopyToOutputTensorList 原先仅用 op::IsContiguous 判断是否需要转连续,该接口只检查 view strides 连续性,不感知 storage_shape 和 view_offset。 参数融合场景下(多个参数视图共享同一块大 buffer),tensor 的 view strides 连续但 storage_shape 为整个大 buffer 大小(远大于 view 元素数)、view_offset 非零。IsContiguous 返回 true 导致 helper 错误跳过 Contiguous,传给 tiling 的 storage_shape 仍为大 buffer,与独立分配的输入 storage_shape 不匹配,触发 CheckInputTensorlistShape 报错(The shapes of 0th tensor in tensor list input 1 and input 0 must be the same)。 改动方法: - ForeachMakeContiguousTensorList:跳过条件从 IsEmpty || IsContiguous 加强为 IsEmpty || (IsContiguous && storageShapeSize == viewShapeSize),子视图(storage 为共享大 buffer)强制走 l0op::Contiguous 转为独立连续 tensor - ForeachViewCopyToOutputTensorList:ViewCopy 条件同步调整为与上述判断严格互补,确保被 Contiguous 的输出一定会回写 影响范围:所有使用该 helper 的 foreach 算子(add_list、mul_list、div_list、lerp_scalar、lerp_list、addcdiv_scalar、addcdiv_scalar_list、sqrt、div_scalar 等),标准连续 tensor 和标准非连续 tensor 行为不变。 ## 关联的Issue ## 测试 - 逻辑分析覆盖空 tensor、标准连续、参数融合子视图、非连续(permute/transpose)四类状态,确认跳过/Contiguous/ViewCopy 路径正确 - 待在 NPU 环境复现参数融合场景验证 tiling 不再报错且结果正确 ## 文档更新 无 ## 类型标签 - [x] Bug修复 ## AI/Agent生成声明 - [x] AI辅助编写 See merge request: cann/ops-nn!7495 | 1 个月前 | |
【社区任务】ForeachExpm1支持int16/int8/uint8实现贡献 Co-authored-by: run-op-test<runoptest@163.com> # message auto-generated for no-merge-commit merge: !5214 merge submit-ForeachExpm1 into master 【社区任务】ForeachExpm1支持int16/int8/uint8实现贡献 Created-by: run-op-test Commit-by: run-op-test Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> ## 一、 需求背景 ### 1.1 需求来源 通过社区任务完成开源仓算子贡献的需求,补充完善 Ascend C 算子库。为现有的 aclnnForeachExpm1 算子增加对 DT_INT16、DT_INT8、DT_UINT8 数据类型的支持,以满足更广泛的网络量化及端侧推理场景对底层核心算子的完备性要求。 ### 1.2 背景介绍 ForeachExpm1 算子用于对张量列表(Tensor List)执行逐元素的 $y = e^x - 1$ 运算。由于在 $x$ 接近 $0$ 时,$e^x - 1$ 的直接计算易导致精度丢失,该算子能提供比组合算子更好的数值稳定性。 根据最新算子原型定义,当前算子已支持 FLOAT16、FLOAT32、BFLOAT16。本项目要求在现有代码架构下,新增对 INT16、INT8、UINT8 数据的支持。 **关键架构决策**: 考虑到 foreach 模块是高度抽象的通用框架,为兼顾精度与底层指令的泛化性,对于新增的整型类型,采用精度提升(Cast)机制: * **int16_t**:Cast 至 float(float32)进行高精度计算,计算完毕后通过 CAST_RINT 截断回 int16_t。 * **int8_t / uint8_t**:Cast 至 half(float16)进行计算,计算完毕后截断回 int8_t / uint8_t。 ## 二、 需求分析 ### 2.1 外部组件依赖 * 依赖 Ascend C 的 Cast API 提供低比特整型与 float / half 之间的精度双向转换及饱和截断机制。 * 依赖原有的 Expm1Adapter(组合 Exp 与 Adds)进行核心逻辑的运算。 * 依赖现有的 ForeachImplictOutput 通用隐式输出模板框架。 ### 2.2 内部适配模块 | 模块 | 变更项 | 说明 | | --- | --- | --- | | op_host | foreach_expm1_def.cpp | 扩展原型 tensor_dtype_list,新增 DT_INT16/DT_INT8/DT_UINT8。更新硬件配置为 ascend910_93 和 ascend910b。 | | op_host | foreach_tiling_func.cpp | **修改 UB 切分策略**:int16_t 按照 float (4 Bytes) 预留中间缓存;int8_t/uint8_t 按照 half (2 Bytes) 预留中间缓存。 | | op_kernel | foreach_expm1.cpp | 新增 TILING_KEY_IS 路由分支:5 路由至 float 适配器;7、8 路由至 half 适配器。 | | op_kernel | foreach_implict_output.h | 扩展 InnerComputer 模板特化,新增整型转浮点型进行运算的流水线拆分。 | | op_kernel | kernel_foreach_unary.h / base.h | 补充 INT16/INT8/UINT8 类型映射,支持对应的 COPY_SPACE_MULTIPLE(临时转换缓冲)分配逻辑。 | ## 三、 需求详细设计 ### 3.1 使能方式 | 上层框架 | 涉及的框架勾选 | | --- | --- | | TF训练/推理 | | | Pytorch训练/推理 | | | ATC推理 | | | Aclnn直调 | ✅ | ### 3.2 算子原型设计 修改 op_host/foreach_expm1_def.cpp,同步更新数据类型,并根据任务约束**严格限制硬件架构注册**: cpp explicit ForeachExpm1(const char* name) : OpDef(name) { std::vector<ge::DataType> tensor_dtype_list = { ge::DT_FLOAT16, ge::DT_FLOAT, ge::DT_BF16, ge::DT_INT16, ge::DT_INT8, ge::DT_UINT8 // 新增 }; std::vector<ge::Format> format_list(tensor_dtype_list.size(), ge::FORMAT_ND); this->Input("x") .ParamType(DYNAMIC) .DataType(tensor_dtype_list) .Format(format_list) .UnknownShapeFormat(format_list) .AutoContiguous(); this->Output("y") .ParamType(DYNAMIC) .DataType(tensor_dtype_list) .Format(format_list) .UnknownShapeFormat(format_list) .AutoContiguous(); // 仅保留 A2/A3 对应的架构 this->AICore().AddConfig("ascend910_93"); this->AICore().AddConfig("ascend910b"); } ### 3.3 详细设计 #### 3.3.1 Host 侧设计:UB 切分策略修改 在 foreach_utils/op_host/foreach_tiling_func.cpp 中,负责 UB 切分的逻辑需根据计算载体预留内存: 1. **DT_INT16 (Key 5)**:计算中转为 float,需将其切分参数及 COPY_SPACE_MULTIPLE 视作 float 处理,保证单次 Tile 计算时有充足的 4 Bytes 中转空间。 2. **DT_INT8 (Key 7) / DT_UINT8 (Key 8)**:计算中转为 half,需将其切分参数及 COPY_SPACE_MULTIPLE 视作 half 处理,保证单次 Tile 计算时有充足的 2 Bytes 中转空间。 #### 3.3.2 Kernel 侧设计 **3.3.2.1 新增 TilingKey 分支** 在 foreach_expm1.cpp 中,补充基于上述架构决策的分发逻辑: cpp // ... 前置的 FLOAT16(1), FLOAT32(2) 分支 ... #if __CCE_AICORE__ >= 220 && !(defined(__NPU_ARCH__) && (__NPU_ARCH__ == 3003 || __NPU_ARCH__ == 3113)) else if (TILING_KEY_IS(4)) { ForeachImplictOutput<bfloat16_t, float, Expm1Adapter<float>, 2, 1> op; op.Init(x, y, userWS, &tilingData); op.Process(); } else if (TILING_KEY_IS(5)) { // int16_t 提升至 float 计算 ForeachImplictOutput<int16_t, float, Expm1Adapter<float>, 2, 1> op; op.Init(x, y, userWS, &tilingData); op.Process(); } else if (TILING_KEY_IS(7)) { // int8_t 提升至 half 计算 ForeachImplictOutput<int8_t, half, Expm1Adapter<half>, 2, 1> op; op.Init(x, y, userWS, &tilingData); op.Process(); } else if (TILING_KEY_IS(8)) { // uint8_t 提升至 half 计算 ForeachImplictOutput<uint8_t, half, Expm1Adapter<half>, 2, 1> op; op.Init(x, y, userWS, &tilingData); op.Process(); } #endif **3.3.2.2 扩展 InnerComputer 与底层头文件支持** 1. **foreach_implict_output.h**:仿照 bfloat16_t,补充针对 int16_t -> float、int8_t -> half、uint8_t -> half 的模板特化,利用双向 Cast 隔离原始数据与 Expm1Adapter 的计算环境。 2. **kernel_foreach_unary.h / kernel_foreach_base.h**:在基类的类型萃取中(如定义 TT 时),需补充新的逻辑,即当判定到 int16_t 时分配 float 缓冲,判定到 int8_t/uint8_t 时分配 half 缓冲,并正确启用 COPY_SPACE_MULTIPLE。 #### 3.3.3 Ascend C 侧运行流程图  ### 3.4 支持硬件 * **Atlas A2 训练系列产品 / Atlas A3 系列产品**(严格限定对应 ascend910_93 及 ascend910b)。 ### 3.5 算子约束与异常拦截机制 1. **构建拦截规则(严格防线)**:如果前端尝试下发未注册的类型组合,构建流程会立刻阻断并报错,**不会触发向 CPU 执行的回退(Fallback)机制**。因此要求 Host 侧配置与 Kernel 侧模板的实例化必须保持严格一致。 2. **泛化要求**:输入 x 与输出 y 在多维度(0~8维)、极值边界以及数据类型之间必须严格匹配,并支撑框架级的各种泛化 Shape 传入。 ## 四、 验收及可维可测标准 ### 4.1 精度与性能标准 * **精度标准**:满足 AscendOpTest 的默认阈值。 * **性能标准**:无。 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> 关联Issue #2983 ## 测试 <!--描述进行了哪些测试来验证你的改动。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> 更新了README.md、aclnnForeachExpm1.md文件 ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-nn!5214 | 1 个月前 | |
【社区任务】ForeachAddScalarV2 支持int16/int8/uint8实现贡献 Co-authored-by: run-op-test<runoptest@163.com> # message auto-generated for no-merge-commit merge: !5667 merge submit-foreachaddscalar into master 【社区任务】ForeachAddScalarV2 支持int16/int8/uint8实现贡献 Created-by: run-op-test Commit-by: run-op-test Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> ## 一、 需求背景 ### 1.1 需求来源 通过社区任务完成开源仓算子贡献的需求,补充完善 Ascend C 算子库。为现有的 aclnnForeachAddScalarV2 算子增加对 DT_INT16、DT_INT8、DT_UINT8 数据类型的支持,以满足网络量化及端侧推理场景对底层核心算子的完备性要求。 ### 1.2 背景介绍 ForeachAddScalar 算子用于对张量列表(Tensor List)执行逐元素的标量加法运算。其核心数学计算公式为: $y_i = x_i + \alpha$ 根据最新算子原型定义,当前算子已支持 FLOAT16、FLOAT32、INT32、BFLOAT16。本项目要求在现有代码架构下,新增对 INT16、INT8、UINT8 这三种整型数据的支持。 **关键架构决策**: 为了保持底层 InnerComputer 计算流的统一性与极简性,并兼顾精度,本设计采用精度提升(Cast)机制: * **int16_t**:统一转换(Cast)为 float (float32) 进行 Adds 处理,计算完成后截断回 int16_t。 * **int8_t / uint8_t**:统一转换(Cast)为 half (float16) 进行 Adds 处理,计算完成后截断回原 8-bit 类型。 ## 二、 需求分析 ### 2.1 外部组件依赖 * 依赖 Ascend C 的 Cast API 提供低比特整型与 float / half 之间的精度双向转换及饱和截断(CAST_RINT)机制。 * 依赖现有的 ForeachOneScalarBinary 通用单标量二元操作模板框架。 ### 2.2 内部适配模块 | 模块 | 变更项 | 说明 | | --- | --- | --- | | op_host | foreach_add_scalar_def.cpp | 扩展原型 DataType,新增 DT_INT16/DT_INT8/DT_UINT8。明确 scalar 的对应关系。 | | op_host | foreach_tiling_func.cpp | **修改 UB 切分策略**:int16_t 按照 float (4 Bytes) 预留;int8_t/uint8_t 按照 half (2 Bytes) 预留。 | | op_kernel | foreach_add_scalar.cpp | 新增 TILING_KEY_IS 路由分支:int16_t 路由至 float 适配器;int8/uint8 路由至 half 适配器。 | | op_kernel | foreach_one_scalar_binary.h | 扩展 InnerComputer 模板特化,新增整型转浮点型执行运算的双向转换流水线编排。 | | op_kernel | kernel_foreach_base.h<br> <br>kernel_foreach_unary.h | 补充底层基础模板对这三种整型的识别萃取及 COPY_SPACE_MULTIPLE 倍数控制。 | ## 三、 需求详细设计 ### 3.1 使能方式 | 上层框架 | 涉及的框架勾选 | | --- | --- | | TF训练/推理 | | | Pytorch训练/推理 | | | ATC推理 | | | Aclnn直调 | ✅ | ### 3.2 算子原型设计 ### 算子原型表格 该表格清晰界定了算子的输入输出类型、维度约束及格式要求。 | 名称 | 类别 | 数据类型 | Format | Shape | 说明 | | --- | --- | --- | --- | --- | --- | | **x** | 输入 | FLOAT16, FLOAT32, BF16, INT32, **INT16, INT8, UINT8** | ND | 0-8 维 | 输入张量列表,列表中所有 Tensor 类型需一致 | | **scalar** | 输入 | FLOAT16, FLOAT32, FLOAT32, INT32, **INT32, INT32, INT32** | ND | [1] | 待加的标量值,与 Tensor 元素类型保持绑定 | | **y** | 输出 | FLOAT16, FLOAT32, BF16, INT32, **INT16, INT8, UINT8** | ND | 与 x 一致 | 输出张量列表,结果 $y_i = x_i + \alpha$ | 修改 op_host/foreach_add_scalar_def.cpp,同步更新数据类型并严格限制硬件架构: cpp explicit ForeachAddScalar(const char* name) : OpDef(name) { // 输入张量支持的 dtype 列表新增整型 std::vector<ge::DataType> tensor_dtype_list = { ge::DT_FLOAT16, ge::DT_FLOAT, ge::DT_INT32, ge::DT_BF16, ge::DT_INT16, ge::DT_INT8, ge::DT_UINT8 }; // 标量支持的 dtype 列表(BF16 对应 FLOAT,整型严格一一对应) std::vector<ge::DataType> scalar_dtype_list = { ge::DT_FLOAT16, ge::DT_FLOAT, ge::DT_INT32, ge::DT_FLOAT, ge::DT_INT32, ge::DT_INT32, ge::DT_INT32 }; std::vector<ge::Format> format_list(tensor_dtype_list.size(), ge::FORMAT_ND); this->Input("x") .ParamType(DYNAMIC) .DataType(tensor_dtype_list) .Format(format_list) .UnknownShapeFormat(format_list) .AutoContiguous(); this->Input("scalar") .ParamType(REQUIRED) .DataType(scalar_dtype_list) .Format(format_list) .UnknownShapeFormat(format_list) .AutoContiguous(); this->Output("y") .ParamType(DYNAMIC) .DataType(tensor_dtype_list) .Format(format_list) .UnknownShapeFormat(format_list); OpAICoreConfig membaseCfg; membaseCfg.DynamicCompileStaticFlag(true) .DynamicRankSupportFlag(true) .DynamicShapeSupportFlag(true) .ExtendCfgInfo("opFile.value", "foreach_add_scalar"); // 仅保留 A2/A3 对应的系列 this->AICore().AddConfig("ascend910b", membaseCfg); this->AICore().AddConfig("ascend910_93", membaseCfg); } ### 3.3 详细设计 #### 3.3.1 Host 侧设计:UB 切分策略修改 在 foreach_utils/op_host/foreach_tiling_func.cpp 中,负责 UB 切分的逻辑需根据中间计算类型分类处理: 1. **DT_INT16 (Key 5)**:由于在 V 单元内部必须先 Cast 成 float32 才能进行计算,因此在 Host 侧计算单次最大处理数据量(ub_size 和 tileDataNum)时,必须**按照 float32(4 字节)的内存诉求来预留和切分 UB 空间**。 2. **DT_INT8 (Key 7) / DT_UINT8 (Key 8)**:由于在 V 单元内部将 Cast 成 half (float16) 进行计算,必须**按照 half(2 字节)的内存诉求来预留和切分 UB 空间**。 两者均需应用相应的 COPY_SPACE_MULTIPLE 逻辑,确保中转所需的临时张量空间充足。 #### 3.3.2 Kernel 侧设计 **3.3.2.1 新增 TilingKey 分支** 在 foreach_add_scalar.cpp 中,增加针对三种新类型的入口调用。 cpp // ... 现有 FLOAT16, FLOAT32, INT32 分支 ... #if __CCE_AICORE__ >= 220 else if (TILING_KEY_IS(3)) { ForeachOneScalarBinary<int, int, AddsAdapter<int>, 1> op; op.Init(inputs, scalar, outputs, userWS, &tilingData); op.Process(); #if !(defined(__NPU_ARCH__) && (__NPU_ARCH__ == 3003 || __NPU_ARCH__ == 3113)) } else if (TILING_KEY_IS(4)) { ForeachOneScalarBinary<bfloat16_t, float, AddsAdapter<float>, 1> op; op.Init(inputs, scalar, outputs, userWS, &tilingData); op.Process(); } else if (TILING_KEY_IS(5)) { // int16_t 提升至 float 计算 ForeachOneScalarBinary<int16_t, float, AddsAdapter<float>, 1> op; op.Init(inputs, scalar, outputs, userWS, &tilingData); op.Process(); } else if (TILING_KEY_IS(7)) { // int8_t 提升至 half 计算 ForeachOneScalarBinary<int8_t, half, AddsAdapter<half>, 1> op; op.Init(inputs, scalar, outputs, userWS, &tilingData); op.Process(); } else if (TILING_KEY_IS(8)) { // uint8_t 提升至 half 计算 ForeachOneScalarBinary<uint8_t, half, AddsAdapter<half>, 1> op; op.Init(inputs, scalar, outputs, userWS, &tilingData); op.Process(); #endif } #endif **3.3.2.2 扩展 InnerComputer 模板特化** 在 foreach_one_scalar_binary.h 中补充特化。 * 针对 int16_t,引入 <int16_t, float, op> 的特化:Cast(floatTensor, int16_Tensor) -> Adds(floatTensor, scalar_float) -> Cast(int16_Tensor, floatTensor, CAST_RINT)。 * 针对 8-bit,引入 <int8_t, half, op> 及 <uint8_t, half, op> 的特化,使用 half 张量作为指令计算的中转站。 * **注意标量转换**:通过类型偏特化机制,将标量安全读取为内部的 TT 类型(即 float 或 half),防范底层编译器的 float = unsigned 非法转换拦截。 #### 3.3.3 Ascend C 侧运行流程图  ### 3.4 支持硬件 * **Atlas A2 训练系列产品 / Atlas A3 系列产品** (对应 ascend910_93 及 ascend910b)。 ### 3.5 算子约束与异常拦截机制 1. **构建阻断拦截**:如果在前端执行或编译期发现未注册的类型组合(例如输入 dtype 不在定义的列表内),构建流程将直接报错失败,**绝不触发降级至 CPU 的回退机制**。原型库 (op_def)、Tiling 策略与 Kernel 侧的泛型分支必须维持强一致闭环。 2. **张量类型一致性**:输入的 x 张量列表、scalar 标量张量、输出的 y 张量列表在对应维度上的数据类型必须完全匹配。 ## 四、 验收及可维可测标准 ### 4.1 精度与性能标准 * **精度标准**:满足 AscendOpTest 默认阈值。由于整型算子底层全部执行提权计算,整数运算的期望基准应为: * int16_t:转化为 float64/float32 -> 计算 $x_i + \alpha$ -> 采用 round 四舍五入 -> 执行 int16_t 边界的饱和截断。 * int8/uint8:转化为 float16 -> 计算 $x_i + \alpha$ -> 采用 round 四舍五入 -> 执行目标数据类型边界的饱和截断。 * **性能标准**:增加类型的吞吐率应对齐已有涉及双向 Cast 操作的 BFLOAT16 方案,确保计算单元 (V) 与搬运单元 (MTE2/MTE3) 的流水线被充分掩盖。 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> 关联Issue #3091 ## 测试 <!--描述进行了哪些测试来验证你的改动。--> 通过了eager测试、ut测试、AscendOpTest测试。 ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> 更新了README.md、aclnnForeachAddScalar.md、aclnnForeachAddScalarV2.md文件 ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-nn!5667 | 1 个月前 | |
foreach/lamb/scatter类算子资料及原型整改,以及示例补齐 Co-authored-by: tangpingchuan<tangpingchuan@huawei.com> # message auto-generated for no-merge-commit merge: !6065 merge master into master foreach/lamb/scatter类算子资料及原型整改,以及示例补齐 Created-by: zl_hw Commit-by: tangpingchuan Merged-by: cann-robot Description: ## 描述 foreach/Lamb/scatter类长尾算子资料规范、license规范和原型说明注释规范等补充 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> ## 测试 ut/st 全部OBP和David冒烟已通过 ## 文档更新 所有算子README.md和op_list.md以及aclnn_op_list.md ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-nn!6065 | 2 个月前 | |
foreach/lamb/scatter类算子资料及原型整改,以及示例补齐 Co-authored-by: tangpingchuan<tangpingchuan@huawei.com> # message auto-generated for no-merge-commit merge: !6065 merge master into master foreach/lamb/scatter类算子资料及原型整改,以及示例补齐 Created-by: zl_hw Commit-by: tangpingchuan Merged-by: cann-robot Description: ## 描述 foreach/Lamb/scatter类长尾算子资料规范、license规范和原型说明注释规范等补充 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> ## 测试 ut/st 全部OBP和David冒烟已通过 ## 文档更新 所有算子README.md和op_list.md以及aclnn_op_list.md ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-nn!6065 | 2 个月前 |