国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

【TVM 教程】編寫自定義 Pass 原創

發布于 2025-6-3 10:50
瀏覽
0收藏

Apache TVM是一個深度的深度學習編譯框架,適用于 CPU、GPU 和各種機器學習加速芯片。更多 TVM 中文文檔可訪問 →https://tvm.hyper.ai/

作者Jian Weng

TVM 是一個抽象出機器學習加速器異質性的框架,有時用戶希望自定義一些分析和 IR 轉換,使得 TVM 適應自己的專用硬件。本教程介紹如何在 TVM 中編寫自定義 Pass。

先決條件?

閱讀本教程前,假設讀者已經熟悉以下主題:

  • 在 TVM 中編寫算法并對其進行調度,若不熟悉,請參閱示例教程如?如何在 CPU 上優化 GEMM。
  • 熟悉 HalideIR 的基本結構,若不熟悉,請參閱?HalideIR/src/ir/IR.h?了解定義了 IR 節點的哪些屬性。
  • 訪問器設計模式,若不熟悉,請參閱?Python AST 模塊?以查看 AST 訪問器的實現原理。
  • Schedule 如何降低為 IRModule 類或 LLVM 模塊。若不熟悉,請參閱?python/tvm/build_module.py?獲取相關基礎知識。
import tvm
from tvm import te
import numpy as np

首先編寫一個簡單的向量加法,并用默認 schedule 構建。然后,使用自定義的降低 pass 而非調度原語,來直接操作 IR。

n = tvm.tir.const(128, "int32")
a = te.placeholder((n,), name="a")
b = te.placeholder((n,), name="b")
c = te.compute((n,), lambda i: a[i] + b[i], name="c")

sch = te.create_schedule(c.op)
ir = tvm.lower(sch, [a, b, c])
print(ir)

輸出結果:

@main = primfn(a_1: handle, b_1: handle, c_1: handle) -> ()
  attr = {"from_legacy_te_schedule": True, "global_symbol": "main", "tir.noalias": True}
  buffers = {a: Buffer(a_2: Pointer(float32), float32, [128], []),
             b: Buffer(b_2: Pointer(float32), float32, [128], []),
             c: Buffer(c_2: Pointer(float32), float32, [128], [])}
  buffer_map = {a_1: a, b_1: b, c_1: c}
  preflattened_buffer_map = {a_1: a_3: Buffer(a_2, float32, [128], []), b_1: b_3: Buffer(b_2, float32, [128], []), c_1: c_3: Buffer(c_2, float32, [128], [])} {
  for (i: int32, 0, 128) {
    c[i] = (a[i] + b[i])
  }
}

編寫 Pass?

本質上,「IR 轉換 pass」是將語句映射到新語句的函數。因此,我們要定義這個向量化函數,并逐步實現它。

TVM 為用戶提供了兩個類來分析和轉換 IR。

IR 訪問器?

可以用?tvm.tir.stmt_functor.post_order_visit(stmt, func)?從 Halide IR 中收集信息。?func?是一個回調函數,會在退出當前 IR 節點之前調用,即 post-order visit。然后存儲 IR 訪問的結果,因為?func?的返回值將被忽略。

備注

必須用數組來存儲 IR 訪問的結果。值甚至是一個單變量。這主要是由于 Python-C runtime 的限制,每次遞歸都會刷新變量值,但會保留數組值。

loops = []

def find_width8(op):
    """查找范圍可以被 8 整除的所有「tir.For」節點。"""
    if isinstance(op, tvm.tir.For):
        if isinstance(op.extent, tvm.tir.IntImm):
            if op.extent.value % 8 == 0:
                loops.append(op)

IR 轉換?

轉換接口與訪問器接口略有不同。訪問器中只有一個后序回調,但轉換訪問器同時支持前序回調和后序回調。若要保留原始 IR 節點,只需返回 None。若要將當前節點更改為某個節點,使用 TVM IR maker 接口構建,并返回這個值。

備注

若調用 pre-order 函數后返回一個非 None 的值,則將跳過 post-order 函數。

