首页 > 其他分享 >【2023CANN训练营第二季】——Ascend C自定义算子工程介绍及实验

【2023CANN训练营第二季】——Ascend C自定义算子工程介绍及实验

时间:2023-11-28 13:04:25浏览次数:32  
标签:文件 自定义 Ascend custom 算子 2023CANN 生成

一、自定义算子工程介绍与创建

自定义算子工程是一个包含用户编写的host侧和kerne|侧算子实现文件的,用于编译和安装自定义算子run包的工程框架。

CANN软件包中提供了工程创建工具msopgen,开发者可以输入算子原型定义文件生成Ascend C算子开发工程。 需要编写AddCustom算子的原型定义json文件以及运行以下代码

${INSTALL_DIR}/python/site-packages/bin/msopgen gen -i $HOME/sample/add_custom.json -c ai_core-<soc_version> -lan cpp -out $HOME/sample/AddCustom

其中对这些命令进行解释: ${INSTALL_DIR}为CANN软件安装后文件存储路径,根据实际环境进行替换。 -i:指定算子原型定义文件add_custom.json所在路径,请根据实际情况修改。 -c:ai_core-<soc_version>代表算子在AI Core上执行,<soc_version>为昇腾AI处理器的型号。比如我的AI处理器型号为910B,那么我这里写Ascend910B。 -lan: 参数cpp代表算子基于Ascend C编程框架,使用C++编程语言开发。 -out:生成文件所在路径,可配置为绝对路径或者相对路径,并且工具执行用户对路径具有可读写权限。若不配置,则默认生成在执行命令的当前路径。

使用msopgen工具生成AddCustom算子的开发命令之后,会在$HOME/sample目录下生成算子工程目录AddCustom,工程中包含算子实现的模板文件,编译脚本等,如下所示:

AddCustom
├── build.sh         // 编译入口脚本
├── cmake 
│   ├── config.cmake
│   ├── util        // 算子工程编译所需脚本及公共编译文件存放目录
├── CMakeLists.txt   // 算子工程的CMakeLists.txt
├── CMakePresets.json // 编译配置项
├── framework        // 算子插件实现文件目录,单算子模型文件的生成不依赖算子适配插件,无需关注
├── op_host                      // host侧实现文件
│   ├── add_custom_tiling.h    // 算子tiling定义文件
│   ├── add_custom.cpp         // 算子原型注册、shape推导、信息库、tiling实现等内容文件
│   ├── CMakeLists.txt
├── op_kernel                   // kernel侧实现文件
│   ├── CMakeLists.txt   
│   ├── add_custom.cpp        // 算子核函数实现文件 
├── scripts                     // 自定义算子工程打包相关脚本所在目录

二、自定义算子工程样例演示

我是在ModelArts环境下创建了一个notebook,镜像为:

4d729b0eae05fa0aa7b24724f92ad10.png

创建好之后,进入终端,下载samples代码仓库: 进入到op_dev目录,这个目录就是一个自定义算子交付目录

cd samples/cplusplus/level1_single_api/4_op_dev/6_ascendc_custom_op/acl_invocation/op_dev

然后通过msopgen这个工具生成,生成之前可以运行以下命令,看看自己的AI处理器型号: npu-smi info 我的结果如下,Ascend910B: image.png

然后接着,你要找到${INSTALL_DIR}这个位置,也就是CANN软件安装后文件存储路径,我的为:/usr/local/Ascend/ascend-toolkit/7.0.RC1,默认是路径可能都是这个,

接着就可以运行msopgen命令:

/usr/local/Ascend/ascend-toolkit/7.0.RC1/python/site-packages/bin/msopgen gen -i add_custom.json -c ai_core-Ascend910B2 -lan cpp -out ./custom_opp

显示生成完成:

image.png

可以看到新生成的custom_opp文件夹里生成了以下文件: image.png

我们主要关注CMakePresets.json里面“ASCEND_CANN_PACKAGE_PATH”是否和你安装的CANN路径对应,一般默认都是对应的。

下面进行自定义算子工程编译:

./build.sh

报错: image.png

显示没有这个头文件:register/tilingdata_base.h

设置环境变量 ASCEND_TENSOR_COMPILER_INCLUDE:

