# canndev_bscpp_patch **Repository Path**: EwenWan/canndev_bscpp_patch ## Basic Information - **Project Name**: canndev_bscpp_patch - **Description**: 毕昇算子接入TBE算子仓 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2024-08-11 - **Last Updated**: 2024-08-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # canndev_bscpp_patch 毕昇算子接入TBE算子仓 ascend c 算子 接入TBE算子 ## 1 整体思路 毕昇算子接入CANN的方案是基于当前TBE和Tik2能力: 1. TBE的二进制复用流程,用户提供该流程需要的交付件并部署到cann-toolkits中的opp目录下,从而“伪装”成流程中的TBE二进制,毕昇算子被成功调用。 2. 毕昇C++算子编译参考Tik2的编译功能 bscpp目录随canndev仓打入CANN:$ASCEND_HOME_PATH/python/site-packages/op_gen/template * 设置优先加载自定义算子,新建文件$ASCEND_HOME_PATH/ops/vendors/config.ini ``` load_priority=customize ``` ## ascend c算子 算子信息库文件路径:自定义算子工程目录下的/tbe/op_info_cfg/ai_core/${soc_version}/xx.ini。 注:${soc_version}:昇腾AI处理器的版本,可从ATC安装路径的“data/platform_config”目录下查看, ".ini"文件的文件名(将大写字母转换为小写)即为对应的${soc_version}。 算子信息库定义文件 op_info/*.ini 编译成 aic-{soc version}-ops-info.json 原型定义文件 op_proto/xxx.h 与 .cc 编译成libcust_op_proto.so。 p_proto——算子IR定义文件目录;tbe——TBE算子文件目录;tbe/impl——算子实现文件目录;tbe/op_info_cfg——算子信息库文件目录; | 算子内容 | 交付件 | 生成工程目录中的相关编写 | | ------------ | ------------------------------ | ------------------------------------------------------------ | | 算子信息 | relu7.ini | 核对信息是否正确 | | 算子原型 | relu7.cpp | 在op_proto/ relu7 .cpp里修改修改InferShape函数 | | 算子tiling | relu7.cpp, relu7_tiling_data.h | 修改TilingData定义,在op_tiling/relu7_tiling_data.h里修改struct Relu7TilingData;
修改TilingData构造函数,在op_tiling/relu7 .cpp里修改Relu7Tiling函数 | | 毕昇算子实现 | relu7.cpp | 在impl/dynamic/ relu7.cpp里实现kernel函数 | 约定: 毕昇C++算子host代码中传入的kernel名必须包含“kernelName”字符串。 ## tbe 框架编译 ascend c 算子 ```py import os import tbe.dsl as tbe from tbe.common.utils import para_check from op_gen.template.bscpp.scripts import bscpp_op_compiler PYF_PATH = os.path.dirname(os.path.realpath(__file__)) def _build_args(x, y): inputs = [] for arg in [x]: if arg is not None: inputs.append(arg) outputs = [] for arg in [y]: if arg is not None: outputs.append(arg) return inputs, outputs @para_check.check_op_params(para_check.REQUIRED_INPUT, para_check.REQUIRED_OUTPUT, para_check.KERNEL_NAME) def relu7(x, y, kernel_name="relu7"): # 原本为 使用tbe py实现算子kernel (tvm架构) # py 算子逻辑和调度 生成 c算子 后再利用 毕升编译成 平台可执行算子 # 这里直接编译 c算子 inputs, outputs = _build_args(x, y) src = os.path.join(PYF_PATH, "relu7.cpp") bscpp_op_compiler.compile_op(src, kernel_name, "Relu7", inputs, outputs) ``` ## 算子安装包 run包文件结构: ``` packages/ packages/built-in/ packages/built-in/op_impl/ packages/built-in/op_impl/ai_core/ packages/built-in/op_impl/ai_core/tbe/ packages/built-in/op_impl/ai_core/tbe/config/ packages/built-in/op_impl/ai_core/tbe/config/ascend910/ packages/built-in/op_impl/ai_core/tbe/config/ascend910/aic-ascend910-ops-info.json 算子信息库 packages/built-in/op_impl/ai_core/tbe/kernel/ packages/built-in/op_impl/ai_core/tbe/kernel/config/ packages/built-in/op_impl/ai_core/tbe/kernel/config/ascend910/ packages/built-in/op_impl/ai_core/tbe/kernel/config/ascend910/relu7.json kernel配置 packages/built-in/op_impl/ai_core/tbe/kernel/ascend910/ packages/built-in/op_impl/ai_core/tbe/kernel/ascend910/relu7/ packages/built-in/op_impl/ai_core/tbe/kernel/ascend910/relu7/Relu7_8098b79498645e9c0da095babdeaf862_high_performance.json kernel文件 packages/built-in/op_impl/ai_core/tbe/kernel/ascend910/relu7/Relu7_8098b79498645e9c0da095babdeaf862_high_performance.o packages/vendors/ packages/vendors/customize/ packages/vendors/customize/op_proto/ packages/vendors/customize/op_proto/libcust_op_proto.so 算子接口 packages/vendors/customize/op_impl/ packages/vendors/customize/op_impl/ai_core/ packages/vendors/customize/op_impl/ai_core/tbe/ packages/vendors/customize/op_impl/ai_core/tbe/op_tiling/ packages/vendors/customize/op_impl/ai_core/tbe/op_tiling/liboptiling.so 算子tiling ``` * 相关文件被部署到以下路径: | 文件 | 部署路径 | | ------------------------------------------------------------ | ------------------------------------------------------------ | | aic-ascend910-ops-info.json | $ASCEND_HOME_PATH/ops/built-in/op_impl/ai_core/tbe/config/ascend910/ | | relu7.json | $ASCEND_HOME_PATH/ops/built-in/op_impl/ai_core/tbe/kernel/config/ascend910/ | | Relu7_8098b79498645e9c0da095babdeaf862_high_performance.json | $ASCEND_HOME_PATH/ops/built-in/op_impl/ai_core/tbe/kernel/ascend910/relu7/ | | Relu7_8098b79498645e9c0da095babdeaf862_high_performance.o | $ASCEND_HOME_PATH/ops/built-in/op_impl/ai_core/tbe/kernel/ascend910/relu7/ | | libcust_op_proto.so | $ASCEND_HOME_PATH/ops/vendors/customize/op_proto/ | | liboptiling.so | $ASCEND_HOME_PATH/ops/vendors/customize/op_impl/ai_core/tbe/op_tiling/ | ## 通过ACL接口调用算子 在线编译方式通过ACL接口打开模糊编译选项,触发复用算子二进制,调用毕昇算子.o运行程序