版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
任务2.6基于DSL的Sqrt算子开发学生手册任务2.6基于DSL的算子开发与AOE调优【任务导入】加法是最基础且高频的运算之一,如何在AscendAI处理器中高效实现加法算子,优化其性能,是每个AI算子开发者所面临的核心挑战。请从开发者的角度分析,基于TBE-DSL方式开发一个算子并对该算子进行AOE调优。【学习目标】素质目标培养学生的独立思考、发现并解决问题的能力;培养学生的精益求精的工匠精神;鼓励学生将所学知识应用到实际生活中,具备实践能力和实践经验。知识目标能描述算子工程编译与部署方法[K32];能描述算子UT测试、ST测试流程[K33];能了解AOE调优的定义和工作流程[K34]。能力目标能独立完成算子开发与编译[A26];能独立完成算子的AOE调优[A27]。【知识准备】算子工程编译与部署算子工程编译算子交付件开发完成后,需要对算子工程进行编译,生成自定义算子安装包*.run,编译操作如REF_Ref14615\h图2-6-1所示。图2-6-SEQ图2-6-\*ARABIC1算子编译操作算子包部署算子部署指将算子编译生成的自定义算子安装包(*.run)部署到CANN算子库中。在推理场景下,自定义算子直接部署到开发环境的CANN算子库;在训练场景下,自定义算子安装包部署到运行环境的CANN算子库中。算子开发算子分析与代码实现输入tensora和b,实现d=a+b+b的加法运算。算子实现逻辑为先计算c=a+b,d=c+b,其中c为中间tensor。校验中间tensorc的正确性。fromtbeimporttvmfromtbeimportdslfrommon.utilsimportpara_checkfrommon.utilsimportshape_util#引入testing模块相关接口frommon.testing.testingimport*importnumpyasnp@para_check.check_input_type(dict,dict,dict,str)defaddtest(input_a,input_b,output_d,kernel_name="addtest"):#进入DSL调试模式,并选择CPU作为运行平台withdebug():#获取算子运行的上下文ctx=get_ctx()#获取输入数据的shape与dtypeshape_a=shape_util.scalar2tensor_one(input_a.get("shape"))shape_b=shape_util.scalar2tensor_one(input_b.get("shape"))data_type=input_a.get("dtype").lower()#使用numpy定义输入golden数据大小a=tvm.nd.array(np.random.uniform(size=shape_a).astype(data_type),ctx)b=tvm.nd.array(np.random.uniform(size=shape_b).astype(data_type),ctx)#使用numpy将输出d初始化为全0d=tvm.nd.array(np.zeros(shape_a,dtype=data_type),ctx)#调用TVM的placeholder接口对输入tensor进行占位,并返回一个tensor对象data_a=tvm.placeholder(shape_a,name="data_1",dtype=data_type)data_b=tvm.placeholder(shape_b,name="data_2",dtype=data_type)#调用DSL计算接口实现data_a+data_bdata_c=dsl.vadd(data_a,data_b) #中间Tensor数据验证sample=open('samplefile.txt','w')#将中间tensordata_c存入文件samplefile.txtprint_tensor(data_c,ofile=sample)#检查中间tensordata_c的值是否正确assert_allclose(data_c,desired=a.asnumpy()+b.asnumpy(),tol=[1e-7,1e-7])print("Thevalueofdata_cisthesameastheexpectedvalue.") #继续自定义DSL的逻辑撰写,调用DSL接口实现:data_d=data_c+data_bdata_d=dsl.vadd(data_c,data_b)#调用TVM的create_schedule接口,为算子创建调度实例对象,入参为输出tensor的OP列表。s=tvm.create_schedule(data_d.op)#编译生成算子,data_a,data_b,data_d是占位的输入输出列表,AddTest是我们自定义算子的名称build(s,[data_a,data_b,data_d],name="AddTest")#执行算子,将a,b,d按顺序代入编译出来的DSL算子AddTestrun(a,b,d)#AddTest(a,b,d)#将输出数据d的值打印出来,并预期结果进行比较,看是否相符print("d:",d)tvm.testing.assert_allclose(d.asnumpy(),a.asnumpy()+b.asnumpy()+b.asnumpy())print("Theactualoutputisthesameastheexpectedoutput.")#编写入口函数,调用addtest函数if__name__=="__main__":input_output_dict={"shape":(2,3,4),"format":"ND","ori_shape":(2,3,4),"ori_format":"ND","dtype":"float32"}addtest(input_output_dict,input_output_dict,input_output_dict,kernel_name="addtest")运行程序,输出以下结果,由打印信息“Thevalueofdata_cisthesameastheexpectedvalue.”可知中间tensordata_c的计算结果与预期结果相同。打印信息“Theactualoutputisthesameastheexpectedoutput.”可知最终输出结果与预期结果相同。中间tensordatac的数据存储到了samplefile.txt文件中。========================debugenter=======================Thevalueofdata_cisthesameastheexpectedvalue.Tensoradd_0issavedtofilesamplefile.txt.d:[[[1.10993412.75362830.64417971.9604567][0.259953321.9973321.40891211.7263429][0.590429841.0795332.11427021.3301892]][[1.60436771.26584481.74249120.57584894][1.60161111.22544620.344144431.43648][2.10965921.49203562.06757162.458529]]]Theactualoutputisthesameastheexpectedoutput.========================debugexit========================算子仿真环境测试验证自定义算子需要在仿真环境中验证通过后才算完成自定义算子的开发。测试验证流程如REF_Ref14533\h图2-6-2所示。图2-6-SEQ图2-6-\*ARABIC2测试验证流程UT测试UT(UnitTest,单元测试)是开发者进行算子代码验证的手段之一,主要目的是测试算子的正确性和保证算子程序能够正常运行。测试采用Python的Unittest测试框架,自动执行所有test开头的测试函数,流程如REF_Ref14510\h图2-6-3所示。图2-6-SEQ图2-6-\*ARABIC3UT测试流程ST测试ST(SystemTest)测试框架生成测试用例,通过C++调用硬件runtime接口,验证算子功能和结果的准确性,并生成运行测试报告,如REF_Ref14494\h图2-6-4所示。图2-6-SEQ图2-6-\*ARABIC4ST测试流程AOE调优AOE的定义AOE(AscendOptimizationEngine)是一款自动调优工具,利用是充分利用有限的硬件资源,以满足算子和整网的性能要求。AOE通过生成调优策略、编译、在运行环境上验证的闭环反馈机制,获得最佳的调优策略,从而更充分利用硬件资源,不断提升网络的性能,达到最优的效果。AOE的架构如REF_Ref8771\h图2-6-5所示。图2-6-SEQ图2-6-\*ARABIC5AOE架构Application层:调优入口,AOE表示AOE进程,是离线推理场景下的调优入口。Tuning层:调优模式,支持SGATA(SubGraphAutoTuning,子图调优)和OPAT(OperatorAutoTuning,算子调优),其中OPAT是AOE将一整张图输入,OPAT内部进行算子融合,将融合得到的图进行算子粒度切分,针对每一个融合算子子图生成不同的算子调优策略,从而实现最优的算子性能。Execute层:执行层,支持Compiler(编译)和在运行环境上Runner(运行)。AOE的工作原理以算子调优为例,AOE工作流程分为三个主要步骤,如REF_Ref8850\h图2-6-6所示。图2-6-SEQ图2-6-\*ARABIC6AOE算子调优工作流程【任务实施】基于DSL的Add算子开发与AOE调优概述该AI示例工程的主要功能是创建Add算子、算子的AOE调优。其主要过程包括创建自定义算子工程、AOE调优等。实验环境准备设备检查本次实验环境包括MDC610,电源线,安装Ubuntu20.04虚拟环境的PC机一台,见REF_Ref14432\h表2-6-1。每套实验环境适用于4~12名学生同时上机操作。表2-6-SEQ表2-6-\*ARABIC1实验清单设备名称数量备注MDC6101台所有实验组共用电源线1组所有实验组共用笔记本或台式机每组1台台式机要有无线网卡文档准备MDC6101.1.027-T000产品文档-算子开发MDC6101.1.027-T000产品文档-AOE调优分析项目工程目录打开项目工程文件夹,了解项目的基础信息,包含该项目的工程目录、环境要求、数据/模型准备、编译运行、关键接口介绍等内容,如REF_Ref14154\h图2-6-7所示。图2-6-SEQ图2-6-\*ARABIC7项目工程文件目录工程目录的主要结构如下,本项目用到的关键工程文件见REF_Ref14102\h表2-6-2。表2-6-SEQ表2-6-\*ARABIC2工程目录工程目录功能cmake编译相关公共文件存放目录framework算子插件实现文件目录,框架为“PYTORCH”的算子无需关注op_proto算子原型定义文件及CMakeLists文件所在目录(必要交付件)op_tilling存放数据的切分和分块计算相关文件scripts自定义算子工程打包相关脚本tbeTBE算子实现文件所在目录(必要交付件)创建自定义算子工程在桌面新建终端,输入指令切换到tbe所在工程文件夹,如REF_Ref8902\h图2-6-8所示。图2-6-SEQ图2-6-\*ARABIC8进入tbe所在工程文件夹输入指令,编辑add_dsl.json算子的原型文件,如REF_Ref8931\h图2-6-9所示。图2-6-SEQ图2-6-\*ARABIC9编辑add_dsl.json算子的原型文件修改AddDsl算子的原型,定义输入的两个张量的名称为x1和x2,输出张量名称为y,张量类型为float16、张量格式为NCHW,用于生成AddDsl的算子开发工程。[{"op":"AddDSL","input_desc":[{"name":"x1","param_type":"required","format":["NCHW"],"type":["fp16"]},{"name":"x2","param_type":"required","format":["NCHW"],"type":["fp16"]}],"output_desc":[{"name":"y","param_type":"required","format":["NCHW"],"type":["fp16"]}]}]保存并关闭json文件,使用快捷键“Ctrl+C”结束终端。在桌面新建终端,输入指令切换到Ascend-toolkit所在工程文件夹,如REF_Ref8958\h图2-6-10所示。图2-6-SEQ图2-6-\*ARABIC10进入Ascend-toolkit所在工程文件夹在msopgen工具,根据add_dsl.json文件中定义的算子信息,生成适用于Ascend610AI处理器的算子工程,并将工程文件输出到/home/eisa/Sample/tbe/AddDsl目录下,如REF_Ref8974\h图2-6-11所示。图2-6-SEQ图2-6-\*ARABIC11生成算子工程生成算子工程命令参数解释见REF_Ref9428\h表2-6-3。表2-6-SEQ表2-6-\*ARABIC3生成算子工程命令解释参数解释-ftf原始框架,选择TensorFlow框架-cai_core-<soc_version>算子在AICore上执行<soc_version>处理器型号,这里填写Ascend610命令执行后,在/home/eisa/Sample/tbe/AddDsl目录下生成可用于交付的模板文件、编译脚本,如所示。算子实现修改add_dsl函数在桌面新建终端,输入指令切换到add_dsl.py所在工程文件夹,如REF_Ref28616\h图2-6-12所示。图2-6-SEQ图2-6-\*ARABIC12进入add_dsl.py所在工程文件夹输入指令编辑add_dsl.py,如REF_Ref28642\h图2-6-13所示。图2-6-SEQ图2-6-\*ARABIC13编辑add_dsl.py导入Python模块,输入如下代码。importtbefromtbeimporttvmfromtbeimportdslfrommon.utilsimportpara_checkfrommon.utilsimportshape_utilfromfunctoolsimportreduce编写add_computer函数用于执行实际的加法计算。#定义一个固定形状大小的常量SHAPE_SIZE_LIMIT=2147483648@mon.register.register_op_compute("add",op_mode="static")#定义add_computer函数,执行实际的加法运算defadd_compute(input_x,input_y,output_z,kernel_name="add"):shape_x=shape_util.shape_to_list(input_x.shape)shape_y=shape_util.shape_to_list(input_y.shape)shape_x,shape_y,shape_max=shape_util.broadcast_shapes(shape_x,shape_y,param_name_input1="input_x",param_name_input2="input_y")#shape_max取shape_x与shape_y的每个维度的大值#数据验证,抛出异常数据shape_size=reduce(lambdax,y:x*y,shape_max[:])ifshape_size>SHAPE_SIZE_LIMIT:raiseRuntimeError("theshapeistoolargetocalculate")input_x=dsl.broadcast(input_x,shape_max)input_y=dsl.broadcast(input_y,shape_max)#使用DSL的vadd函数执行加法操作res=dsl.vadd(input_x,input_y)returnres编写add函数,构建算子的计算图和调度。add_computer中的输入x和y,需要add函数占位符处理后作为输入。#定义add函数,构建算子的计算图和调度defadd(input_x,input_y,output_z,kernel_name="add"):shape_x=input_x.get("shape")shape_y=input_y.get("shape")check_tuple=("float16","float32","int32")input_data_type=input_x.get("dtype").lower()#数据验证,抛出异常数据ifinput_data_typenotincheck_tuple:raiseRuntimeError("onlysupport%swhiledtypeis%s"%(",".join(check_tuple),input_data_type))shape_x,shape_y,shape_max=shape_util.broadcast_shapes(shape_x,shape_y,param_name_input1="input_x",param_name_input2="input_y")ifshape_x[-1]==1andshape_y[-1]==1andshape_max[-1]==1:shape_x=shape_xiflen(shape_x)==1elseshape_x[:-1]shape_y=shape_yiflen(shape_y)==1elseshape_y[:-1]shape_max=shape_maxiflen(shape_max)==1elseshape_max[:-1]#占位符data_x=tvm.placeholder(shape_x,name="data_1",dtype=input_data_type)data_y=tvm.placeholder(shape_y,name="data_2",dtype=input_data_type)res=add_compute(data_x,data_y,output_z,kernel_name)#调度withtvm.target.cce():schedule=dsl.auto_schedule(res)#算子构建config={"name":kernel_name,"tensor_list":(data_x,data_y,res)}dsl.build(schedule,config)运行程序在“add_dsl.py”文件最下方添加main函数调用该算子。#调试调用算子if__name__=='__main__':input_output_dict={"shape":(5,6,7),"format":"ND","ori_shape":(5,6,7),"ori_format":"ND","dtype":"float16"}add(input_output_dict,input_output_dict,input_output_dict,kernel_name="add")保存并关闭“add_dsl.py”文件,在“add_dsl.py”文件新建终端,执行以下命令,配置“add_dsl.py的运行环境,如REF_Ref9033\h图2-6-14所示。图2-6-SEQ图2-6-\*ARABIC14配置“add_dsl.py”的运行环境执行以下命令,对算子实现文件进行编译,并对实现代码进行语法校验,如REF_Ref9069\h图2-6-15所示。图2-6-SEQ图2-6-\*ARABIC15运行add_dsl.py如果编译没有报错,会在运行终端生成kernel_meta文件夹,该文件夹中包含算子二进制文件add.o和算子描述文件add.json,如REF_Ref9105\h图2-6-16所示。图2-6-SEQ图2-6-\*ARABIC16运行结果AOE调优定义数据格式与形状定义两个相同形状和类型的输入张量和一个具有相同形状与类型的输出张量,确保数据在不同操作间正确地传递和处理。在桌面新建终端,输入指令切换到AOE所在工程文件夹,如REF_Ref9176\h图2-6-17所示。图2-6-SEQ图2-6-\*ARABIC17切换到AOE所在工程文件夹输入以下命令,修改add.json文件,定义加法操作的输入tensor和输出tensor的形状和类型,如REF
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 医院感染管理办法中医院感染暴发的定义与报告流程考试试题
- 七年级地理上册教学设计:太空探索与人类家园的地理视角
- 2026年上海市生产服务合作联社人员招聘考试题库及详细答案解析
- 2026年广东省粤科金融集团有限公司人员招聘笔试参考试题及详细答案解析
- 九年级物理《浮力 阿基米德原理》一轮复习分层作业本教学设计
- 2025医疗器械类考试题库及参考答案
- 高中高二化学能层能级激发态原子光谱教学设计
- 2026安全员测试题库及答案
- 小学二年级体育与健康教学设计:游戏化情境下基础移动能力与协调素质的整合教学
- 2026财经法规期末税法计算案例综合试题及答案
- 新疆维吾尔自治区初中级档案职称考试(档案基础)手机备考题库及答案(2026年)
- 肿瘤心理干预沟通护理课件
- 2026年校招:中国银行试题及答案
- 2026年物业管理条例考核试题及答案
- 公共娱乐场所电气消防安全培训
- 2026秋新版道德与法治五年级上册教学课件:第七课第1课时 社会主义好-自力更生结硕果 有多个微课视频
- 第5课 中国人民站起来了 第1课时 课件(内嵌视频)2026-2027学年道德与法治五年级上册统编版
- 制造业公司绩效考核含全套KPI指标库
- 2026年《资料员》考试题库带答案(考试直接用)
- 水利水电工程基坑临边防护专项方案
- 2026年浙江省绍兴市越城区网格员招录真题(含答案)
评论
0/150
提交评论