export ASCEND_TENSOR_COMPILER_INCLUDE=/usr/local/Ascend/ascend-toolkit/7.0.RC1/aarch64-linux/include

然后执行./build.sh

编译部署成功: image.png

在build_out文件夹下可以看到已经生成了run包 image.png

接下来部署自定义算子包:

./custom_opp_euleros_aarch64.run

image.png

看到SUCCESS说明部署成功!

以上就是Ascend C自定义算子工程的演示。

标签:文件,自定义,Ascend,custom,算子,2023CANN,生成
From: https://blog.51cto.com/u_16353294/8599035

相关文章

  • 内核模块开发入门指南:在CentOS 7上实现自定义功能
    内核模块开发入门指南:在CentOS7上实现自定义功能在CentOS7及其他Linux系统中,内核模块是一种动态加载到内核中的代码,用于扩展内核的功能。内核模块的开发允许开发者在不重新编译内核的情况下,添加新的功能、驱动或调整系统行为。本文将带你入门内核模块的开发,在CentOS7上实现自......
  • 自定义标签和过滤器
    1自定义过滤器 -第一步:在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的simple_tag-第二步:在app中创建templatetags包(包名只能是templatetags,不能改)-第三步:在包内,新建py文件(如:my_tags.py)-第四步:写代码(过滤器) fromdjangoimporttemplate......
  • 直播系统app源码,自定义可以暂停的倒计时
    直播系统app源码,自定义可以暂停的倒计时用到的抽象类: publicabstractclassTimerListener{  /**   *当倒计时开始   */  publicvoidonStart(){  }  /**   *当倒计时恢复暂停   */  publicvoidonResume(){  }  /**  ......
  • app直播源码,uniapp之自定义顶部样式
    app直播源码,uniapp之自定义顶部样式 //需要自定义顶部样式的页面配置{"path":"pages/case/index","style":                                           {  "navigationBarTitleT......
  • Vue中自定义组件监听事件传参
    自定义数字框组件如下<template><divclass="count-box"><button@click="handleSub"class="minus">-</button><input:value="value"@change="handleChange"class="inp"typ......
  • PIP换源_Pycharm快捷键_自定义文件头模板
    【一】PIP更换国内源永久换源打开控制台或终端,并输入以下命令:pipconfigsetglobal.index-urlhttps://mirrors.aliyun.com/pypi/simple/更改pip源后,可以通过以下命令验证:pipconfiggetglobal.index-url如果返回值为https://mirrors.aliyun.com/pypi/simple/,则表......
  • socket.on可以直接添加自定义事件吗,理解socket的事件触发与响应
    在Web开发中,socket.on通常是用于注册处理特定事件的回调函数的方法。它主要用于处理Socket.IO库中的预定义事件,例如"connect"、"disconnect"、"message"等。然而,Socket.IO也允许你添加自定义事件,以便在客户端和服务器之间进行自定义的双向通信。要使用socket.on来处理自定义事件,......
  • 函数中的库函数与自定义函数
    1.函数是什么:在计算机科学中,子程序也就是函数,是一个大型程序中的某部分代码,由一个或多个语句组成。负责完成某项特定任务,而且相对于其他代码,具有相对的独立性。一般会有输入参数并有返回值,提供对过程的封装和细节的隐藏,这些代码通常被集成为软件库。2.库函数举例:lo函数字符串操作函......
  • Java开发者的Python快速进修指南:自定义模块及常用模块
    好的,按照我们平常的惯例,我先来讲一下今天这节课的内容,以及Java和Python在某些方面的相似之处。Python使用import语句来导入包,而Java也是如此。然而,两者之间的区别在于Python没有类路径的概念,它直接使用.py文件的文件名作为导入路径,并将其余的工作交给Python解释器来扫描和处理。另......
  • 自定义的结构的内存问题-字节对齐
    字节对齐在写结构体时养成习惯,一定要按内存从小到大写,要不然在创建结构体的时候会导致创建的结构体明显的大。因为每创建一个结构体时,内存都需要对齐。一般都是1,4,8的整数倍//字符对齐时,字符可以和整数在一起,字符数组可以任意拆分。structA{ chara; //1+3 intb; //......