TVM學(xué)習(xí)記錄(持續(xù)更新)

第一件事情當(dāng)然是安裝苛坚,官方給了教程。

功能

深度學(xué)習(xí)模型的編譯

https://zhuanlan.zhihu.com/p/335374653

Expressions for Operators
參考鏈接

https://tvm.apache.org/docs/tutorials/get_started/tensor_expr_get_started.html#sphx-glr-tutorials-get-started-tensor-expr-get-started-pyhttps://zhuanlan.zhihu.com/p/267671270

Describe the Computation
n = te.var("n")
A = te.placeholder((n,), name="A")
B = te.placeholder((n,), name="B")
C = te.compute(A.shape, lambda i: A[i] + B[i], name="C")
s = te.create_schedule([C.op])
print(tvm.lower(s, [A, B, C], simple_mode=True)) # 可以查看schedule result

這個和編寫tf代碼類似。具體如何使用參照鏈

schedule的幾種方法焰盗。
  • Split,這是增加循環(huán)嵌套層數(shù)同時不改變循環(huán)體,從并行計(jì)算的角度講衩婚,分割后的外循環(huán)的每一次迭代都可能獨(dú)立執(zhí)行,這為并行計(jì)算加速創(chuàng)造了條件助赞。不過如果原有循環(huán)體中的數(shù)據(jù)關(guān)聯(lián)程度很大买羞,導(dǎo)致外循環(huán)中的不同次迭代產(chǎn)生關(guān)聯(lián),此時就不能夠按照這種方法并行計(jì)算雹食。下面是樣例以及修改后的對比畜普。
A = te.placeholder((m,), name="A")
B = te.compute((m,), lambda i: A[i] * 2, name="B")
s = te.create_schedule(B.op)
xo, xi = s[B].split(B.op.axis[0], factor=32) # 此處可以使用 nparts=32 分割相反的軸
print(tvm.lower(s, [A, B], simple_mode=True))

分割后的結(jié)果,相當(dāng)于增加了一層循環(huán)嵌套:

primfn(A_1: handle, B_1: handle) -> ()
  attr = {"global_symbol": "main", "tir.noalias": True}
  buffers = {B: Buffer(B_2: Pointer(float32), float32, [m: int32], [stride: int32], type="auto"),
             A: Buffer(A_2: Pointer(float32), float32, [m], [stride_1: int32], type="auto")}
  buffer_map = {A_1: A, B_1: B} {
  for (i.outer: int32, 0, floordiv((m + 31), 32)) {
    for (i.inner: int32, 0, 32) {
      if @tir.likely((((i.outer*32) + i.inner) < m), dtype=bool) {
        B_2[(((i.outer*32) + i.inner)*stride)] = ((float32*)A_2[(((i.outer*32) + i.inner)*stride_1)]*2f32)
      }
    }
  }
}
  • Tile,增加二維數(shù)組的嵌套群叶,可以同時給第0個軸和第1個軸增加循環(huán)嵌套吃挑。
A = te.placeholder((m, n), name="A")
B = te.compute((m, n), lambda i, j: A[i, j], name="B")

s = te.create_schedule(B.op)
xo, yo, xi, yi = s[B].tile(B.op.axis[0], B.op.axis[1], x_factor=10, y_factor=5)
print(tvm.lower(s, [A, B], simple_mode=True))
  • Fuse,合并fuse運(yùn)算是分割split運(yùn)算的逆運(yùn)算,將兩個循環(huán)合并到一層,
B = te.compute((m, n), lambda i, j: A[i, j], name="B")

s = te.create_schedule(B.op)
# tile to four axises first: (i.outer, j.outer, i.inner, j.inner)
xo, yo, xi, yi = s[B].tile(B.op.axis[0], B.op.axis[1], x_factor=10, y_factor=5)
# then fuse (i.inner, j.inner) into one axis: (i.inner.j.inner.fused)
fused = s[B].fuse(xi, yi)
print(tvm.lower(s, [A, B], simple_mode=True))
  • Reorder街立,重排序是指按照順序?qū)⑤S重新排序舶衬,做這個操作的目的可以增大cache的命中率。二維數(shù)組可以把它看做是由若干行所構(gòu)成的結(jié)構(gòu)赎离。循環(huán)體的訪存可以看作3次讀取逛犹,一次寫入。這種寫法保證了按k增加的二維數(shù)組的訪存局部性A[i,k]友好梁剔,但是對于C[i,j]和B[k,j]都是不友好的圾浅。我們于是設(shè)想把k提出來,對j進(jìn)行優(yōu)化憾朴。
