亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

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

TFLite算子注冊(cè)與Delegate接管機(jī)制:從FindOp到執(zhí)行計(jì)劃替換全解析

TFLite算子注冊(cè)與Delegate接管機(jī)制:從FindOp到執(zhí)行計(jì)劃替換全解析 如果你在移動(dòng)端或者嵌入式設(shè)備上跑過(guò) TensorFlow Lite大概率見(jiàn)過(guò)下面這類(lèi)報(bào)錯(cuò)Didnt find op for builtin opcode BATCH_MATMUL version 3或者遇到更費(fèi)解的情況模型在 PC 上推理一切正常換到某個(gè)硬件板子上就提示 custom op 找不到再或者你興致勃勃接了一個(gè)硬件 delegate結(jié)果日志顯示一個(gè)算子都沒(méi)被接管推理速度紋絲不動(dòng)。這些問(wèn)題背后指向的是同一個(gè)機(jī)制TFLite 的算子注冊(cè)機(jī)制。你想真正定位這類(lèi)問(wèn)題就得順著FindOp這條路一直摸到Delegate。這篇文章我會(huì)從模型里算子的存放方式講起一路拆到OpResolver的查找邏輯再講清楚 delegate 接管執(zhí)行計(jì)劃時(shí)到底發(fā)生了什么最后給一個(gè)可以跑的最小 custom delegate 示例和一套排錯(cuò)思路。內(nèi)容包括算子模型文件結(jié)構(gòu)、TfLiteRegistration內(nèi)核接口、FindOp查找路徑、版本匹配邏輯、BuiltinOpResolver與MutableOpResolver的使用場(chǎng)景、ReplaceNodeSubsetsWithDelegateKernels的執(zhí)行鏈以及手寫(xiě) delegate 的常見(jiàn)坑。適合在部署 TFLite 模型、接入 GPU/NPU 加速、或者要寫(xiě)自定義算子的人看。1. 先明確“算子”在 TFLite 里的三個(gè)身份模型描述、運(yùn)行時(shí)節(jié)點(diǎn)、執(zhí)行內(nèi)核很多人在排查算子問(wèn)題時(shí)會(huì)卡住是因?yàn)闆](méi)分清楚“算子”這個(gè)詞在不同階段指的是不同東西。模型文件里有一個(gè) operator加載進(jìn)解釋器后它變成一個(gè)執(zhí)行節(jié)點(diǎn)真正運(yùn)算時(shí)它又對(duì)應(yīng)一份內(nèi)核代碼。這三個(gè)身份是同一份數(shù)據(jù)在不同環(huán)節(jié)的投影理解它們的對(duì)應(yīng)關(guān)系后面所有問(wèn)題都好辦了。1.1 模型文件里算子是怎么存放的TFLite 模型是 flatbuffer 格式。整個(gè)模型頂層有一張operator_codes表這張表可以理解為“算子字典”table OperatorCode { builtin_code: BuiltinOperator; custom_code: string; version: int; }每個(gè) SubGraph 里有operators數(shù)組數(shù)組里每一個(gè)Operator都通過(guò)opcode_index指向operator_codes里的某一個(gè)條目同時(shí)記錄自己的輸入輸出張量索引table Operator { opcode_index: uint; inputs: [int]; outputs: [int]; }這種設(shè)計(jì)最直觀的意義是省空間一個(gè)模型里哪怕用了 50 次 ADDoperator_codes表里也只存一條 ADD 描述50 個(gè)算子節(jié)點(diǎn)都指向它。更關(guān)鍵的是版本信息只存一份——所有同類(lèi)型算子在轉(zhuǎn)換時(shí)會(huì)被統(tǒng)一寫(xiě)成一個(gè)版本號(hào)。這里有個(gè)容易忽略的點(diǎn)builtin_code是枚舉值custom_code是字符串。內(nèi)置算子走枚舉自定義算子走字符串TFLite 運(yùn)行時(shí)查找這兩類(lèi)算子的方式完全不同后面我會(huì)針對(duì)這一點(diǎn)展開(kāi)。1.2 加載模型后每個(gè)節(jié)點(diǎn)都要“點(diǎn)名”當(dāng)你創(chuàng)建Interpreter時(shí)必須傳入一個(gè)OpResolvertflite::InterpreterBuilder(/* model */, resolver)(interpreter);這個(gè) resolver 就是整本“算子花名冊(cè)”。Interpreter 在初始化階段會(huì)遍歷每個(gè) subgraph 的每個(gè) operator拿著模型文件里的算子描述去 resolver 里“點(diǎn)名”——找對(duì)應(yīng)的內(nèi)核注冊(cè)信息。點(diǎn)名失敗整個(gè)模型加載就會(huì)失敗錯(cuò)誤信息形如Didnt find op for builtin opcode X version Y registration failed一個(gè)容易被忽視的細(xì)節(jié)是點(diǎn)名發(fā)生在Prepare階段之前。也就是說(shuō)即使某個(gè)算子參數(shù)完全合法、輸入輸出形狀也配得上只要 resolver 里沒(méi)有它的注冊(cè)項(xiàng)模型就跑不起來(lái)。注冊(cè)表決定了解釋器“認(rèn)識(shí)”哪些算子而不是“會(huì)算”哪些算子。1.3 TfLiteRegistration四個(gè)函數(shù)指針就是內(nèi)核的全部resolver 里查到的注冊(cè)信息類(lèi)型是TfLiteRegistration。結(jié)構(gòu)主體是四個(gè)函數(shù)指針typedef struct TfLiteRegistration { void* (*init)(TfLiteContext* context, const char* buffer, size_t length); void (*free)(TfLiteContext* context, void* buffer); TfLiteStatus (*prepare)(TfLiteContext* context, TfLiteNode* node); TfLiteStatus (*invoke)(TfLiteContext* context, TfLiteNode* node); int32_t builtin_code; const char* custom_name; int version; } TfLiteRegistration;用生活化的方式理解這四個(gè)函數(shù)init給這個(gè)算子實(shí)例分配私有狀態(tài)相當(dāng)于入職時(shí)領(lǐng)取工位和電腦。free銷(xiāo)毀狀態(tài)相當(dāng)于離職時(shí)歸還設(shè)備。prepare根據(jù)輸入張量形狀推導(dǎo)輸出張量形狀為真正的計(jì)算排好班。invoke執(zhí)行實(shí)際計(jì)算相當(dāng)于正式干活。以 ADD 為例prepare會(huì)讀取輸入張量的 shape給輸出張量也分配同樣的 shapeinvoke才真正逐元素相加。模型里一條builtin_code kTfLiteBuiltinAdd的算子運(yùn)行時(shí)對(duì)應(yīng)到這樣一份TfLiteRegistration四個(gè)函數(shù)指針指向 ADD 內(nèi)核的不同實(shí)現(xiàn)函數(shù)。所以在排查算子問(wèn)題時(shí)我習(xí)慣先問(wèn)一個(gè)問(wèn)題問(wèn)題出在“花名冊(cè)里沒(méi)這個(gè)人”還是“這個(gè)人能力不行 prepare 失敗”還是“干活時(shí)踩坑 invoke 出錯(cuò)”三類(lèi)問(wèn)題的報(bào)錯(cuò)位置和排查手段完全不同。搞清楚這一點(diǎn)比一頭扎進(jìn)源碼里翻找有效得多。2. 順著 FindOp 走一遍內(nèi)置算子的數(shù)組表、自定義算子的哈希表、版本匹配邏輯點(diǎn)名動(dòng)作的核心就是FindOp。它不是一個(gè)普通函數(shù)而是OpResolver基類(lèi)里定義的兩個(gè)虛接口分別應(yīng)對(duì)內(nèi)置算子和自定義算子class OpResolver { public: virtual ~OpResolver() {} virtual const TfLiteRegistration* FindOp(BuiltinOperator op, int version) const 0; virtual const TfLiteRegistration* FindOp(const char* custom_op, int version) const 0; };注意這里有個(gè)容易誤解的點(diǎn)FindOp的返回值是一個(gè)注冊(cè)結(jié)構(gòu)體的指針。解釋器拿這個(gè)指針去調(diào)用對(duì)應(yīng)的函數(shù)而不是自己復(fù)制一份代碼。這也意味著如果 resolver 在運(yùn)行期間生命周期提前結(jié)束指針懸空會(huì)導(dǎo)致崩潰。Android 的 JNI 封裝里如果沒(méi)有把 resolver 和 interpreter 綁定好經(jīng)常會(huì)出現(xiàn)這種“偶發(fā)段錯(cuò)誤”。2.1 內(nèi)置算子的查找路徑builtin_code 當(dāng)數(shù)組下標(biāo)BuiltinOpResolver是使用頻率最高的 resolver 實(shí)現(xiàn)它的內(nèi)部組織方式很簡(jiǎn)單粗暴——一張按BuiltinOperator枚舉值索引的靜態(tài)數(shù)組或者一組按枚舉值組織的注冊(cè)表。查找內(nèi)置算子時(shí)邏輯大致如下const TfLiteRegistration* BuiltinOpResolver::FindOp( BuiltinOperator op, int version) const { // 按枚舉值查表再校驗(yàn)版本 const TfLiteRegistration* registration LookupBuiltin(op); if (!registration) return nullptr; if (registration-version ! version) return nullptr; return registration; }也就是說(shuō)內(nèi)置算子查找的核心是兩個(gè)匹配條件builtin_code枚舉值相等version版本相等。這里分享一個(gè)實(shí)操經(jīng)驗(yàn)不同 TFLite 版本的BuiltinOperator枚舉值不是穩(wěn)定的。舊版運(yùn)行時(shí)拿到新版轉(zhuǎn)換器生成的模型很可能在枚舉值重排后指向了錯(cuò)誤的注冊(cè)項(xiàng)或者直接查不到。所以我從不在生產(chǎn)環(huán)境里做“TFLite 運(yùn)行時(shí)版本比模型轉(zhuǎn)換版本低一點(diǎn)點(diǎn)”這種將就——寧可升級(jí)依賴(lài)也不要賭枚舉值沒(méi)變。2.2 版本匹配為什么經(jīng)常被忽略O(shè)peratorCode里有version字段TfLiteRegistration里也有version字段。查找時(shí)解釋器會(huì)把模型文件里的版本號(hào)傳給FindOpresolver 內(nèi)部再做比對(duì)。同一個(gè)算子有多個(gè)版本通常意味著行為有細(xì)微差異。比如某些算子新版支持了廣播、或者補(bǔ)了精度問(wèn)題、或者換了更優(yōu)的計(jì)算策略。模型轉(zhuǎn)換器會(huì)根據(jù)模型的實(shí)際使用方式選擇一個(gè)版本號(hào)寫(xiě)進(jìn)文件而運(yùn)行時(shí)的注冊(cè)項(xiàng)也有自己的版本號(hào)。兩者對(duì)不上就報(bào)Didnt find op for builtin opcode MUL version 3這里的 “version 3” 指的是模型里期望的算子版本。報(bào)錯(cuò)含義是resolver 里能找到kTfLiteBuiltinMul的注冊(cè)項(xiàng)但找不到version 3的那個(gè)。一個(gè)常被踩的坑是高版本 convert 出來(lái)的模型拿到低版本 TFLite 上運(yùn)行。新版框架可能因?yàn)橹С至诵滤阕诱Z(yǔ)義就把某個(gè)算子的默認(rèn)版本號(hào)抬高了舊運(yùn)行時(shí)沒(méi)注冊(cè)這個(gè)版本直接拒絕加載。排查這類(lèi)問(wèn)題最直接的辦法查一下當(dāng)前 TFLite 版本對(duì)應(yīng)的算子版本映射表或者干脆把tflite依賴(lài)升級(jí)到和模型轉(zhuǎn)換環(huán)境一致的版本。2.3 自定義算子為什么走字符串匹配自定義算子在模型文件里沒(méi)有枚舉值可用只能靠custom_code字符串標(biāo)識(shí)。FindOp(const char* custom_op, int version)的查找路徑本質(zhì)就是一次unordered_map的字符串查找auto it custom_ops_.find(std::string(custom_op)); if (it custom_ops_.end()) return nullptr; if (it-second.version ! version) return nullptr; return it-second;和內(nèi)置算子最大的區(qū)別在于字符串是精確匹配大小寫(xiě)敏感猶豫一點(diǎn)都不行。轉(zhuǎn)換腳本里寫(xiě)的名字是MyCustomOp注冊(cè)時(shí)寫(xiě)的mycustomop結(jié)果就是找不到。很多人問(wèn)為什么自定義算子的報(bào)錯(cuò)信息里沒(méi)有給出版本不匹配的提示而是直接說(shuō) “Didnt find custom op”。因?yàn)閡nordered_map只按字符串找字符串都沒(méi)命中版本號(hào)自然沒(méi)機(jī)會(huì)參與比較。所以排查自定義算子問(wèn)題時(shí)第一件事永遠(yuǎn)是確認(rèn)模型里的字符串和注冊(cè)時(shí)的字符串一字不差。另外注冊(cè)自定義算子用的接口通常是resolver.AddCustom(MyCustomOp, custom_registration, 1);第三個(gè)參數(shù)就是版本號(hào)。如果你后續(xù)改了自定義算子的實(shí)現(xiàn)并提升了版本號(hào)舊模型兼容性會(huì)立刻下降轉(zhuǎn)換新模型時(shí)也要注意保持寫(xiě)進(jìn)模型的版本和注冊(cè)版本一致。3. OpResolver 這套抽象的實(shí)際價(jià)值裁剪、替換和動(dòng)態(tài)注冊(cè)看到這里你可能會(huì)問(wèn)為什么 TFLite 不直接把所有算子都內(nèi)置到解釋器里非要繞一圈通過(guò) resolver 去找答案藏在一個(gè)現(xiàn)實(shí)需求里TFLite 的目標(biāo)環(huán)境太碎了。從手機(jī)到單片機(jī)從幾百兆內(nèi)存到幾百 KB 內(nèi)存的 MCU全量算子對(duì)服務(wù)端框架沒(méi)問(wèn)題對(duì)端側(cè)嵌入式環(huán)境就是災(zāi)難。注冊(cè)機(jī)制的價(jià)值在于把“解釋器核心”和“算子實(shí)現(xiàn)”解耦讓上層按需攜帶、按需替換。3.1 BuiltinOpResolver 和 MutableOpResolver 的差別BuiltinOpResolver就是前面說(shuō)的“全量花名冊(cè)”所有 TFLite 內(nèi)置算子都注冊(cè)在里面。好處是省心壞處是二進(jìn)制體積大——如果你只需要 MINIMAL 推理背上全套算子顯然吃虧。MutableOpResolver是運(yùn)行時(shí)可變的 resolver支持AddBuiltin和AddCustom動(dòng)態(tài)增加注冊(cè)項(xiàng)。兩者對(duì)比如下項(xiàng)目BuiltinOpResolverMutableOpResolver注冊(cè)范圍編譯期間全量?jī)?nèi)置算子運(yùn)行期按需添加自定義算子需要繼承后 override 或配合使用直接 AddCustom二進(jìn)制體積較大只包含實(shí)際注冊(cè)的內(nèi)核適合場(chǎng)景原型驗(yàn)證、通用部署裁剪包體、插件化架構(gòu)實(shí)際項(xiàng)目里我更多是組合使用先用BuiltinOpResolver兜底再額外AddCustom自己寫(xiě)的算子。但如果是做嚴(yán)格裁剪的固件就會(huì)自己繼承OpResolver只暴露模型里真正出現(xiàn)的那幾個(gè)算子。3.2 裁剪二進(jìn)制體積的實(shí)際姿勢(shì)假設(shè)你的模型只有 ADD、CONV_2D、RELU那完全可以寫(xiě)一個(gè)精簡(jiǎn) resolverclass LiteResolver : public tflite::OpResolver { public: LiteResolver() { AddBuiltin(tflite::BuiltinOperator_ADD, tflite::ops::builtin::Register_ADD()); AddBuiltin(tflite::BuiltinOperator_CONV_2D, tflite::ops::builtin::Register_CONV_2D()); AddBuiltin(tflite::BuiltinOperator_RELU, tflite::ops::builtin::Register_RELU()); } const TfLiteRegistration* FindOp(BuiltinOperator op, int version) const override { return GetBuiltinRegistration(op, version); } const TfLiteRegistration* FindOp(const char* custom_op, int version) const override { return GetCustomRegistration(custom_op, version); } };這個(gè)思路再加一層編譯選項(xiàng)配合內(nèi)核源碼只編譯需要的目標(biāo)文件能明顯壓縮體積。關(guān)鍵是你要先知道模型里到底用了哪些算子——?jiǎng)e靠猜直接寫(xiě)個(gè)小腳本遍歷model.operator_codes打印出來(lái)就行。3.3 和 FlexDelegate 的配合算子在 TFLite 和 TensorFlow 之間銜接還有一種情況模型里混了 TensorFlow 算子和 TFLite 算子。TFLite 轉(zhuǎn)換器遇到不支持的標(biāo)準(zhǔn) TF 算子時(shí)如果打開(kāi)了allow_custom_ops或經(jīng)過(guò)一定配置可能會(huì)把它保留成自定義算子名字通常帶Flex前綴。這些 Flex 算子不會(huì)被BuiltinOpResolver找到需要專(zhuān)門(mén)的FlexDelegate來(lái)接管。這個(gè) delegate 本質(zhì)上還是一個(gè)通過(guò)自定義算子名注冊(cè)的機(jī)制——解釋器先通過(guò) custom op 的字符串把它標(biāo)記出來(lái)再由 delegate 在運(yùn)行時(shí)調(diào)用對(duì)應(yīng)的 TensorFlow Lite Flex 內(nèi)核。所以嚴(yán)格來(lái)說(shuō)一個(gè)模型里可以有三種算子來(lái)源純內(nèi)置算子、純自定義算子、由 delegate 支持的算子。理解FindOp只能解決前兩種遇到第三種時(shí)要看 delegate 的接管路徑這正是下一節(jié)的重點(diǎn)。4. Delegate 接管執(zhí)行計(jì)劃的完整邏輯ModifyGraphWithDelegate 到節(jié)點(diǎn)替換Delegate是 TFLite 里被誤解最多的機(jī)制之一。很多人以為 delegate 是“繞過(guò) FindOp 直接走硬件”這個(gè)說(shuō)法不準(zhǔn)確。準(zhǔn)確的理解是delegate 在 FindOp 之后把已經(jīng)解析好的節(jié)點(diǎn)子圖從執(zhí)行計(jì)劃里摘出來(lái)交給另一個(gè)內(nèi)核執(zhí)行。4.1 從 ModifyGraphWithDelegate 開(kāi)始的調(diào)用鏈常規(guī)接入 delegate 的代碼長(zhǎng)這樣TfLiteDelegate* delegate CreateMyDelegate(); interpreter-ModifyGraphWithDelegate(delegate);ModifyGraphWithDelegate內(nèi)部會(huì)按順序做幾件事遍歷當(dāng)前執(zhí)行計(jì)劃里的所有節(jié)點(diǎn)。調(diào)用 delegate 的Prepare回調(diào)。Prepare內(nèi)部決定要接管哪些節(jié)點(diǎn)并調(diào)用核心替換函數(shù)。TFLite 把被接管節(jié)點(diǎn)重構(gòu)成一個(gè)或多個(gè) delegate kernel 節(jié)點(diǎn)。后續(xù)執(zhí)行時(shí)遇到 delegate kernel 節(jié)點(diǎn)就調(diào)用 delegate 內(nèi)核的invoke。這里的“執(zhí)行計(jì)劃”可不是模型文件里的算子順序。TFLite 在內(nèi)部會(huì)做張量生命周期優(yōu)化、內(nèi)存復(fù)用、節(jié)點(diǎn)重排GetExecutionPlan拿到的節(jié)點(diǎn)順序可能和模型里的 operator 順序不一致。寫(xiě)過(guò) delegate 的人多半都踩過(guò)這個(gè)坑你按模型里的 operator 順序去對(duì)接管節(jié)點(diǎn)結(jié)果發(fā)現(xiàn)執(zhí)行計(jì)劃里的節(jié)點(diǎn)編號(hào)完全對(duì)不上。4.2 TfLiteDelegate 和 Prepare 回調(diào)delegate 本身是一個(gè)結(jié)構(gòu)體關(guān)鍵字段和函數(shù)指針如下略去平臺(tái)相關(guān)字段typedef struct TfLiteDelegate { void* data_; TfLiteStatus (*Prepare)(TfLiteContext* context, TfLiteDelegate* delegate); // ... buffer handle 相關(guān)函數(shù)指針 } TfLiteDelegate;Prepare是整個(gè) delegate 的靈魂。TFLite 執(zhí)行ModifyGraphWithDelegate時(shí)會(huì)回調(diào)它而它要做兩件事決定接管哪些節(jié)點(diǎn)、調(diào)用替換函數(shù)把節(jié)點(diǎn)子圖換掉。TfLiteContext提供了兩個(gè)關(guān)鍵接口用于遍歷節(jié)點(diǎn)TF_LITE_ENSURE_STATUS(context-GetExecutionPlan(context, execution_plan)); TF_LITE_ENSURE_STATUS(context-GetNodeAndRegistration( context, node_index, node, registration));拿到node和registration之后registration-builtin_code或registration-custom_name就是判斷是否該接管的依據(jù)。比如想接管 ADD就判斷registration-builtin_code kTfLiteBuiltinAdd。4.3 ReplaceNodeSubsetsWithDelegateKernels 是真正的開(kāi)關(guān)判定完節(jié)點(diǎn)后最核心的一步是調(diào)用context-ReplaceNodeSubsetsWithDelegateKernels( context, delegate_kernel_registration, nodes_to_replace, delegate);nodes_to_replace是一個(gè)整數(shù)數(shù)組元素是執(zhí)行計(jì)劃里的節(jié)點(diǎn)下標(biāo)。這個(gè)函數(shù)做的事情可以理解為T(mén)FLite 拿著這份名單把節(jié)點(diǎn)集合重新組合成一個(gè)或多個(gè)連通的子圖然后每個(gè)子圖變成一個(gè)“delegate kernel”節(jié)點(diǎn)插入執(zhí)行計(jì)劃。被替換之后原算子的TfLiteRegistration不會(huì)被銷(xiāo)毀它的 inputs、outputs、原始注冊(cè)信息仍然保留在模型運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu)里。但它的invoke不會(huì)在 CPU 內(nèi)核路徑上被調(diào)用了——執(zhí)行計(jì)劃已經(jīng)指向 delegate kernel 的注冊(cè)信息后續(xù)跑的是你傳入的delegate_kernel_registration.invoke。這里有個(gè)容易誤會(huì)的點(diǎn)delegate kernel 的invoke不是逐算子調(diào)用的而是按子圖調(diào)用的。如果你接管的子圖里有 10 個(gè)算子你的invoke會(huì)被調(diào)用一次內(nèi)部需要負(fù)責(zé)把這 10 個(gè)算子的計(jì)算統(tǒng)一調(diào)度到硬件后端。這也是為什么 delegate 能跨算子做融合優(yōu)化——它看到了整塊子圖可以做算子融合、緩沖區(qū)復(fù)用而不只是把單個(gè)算子搬到別的硬件上執(zhí)行。4.4 真實(shí)項(xiàng)目里 delegate 的常規(guī)用法最常見(jiàn)的三個(gè) delegate正好代表了三種不同的接入方式Delegate覆蓋范圍典型用法NNAPIAndroid 上的 CPU/GPU/DSP/NPUtflite::StatefulNnapiDelegate delegate(options);GPU delegateiOS/Android 上浮點(diǎn)模型整圖加速TfLiteGpuDelegateV2Create(options);XNNPACK浮點(diǎn)算子的 CPU 優(yōu)化通過(guò) interpreter options 自動(dòng)啟用以 NNAPI 為例簡(jiǎn)單接入是這樣#include tensorflow/lite/delegates/nnapi/nnapi_delegate.h tflite::StatefulNnapiDelegate::Options options; tflite::StatefulNnapiDelegate delegate tflite::StatefulNnapiDelegate(options); interpreter-ModifyGraphWithDelegate(delegate);而從 TFLite 2.x 之后的版本開(kāi)始XNNPACK delegate 往往在創(chuàng)建 interpreter 時(shí)通過(guò)experimental_op_resolver_type或默認(rèn)設(shè)置就參與進(jìn)來(lái)了甚至不需要手動(dòng)創(chuàng)建 delegate 對(duì)象。這些成熟 delegate 能加速跑通底層依賴(lài)的就是 4.2 和 4.3 說(shuō)的這套機(jī)制。理解透替換鏈路后你會(huì)明白兩個(gè)關(guān)鍵結(jié)論FindOp 不決定 delegate 能否接管某個(gè)算子。delegate 判斷的依據(jù)是TfLiteRegistration.builtin_code/custom_name即使 CPU 內(nèi)核根本不存在delegate 也能在 Prepare 階段把它接管走前提是你的 delegate 后端真的能執(zhí)行它。找得到的算子不一定走 CPU找不到的算子也不一定會(huì)加載失敗。這和“resolver 里有沒(méi)有注冊(cè)”是兩套獨(dú)立邏輯只是在實(shí)際執(zhí)行計(jì)劃里交織在一起。4.5 delegate Prepare 失敗后的策略如果 delegate 在Prepare階段遇到不支持的節(jié)點(diǎn)組合策略TFLite 的處理方式取決于 delegate 自己。有的 delegate 會(huì)在內(nèi)部做回退把部分節(jié)點(diǎn)留在 CPU 執(zhí)行有的干脆整體失敗讓解釋器進(jìn)入錯(cuò)誤狀態(tài)。實(shí)際項(xiàng)目中我見(jiàn)過(guò)最典型的場(chǎng)景模型里混了 float 和 quantized 算子GPU delegate 只支持其中一部分如果設(shè)置成嚴(yán)格模式strictPrepare 階段直接失敗設(shè)置成寬松模式就能部分接管剩下回落到 CPU。這也是為什么“接入了 delegate 但速度沒(méi)提升”不一定是你代碼寫(xiě)錯(cuò)可能只是你允許了 delegate 部分接管。這個(gè)判斷點(diǎn)很重要在動(dòng)代碼之前先確認(rèn) delegate 的 options 配置。5. 手寫(xiě)一個(gè)最小 custom delegate把 ADD 算子從 CPU 內(nèi)核手里接過(guò)來(lái)理論鋪墊夠了現(xiàn)在做一個(gè)能跑的最小 demo寫(xiě)一個(gè)只接管 ADD 算子的 custom delegate。這個(gè) demo 的執(zhí)行邏輯其實(shí)就是用 C 代碼逐元素相加本質(zhì)上和 CPU 內(nèi)置內(nèi)核做的事一樣價(jià)值在于讓你完整看到“節(jié)點(diǎn)匹配、子圖替換、后端調(diào)度”三段流程長(zhǎng)什么樣。5.1 定義 delegate 和 Prepare 回調(diào)// demo_delegate.h #ifndef DEMO_DELEGATE_H_ #define DEMO_DELEGATE_H_ #include tensorflow/lite/c/c_api.h #include tensorflow/lite/c/common.h namespace demo { bool IsAddNode(const TfLiteNode* node, const TfLiteRegistration* registration) { return registration-builtin_code kTfLiteBuiltinAdd; } TfLiteStatus DemoDelegatePrepare(TfLiteContext* context, TfLiteDelegate* delegate) { TfLiteIntArray* execution_plan nullptr; TF_LITE_ENSURE_STATUS(context-GetExecutionPlan(context, execution_plan)); TfLiteIntArray* nodes_to_replace TfLiteIntArrayCreate(execution_plan-size); int num_selected 0; for (int i 0; i execution_plan-size; i) { int node_index execution_plan-data[i]; TfLiteNode* node nullptr; TfLiteRegistration* registration nullptr; TF_LITE_ENSURE_STATUS(context-GetNodeAndRegistration( context, node_index, node, registration)); if (IsAddNode(node, registration)) { nodes_to_replace-data[num_selected] node_index; } } if (num_selected 0) { TfLiteIntArrayFree(nodes_to_replace); return kTfLiteOk; } TfLiteIntArray* selected_nodes TfLiteIntArrayCreate(num_selected); for (int i 0; i num_selected; i) { selected_nodes-data[i] nodes_to_replace-data[i]; } TfLiteIntArrayFree(nodes_to_replace); TfLiteRegistration delegate_kernel_registration {0}; delegate_kernel_registration.init DemoDelegateKernelInit; delegate_kernel_registration.free DemoDelegateKernelFree; delegate_kernel_registration.prepare DemoDelegateKernelPrepare; delegate_kernel_registration.invoke DemoDelegateKernelInvoke; TF_LITE_ENSURE_STATUS(context-ReplaceNodeSubsetsWithDelegateKernels( context, delegate_kernel_registration, selected_nodes, delegate)); TfLiteIntArrayFree(selected_nodes); return kTfLiteOk; } } // namespace demo #endif // DEMO_DELEGATE_H_注意這里冒出了一個(gè)實(shí)踐細(xì)節(jié)nodes_to_replace一開(kāi)始按execution_plan-size分配但實(shí)際選出來(lái)的節(jié)點(diǎn)數(shù)量可能遠(yuǎn)小于它。真正傳給ReplaceNodeSubsetsWithDelegateKernels的數(shù)組必須精確保留“連續(xù)的前 num_selected 個(gè)元素”所以我復(fù)制了一個(gè)緊湊數(shù)組。直接傳原數(shù)組會(huì)讓 TFLite 誤以為尾部那些 0 值也是有效節(jié)點(diǎn)下標(biāo)輕則接管數(shù)量不對(duì)重則在節(jié)點(diǎn)索引校驗(yàn)時(shí)直接崩掉。這個(gè)坑在成熟 delegate 源碼里一般不會(huì)顯眼地寫(xiě)出來(lái)因?yàn)楣俜綄?shí)現(xiàn)的寫(xiě)法往往更簡(jiǎn)潔但新手照著精簡(jiǎn)代碼抄非常容易踩。5.2 DemoDelegateKernel 的三件套被替換后的 delegate kernel 也逃不開(kāi) init / free / prepare / invoke 四個(gè)函數(shù)。我的 demo 里 init 只用來(lái)創(chuàng)建一塊私有狀態(tài)void* DemoDelegateKernelInit(TfLiteContext* context, const char* buffer, size_t length) { return new int(0); // 實(shí)際上不需要狀態(tài)只是演示 } void DemoDelegateKernelFree(TfLiteContext* context, void* buffer) { delete static_castint*(buffer); } TfLiteStatus DemoDelegateKernelPrepare(TfLiteContext* context, TfLiteNode* node) { return kTfLiteOk; } TfLiteStatus DemoDelegateKernelInvoke(TfLiteContext* context, TfLiteNode* node) { const TfLiteTensor* input context-GetTensor(context, node-inputs-data[0]); const TfLiteTensor* input2 context-GetTensor(context, node-inputs-data[1]); TfLiteTensor* output context-GetTensor(context, node-outputs-data[0]); const float* a static_castconst float*(input-data.data); const float* b static_castconst float*(input2-data.data); float* out static_castfloat*(output-data.data); int num_elements 1; for (int i 0; i output-dims-size; i) { num_elements * output-dims-data[i]; } for (int i 0; i num_elements; i) { out[i] a[i] b[i]; } return kTfLiteOk; }嚴(yán)格來(lái)說(shuō)prepare在這里什么都不做是不對(duì)的——正規(guī)實(shí)現(xiàn)應(yīng)該根據(jù)輸入推導(dǎo)輸出 shape但 ADD 的內(nèi)核行為已經(jīng)保證輸入輸出 shape 一致所以 demo 里偷懶可以跑真實(shí)項(xiàng)目中至少要做 shape 一致性校驗(yàn)。要提醒的是node-inputs-data[0]和node-inputs-data[1]是張量索引要用context-GetTensor(context, index)拿到實(shí)際的TfLiteTensor指針。有些 kernel 實(shí)現(xiàn)里會(huì)用context-GetMutableTensor等變體取決于你是否要寫(xiě)數(shù)據(jù)。不要直接在node上解引用張量結(jié)構(gòu)那只是索引數(shù)組。5.3 接入 Interpreter 并驗(yàn)證delegate 定義好之后接入方式非常直接TfLiteDelegate my_delegate {0}; my_delegate.data_ nullptr; my_delegate.Prepare demo::DemoDelegatePrepare; // 創(chuàng)建一個(gè)帶 ADD 的模型然后 tflite::InterpreterBuilder(model, resolver)(interpreter); interpreter-ModifyGraphWithDelegate(my_delegate); interpreter-Invoke();驗(yàn)證是否接管成功最實(shí)用的手段是看執(zhí)行計(jì)劃。你可以在DemoDelegatePrepare里打印num_selected或者在DemoDelegateKernelInvoke里打日志。如果 Invoke 時(shí)打印了你的日志說(shuō)明這條鏈路是真的通了—— delegate kernel 進(jìn)入了執(zhí)行計(jì)劃并且被執(zhí)行器調(diào)度到了。有一點(diǎn)必須說(shuō)清楚工業(yè)級(jí) delegate 的 invoke 絕不會(huì)像我這個(gè) demo 一樣逐個(gè)元素算。真實(shí)接力場(chǎng)景里delegate 的 Prepare 已經(jīng)在本后端申請(qǐng)好內(nèi)存、建立好設(shè)備句柄invoke 階段直接把這些節(jié)點(diǎn)打包成一次硬件提交比如一次性把整塊 tensor 數(shù)據(jù)拷到 GPU再提交一個(gè) command buffer。這個(gè) demo 的價(jià)值在于鏈路演示直接拿去生產(chǎn)環(huán)境一定會(huì)遇到性能反噬因?yàn)閱嗡阕忧袚Q帶來(lái)的設(shè)備調(diào)度開(kāi)銷(xiāo)遠(yuǎn)超一個(gè) ADD 本身的計(jì)算開(kāi)銷(xiāo)。5.4 這個(gè) demo 里最容易栽的三個(gè)坑沒(méi)設(shè)置delegate.data_或者Prepare函數(shù)指針沒(méi)填對(duì)調(diào)用ModifyGraphWithDelegate時(shí)可能直接段錯(cuò)誤。這些字段是 POD 結(jié)構(gòu)體里的函數(shù)指針漏一個(gè)就是調(diào)用空函數(shù)nullptr排查起來(lái)很隱蔽。匹配節(jié)點(diǎn)時(shí)用了模型 operator 序號(hào)而不是執(zhí)行計(jì)劃節(jié)點(diǎn)序號(hào)。請(qǐng)務(wù)必從context-GetExecutionPlan遍歷不要自己去模型文件里數(shù) operators。注冊(cè)了 delegate 但沒(méi)有一個(gè)節(jié)點(diǎn)被接管時(shí)ReplaceNodeSubsetsWithDelegateKernels傳空數(shù)組。這個(gè) demo 里我做了num_selected 0的保護(hù)真實(shí)項(xiàng)目里也要處理這種情況。否則有的 TFLite 版本里會(huì)觸發(fā)斷言。我自己第一次寫(xiě)的時(shí)候在第二個(gè)坑上耗了一個(gè)晚上。原因是模型文件里 ADD 是第 3 個(gè)算子執(zhí)行計(jì)劃里它排在第 17 位中間插入了若干張量記憶化優(yōu)化帶來(lái)的重排。后來(lái)我老老實(shí)實(shí)打了節(jié)點(diǎn)下標(biāo)映射關(guān)系才發(fā)現(xiàn)自己一直在按錯(cuò)誤編號(hào)匹配。6. 從報(bào)錯(cuò)信息倒推排查注冊(cè)鏈路的斷點(diǎn)在哪個(gè)環(huán)節(jié)最后分享一套排錯(cuò)思路。每次遇到算子相關(guān)的問(wèn)題我習(xí)慣先從報(bào)錯(cuò)信息判斷斷點(diǎn)位置再往下挖。畢竟 TFLite 的報(bào)錯(cuò)文本通常已經(jīng)很明確地告訴了你該看哪里。6.1 “Didnt find op” 類(lèi)報(bào)錯(cuò)的排查清單報(bào)錯(cuò)內(nèi)容排查方向驗(yàn)證手段Didnt find op for builtin opcode X version Ybuiltin_code 枚舉值不匹配或版本不匹配檢查 TFLite 運(yùn)行時(shí)版本確認(rèn) converter 版本與運(yùn)行時(shí)一致Didnt find op for custom op Foo自定義算子字符串不匹配dump 模型 operator_codes逐字節(jié)對(duì)比注冊(cè)名Custom op Foo is not supported模型轉(zhuǎn)換時(shí)未保留該算子轉(zhuǎn)換時(shí)打開(kāi) allow_custom_ops如果確實(shí)需要保留Node number N failed to prepareFindOp 已成功但 prepare 階段出錯(cuò)查看該算子內(nèi)核實(shí)現(xiàn)的 prepare 邏輯遇到 BuiltinOperator 相關(guān)報(bào)錯(cuò)時(shí)我建議先在本地寫(xiě)個(gè)三行腳本打印模型operator_codes的builtin_code和version枚舉值再對(duì)照builtin_op_resolver源碼里注冊(cè)的版本范圍。這一步能排除掉 80% 的“版本不匹配”問(wèn)題。6.2 一個(gè)真實(shí)場(chǎng)景同一份模型在不同設(shè)備上的奇偶問(wèn)題之前有位同學(xué)在項(xiàng)目里遇到的現(xiàn)象是同一個(gè) SSD MobileNet 模型在開(kāi)發(fā)板 A 上跑得好好的換到板子 B 上就報(bào)Didnt find op for builtin opcode VERSION something兩個(gè)板子跑的是同一個(gè)二進(jìn)制版本唯一區(qū)別是板子 B 的系統(tǒng)庫(kù)里意外帶了一個(gè)更舊版本的libtensorflowlite.so于是動(dòng)態(tài)鏈接時(shí)加載到了舊實(shí)現(xiàn)。這類(lèi)問(wèn)題用文本日志排查很容易被忽略因?yàn)闆](méi)有編譯錯(cuò)誤——鏈接時(shí)符號(hào)存在只是行為不一致。解決方式無(wú)非兩點(diǎn)不用動(dòng)態(tài)庫(kù)版本管理依賴(lài)或者把模型轉(zhuǎn)換與運(yùn)行時(shí)版本做成 CI 校驗(yàn)。6.3 delegate 一個(gè)算子都沒(méi)接管的排查順序如果你已經(jīng)接入了 delegate但推理速度沒(méi)有變化需要排查下面幾步確認(rèn) delegate 的 Prepare 真的被調(diào)用了。在 Prepare 函數(shù)頭尾打日志確認(rèn)不是你的代碼里根本沒(méi)創(chuàng)建 delegate 對(duì)象或用錯(cuò)實(shí)例。確認(rèn) target 節(jié)點(diǎn)真的存在。打印執(zhí)行計(jì)劃里的節(jié)點(diǎn)數(shù)、每個(gè)節(jié)點(diǎn)的 builtin_code 列表和你的匹配條件逐一比對(duì)。特別檢查 quantized 算子很多 delegate 只接管 float 算子模型是 quantized 時(shí)自然一個(gè)都不中。確認(rèn) ReplaceNodeSubsetsWithDelegateKernels 的返回狀態(tài)。如果返回kTfLiteError后續(xù)就不會(huì)有 delegate kernel 節(jié)點(diǎn)。確認(rèn) delegate kernel 的 invoke 真的被調(diào)了。在最外層 invoke 打日志如果沒(méi)日志說(shuō)明執(zhí)行計(jì)劃里根本不存在你的 delegate kernel。確認(rèn)沒(méi)有其他 delegate 搶先接管了同一批節(jié)點(diǎn)。多個(gè) delegate 疊加時(shí)先執(zhí)行的 delegate 可能已經(jīng)把 ADD 節(jié)點(diǎn)替換掉了后注冊(cè)的 delegate 自然匹配不到。這套順序看起來(lái)簡(jiǎn)單但執(zhí)行的時(shí)候一定要借助日志而不是靠“我感覺(jué)”。TFLite 編譯時(shí)如果開(kāi)了 verbose log會(huì)在ModifyGraphWithDelegate階段打印節(jié)點(diǎn)替換的詳細(xì)信息沒(méi)開(kāi)日志時(shí)自己在 Prepare 和 kernel 函數(shù)里埋 printf 是最快的。另一個(gè)有價(jià)值的經(jīng)驗(yàn)是delegate 接管率高不等于端到端延遲一定更低。如果被接管節(jié)點(diǎn)夾在大量 CPU 節(jié)點(diǎn)之間tensor 數(shù)據(jù)反復(fù)在 CPU 和硬件后端之間拷貝開(kāi)銷(xiāo)可能抵消掉加速收益。所以做 delegate 優(yōu)化時(shí)我會(huì)把執(zhí)行計(jì)劃畫(huà)出來(lái)重點(diǎn)看能形成多大塊的連續(xù)子圖而不是追求接管的節(jié)點(diǎn)數(shù)量。這也是為什么前面強(qiáng)調(diào)ReplaceNodeSubsetsWithDelegateKernels是按子圖接管——它給了 delegate 做整塊調(diào)度的機(jī)會(huì)而這個(gè)機(jī)會(huì)需要你在 Prepare 里主動(dòng)用好。最后說(shuō)一句我自己的感受。注冊(cè)機(jī)制看懂了之后TFLite 的很多“玄學(xué)”問(wèn)題會(huì)變得特別直白模型文件里的算子描述是一回事解釋器里的內(nèi)核注冊(cè)是另一回事delegate 又是在執(zhí)行計(jì)劃層面的第三回事。三層之間通過(guò)FindOp和ReplaceNodeSubsetsWithDelegateKernels這兩個(gè)關(guān)鍵點(diǎn)串聯(lián)起來(lái)。以后再遇到“明明注冊(cè)了為什么沒(méi)生效”“delegate 接了為什么沒(méi)加速”這類(lèi)問(wèn)題順著報(bào)錯(cuò)信息回到這一層層的鏈路里去定位多半就會(huì)豁然開(kāi)朗。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
肥臀熟女福利视频一区二区| av国产无码| 热久久国产精品视频大陆精品| 亚洲双插| 青青草日本中文字幕| 97神马久久| 操婢日韩| 日本特黄f c2| 18禁久久| 色狠狠 - 百度| 日韩激情视频| 温婉少妇玩3p| 欧美性夜| 欧美中文字幕日韩在线| 日韩免费大片一级播放| 俺也射| 亚洲中文国际强奸字幕 | 久久大香蕉手机高清| 久久美女国产| 国产1024在线播放| 欧美性xxxxx狂欢| 久久久内射良家| 国产精品一二三| 久艹伊人精品综合在线| 正在播放:深夜激情大战,自带黑丝袜全力输出骚穴 | 内射日韩大臀美女| 久久久久9999妇女| 伊人色综合超碰| 色婷婷99| 一区二区三区机械有限公司| 蜜乳av首页| 无码人妻一区二区三区色欲aⅴ| 2020中文字幕在线| 中日韩久久久免费看| 中国91AV| 久操视频在线| 久久久久密臀视频| 天美传媒AV国产在线| 天美传媒一二三区永久网站| 天天做天天爽| 麻豆天美电影一区二区| 色爱综合网| 人妻久久久| 午夜久久无码1000合集| 国产女人和拘做爰视频| 大香网站| 中文字幕精品丝袜| 日韩精品人妻| 欧美操逼视频二区| 精品丝袜无码一区二区三APP| 欧美激情内射| 屁股久久久久久久久久| 十八禁视频一区二区| 日韩啊V| 岛国免费视频在线| 精品人妻av在线播放| 久久日韩精品一区二区| 欧美日韩精品一区二区三区高清| 亚洲一卡2卡3卡4卡乱码网站| 操操逼操操逼操操逼逼| 国产免费久久久久| 亚洲va综合va国产va中文| 五月综合激情| 日韩丝袜人妻AV| 一区 欧美 日韩 麻豆| 91美女在线看| 97在线观看免费| 97操B| 国产精品ww久久| 新婚人妻扶着粗大强行坐下| 久操网线| 日本91白丝| 欧美一二在线| 91一区二匹| 91视频精品| 色呦呦呦在线观看视频| 五月丁香六月激情综合| 成人日韩中文字幕| 亚洲天天精品| 欧美熟妇精品黑人巨大91| 亚洲色图欧美一区二区不卡| 久久91精品国产9丨久久分亭| 在线精品福利免费播放| 天天综合色电影| 操亚州| 欧美日韩系列| 天天日天天搞天天干| 福利伊人玖玖国产| 无码久| 夜夜性| 日韩欧美大片免费高清啪啪| 91黑人无码激情在线| 欧美|91色综合| 欧美国产有色电影| 亚洲国产丝袜熟女av| 国产一级特黄大片处女| 日韩久久三区| 欧美丝袜中文字幕07在线| 成全动漫视频观看免费下载| 亚洲精品久久久久久久蜜桃臀| 精品国产污一区二区三区| 97天天插| 岛国在线免费视频| 亚洲免费97免费| 99无码| JULIA一区二区三区在线播放| 欧美成人亚洲精品| 亚洲欧美情色| 69视频福利导航| 黑人性欧美| 国产激情在线观看| 肉丝中文无码高清| 波多野结衣先锋影音| 久久9久9久99久9久9| 国产精品大屁股999| 亚洲97精品| 国语av最新自产拍在线观看| 久久水蜜臀亚洲AV无码精品| 国产精品操| 天堂种子在线www网资源| 操老熟女AV| 中文字幕 国产 精品| 日韩不卡网操逼中文字幕日韩| 精品一级| 很很干很很操| 欧美色就是色| 96精品在线| 蜜臀久久99精品久久久久久| 黑操B| 超碰97男女| 黄色片大香蕉| 大香蕉2017| 日本一本道A级黄色毛片试看60分钟| 国产精品网站免费| 美女午夜福利免费视频| 青青草原成人| 95人妻爽爽人人做人人澡| 美女上床网站| 精品国产乱码久久久久A| 亚洲脚交| 五月天色色色| 日韩成人无码| 91综合国产精品| 欧美另类精品xxxx| 久久久久久裸体| 久久亚州精品成人Av无| 97亚洲自在精品在线观看| 大香蕉乱伦视频网| 少妇精品久久| 超碰98综合网| 久久一二三四五六七八九区区区| 久久久久久99AV无码免费网站| 久久久不能久久久久| 亚洲 欧美 日韩 国产一区二区| 人人妻人人操人人乐| 欧美偷拍区| 国产狂喷潮在线精品| 熟女在线视频| 青草精品视频-日本久久久久网站| 熟女性视频| 欧美精品精品一区二区| 亚洲欧美日韩中文久久自慰| 色婷婷基地| 丝袜美腿亚洲| 日韩精品9区| 逼逼逼逼操操操操操操操操操午夜剧场 | 亚洲欧美综合区自拍另类| 天天插天天操天天摸天天射天天看| 日韩国产成人自拍视频| 超碰97综合在线| 欧美久久婷| 婷婷午夜成人色中色| 校园春色美腿丝袜 | 无码78| 欧美老妇综合网| 免费av大片| 男人亚洲天堂| 青青草一本道福利视频| 性爱AV天堂| 亚洲1区| 99久国产精品午夜性色福利| 智利AV在线网| 亚洲三级网址久久最新| 翔田千里av一区二区三区| 日本人妻伦在线中文字幕| 大香蕉手机在线| 久久精品免视看国产成人﹣蜜臀av一区. 久久精品免视看国产成人,蜜臀av一区 | 2025亚洲男人天堂| 久久久 国产精品| 精品日韩人妻视频| 日日不卡av| 99精品高潮| 97干色天堂| 日韩精品99999| 日韩一区二区三区四区五区 | www.激情| 爱射综合| 久久 国产精品 一区| 盗摄女人妻在线| 亚洲小电影免费涩涩成人在线高清| 国产又黄又爽| 色吧91| 久久青娱乐| 精品国产综合久久福利,热99这里有精品综合久久,99热这里只有免费国产精品,精 | 天天日天天舔东京热| 在线日韩视频| 亚洲少妇色| 欧洲色| 久久精品美女一区| 91九色首页| 亚洲经典啪啪| 97爱免费插| 超碰人人乐97| 色 婷97| 色呦呦、国产精品| 磁力99AV| 欧美久久人体| 玖玖综合网| 91色拍| 欧美片第一页| 波多野结衣被操50分钟免费视频| 亚洲日韩美国人妻| 超碰人人超在线观看| 激情五月天丁香社区| 91久久久久久| 亚洲 中文 女同| 91色综合激情| 九九热午夜欧亚国产视频| 久久亚州大香蕉| 日本精品一区二区不卡| 久操网视频| 欧美十八禁网站| 免费人成?大片在线播放| 亚洲AV资源| 校园春色欧美色图| 一级毛片久久久久久久女人18| 欧美亚洲另类在线蜜桃| 成人精品无码| 手机在线A片| 欧美三级中文字幕hd| 五月香婷婷| 日本一区二区三区精品| 熟女一区二区三区四区| 亚洲欧美另类图片| 免费一级a毛片久久久久久鸭绿欲| 国产小黄片在线免费观看| 激情五月天社区| 九九热免费国产视频婷婷伊人| AND人妻系列| 99国内熟女露脸视频| 中文字幕乱妇免费视频| 特级特黄一级毛片免费| 超碰成人免费| 久色99999| 色淫网站优优视频| 伊人黄色视频免费观看| 伊人久久亚洲中文字幕| 麻豆天天躁天天揉揉AV| 激情 欧美 亚洲 小说| 亚洲图片欧美在线视频| 91美女在线视频| 欧美日韩中文字幕不卡| 亚洲国产婷婷在线播放| 欧美日韩夜夜| 啊啊啊骚| 肉嘟嘟www视频在线观看高清| 超AV色女| 欧美夜夜草视频| 妺妺跟我一起洗澡没忍住| 69综合网| 91色图| 色色色999| 97超碰精品成| 欧美成人四级在线播放| 亚洲图片欧美日韩| av亚欧| 亚洲欧洲日本精品中文a∨| 人人妻人人操人人乐| 五月丁香激情综合| 亚洲高清无码在线桃色| 欧美性生活男人的天堂| 大香蕉免费中文| 人妻超碰青青草98| 1禁看欧美黄片免费看| 97国伦国色| 日本媚薬中文字幕在线| 欧美色视频在线| 精品无码久久久| 色五月av| 久久一二三四五六七八九区区区| 欧美性性性| 女人高潮大叫一级毛片| 中文字幕第95页| 午夜福利精品| 国产超碰欧美| www.久久99| 综合亚州欧美| 操我啊啊啊啊啊| 国产精品ww久久| 亚洲精品久久久久久久蜜桃臀| 人人妻人人玩人人澡人人爽| 情趣丝袜无码操逼视频| 中文字幕视频在线观看一区二区| 国产传媒一区二区三区| 久久天天性久久伊人| 美欧色综合| 日本人体九九九九九九| A级片一区| 综合国产97| 成人自拍三级在线观看| 黄色不卡视频| 午夜理论片在线观看免费| 香蕉av一区二区三区| 91成人精品在线播放| 伊人在线大香蕉视频久久| 日韩国产成人自拍视频| 中国91AV| av东京热男人的天堂| 亚洲 国产 精品一区| 国产av色网| 欧美精品99久久久| 操逼片国产| 欧洲黄色网| AV中文字幕剧情1区2区3| 操逼网站地址| 欧美A片中文字幕| 91AV天堂| 亚洲日本韩国极品一区二区| 精品亚洲国产成人精品| 97亚洲中文| 天天视频网站黄| 久久神马影院| 欧美日韩国产中文超碰| 男女性感激情网站| 成人性交免费视频| 国产精品在线网站| 五月天婷婷成人网| 久欲AV| 亚洲国产丝袜熟女av| www五月| 涩涩这里只有精品视频| 我想要 啊 啊 啊| 99热导航| 91女在线观看| 色婷视频| 色网在线视频观看免费| 精品国产乱码| 9118禁| 亚洲男人天堂视频| 亚洲不卡不卡中文字幕不卡 | 13小男生GAY自慰脱裤子| 校园春色综合香蕉| 久久中文色图| 综合网,亚洲,欧美| 六九九九| 99久久婷婷| 狼狼色丁香久久婷婷综合五月| 伊人九九| 夜夜做夜夜爽精品视频| 久久久久久裸体| 亚欧美天堂在线| 精品久久久亚洲AV成人网站| 国产成人精品亚洲日本| 成年女人黄网站| 摸奶性爱视频网站在线免费播放| 91网站18禁| 激情四射婷婷六月天| 大吊色| 欧美青青草视频| 中文字日本乱码| 色av中文字| 色色操| 97色五月天完| 成人激情无码在线视频| 国产精品丝袜久久亚洲不卡| 日日夜夜青青草母狗| 亚洲天堂另类美腿| 中文字暮97| 亚洲激情网| 牛黄色久午久| 91站街按摩店老熟女熟女| 国产av又色又爽又黄| 欧美亚洲第一页| 性久久久| 手机在线A片| 欧美性生活免费网| av在线一区二区三区| 国产性久久久| 1769一区二区| 色五月首页| 七久久久| 国产污视频麻豆传媒一区二区| 亚洲官网在线| 性性久久| 国产精品白虎| 96精品久久久久中文字幕| 高清不卡视频| 欧美另类色图片| 爽爽淫人网| 欧美一级三级| 后入人妻一区| 久久视频少妇美女| 97超碰超欧美。| 精品一二三区四视频| 97色在线观看| 欧美激色| 亚洲av资源| 亚欧成人一级片在线播放| 国产性爱强奸乱伦大全| 日韩熟女操逼| 亚洲成a人在线观看久| 亚洲日韩美女中文字幕乱| 亚洲精品日日夜夜52| 爽 好舒服 无码刺激久久| 簧片免费看视频| 1024人妻熟女一区二区三区| 麻豆人妻精品一区二区| 久久111| 精品无码久久久久| 蜜臀99久| 极品欧美一区二区三区| 中文字幕免费看大片| 九九av| 久久曰曰| 亚洲丝袜二区在线| a片 xxxx受爽视频| 乱伦av.com| 美女人妻色网站| 狠狠躁天天躁日日躁97| 日韩一级二级三级在线不卡观看完整| 大香樵伊人网| 青青草字幕AV| 伊人网免费视频| 人人射人人操人人摸| 国产精品色色| 国产风韵犹存熟妇三区| 另类天堂| 国产女人91精品嗷嗷嗷嗷| 91N五十路| 国产精品对白自产拍| 丁香色狠狠色综合久久小说| 国产呦精品一区二区三区下载| 四虎永久在线精品免费网址| 曰韩少妇无码| 被男人吃奶很爽的毛片| 色av中文字| 日日爽熟女| 黄色AAAAAAAAAAA大片| 伊人久久青青草| 中文一区二区三区影院| 久久久草草精品| 国产福利电影| 91青视频| 欧美日韩狠狠爱| 大香蕉免费乱伦视频| 欧美美女啪啪视频| 午夜男人的天堂| 99久久精品国产高潮| 久久综合女优| 亚洲成a人v欧美综合天堂下载| 国产精品网站www| 伊人少妇久久久| 国产熟女完整版中字| 97网址www| 九九九成人| 青娱乐国产精品| 操操操操网黑人| 色五月av| 天天影视色香色欲| 97se亚洲综合自| 国内毛片无码一级毛片| 久久久精品九| 亚洲第一无码播放立川理惠| yazhouzaixian| 亚州免费啪啪视频| 日韩精品第3页| 在线免费观看日韩一区| 97色色国产视频| 中文字幕国产在线天堂| 超碰人妻在线| 女人天堂av在线播放| 又黄又爽在线观看视频| 另类欧美色| 色色色网站| 亚洲熟女人妻中文字幕一区二区| 欧美很很操视频| 伊人欧美大香蕉视频| 二色av| 鸥美中出| 丁香五月婷婷基地| 无遮挡又黄又刺激的视频| 丝袜夫妻自拍| 亚洲一区二区三区AV无码| 欧美乱欲| 另类视频在线| 亚洲蜜乳av| 综合网欧| 国产欧美岛国精品一区| 久久精品无码不卡| 日日操丁香五月天| 久热伊人| av大香蕉网站| 黄页网站免费高清在线观看| 超碰97 线线 在现| 国产午夜福利视频在线| 国产成人亚洲精品无码古代早漏男| 人妻激情在线视频| 丁香六月啪啪| 日韩熟女操逼| 欧美色图欧美| 97超碰天天爱天天爱| 欧美精品xxxwww| 亚洲天堂加勒比| 中文字幕乱码人妻一区二区三区,99精品| 亚洲色图尤物视频| 久久精品无码一区二区三区| 97精品国产精品免费观看| 日韩欧美~中文字| 超碰地址久久| 黑人精品久久97| 亚洲欧美经典一区二区| 欧美日韩国产一区二区小黄片大全| 丝袜亚洲91| 五月婷在线| 国模无码人体一区二区三| 国产亚热在线久久| 九九亚洲| 国产精品成久久久久午夜午夜| 操死我了啊啊啊| www.狠狠| 全球成人中文在线| 中字幕人妻一区二区三区| 亚洲图片小说欧洲| 日韩啪啪啪视频| 国产精品一区二区 尿失禁| 97色综合中文网| 午夜毛片高清免费不卡| 一区二区偷拍拍视频| aⅴ日韩成人电影av在线免费看av大全| 国产精品播放| 熟妇高潮二区三区| 999九九精品| 黑丝少妇麻豆| 国产刺激视频| 色综合99| 久热9| 激情网色| 黄片com.| 欧美日韩性爱电影在线| 久久久久亚洲Av无码专区老牛影视| 东京热毛片调教| 国产欧美成人精品| 情色五月天久久久| 亚洲欧洲日产国产综合网| 久久天天摸| 国产无马av| 91久久婷婷| 久久AV无码网址| 天天摸夜夜操视频| 九九热免费在线国产视频伊人五月| 成人a大片在线观看| 日本123区操B视频| 99亚亚热| av影片在线观看不卡| 色月天AV导航| 国产福利影视| 青娱乐国产精品| 麻花传媒免费网站在线观看| 国产成年女人免费视频播放a| 久9re热视频这里只有精品| 成人线上超碰| 日本国产亚洲一区在线观看| 超碰国产精品无码| 天天舔九色婷婷| 无码免费精品高清| 99欧美| 99精品热| 欧洲Au麻豆| 97欧美色| 免费男人的天堂| 欧美热图99| 青青草依人大香蕉| 久久六六| 很黄很色的视频在线观看| 性在久久久久久| 亚洲天堂7777| 色五月综合| 欧美少妇一区二区三区| 久久午夜伦| 69综合网| 人妻美腿丝袜日韩| 懂色Av| 人人干黄色| AV不卡在线| 欧美在线视频99| 岛国AV一区二区电影| 亚洲欧美日韩电影网站一区 | 国产AV高清AV无码| 日韩精品99999| 97色涩| 91日产桃蜜| 免费国产电影一区二区| 综合操逼| 97超碰国产亚洲精品资源| 日本不卡二三区| 干美女人妻| 97超碰人妻| 欧美激情中文字幕另类小说| 日韩欧美视频青青| 亚洲AV乱码专区国产噜噜亚洲| 人妻内射一区二区在线视频| 91亚洲欧美激情| 激情国产乱伦Av| 亚 欧 美 综合| 日韩精品怡红院| 激情色图| 大香蕉丝袜一级片| 麻豆天美制片厂网站视频| 成年在线视频日本亚洲在线视频区精品江靖宇公司 | 福利风月五月天影院| 日本孕妇孕交| 亚洲欧美在线观看无码| 亚 欧 美 综合| 欧美丝袜91| 日韩人妻播放| 日韩无码服务区| 五月婷婷hd| 麻豆尤物视频网| 中文字幕亚洲永久精品| 67914在线精品观看| 久热精品在线| 亚洲砖码砖专无区2023| 另类av天堂| 亚洲天堂男人天堂网| 色丁香久久| 小骚逼被操的爽不爽| 天天性射网| 日本性爱少妇| 亚码人妻| 亚洲欧美中文一区二区三| 用力操死我| 搡老女人老熟女91| 精品免费1| 亚洲图片欧美色| 亚洲夜夜欢无码一区二区| 影音先锋乱伦资源| 亚洲欧美国产va在线播放频| 久久久精品国产亚洲伊人| 中文熟女五十乱码在线| 日韩黄色一区二区三区| 久久久久久久久国产| 国产毛片在线| 九九九九免费高| www.久久最新地址| nuu12国产麻豆精品| 黄片com.| 亚洲综合情色| 欧美精品自慰系列寂寞少妇 | 亚洲色图综合| 亚洲一区亚洲天堂| 91free福利| 日产成人久久| 国产久久一区二区三区野外在线| 亚洲日韩电影| 嗯嗯啊啊操死我| 日韩偷拍一区二区三区 | 怡春院久久| 婷婷五月天影院| 丝袜美腿亚洲| 中文字幕亚洲欧美在线不卡| 日韩免费av片高清无码| 99久久9| 大色综合网| 伊人网高清| 99re6国产精品99re在线| 久草午夜| 人人搡人人肉久久精品| 搡老女人老妇女AAA一VU麻豆| 欧美色图小说综合| 加勒比大香蕉视频在线| 精品国产乱码久久| 超碰午夜| 五月大香蕉| 亚洲天堂久久久久久粉红视频| 国产无遮挡| 岛国激情视频软件| www亚洲欧美| 伊人国产av| 99热这里只有精品地址| 亚洲美女精品九九视频| 91新在线欧美| 色婷网| 日韩性爱啪啪视频| 欧洲站一级二级三级h| 一区二区日韩欧美久久| 色综合V| 超碰色大香蕉| 超碰在线人妻不卡| 亚洲无码色| 明星性猛交ⅹxxx乱大交| 久久99草| 亭亭丁香激情| 牛牛aV| 免费无码婬片AAAA片直播色戒| 亚洲美女黄色| 美女露胸露屁股| 婷婷深爱五月| 91大神精品长腿在线观看网站| 亚洲亚洲亚洲天堂天堂| 一区二区三区 丝袜 高跟 美腿| 一区不卡在线观看av| www国产精品| 亚欧洲一区二区视频| 人妻天天爽夜夜爽精品2| 婷婷视频在线免费观看| 婷婷10月天青娱乐| 国产精品九九| 啪啪视频免费在线观看| 国产怡红院在线| 亚洲色吧网| 国产精品久久久久久高清无码免费看| 亚洲大色堂| 男人的天堂啪啪啪啪啪蜜桃不卡| 在线啊v一区| 久久久久久九九九九-美女久久久久久久-成人AV | 亚洲国产成人7777| 精品人妻一区二区三区不卡断 | 26uuu最新| 男同专区一区二区三区在线| 亚洲有码第一页| 96免费视频在线| 欧美.亚洲.另类.丝袜.制服.诱惑| 成人乱人伦一区二区| 午夜啪| 啊啊啊网站| 97超碰香蕉| 97人人夜| 亚洲美女 晚间男人天堂 | 亚洲综合999| 久久精品熟妇丰满人妻99| 国产熟女自拍| 国产十八禁视频| 欧美一二在线| 久久精品国产99国产精品亚洲| 中文字幕丝袜人妻| 日本午夜福利视频| 另类亚洲图色| 91色黑人少妇| 91色图片| 久久久穴999| 性欧美天天| 操死我了嗯嗯嗯| 久久夜夜夜夜| 久湿久久 | 中文日本免费高清| 夜夜嗨绯色| 91亚洲不卡一区| 超碰97在线 欧美 国产| 人妻无一区二区三区| 久久久久久人| 日韩熟女精一区二区三区不卡| 香蕉精品二区二区| 久久人妻| 丝袜人妻av一区二区| av一区二区三区四区| 男人高清无码一区二区| 欧美人妻久久精品二区三区| 色伊人91| 大香蕉免费乱伦视频| 三男一女不戴套的A片| 乱伦一区二区三区‘| 欧美日本国产日韩激情视频| 日本精品不卡一二三区| 国产日韩精品一区二区三区| 国产精品一区人妻精品阁在线| 欧美经典一区二区三区| 操逼视频免费日韩无码| 大地资源在线观看中文第二页| 久久综合九九| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 99国产女人| 国产激情视频一区区三区| 激情抓乳插进去啪啪啪日韩 | 国产毛片久久久久久久| 久久久精品无码亚免费| 精品久久久无码| 日韩激情视频| suv精产一二三区| 91视频精品| 91丨九色丨国产丨人妻在线 | 亚洲色图久久精品蜜| 男人 天堂 日 亚洲| 天堂av最新电影网| 熟女精品va中文字幕| 五月天精品| 亚洲欧美日产国产91毛片| 加勒比无码毛片| 日韩综合成人免费视频| 黄片不用下载在线观看| 欧美国产视频| 人妻少妇精品久久久久久| 国产精品爆乳懂色蜜乳| 成人三级片无码| 91精品人妻一区二区-全集完整版免费正片国语-B02AV | 激情四射熟女丝袜| yiqicaoav| 国产馆极品诱惑| 免费视频a级毛片免费视频| 亚洲AV无码| 精品美女少妇一区二区| 久久久九九网站| 91网站18禁| 国产女人视频三四五区| 狠狠操官网| 天天日B狠狠操| 亚洲在钱| 免费一级a毛片久久久久久鸭绿欲| 啊视频在线| 五月开心久久AV官网| 探花视频免费观看国产专区| 亚洲女毛多水多21P| 亚洲天堂另类小说男人| 色九久| 手机在线看片免费人成视频| 欧美少妇性乱| yw尤物av无码点击进入麻豆| 国产日韩欧美亚洲精品95 | 99热超碰| 99色热| 变态乱伦伪娘灌肠一区二区| 日日干日日操五月天伦理视频| 91精品人妻一品二品三品| 天堂69亚洲精品中文字| 亚洲色鬼| 久久人人爽av亚洲精品天堂桃色| 亚洲免费成人在线高清无码视频| 黄色乱论网站| 高清国产精品福利网站| 日韩啪啪啪啪啪| 97超碰护士| 亚州精品一区二区三区香中文字幕在线| 福利天天都操| 天天精品| 久久蜜桃一区二区| 伊人久久大香大香线蕉中文 | 成人五级久久| 91夜夜蜜桃臀1区2区3区| 狠狠操,使劲操| 99色视频| 91狠狠| 久久免费中文字幕在线观看| 午夜精品久久一区二区| 手机av天堂久久久久| 探花视频免费观看国产专区| 久久香蕉国产传媒一区剧情天美| 97超碰色| 亚洲中文字幕有码视频一区二区三区| 亚洲欧洲av影音| 曰本精品久久久| 精品偷拍13p欧美dodk视频| www.男人天堂| 国产亚州日韩欧美看片| 天天摸天天操视频| 久视频在线观看| 大香蕉乱级| 久久偷偷色综合蜜桃| 国产伦乱91| 色汉综合| 91制服丝袜| 久久人妻丝袜一区二区三| 丁香七月婷婷| 最新9久久久9免费视频| 99精品成人免费看| 十八禁啪啪视频| 九九九久久久久| 国产成人久久久精品免费AV| 欧美性高潮| 国产又大又粗又色生活片亚洲国产精品成人久久久综合免费 | 色综合五月天| 国产精品午夜福利亚洲综合网| 国产成人天堂| 国产日韩欧美三级片| TS人妖另类精品视频系列| 青青青青草av在线观看| 岛国精品视频在线观看| 中文字幕欧美丝袜07资源| 素颜老阿姨乱情色| 婷婷在线精品| 伊人一区二区在线播放| 免费亚洲国产精品久久一区| 日韩AV片| 激情网色| 人人操人人摸人人骑| 东京热熟女亚洲视频网站| 六月丁香婷| 波多野结衣AV无码一区| 香港久久久| 伊人久久久日韩一区| 视频二区美腿丝袜制服人妻欧美| 操操操日本的逼| 热热色中文无码| 尤物视频偷拍免费| 曰韩欧美国产传媒麻豆第一区| 人人操人人叉人人插人人| 国内毛片欧美香蕉精品| 久久久555| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师 | 九九久久首页| 欧美精品99久久久| 北约熟女超碰| a片久久久久久久久久久久 | 国产乱码久久久久久| 91色综| 亚洲第一综合| 少妇高潮对白在线观看| 岛国福利在线精品播放| 91丝袜| 亚欧美综合| 情色五月天久久久| 四虎永久在线精品免费网址 | 蜜臀久久99精品久久久久电影| www.超碰| AV免费在线播放一区| 成人午夜高潮av猛片| 欧美97av| 91日日夜夜| 伊人国产视频| 天美一二三在线观看Av| 五月天丁香| 五月婷婷六月色| 搡老熟女老女人老熟妇免费视频| 久久久99免费| 亚洲伊人久久综合97| 亚洲少妇在线观看| 蜜臀久久99精品久久久久久酒店 | 天美av在线观看| 国产 大胆 对白| 欧美一区二区在线资源| 欧美视频在线第3页| 天天干少妇| 久久99久久99久久99人受| 国产福利精品最新在线 | 嗯啊视频免费在线观看| 亚洲欧洲自拍图片专区满春格| 无码78| 诱惑网综合| 亚洲日本天堂| 国产又长又大又粗的视频| 97青娱乐超碰久久| 国产性爱欧美性爱在线| 在线情色电影 91大| 成人久久精品| 伊人天堂在线| 亚洲另类综合欧美| 欧美一区二区在线资源| 欧美亚洲第1页| 密臀视频一区二区三区| 欧美aⅴ99久久黑人专区| 欧美激情色婷婷花野真衣一区二区| 精品久久久久黄少妇| 久久一二三四不卡| 亚洲欧洲精品成人| 九草在线大香蕉| 一区二区播放| 中文字幕av片| 亚洲黑人在线| 自拍偷拍 日韩欧美| 欧美综合娱乐久久| 一级久久久久久久久久久| 色狠狠综合| 精品国产乱码久久久久久久久1| 精品无码一区二区| 欧美精品 - 91爱爱| 日韩综合色网| 四虎影视永久在线观看精品免费网站| 亚洲少妇视频| 免费观看性欧美一级| 少妇xx精品| 色色99| 亚洲综合另类欧美久久久| 九九国产热| 婷婷20月天青娱乐| 亚洲熟伦熟妇AV无码春色| 人人看人人爰人人操| 久久人人爽人人爽人人片Ⅴ| www.狠狠| 成人在线午夜视频一区| 裸体美女久久久| 久久东京热久久| 男女性感激情网站| 狠狠狠狠狠| av72网| 精品人妻一区二区三区四区| 日韩簧片免费看| 亚卅熟女乱色| 日韩精品人妻中文字幕久久久| 九九九九一级| 日韩精品在线放| 欧美成va视频网站| 夜夜夜夜夜夜夜夜夜狠狠狠狠狠狠狠| 91亚洲欧美综合高清在线| 玖玖久久久| 欧美亚洲日本视频久久久| 日本三级中国三级99人妇网站| 夜夜人妻爽| 91 丝袜在线播放| 亚洲偷拍自拍在线视频| 亚洲av热热色| 天天舔日美女视频| 加勒比久久综合网高清| 97色冈| 91老司机精品| 91在线视频免费播放| 亚洲aw毛茸茸在线| 欧美啪啪色吧在线| 天天做日日做天天欢。| 99九九久久| 日韩猛交| 久久大香蕉| 色亚州人久干视频在线观看免费版| 日韩熟女无码| 日本精品成人无码| 天天综合网AV91| 日本熟女不卡视频| 大香蕉免费中文| 久9爱精品| 天天干夜夜一操| 一区二区视频你懂的| 午夜福利无毒不卡| 小草三级久久观看| 极品肉射| 天啪| 日本黄 R色 成 人网站| 久操在97| 日韩欧美aⅴ综合网站发布| 蜜桃中文字日产乱幕4区| 另类视频在线| 骚日日av| 国内自拍 日韩激情 99| 蜜桃臀一区二区aV| 欧美黑人精品在线播放| 国产乱弄免费在线视频。| 99无码狠狠久久| 国产综合久久久鬼色| 天天草夜夜草高潮片| 婷婷激情一区二区三区俺也去| 亚洲双插| 国产馆极品诱惑| 丰满美女一级毛片在线播放| 色九九九综合| www.夜夜操| 国产精品com| 日韩视频小说在线观看| 婷婷中文网| 免费岛国一级片| 亚洲中文字幕av | 极品销魂美女一区二区| 啊灬啊灬啊灬啊灬高潮奶出了免费视 | 密臀在线视频| 日韩AV色图| 国产天天骚| 天无日色综合| 中文高清一区二区的| 精品国产一区二区三区av在线资源| 无遮挡h肉动漫在线观看| 被男人添B超爽视频| 中文人妻av高清一区| 日韩欧美大片免费高清啪啪| 美女诱惑久久| 色图综合网| a片久久久久久久久久久久 | 91老司机在线| 人妻第一页| 亚洲资源站| 黄片qw| 99久久婷婷丁香| 亞洲久久直播| 熟女日韩| 久久中文色图| 日韩二区三四区五区六区在线看| 欧美少妇熟女| 人人潮人人摸| 在线观看十八禁| 无码精品一区二区三区潘金莲| 男女激情黄色网址| 久久狠狠色噜噜狠狠狠狠97| 日本天堂在线播放| 久欲AV| 亚洲视频中文一区| 999狠狠综合| 亚洲学生妹高清av| 一区二区三区四区免费视频| 殴美色网| 欧美色图私拍91| 伊人五月天| 国产乱伦性爱区| 天美传媒精品久久视频| 日本九九久久99播| 日韩精品黄片免费观看| 亚洲在饯| av久日| 日本一级真人黄色性爱视频| 亚洲天堂男人天堂网| 91丝袜美女视频| 日韩在线国产字幕| 国产黄色视频久久| 久久久亚洲Av| 欧美的性爱网站免费| 欧美熟女操屄| 国产欧美美女免费观看视频| 久久熟女人| 国产免费久久精品99re韩国| 加勒比性爱成人在线| 好涩综合| 国产一区二区三区白丝| 国产美女mm131爽爽爽爽| 国内精品久久久久影院亚洲| 一级特黄aaa大片在线观看成人一级片在线观看| 樱花蜜乳av| 99热国产| 亚洲限制级| 日韩一级欧美一级国产一级台湾| 亚洲A曰本VA欧美VA视频| 日本日皮视频逼| 欧美中文字幕一区| 中文字幕乱偷人妻久久艾草网| 丰满人妻-区二区三区免费看 | 国产一国产一级毛片古装| 在线免费观看日韩一区| 亚洲第一无码播放立川理惠| 69超碰综合| 操91| 亚洲国产日韩欧美熟妇在线| 秋霞Av理论一级在线| 欧美日韩久久精品爱爱| #NAME?| 色女网日韩| 亚洲色人妻综合| 日本中文字幕高跟| 中日韓欧美高清| 亚洲女毛多水多21P| 午夜福利久久久噜久噜久久综合| 一本大道久| 国产亚洲日韩在线三区黑人| 97色婷| 国产成人五月天丁香花| 激情干在线| 日本三级中国三级99人妇网站| 综合网亚洲1| 中文字幕aⅴ在线视频| 蜜臀久久精品久久久久视频| 秋霞网—男女啪啪亚洲免费体验区 | 啪啪自拍九九综合| 五月综合激情网| 97中文综合| 综合久欧洲| 岛国黄| 一区二区乱码福利| 丝袜高跟澳门91视频| 午夜天天碰综合视频|