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

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 中文文档,请访问

iphone13砍单减产,全渠道价格暴降据可靠消息称,苹果公司来自供应链的冲击以及俄乌地缘冲突影响,高端手机市场的需求量并不是那么乐观,使得苹果需要对其产能进行重估,苹果公司已砍掉大约1000万台的iPhone13订单。苹果手机价格大跳水最近手机市场非常的波澜起伏,价格跳水很大,各方消息,苹果13的价格已经再给各级代理商下调了500,苹果12和苹果11跳水更严重。手机淡季开始了,好多小伙伴这个时候又想换手机的考虑,iPhone14Pro大局已定iPhone14工厂设计图曝光,就这样了现在距离iPhone14系列的正式发布还有小半年时间,外界就已经曝光了关于iPhone14系列的大量消息。根据供应链的消息,目前iPhone14系列的设计已经基本确定,至少在外观方一次蓄谋已久的跃升vivoXNote开箱体验和评述2022年4月已经成为vivo实质意义的主题月,4月11日,vivo集中发布了商务三剑客折叠屏旗舰XFold大屏旗舰XNote和平板电脑vivoPad。两天后,iQOONeo6也随2022年为什么还有很多玩家忘不了MMORPG文Along嘿朋友,快打开手机看看自己的游戏群吧。杉果编辑群最近俨然成了MMO同好会,正式上线的最终幻想146。0,即将于4月20日推出的魔兽世界新资料片,以及诸多我未曾了解过的新菲律宾开放!2年前挖到的小众海岛,终于可以和你们分享了海岛控们有救了!!!继巴厘岛重启落地签后,旅游圈的好消息接踵而来。近日,菲律宾官宣对中国游客免隔离开放(出国旅行指日可待了)太好了,我心心念念的海岛终于回归了。不管是海岛控酒店控还天然青霉素公布,没事多吃点,或能让癌细胞绕路走提到青霉素,相信大家很了解,但凡是患过炎症的人都知道青霉素,能够起到消炎抗菌止痛的目的。但青霉素属于抗生素,不能胡乱服用,毕竟是药三分毒,如果不注意,使身体的平衡打破,而且有部分人机器人减速机访谈20220416搜索更多机构调研纪要电话会纪要请访问文八股调研电脑端来源网络(真伪自辨)全文共计12406字减速机访谈减速机行业发展市场竞争格局及未来趋势核心观点1。全球RV减速机市场竞争格局1)3种食物,正在悄悄加速你的衰老,劝你管住嘴衰老是生活中最常见的事情,它是人类生态规律的必然,但是衰老会让我们的身体出现相性变化,腿脚不便,腰酸背痛,容易抽筋,还有就是肌肤也会变化,原来水润饱满的肌肤,也因时间的流失而变得松被误会的5种野菜,浑身是宝,营养极高,春季易上火的要多吃春天是播种的季节,万物复苏,当然也不要错过各种野菜尝鲜了,这时候我们带着家人到郊区农村走一走,就会发现很多。挖野菜食野菜,自古有之,人们对于野菜的喜食程度可见一斑。野菜是稀罕物,是黎姿带女儿走机场,穿卫衣减龄又时髦,可惜女儿没有遗传她的美貌90年代的香港女星长得都各有风韵,有肤若凝脂的关之琳,沉鱼落雁的李嘉欣,英气十足的张敏,一颦一笑皆动人的王祖贤,还有超凡脱俗的梨涡美人黎姿等等,她们不仅长相出尘,演技更是非常好,而
现在回头看上海封控时的艰难,我看出了我们民族的底色我从不买股票,因为我不能承受股票所带来的风险,这是我性格中偏于保守的那部分所主导的结果,我觉得这不能算好,也不能算坏,只是比较稳妥罢了。若我还是年轻人,免不了被别人诟病胆小怕事,但去乌克兰看美女,200块人民币究竟能享受什么服务?玩到不想走乌克兰是一个独特的国家,当地拥有众多的风土人情,也有许许多多的特色。人们对乌克兰是特别感兴趣的,因为乌克兰的女孩子非常的漂亮。(此处已添加小程序,请到今日头条客户端查看)不过大家选日元贬值创32年新低,为何日本还在疯狂印钞?揭秘世界30视频请见下面链接日元贬值创32年新低,为何日本还在疯狂印钞?揭秘世界30今年以来,日元不断贬值,最近更是突破了1美元兑150日元,创下自1990年以来的32年新低。9月底,日本央行豫南夜越夜越精神访锦上添花旅游公司董事长刘磊驻报集团全媒体记者许静花灯璀璨,市井长廊,人间烟火,古城夜未央。光影交错间,一半是历史,一半是故乡。仿佛一夜之间,打造不夜城的消息传来,西平县沸腾了!被称为嫘祖文化之乡冶铁铸剑文化为什么埃及成为互联网电缆的最大瓶颈之一当水下电缆聚集在一个地方时,事情就变得棘手了。亚非欧1号互联网电缆沿海底行进15,500英里,连接香港和法国马赛。当它蜿蜒穿过南中国海和欧洲时,这条电缆有助于为从印度到希腊的十几个怀念过去你会怀念过去吗我有一个非常非常爱我,爱家及他的其他亲人甚至他的父老乡亲,还有他的病人。对我,四十年的情份,只要是我喜欢的他都尽力满足,哪怕我只多看一眼商品他也要去买给我,有时跟他出弱者抱怨,强者自省,智者渡人01hr弱者责人围炉夜话里说但责己,不责人,此远怨之道也。遇事多从自己身上找原因,而不是责怪别人,少了无谓的抱怨,才能真正解决问题。有这样一则童话故事。一天,猫头鹰焦急地在树林里飞福建东山,铜山镇,水寨渔船穿梭,蝼蛄房如蜂窝图文黛瓦粉墙东山岛是福建第二大岛,是全国最美十大海岛之一。在人文这一块,东山岛发生过全国绝无仅有的一个重大事件1953年7月,国民党政府在失去大陆后,第一次也是最后一次反攻大陆,登夜雨丨耕夫耕夫行吟之访壶口耕夫行吟之访壶口耕夫黄河壶口瀑布在我心里已沸腾了几十年,一睹黄河飞瀑的神采憧憬了几十年。璧山区政协组织去延安培训学习的机会,我如愿以偿。那晚我们住在延安,天才蒙蒙亮,我就睡不着了,天上掉馅饼?机票白菜价背后有何秘密?机票再现白菜价!近日有网友发现,从沈阳桃仙国际机场飞往安徽芜湖芜宣机场的机票只需9元。春秋航空相关负责人称,不仅仅是芜湖沈阳航线有9元机票,芜湖福州芜湖石家庄等航线的特价机票也仅需古代北京最神奇的洞穴孔水仙舟万佛堂万佛堂无梁殿万佛堂位于房山河北镇磁家务村南,东部紧邻万佛堂村。房山地名志记村西有孔水洞,早见于水经注记载。洞口前墩台上即万佛堂,唐玄宗间(712756年)创建,原名龙泉寺,后改大历除了Model3,30万内值得看的纯电轿跑还有谁?最近,Model3降价的消息吸引了很多人关注。确实,这波降价有点狠,最高便宜了将近2万元,让很多人重新将目光锁定在了这款纯电轿跑身上。但其实,如果你手握30万想买一款纯电轿跑,除了荣耀Magic5曝光全新大底传感器主摄,有望搭载骁龙8Gen2芯片荣耀自从脱离开华为之后也是经历了很多,这两年从低谷出发不断研发回到如今的第一梯队,能看出荣耀一直在突破自己的极限。并且,在今年2月份发布了荣耀Magic4系列,这一系列是荣耀回归之如何清洁电视上的污渍和灰尘头条创作挑战赛清洁LCD或OLED电视的简单说明大多数现代平板电视都是发光二极管(LED)照亮的LCD或OLED屏幕。OLED使用有机发光二极管,具有更好的对比度,更深的黑色和更亮盘前有料丨31省份前三季度GDP出炉,外交部回应加方无理打压中国企业重要消息还有这些点蓝字关注,不迷路重要的消息有哪些今日申购提示新股方面,众智科技申购代码301361,发行价26。44元股,单一账户申购上限0。8万股。投资有风险,申购需谨慎。易纲要完善货币政策体全球芯片业暴跌降价,中国扩产美国失算了近日,华尔街日报中文网报道了一则消息一位在华经营6家工厂的美国人说,考虑到供应链问题贸易紧张局势以及疫情封控,客户希望他到其他的地方生产商品,他表示,没有哪里比得上中国,他用了30斯通选秀失败!火箭骑士酝酿1换3交易,小马丁辅佐探花莫布里?选秀大会对于一支球队有多重要,火箭队在2021届选秀大会中错失了埃文莫布里,在2022届选秀大会中错过了保罗班凯罗,而选中的两名球员杰伦格林和贾巴里史密斯状态堪忧,导致的结果是火箭为了一条裙子,她不惜一次又一次出卖自己的身体,这样真的值吗?中国人一直都觉得棍棒底下出人才是真理,从而只一味的要求孩子埋头苦读,对于孩子的喜好一概忽略。有的父母甚至觉得作为小孩子,不应该有自己的思想,该有的思想,只能放在读书上,其他的像爱好恒指三万点的时候,提升印花税,现在一万五千点是不是该降了?我是盈在投资,一个专注分享投资观点与知识的自媒体,点击上方关注,你想看的这里都有。将时间拨回2021年初,彼时的港股气势如虹,恒指涨到三万点,日最高成交额3500多亿港元。一切都是魔术主场爆冷逆转勇士,金州替补孱弱应该考虑与火箭队交易奥兰多魔术队在主场爆冷以130129逆转勇士队,勇士队已经四连败,金州替补孱弱应该考虑与火箭队交易戈登小马丁和马修斯。本场比赛勇士队高开低走,第一节与魔术队打成30平,第二节勇士队爆冷!库里空砍39分2致命失误,勇士输东部垫底队,惨遭4连败NBA爆出超级大冷门,卫冕冠军勇士129130不敌魔术。魔术赛前战绩为1胜7负,排名东部垫底。库里已经打得很好了,全场出战38分20秒,22投13中,三分球15中8,罚球5中5,高四连败!科尔坐不住了,坦言将调整用人,第二阵容或迎来大换血NBA常规赛继续进行,今天勇士队在客场继续挑战魔术队,最终他不敌魔术队,吞下了四连败。库里虽然个人砍下39分,命中8记三分球,但是仍旧没能帮助球队获得胜利。勇士队在今天比赛当中曾经