精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

【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。「元組」表示降級的不同階段。 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

?著作權歸作者所有,如需轉載,請注明出處,否則將追究法律責任
收藏
回復
舉報
回復
相關推薦
日韩欧美国产一区二区三区| 国产精品一区二区x88av| 亚洲电影av在线| 国产一线二线三线女| 在线免费a视频| 97色伦图片97综合影院| 欧美一区二区在线不卡| 国产精品自拍合集| 亚洲av电影一区| 国产精品丝袜xxxxxxx| 日韩精品久久久久| www.99av.com| 在线看三级电影| 成人h动漫精品| 国产成人精品在线| 182在线观看视频| 亚洲精品乱码日韩| 亚洲一区影音先锋| 欧美精品欧美精品| 菠萝菠萝蜜在线观看| 欧美日韩一区二区三区视频播放| 在线日韩av片| 天天综合中文字幕| 正在播放亚洲1区| 国产精品成久久久久三级| 丰腴饱满的极品熟妇| 精品日本视频| 亚洲伦在线观看| 图片区小说区国产精品视频| 91网站在线看| 日本三级免费看| 成人毛片免费看| 精品久久久久久综合日本欧美 | 成人久久网站| 亚洲天堂a在线| 狠狠久久综合婷婷不卡| 中日韩av在线| 一区二区福利| 日韩亚洲在线观看| 日本黄色特级片| 国产精品久一| 在线观看日韩电影| 免费一级特黄特色毛片久久看| 天堂av在线免费观看| 国产一区二区三区国产| 国产成人久久久| 日本最新中文字幕| 欧美成人一品| 色婷婷av一区二区三区久久| 欧美激情中文网| 在线天堂www在线国语对白| 黄色精品视频网站| 欧美日韩亚洲精品内裤| 国产精品9999久久久久仙踪林| 不许穿内裤随时挨c调教h苏绵| 欧美性xxx| 亚洲国产中文字幕| 免费观看黄色的网站| 青青色在线视频| 成人禁用看黄a在线| 91丨九色丨国产在线| 中国a一片一级一片| 久久激情一区| 久久久久国产视频| 欧美国产精品一二三| 午夜精品一区二区三区国产| 中文字幕日韩欧美精品在线观看| 欧美激情aaa| 一本久久青青| 日韩成人在线视频| 91精品国产综合久久蜜臀| 美女啪啪无遮挡免费久久网站| 久久久久亚洲av无码专区桃色| 澳门成人av| 日韩一卡二卡三卡| 在线成人免费av| 日韩新的三级电影| 色综合天天天天做夜夜夜夜做| 欧美综合在线播放| 国产精选在线| 欧美日韩性生活视频| 日本在线xxx| 波多野结衣精品| 欧美日韩国产一区在线| 日本福利视频在线| 岛国在线视频网站| 日韩欧美国产黄色| 三级a三级三级三级a十八发禁止| av有声小说一区二区三区| 欧洲一区在线电影| 99热成人精品热久久66| 日韩精品麻豆| 制服丝袜成人动漫| 波多野结衣网页| 国产+成+人+亚洲欧洲在线 | 日韩精品――中文字幕| 亚洲看片一区| 国产99在线|中文| 中文字幕男人天堂| 日韩和欧美一区二区三区| 国产精品老女人视频| 一卡二卡在线观看| 国产成人亚洲综合a∨婷婷| 国产亚洲精品美女久久久m| 嫩草精品影院| 国产精品乱码一区二区三区软件| 国产精品免费看久久久无码| 不卡一本毛片| 欧美网站一区二区| 爱情岛论坛亚洲自拍| 农村少妇一区二区三区四区五区| 亚洲香蕉伊综合在人在线视看 | 亚洲欧美专区| 欧美videos大乳护士334| 变态另类丨国产精品| 日本在线电影一区二区三区| 中文字幕日韩综合av| 婷婷色中文字幕| 亚洲一区区二区| 91免费在线视频网站| 天天操天天操天天干| 欧美国产1区2区| 乱熟女高潮一区二区在线| 黄色成人免费网| 日韩精品一区二区三区在线观看| 91av在线免费| 综合久久婷婷| 国产91免费观看| 999免费视频| 国产网站一区二区三区| 韩国黄色一级大片| 老牛影视精品| 欧美一区二区私人影院日本| 欧美亚一区二区三区| 欧美精品国产一区| 555www成人网| 丰满人妻一区二区三区免费| 日本一区二区久久| www黄色av| 欧洲大片精品免费永久看nba| 欧美精品一区二区三区视频| 青青操在线视频观看| 天堂av在线一区| 成人三级在线| а√资源新版在线天堂| 色婷婷国产精品综合在线观看| 无码人妻一区二区三区免费n鬼沢| 久久中文字幕av| 国产不卡av在线免费观看| 黑人精品一区二区三区| 中文幕一区二区三区久久蜜桃| 国产 福利 在线| 久久99国产精品久久99大师| 欧美情侣性视频| 国产99对白在线播放| 中文字幕乱码一区二区免费| 91传媒久久久| 久久国产精品色av免费看| 久久99久久亚洲国产| 国产精品日韩无码| 中文字幕一区视频| 99日在线视频| 久久精品国产亚洲夜色av网站| 国产精品www| 日本啊v在线| 一本高清dvd不卡在线观看| 久久久老熟女一区二区三区91| 午夜日本精品| 成人片在线免费看| 国产丝袜在线播放| 精品区一区二区| 国产真人真事毛片| 99视频在线精品| 日韩国产一级片| 六月丁香久久丫| 51精品国产黑色丝袜高跟鞋 | 精品国产一区久久| 日韩女优一区二区| 成人国产亚洲欧美成人综合网| 超级碰在线观看| 视频一区日韩精品| 久久精品色欧美aⅴ一区二区| 亚洲中文字幕在线一区| 17c精品麻豆一区二区免费| 中文字幕一区久久| 久久中文字幕av| 999在线观看免费大全电视剧| 色网在线观看| 精品亚洲一区二区三区| 天堂av免费在线观看| 欧美激情在线一区二区| 亚洲免费999| 日韩视频免费| 亚洲一区二区在线免费观看| 国产欧美啪啪| 国产伦精品一区二区三区精品视频| 性直播体位视频在线观看| 国产丝袜精品第一页| 国产精品视频一区二区三区,| 偷拍亚洲欧洲综合| 中文字幕观看av| 久久九九国产精品| 制服.丝袜.亚洲.中文.综合懂| 日韩中文字幕91| 久无码久无码av无码| 四季av一区二区三区免费观看| 国产乱子伦精品| 成人影院网站ww555久久精品| 欧美一级片在线播放| h视频在线免费观看| 国产一区二区激情| 香蕉视频网站在线| 精品少妇一区二区三区日产乱码| 日韩熟女一区二区| 无码av免费一区二区三区试看 | 亚洲第一搞黄网站| www.99re6| 久久精品水蜜桃av综合天堂| 精品一区二区三区四区五区六区| 久久精品国产一区二区三| 日韩中文字幕在线视频观看| 欧美99久久| 一区二区成人国产精品| 国产免费久久| 久久综合九色欧美狠狠| 大奶在线精品| 18成人免费观看网站下载| 色综合视频一区二区三区日韩| 日本久久久久久久久| 精品丝袜在线| 久久久久久久久爱| 羞羞视频在线免费国产| 欧美成年人在线观看| av在线麻豆| 久久久国产一区二区| 91.xxx.高清在线| 这里只有精品在线播放| 国产三区四区在线观看| 亚洲天堂av电影| 国模精品一区二区| 亚洲欧美中文字幕在线一区| 三级做a全过程在线观看| 亚洲第一网站免费视频| 国产综合视频在线| 精品国产一区二区三区久久久蜜月| 国产a级免费视频| 欧美一区二视频| 亚洲成a人片在线| 精品国产制服丝袜高跟| 亚洲国产精品18久久久久久| 欧美电影免费观看完整版| 国产成人无码www免费视频播放| 欧美精品一区男女天堂| 亚洲av电影一区| 亚洲少妇激情视频| av网在线观看| 久久精品男人天堂| 日本性爱视频在线观看| 国内揄拍国内精品| 亚洲美女久久精品| 国产精品高清在线观看| 国产精品第一| 亚洲一区二区久久久久久久| 6080亚洲理论片在线观看| 精品国产91亚洲一区二区三区www| 麻豆一区二区| 欧美日韩亚洲免费| 日韩在线二区| 成人在线观看毛片| 亚洲另类自拍| 男人透女人免费视频| 久久99热99| 免费啪视频在线观看| 久久理论电影网| 亚洲一区电影在线观看| 亚洲一区中文日韩| 精品国产乱子伦| 91精品国产色综合久久ai换脸| 囯产精品久久久久久| 亚洲欧美国产日韩天堂区| 在线毛片网站| 97在线免费观看| 91亚洲视频| 国产高清在线一区| 精品视频久久| 18禁裸男晨勃露j毛免费观看| 国产日韩专区| 又色又爽又黄视频| 99久久精品一区| 日本黄区免费视频观看| 亚洲午夜羞羞片| 中文字幕av影视| 精品美女一区二区| 岛国在线视频| 久久久之久亚州精品露出| 在线日本欧美| 国产乱码一区| 亚洲情侣在线| 日韩av播放器| 成人a免费在线看| 免费高清在线观看电视| 精品国产乱码久久久久久婷婷| 91精品中文字幕| 亚洲欧美另类人妖| 国产精品69xx| 国产精品天天狠天天看| 欧美aaaaa级| 粉嫩av一区二区三区天美传媒| 视频一区在线视频| 在线看黄色的网站| 亚洲精品视频一区| 少妇又紧又色又爽又刺激视频| 亚洲国产古装精品网站| 国产区在线看| 国产欧美日韩综合精品| 亚洲精品蜜桃乱晃| 国产精品入口芒果| 国产精品中文字幕日韩精品 | 欧美成人直播| 国产精品欧美激情在线观看 | 国产人妻大战黑人20p| 亚洲一区二区五区| 国产免费av观看| 中文字幕久热精品视频在线| 成人av三级| 韩国一区二区三区美女美女秀 | 伦理中文字幕亚洲| 粉嫩91精品久久久久久久99蜜桃 | 日韩在线看片| 中文字幕第21页| 久久久青草青青国产亚洲免观| 国产网站在线看| 欧美精品一区二区三区久久久| av免费看在线| 91丨九色丨国产在线| 91av精品| 亚洲一二区在线观看| 中文字幕一区二区三区在线播放 | 日韩一区不卡| 久久精品九九| theav精尽人亡av| 欧美性开放视频| 欧美日韩视频精品二区| 日韩av电影免费观看高清| 免费电影一区二区三区| 欧美一级视频免费看| av不卡在线播放| yjizz国产| 国产亚洲精品一区二555| 精品欧美一区二区三区在线观看| 欧美三级华人主播| 日韩制服丝袜av| 农村老熟妇乱子伦视频| 欧美日韩一区 二区 三区 久久精品| 91在线视频| 成人午夜激情免费视频| 一区二区三区网站 | 91资源在线视频| 免费97视频在线精品国自产拍| 88久久精品| 人人妻人人添人人爽欧美一区| 久久综合色一综合色88| 国产真人无遮挡作爱免费视频| 色妞色视频一区二区三区四区| 亚洲国产91视频| 亚洲人成无码网站久久99热国产| 99精品视频一区二区三区| 一级黄色av片| 久久精品成人一区二区三区| 中文字幕久久精品一区二区| 成人午夜精品久久久久久久蜜臀| 久久免费的精品国产v∧| 亚洲中文字幕在线一区| 久久91精品国产| 中文字幕中文字幕精品| 奇米影视四色在线| 亚洲一区在线观看免费观看电影高清| 婷婷丁香一区二区三区| 国产精品香蕉在线观看| 欧美特黄一级| 久久久久久久久久久久| 欧美一区二区美女| 乡村艳史在线观看| 中文字幕久精品免| 97国产精品videossex| 伊人久久成人网| 国内精品久久影院| 日韩精品首页| 欧美熟妇精品一区二区蜜桃视频| 色激情天天射综合网| aaa大片在线观看| 欧美日韩电影一区二区三区| 国产一区二区三区黄视频 | 精品亚洲免费视频| 国产乱码久久久久久| 少妇高潮久久77777| 日本欧美三级| 性鲍视频在线观看| 日本高清不卡aⅴ免费网站| 密臀av在线|