范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

TVM学习资料TensorIR快速入门

  本篇文章译自英文文档 Blitz Course to TensorI 作者是 冯思远 。更多 TVM 中文文档可访问 TVM 中文站 https://hyper.ai
  TensorIR 是深度学习领域的特定语言,主要有两个作用: 在各种硬件后端转换和优化程序。 自动 _tensorized_ 程序优化的抽象。 import tvm from tvm.ir.module import IRModule from tvm.script import tir as T import numpy as npIRModule
  IRModule 是 TVM 的核心数据结构,它包含深度学习程序,并且是 IR 转换和模型构建的基础。
  编辑切换为居中
  添加图片注释,不超过 140 字(可选)
  上图展示的是 IRModule 的生命周期,它可由 TVMScript 创建。转换 IRModule 的两种主要方法是 TensorIR 的 schedule 原语转换和 pass 转换。此外,也可直接对 IRModule 进行一系列转换。注意,可以在 任何 阶段将 IRModule 打印到 TVMScript。完成所有转换和优化后,可将 IRModule 构建为可运行模块,从而部署在目标设备上。
  基于 TensorIR 和 IRModule 的设计,可创建一种新的编程方法: 基于 Python-AST 语法,用 TVMScript 编写程序。 使用 Python API 转换和优化程序。 使用命令式转换 API 交互检查和提高性能。 创建 IRModule
  IRModule 是 TVM IR 的一种可往返语法,可通过编写 TVMScript 来创建。
  与通过张量表达式创建计算表达式(使用张量表达式操作算子)不同,TensorIR 允许用户通过 TVMScript(一种嵌在 Python AST 中的语言)进行编程。新方法可以编写复杂的程序并进一步调度和优化。
  下面是向量加法的示例: @tvm.script.ir_module class MyModule:     @T.prim_func     def main(a: T.handle, b: T.handle):         # 我们通过 T.handle 进行数据交换,类似于内存指针         T.func_attr({"global_symbol": "main", "tir.noalias": True})         # 通过 handle 创建 Buffer         A = T.match_buffer(a, (8,), dtype="float32")         B = T.match_buffer(b, (8,), dtype="float32")         for i in range(8):             # block 是针对计算的抽象             with T.block("B"):                 # 定义一个空间(可并行)block 迭代器,并且将它的值绑定成 i                 vi = T.axis.spatial(8, i)                 B[vi] = A[vi] + 1.0  ir_module = MyModule print(type(ir_module)) print(ir_module.script())
  输出结果:  # from tvm.script import tir as T @tvm.script.ir_module class Module:     @T.prim_func     def main(A: T.Buffer[8, "float32"], B: T.Buffer[8, "float32"]) -> None:         # function attr dict         T.func_attr({"global_symbol": "main", "tir.noalias": True})         # body         # with T.block("root")         for i in T.serial(8):             with T.block("B"):                 vi = T.axis.spatial(8, i)                 T.reads(A[vi])                 T.writes(B[vi])                 B[vi] = A[vi] + T.float32(1)
  此外,我们还可以使用张量表达式 DSL 编写简单的运算符,并将它们转换为 IRModule。 from tvm import te  A = te.placeholder((8,), dtype="float32", name="A") B = te.compute((8,), lambda *i: A(*i) + 1.0, name="B") func = te.create_prim_func([A, B]) ir_module_from_te = IRModule({"main": func}) print(ir_module_from_te.script())
  输出结果: # from tvm.script import tir as T @tvm.script.ir_module class Module:     @T.prim_func     def main(A: T.Buffer[8, "float32"], B: T.Buffer[8, "float32"]) -> None:         # function attr dict         T.func_attr({"global_symbol": "main", "tir.noalias": True})         # body         # with T.block("root")         for i0 in T.serial(8):             with T.block("B"):                 i0_1 = T.axis.spatial(8, i0)                 T.reads(A[i0_1])                 T.writes(B[i0_1])                 B[i0_1] = A[i0_1] + T.float32(1)构建并运行 IRModule
  可将 IRModule 构建为特定 target 后端的可运行模块。 mod = tvm.build(ir_module, target="llvm")  # CPU 后端的模块 print(type(mod))
  输出结果: 
  准备输入数组和输出数组,然后运行模块: a = tvm.nd.array(np.arange(8).astype("float32")) b = tvm.nd.array(np.zeros((8,)).astype("float32")) mod(a, b) print(a) print(b)
  输出结果: [0. 1. 2. 3. 4. 5. 6. 7.] [1. 2. 3. 4. 5. 6. 7. 8.]转换 IRModule
  IRModule 是程序优化的核心数据结构,可通过  Schedule   进行转换。schedule 包含多个 primitive 方法来交互地转换程序。每个 primitive 都以特定方式对程序进行转换,从而优化性能。
  上图是优化张量程序的典型工作流程。首先,用 TVMScript 或张量表达式创建一个初始 IRModule,然后在这个初始 IRModule 上创建 schedule。接下来,使用一系列调度原语来提高性能。最后,我们可以将其降低并构建成一个可运行模块。
  上面只演示了一个简单的转换。首先,在输入  ir_module  上创建 schedule: sch = tvm.tir.Schedule(ir_module) print(type(sch))
  输出结果: 
  将嵌套循环展开成 3 个循环,并打印结果: # 通过名字获取 block block_b = sch.get_block("B") # 获取包围 block 的循环 (i,) = sch.get_loops(block_b) # 展开嵌套循环 i_0, i_1, i_2 = sch.split(i, factors=[2, 2, 2]) print(sch.mod.script())
  输出结果: # from tvm.script import tir as T @tvm.script.ir_module class Module:     @T.prim_func     def main(A: T.Buffer[8, "float32"], B: T.Buffer[8, "float32"]) -> None:         # function attr dict         T.func_attr({"global_symbol": "main", "tir.noalias": True})         # body         # with T.block("root")         for i_0, i_1, i_2 in T.grid(2, 2, 2):             with T.block("B"):                 vi = T.axis.spatial(8, i_0 * 4 + i_1 * 2 + i_2)                 T.reads(A[vi])                 T.writes(B[vi])                 B[vi] = A[vi] + T.float32(1)
  还可对循环重新排序。例如,将循环 i_2 移到 i_1 之外: sch.reorder(i_0, i_2, i_1) print(sch.mod.script())
  输出结果 # from tvm.script import tir as T @tvm.script.ir_module class Module:     @T.prim_func     def main(A: T.Buffer[8, "float32"], B: T.Buffer[8, "float32"]) -> None:         # function attr dict         T.func_attr({"global_symbol": "main", "tir.noalias": True})         # body         # with T.block("root")         for i_0, i_2, i_1 in T.grid(2, 2, 2):             with T.block("B"):                 vi = T.axis.spatial(8, i_0 * 4 + i_1 * 2 + i_2)                 T.reads(A[vi])                 T.writes(B[vi])                 B[vi] = A[vi] + T.float32(1)转换为 GPU 程序
  要在 GPU 上部署模型必须进行线程绑定。幸运的是,也可以用原语来增量转换。 sch.bind(i_0, "blockIdx.x") sch.bind(i_2, "threadIdx.x") print(sch.mod.script())
  输出结果: # from tvm.script import tir as T @tvm.script.ir_module class Module:     @T.prim_func     def main(A: T.Buffer[8, "float32"], B: T.Buffer[8, "float32"]) -> None:         # function attr dict         T.func_attr({"global_symbol": "main", "tir.noalias": True})         # body         # with T.block("root")         for i_0 in T.thread_binding(2, thread="blockIdx.x"):             for i_2 in T.thread_binding(2, thread="threadIdx.x"):                 for i_1 in T.serial(2):                     with T.block("B"):                         vi = T.axis.spatial(8, i_0 * 4 + i_1 * 2 + i_2)                         T.reads(A[vi])                         T.writes(B[vi])                         B[vi] = A[vi] + T.float32(1)
  绑定线程后,用 cuda  后端来构建 IRModule: ctx = tvm.cuda(0) cuda_mod = tvm.build(sch.mod, target="cuda") cuda_a = tvm.nd.array(np.arange(8).astype("float32"), ctx) cuda_b = tvm.nd.array(np.zeros((8,)).astype("float32"), ctx) cuda_mod(cuda_a, cuda_b) print(cuda_a) print(cuda_b)
  输出结果: [0. 1. 2. 3. 4. 5. 6. 7.] [1. 2. 3. 4. 5. 6. 7. 8.]
  下载 Python 源代码:tensor_ir_blitz_course.py
  下载 Jupyter Notebook:tensor_ir_blitz_course.ipynb
  以上就是该文档的全部内容,查看更多 TVM 中文文档,请访问

