任务2.5 算子开发方式-DSL与TIK-课件_第1页
任务2.5 算子开发方式-DSL与TIK-课件_第2页
任务2.5 算子开发方式-DSL与TIK-课件_第3页
任务2.5 算子开发方式-DSL与TIK-课件_第4页
任务2.5 算子开发方式-DSL与TIK-课件_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

主讲老师:李锋算子开发方式-DSL与TIK项目2:AI应用开发及测试任务2.5《车载计算平台技术与应用》目录任务导入AssignmentINTRO学习目标LearningobjectivesCONTENTS0102知识准备Backgroundknowledge03课堂总结Classroomsummary0504课堂小测ClassroomquizzPART01任务导入AssignmentINTRO任务导入TBE算子开发有DSL(Domain-SpecificLanguage)和TIK(TensorIteratorKernel)两种方式,开发者可根据使用场景选择对应的开发方式。请从开发者的角度分析,DSL开发方法和TIK开发方式的异同以及两种开发方式的实现流程。TIK算子实现流程DSL算子实现流程PART02学习目标Learningobjectives学习目标素质目标鼓励学生专研精神,强化自主研发能力,实现技术自立自强;鼓励学生进行创新实践,以创新驱动经济社会发展;培养学生的团队合作能力和沟通表达能力。能力目标能总结达芬奇架构上各硬件的数据流向[A23];能编写出TBEDSL算子代码结构[A24];能编写出TBETIK算子代码结构[A25]。知识目标能绘制达芬奇架构的逻辑图[K29];能描述TBEDSL算子开发流程[K30];能描述TBETIK算子开发流程[K31]。PART03知识准备Backgroundknowledge一、达芬奇架构Ascend610处理器的主要架构组成包括AI计算引擎(包括AICore和AICPU)、芯片系统控制CPU、多层级的片上系统缓存或缓冲区、数字视觉预处理模块等。1.Ascend610处理器逻辑架构(AIInferenceSoC)Ascend610处理器逻辑架构一、达芬奇架构AICore是昇腾AI处理器的计算核心,采用华为自研的达芬奇架构,通常也被叫做DaVinciCore。达芬奇架构主要由计算单元(矩阵计算单元、向量计算单元、标量计算单元)、片上缓存区、存储转换单元、控制单元、总线接口单元组成。2.AICore总体架构达芬奇架构图一、达芬奇架构计算单元是达芬奇架构中提供强大算力的核心单元,主要包含矩阵计算单元(Cube)、向量计算单元(Vector)、标量计算单元(Scalar)和累加器(Accumulator)。2.AICore总体架构(1)计算单元计算单元一、达芬奇架构Cube执行与矩阵相关的运算;Vector执行向量运算;Scalar负责各类型的标量数据运算和程序的流程控制;Accumulator把当前矩阵乘的结果与前次计算的中间结果相加,完成卷积中加bias操作。2.AICore总体架构(1)计算单元计算单元CubeVectorScalarAccumulator一、达芬奇架构片上缓冲区包括用来防止整体图像特征数据、网络参数以及中间结果的输入缓冲区和输出缓冲区;提供临时变量的高速寄存器单元,这些寄存器位于各计算单元中。2.AICore总体架构(2)片上缓冲区片上缓冲区一、达芬奇架构控制单元主要包括系统控制模块、标量指令处理队列、指令发射模块、矩阵运算队列、向量运算队列、存储转换队列和事件同步模块。2.AICore总体架构(3)控制单元控制单元一、达芬奇架构存储转换单元设置于输入缓冲区后,实现以极高的效率进行数据格式的转换。2.AICore总体架构(4)存储转换单元存储转换单元一、达芬奇架构总线接口单元,与总线交互的接口。AICore从外部(L2/DDR/HBM)读取数据的入口以及往外写数据的出口。负责把AICore的读写请求转换为总线上的请求并完成协议交互等工作。2.AICore总体架构(5)总线接口单元总线接口单元二、DSL开发方式TBE提供了一套计算接口DSL(Domain-SpecificLanguage)供开发者用于组装算子的计算逻辑,使得70%以上的算子可以基于这些接口进行开发,极大地降低自定义算子的开发难度。1.DSL算子简介DSL计算接口二、DSL开发方式基于TBEDSL的算子开发方式可以直接使用TBE提供的AutoSchedule机制完成自动调度过程,省去最复杂的调度编写过程。TBEDSL算子的功能框架中DSL计算接口和AutoSchedule为开发者调用,编译优化和代码生成为系统内部自动调用。1.DSL算子简介算子开发算子代码开发代码生成(CodeGen)DSL计算接口AutoScheduleScheduleTemplate编译优化(Pass)TBE工具TBEDSL功能框架二、DSL开发方式开发者调用TBE提供的DSL接口进行计算逻辑的描述,指明算子的计算方法和步骤。TBEDSL提供的计算接口主要涵盖向量运算,包括Math、NN、Reduce、卷积、矩阵计算等接口。1.DSL算子简介(1)DSL计算接口TBEDSLAPI接口功能elewise_compute对Tensor中每个原子值分别做相同操作,样例中te.ang.cce.vabs即对每个数值x求绝对值reduction_compute对Tensor按轴进行操作,例如te.lang.cce.sum(data,axis)表示对data按axis进行累加Segment_compute对Tensor进行分段操作二、DSL开发方式TBEDSL提供的计算接口功能说明。1.DSL算子简介(1)DSL计算接口TBEDSLAPI接口功能cast_compute对Tensor中数据的数据类型进行转换,例如float16转换为float32Broadcast_compute对Tensor按照目标shape进行广播,如shape为(3,1,2)的Tensor广播成(3,3,2)的Tensormmad_compute支持矩阵乘法卷积相关compute除以上几种compute,还有一些专门针对卷积的compute二、DSL开发方式TBEDSL提供了AutoSchedule机制,开发者通过组合DSL接口表达算子的计算逻辑后,直接调用AutoSchedule接口即可实现自动调度,完成数据切块和数据流向的划分。1.DSL算子简介(2)AutoSchedule设置scope标志按照pattern进行AST子图切分选择Schedule模板,并对AST子图进行Schedule处理创建并初始化Schedule对象AutoSchedule总体流程二、DSL开发方式DSL接口已高度封装,开发者仅需要使用DSL接口完成计算过程的表达,后续的Schedule创建、优化及编译都可通过已有接口一键式完成。具有入门难度低,适合初级开发者的优势,但是某些场景下性能可能较低,复杂算子逻辑无法支持表达。2.DSL算子开发的特点计算语句与tag_scope标志对应示例二、DSL开发方式在实现算子代码之前需要分析算子的数学表达式,输入、输出,明确需要调用的DSL接口,然后进行算子实现代码的开发。基于DSL的算子实现代码包含引入依赖的Python模块、算子接口定义、自动调度、算子编译。3.DSL算子代码实现#引入依赖的Python模块fromtbeimportdslfromtbeimporttvmfrommon.utilsimportpara_checkfrommon.utilsimportshape_util二、DSL开发方式基于DSL的算子实现代码包含引入依赖的Python模块、算子接口定义、自动调度、算子编译。3.DSL算子代码实现#算子接口定义defadd(input_x,input_y,output_z,kernel_name="add"):""""TODO:使用TVM的placeholder接囗对输入tensor占位""""""""TODO:进行计算逻辑的实现""""#自动调度withtvm.target.cce():schedule=dsl.autoschedule(res)#算子编译config={"name":kernelname,"tensorlist":(data_x,data_y,res)}dsl.build(schedule,config)二、DSL开发方式若算子运行出错,可在CPU中进行DSL算子的功能调试,验证算子的算法逻辑是否正确。4.DSL功能调试进入Debug模式,并获取算子运行上下文定义golden算子输出校验算子编译执行计算逻辑实现,根据需要进行中间数据验证创建算子调度实例DSL功能调试流程二、DSL开发方式首先调用mon.testing.debug接口,并配合pythonwith语句进入调试模式,选择CPU作为算子的运行平台。然后调用mon.testing.get_ctx接口,获取算子运行的上下文。4.DSL功能调试(1)进入Debug模式并获取算子运行的上下文进入Debug模式并获取算子运行的上下文二、DSL开发方式用于后续的中间Tensor数据验证及算子输出验证。4.DSL功能调试(2)定义golden数据定义golden数据二、DSL开发方式首先调用TBE提供的DSL接口进行计算逻辑描述,指明算子的计算方法和步骤。然后调用mon.testing.print_tensor接口,将中间Tensor的数据存入文件或直接显示,调用mon.testing.assert_allclose接口进行中间Tensor的数据校验。4.DSL功能调试(3)实现DSL算子的计算逻辑,并根据需要进行中间数据验证实现DSL算子的计算逻辑,并根据需要进行中间数据验证二、DSL开发方式调用TVM的create_schedule接口,为算子创建调度实例对象。4.DSL功能调试(4)创建算子调度实例创建算子调度实例二、DSL开发方式首先调用mon.testing.build接口,编译生成在CPU上运行的DSL算子。然后调用mon.testing.run接口执行算子。4.DSL功能调试(5)算子编译运行算子编译执行二、DSL开发方式编写入口函数,调用算子接口,进行算子的功能调试,验证输出数据的正确性。4.DSL功能调试(6)算子输出校验算子输出校验二、DSL开发方式以Sqrt算子为例,其功能是对Tensor中每个原子值求开方,数学表达式为:。根据当前TBE框架可支持的计算描述API,可采用以下公式来表达Sqrt算子的计算过程y=exp(0.5*log(x))。4.DSL功能调试(7)调试实例Sqrt算子代码实现二、DSL开发方式4.DSL功能调试(7)调试实例

