99精品久久精品一区二区-亚洲熟妇无码?v在线播放-日本国产精品无码字幕在线观看-久久久亚洲永夜AV-亚洲一级无码一区二区一-免费国产成高清人在线视频-中文字幕乱码免费观看-国产毛片精品妇女久久久

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營的一線實戰(zhàn)洞察。

TVM Relay自定義算子開發(fā)指南:從注冊到Lowering全流程

TVM Relay自定義算子開發(fā)指南:從注冊到Lowering全流程 1. 為什么要在 Relay 里加算子從一次真實需求說起深度學(xué)習(xí)編譯器這個領(lǐng)域Relay 作為 TVM 的高層中間表示承擔(dān)著把前端框架的計算圖翻譯成可優(yōu)化、可調(diào)度 IR 的核心職責(zé)。日常做模型部署的時候絕大多數(shù)算子 Relay 的算子庫都已經(jīng)覆蓋了卷積、矩陣乘、各類激活函數(shù)、歸一化、池化這些常規(guī)操作基本都能直接找到對應(yīng)實現(xiàn)。但真正落到項目里總會遇到一些“標(biāo)準(zhǔn)庫里沒有”的情況——可能是某個論文里新提出的激活函數(shù)可能是業(yè)務(wù)側(cè)自定義的融合邏輯也可能是某個冷門框架導(dǎo)出的算子 Relay 沒有對應(yīng)解析。這時候繞不過去的一件事就是自己給 Relay 添加一個新算子。這篇文章面向的讀者是已經(jīng)跑通過 TVM 基礎(chǔ)流程、能看懂 Relay IR、知道relay.op大概長什么樣但還沒完整走過“注冊一個新算子”全流程的人。我會把從算子定義、屬性注冊、類型關(guān)系推導(dǎo)、到 lowering 落地、再到 Python 側(cè)調(diào)用和測試的整條鏈路拆開講清楚。整個過程涉及 C 和 Python 兩側(cè)的配合涉及 TVM 的注冊機(jī)制、類型系統(tǒng)、以及 Relay 的 pass 體系信息量不小但走通一遍之后你會發(fā)現(xiàn)它的套路其實非常固定。先說清楚一個前提給 Relay 加算子本質(zhì)上是在做三件事。第一告訴 Relay 這個算子長什么樣——它的名字、輸入輸出、有哪些屬性參數(shù)第二告訴 Relay 這個算子的類型規(guī)則——給定輸入類型輸出類型怎么推第三告訴 Relay 這個算子最終怎么算——也就是 lowering 到更低層的實現(xiàn)。這三件事分別對應(yīng)算子注冊、類型關(guān)系TypeRelation、以及計算實現(xiàn)。很多人卡住不是因為某一步特別難而是因為這三件事分散在不同文件、不同注冊宏里第一次做的時候容易顧此失彼。我個人的建議是動手之前先想清楚你的算子屬于哪一類。如果它可以用現(xiàn)有 Relay 算子組合表達(dá)出來那優(yōu)先考慮用relay.op里的組合方式實現(xiàn)而不是新增算子——組合方式不需要碰 C維護(hù)成本低得多。只有當(dāng)組合方式表達(dá)不了、或者性能上必須下沉到 C 甚至要自定義 schedule 的時候才值得走完整的新增算子流程。這個判斷很關(guān)鍵我見過不少人一上來就加算子結(jié)果發(fā)現(xiàn)用te.compute加幾個現(xiàn)有 op 就能搞定白白增加了維護(hù)負(fù)擔(dān)。下面我按實際開發(fā)順序把整個流程拆成幾個部分來講。每一部分我都會說明“為什么這么做”而不只是“怎么做”因為 TVM 的注冊機(jī)制設(shè)計得比較繞不理解意圖的話照抄代碼很容易在細(xì)節(jié)上翻車。2. 動手前的整體設(shè)計新算子該放在哪一層2.1 先判斷組合實現(xiàn)還是新增算子在決定新增算子之前有一個必須做的判斷這個算子能不能用 Relay 已有的算子拼出來。舉個常見的例子假設(shè)你要實現(xiàn)一個swish激活函數(shù)它的定義是x * sigmoid(x)。這個完全可以用relay.multiply(x, relay.sigmoid(x))表達(dá)不需要新增任何算子。再比如某些自定義的歸一化如果能拆成 reduce、subtract、divide 的組合也優(yōu)先走組合路線。組合路線的優(yōu)勢非常明顯不碰 C不需要重新編譯 TVMPython 側(cè)直接就能用而且能自動享受 Relay 現(xiàn)有的融合、常量折疊等優(yōu)化。缺點(diǎn)是如果組合出來的子圖比較碎可能會影響融合效果或者在某些后端上性能不理想。什么時候必須新增算子我總結(jié)了幾種典型情況。第一種是算子語義無法用現(xiàn)有算子組合表達(dá)比如涉及特殊的內(nèi)存布局或者不可分解的數(shù)學(xué)運(yùn)算。第二種是性能敏感組合實現(xiàn)會產(chǎn)生大量中間張量而新增算子可以在一個 compute 里完成。第三種是需要自定義 schedule比如你想對這個算子做特殊的循環(huán)切分和向量化組合實現(xiàn)沒法控制底層調(diào)度。第四種是前端框架導(dǎo)出的模型里帶了這個算子你需要讓 Relay 能解析它。判斷清楚之后如果確定要新增接下來要決定算子的“層級”。Relay 里算子可以注冊在幾個不同的層次最上層是 Relay oprelay.op命名空間它直接面向計算圖往下是 TOPITVM Operator Inventory提供具體的 compute 和 schedule 實現(xiàn)再往下是 TETensor Expression描述張量計算。一個完整的算子通常需要在 Relay 層注冊 op在 TOPI 層提供 compute 實現(xiàn)必要時還要寫 schedule。2.2 文件組織新增算子該改哪些文件TVM 的代碼組織比較清晰新增一個算子通常涉及以下幾個位置。C 側(cè)算子注冊一般放在src/relay/op/下的對應(yīng)子目錄里比如張量運(yùn)算放tensor/神經(jīng)網(wǎng)絡(luò)相關(guān)放nn/。類型關(guān)系通常和算子注冊放在一起或者單獨(dú)放在op/op_common.h之類的公共頭文件里。TOPI 的 compute 實現(xiàn)放在python/tvm/topi/下對應(yīng)的模塊里比如topi/nn/、topi/math/。Python 側(cè)的封裝放在python/tvm/relay/op/下。這里有個經(jīng)驗不要一上來就想著把算子加到最合適的位置先把流程跑通再考慮代碼放哪。我見過有人花大量時間糾結(jié)目錄結(jié)構(gòu)結(jié)果算子還沒跑起來。正確的做法是先在一個臨時文件里把注冊、類型關(guān)系、compute 都寫出來編譯通過、測試通過之后再按 TVM 的代碼規(guī)范挪到合適的位置。另外要提醒的是TVM 的注冊宏是全局的算子名字在整個 Relay 命名空間里必須唯一。命名的時候建議遵循現(xiàn)有算子的命名習(xí)慣比如nn.contrib_xxx、math.xxx這種帶命名空間前綴的形式避免和已有算子沖突。如果你只是本地實驗可以用一個不太可能沖突的前綴比如myop.xxx。2.3 注冊機(jī)制的核心三個宏各管什么TVM 里新增算子最核心的是三個注冊宏理解它們各自的作用是走通流程的關(guān)鍵。第一個是RELAY_REGISTER_OP它注冊算子的“元信息”算子名字、參數(shù)描述、類型關(guān)系、以及一些屬性。這個宏決定了 Relay 在解析和類型推導(dǎo)階段怎么看待這個算子。它里面會指定set_attrs_type、add_argument、set_support_level、set_attr等。第二個是TVM_REGISTER_GLOBAL它注冊一個全局函數(shù)通常用來把算子的 compute 實現(xiàn)暴露給 Relay 的 lowering 階段。Relay 在把 op 轉(zhuǎn)成 TE 的時候會通過這個全局函數(shù)名去調(diào)用對應(yīng)的 compute。第三個是類型關(guān)系相關(guān)的注冊比如RelayExpr TypeRel或者用TypeRelation的子類。它負(fù)責(zé)在類型推導(dǎo)階段計算輸出類型。對于大多數(shù)逐元素算子可以直接用現(xiàn)成的BroadcastRel或者ElemwiseRel對于形狀有特殊變化的算子就需要自己寫一個 TypeRelation。這三個宏的關(guān)系可以這樣理解RELAY_REGISTER_OP是“身份證”告訴系統(tǒng)有這么個算子類型關(guān)系是“規(guī)則書”告訴系統(tǒng)輸入輸出類型怎么對應(yīng)TVM_REGISTER_GLOBAL是“施工隊”告訴系統(tǒng)實際怎么算。三者缺一不可而且名字要對應(yīng)上否則會在不同階段報錯。3. 核心細(xì)節(jié)拆解算子注冊與類型關(guān)系3.1 用 RELAY_REGISTER_OP 描述算子元信息先看算子注冊。一個典型的注冊代碼長這樣以我實際做過的一個自定義激活算子為例這里用虛構(gòu)的myop.leaky_clamp代稱RELAY_REGISTER_OP(myop.leaky_clamp) .describe(Rcode(Leaky clamp activation. Computes max(min(x, upper), lower) with a leaky slope for the lower part. )code TVM_ADD_FILELINE) .set_num_inputs(1) .add_argument(data, Tensor, The input tensor.) .set_support_level(10) .set_attrs_typeLeakyClampAttrs() .add_type_rel(LeakyClamp, LeakyClampRel());這里逐項說明。describe是給文檔和調(diào)試用的描述寫清楚算子語義方便別人包括未來的自己理解。set_num_inputs(1)聲明輸入個數(shù)注意這里只算數(shù)據(jù)輸入屬性參數(shù)不算在內(nèi)。add_argument描述每個輸入的名字和類型這個名字會出現(xiàn)在錯誤信息和調(diào)試輸出里。set_support_level是 TVM 內(nèi)部的一個標(biāo)記數(shù)值越大表示支持程度越低自定義算子一般給個較大的值比如 10表示“非官方支持”。set_attrs_type指定屬性結(jié)構(gòu)體類型如果你的算子有額外參數(shù)比如上面的lower、upper、slope就需要定義一個 Attrs 結(jié)構(gòu)體。add_type_rel綁定類型關(guān)系第一個參數(shù)是類型關(guān)系的名字第二個是實例。屬性結(jié)構(gòu)體通常這樣定義struct LeakyClampAttrs : public tvm::AttrsNodeLeakyClampAttrs { double lower; double upper; double slope; TVM_DECLARE_ATTRS(LeakyClampAttrs, relay.attrs.LeakyClampAttrs) { TVM_ATTR_FIELD(lower).set_default(-1.0).describe(Lower bound.); TVM_ATTR_FIELD(upper).set_default(1.0).describe(Upper bound.); TVM_ATTR_FIELD(slope).set_default(0.01).describe(Leaky slope.); } };這個結(jié)構(gòu)體繼承AttrsNode用TVM_DECLARE_ATTRS聲明字段每個字段用TVM_ATTR_FIELD注冊并可以設(shè)默認(rèn)值。屬性結(jié)構(gòu)體的好處是 Relay 會自動幫你做參數(shù)解析、類型檢查、以及序列化。定義好之后Python 側(cè)調(diào)用時傳的關(guān)鍵字參數(shù)會自動映射到這些字段。這里有個容易踩的坑屬性字段的類型要選對。TVM 支持int、double、bool、String、Array等類型但如果你用了不支持的復(fù)雜類型編譯會報錯。另外屬性結(jié)構(gòu)體的名字上面那個字符串relay.attrs.LeakyClampAttrs要全局唯一建議帶上算子名前綴。3.2 類型關(guān)系輸出類型到底怎么推類型關(guān)系是很多人第一次做時最容易迷糊的地方。它的職責(zé)是給定輸入表達(dá)式的類型推導(dǎo)出輸出表達(dá)式的類型。對于 Relay 來說類型主要是TensorType包含 shape 和 dtype。最簡單的做法是復(fù)用現(xiàn)成的類型關(guān)系。如果你的算子是逐元素的輸出 shape 和輸入完全一致直接用ElemwiseRel就行。如果涉及廣播比如兩個不同 shape 的輸入做運(yùn)算用BroadcastRel。這兩個現(xiàn)成的類型關(guān)系覆蓋了相當(dāng)一部分場景。但有些算子形狀會變比如 reduce 類算子輸出維度會減少或者像 reshape 這種輸出 shape 由屬性決定。這時候就需要自己寫 TypeRelation。一個自定義 TypeRelation 的骨架class LeakyClampRel : public TypeRelation { public: LeakyClampRel() : TypeRelation(nullptr, LeakyClampRel) {} TVM_DLL static ArrayType LeakyClampRelFunc( const ArrayType types, int num_inputs, const Attrs attrs, const TypeReporter reporter) { ICHECK_EQ(types.size(), 2); const auto* data types[0].asTensorTypeNode(); if (data nullptr) return types; reporter-Assign(types[1], TensorType(data-shape,>tvm.script.register_object def leaky_clamp(data, lower-1.0, upper1.0, slope0.01): return _make.leaky_clamp(data, lower, upper, slope)這里的_make.leaky_clamp是 TVM 根據(jù) C 注冊自動生成的參數(shù)順序要和 C 側(cè)add_argument加屬性字段的順序?qū)?yīng)。實際上 TVM 的 FFI 機(jī)制會自動把 Python 調(diào)用轉(zhuǎn)成 C 的Call節(jié)點(diǎn)屬性會打包成 Attrs。更規(guī)范的做法是用tvm.relay.op的注冊裝飾器把算子注冊到relay.op命名空間下這樣用戶可以用relay.op.myop.leaky_clamp(...)調(diào)用。同時建議加上類型檢查比如檢查輸入是不是 Tensor屬性值是否在合理范圍內(nèi)。Python 側(cè)還有一個重要工作是注冊算子的“梯度”或者“策略”如果你的算子需要參與自動微分或者有特定的算子融合策略。梯度注冊用register_gradient融合策略用register_fusion_pattern。這些不是必須的但如果你希望新算子能融入 Relay 的優(yōu)化流程最好補(bǔ)上。4. 實操過程從 compute 到 lowering 的完整鏈路4.1 用 TOPI 寫 compute 實現(xiàn)算子注冊和類型關(guān)系搞定之后接下來是實際的計算實現(xiàn)。Relay 的 lowering 會把 op 轉(zhuǎn)成 TE而 TE 的 compute 通常由 TOPI 提供。TOPI 的 compute 函數(shù)接收輸入張量和屬性返回一個 TE 的Tensor。繼續(xù)用leaky_clamp舉例TOPI 實現(xiàn)大概是這樣def leaky_clamp(data, lower-1.0, upper1.0, slope0.01): def _compute(ins): x ins[0] return te.compute( x.shape, lambda *idx: te.max( te.min(x[idx], tvm.tir.const(upper, x.dtype)), tvm.tir.const(lower, x.dtype) ) tvm.tir.const(slope, x.dtype) * te.min( x[idx] - tvm.tir.const(lower, x.dtype), 0.0 ), nameleaky_clamp, tagelemwise ) return _compute這里有幾個細(xì)節(jié)值得說。第一te.compute的第一個參數(shù)是輸出 shape逐元素算子直接用輸入 shape。第二lambda 里的idx是索引變量x[idx]取出對應(yīng)位置的元素。第三常量要用tvm.tir.const包裝并指定 dtype否則可能因為類型不匹配報錯。第四tag參數(shù)很重要它標(biāo)記了算子的類型比如elemwise、broadcast、reduceRelay 的融合 pass 會根據(jù) tag 決定能不能把這個算子和相鄰算子融合。第五name參數(shù)會出現(xiàn)在生成的代碼里取個有意義的名字方便調(diào)試。寫完 compute 之后需要用TVM_REGISTER_GLOBAL把它注冊成全局函數(shù)函數(shù)名要和 Relay 側(cè) lowering 時查找的名字一致。通常的約定是topi.myop.leaky_clamp這種形式。Relay 在 lowering 時會根據(jù)算子的名字拼出這個全局函數(shù)名去調(diào)用。這里有個非常容易踩的坑compute 函數(shù)的參數(shù)順序。它必須和 Relay 側(cè)add_argument加屬性字段的順序完全一致否則運(yùn)行時會因為參數(shù)錯位產(chǎn)生莫名其妙的錯誤。我建議在寫的時候把參數(shù)列表寫下來對照不要憑記憶。4.2 注冊 compute 與 lowering 對接compute 寫好后注冊代碼通常長這樣TVM_REGISTER_GLOBAL(topi.myop.leaky_clamp) .set_body([](TVMArgs args, TVMRetValue* rv) { *rv LeakyClampCompute(args[0], args[1], args[2], args[3]); });或者更常見的是在 Python 側(cè)用tvm.register_func注冊tvm.register_func(topi.myop.leaky_clamp) def _leaky_clamp_compute(data, lower, upper, slope): return leaky_clamp(data, lower, upper, slope)兩種方式都可以C 側(cè)注冊性能稍好Python 側(cè)注冊更靈活、改起來不用重新編譯。開發(fā)階段我強(qiáng)烈建議先用 Python 注冊因為改一行代碼就能生效不用等 C 編譯。等邏輯穩(wěn)定了再考慮挪到 C。lowering 對接的關(guān)鍵是 Relay 怎么知道去調(diào)用哪個全局函數(shù)。Relay 的OpImplementation或者FTVMCompute屬性會指定 compute 函數(shù)名。在RELAY_REGISTER_OP里可以用set_attrFTVMCompute(FTVMCompute, ...)來指定或者依賴默認(rèn)的命名約定。默認(rèn)約定是算子名加前綴比如myop.leaky_clamp對應(yīng)topi.myop.leaky_clamp。如果你用了非默認(rèn)命名一定要顯式設(shè)置FTVMCompute。4.3 編譯、測試與驗證代碼寫完之后編譯 TVM。如果你只改了 Python 側(cè)不需要重新編譯直接跑測試就行。如果改了 C 側(cè)需要重新編譯這個過程可能比較久建議用ninja增量編譯。測試分幾個層次。第一層是算子能不能被正確解析和類型推導(dǎo)寫個簡單的 Relay 程序用relay.Function構(gòu)造調(diào)用跑relay.transform.InferType看輸出類型對不對。第二層是數(shù)值正確性構(gòu)造隨機(jī)輸入用新算子算一遍再用 NumPy 手動實現(xiàn)算一遍對比結(jié)果。第三層是端到端把算子放進(jìn)一個完整模型編譯到目標(biāo)后端跑推理看結(jié)果。數(shù)值測試的代碼大概這樣import numpy as np import tvm from tvm import relay data relay.var(data, relay.TensorType((2, 3), float32)) out relay.op.myop.leaky_clamp(data, lower-1.0, upper1.0, slope0.01) func relay.Function([data], out) mod tvm.IRModule.from_expr(func) mod relay.transform.InferType()(mod) x np.random.randn(2, 3).astype(float32) expected np.maximum(np.minimum(x, 1.0), -1.0) 0.01 * np.minimum(x 1.0, 0.0) with tvm.transform.PassContext(opt_level3): lib relay.build(mod, targetllvm) runtime tvm.contrib.graph_executor.GraphModule(lib[default](tvm.cpu())) runtime.set_input(data, x) runtime.run() result runtime.get_output(0).numpy() np.testing.assert_allclose(result, expected, rtol1e-5)這個測試覆蓋了類型推導(dǎo)、lowering、編譯、執(zhí)行全流程。如果這一步過了說明算子基本可用。如果沒過錯誤信息通常會指向某個具體階段按階段排查即可。5. 常見問題與排查技巧實錄5.1 編譯期報錯注冊相關(guān)的典型問題新增算子時編譯期報錯主要集中在注冊環(huán)節(jié)。最常見的是“算子未注冊”或者“找不到類型關(guān)系”。前者通常是RELAY_REGISTER_OP的名字和調(diào)用時用的名字不一致注意 Relay 里算子名是大小寫敏感的而且命名空間前綴要完全匹配。后者是add_type_rel綁定的名字和實際 TypeRelation 注冊的名字不一致。另一個常見問題是屬性結(jié)構(gòu)體沒注冊。如果你定義了LeakyClampAttrs但忘了用TVM_REGISTER_NODE_TYPE注冊編譯時可能不報錯但運(yùn)行時解析屬性會失敗。注冊代碼是TVM_REGISTER_NODE_TYPE(LeakyClampAttrs);這個宏要放在屬性結(jié)構(gòu)體定義之后。我踩過一次坑屬性結(jié)構(gòu)體定義在頭文件里注冊宏忘了加結(jié)果算子能注冊成功但一調(diào)用就崩排查了半天才發(fā)現(xiàn)是屬性沒注冊。還有一種情況是set_num_inputs和實際add_argument的次數(shù)不匹配。set_num_inputs聲明的是數(shù)據(jù)輸入個數(shù)add_argument也要調(diào)用相同次數(shù)。如果聲明了 2 個輸入但只add_argument了 1 次類型推導(dǎo)時types數(shù)組長度會對不上報數(shù)組越界的錯。5.2 運(yùn)行期報錯類型推導(dǎo)與 lowering 的坑運(yùn)行期報錯里類型推導(dǎo)相關(guān)的最多。典型癥狀是Check failed: reporter-Assign之類的錯誤通常是因為輸出類型和輸入類型不兼容或者Assign被調(diào)用了多次。檢查你的 TypeRelation確保每個輸出只Assign一次且 dtype 和 shape 都合理。lowering 階段的報錯通常是“找不到 compute 函數(shù)”。這多半是全局函數(shù)名和 Relay 期望的名字不一致。排查方法是打印出 Relay 期望的函數(shù)名或者直接在RELAY_REGISTER_OP里顯式設(shè)置FTVMCompute屬性。另外compute 函數(shù)返回的必須是 TE 的 Tensor 或者 Tensor 列表如果返回了別的東西lowering 會失敗。數(shù)值不對但能跑通的情況通常是 compute 實現(xiàn)里的索引或者常量寫錯了。比如te.min和te.max的參數(shù)順序搞反或者常量 dtype 和輸入 dtype 不一致導(dǎo)致隱式類型轉(zhuǎn)換。這類問題建議先用小 shape 的輸入手動驗證比如(1, 1)或者(2, 2)把中間結(jié)果打印出來對比。5.3 常見問題速查表問題現(xiàn)象可能原因排查方向算子未注冊名字不匹配或注冊宏未執(zhí)行檢查RELAY_REGISTER_OP名字與調(diào)用名類型關(guān)系找不到add_type_rel名字與注冊名不一致核對 TypeRelation 注冊字符串屬性解析失敗屬性結(jié)構(gòu)體未注冊補(bǔ)TVM_REGISTER_NODE_TYPE數(shù)組越界set_num_inputs與add_argument次數(shù)不符核對輸入個數(shù)聲明找不到 compute全局函數(shù)名不匹配顯式設(shè)置FTVMCompute或核對命名數(shù)值錯誤compute 索引或常量寫錯小 shape 手動驗證中間結(jié)果融合失效tag 設(shè)置不當(dāng)檢查 compute 的 tag 參數(shù)5.4 獨(dú)家避坑經(jīng)驗第一條經(jīng)驗開發(fā)階段全部用 Python 注冊 compute不要碰 C。C 編譯一次動輒十幾分鐘改一個符號就要重編效率極低。等 Python 版本驗證通過再考慮要不要挪到 C。實際上很多自定義算子用 Python 注冊完全夠用性能差異在大多數(shù)場景下可以忽略。第二條經(jīng)驗類型關(guān)系先用現(xiàn)成的實在不行再自己寫。ElemwiseRel和BroadcastRel能覆蓋大部分逐元素和廣播場景自己寫 TypeRelation 容易在邊界情況上出錯。如果非寫不可先寫一個最簡版本只處理TensorType把nullptr和動態(tài) shape 的情況留到后面再補(bǔ)。第三條經(jīng)驗測試要從最小用例開始。不要一上來就用真實模型的復(fù)雜輸入先用(1, 1)或者(2, 3)這種小 shape把類型推導(dǎo)、lowering、數(shù)值都對一遍。小用例跑通了再逐步放大。我見過有人直接上大模型報錯信息淹沒在幾百行日志里根本定位不到問題。第四條經(jīng)驗善用relay.transform.InferType和relay.transform.PrintIR。類型推導(dǎo)出問題時先跑InferType看報錯位置lowering 出問題時用PrintIR把 lowering 前后的 IR 打出來對比能快速定位是哪一步出的問題。第五條經(jīng)驗屬性字段的默認(rèn)值要合理。如果某個屬性沒有默認(rèn)值用戶調(diào)用時必須顯式傳否則解析會失敗。給一個合理的默認(rèn)值能降低使用門檻也能避免因為漏傳參數(shù)導(dǎo)致的詭異錯誤。6. 算子擴(kuò)展后的優(yōu)化與融合考量6.1 讓新算子參與算子融合新算子加進(jìn)去只是第一步能不能融入 Relay 的優(yōu)化流程才是決定性能的關(guān)鍵。Relay 的融合 pass 會把相鄰的算子合并成一個 kernel減少內(nèi)存訪問和 kernel 啟動開銷。新算子能不能被融合取決于它的 tag 和融合模式注冊。compute 里的tag參數(shù)是融合 pass 的重要依據(jù)。elemwise標(biāo)簽的算子通??梢院颓昂笏阕幼杂扇诤蟗roadcast次之reduce和injective有各自的融合規(guī)則。如果你希望新算子能融合tag 要設(shè)對。比如逐元素算子設(shè)elemwise涉及廣播的設(shè)broadcast。除了 tag還可以用register_fusion_pattern注冊更精細(xì)的融合模式。比如你希望某個算子和它前面的卷積融合可以寫一個模式匹配規(guī)則。這部分相對進(jìn)階不是所有算子都需要但如果你的算子性能敏感值得花時間研究。6.2 自定義 schedule 的接入點(diǎn)如果新算子的 compute 用默認(rèn) schedule 性能不理想可以自定義 schedule。TOPI 的 compute 函數(shù)通常配套一個 schedule 函數(shù)用te.create_schedule創(chuàng)建調(diào)度然后對循環(huán)做切分、向量化、并行化等操作。自定義 schedule 的接入方式是在 Relay 的 lowering 配置里指定。TVM 的relay.build可以傳schedule_cfg或者用OpStrategy機(jī)制把 compute 和 schedule 綁定。對于自定義算子最簡單的做法是在 TOPI 里提供一個 schedule 函數(shù)然后在 lowering 時通過FTVMSchedule屬性指定。schedule 的編寫是另一個大話題這里不展開。但要提醒一點(diǎn)不要過早優(yōu)化 schedule。先用默認(rèn) schedule 把功能跑通測出性能瓶頸再針對性地寫 schedule。很多時候默認(rèn) schedule 已經(jīng)夠用自定義 schedule 的收益可能還不如換個更合適的 tag 讓融合 pass 發(fā)揮作用。6.3 跨后端兼容性檢查新算子寫完之后如果你需要它在多個后端上都能跑要做兼容性檢查。不同后端對算子的支持程度不一樣比如某些后端不支持特定的數(shù)據(jù)類型或者不支持動態(tài) shape。測試的時候至少覆蓋 CPU 和你有需求的目標(biāo)后端。如果某個后端不支持通常有兩種處理方式。一種是提供 fallback 實現(xiàn)讓不支持的部分回退到 CPU 或者用其他算子組合。另一種是在 lowering 階段做后端特定的轉(zhuǎn)換把新算子拆解成后端支持的算子。具體選哪種取決于你的性能要求和實現(xiàn)成本。還有一個容易被忽略的點(diǎn)是 dtype 支持。你的 compute 實現(xiàn)里如果用了tvm.tir.const包裝常量要確保常量的 dtype 和輸入 dtype 一致。如果輸入可能是float16也可能是float32compute 要能處理兩種 dtype不能寫死。測試的時候把常見 dtype 都跑一遍避免上線后才發(fā)現(xiàn)某個 dtype 不支持。7. 我個人在實際操作中的幾點(diǎn)體會走完整個流程我最深的體會是TVM 的算子注冊機(jī)制雖然看起來繁瑣但它的設(shè)計是有內(nèi)在邏輯的。注冊、類型關(guān)系、compute 這三層分別對應(yīng)“是什么”“怎么推”“怎么算”把這三層想清楚代碼就是水到渠成的事。真正難的不是寫代碼而是理解每一層為什么存在、什么時候需要自定義、什么時候可以復(fù)用。另一個體會是文檔和社區(qū)示例很重要但不能全信。TVM 版本迭代快不同版本的 API 可能有差異網(wǎng)上找到的示例代碼不一定適用于你的版本。最可靠的做法是直接看當(dāng)前版本 TVM 源碼里已有的算子實現(xiàn)照葫蘆畫瓢。比如你想加一個逐元素算子就找一個現(xiàn)有的逐元素算子把它的注冊、類型關(guān)系、compute 都讀一遍然后照著改。這比看任何教程都管用。最后一點(diǎn)不要怕報錯。新增算子涉及的環(huán)節(jié)多第一次做幾乎不可能一次通過。報錯信息通常很具體指向某個文件某一行順著排查基本都能找到原因。我自己的習(xí)慣是每改一小步就編譯測試一次不要攢一大堆改動再一起測那樣出了問題很難定位。小步快跑逐步驗證是走通這個流程最穩(wěn)的方式。如果你后續(xù)還想擴(kuò)展可以考慮的方向包括給算子加梯度支持讓它能參與訓(xùn)練、寫自定義 schedule 提升性能、或者把算子貢獻(xiàn)回 TVM 社區(qū)。每個方向都有各自的坑但核心流程和這篇文章講的是一致的。把基礎(chǔ)流程走通后面的擴(kuò)展就是在這個框架上做加法。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
色婷丁香五月| WWW.99热| 婷婷五月花免费视频在线| 黑人巨粗进入警花疼哭A片| 婷婷精品性视频| 久久久www| 国产视频色色色色色色色| 婷婷五月激情天| 综合五月草| 亚洲另类AV| 天天综合色| 丁香五月中文字幕色播| 夜夜躁爽日| 国产精品久久久99视频| 婷婷性爱影院| 五月婷婷人人人操| 第五婷婷伊人丁香色| 熟女少妇内射日韩亚洲| 五月婷婷久久综合| 五月天婷婷成人网| 色婷婷综合网| 五月婷婷丁香啪啪| 天天色99| 97超碰在线免费观看| 九九色婷婷五月天| 五月精品99综合| 99ri视频| 中文字幕无码人妻少妇免费视频| 粉嫩AV久久一区二区三区| 亚洲综合成人网| 五月六月婷| 亚洲99在线视频| 丁香五月网站| 天天舔天天摸天天射| 97久久久久| 啪啪色区| 日本久久精品| 亚洲五月天综合色| 美女主播野战视步页| 五月色综合| 婷婷情色五月天| 铁牛TV人妻| 97超级碰碰碰久久久| 免费视频WWW在线观看网站| 五月伊人网| 月婷婷婷婷五月| 婷婷五月天成人基地| 天天综合天天做天天综合| 五月天激情黄色小说在线观看| 五月天综合久久丁香91| 大香蕉五月婷婷| 色日本综合| 婷婷色色欧美| 婷婷五月天久久久| 亚洲综合色网站| 亚洲视频a| 亚洲操人| 六月丁香激情婷婷| 色五月大| 色99在线| 婷婷99视频全集高清| 五月丁香六月婷婷中文版| 天天色播| 天插天啪天啪天啪| 狠狠干天天日| 九九RE视频在线精品| 久久丁香五月天| 色999五月色| 色色亚洲视频| 啪啪日本欧美| 日本操碰碰| 日韩人妻在线观看| 五月情婷婷五月| 丁香花五月天| 六月婷婷色色色| 色婷婷丁香| 五月综合色| 精品国产乱码久久久久久免费| 久久婷婷超碰| 婷婷永久在线| 这里只有九九精品| 九九综合伊人| 91久女| 免费日本aⅴ中文字幕| 激情骚五月| 91九色国产熟女| 婷婷视频网| XXXX岛国| 99免费视频| 婷婷久久网| 国产又粗又大又爽又黄| 五月停停色| 午夜天堂啪啪| 色狠久| 婷婷五月天激情电影| 97色色色| 9久久AV| 天天开心婷婷丁香五月| 青青草婷婷久久| 久9久9久9久9久9久9| 成人精品一区二区三区四区五区| 五月婷婷六月丁香在线| 国自产拍偷拍精品啪啪一区二区| 二级黄色毛片| 思思精品久久艹| 黄色一级影片| 九色99视频| 色综合九九色综合88| 操操操av| 九九热视频精品| 九色99视频| 日本97在线视频| 五月六月丁香婷婷在线观看| 久久久大香蕉| 色青五月天| 激情五月天综合网站网站网站| 79色色色色| 五月香婷婷| 久9综合| 亚洲成人在线播放| 无码动漫av| 成人做爰黄A片免费看直播室男男 A片试看120分钟做受图片 | www色五月| 玖久精品视频9| 伊久久婷婷| 狠狠爱深色婷婷综合| www.五月婷婷.com| 婷婷六月激情| 99啪视频在线观看| 操日挥操日日| 亚洲精品另类| 丁香操逼| 丁香六月激情综合网| 欧美三日本三级少妇三99| 天天干在线播放| 99精品在线播放| 丁香六月婷婷综合缴| 亚洲V国产V欧美V久久久久久| 亚洲婷婷91丁香| 一级性爱视频| 色约约视频一区二区三区四区五区 | 五月婷色| 久久92| 五月激情综| www.lchjjc.com| 久久丁香婷婷五月天| 天天射影院| 无码AV大香线蕉伊人| 婷婷五月天,影院| 亚洲av骚货| A1片久久久| 国产无套精品一区二区| 色月丁| 色婷婷丁香中文在线播放| 大香蕉综合网| 69五月天视频| 婷婷香草网| 2014天天爽| 久久婷五月婷| 亚州精品色情无码A片| 一区视频网站| 97人人干人人操| 五月天激情久久| 99日逼视频| 天天做天天爽| 男女99免费视频| 婷婷六月天天| 五月丁香久人妻中文| 婷婷的99视频网站| 欧美成性色| 这里只有精品在线观看视频| 六月激情婷婷色| 五月天婷婷激情在线色图| 99黄色在线视频精品熟女| 综合久久人妻| 日良久久| 五月天成人综合| 色色成人網| 精品一二三区久久AAA片| 午夜九九电影| 超碰97色| 91超级碰| 亚洲九九九九| 51XX嘿嘿午夜无码| 亚洲综合99| 日日操夜夜操狠狠操| 欧美婷婷| 五月婷婷 激情五月| 亚洲激情| 色色色热热热| 日韩色情亚洲五月天婷婷| 最新无码专区| 日本啪啪网| 玖玖综合色| www.婷婷| 99热在这里只有精品| 欧美在线视频9| 久久天堂网| 99视频色在线观看| 五月激情婷婷偷拍| 国产99久久久| 丁香激情婷婷网| 欧美性交一区二区三区| 播播网色播播| 六月丁香激情网| 天堂色婷婷| 亚洲色另类| 色视五月天婷婷| 欲求不满的人妻| 超碰在线免费9| 性色欲情 网站| 五月天激情色色| 亚洲va在线∨a天堂va欧美va| 97人凄人人操人人爽| 日韩无码专区| 99久久这里只有精品| 久久婷婷伊人| 日韩AV在线免费| 婷婷四色五月| 99热在线观看这里只有精品| 久热婷婷| 大香伊人婷婷影院| 激情五月天色色| 欧美激情综合色丁香婷婷五月天| 99热在线观看免费中文| 国产中文字幕在线视频免费观看 | 超碰在线观看成人视| 99久久久久| 五月婷婷综合色拍| 97操操| 91九九九九| 欧美成人va| 婷婷久久视频| 五月天婷婷av| 激情五月婷婷啪啪| 超极99精品| 超碰免费成人| 夜夜干天天操| 天天搞天天色综合| 青草视频在线蜜臀| 全亚洲最大的婷婷五月天网站COM| www.99riav99| 成 人片 黄 色 大 片| 五月婷婷在线综合| 99热这里只有精品50| 99免费热视频在线| 六月婷在线| 色婷婷亚洲婷婷| 日本色五月婷婷| 激情婷婷丁香色五月综合| 久久九九精彩| 婷婷丁香黄色| av操B网站| 五月天激情网站| 日本九九网| 亚洲、热| 亚洲女婷婷五月基地综合久久久| 丁香五月天偷拍| 超级碰碰碰碰视频| 婷婷五月六月| 色婷婷A| 天天影视色综合网| 欧美97p| 99色色热| 五月综合视频在线| 色综合色综合婷婷热| 超碰a女人的天堂| 婷婷黄色网| 无码日本精品XXXXXXXXX| 久久精品4| www.五月丁香| 婷婷激情综合| 久久久久这里只有精品| 婷婷性色| 婷婷丁香六月天| 五月综合影院| 色操b| 五月丁香六月婷婷免费| 激情伊人五月婷婷久久| www.爱操com.| 色婷婷五月婷婷五月婷婷五月| 日韩五月婷婷| 午夜丁香六月婷| 亚洲一个色| 婷婷天堂站| 久久婷婷综合基地| 99无码视频| 亚洲综合99| 999婷婷综合| 亚洲婷婷久久综合| 99黄色性生活| AV九九| 97色碰| 99色色网| 五月天社区婷婷| 丁香,开心成人,久久| 国产婷婷色综合AV蜜臀AV | 风流少妇A片一区二区蜜桃 | 丁香五月天欧美成人| 欧美一级色| 亚洲区,视频区,视频区免费| 五月天小说激情| 六月丁香五月激情网| 91视屏在线观看com.wwwvv| 99热99热在线观看| WWW.99热| 伊人玖玖精品| 99网| 久久精品噜噜噜成人A∨色欲| 国产精品人妻在线网址| 日本女天天爽| 五月婷婷激清网| 噜噜网免费视频| 婷婷五月天小说| 婷婷综合色色| 九九九九精品精| 五月天另类小说久久小说网| 日本啪啪网| 人人玩人人橾| 亚洲五月花| 久操人妻| 欧美三级视频| 激情综合色| 综合激情网| 婷婷丁香激情综合色情| 欧美影院婷婷| 激情涩播| 丁香六月久久| 激情婷婷五月天日本系列| 十一月婷婷激情四射| 天天爽人人综合免费7799| 99在线免费视频| 丁香婷婷婷婷十二月在线观看视频| 人妻激情视频| 天天拍夜夜爽| 五月丁香婷婷综合| 丁香五月天日韩无码| 人妻久久婷婷| 国产日日操夜夜操的肉棒视频| 日日夜夜天天| 色欧美一级| 国产精品国产| 99re这里有精品手机在线| 色色色网站| 色五月婷婷色| 一区视频网站| 天天综合网网欲色| 婷婷综合在线| 久久久99婷婷久久久久久| 五月熟妇婷婷久久| 婷婷精品在线| 色婷婷无吗| 丁香色五月直播| 五月天啪啪网| 综合大香蕉| 日日激情网| 大香蕉伊人久久| 五月丁香色停停啪啪啪| 午夜丁香丁香婷婷| 四月婷婷五月丁香| 丁香花综合永久入口| 91精品久久久久久77777| 丁香五月激情六月综合| 天天爱天天操| 日韩性视频| 天天爽夜夜爽天天爽夜夜爽| 免费视频无码| 激情综合婷婷| 丁香五月婷婷大香蕉| 99国产精品久久久久久久久久久| 九九aV| 久久伦乱| 欧美精品狠狠色丁香婷婷| 色婷婷综合久久久久| 五月色丁香成人| 亚洲黄色精品| 天天操夜夜橾| 色婷婷久综合久久一本国产AV| 狠狠擼综合| 五月婷婷激情四季| 怕怕av| 丁香色婷婷| 激情五月丁香社区| 97操操| 午夜激情综合| 人妻AV在线| 中文字幕在线不卡| 免费黄色片子| 精品99这里有| 欧洲亚洲免费视频9| 丁香亭亭久久| 婷婷五月天无码熟女| 美女五月激情| 婷婷六月中文字幕| 色婷婷六月天在线| 婷婷五月色播放| 久久99激情丁香婷婷小说网| 综合成人小说婷婷| 欧美日本国产欧美日本韩国99| 99精品在线| 五月婷婷丁香五月婷婷丁香| 婷婷综合亚洲| 激情小说视频图片| 玖玖在线视频| 国内熟女黄色系列| 99久在线精品99re5热视频| 久久超视频| 99视频九九热| 9+1视频网址| 色5在线| 天堂爱爱| 狠狠色噜噜狠狠| 人人草开心五月天| AV在线免费播放| 国产无套精品一区二区| 中文字幕在线免费看线人| 久久99久久99精品,久国产,久久精品免费,99久在线,久久久久国产精品免费网站,9 | 亚洲一二三网| 六月婷婷香蕉| 激情五月天在线观看色婷婷| 99综合99| 思思热视频| 9有码中文| 五月丁香婷婷色色| 大地9中文在线观看免费高清| 久久精品A片777777| 日韩人妻白浆视频系列| 亚洲热久| 亚洲热手机在线观看| 噜色精品| 丁香五月天堂| AV电影在线播放| 色情五月天婷婷| 天天热夜夜操| 久久多色| 精品少妇人妻AV无码专区偷人 | 97超级碰碰碰久久久| 婷婷激情啪啪| 996er在线观看| 激情婷婷狠狠干| 狠狠色综合精品视频在线| 九九 激情 网| 国产暴力强伦轩1区二区小说| 久久日婷婷| 97色色婷婷五月天| 99热99精品在线观看| 五月丁香六月欧美综合网站| 天天日天天舔| 五月天色站| 120分钟婬片免费看| 99热在线中文字幕| 色婷婷五月在线| 欧美叉叉叉BBB网站| 99热999| 五月色婷婷亚洲 | 99日本视频| 日本精品在线噜噜噜| 五月婷婷乱| 性热视频99精品| 日韩中文欧美| 国产综合婷婷| 五月丁香六月婷婷手机无线| 99精品热| 色99免费视频中文| 人人干天天操五月丁香| 久久五月天色婷婷| 丁香五月婷婷啪啪视频| 五月色情婷婷| 免费看欧美成人A片无码| 五月丁香在线| 综合久久97| 丁香婷婷视频一区二区| 亚洲综合激情五月久久| 九九亚洲无码| 性生活视频98791| www.婷婷五月天.com| 欧美超碰亚洲| 艹| 色色操| 9一精品视频观看| 79精品在线视频| www.婷婷五月天.com| 亚洲无码成人性爰网| 人人澡玖玖一| 日hao1区| 久久婷婷五月天亚洲欧美| 91啪啪视频| 99色五月| 99无码黄色视频| 欧美内射AAAAAAXXXXX| 日本美女上人| 激情五月天偷拍综合网| 国产精品成av人在线视午夜片| 久久丁香五月综合六月激情红杏视频 | 五月天丁香婷婷久久九| 天天拍夜夜撸| 五月色综合| 欧美色碰| 激情五月丁香六月综合AVXXXX| 色婷婷丁香五月观看| 日本天堂爱爱| 五月天淫乱视频| 色爱爱综合网| 狠狠色五月| 久操热线| 激情图片亚洲| www久久久| 五月丁香六月色| 五月天五月天激情网| 国产FREESEXVIDEOS性中国| 狠狠综合| 五月天另类小说| 99热丁香五月| 超碰网站在线观看| www.99热这里精品| 另类激情五月在线视频欧美| 久久日韩婷婷五月| 五月丁香在线观看| 色色色五月| 性99网站| 蜜臀av 粉嫩av 懂色av | 五月天婷婷色综合| 色婷婷久久综合| 97色天堂| 国产操B视频| 97碰人人操| 综合网狠狠| 欧州色色| 久久久久婷| 丁香美女五月天婷婷| xxxx五月天色色| www.色五月.com| 色综合久久8| 色婷婷社区| AV免费在线网站| 五月天色婷婷综合| 九热视频在线精品15| 大香蕉久久婷婷精品综合| 色欧美影院| 狠狠色丁香婷婷久久综合| 九九综合网色全集| 超碰成人在线观看| 九九AV| 激情视频网址| 色五月视频无码播放| 五月天大香蕉av| 亚洲激情网站| 久久婷婷人人| 99热这里只有精品3| 天天爽天天爽天天爽天天爽天天爽| 婷婷丁香六月| 色婷婷九月综合| 丁香婷婷久| 播五月丁香三月婷婷| 99日精品视频| 激情综合网五月| 十月丁香婷婷| 大香蕉久久伊人网| 婷婷五月色色| 日本女va| 五月婷无码| 色综合天天| 九九九九毛片| 久久人人做人人妻人人玩精品va| 欧美日韩一区二区三区四区| 婷婷中文无码| 乱精品一区字幕二区| 去干网最新版本亚洲版| 丁香六月综合激| 97碰久久| www,色中色| 92久操视频| 五月天婷婷免费| 天天日天天干天天爱| seav天堂| 大香蕉天堂| 亚州精品色情在线观看| www91色网站| 亚洲av成人在线| 天天色综合色色色色色。| 欧美性爱丁香五月| 97狠狠色| 综合网五月天123| 久久五月婷婷丁香| 亚洲乱码日产精品BD| 色五月天本日| 婷婷五月激情的图片| 日日夜夜天天爽| 在线观看av网站| 亚洲综合色网| 日日操天天操| 日 日干 日日做| 九九人人看| 伊人久久婷婷| 丁香五月婷婷视频| 狠狠色官网| 97婷婷狠狠久久综合9色| 激情六月天| 六月丁AV| 色99亚洲| 丁香九月综合| 中文字幕成人版| 91久热| 2025天天操| 丁香五月天啪啪| 久久综合九色综合88i| 日日噜噜夜夜狠狠久久丁香五月| WWW.婷婷| 九九九午夜影院成人| 91凹凸在线| 无码 av电影| 99ri在线观看视频| www,婷婷| 狠狠干2007| 日韩在线9| 色播激情| 国产精品扒开腿做爽爽爽A片唱戏 亚洲爆乳无码精品AAA片蜜桃 | 思思热99热| 五月色婷婷综合| 99久久a线观| 久久艹99| .comwww在线观看免费操| 久久伊人大香蕉| 丁香婷婷五月综合| www.开心激情| 天天 日综合| 色啪影院| 玖玖五月| 99资源人人| 疯狂做受XXXX高潮A片| 综合久久婷婷| 六月婷婷五月丁香| 久久er99| 狠狠色精品综合| 99视频地址| 激情婷婷| 久久久www| 激情五月婷婷视频一区二区三区| 丁香操逼| 在线免费视频caop| 午夜精品人妻无码一区二区三区| 亭亭五月色男人| 综合99视频| 日韩日比视频| 丁香操逼| 丁香五月综合网| 伊人激情AV一区二区三区| 色婷婷久久| 99乱视频| 色玖玖综合| 人妻内射视频| 国产精品香蕉| 天天日夜夜帕| 成年人看Va免费视频| 婷婷丁香五月六月激情| 婷婷激情综合色五月久久,色婷婷丁香花,丁香婷婷五月情天,久久婷婷五月综合色 | 粉嫩av蜜桃av蜜臀av| 九伊人网| www.久久爱.c n| 九九热99在线视频| 久久机热探花| 停停六月 综合| 激情五月婷婷她| AV在线不卡网站| WWW色色色COM| 久草视频大香蕉99| 久久久香港| 激情五月瑟瑟| 日韩三及成人AV片| www激情网站| 欧美性爱日韩性爱| 99亚洲视频| 操逼三区| 草一草avb| 99re免费精品视频| 丁香色五月婷婷17C| 久久五月天色婷婷| 99re这里只有精品国产99| 综合激情网五月激情| 青青草搞屄视频网站| 五月婷婷视频啪啪美女| 婷婷天天综合| 中文字幕乱轮| 久热这里| 日韩无码专区| 久久9视频| 男女啪啪做爰高潮无遮挡| 国产成人精品一区二三区熟女在线| 欧美大肥婆大肥BBBBB| 国产XXXX搡XXXXX搡麻豆| 国产午夜精品AV一区二区麻豆| 桃色五月婷婷| 91精品啪| 精品人人操| 狠狠色婷婷7| 五月婷婷中文网| 色五月丁香六月婷婷| 五月情婷婷| 色99色| 婷婷五月丁香六月| 99热久久这里只有精品| 亚洲在线网站| 99操视频| 欧美成人va| AA片在线观看视频在线播放| Av在线资源| 五月天丁香久久| 五月天丁香六月综合| 久久6这里只有精品| 久久久五月婷婷| 久草热在线视频| 色区久久| 久久丁香综合香蕉| 五月天丁香综合久久国产| 九九这里只有精品在线视频| 色婷婷五月天综合网| 五月亭亭狠狠| 日韩999| 狠狠色婷| 99操视频| 九九无码视屏| 久久人人看| 日本不卡高字幕在线2019| 性爱七区| 日韩草草草草草草草草草草草草| 99久久久| 亚洲色网络| 九日日夜夜69| 狠狠综合久久| 开心五月婷| 亚洲av成人在线| 国产五月视频| 五月天激情久久| 亚洲第精品| 成人免费在线电影| 青草视频在线播放| 色五月超碰| 天天干天天操天天上| 久久综合中文字幕| 一本色道久久88加勒比| 91色操| 五月丁香六月婷婷a v| 99热综合色图| 国产操B| 综合色久| 亚洲av骚货| 激情五月综合| www,色婷婷| www.五月丁香av| 婷婷六月丁香五月| 婷婷色五月天色| 色天天综合色| 色色丁香| www.久久久久久久久久久| 色五月亚洲五月天| 99自拍网| 日本在线wwww| 五月天伊人日日噜影片AV| 日韩九区| 激情丁香久久久久久| www.91有码.com| www.色婷婷| 18久久| 99热这里有精品2| 狠狠的日| 色五月激情| 丁香五月激情啪啪| 色香蕉精品五夜婷| 欧美又粗又大一区二区在线观看| 色色色网站| 激情五月婷婷六月丁香| 五月天综合网| 99视频自拍| 桃色五月天| www。五月,com| 5月丁香综合网| 五月婷婷之综合激情| 伊人婷婷色| 九九免费精品| 97日韩无套内| 色五月久久成人婷婷| 大香蕉婷婷| 色色五月天丁香婷婷| 丁香色婷婷| 97综合视频在线| 米奇激情婷婷| 五月天婷婷久久| 色婷婷黄色网络| AV五月丁香| 99色.com| 激情五月天婷婷丁香 | 色婷婷在线播放| 五月丁香在线| avv在线| 99操逼| 五月停停99| 五月天狠狠干| 岛国在线观看91| 色五月婷婷在线视频| 97干在线| 激情综合网五月天天| 九九亚洲| WWW,激情五月天,COM| 久久一热| 久久综合丁香五月| 可以看的av| 日韩免费乱轮网站| 丁香六月在线| 日本老女人黄页在线播放| 色综合九九| 在线中文字幕视频| 99热精品在线播放| 色色五月天婷婷| 俺去也五月| 99色综合网| 日日夜夜干| 热久久成人| 国产AV国片偷人妻麻豆| 插少妇综合网| tingtingcaobi| 欧美亚洲婷婷五月| 色情网综合| 99热这里有精力| 无码动漫AV| 五月天伊人久久久久| 亚洲婷婷久久综合| 五月丁香综合啪啪| 久久五月天色婷婷| 无码少妇高潮喷水A片免费| 天天日日天天| 在线超碰免费| 色五月天综合网| 国产婷婷综合| 少妇高潮一区二区三区99欧美| 欧美va视频| 五月天激情婷婷| 色999五月色| 婷久久久| 五月天激情综合| 欧美婷婷日本| 五月丁香六月婷综合成人综合| 综合xx网| www.cao.com久久| 五月激情婷婷综合| 五月天激情四射| 思思热99er在线视频| 五月婷婷六月激情| 五月色综合网| 婷婷的久久网站| 人人爱操| 九九色热视频| 婷婷五月丁香花综合| 丁香五月香蕉| 狠狠色激情综合| 久久青青日本视频| 国产成人+综合亚洲+天堂| 蜜乳.comcom| 久久久久久9热不雅视频| 色婷婷精品视频| 天天色综合天天| 五月天操逼激情| 六月婷婷五月丁香| 99久久66| 超碰免费观看| 色欲天天综合| 爱草视频在线| 日韩一级网站| 五月丁香狠狠爱| 五月婷婷综合精品| 97AV在线视频| 欧美情色一区| 亚洲网站999| 99热思思在线观看| 国洲夜色亚热在线久久| 日本五月婷婷| 特级片神马电影| 色玖玖爱| 激情五月四色| 久久xxxx| 亚洲人妻五月丁香婷婷| 超碰人人艹| 牛牛澡牛牛爽| 成人丁香五月| 99热这里只有精品最新地址获取| 五月色婷婷影院| 怡红院AV亚洲一区二区三区H| 五月丁香婷婷六月| 五月六月丁香激情视频| 性爱五月婷婷| www.狠狠| 91久久九久久九久久九久久九久久 | 久久综合网桃花| 日韩无码专区| 丁香五月婷婷网| 五月天婷婷在线啪啪视频| 日本九九网| 51精品国自产在线| 内射综合网| 五月丁香六月欧美| 五月开心婷婷网| 久久久久久久久久婷婷| 久久在线视频免费观看| 久99久精品视频| 天天夜天天色天天| 六月丁香激情综合网| 亚洲AVwwwwwww| 亚洲五月天激情| 99热亚洲精品| 五月天婷婷视频30| 亚洲婷婷丁香五月在线| 久婷久婷激情肉| 蜜桃婷婷丁香综合久久开心亚洲| 激情五月综合网| 丁香五月天激情免费在线观看AV777| 久er7久热| 色色丁香婷婷综合| 91AV视频| www.wuyuetian啪啪| 泰州成人视频| 五月天丁香婷| 99热免| 亚洲va久久久噜噜噜久久天堂| 婷婷五月电影院| 直接看的AV| 四色女婷婷| 婷婷五月天美女| 天天操中文字幕| 免费看片在线观看| 曰韩五月丁香色婷婷无码| 五月丁香六月婷| www.婷婷五月天| 婷婷狠狠操| 99热这里只有精品最新网址| 天天色五月| 久久视这里只有精品| 影音先锋毛片网站| 天天操精品| 91大操| 情欲禁地| 嫩草AV久久伊人妇女超级A| 91久久婷婷| www.日韩国产| www.夜夜| 六月丁香婷婷综合在线| 欧美精品熟女一区二区| 丁香五月激情澎湃一区| 婷婷久久国产视频| 色婷婷狠狠干| 五月天色导航婷婷资源婷婷| 五月伊人网| 久久婷婷91| 91ncm视频| 91久久综合亚洲噜噜成人在线| 成人在线视频男人的天堂4399| 色九九九综合| 男女av免费看| 久婷狼色诱惑在线| 欧美五月停| AAA级久久久精品| 麻豆AV一区二区三区| 国产精产国品一二三在观看| a在线观看| 99爱爱| 久久久久久久人妻| 天天日天天插| 欧美搡BBBBB摔BBBBB| 99久久国产宗和精品1上映| 久久婷婷五月天| 99热官网| 白人荫道BBWBBB大荫道| 极品少妇XXXX精品少妇偷拍| 九九视频在线观看视频6 | 97高清国语自产拍| 色伊人91在线视频| 丁香婷婷狠狠97| 天天综合网~91| 五月激情久久| 大香AV| 猫咪伊人久久| 婷婷色五月丁香六月欧美啪| 激情综合五月| 久热这里只有精品在线观看| 激情五月综合免费| 亚洲精品性色| 五月丁香六月婷婷综合网站| 久草热在线视频| 99热这里| 婷婷五月天伊人| 性无码专区无码| 色婷婷丁香女女| 殴美97色| 视频一二区| 99久久久久| 五月激情六月| 人人干Av| 色香欲综合| 99re在线精品视频| 能看的AV| www久久久久久久久久久| WWW.HENHENL.| 九久久精品视频99| 天天日天天添| 婷婷免费无视频| 五月婷婷中文字幕| 色播婷婷五月天| 婷婷综合网| 久久全意婷婷| 久久九九精彩| 亚洲激情亚洲激情 | CHINESE熟女老女人HD视频| 综合色图婷婷| 色碰碰视频| 婷婷五月丁香六月| 《亚洲操B久久免费在线观看,亚洲操B久久在线播放》在线播放 - 高清资源 - 97 | 久热婷婷| 国产古装妇女野外A片| 碰碰碰碰碰99| 色六月婷婷| 六月色婷婷欧美| 免费观看欧美成人AA片爱我多深| 五月天激情久久| 噜噜在线| 丁香五月婷婷欧美成人色图| 国产67194| 久久机热这里只有 | 熟女激情网| 国产人妻人伦精品一区二区| 精品操逼一区二区| 狼人久草| 五月丁香另类网| 丁香婷婷色| 香蕉AV777XXX色综合一区| 五月婷婷亚洲色图| 欧美丁香婷婷天天操| 开心五月天激情网站| 久久人操| 激情AV综合| 99操逼视频| 热久久视频99| 成人五月丁香社区| 日韩黄在免| 亚洲成人高清在线| 婷婷五月天99| 另类精品视频在线观看| 桃色成人网| www.99热在线观看| 激情二色月| 六月激情婷婷| 丰滿爆乳一区二区三区| 九九aV| 久久少妇视频| 婷婷丁香久久| 天天干,天天操,天天射| 岛国资源网| 大香蕉伊人99| 精品9久| 人妻久久做| 玖玖婷婷五月天| 亚洲亚洲人成综合网络| 91久久精品无码一区二区三区| 五月丁香六月情婷婷久久| 四虎成人精品永久免费AV九九| 97综合视频在线| 丁香五月天激情网址| 亚洲精品国产精品乱码视99| 成人综合网站| Av九九| 五月婷婷六月丁香色| 最近韩国日本免费高清观看| 久久婷婷色综合| 天天干天天射色综合| 国产亚洲色婷婷久久99精品91| 色婷婷综合影院| 亚洲行行色色| 五月天激情网图片| 婷婷久久性爱| 婷婷丁香五月亚洲免费| 伊人激情AV一区二区三区| 久久 婷婷 五月天| 免费不卡狠操美女视频网| 免费视频WWW在线观看网站| 丁香激情网| 久久激情网| 90色免费视频| www.五月激情.com| 五月婷婷婷婷| 婷婷六月视频| 色色色色色色色色网站| 九九亚洲天堂| 99re在线观看视频| 1024日韩| 日本高清久| 91婷婷五月天嫩女| 久久婷婷五月综合色区| 免費亭亭成人| 日韩啊啊啊| 五月天激情图片| 色五月婷婷91| 99热精品超碰| 黄色AAAAA| 日日操天天| 日韩成人不卡| 97激情五月天| 婷婷成人视频| 99色综合| 色婷婷网| 亚洲av日韩无码| 丁香五月天婷婷中文字幕| 99ri国产精品| va婷婷| 一本到不卡高清DVD| 亚洲综合色丁香婷婷六月| 99热精品在线| 久久99这里| 亚洲综合在线视频| 五月丁香爱婷婷深深| 婷婷综合激情| 五月婷婷六月丁香| av中文在线| 激情av| 丁香啪啪| 97人人草| 九九在线精点品| 色婷婷成人| XX色综合| 秋霞三级色戒| 狠狠爱综合网| 操操操av| 成人无码髙潮喷水A片| 日韩a热| 一本大道嫩草AV无码专区| 久久在这里有精品| 中文幕无线码中文字蜜桃| 久久五月婷综合网| 亚洲V国产V欧美V久久久久久| 丁香五月婷婷色综合基地| 无人区码一码二码三码医生系列| 亚洲五月综合色播| 色综合99无码| 五月花综合视频| 丁香五月手机视频| 久草a片| 免费亚洲婷婷中文字幕| 色五月丁香网| 五月激情丁香久久综合网| 国产美女无遮挡裸体毛片A片| 婷婷六月网| 婷婷五月五月丁香| 欧美一级操逼视频| 涩涩婷婷五月| 99久久99九九九99九他书对| 六月丁香婷婷色狠狠久久| 日本天天色| 六月婷婷影院| 婷五月天| 五月丁香激情婷婷| 91婷婷丁香五月天免费视频网站| 91狠狠色丁香婷婷综合久久| 色婷丨日丨天丨综合久久| 精品热九九| 天天操婷婷| 婷婷六月激情| 激情色播| 色综合网综合| 99九九热视频免费| 六月婷婷综合激情| 99热免费网站| 久久久婷婷五月天| 天天激情欧美美女| 色五月天丁香| 国产乱人偷精品人妻A片| 亚洲激情免费视频| 成人毛片在线免费观看| 久久综合九九| 极品 少妇 内射| 丁香天堂夜| 婷婷激情五月| 99视频精品8 | 亚洲国产精品VA在线看黑人| www,色婷婷| 婷婷五月天伊人| 狠狠撸激情综合丁香五月天俺来啦| 亚洲视频无| 夜夜撸天天操| 99热九九在线| 婷婷五月色图| 久久99久久99久久99人受| 久久66成人网站| 色色五月天网站| 成人做爰A片免费看视频| 色色色.COM| 五月激情综合网| 99精彩视频网站在线| 欧美Va日本Va| 色婷婷婷av| 91碰碰碰久久久久| 国产激情视频在线观看| α久久| 97人操人免费视频| 99国产精品久久久久久久久久久 | 婷婷va| 丁香五月成人| 久热只有精品| 99热无码精品| 9 9热这里有精品| 色婷婷综合网| 99爱在线精品视频免费观看| 激情综合五月| 嫩草视频。| 99久视频| www.com五月天| 涩涩五月天综合| 成人人操| 五月天激情网站| 色五月综合资源推荐| 另类小说五月天激情| 中文字幕在线资源| 99热精品9| 色婷| 九九热123| 九九色精品| 五月婷婷色激情| 欧美激情 日韩无码 婷婷 五月天 久久婷婷丁香五月一二三 | 伊人午夜综合色啪| 香蕉综合在线| 日本nghangse中文字幕| 欧美在线干| 类似婷婷激情综合网站| 五月丁香婷婷激情| 国産精品| 久久99网| 狠狠操狠狠爱| 日本一级一片免费视频| 五月天激情开心网| 久久九九视频网站| 日韩黄色电影| 色婷婷中文| 日日噜噜夜夜狠狠久久丁香五月| 久久538| 五月欧美色色五月| 久思思热视频在线观看| 97婷婷狠狠久久综合9色| 国产成人综合电影| 五月天色五月| 五月婷婷深深爱| 婷婷六月视频| 六月婷五月丁香| 这里只有精品亚洲| 伦99热| 大香蕉网 久久| 亚洲亚洲人成综合网络| 国产激情综合五月久久| 五月婷婷六月色| 婷婷六月五月天综合| 日操五月婷| 性韩日色婷婷五月天激情啪啪XXX| 日本色色网站| 伊人激情网| 苗黎美女四级成人版一级二级毛片| 五月丁香偷拍| 日日干天天射| 丁XX 成人| 五月激情婷婷在线| 国产一二三四五六七八视频| 五月的婷婷六月丁香| 丁香五月婷婷久久久|