| Files | Last commit | Last update |
|---|---|---|
refactor(random): random 系列算子去除16M workspace 冗余 Co-authored-by: aiteer<lujiale4@huawei.com> # message auto-generated for no-merge-commit merge: !6462 merge random_ws_zero into master refactor(random): random 系列算子去除16M workspace 冗余 Created-by: aiteer Commit-by: aiteer Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> 针对 random 系列算子去除 16M workspace 冗余:将各算子 arch35 侧 tiling 中用于 AscendC 工具库的 workspace 常量由 16777216(16M)改为 0,并同步删除 stateless_random_normal_v2、stateless_random_uniform_v2 两个 kernel 入口中对 workspace 的非空校验与 SetSysWorkspace/GetUserWorkspace 调用,使算子不再额外申请和传递该冗余 workspace;相应 UT 的期望 workspace 值也由 16777216 调整为 0。 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。--> <!-- 如果这个PR是为了解决特定的问题单,请在这里描述问题单单号。--> [#3844](https://gitcode.com/cann/ops-math/issues/3844) ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> 各算子kernel各路径进行ttk测试,功能精度全部pass ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> 无 ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [x] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-math!6462 | 12 days ago | |
feat(random): stateless_random_normal_v2/v3、stateless_uniform 支持 ascend960dt/ascend960pr 平台 Co-authored-by: wuchengwen_oh<wuchengwen4@huawei.com> # message auto-generated for no-merge-commit merge: !6175 merge feat/random-960-support into master feat(random): stateless_random_normal_v2/v3、stateless_uniform 支持 ascend960dt/ascend960pr 平台 Created-by: wuchengwen_oh Commit-by: wuchengwen_oh Merged-by: cann-robot Description: ## 描述 将 stateless_random_normal_v2、stateless_random_normal_v3、stateless_uniform 三个随机数算子的 Ascend 960 平台支持从 A6(ops-math-dev) 迁移到主线,支持 ascend960dt / ascend960pr 两颗芯片。 **迁移策略(少量修改→架构隔离,复用 arch35 目录)**:逐文件归一化比对(MicroAPI→Reg 改名、忽略换行缩进)后确认三者 kernel 逻辑与主线 arch35 版本完全等价,tiling 仅切分对齐粒度存在架构差异,故不新建 arch92 目录、不引入重复代码,差异按 NpuArch 精确等值判断隔离(SocVersion 枚举中 960 追加在末尾,不能用区间比较)。 改动内容: - **算子注册**:三个算子 def.cpp 增加 AddConfig("ascend960dt") / AddConfig("ascend960pr");CMakeLists.txt 的 SUPPORT_COMPUTE_UNIT 与 SUPPORT_TILING_DIR 一一对应新增两颗芯片(tiling 复用 arch35)。 - **kernel 编译配置**:ascendc_config.json 为三个算子注册 ascend960dt/ascend960pr 的 compute_units 与 compile_options(-mllvm -cce-aicore-dcci-before-kernel-end=false),与主线既有 960dt 算子(MirrorPad/Pad/SplitV 等)一致;否则 960 编译将缺失该 DCCI 选项。 - **tiling 架构隔离**: - stateless_random_normal_v2:IsArch92() 按 NpuArch::DAV_9201/9202 判断,arch92 核间按 32 元素对齐、UB 按 256 元素向下对齐;arch35 保持原 512 字节核间对齐、32 字节 UB 向上对齐。CompileInfo 增加 isArch92 标记,覆盖 platformInfo 不可用时回退 CompileInfo 通路的判定。 - stateless_random_normal_v3:新增 BeforeProcess() 覆写,arch92 下将 coreAlignSize 由 512 改为 32;platformInfo 为空时保持默认值。 - stateless_uniform:tiling/kernel 与主线 arch35 完全一致,无需隔离。 - **kernel 架构宏隔离**:stateless_random_normal_v3 kernel 入口用 #if defined(__DAV_VEC__) 包裹(AIV_ONLY 且依赖仅 Vector 核提供的 RegBase VF 接口),避免 AIC 编译通道实例化。 - **op_api**:aclnn_normal_out.cpp 抽取 IsNormalV3SupportedArch(),Normal V3 兼容通路由仅 DAV_3510 扩展为 DAV_3510/DAV_9201/DAV_9202。 - **UT**:新增 stateless_uniform_tiling.h host shim(stateless_uniform kernel 引用 device SIMT builtin __mul_i32toi64,host 侧编译缺失导致其 op_kernel UT 链接失败;cmake 检测到 <op>_tiling.h 后 -include 注入全部 TU 提供等价实现,stateless_normal 等 5 个既有算子早已采用此写法)。 ## 关联的Issue https://gitcode.com/cann/ops-math/issues/3657 ## 测试 - op_host UT:30/30 通过(三个算子 tiling + infershape) - op_api UT:47/47 通过(Normal L2 四接口 + StatelessUniform L0) - 三个算子 ascend950 kernel 二进制构建通过;v3 的 __DAV_VEC__ 宏经 A/B 对比生成的 .o 与加宏前 MD5 完全一致(对 950 零影响) - arch92 tiling 算式对账:按 A6 公式算得编码 53876069761280 与 A6 自身提交的 UT 期望值一致;arch35 仍为 54563264528640,与主线一致 - libophost_math.so 全量编译通过;修改文件全部通过仓库 pre-commit(clang-format/end-of-file/codespell/OAT 合规) - 注:本地 CANN 包仅支持 ascend950,ascend960dt/ascend960pr 的 kernel 编译需在支持 960 的 CANN 版本上验证 ## 文档更新 无 ## 类型标签 - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-math!6175 | 22 days ago | |
支持下一代cos_stateless_bernoulli_stateless_random_normal_v2算子实现 Co-authored-by: z00940181<zhanghaodong30@huawei.com> # message auto-generated for no-merge-commit merge: !548 merge master into master 支持下一代cos_stateless_bernoulli_stateless_random_normal_v2算子实现 Created-by: hawdonz Commit-by: z00940181 Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。--> <!-- 如果这个PR是为了解决特定的问题单,请在这里描述问题单单号。--> ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-math!548 | 10 months ago | |
feat(random): stateless_random_normal_v2/v3、stateless_uniform 支持 ascend960dt/ascend960pr 平台 Co-authored-by: wuchengwen_oh<wuchengwen4@huawei.com> # message auto-generated for no-merge-commit merge: !6175 merge feat/random-960-support into master feat(random): stateless_random_normal_v2/v3、stateless_uniform 支持 ascend960dt/ascend960pr 平台 Created-by: wuchengwen_oh Commit-by: wuchengwen_oh Merged-by: cann-robot Description: ## 描述 将 stateless_random_normal_v2、stateless_random_normal_v3、stateless_uniform 三个随机数算子的 Ascend 960 平台支持从 A6(ops-math-dev) 迁移到主线,支持 ascend960dt / ascend960pr 两颗芯片。 **迁移策略(少量修改→架构隔离,复用 arch35 目录)**:逐文件归一化比对(MicroAPI→Reg 改名、忽略换行缩进)后确认三者 kernel 逻辑与主线 arch35 版本完全等价,tiling 仅切分对齐粒度存在架构差异,故不新建 arch92 目录、不引入重复代码,差异按 NpuArch 精确等值判断隔离(SocVersion 枚举中 960 追加在末尾,不能用区间比较)。 改动内容: - **算子注册**:三个算子 def.cpp 增加 AddConfig("ascend960dt") / AddConfig("ascend960pr");CMakeLists.txt 的 SUPPORT_COMPUTE_UNIT 与 SUPPORT_TILING_DIR 一一对应新增两颗芯片(tiling 复用 arch35)。 - **kernel 编译配置**:ascendc_config.json 为三个算子注册 ascend960dt/ascend960pr 的 compute_units 与 compile_options(-mllvm -cce-aicore-dcci-before-kernel-end=false),与主线既有 960dt 算子(MirrorPad/Pad/SplitV 等)一致;否则 960 编译将缺失该 DCCI 选项。 - **tiling 架构隔离**: - stateless_random_normal_v2:IsArch92() 按 NpuArch::DAV_9201/9202 判断,arch92 核间按 32 元素对齐、UB 按 256 元素向下对齐;arch35 保持原 512 字节核间对齐、32 字节 UB 向上对齐。CompileInfo 增加 isArch92 标记,覆盖 platformInfo 不可用时回退 CompileInfo 通路的判定。 - stateless_random_normal_v3:新增 BeforeProcess() 覆写,arch92 下将 coreAlignSize 由 512 改为 32;platformInfo 为空时保持默认值。 - stateless_uniform:tiling/kernel 与主线 arch35 完全一致,无需隔离。 - **kernel 架构宏隔离**:stateless_random_normal_v3 kernel 入口用 #if defined(__DAV_VEC__) 包裹(AIV_ONLY 且依赖仅 Vector 核提供的 RegBase VF 接口),避免 AIC 编译通道实例化。 - **op_api**:aclnn_normal_out.cpp 抽取 IsNormalV3SupportedArch(),Normal V3 兼容通路由仅 DAV_3510 扩展为 DAV_3510/DAV_9201/DAV_9202。 - **UT**:新增 stateless_uniform_tiling.h host shim(stateless_uniform kernel 引用 device SIMT builtin __mul_i32toi64,host 侧编译缺失导致其 op_kernel UT 链接失败;cmake 检测到 <op>_tiling.h 后 -include 注入全部 TU 提供等价实现,stateless_normal 等 5 个既有算子早已采用此写法)。 ## 关联的Issue https://gitcode.com/cann/ops-math/issues/3657 ## 测试 - op_host UT:30/30 通过(三个算子 tiling + infershape) - op_api UT:47/47 通过(Normal L2 四接口 + StatelessUniform L0) - 三个算子 ascend950 kernel 二进制构建通过;v3 的 __DAV_VEC__ 宏经 A/B 对比生成的 .o 与加宏前 MD5 完全一致(对 950 零影响) - arch92 tiling 算式对账:按 A6 公式算得编码 53876069761280 与 A6 自身提交的 UT 期望值一致;arch35 仍为 54563264528640,与主线一致 - libophost_math.so 全量编译通过;修改文件全部通过仓库 pre-commit(clang-format/end-of-file/codespell/OAT 合规) - 注:本地 CANN 包仅支持 ascend950,ascend960dt/ascend960pr 的 kernel 编译需在支持 960 的 CANN 版本上验证 ## 文档更新 无 ## 类型标签 - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-math!6175 | 22 days ago | |
随机数算子重构优化 Co-authored-by: fenglin28<fenglin28@huawei.com> # message auto-generated for no-merge-commit merge: !949 merge hh into master 随机数算子重构优化 Created-by: guankarl Commit-by: fenglin28 Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> 随机数算子重构优化,使用统一模板实现。 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。--> https://gitcode.com/cann/ops-math/issues/552 <!-- 如果这个PR是为了解决特定的问题单,请在这里描述问题单单号。--> ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [x ] 其他,请描述: 随机数算子重构,总共分为 5 个部分: 算子infershape/inferdtype 实现了公共逻辑提取CommonInferShape,不同算子根据算子原型配置对应mode,新算子开发10行代码搞定 示例: static graphStatus InferShapeRandomUniformV2(gert::InferShapeContext* context) { const std::unordered_map<std::string, size_t>& input_map = { {"shape", RANDOM_UNIFORM_V2_X}, {"offset", RANDOM_UNIFORM_V2_OFFSET}}; const std::unordered_map<std::string, size_t>& output_map = { {"y", RANDOM_UNIFORM_V2_Y}, {"offset", RANDOM_UNIFORM_V2_OFFSET}}; int32_t mode = RANDOM_UNIFORM_V2_MODE_TYPE; return ops::common::CommonInferShape(context, input_map, output_map, mode); } IMPL_OP_INFERSHAPE(RandomUniformV2).InferShape(InferShapeRandomUniformV2); 算子信息库注册def 算子的不同输入如果有多组dtype时候,在算子信息库的枚举中,可能会有几十种组合,手写容易漏掉或者重复,且不好检查,通过提供RandomDtypeFmtGen类,调用对应接口即可获取全部组合类型。 示例: gen.GetSequence("inOutType") this->Input("x") .ParamType(REQUIRED) .DataType({gen.GetSequence("inOutType")}) .Format({baseFormatSeq}) .UnknownShapeFormat({baseFormatSeq}); 融合规则 有状态算子转无状态算子,存在范式的融合规则,通过提取公共类,定义公共接口,后续类似融合规则无需重新开发,直接调用对应接口即可。 class FusionRandomUtils { public: FusionRandomUtils() = default; ~FusionRandomUtils() = default; // FusionRandomUtils(const FusionRandomUtils&) = delete; // FusionRandomUtils& operator=(const FusionRandomUtils&) = delete; /** * @param graph 计算图对象 * @param opDesc 算子描述指针 * @param offsetNode 输出:创建的offset Variable节点 * @param shapeDesc Shape输入的Tensor描述 * @param outputDesc 主输出Y的Tensor描述 * @param opNode 基准算子节点(用于拼接新节点名) * @param fusionPassName 日志标识(用于日志溯源) * @param fusedOpType 融合算子类型(用于日志/错误信息溯源) * @return Status SUCCESS/FAILED/PARAM_INVALID */ static bool CheckSocVersion(const std::string& fusedOpType); static Status AddVariableNode( ge::ComputeGraph& graph, ge::NodePtr opNode, const ge::GeTensorDesc& offsetDesc, ge::NodePtr& newNode, const uint8_t* dataPtr, size_t size, const std::string& fusionPassName); static Status CreateInputOpDesc( ge::OpDescPtr& opDesc, ge::GeTensorDesc shapeDesc, ge::GeTensorDesc offsetDesc, const std::string& fusedOpType); static Status CreateOutputOpDesc( ge::OpDescPtr& opDesc, ge::GeTensorDesc outputDesc, ge::GeTensorDesc offsetDesc, const std::string& fusedOpType); static Status AddOpNodeAndDesc(ge::ComputeGraph& graph, ge::OpDescPtr& opDesc, ge::NodePtr& offsetNode, ge::GeTensorDesc shapeDesc, ge::GeTensorDesc outputDesc, ge::NodePtr opNode, const std::string& fusionPassName, const std::string& fusedOpType); static Status UpdateAttr(ge::NodePtr opNode, int64_t seed, int64_t seed2, ge::DataType dtype, const std::string& fusionPassName, const std::string& fusedOpType); static Status CreateNode(ge::ComputeGraph& graph, ge::NodePtr opNode, std::vector<ge::NodePtr>& fusionNodes, ge::NodePtr& opV2Node, const std::string& fusionPassName, const std::string& fusedOpType, const std::set<ge::DataType> aicoreDtypeSupportList); static Status RemoveNode(ge::NodePtr node, ge::ComputeGraph& graph, const std::string& fusedOpType); static Status ReplaceNode(ge::NodePtr oldNode, ge::NodePtr newNode, ge::ComputeGraph& graph, const std::string& fusedOpType, const std::string& fusionPassName); }; 算子tiling 抽象并统一流程,更加适合随机数算子,统一tilingData,按照配置做检查。 统一流程: ge::graphStatus RandomTilingArch35::DoTiling() { opName_ = context_->GetNodeName(); OP_LOGD(opName_, "Start tiling for op: %s", opName_.c_str()); // 步骤1:校验输入输出和属性 auto ret = CheckInputsOutputsAndAttrs(); if (ret != ge::GRAPH_SUCCESS) { OP_LOGE(opName_, "Check inputs/outputs/attrs failed"); return ret; } // 步骤2: 获取硬件信息 ret = GetPlatformInfo(); if (ret != ge::GRAPH_SUCCESS) { OP_LOGE(opName_, "Get platform info failed"); return ret; } // 步骤3: 填充TilingData ret = FillUnifiedTilingData(); if (ret != ge::GRAPH_SUCCESS) { OP_LOGE(opName_, "Fill tiling data failed"); return ret; } // 步骤4:计算tilingKey和workspace ret = CalcTilingKeyAndWorkspace(); if (ret != ge::GRAPH_SUCCESS) { OP_LOGE(opName_, "Calc tiling key/workspace failed"); return ret; } // 步骤5:后置处理(可选) ret = UniqueProcess(); if (ret != ge::GRAPH_SUCCESS) { OP_LOGE(opName_, "Unique process failed"); return ret; } // 步骤6:写入context ret = WriteBackToContext(); if (ret != ge::GRAPH_SUCCESS) { OP_LOGE(opName_, "Write tiling data to context failed"); return ret; } // 步骤7:调用dump函数 auto info = tilingData_.DumpTilingInfo(); OP_LOGI("RandomTiling", "%s", info.str().c_str()); OP_LOGD(opName_, "Tiling success for op: %s", opName_); return ge::GRAPH_SUCCESS; } 统一tilingData int64_t usedCoreNum = 0; int64_t normalCoreProNum = 0; int64_t tailCoreProNum = 0; int64_t singleBufferSize = 0; uint32_t key[2] = {0}; uint32_t counter[4] = {0}; int64_t outputSize = 0; int64_t probTensorSize = 0; int64_t sharedTmpBufSize = 0; 当前tilingData较少,后续如有需要,按需添加 按照配置做检查: OpTilingConfig config; config.inputCheckRules = { // 输入索引: dtype列表,shapeSize,dim_num {0, {{ge::DT_INT32, ge::DT_INT64}, -1, {1}, nullptr}}, // shape {1, {{ge::DT_INT64}, 1, {}, nullptr}}, // offset }; config.outputCheckRules = { // 输出索引: dtype列表,shapeSize,dim_num {0, {{ge::DT_FLOAT, ge::DT_FLOAT16, ge::DT_BF16}, -1, {1,2,3,4,5,6,7,8}, nullptr}} }; // y 算子kernel kernel抽取了RandomKernelBaseOp类,专门管理tilingData,内置了Skip函数和生成随机数函数,其他算子只需调用VarsInit接口即可 See merge request: cann/ops-math!949 | 9 months ago |
| Files | Last commit | Last update |
|---|---|---|
| 12 days ago | ||
| 22 days ago | ||
| 10 months ago | ||
| 22 days ago | ||
| 9 months ago |