for i in range(1024):
    for j in range(1024):
        for k in range(32):
            C[i,j] += A[i,k] * B[k,j]

# reorder后的操作
for k in range(32):
    for i in range(1024):
        for j in range(1024):
            C[i,j] += A[i,k] * B[k,j]

TVM中使用方法:

A = te.placeholder((m, n), name="A")
B = te.compute((m, n), lambda i, j: A[i, j], name="B")

s = te.create_schedule(B.op)
# tile to four axises first: (i.outer, j.outer, i.inner, j.inner)
xo, yo, xi, yi = s[B].tile(B.op.axis[0], B.op.axis[1], x_factor=10, y_factor=5)
# then reorder the axises: (i.inner, j.outer, i.outer, j.inner)
s[B].reorder(xi, yo, xo, yi)
print(tvm.lower(s, [A, B], simple_mode=True))
  • 其余的一些方法:
B = te.compute((m,), lambda i: A[i] + 1, name="B")
C = te.compute((m,), lambda i: B[i] * 2, name="C")

s = te.create_schedule(C.op)
print(tvm.lower(s, [A, B, C], simple_mode=True))


primfn(A_1: handle, B_1: handle, C_1: handle) -> ()
  attr = {"global_symbol": "main", "tir.noalias": True}
  buffers = {C: Buffer(C_2: Pointer(float32), float32, [m: int32], [stride: int32], type="auto"),
             B: Buffer(B_2: Pointer(float32), float32, [m], [stride_1: int32], type="auto"),
             A: Buffer(A_2: Pointer(float32), float32, [m], [stride_2: int32], type="auto")}
  buffer_map = {A_1: A, B_1: B, C_1: C} {
  for (i: int32, 0, m) {
    B_2[(i*stride_1)] = ((float32*)A_2[(i*stride_2)] + 1f32)
  }
  for (i_1: int32, 0, m) {
    C_2[(i_1*stride)] = ((float32*)B_2[(i_1*stride_1)]*2f32)
  }
}

我們將使用compute_at將B的計(jì)算移入C的計(jì)算的第一軸狸捕。這樣我們可以將兩個循環(huán)合并成為一個循環(huán)。

A = te.placeholder((m,), name="A")
B = te.compute((m,), lambda i: A[i] + 1, name="B")
C = te.compute((m,), lambda i: B[i] * 2, name="C")

s = te.create_schedule(C.op)
s[B].compute_at(s[C], C.op.axis[0])
s[B].compute_root() #  可以使用這個函數(shù)將其再移動回去众雷。

print(tvm.lower(s, [A, B, C], simple_mode=True))
primfn(A_1: handle, B_1: handle, C_1: handle) -> ()
  attr = {"global_symbol": "main", "tir.noalias": True}
  buffers = {B: Buffer(B_2: Pointer(float32), float32, [m: int32], [stride: int32], type="auto"),
             C: Buffer(C_2: Pointer(float32), float32, [m], [stride_1: int32], type="auto"),
             A: Buffer(A_2: Pointer(float32), float32, [m], [stride_2: int32], type="auto")}
  buffer_map = {A_1: A, B_1: B, C_1: C} {
  for (i: int32, 0, m) {
    B_2[(i*stride)] = ((float32*)A_2[(i*stride_2)] + 1f32)
    C_2[(i*stride_1)] = ((float32*)B_2[(i*stride)]*2f32)
  }
}

compute_inline,使用內(nèi)聯(lián)的方法灸拍。

A = te.placeholder((m,), name="A")
B = te.compute((m,), lambda i: A[i] + 1, name="B")
C = te.compute((m,), lambda i: B[i] * 2, name="C")