def vectorize8(op):
    """Split 可以向量化 `find_width8` 中的循環。"""
    if op in loops:
        extent = op.extent.value
        name = op.loop_var.name
        lo, li = te.var(name + ".outer"), te.var(name + ".inner")
        body = tvm.tir.stmt_functor.substitute(op.body, {op.loop_var: lo * 8 + li})
        body = tvm.tir.For(li, 0, 8, tvm.tir.ForKind.VECTORIZED, body)
        body = tvm.tir.For(lo, 0, extent // 8, tvm.tir.ForKind.SERIAL, body)
        return body
    return None

@tvm.tir.transform.prim_func_pass(opt_level=0)
def vectorize(f, mod, ctx):
    global loops

    tvm.tir.stmt_functor.post_order_visit(f.body, find_width8)

    if not loops:
        return f

    # 最后一個列表參數表示將轉換哪些類型的節點。
    # 在這種情況下,只有 `For` 節點會調用 `vectorize8`
    return f.with_body(tvm.tir.stmt_functor.ir_transform(f.body, None, vectorize8, ["tir.For"]))

對接低層(Glue to Lowering)?

到目前為止,已經完成了這個 IR 轉換 pass 的編寫。接下來將這個 pass 和 TVM 的底層 pass 對接。

在這種情況下,通過元組列表作為參數提供給?tir.add_lower_pass,將上面編寫的 pass 注入 TVM 標準較低級的 pass?!冈M」表示降級的不同階段。 TVM 中有四個階段的降級,每個階段完成后,都會調用自定義的階段。

備注

以下是每個階段完成的基本轉換:

  • 階段 0 生成原始 IR 和循環級別。
  • 階段 1 扁平化數組存儲。
  • 階段 2 轉換循環,如展開、矢量化和線程綁定。
  • 階段 3 清理工作。

因此,這個轉換 pass 適合放在第 1 階段之后。

with tvm.transform.PassContext(config={"tir.add_lower_pass": [(1, vectorize)]}):
    print(tvm.lower(sch, [a, b, c]))

輸出結果:

@main = primfn(a_1: handle, b_1: handle, c_1: handle) -> ()
  attr = {"from_legacy_te_schedule": True, "global_symbol": "main", "tir.noalias": True}
  buffers = {a: Buffer(a_2: Pointer(float32), float32, [128], []),
             b: Buffer(b_2: Pointer(float32), float32, [128], []),
             c: Buffer(c_2: Pointer(float32), float32, [128], [])}
  buffer_map = {a_1: a, b_1: b, c_1: c}
  preflattened_buffer_map = {a_1: a_3: Buffer(a_2, float32, [128], []), b_1: b_3: Buffer(b_2, float32, [128], []), c_1: c_3: Buffer(c_2, float32, [128], [])} {
  for (i.outer: int32, 0, 16) {
    let cse_var_1: int32 = (i.outer*8)
    c[ramp(cse_var_1, 1, 8)] = (a[ramp(cse_var_1, 1, 8)] + b[ramp(cse_var_1, 1, 8)])
  }
}

快速回顧?

快速回顧本教程有關編寫自定義 IR 轉換 pass:

  • 用?tvm.tir.stmt_functor.post_order_visit?收集每個 IR 節點的信息。
  • 用?tvm.tir.stmt_functor.ir_transform?轉換 IR 節點。
  • 總結以上兩點來編寫一個 IR 轉換函數。
  • 用?tvm.transform.PassContext?將此函數放入 TVM 降級 pass。

下載 Python 源代碼:low_level_custom_pass.py

下載 Jupyter Notebook:low_level_custom_pass.ipynb

?著作權歸作者所有,如需轉載,請注明出處,否則將追究法律責任
收藏
回復
舉報
回復
相關推薦
亚洲瘦老头同性70tv| 日韩电影一区二区三区四区| 国产一区二区丝袜高跟鞋图片| 丁香花高清在线观看完整版| 在线播放日韩导航| 天天色综合4| 欧美性色视频在线| 欧美日韩在线中文| 午夜在线视频一区二区区别| 国产伦精品一区二区三区精品视频| 午夜精品久久| 九色丨porny丨| 欧美成人精品在线播放| 成人午夜私人影院| 国产极品精品在线观看| 午夜精品成人av| 男女小视频在线观看| 一本色道久久综合亚洲二区三区| 国产精品yjizz| 日韩在线激情视频| 欧美色综合天天久久综合精品| 99精品视频在线免费观看| 国产日韩欧美高清免费| 欧美色女视频| 日韩欧美中文在线观看| xxxxx日韩| 国产av麻豆mag剧集| 欧美大胆a视频| 51精品秘密在线观看| 日韩高清国产一区在线| 亚洲欧美日本国产| av在线播放av| 蜜桃视频网站www| 2021狠狠干| 国产精品久在线观看| 日韩限制级电影在线观看| 91老师片黄在线观看| 免费视频观看成人| 免费在线观看91| 欧美丰满美乳xxx高潮www| 欧美性猛交xxxx富婆| 国产一区二区三区综合| 午夜电影福利| 亚洲国产日韩欧美在线动漫| 四虎影视国产精品| www插插插无码免费视频网站| 久久大大胆人体| 欧美视频一区二区在线观看| 国产精品影视网| 99久久精品费精品国产| av第一福利在线导航| 国产精品精品视频一区二区三区| 精品久久一区二区三区| 午夜a成v人精品| 91香蕉视频污在线| 日韩中文欧美在线| 亚洲视频狠狠| 欧美精品密入口播放| 中文字幕资源网在线观看| 国产成人无码一二三区视频| 777777777亚洲妇女| 高潮白浆女日韩av免费看| 日韩专区一卡二卡| 亚洲a成人v| 国产精品久久久一区| 欧美精品成人一区二区三区四区| 国产乱国产乱300精品| 亚洲午夜精品| 欧美一级裸体视频| 久久综合伊人77777尤物| 成人免费观看视频| 婷婷亚洲天堂| 欧美日韩成人一区| 久久99国产精品视频| av一区二区三区免费观看| 国产精品久久久久aaaa| 午夜在线视频播放| 亚洲乱码一区二区三区三上悠亚| 精品国产三级电影在线观看| ww亚洲ww在线观看国产| 亚洲激情视频| 西西裸体人体做爰大胆久久久| 麻豆一区二区| 末成年女av片一区二区下载| 国产精品久久久久久久久久久久午夜片 | 欧美亚洲另类在线| 一区二区三区小说| 久久九九国产精品| 国产一区日韩二区欧美三区| 国产精品影视天天线| 岛国一区二区三区| 国产精品12345| 日产精品一线二线三线芒果| 亚洲最大色综合成人av| 国产精品无码人妻一区二区在线| 欧美激情精品久久久久久小说| 国产又大又黄又粗的视频| av毛片免费| 七七久久电影网| 欧美韩国日本| 91精品一区二区三区综合在线爱 | 盗摄精品av一区二区三区| 亚洲视屏一区| 午夜日本精品| 性xx色xx综合久久久xx| 黄色亚洲精品| 性欧美欧美巨大69| 美女诱惑一区| 被下部羞羞漫画| √天堂资源地址在线官网| 日韩在线观看你懂的| 26uuu国产在线精品一区二区| 亚洲国产综合在线观看| 九色在线91| 99在线热播| 日韩av中文字幕在线免费观看| 2020国产精品自拍| 精品日本12videosex| 日本在线人成| 日韩精品在线中文字幕| 热久久免费国产视频| 欧美三级日韩三级国产三级| 国产乱人伦偷精品视频不卡| 久久精品色播| gogogo高清在线观看免费完整版| 中文精品视频一区二区在线观看| 久久91亚洲精品中文字幕奶水| 亚洲va欧美va人人爽午夜| 日本aⅴ免费视频一区二区三区| 99热这里有精品| 亚洲男人都懂的网站| 亚洲欧美日韩另类精品一区二区三区 | 亚洲福中文字幕伊人影院| 国产精品久久久免费| 欧美成人xxxx| 日韩精品在线视频观看| 欧美日韩日日骚| 夜夜夜精品看看| 亚洲精品ww久久久久久p站| 成人夜色视频网站在线观看| 日韩电影免费网站| 成人免费三级在线| 污污在线观看| 热久久精品免费视频| 国产精品亚洲片夜色在线| 精品婷婷伊人一区三区三| 成人av一区二区三区| 欧美激情另类| 久久91导航| 毛片网站在线观看| 凹凸国产熟女精品视频| 国产精品免费一区二区三区| 久久网福利资源网站| 欧美日韩成人激情| 国产婷婷色一区二区三区四区| 国产欧美日本| 女人抽搐喷水高潮国产精品| 欧美aaaaaaa| 亚洲国产97在线精品一区| 无需播放器亚洲| 青青伊人久久| 日本黄色片在线观看| 成熟丰满熟妇高潮xxxxx视频| 国产精品一区二区三区观看| 欧美激情亚洲综合一区| 欧美成人性战久久| 亚洲综合激情另类小说区| 青青草国产成人av片免费| 色综合天天综合网天天看片| 国产精品资源网| 2020日本不卡一区二区视频| 欧美午夜激情在线| 国产一区二区看久久| 最新国产在线拍揄自揄视频| www.这里只有精品| 好吊色这里只有精品| 91精品久久久久久蜜桃| 欧美大片免费看| 亚洲国产精品电影在线观看| 一本大道久久a久久综合| 欧美激情综合在线| 国产一区二区91| 国产视频一区三区| 久久美女视频| 中文字幕亚洲在线观看 | 欧美 日韩 国产精品免费观看| 国产精品一站二站| 涩涩网在线视频| 天堂а√在线资源在线| 午夜爽爽视频| 手机在线看福利| 日韩免费一级视频| 国内外成人激情免费视频| 精品中文字幕人| 国产精自产拍久久久久久| 国内精品在线一区| 久久久国产视频91| 亚洲最新在线视频| 亚洲理论在线a中文字幕| 亚洲成人av资源网|