图模式适配指南【免费下载链接】ops-cv本项目是CANN提供的图像处理、目标检测相关的算子库实现网络在NPU上加速计算。项目地址: https://gitcode.com/cann/ops-cv概述本文档介绍自定义算子的图模式适配方法整体流程与算子开发指南AI Core算子开发指南/AI CPU算子开发指南一致。值得注意的是不需要进行aclnn适配只需做如下交付件适配即可实现图模式调用算子。${op_name} # 替换为实际算子名的小写下划线形式 ├── op_host # Host侧实现 │ └── ${op_name}_infershape.cpp # InferShape实现实现算子形状推导在运行时推导输出shape ├── op_graph # 图融合相关实现 │ ├── CMakeLists.txt # op_graph侧CMakeLists.txt文件 │ ├── ${op_name}_graph_infer.cpp # InferDataType文件实现算子类型推导在运行时推导输出dataType └── └── ${op_name}_proto.h # 算子原型定义用于图优化和融合阶段识别算子本文将以AddExample算子假设为AI Core算子入图为例介绍入图交付件的实现AI CPU算子入图实现基本类似完整代码详见examples目录下add_example和add_example_aicpu。Shape与DataType推导图模式需要完成两个交付件${op_name}_graph_infer.cpp${op_name}_infershape.cpp交付件1${op_name}_infershape.cppInferShape函数的作用是根据输入的shape推导输出的shape。示例如下AddExample算子完整代码请参考examples/add_example_aicpu/op_host下add_example_infershape.cpp。// AddExample算子逻辑是两个数相加因此输出shape与输入shape一致 static ge::graphStatus InferShapeAddExample(gert::InferShapeContext* context) { .... // 获取输入shape const gert::Shape* xShape context-GetInputShape(IDX_0); // 获取输出shape gert::Shape* yShape context-GetOutputShape(IDX_0); // 获取输入DimNum auto xShapeSize xShape-GetDimNum(); // 设置输出的DimNum yShape-SetDimNum(xShapeSize); // 依次将输入Dim值设置给输出 for (size_t i 0; i xShapeSize; i) { int64_t dim xShape-GetDim(i); yShape-SetDim(i, dim); } .... } // inferShape注册 IMPL_OP_INFERSHAPE(AddExample).InferShape(InferShapeAddExample);交付件2${op_name}_graph_infer.cppInferDataType函数的作用是根据输入的DataType推导输出的DataType。示例如下AddExample算子完整代码请参考examples/add_example_aicpu/op_graph下add_example_graph_infer.cpp。// AddExample算子逻辑是两个数相加因此输出dataType与输入dataType一致 static ge::graphStatus InferDataTypeAddExample(gert::InferDataTypeContext* context) { .... // 获取输入的dataType ge::DataType sizeDtype context-GetInputDataType(IDX_0); // 将输入dataType设置到输出 context-SetOutputDataType(IDX_0, sizeDtype); .... } // 注册InferDataType IMPL_OP(AddExample).InferDataType(InferDataTypeAddExample);算子原型配置图模式调用需要将算子原型注册到Graph Engine简称GE中以便GE能够识别该类算子的输入、输出及属性信息。注册通过REG_OP接口完成开发者需定义算子输入、输出张量类型及数量等基本信息。常用张量/属性数据类型示例如下张量类型属性类型示例int64/DT_INT64int32/DT_INT32int16/DT_INT16int8/DT_INT8double/DT_DOUBLEfloat32/DT_FLOATfloat16/DT_FLOAT16bfloat16/DT_BF16complex128/DT_COMPLEX128complex64/DT_COMPLEX64complex32/DT_COMPLEX32/intInt/boolBool/stringString/floatFloat/listListInt基本信息如下输入/输出关键字示例必选输入INPUT.INPUT(${name}, TensorType({input_dtype}))可选输入OPTIONAL_INPUT.OPTIONAL_INPUT(${name}, TensorType({optional_input_dtype}))必选属性REQUIRED_ATTR.REQUIRED_ATTR(${name}, ${dtype})可选属性ATTR.ATTR(${name}, ${dtype}, ${default_value})输出OUTPUT.OUTPUT(${name}, TensorType({output_dtype}))示例代码如下展示了如何注册AddExample算子REG_OP(AddExample) .INPUT(x1, TensorType({DT_FLOAT})) .INPUT(x2, TensorType({DT_FLOAT})) .OUTPUT(y, TensorType({DT_FLOAT})) .OP_END_FACTORY_REG(AddExample)完整代码请参考examples/add_example/op_graph目录下add_example_proto.h。【免费下载链接】ops-cv本项目是CANN提供的图像处理、目标检测相关的算子库实现网络在NPU上加速计算。项目地址: https://gitcode.com/cann/ops-cv创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
CANN ops-cv图模式适配指南
图模式适配指南【免费下载链接】ops-cv本项目是CANN提供的图像处理、目标检测相关的算子库实现网络在NPU上加速计算。项目地址: https://gitcode.com/cann/ops-cv概述本文档介绍自定义算子的图模式适配方法整体流程与算子开发指南AI Core算子开发指南/AI CPU算子开发指南一致。值得注意的是不需要进行aclnn适配只需做如下交付件适配即可实现图模式调用算子。${op_name} # 替换为实际算子名的小写下划线形式 ├── op_host # Host侧实现 │ └── ${op_name}_infershape.cpp # InferShape实现实现算子形状推导在运行时推导输出shape ├── op_graph # 图融合相关实现 │ ├── CMakeLists.txt # op_graph侧CMakeLists.txt文件 │ ├── ${op_name}_graph_infer.cpp # InferDataType文件实现算子类型推导在运行时推导输出dataType └── └── ${op_name}_proto.h # 算子原型定义用于图优化和融合阶段识别算子本文将以AddExample算子假设为AI Core算子入图为例介绍入图交付件的实现AI CPU算子入图实现基本类似完整代码详见examples目录下add_example和add_example_aicpu。Shape与DataType推导图模式需要完成两个交付件${op_name}_graph_infer.cpp${op_name}_infershape.cpp交付件1${op_name}_infershape.cppInferShape函数的作用是根据输入的shape推导输出的shape。示例如下AddExample算子完整代码请参考examples/add_example_aicpu/op_host下add_example_infershape.cpp。// AddExample算子逻辑是两个数相加因此输出shape与输入shape一致 static ge::graphStatus InferShapeAddExample(gert::InferShapeContext* context) { .... // 获取输入shape const gert::Shape* xShape context-GetInputShape(IDX_0); // 获取输出shape gert::Shape* yShape context-GetOutputShape(IDX_0); // 获取输入DimNum auto xShapeSize xShape-GetDimNum(); // 设置输出的DimNum yShape-SetDimNum(xShapeSize); // 依次将输入Dim值设置给输出 for (size_t i 0; i xShapeSize; i) { int64_t dim xShape-GetDim(i); yShape-SetDim(i, dim); } .... } // inferShape注册 IMPL_OP_INFERSHAPE(AddExample).InferShape(InferShapeAddExample);交付件2${op_name}_graph_infer.cppInferDataType函数的作用是根据输入的DataType推导输出的DataType。示例如下AddExample算子完整代码请参考examples/add_example_aicpu/op_graph下add_example_graph_infer.cpp。// AddExample算子逻辑是两个数相加因此输出dataType与输入dataType一致 static ge::graphStatus InferDataTypeAddExample(gert::InferDataTypeContext* context) { .... // 获取输入的dataType ge::DataType sizeDtype context-GetInputDataType(IDX_0); // 将输入dataType设置到输出 context-SetOutputDataType(IDX_0, sizeDtype); .... } // 注册InferDataType IMPL_OP(AddExample).InferDataType(InferDataTypeAddExample);算子原型配置图模式调用需要将算子原型注册到Graph Engine简称GE中以便GE能够识别该类算子的输入、输出及属性信息。注册通过REG_OP接口完成开发者需定义算子输入、输出张量类型及数量等基本信息。常用张量/属性数据类型示例如下张量类型属性类型示例int64/DT_INT64int32/DT_INT32int16/DT_INT16int8/DT_INT8double/DT_DOUBLEfloat32/DT_FLOATfloat16/DT_FLOAT16bfloat16/DT_BF16complex128/DT_COMPLEX128complex64/DT_COMPLEX64complex32/DT_COMPLEX32/intInt/boolBool/stringString/floatFloat/listListInt基本信息如下输入/输出关键字示例必选输入INPUT.INPUT(${name}, TensorType({input_dtype}))可选输入OPTIONAL_INPUT.OPTIONAL_INPUT(${name}, TensorType({optional_input_dtype}))必选属性REQUIRED_ATTR.REQUIRED_ATTR(${name}, ${dtype})可选属性ATTR.ATTR(${name}, ${dtype}, ${default_value})输出OUTPUT.OUTPUT(${name}, TensorType({output_dtype}))示例代码如下展示了如何注册AddExample算子REG_OP(AddExample) .INPUT(x1, TensorType({DT_FLOAT})) .INPUT(x2, TensorType({DT_FLOAT})) .OUTPUT(y, TensorType({DT_FLOAT})) .OP_END_FACTORY_REG(AddExample)完整代码请参考examples/add_example/op_graph目录下add_example_proto.h。【免费下载链接】ops-cv本项目是CANN提供的图像处理、目标检测相关的算子库实现网络在NPU上加速计算。项目地址: https://gitcode.com/cann/ops-cv创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考