#定义Sqrt算子的名称为sqrt

defsartcompute(x,y,kernel_name="sgrt"):

#定义Sqrt的计算过程y=exp(0.5*log(x))

log_val=te.lang.cce.vlog(x)

const_val=tvm.const(0.5,dtype='float32')

mul_val=te.lang.cce.vmuls(log_val,const_val)

res=te.lang.cce.vexp(mulval)

#Tensor占位符datax=tvm.placeholder(x.get("shape"),dtype=x.get("dtype"),name="datax")

#自动调度schedule=generic.auto_schedule(res)二、DSL开发方式4.DSL功能调试(7)调试实例

#构建算子

Config={“name”:kernel_name,“tensor_list”:[data_x,res]}

Te.lang.cce.cce_build_code(schedule,config)

思政专栏2024年7月18日,由华为技术有限公司和河北人工智能计算中心共同举办的“昇腾CANN技术行-算子开发专场(河北站)”在河北廊坊成功举办。活动中,昇腾CANN技术专家通过理论讲解及现场实操,深入介绍了AscendC的算子开发和开放能力。这种理论与实践相结合的方式,使参与者能够直接体验到新技术的优势,并快速掌握相关技能。算子开发专场(河北站)思政专栏活动还强调了人才培养和产学研融合的重要性,河北人工智能计算中心表示将从政策资源、技术生态、应用场景等多个方面助力人工智能全面产业化。这一举措为AI技术的发展提供了有力的政策保障和资源支持,促进了产学研用的深度融合。2023年10月13日河北人工智能计算中心上线思政专栏算子开发专场展示了华为在AI领域的技术创新实力,鼓励开发者勇于探索新技术,强调产学研合作的重要性,通过活动促进技术交流与合作,共同推动AI产业的发展。在算子开发过程中,如何加强产学研合作,促进算子开发技术的创新与应用?DSL开发方式实现三、TIK开发方式TIK是一种基于Python语言的动态编程框架,呈现为一个Python模块,运行在HostCPU上。开发者可以通过调用TIK提供的API基于Python语言编写自定义算子,然后TIK编译器会编译为昇腾AI处理器应用程序的二进制文件。1.TIK算子开发简介定义目标机,并构建TIKDSL容器Python模块导入数据搬出AICore数据计算数据搬入AICore数据定义编译算子生成目标文件TIK开发方式算子实现流程三、TIK开发方式TIK算子开发方式是一种灵活的开发方式,TIK代码在算子开发效率和算子性能自动优化上有一定的优势,具体表现为并行化、自动内存管理、灵活性、易调试。2.TIK算子开发的特点优势并行化自动内存管理灵活性易调试TIK开发方式算子的优势三、TIK开发方式用户调用TIKAPI编写算子对应的Python程序后,TIK会将其转化为TIKDSL,经过编译器编译后生成CCEC文件,再经过CCE编译器编译后生成可运行在昇腾AI处理器上的应用程序。3.TIK编程模型用户编写TIK算子基于TIKAPI的Python程序TIKAPI运行结果TIK编译器编译结果CCE编译器编译结果TIKDSLCCEC代码(不可见)Davinci应用程序BinaryTIK编程模型三、TIK开发方式从内存中的A,B两处分别读取128个数值,A与B相加,并将结果写入内存地址C中。4.TIK算子代码实现fromtbeimporttikdefsimpleadd():#定义目标机,构建TIKDSL容器tik_instance=tik.Tik()#定义数据data_A=tik_instance.Tensor("float16",(128,),name="data_A",scope=tik.scope_gm)data_B=tik_instance.Tensor("float16",(128,),name="data_B",scope=tik.scope_gm)data_C=tik_instance.Tensor("float16",(128,),name="data_C",scope=tik.scopegm)data_A_ub=tik_instance.Tensor("float16",(128,),name="data_A_ub",scope=tik.scope_ubuf)data_B_ub=tik_instance.Tensor("float16",(128,),name="data_B_ub",scope=tik.scope_ubuf)data_C_ub=tik_instance.Tensor("float16",(128,),name="data_C_ub",scope=tik.scope_ubuf三、TIK开发方式从内存中的A,B两处分别读取128个数值,A与B相加,并将结果写入内存地址C中。4.TIK算子代码实现#搬运数据到UB(数据搬入AICore)tik_instance.datamove(data_A_ub,data_A,0,1,128//16,0,0)tik_instance.datamove(data_B_ub,data_B,0,1,128//16,0,0)#执行加法运算(数据计算)tik_instance.vecadd(128,data_C_ub[0],data_A_ub[0],data_B_ub[0],1,8,8,8)#搬运数据到OUT(数据搬出AICore)tik_instance.datamove(data_C,data_C_ub,0,1,128//16,0,0)#编译TIKDSL,生成目标文件tik_instance.BuildCCE(kernel_name="simpleadd",inputs=[data_A,data_B],outputs=[data_C])returntik_instance三、TIK开发方式TIK算子的功能调试,通过TIKDebug功能验证TIK算子的正确性。4.TIK算子代码实现If_name_=='_main_':set_current_compile_socinfo(“芯片版本”)#调用TIK算子函数tik_instance=simple_add()#初始化输入数据data_x=np.ones((128,)).astype("float16")data_y=np.ones((128,)).astype("float16")feed_dict={'data_A':data_x,'data_B':data_y}#启动功能调试model_data,=tik_instance.tikdb.st

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论