将数据拉满,乔丹补4个赛季,能够拿到42000分,老詹可能45000分在篮球这项运动中,篮球进框得到的分数是最关键的数据。毕竟,球队的输赢和它相关,球员的薪资也和它直接相关。得分与薪资这种能成正比的关系,让NBA联盟诞生了许多得分狂人,比如联盟四大分黑鲨双11开门红战报来了,手机外设均登顶销量排行榜一年一度的双十一购物节绝对是消费者入手新机的最佳时期!在这段时间手机价格往往会达到一年中的最低点。不过虽然一系列的优惠福利让人忍不住买买买!但是我们在选购手机时还是要考虑性价比。如41岁柳岩网红气息浓厚,穿黑丝街头热舞无人识,为了事业真的拼说到柳岩也许对于零零后是陌生的,但是其他年龄段的人,应该都知道,曾经一直以好身材风靡娱乐圈。11月1日晚,柳岩在社交平台上发布了一个新视频,视频中柳岩穿衣打扮十分引人注目,紧身包臀西部第四遭遇43分惨败,波波维奇为输球不择手段!西卡轻松轰三双NBA常规赛继续进行,马刺主场迎战猛龙。此前马刺战绩为5胜2负,排名西部第四,实话实说,波波维奇带着这套阵容,真有点不可思议。而猛龙此前4胜3负,排名东部第四。今天的比赛,马刺这边21到31!罗马双线崛起,穆二年晋级定律护航,剑指小组第2头条创作挑战赛欧联杯小组赛末轮将至,由于以西甲豪门巴塞罗那为首的欧冠球队相继空降欧联赛场,这让欧联小组第一之争变得更加激烈,毕竟谁都不愿与这些失落的豪门球队再进行两回合18淘汰赛附知三当三!路人缘再好,这下也彻底凉凉了恋爱脑知三当三,再好的路人缘也会被败坏吧?没错,说的就是福原爱啦。福原爱最近的热闹新闻不知道大家看了没看,福原爱在生日也就是11月1日,因被男友前妻起诉闹得沸沸扬扬。福原爱大家基本英德大战双星闪耀,2022金童奖终极角逐欧洲足坛除了属于最优秀球员的金球奖,每年还有颁发给年轻球员的金童奖,梅西鲁尼姆巴佩等都是曾经获得过此殊荣的天才球员。由都灵体育报举办的金童奖评选,已经给出了本年度40人的大名单,可还在找Notion平替?我建议你试试这款开源笔记工具谈起好用的笔记软件,大多数人首选的可能是Notion,许多Notion的深度用户将其比作自己的第二大脑。作为一款PLG(产品驱动增长)的内容协作平台,Notion凭借其出色的产品力今日全国尿素出厂价格2022年11月3日哈喽,大家好!这里是化肥价格行情!关注我每天看最新尿素复合肥磷铵钾肥价格行情!今天(2022年11月3日)下面是今日国内最新尿素价格行情!今日国内尿素多地报价上调2040元吨,基于石油巨头狂赚战争暴利?欧美多国开征暴利税英国石油公司(BP)和壳牌公司的徽标摘要随着全球许多国家出现了经济下滑通胀高企的滞胀状态,而一些行业却逆行获得暴利,征收暴利税的想法在西方开始走俏作者魏城最近几天,全球石油巨头纷纷活着就是福气很喜欢一句话一个人脾气来的时候,福气就走了,你做对了,没有必要生气,做错了没有资格生气,这样想就不会生气了。深以为然。生气一方面是对自己无能的一种愤慨,另一方面多是自私自利的表现,杜锋威信全无,输伊朗或面临下课,真硬气,陶汉林拒绝支援国家队昨日,山东媒体记者通过社交媒体与陶汉林互动,他问道网上都在疯传你要进国家队,你会去国家队支援吗,陶汉林回了俩字不会。不得不说,陶汉林真硬气。且不论有没有护照,且不论究竟有没有接到邀硬气!李景亮再次公开炮轰UFC你们的裁判太黑了,真是自毁招牌10月23日,中国UFC一哥嘎子李景亮再次对自己效力的老东家UFC进行抨击,由于当天凌晨4点结束的UFC280系列赛的一场主赛严VS蜜糖出现了明晃晃的黑哨,李景亮看到这一幕后感同身当没有了游客,著名的章丘石匣村也没有了灵气,变成了普通的村落济南章丘有一个石匣村,非常有名,既是古村落,又是乡村振兴的典范,历史悠久,特色鲜明。每当节假日,来自四面八方的游客挤满了这个狭窄的小山村。位于村口处的景区全景图去年的秋天,我第一次三星杯韩方抽签够硬气!首轮强强对碰,打算一举歼灭中方精锐?中方精锐绝无冷场场场硬战!充斥着虾兵蟹将的三星杯,头一轮对阵竟迎来中韩主力大对抗。第27届三星杯首轮对阵表中韩主力大对碰(棋手白字为世冠)韩方小觑了三星杯之男唐韦星?或是已无可战之菲尔斯宾塞(PhilSpencer)承认,Xbox已经太久没有第一方独家了Xbox老板菲尔斯宾塞(PhilSpencer)承认,自从一款重要的第一方独家游戏登陆XboxSeriesX和S以来,已经有太长时间了。斯宾塞在YouTube上接受SameBrai麻布仔大冒险单人游玩亦可,联机乐趣更多欢迎关注,获取更多游戏评测资讯,入手与否不再犹豫喜欢的不妨点个赞唷()麻布仔大冒险是由SumoDigital制作的一款3D平台跳跃多人合作冒险游戏,由索尼在2020年11月12日在如何成为下一个羊了个羊现在最火的是什么?羊了个羊,浪里个浪。真的是全民皆羊,我身边的人各个都在说羊,还有没玩过这个游戏的人,竟然放出豪言一个小小的游戏,有何难的,看我一分钟通关。一分钟后这是什么鬼东西,为什么说事后避孕药不靠谱?因为这是我自己的经历。我结婚后第三个月就怀孕了,在那之前一个多月的XXOO后,我立马吃了一颗紧急避孕药。因为我那时刚停吃短效避孕药,担心孩子受药影响,不健康,没那么快想要孩子,于是当爱已成往事头条创作挑战赛读天下奇文看世间美好烟花永远的美丽在于它的短暂,刻骨铭心的爱情却没有痕迹,坚持却显得无望,因此,永远没有开启的一天。我们的心是一朵飘在风中的云,一路飘着,直到积满了灰积极承担责任时光如水,人生易逝,转眼间红颜成白发。回望历史,可以发现,只有积极承担责任,才能成为历史河流中一朵美丽的浪花。奥斯特洛夫斯基说人的一生可能燃烧也可能腐朽,我不能腐朽,我愿意燃烧起来只有一种爱才能天长地久?在感悟当中,只有一种人才能爱到天长地久。当看到情人两个人,你肯定会觉得他们关系不正当,会任何,情人就是破坏家庭的第三者。可殊不知如果真是破坏别人家庭的第三者,那不叫情人,那只是小三
OLED还是笑到了最后,MiniLED昙花一现,曝苹果未来将过渡到OLED对于MiniLED屏幕而言,被不少人视为OLED的替代品,只是现阶段高成本高功耗的现状,无法大规模应用到移动设备上。就连技术较强的苹果,现阶段用上MiniLED屏幕的设备也屈指可数印度版AppleWatch发布,仅售252元,苹果这次要报警说起印度。想必机友们眼前,立马就会浮现出各种,干净又卫生的名场面吧?但机哥今天想说的是。印度,并不止是一个美食之乡。它其实,还是一个仅次于华强北的山寨之都。喏就在前两天,印度一家叫1956年的甘肃武威火车站,人手一兜小苹果,油馓子就着油泼面甘肃武威,旧名凉州,是古代中原通往西域要道上的一座重镇。众多文人墨客在这里留下过足迹,在唐宋诗词中,我们无数次感受过这座古城的边塞风情。1956年,新西兰摄影师汤姆哈金斯(TomH海淘攻略日本代购如何低入手正品LV包?原来的gucci和lv对比,gucci相对时尚,但现在已经不一样了,lv自从最近出了圆饼包锁头包新邮差包等,也成了明星ins网红必备包包,lv包也走上了时尚的舞台,所以从流行的外观日本女人50岁头发依旧浓密?只要保持这5个小习惯,头发乌黑蓬松日本女人50岁头发依旧浓密?只要保持这5个小习惯,头发乌黑蓬松如果大家平时喜欢看日剧的话,我们就也能从其中一些生活化的影视剧中感受到整部剧的质感,虽然没有偶像剧那么浪漫,但我们不可什么是Q1探亲签证?办理Q1探亲签证需要准备什么材料?亲人朋友永远是远在他乡的人最牵挂的,再加上节日就快要到了,许多远在异国的人也想来中国看看家人朋友。那么这些在国外想要到中国探亲的人便需要持有Q字探亲签证进入中国。Relatives国际社会对中国不会那么友好,一些幼稚的观点可以洗洗睡中国公民出国旅游护照将恢复审批共同社12月27日消息,日本首相岸田文雄27日宣布,30日起将加强入境防疫措施。对从中国大陆赴日及7天内去过中国的所有人员,日本将实施入境时检测。岸田碧罗雪山游记(五旅途)银杏村腾越散人一早大家驱车出发,我开车跟着潘子的车往前七弯八拐的走了二三十公里,一条大河已经拦在我们的前面,河畔依山陡峭的崖壁下建着三五间红砖建筑。潘子在对讲机里和我说龙哥,这是一元旦游园会来啦!以崇明民俗的烟火气,迎接新年HAPPYNEWYEAR兔UGOODBYE2022,HELLO20232023年的钟声即将敲响,翻过旧年的日历,我们以民俗的烟火气,迎接新年的到来。祝愿大家安康如意,兔年吉祥好运连新疆游记(8)Day8今天的主要计划是游览巴音布鲁克大草原(5A)。巴音布鲁克,蒙古语意为富饶的泉水,草原面积2。38万平方公里,分布着20多条河流13处泉水7个大小湖泊。水草茂盛,生态环境优美马之涛丨乌中记忆乌中记忆文马之涛距我家三十里处,有一座远近闻名的古镇,小镇名曰乌龙铺。在乌龙河畔的阳坡上,静卧着一所享誉陕北的学校,那便是乌镇中学(以下简称乌中)。不知从何时起,人们都称乌龙铺为乌