s = te.create_schedule(C.op)
s[B].compute_inline()
print(tvm.lower(s, [A, B, C], simple_mode=True))

primfn(A_1: handle, B_1: handle, C_1: handle) -> ()
  attr = {"global_symbol": "main", "tir.noalias": True}
  buffers = {C: Buffer(C_2: Pointer(float32), float32, [m: int32], [stride: int32], type="auto"),
             B: Buffer(B_2: Pointer(float32), float32, [m], [stride_1: int32], type="auto"),
             A: Buffer(A_2: Pointer(float32), float32, [m], [stride_2: int32], type="auto")}
  buffer_map = {A_1: A, B_1: B, C_1: C} {
  for (i: int32, 0, m) {
    C_2[(i*stride)] = (((float32*)A_2[(i*stride_2)] + 1f32)*2f32)
  }
}
如何使用auto tuning優(yōu)化keras模型:
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市砾省,隨后出現(xiàn)的幾起案子鸡岗,更是在濱河造成了極大的恐慌,老刑警劉巖编兄,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件轩性,死亡現(xiàn)場離奇詭異,居然都是意外死亡狠鸳,警方通過查閱死者的電腦和手機(jī)揣苏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進(jìn)店門悯嗓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人卸察,你說我怎么就攤上這事脯厨。” “怎么了坑质?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵合武,是天一觀的道長。 經(jīng)常有香客問我涡扼,道長稼跳,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任吃沪,我火速辦了婚禮岂贩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘巷波。我一直安慰自己萎津,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布抹镊。 她就那樣靜靜地躺著锉屈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪垮耳。 梳的紋絲不亂的頭發(fā)上颈渊,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天,我揣著相機(jī)與錄音终佛,去河邊找鬼俊嗽。 笑死,一個胖子當(dāng)著我的面吹牛铃彰,可吹牛的內(nèi)容都是我干的绍豁。 我是一名探鬼主播,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼牙捉,長吁一口氣:“原來是場噩夢啊……” “哼竹揍!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起邪铲,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤芬位,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后带到,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體昧碉,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了被饿。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片四康。...
    茶點(diǎn)故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖锹漱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情慕嚷,我是刑警寧澤哥牍,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站喝检,受9級特大地震影響嗅辣,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜挠说,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一澡谭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧损俭,春花似錦蛙奖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至琐脏,卻和暖如春攒砖,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背日裙。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工吹艇, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人昂拂。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓受神,卻偏偏與公主長得像,于是被迫代替她去往敵國和親格侯。 傳聞我的和親對象是個殘疾皇子路克,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 機(jī)器學(xué)習(xí)(Machine Learning)&深度學(xué)習(xí)(Deep Learning)資料(Chapter 1) 注...
    Albert陳凱閱讀 22,265評論 9 476
  • tensorflow中文社區(qū)對官方文檔進(jìn)行了完整翻譯。鑒于官方更新不少內(nèi)容养交,而現(xiàn)有的翻譯基本上都已過時精算。故本人對更...
    周乘閱讀 2,700評論 0 14
  • 久違的晴天,家長會碎连。 家長大會開好到教室時灰羽,離放學(xué)已經(jīng)沒多少時間了。班主任說已經(jīng)安排了三個家長分享經(jīng)驗(yàn)。 放學(xué)鈴聲...
    飄雪兒5閱讀 7,524評論 16 22
  • 今天感恩節(jié)哎廉嚼,感謝一直在我身邊的親朋好友玫镐。感恩相遇!感恩不離不棄怠噪。 中午開了第一次的黨會恐似,身份的轉(zhuǎn)變要...
    迷月閃星情閱讀 10,568評論 0 11
  • 可愛進(jìn)取,孤獨(dú)成精傍念。努力飛翔矫夷,天堂翱翔。戰(zhàn)爭美好憋槐,孤獨(dú)進(jìn)取双藕。膽大飛翔,成就輝煌阳仔。努力進(jìn)取忧陪,遙望,和諧家園近范∷惶可愛游走...
    趙原野閱讀 2,735評論 1 1