人妻精品在线观看一区二区三区,蜜臀av精品一区二区三区网站,中文一区二区三区亚洲欧美,熟女人妇精品一区二区,人妻av在线观看视频,欧美日韩国产三级精品网站,黄色免费网站直接进入,超碰公开福利正在播放,国产毛片乡下农村妇女毛片

TorchDynamo初探:Python ByteCode的動態(tài)修改-天天觀察

來源:CSDN博客 | 2023-01-04 11:56:00 |

作者|strint

1背景

深度學(xué)習(xí)框架編譯優(yōu)化時,需要先根據(jù)計算邏輯形成一個邏輯計算圖,然后再改寫計算圖,最后執(zhí)行改寫后的計算圖。其中生成邏輯計算圖方式有兩種。


【資料圖】

一種計算圖生成是基于 trace tensor 的,跟蹤 tensor 的執(zhí)行路徑。tensor 執(zhí)行時,基于函數(shù)重載,可以落到支持 tensor 計算的框架自定義函數(shù),該函數(shù)一般是 c++ 層的。c++ 層的自定義函數(shù)中,功能是用于生成一個 Operation 的符號表達。比如一個對于加法運算,trace 就是記錄一個符號化的加法算子。如此一連串的運算就被轉(zhuǎn)換了符號化的計算圖。

另外一種計算圖生成是基于 AST(抽象語法樹) 解析的。在代碼執(zhí)行前,直接根據(jù) Python 文本代碼得到 Python AST,然后根據(jù) AST 來翻譯成計算圖(也叫做中間代碼 IR)。

Python(特指 CPython)解釋器執(zhí)行,第一階段會先把 Python 源碼解析成 AST,第二階段根據(jù) AST 生成和優(yōu)化 ByteCode(字節(jié)碼),第三階段在虛擬機中執(zhí)行 ByteCode。

基于 AST 解析的計算圖生成,發(fā)生在這里的第一階段;基于 trace tensor 的計算圖生成,發(fā)生在第三階段之后。

TorchDynamo 特別的地方在于其工作在第二階段,動態(tài)修改 Python ByteCode,這樣第三階段執(zhí)行的已經(jīng)是修改后的 ByteCode了。

2

TorchDynamo 概述

TorchDynamo 是 PyTorch 新實驗的 JIT 編譯接口,支持使用 Python 在運行時修改動態(tài)執(zhí)行邏輯,修改的時機是 CPython 的 ByteCode 執(zhí)行前。這個思想類似?DynamoRIO(https://dynamorio.org)?項目,DynamoRIO 可以動態(tài)的修改 x86 機器碼。

CPython 的每次函數(shù)調(diào)用會生成一個 Frame(或者叫 Stack),F(xiàn)rame 中帶有的代碼部分就是 ByteCode。CPython 運行時支持基于現(xiàn)有的 Frame 去設(shè)置一個自定義的 Frame,然后后面執(zhí)行的就是自定義的 Frame。

TorchDynamo 的工作原理就是在運行時設(shè)置一個自定義的 Frame,該 Frame 中的 ByteCode 支持 CallBack 到 Python 層去修改。其提供的典型的修改接口是 FX Graph,也就是說 TorchDynamo 會分析 ByteCode,生成對應(yīng)的 FX Graph,然后提供 FX Graph 的接口供用戶自定義計算圖。這種做法有如下優(yōu)點:

可以支持所有的 Python 語法,因為如果在自定義 Frame 過程中的任何一點發(fā)現(xiàn)不支持,都可以選擇不修改 Frame 而回退到原 Frame;

開銷少,劫持發(fā)生在 Python 執(zhí)行比較早的階段(ByteCode 生成和優(yōu)化階段),而非 Python ByteCode 執(zhí)行后的階段,有時可以減少 Python ByteCode 的執(zhí)行開銷(猜測如果很多次 ByteCode 層面的函數(shù)調(diào)用被融合層成一次函數(shù)調(diào)用,的確可以縮減開銷);

可以做到不增加編譯帶來的延遲(之前的基于 tensor trace 或者 ast 解析的做法,一般都有先編譯執(zhí)行所以編譯開銷無法掩蓋,但是改寫 ByteCode 這個做法,猜測是可以在識別出熱點代碼后,單獨開一個線程去做編譯,而不影響主線程工作。Python ByteCode 改寫的 API 中有這種延遲編譯的樣例,peps.python.org/pep-052?)。

之前計算圖生成機制(基于 trace tensor、基于 AST 解析的)中的幾個問題,得到了緩解:

存在無法靜態(tài)化的操作,之前一般需要顯式的移除靜態(tài)化作用域,現(xiàn)在總是允許不做編譯,直接執(zhí)行原 Python 代碼,這樣使得靜態(tài)化標注變得簡單;

打開靜態(tài)圖編譯優(yōu)化,之前編譯時一般無法掩蓋,現(xiàn)在有辦法部分掩蓋;

動態(tài) shape 問題,因為有了編譯時和運行時的掩蓋,也可以得到緩解。

這種盡量優(yōu)化、動態(tài)優(yōu)化的設(shè)計,最大程度了照顧了代碼開發(fā)的體驗,讓編譯優(yōu)化上手變得更簡單了。這是 TorchDynamo 帶來的最主要的好處。這種做法非常符合 PyTorch 的 Python First、Eager First、User Experience First的偏好。但是這個設(shè)計對于尋求最好的性能、最方便的靜態(tài)化部署這兩個目標并沒有改善。

3

CPython 的標準執(zhí)行流程

上文提到了 CPython 的執(zhí)行從 Python 文本代碼,到 AST,到 ByteCode。這里用一個示例展開看一下。Python 的標準組件非常易用,可以在 Python 層用 ast 組件來查看 AST,可以用 compile 內(nèi)置函數(shù)來編譯 ByteCode,可以用 exec 系統(tǒng)函數(shù)來執(zhí)行 ByteCode。我們先在代碼開頭導(dǎo)入相關(guān)組件:

import?astimport disimport sys

然后我們構(gòu)造一個 python 代碼,可以看到 src_code 就是普通的字符串。其中包含了一段普通的 python 內(nèi)置的乘法,一段深度學(xué)習(xí)的 tensor scalar 加法,最后一段是當前Python Frame 中的 ByteCode 關(guān)聯(lián)對象的打?。ㄓ糜谝粋€檢驗,后面會提到)。

print("=== source code ===")src_code = """# normal python operationx = 1x = x * 2# tensor operationy = dl_framework.ones((1, 2))z = x + yprint(z)# print python framef = sys._getframe()# print the code objectprint(f.f_code)"""print(src_code)

然后使用 ast 組件來生成這段代碼的 AST。

print("===?source?code?to?ast?===")# 把源代碼解析成 ASTast_obj = ast.parse(src_code)# 打印 ASTprint(ast.dump(ast_obj))

可以得到 AST,這里展示的結(jié)果額外做了格式化,另外刪減掉了和計算邏輯無關(guān)的打印 frame 的部分,代碼和其 AST 的對應(yīng)關(guān)系參見注釋。AST解析是純文本層面的,`dl_framework` 還沒有被 import 進來,AST解析仍然可以正常工作。AST 基本是一個多叉樹的結(jié)構(gòu),每個節(jié)點對應(yīng)一個表達式,節(jié)點子節(jié)點代表子表達式。以 `x = x + 2` 為例,Assign 是一個節(jié)點,是賦值運算,被賦值的是 `x`,賦值的值是一個二元乘法運算。

Module(body=[ # x = 1 Assign(targets=[Name(id="x", ctx=Store())], value=Constant(value=1, kind=None), type_comment=None), # x = x * 2 Assign(targets=[Name(id="x", ctx=Store())], value=BinOp(left=Name(id="x", ctx=Load()), op=Mult(), right=Constant(value=2, kind=None)), type_comment=None), # y = dl_framework.ones((1, 2)) Assign(targets=[Name(id="y", ctx=Store())], # dl_framework.ones((1, 2)) value=Call(func=Attribute(value=Name(id="dl_framework", ctx=Load()), attr="ones", ctx=Load()), args=[Tuple(elts=[Constant(value=1, kind=None), Constant(value=2, kind=None)], ctx=Load())], keywords=[]), type_comment=None), # z = x + y Assign(targets=[Name(id="z", ctx=Store())], # x + y value=BinOp(left=Name(id="x", ctx=Load()), op=Add(), right=Name(id="y", ctx=Load())), type_comment=None), # print(z) Expr(value=Call(func=Name(id="print", ctx=Load()), args=[Name(id="z", ctx=Load())], keywords=[])), # 省略了打印 frame 的代碼],type_ignores=[])

Python AST 生成后,可以利用系統(tǒng)函數(shù) `compile` 把它轉(zhuǎn)成 ByteCode 字節(jié)碼。解釋器執(zhí)行也存在編譯的環(huán)節(jié),只不過是編譯成字節(jié)碼。

print("===?ast?to?bytecode?===")# 編譯成 ByteCodecode_obj = compile(ast_obj, filename="", mode="exec")print(code_obj)# 展示 ByteCode 的語法糖byte_obj = dis.Bytecode(code_obj)print(byte_obj.dis())

`print(code_obj)`的結(jié)果是 ` at 0x7ff79bb5c660, file "", line 3>`,這里可以看到生成的 code object 對象的指針是 `0x7ff79bb5c660`,后面我們在執(zhí)行字節(jié)碼時,會再次看到這個指針。

`print(byte_obj.dis())` 的結(jié)果如下,每一行對應(yīng)一條字節(jié)碼,也即一條指令, 通過字面含義基本可以看出是在做什么:

# x = 1 3 0 LOAD_CONST 0 (1) 2 STORE_NAME 0 (x) # x = x * 2 4 4 LOAD_NAME 0 (x) 6 LOAD_CONST 1 (2) 8 BINARY_MULTIPLY 10 STORE_NAME 0 (x) # y = dl_framework.ones((1, 2)) 7 12 LOAD_NAME 1 (dl_framework) 14 LOAD_METHOD 2 (ones) 16 LOAD_CONST 2 ((1, 2)) 18 CALL_METHOD 1 20 STORE_NAME 3 (y) # x = x + y 8 22 LOAD_NAME 0 (x) 24 LOAD_NAME 3 (y) 26 BINARY_ADD 28 STORE_NAME 4 (z) # print(z) 9 30 LOAD_NAME 5 (print) 32 LOAD_NAME 4 (z) 34 CALL_FUNCTION 1 36 POP_TOP # 省略了打印 frame 的代碼

得到 ByteCode 之后,就可以傳遞給 Python VM 執(zhí)行了。在真正執(zhí)行前,先做了一下 ByteCode 中指令的打印,實際 Python VM 執(zhí)行時,也基本是這樣遍歷每一行指令,然后執(zhí)行指令??梢韵胂?,如果這些指令被修改,就可以讓 Python VM 執(zhí)行自定義的指令了。

print("===?execute?bytecode?===")# print instructionfor instr in byte_obj: print(instr.opname, instr.opcode)# You can also do `import torch as dl_framework``import oneflow as dl_framework# execute bytecodeexec(code_obj)

字節(jié)碼的執(zhí)行結(jié)果如下。只需要在真正執(zhí)行前,把 `dl_framework`導(dǎo)入就好,然后可以看到 tensor 計算的結(jié)果,是符合預(yù)期的。

frame(或者叫 stack)是運行時的對象,對應(yīng)一個函數(shù)調(diào)用的棧,在執(zhí)行時被創(chuàng)建。frame 中要執(zhí)行的指令就是之前創(chuàng)建的 ByteCode。

在運行時之前,像我們之前看到的,存在一個編譯時進行 AST 和 ByteCode 的編譯,之前編譯時生成的 code object 對象的指針是 `0x7ff79bb5c660`。

在運行時,可以獲取當前的 frame,然后通過 `frame.f_code`拿到當前 frame 里面包含的 ByteCode(即 code object),可以發(fā)現(xiàn)它的指針就是之前編譯時生成的那個。

#?print(z)?的結(jié)果tensor([[3., 3.]], dtype=oneflow.float32)# 運行時獲取當前 frame ,然后打印 frame 中的 ByteCode 對象的結(jié)果# f = sys._getframe()# print(f.f_code) at 0x7f5cea7f1660, file "", line 3>

到此,窺見了一下 Python 源碼到 AST, AST 到 ByteCode,ByteCode 到 Frame 執(zhí)行這個默認的 Python 執(zhí)行流程。TorchDynamo 用下圖做了簡單的介紹:

其中 foo 對應(yīng)一個 Python 函數(shù),即上文介紹的 Python Source Code。PyCodeObject 是上文介紹的 code object (ByteCode)在 C 代碼層面對應(yīng)的類。PyFrameObject 是上文介紹的 Frame 在 C 代碼層面對應(yīng)的類,它包含了代碼段 PyCodeObject。_PyEval_EvalFrameDefault 對應(yīng)上文介紹的 exec,它執(zhí)行一個 Frame,即運行 Frame 帶有的 `PyCodeObject`。

現(xiàn)在我們看一下 CPython 在 C 層面的執(zhí)行 Frame 的實現(xiàn),對應(yīng)?_PyEval_EvalFrameDefault(https://github.com/python/cpython/blob/d48ecebad5ac78a1783e09b0d32c211d9754edf4/Python/ceval.c#L757)。它的主邏輯就是取 ByteCode 指令和執(zhí)行指令(https://github.com/python/cpython/blob/d48ecebad5ac78a1783e09b0d32c211d9754edf4/Python/ceval.c#L1080):

co?=?f->f_code;?//?從?PyFrameObject*?f?中取出?PyCodeObject*?,放到?co?中 names = co->co_names; consts = co->co_consts; fastlocals = f->f_localsplus; freevars = f->f_localsplus + co->co_nlocals; // 從 co 中取出第一條指令 first_instr = (_Py_CODEUNIT *) PyBytes_AS_STRING(co->co_code); next_instr = first_instr;#define NEXTOPARG() do { \ _Py_CODEUNIT word = *next_instr; \ opcode = _Py_OPCODE(word); \ oparg = _Py_OPARG(word); \ // 指向下一條指令 next_instr++; \ } while (0) // 循環(huán)執(zhí)行指令 for (;;) { // 從當前的指令 next_instr 中獲取 opcode NEXTOPARG(); switch (opcode) { // 執(zhí)行 op code,參見下個部分 } }

每個指令類型對應(yīng)一個 opcode,它是一個數(shù)值,執(zhí)行 opcode(https://github.com/python/cpython/blob/d48ecebad5ac78a1783e09b0d32c211d9754edf4/Python/ceval.c#L1266),這里的 opcode 可以清晰的看到和之前我們打印的 ByteCode 的類型對應(yīng)關(guān)系:

#define?TARGET(opcode)?\ case opcode: switch (opcode) { // TARGET 就是一個 case // load TARGET(LOAD_FAST) { PyObject *value = GETLOCAL(oparg); if (value == NULL) { format_exc_check_arg(PyExc_UnboundLocalError, UNBOUNDLOCAL_ERROR_MSG, PyTuple_GetItem(co->co_varnames, oparg)); goto error; } Py_INCREF(value); PUSH(value); FAST_DISPATCH(); } // store TARGET(STORE_FAST) { PyObject *value = POP(); SETLOCAL(oparg, value); FAST_DISPATCH(); } // 二元加法 TARGET(BINARY_ADD) { PyObject *right = POP(); PyObject *left = TOP(); PyObject *sum; if (PyUnicode_CheckExact(left) && PyUnicode_CheckExact(right)) { sum = unicode_concatenate(left, right, f, next_instr); /* unicode_concatenate consumed the ref to left */ } else { sum = PyNumber_Add(left, right); Py_DECREF(left); } Py_DECREF(right); SET_TOP(sum); if (sum == NULL) goto error; DISPATCH(); } // 函數(shù)調(diào)用 TARGET(CALL_FUNCTION) { PyObject **sp, *res; PCALL(PCALL_ALL); sp = stack_pointer; res = call_function(&sp, oparg, NULL); stack_pointer = sp; PUSH(res); if (res == NULL) { goto error; } DISPATCH(); }????}

以上總結(jié)了 Python的默認執(zhí)行流程。

4

TorchDynamo 的工作流程

TorchDynamo 在標準的 Python 執(zhí)行流程中做的主要改變就是支持修改 Frame 執(zhí)行前的 ByteCode。我們暫時不關(guān)注 AST 生成,看 Python 的執(zhí)行流程,是 Python Source Code -> ByteCode -> Evaluate. TorchDynamo 支持 Python Source Code -> ByteCode -> [ByteCode rewrite] -> Evaluate。

ByteCode rewrite 的工作方式是把一段 ByteCode 轉(zhuǎn)成 FX Graph,然后調(diào)用用戶自定義的 FX Graph 改寫執(zhí)行邏輯,生成一個可以經(jīng)過編譯的執(zhí)行函數(shù)。然后把該段 ByteCode 替換成函數(shù)調(diào)用 ByteCode,而調(diào)用的函數(shù)就是經(jīng)過編譯的執(zhí)行函數(shù)。從而實現(xiàn)編譯優(yōu)化的功能。

FX Graph 支持了在 Python 層做代碼改寫,提高了寫編譯 Pass 的便利性,這里不做深入,可以參考資料1(https://pytorch.org/docs/stable/fx.html)和2(https://zhuanlan.zhihu.com/p/416165157)。

ByteCode rewrite 發(fā)生在 ByteCode 執(zhí)行前。同樣的 Source Code,每次執(zhí)行都會走到這個步驟,都可以選擇是否進行 ByteCode rewrite,或者選擇進行什么樣的 rewrite,還可以支持 rewrite 結(jié)果的緩存和復(fù)用。這體現(xiàn)了 Dynamo 的動態(tài)性。

下面看一個 TorchDynamo 下 fn() 函數(shù)編譯的的例子:

#?一個普通的函數(shù)def fn(a, b): x = a + b x = x / 2.0 if x.sum() < 0: return x * -1.0 return x # torchdynamo 函數(shù)接口with torchdynamo.optimize(custom_compiler): fn(torch.randn(10), torch.randn(10))

fn() 函數(shù)對應(yīng)的原始的 python ByteCode,和代碼對應(yīng)的關(guān)系參見其中的注釋:

#?x?=?a?+?b 0 LOAD_FAST 0 (a) 2 LOAD_FAST 1 (b) 4 BINARY_ADD 6 STORE_FAST 2 (x) # x = x / 2.0 8 LOAD_FAST 2 (x) 10 LOAD_CONST 1 (2.0) 12 BINARY_TRUE_DIVIDE 14 STORE_FAST 2 (x) # if x.sum() < 0: 16 LOAD_FAST 2 (x) 18 LOAD_METHOD 0 (sum) 20 CALL_METHOD 0 22 LOAD_CONST 2 (0) 24 COMPARE_OP 0 (<) 26 POP_JUMP_IF_FALSE 36 # return x * -1.0 28 LOAD_FAST 2 (x) 30 LOAD_CONST 3 (-1.0) 32 BINARY_MULTIPLY 34 RETURN_VALUE # return x 36 LOAD_FAST 2 (x) 38 RETURN_VALUE

經(jīng)過 TorchDynamo 動態(tài)改寫后的 ByteCode:

#?x?=?a?+?b # x = x / 2.0 # x.sum() < 0 # 上面兩行被轉(zhuǎn)換成了 __compiled_fn_0 # __compiled_fn_0 會返回 x 和 x.sum() < 0 組成的 tuple 0 LOAD_GLOBAL 1 (__compiled_fn_0) 2 LOAD_FAST 0 (a) 4 LOAD_FAST 1 (b) 6 CALL_FUNCTION 2 8 UNPACK_SEQUENCE 2 10 STORE_FAST 2 (x) 12 POP_JUMP_IF_FALSE 22 # x * -1.0 被轉(zhuǎn)換成了 __compiled_fn_1 14 LOAD_GLOBAL 2 (__compiled_fn_1) 16 LOAD_FAST 2 (x) 18 CALL_FUNCTION 1 20 RETURN_VALUE # return x 22 LOAD_FAST 2 (x) 24 RETURN_VALUE

可以看到新增了兩個函數(shù)調(diào)用, `__compiled_fn_0`?和 `__compiled_fn_1`?,這兩個函數(shù)對應(yīng)的代碼邏輯參見 bytecode 中的注釋。這兩個函數(shù)對應(yīng)的 fx graph 如下:

__compiled_fn_0:opcode name target args kwargs------------- ------- --------------------------- ---------------- --------placeholder a_0 a_0 () {}placeholder b_1 b_1 () {}call_function add (a_0, b_1) {}call_function truediv (add, 2.0) {}call_method sum_1 sum (truediv,) {}call_function lt (sum_1, 0) {}output output output ((truediv, lt),) {}__compiled_fn_1:opcode name target args kwargs------------- ------ ----------------------- ----------- --------placeholder x_4 x_4 () {}call_function mul (x_4, -1.0) {}output output output (mul,) {}

在 ByteCode rewrite 的最后,TorchDynamo 為這一段代碼的輸入創(chuàng)建兩個 Guard:

局部參數(shù) a 必須是一個 Tensor

局部參數(shù) b 必須是一個 Tensor

該 fn 函數(shù)被再次調(diào)用時,如果符合這兩個條件,則可以命中緩存的 TrochDynamo 處理結(jié)果;否則下次 fn 執(zhí)行時,會觸發(fā)新的 ByteCode 分析和變換。

另外,對于和 tensor 無關(guān)的、比較特別的 python 代碼,其 ByteCode 會保持原狀。這樣就達到了不需要用戶標注區(qū)域、自動尋找優(yōu)化機會的設(shè)計目標。

現(xiàn)在看下 TorchDynamo 執(zhí)行的流程總結(jié):

可以看到它把原來的 PyFrameObject 替換成了 Patched PyFrameObject,這個是 CPython 支持的特性。這個 Patched PyFrameObject 中最主要的改動就是 Frame 中的 ByteCode (即 PyCodeObject)被修改了,原來的 PyCodeObject 變成了 Transformed PyCodeObject。而這個被改寫的 PyCodeObject 如上文和上圖所示,主要是部分 ByteCode 被替換成了調(diào)用被編譯過函數(shù)。這個被編譯過的函數(shù),支持自定義編譯邏輯,當前默認的編譯接口是 FX Graph。

這部分基本參考了Dynamo的官方介紹(https://dev-discuss.pytorch.org/t/torchdynamo-an-experiment-in-dynamic-python-bytecode-transformation/361)。

5

TorchDynamo 修改 Python ByteCode 的實現(xiàn)

Python ByteCode 修改主要依賴?PEP 523(https://peps.python.org/pep-0523/)?提供的執(zhí)行自定義 Frame Evaluation API。默認的 Eval Frame 邏輯入口函數(shù)是 _PyEval_EvalFrame,默認情況,它會直接調(diào)用 _PyEval_EvalFrameDefault()?來處理沒被修改的 frame,但是如果發(fā)現(xiàn)存在一個自定義的 Eval Frame 函數(shù),就會執(zhí)行自動線的函數(shù)。

CPython _PyEval_EvalFrame 函數(shù)實現(xiàn)(https://github.com/python/cpython/blob/76449350b3467b85bcb565f9e2bf945bd150a66e/Include/internal/pycore_ceval.h#L84),所以只要在 ByteCode 執(zhí)行前,設(shè)置一個自定義的 eval frame 函數(shù)即可:

static?inline?PyObject*_PyEval_EvalFrame(PyThreadState *tstate, struct _PyInterpreterFrame *frame, int throwflag){ EVAL_CALL_STAT_INC(EVAL_CALL_TOTAL); if (tstate->interp->eval_frame == NULL) { // 這是默認的 eval frame return _PyEval_EvalFrameDefault(tstate, frame, throwflag); } // 如果存在 eval_frame 就會被執(zhí)行 return tstate->interp->eval_frame(tstate, frame, throwflag);}

可以看到 TorchDynamo 正是這么做的。第一步,在 Python 層基于 ContextManger 在進入 Dynamo 作用域時,就觸發(fā) eval_frame 的設(shè)置,實現(xiàn)(https://github.com/pytorch/pytorch/blob/4068c5467d496cd3c09a841f40adacedf3ab41a0/torch/_dynamo/eval_frame.py#L128):

# torch._dynamo.optimize(...) 對應(yīng)的 context manager.class _TorchDynamoContext: def __init__( self, callback: DynamoCallback, ): super().__init__() assert callable(callback) or callback is False or callback is None self.callback: DynamoCallback = callback self.prior: Union[Unset, DynamoCallback] = unset def __enter__(self): # 設(shè)置 eval_frame,記錄之前的 eval frame self.prior = set_eval_frame(self.callback) def __exit__(self, exc_type, exc_val, exc_tb): assert self.prior is not unset # 恢復(fù)之前的 eval frame set_eval_frame(self.prior)

這里先大致認為設(shè)置的 DynamoCallback 對應(yīng)一個自定義的 eval frame 所需的參數(shù),通常是自定義的 eval frame 中所需的編譯邏輯。

看下 set_eval_frame ,C 代碼層面的實現(xiàn)(https://github.com/pytorch/pytorch/blob/eaf4fe3d2b7096579b05b52d543756f74d0e91e7/torch/csrc/dynamo/eval_frame.c#L446),它有點繞但最終走到了這里(https://github.com/pytorch/pytorch/blob/eaf4fe3d2b7096579b05b52d543756f74d0e91e7/torch/csrc/dynamo/eval_frame.c#L121),也是設(shè)置 tstate->interp->eval_frame?,把 eval_frame 設(shè)置成自定義的 custom_eval_frame_shim:

// custom_eval_frame_shim 是自定義的 frameinline static void enable_eval_frame_shim(PyThreadState* tstate) { if (tstate->interp->eval_frame != &custom_eval_frame_shim) { // First call // 設(shè)置自定義的 eval frame tstate->interp->eval_frame = &custom_eval_frame_shim; }}

現(xiàn)在回頭看一下 PEP 523 提供的 Python JIT 編譯器的自定義 frame 執(zhí)行的樣例,它提供了一個比較標準的模版(注意筆者對例子做了微調(diào),原文有多余和不合理的地方)。在自定義 eval frame 之前,一般還需要自定義一個存放自定義 ByteCode 的數(shù)據(jù)結(jié)構(gòu),可以認為是自定義編譯結(jié)果,比如樣例中自定義編譯結(jié)果包括3個字段:

exec_count, 代表改 frame 被執(zhí)行的次數(shù);

jit_failed, 代表之前 jit 編譯是否失敗過;

jit_code,代表 jit 編譯過后的自定義 ByteCode;

據(jù)此,來看下自定義 eval frame 的樣例:

# 輸入原始的 framedef eval_frame(frame, throw_flag): # 獲取 frame 中的 code object 中的存放自定義編譯結(jié)果的字段 pyjion_code = frame.code.co_extra if not pyjion_code: # 不如不存在,就設(shè)置一個空的默認值 frame.code.co_extra = PyjionJittedCode() elif not pyjion_code.jit_failed: # 如果之前 jit 執(zhí)行成功 if pyjion_code.jit_code: # 如果存在 jit 生成的 bytecode,就執(zhí)行它 return pyjion_code.eval(pyjion_code.jit_code, frame) elif pyjion_code.exec_count > 20000: # 沒有 jit 編譯過,且 frame 被執(zhí)行超過 20000 次,就嘗試進行 jit 編譯 # 如果不存在 jit 生成的 bytecode,就 jit 編譯生成它 if jit_compile(frame): # 如果 jit 編譯成功,就執(zhí)行 jit 編譯的 bytecode return pyjion_code.eval(pyjion_code.jit_code, frame) else: # 如果 jit 編譯失敗,就記錄下,后面不再編譯 pyjion_code.jit_failed = True # 增加 frame 執(zhí)行次數(shù)計數(shù) pyjion_code.exec_count += 1 # 執(zhí)行默認的 frame return _PyEval_EvalFrameDefault(frame, throw_flag)

下面接著看 TorchDynamo 自定義 evale frame 的實現(xiàn)。在了解具體的自定義 frame 執(zhí)行邏輯前,有個前置知識是 PyFrameObject 中的 PyCodeObject 為了執(zhí)行自定義 frame 增加了一個 co_extra 字段,用來讓用戶放置自定義的數(shù)據(jù),一般是存放自定義編譯結(jié)果(https://peps.python.org/pep-0523/#expanding-pycodeobject)。

typedef struct { ... void *co_extra; /* 自定義的 frame 需要的自定義數(shù)據(jù) */} PyCodeObject;

TorchDynamo 在自定義編譯結(jié)果的類型是 CacheEntry,其中最重要的字段是 code,是被編譯器修改后的 ByteCode:

typedef struct cache_entry { // check the guards: lambda: : bool PyObject* check_fn; // modified user bytecode (protected by check_fn"s guards) PyCodeObject* code; // on a cache miss, linked list of next thing to try struct cache_entry* next;} CacheEntry;

現(xiàn)在看下自定義的 eval frame 邏輯?custom_eval_frame_shim(https://github.com/pytorch/pytorch/blob/eaf4fe3d2b7096579b05b52d543756f74d0e91e7/torch/csrc/dynamo/eval_frame.c#L342):

static PyObject* _custom_eval_frame(PyThreadState* tstate, PyFrameObject* frame, int throw_flag, PyObject* callback) { // 獲取當前 frame 的 PyCodeObject 的 extra 字段用于后面設(shè)置 // 該字段用于放置自定義的編譯結(jié)果 CacheEntry* extra = get_extra(frame->f_code); // callback 即上文說的自定義編譯器 // 使用 callback 進行 bytecode 的修改,即編譯 // 編譯結(jié)果寫在了 frame->f_code中的 extra 中 PyObject* result = call_callback(callback, (PyObject*)frame, cache_size(extra)); if (result != Py_None) { // 緩存編譯結(jié)果 extra = create_cache_entry(extra, result); Py_DECREF(result); // 執(zhí)行自定義的 frame // eval_custom_code 最終會調(diào)用 CPython 接口 _PyEval_EvalFrameDefault 來執(zhí)行計算 // 其中 extra->code 中存放的就自定義編譯器生成的 ByteCode // 所以最終 _PyEval_EvalFrameDefault 執(zhí)行的是編譯器生成的 ByteCode return eval_custom_code(tstate, frame, extra->code, throw_flag); }}inline static PyObject* eval_custom_code(PyThreadState* tstate, PyFrameObject* frame, PyCodeObject* custom_code, int throw_flag) { // 使用 custom_code 創(chuàng)建一個自定義的 frame PyFrameObject* shadow_frame = PyFrame_New(tstate, custom_code, frame->f_globals, NULL); // 調(diào)用 Python 的 frame 執(zhí)行自定義 frame return _PyEval_EvalFrameDefault(tstate, shadow_frame, throw_flag);}

到這里,已經(jīng)清楚了修改 Python ByteCode 執(zhí)行的主線邏輯。

6

小結(jié)

這里對 Python 的執(zhí)行和 TorchDynamo 的主要原理做了初探,主要是自定義 Eval Frame 的實現(xiàn)技巧。其它相關(guān)的 Python ByteCode 標準,ByteCode 到 FX Graph 的轉(zhuǎn)換,ByteCode 的改寫等內(nèi)容還沒涉及。

參考資料 ?

tenthousandmeters.com/b?(https://tenthousandmeters.com/blog/python-behind-the-scenes-1-how-the-cpython-vm-works/)

peps.python.org/pep-052?(https://peps.python.org/pep-0523/)

dev-discuss.pytorch.org?(https://dev-discuss.pytorch.org/t/torchdynamo-an-experiment-in-dynamic-python-bytecode-transformation/361)

(原文:https://zhuanlan.zhihu.com/p/589115427) 其他人都在看

李白:你的模型權(quán)重很不錯,可惜被我沒收了

單RTX 3090訓(xùn)練YOLOv5s,時間減少11小時

OpenAI掌門Sam Altman:AI下一個發(fā)展階段

32篇年度最佳AI論文;Python編譯器Codon開源

對比四大深度學(xué)習(xí)框架,我發(fā)現(xiàn)都關(guān)注兩大問題

比快更快,開源Stable Diffusion刷新作圖速度

OneEmbedding:單卡訓(xùn)練TB級推薦模型不是夢

歡迎Star、試用OneFlow最新版本:GitHub - Oneflow-Inc/oneflow: OneFlow is a deep learning framework designed to be user-friendly, scalable and efficient.OneFlow is a deep learning framework designed to be user-friendly, scalable and efficient. - GitHub - Oneflow-Inc/oneflow: OneFlow is a deep learning framework designed to be user-friendly, scalable and efficient.https://github.com/Oneflow-Inc/oneflow/

關(guān)鍵詞: ByteCode

欧美一区二区三区啪啪另类| 成人在线视频免费播放| 国产国拍成人精品视频| 综合婷婷一区二区三区| 97超碰在线公开免费| 超视在线免费观看视频| 亚洲视频国产精品你懂得| 丰满人妻熟妇乱又精品视| 欧美日韩在线精品激情| 91/日韩/精品/乱码| 青青成人免费在线视频| 久久久久久久久久久高| 最新免费av在线观看| 欧美一区二区三区再线播放| 亚洲熟妇色自偷自拍另类图片| 精品久久久中文字幕人妻| 亚洲自拍偷拍 欧美激情| 国产对白av一区二区| 免费国产草莓视频在线观看黄| 国产美女视频免费观看网| 久久国产精品99精国产| 久久精品国产亚洲av四区| 欧洲一区二区三区在线播放| 成人在线一区二区三区av| 亚洲av无久久精品一区二区| 在线成本人视频动漫高清| 人妻av在线中文字幕| 成人免费在线视频亚洲| 国产亚洲av久久精品| 熟女麻豆一区二区三区四区| 国产女老师的诱惑在线播放观看| 中文字幕乱码在线视频网站| 亚洲av色在线观看国产| 粉嫩av蜜乳av蜜臀av| 日韩中文字幕在线av| 熟女一区二区三区播放| 免费国产草莓视频在线观看黄| 超污短视频网站在线观看| 91精品福利自产拍在线观看| 久久精品人妻系列av| 超碰在线公开内射日韩版| 中文字幕乱码在线观看| 蜜臀av在线一区二区三区四区| 欧美午夜激情福利国产| 日日摸夜夜添夜夜添破第一次| 欧美日韩制服丝袜第一页| 直接免费观看黄色的网站| 人妻熟女一区二区91| 你懂的视频精品在线观看| 亚洲国产精品黑丝美女| 精品国产99国产精品亚洲| 青青青国产免费观看视频| av中文字幕一二三四| 久久综合中文字幕日韩精品| 日本性感丝袜女秘书诱惑| 亚洲精品国产精品乱码不卡| 欧美日韩久久综合一区二区| 欧美成人动漫在线观看| 国产免费无码一区二区视频无码| 中文字幕人妻免费网站| 得得的爱在线视频免费观看 | 日韩熟女人妻国产av| 欧美情色大片在线观看| 高潮毛片遮挡免费高清| 自拍视频在线观看青青网| 成人在线一区二区三区av| 欧美一区二区三区资源| 丰满人妻视频一区二区| 亚洲乱熟女一区二区三区com| 久久精品久久一区二区| 国模午夜写真福利在线| 污污污网址免费在线观看| 99re这里只有精品在线| 亚洲中文字幕乱码在线| 中文字幕乱码不卡一区二区三区| 中文字幕中文av在线精品| 久久精品女人av一区二区| 中文字幕乱码中文字幕| 欧美成年一区二区三区| 污污污网址免费在线观看| 人妻久久一区二区三区精品99| 26uuu亚洲综合色欧美| 超碰在线97青青草原| 国产精品成人免费av| 日韩欧美成人精品视频在线| 99爱精品视频在线视频| 日韩精品人妻av中文字幕 | 风间由美亚洲一区二区三区| 亚洲综合国产一区二区三区| 91草草视频在线观看| av人妻一区二区三区| 日韩中文字幕人妻一区| 亚洲自拍偷拍 欧美激情| 黄色免费网址在线播放| 带个大鸡巴臭逼的视频。| 亚洲一区二区三区桃乃木香奈| av天堂免费在线播放| 在线成本人视频动漫高清| 国产自拍免费精品视频| 欧美性色黄大片人与善| 国产欧美一区二区精品性| 在线观看免费黄小视频| 白浆熟女精品国产91| 91偷拍老熟女露脸合集| 国产精品永久免费自在线观看| 色综合久久88色综合天| 久久精品人妻免费观看| 中文字幕乱码人妻久久精品| 成人在线播放亚洲一区| 午夜免费在线视频国产| 99综合精品在线观看| 亚洲人妻一区二区91| 午夜性生大片免费在线观看| 18免费在线观看av| 日韩激情中文字幕在线| 涩播视频在线观看免费| 日韩极品视频在线观看免费| 国产视频自拍在线观看| 国产小视频在线观看你懂得| 日韩在线不卡一区在线观看| 欧美女奴靠bb唆大鸡巴群交| 亚洲av专区在线观看国产| 麻豆国产成人av在线| 国产黄色片三级三级三级| 亚洲情色一区二区三区四区五区| 99re成人精品免费视频| 国产偷拍自拍熟女视频| 亚洲免费成人精品视频| 爱搞视频在线免费观看的网站| 韩国床震吃奶摸下的激烈视频| 久久精品人妻一区二区| 国产欧美久久久久久精品一| 97在线观看的视频资源| av天堂免费在线播放| 91国产激情视频在线观看| 国产91av精品在线观看| 亚洲精品午夜免费视频| 久久一区二区三区av| 人妻av在线中文字幕| 国产精品色图在线观看| 青青青色视频在线观看| 亚洲午夜免费在线观看| 日韩人妻丝袜美腿中文| 精品99在线免费视频| 人妻少妇亚洲自拍av| 国产69精品久久久久久妇| 97在线观看视频免费视频 | 亚洲中文字幕一区二区三区av| 国产精品久久99久久久| 欧美激情视频免费观看| av中文字幕一二三四| 快速播放国产精品视频| 国产美女在线观看专区| 极品视频在线免费播放| 男人和女人逼逼的视频| 青青青青草免费视频看看| 亚洲一区二区三区av网站| 成人在线一区二区三区av| 亚洲一区二区三区色视频| 欧美精品免费在线播放| 亚洲丝袜av在线观看| 79久久久久久久久久| 欧美一区久久人妻中文字幕| 青草成人在线观看视频| 综合久久国产中文人妻少妇在线| 日韩熟女少妇一区二区三区| 91国产自拍在线视频| 国产自拍视频在线免费| 国产一二三自拍视频在线观看 | 很黄很色的视频免费在线观看| 国产av自拍资源网址| 欧美精品网站在线视频| 大香视频依人在线中文字幕 | av天堂免费在线播放| 久久久久久久亚洲综合| 青青热久免费精品视频| 久久久久亚洲av一区二区三区| 蜜臀av入口一区二区三区| 精品国产黄片一二三区| 在线播放一区二区三区三州| 午夜dj观看在线观看hd| 3p少妇欧美一区二区三区| 精品国产黄片一二三区| 亚洲中文字幕乱码在线| 国产高清免费不卡av| 国产亲乱的性视频网站| av激情韩国在线播放| 国产精品精品免费视频| 午夜97视频在线观看| 91国产自拍在线视频| 男人靠女人靠厉害视频| 精品人妻少妇av一区二区| 97人妻中出中文字幕| 午夜精品一区二区三区在视| 先锋视频资源在线播放| 嘴唇上长黄色的小点点| 最新免费av在线观看| 国产免费九九久久精品a级| 欧美国产中文一区二区三区| 最新中文在线乱码av| 国产精品成人中文字幕| 中文字幕人妻欧美日韩熟女| 亚洲素人中文字幕在线| 亚洲国产成人不卡av| 亚洲福利视频免费播放| 午夜激情免费视频成人| 国产va欧美va精品va综| 亚洲乱码精品中文字幕| 人妻熟女一区二区91| 网站免费黄色在线播放| 亚洲黄色av中文字幕| 成人永久免费激情视频在线 | 亚洲免费成人精品视频| 日韩av三级在线网站| 国产婷婷色一区二区三区五区| 久久福利视频在线播放| 饥渴少妇高潮露脸嗷嗷叫| 日韩欧美精品中文字幕富二代| 亚洲情色一区二区三区四区五区| 亚洲欧美另类在线一区二区| 日本一区二区三级在线观看| 久久久久久久精品女人毛片 | 日本一区二区三级在线观看| 日韩女优精品在线观看| 蜜臀av夜夜澡人人爽人人| 97资源超碰在线中文| 人妻中出中文字幕在线| 国产黄色av网站在线| 日韩乱码中文字幕有码视频| 中文字幕久久人妻综合| 午夜免费在线视频国产| 中文字幕在线不卡97| 5060午夜看片免费| 亚洲欧美自拍偷拍另类| 国产高清亚洲精品视频| 蜜桃av精品视频一区二区三区| 91在线国产视频播放| 亚洲乱码中文字幕综合久久| 国产成人在线视频播放| 国产青青草在线观看视频| 亚洲情色国产自拍偷拍| 国产精品成人自产拍在线| 亚洲国内av不卡在线| 国产 中文字幕 乱码 在线| 巨乳人妻中文字幕精品在线| 网站免费黄色在线播放| 直接免费观看黄色的网站| 中文字幕人妻在线乱码搞| 久久久21精品久久久| 国产精品亚洲av三区色| 国产成人精品欧美日韩网站| 97人妻在线公开视频| 国产一区二区三区伦理片一级 | 想神马有神马舞蹈视频| 国产99在线视频免费| 天天操天天日天天射天天爽| 99爱精品视频在线视频| 国产精品一二av在线| 人妻熟女一区二区三区98| 国产女老师的诱惑在线播放观看 | 国产精品丝袜制服在线| 日韩 制服 丝袜 中文| 91av在线观看蜜臀| 日韩成人伦理片在线观看| 国产亚洲欧美日韩精品| 国产高清一级视频在线观看| 自拍偷拍色亚洲欧美色| 亚洲一区二区三区成人在线| 日韩欧美国产精品综合| 96av国产在线播放| 日韩欧美群交P内射捆绑| 国产哟av精品色哟哟| 自拍偷自拍亚洲精品10p| 2023国产精品自拍视频| 久久精品国产亚州av| 国产成人乱色视频网站| 亚洲国产日韩精品欧美| 中文字幕视频免费在线| 日韩在线一区二区三区中文字幕| 久久久久久人妻精品一区| 亚洲一级二级三级国产av| 人妻夜夜爽天天爽欧美色院| 亚洲第一区二区在线观看| 91福利国产成人精品播放| 色婷婷av一区二区三区网| 欧美激情视频一区二区三区| 午夜秘密播放器在线观看视频| 在线91华人精品国产片| 91成人精品亚洲国产| 久久国产精品9999p| 亚洲黄色分享大全探花| 黄色传媒在线免费观看| 夜夜骚av一区二区三区啊| 人妻一区二区三区精品免费| 色婷婷综合精品久久久| 国产中文精品久高清在线不| 亚洲欧美日韩精品麻豆| 亚洲欧洲日产日韩激情| 中文字幕人妻系列在线视频| 在线观看免费黄小视频| 一级一看免费完整版毛片| 国产精品99久久啊免费黑人| 欧美一级色片在线播放| 午夜性生大片免费在线观看| 亚州精品一区二区@v| 久久久久久久精品女人毛片| 高跟丝袜诱惑后入av| 日韩av中文字幕另类| 亚洲sm一区二区三区| 超碰97在线视频观看| 久久久精品久久久久久69| 午夜激情免费视频成人 | 亚洲自拍一区在线观看| 男生把小鸡鸡插到大美女的屁股| 久久乐国产精品亚洲综合| 精品国产乱码久久久久夂| 欧美亚洲另类丝袜在线| 日韩欧美成人精品视频在线| 国产日韩av大片快播| 97自拍视频国产视频| 这里都是国产视频精品| 国产自拍偷拍在线一区| 男人和女人逼逼的视频| 成人十八禁av男人的天堂| 国产护士性爽视频在线观看| 欧美一区二区三区啪啪另类| 成人A级毛片无码免费看| 精品人妻一区二区三区综合部| 欧美情色大片在线观看| 久久婷婷香蕉国产精品| 草草视频免费在线观看 | 伊人av超碰伊人久久久| 91超碰在线免费视频| 国产精品一区二区精品视频| 国产很黄很色精品久久久| 亚洲中文字幕乱码免费视频| 老师美女脱了内裤露屁股| 日日摸日日碰天天爽歪歪| 午夜日韩私人大片中国黄页网| 丝袜熟女av一区二区三区| 超碰人人爱人人爽人人av| 成人免费av网址在线观看| 国产爱爱视频在线播放| 日韩av一区二区三区四| 欧美日韩午夜精品不卡综合| 日本丝袜美腿在线观看| 521a成v精品视频在线播放| 综合人妻一区二区三区| 97久久公开视频在线| rct378在线中文字幕| 日本一区二区三区不卡免费 | 人妻又爱又澡人人添人人爽| 久久精品女人av一区二区| 免费国产一区二区三区久久久久久| 91成人资源在线观看| 91精品久久久久久久久| 亚洲一区视频免费在线观看| 亚洲丝袜在线播放一区 | 精品99在线免费视频| 国内自拍视频在线观看h| 爆乳美女粉嫩阴蒂被插视频| 肉色丝袜久久精品国产av| 521a成v精品视频在线播放| 中文字幕乱码人妻久久精品| 亚洲乱码国产乱码精品精91 | 亚洲在线视频中文字幕| 精品无人区一区二区三区av| 成人 中文字幕 熟女| 成人av在线视频资源| 一区二区三区蜜桃在线观看| 国产精品中文字幕av在线 | 国产亚洲av久久精品| 日本免费一区二区三区中文字幕| 啊啊啊啊插进去你好骚视频| 18免费在线观看av| 24小时在线免费观看高清视频| 超视在线免费观看视频| 人妻夜夜爽天天爽欧美色院| 国产精品久久久久久av色| 国产精品入口蜜臀人妻| 精品国产一区二区三区不卡免费| 一区二区三区欧美精选| 日韩人妻有码一区二区| 1024在线国产视频| 亚洲熟女一区二区三区观看| 超污短视频网站在线观看| 久久久久久狠狠亚洲综合| 亚洲第一区二区在线观看| 青青草日韩av在线播放| 丰满美女一区二区三区| 国产乱码字幕精品高清人v| 欧美性色黄大片人与善| 国产美女视频免费观看网| 91在线视频网站总站| 欧美亚洲另类自拍丝袜| 国产精品中文av在线播放| 国产熟女丝袜一区二区三区四区 | 国产女老师的诱惑在线播放观看| 男人和女人上床的真实视频| 亚洲在线欧美一区二区三区 | 国产在线观看青青草视频| 国产精品久久人妻互换| 国模午夜写真福利在线| 国产精品久久久久精品| 蜜臀国产在线观看播放免费| 最新午夜在线观看视频| 久久亚洲一区二区夜夜嗨 | av岛国一区二区三区久久| 精品人妻av在线观看| 成熟人妻一区二区三区| 久久人人妻人人做人人爽| 精品国产三级av在线| 久久老熟女一区二区福利蜜臀| 你懂的视频精品在线观看| 黄色av网站 亚洲精品| 美女午夜写真福利视频| 精品熟妇人妻一区二区三区四区| 97久久公开视频在线| 人妻又爱又澡人人添人人爽| 国产自拍免费精品视频| 欧美久久久久久久久久久久久| 欧美激情在线播放一区| 99精品人妻一区二区三蜜桃| 一级成人欧美一区在线观看| 黄腔女兵最经典十句话| 亚洲男人天堂超碰在线| 99精品人妻一区二区三蜜桃| 亚州精品一区二区@v| 麻豆av国语对白麻豆| 男人操女人逼视频免费观看| 自拍视频在线观看青青网| 美女观看网站免费不卡视频| 老熟女 一区二区三区| 免费的床上很黄不遮挡视频| 色av色婷婷91人妻久久久 | 5060午夜看片免费| 日韩欧美久久一区二区| 免费播放黄色操逼乱操逼| 日韩情色一区二区三区四区| 亚洲熟妇色自偷自拍另类图片| 亚洲黄色av中文字幕| 超碰视频在线观看免费| 国产中文精品久高清在线不| 在线观看免费黄小视频| 成人亚洲精品在线观看| 老熟女一区二区三区四区| 91最新黄色免费网站| 欧美在线观看亚洲精品| 青青精品视频在线免费观看| 日本性感丝袜女秘书诱惑| 日韩人妻这里只有精品| 欧美在线1区2区3区| 伊人视频在线免费观看| 人妻在线免费观看二区| 国产三区四区在线视频| 黄黄的小视频免费在线播放| 青青青青在线播放视频| 97在线视频中文字幕| 97精品综合久久视频| 精品日本一区二区三区四区| 成人国产一区二区在线| 国产精品高潮呻吟在线观看| 91在线国产视频播放| 国产美女爽到喷出水来视频99| 97人妻中出中文字幕| 亚洲成av人在线免费观看| 国产日韩亚洲精品av| 成人黄动漫在线观看网站 | 人妻在线免费观看二区| 三级国产精品久久久99| av在线亚洲国产精品婷婷| 超碰97国产在线免费观看| 97人妻超碰在线免费视频| 97国产视频在线免费观看| 国产丝袜熟女人妻在线观看| 视频一区二区三区国产在线| 黄色美女在线观看日韩| 成人极品av免费观看| 亚洲国产熟女一区二区三区胖妞| 青青草原国产在线免费观看| 欧美一区二区三区伦理国产| 亚洲一区二区在线看看| 男人和女人逼逼的视频| 99国产精品久久全免费| 你懂的视频精品在线观看| 亚洲乱女色熟一区二区三区 | 中文字幕一区人妻激情| 国产日韩亚洲精品av| 欧洲一区二区三区在线播放| 成人亚洲精品在线观看| 精品国产一区二区三区不卡免费| 性感美女肉色丝袜诱惑| 欧美三级精品三级在线| 中文字幕女优乱码久久午夜| 色94色一区二区三区| 99久久无码精品区二区毛片| 亚洲午夜免费在线观看| 超碰在线最新地址97| 国产亚洲免费在线视频| 中文字幕综合av一区二区三区| 桃色视频在线观看97| 亚洲黄色分享大全探花| 国产免费在线视频观看| 丰满人妻熟妇又伦精品| 国产日韩制服丝袜第一页| 亚洲国产蜜臀系列在线观看| 日韩中文字幕人妻一区| 亚洲一区视频免费在线观看| 欧美情色大片在线观看| 亚洲欧美一区二区福利| 国产免费在线视频观看| 97人妻中文字幕精品一区在线| 国产成人自拍视频在线| 久久精品久久一区二区| 日韩中文字幕avsex| 97超碰超碰在线观看| 一本92午夜免费不卡福利片 | 成人亚洲精品在线观看| 国内精品人妻久久激情| 自拍人妻欧美亚洲第三| 最新中文字幕av网站| 国产精品亚洲av二区三| 亚洲成人久久精品国产| 日韩性感美女在线观看| 欧美日韩三级在线观看| 日韩中文字幕人妻诱惑| 97久久久久久久久久久| 一本92午夜免费不卡福利片 | 中国黄色靠逼大片大黑逼| 国产成人精品欧美日韩网站| 99九九99久久精品| 欧洲一区二区三区在线播放| 国产精品久久人妻互换| 青娱乐成人免费公开视频| 国产自拍av在线观看| 三级久久在线中文字幕| 亚洲乱码国产一区网址| 欧美一区二区三区av| 凹凸在线视频免费观看| 成人国产精品av在线| 午夜偷拍视频免费观看| 国产亚洲免费在线视频| 亚洲成人制服丝袜av| 中文字幕国产av中文| 老女人乱淫一区二区三区| 国产男女淫片av免费观看| 97人人爽人人爽人人人爽| 亚洲情色一区二区三区四区五区| 国产欧美一区二区精品性| 久久久99人妻一区二区三区| 成人黄色精品视频网站| 中文人妻一区二区熟女| 午夜嗨起视频在线观看| 美女伸开双腿让男人桶视频| 国产91情侣在线视频| 伊人精品久久久久中文字幕| 亚洲熟女久久一区二区| 免费一区二区三区四区av| 青青青爽综合在线视频| 熟妇精品一区二区三区| 国产日韩亚洲精品av| av中文字幕官网天堂| 国产草草视频在线观看| 久久久久久久精品女人毛片| 久久久久久精品一区二区三区| 国产又粗又猛又爽又色视频| 亚洲情色国产自拍偷拍| 成人国产精品av在线| 青娱乐成人免费公开视频| 亚洲成av人在线免费观看| 正在播放99精品视频在线播放| xxx日韩欧美黄色a| 成人免费三级在线观看| 亚洲欧美视频在线观看网站| 黄色免费网址在线播放| 色婷婷国产精品免费视频| 日本视频在线一区二区三区| 精品在线观看视频一区| 5060午夜看片免费| 国产日韩欧美精品久久| 亚洲一a区二a区三a区| 日韩国产制服丝袜专区| 成人激情自拍图片视频| 超碰97在线视频观看| 欧美亚洲另类一区二区三| 国产精品一区二区精品视频 | 国产欧美一区二区精品性| 亚洲欧美一区二区三区黑人| 粉嫩av蜜乳av蜜臀av| 成年人黄视频免费观看网站 | 国产视频二区在线观看 | 日产精品99久久久久久久久| 成人区人妻精品一区二| 91在线成人在线视频| 亚洲免费成人精品视频| 国产欧美一区二区精品性| 911精品在线免费观看| 午夜精彩视频网站免费观看| 国内欧美一区一区三区| 可以免费看的黄色的网站| 欧美 亚洲一区二区在线| 两鸡巴日一个骚逼浪的视频| 日韩一级淫片蜜臀播放口| 在线观看国产精品av| 大乳美女疯狂榨取精子视频| 91国产自拍在线视频| 亚洲激情视频在线观看视频| 亚洲自拍一区在线观看| 人妻系列少妇极品熟妇| 亚洲一区二区三区色视频| 国产美女爽到喷出水来视频99| 日韩人妻这里只有精品| 国产精品髙潮呻吟久久av| 国产高清一级视频在线观看| 中文字幕在线免费视频一区 | 国产91精品入口人妻| 国产视频免费在线播放| 日韩欧美一区二区专区在线观看 | 亚洲欧洲偷拍另类av| 亚洲黄色av中文字幕| 中文字幕人妻A片免费看| 天海翼一区二区三区免费| 另类专区日韩有码中文字幕| 国产精品亚洲av三区色| 国产一区二区三区亚洲一区| 先锋视频资源在线播放| 美女国产高潮福利片在线看| 国产高清一级视频在线观看| 性感丝袜美女写真视频| 日韩av三级在线网站| av中文字幕一二三四| seseav在线观看| 久久精品人妻一区二区| 国产精品久久久午夜夜伦鲁鲁| 你懂的视频精品在线观看| 国产日韩欧美精品久久| 国产三区四区在线视频| 男人天堂中文字幕av| 国产性一交一乱―色―情人| 96精品久久久久久久久| 人妻丝袜一区二区三区四区av| 能看国产小视频的网站| 亚洲丝袜在线播放一区| 日韩毛片无码永久免费韩| 成人黄色免费在线网站| 熟妇久久久人妻中文字幕| 日本一区二区三区不卡免费 | 9999中文字幕在线视频| 一本92午夜免费不卡福利片 | 老熟女老熟妇一区二区| 在线观看国产精品av| 国产性一交一乱―色―情人| 男女av一区二区三区| 久久婷婷色香五月综合激激情| 久久成人在线播放视频| 中文字幕久久久2029| 79久久久久久久久久| 99九九99久久精品| 欧美熟妇一级二级三级a| 在线成本人视频动漫高清| 国产精品久久久午夜夜伦鲁鲁| 青草视频中文字幕在线观看| 欧美性少妇一区二区三区| 日韩av在线日韩av日韩av| 丝袜熟女av一区二区三区| 成人在线观看免费视频播放| 亚洲黄色分享大全探花| 午夜精品久久久在线观看| 人妻互换精品一区二区| av人妻一区二区三区| 成人永久免费激情视频在线| 在线免费观看青青草av| 蜜臀国产在线观看播放免费| 国产原创AV蜜芽尤物一区| 在线播放99国产视频| 日本国产一区二区在线观看| av黄色资源中文字幕| 欧美高潮呻吟久久av无| 国产极品粉嫩交性大片| 国产免费午夜福利视频| 成人动漫视频在线观看免费| 亚洲欧美另类视频一区蜜臀| 国产18精品乱码在线看| 久久国产精品av大全| 欧美在线免费在线视频| 国产精品亚洲av三区色| 欧美一区二区三区中文字幕| 久久热视频在线免费观看| 中文字幕国产乱码视频| 桃色视频在线观看97| 国内精品视频免费播放| 中文字幕国产av中文| 性感美女一区二区三区| 日韩乱码中文字幕有码视频| 在线看片免费人成视久网| 欧美日韩一区三区不卡在线| 欧美日韩午夜精品不卡综合| 国产精彩自拍视频在线观看| 午夜mm1314视频| av天堂午夜精品蜜臀| 青青草原网址在线观看| 97自拍视频国产视频| 青青草日韩av在线播放| 久久福利视频在线播放| 521a成v精品视频在线播放| 久久亚洲精品色噜噜狠狠| 黄视频免费看网站在线观看| 久久乐国产精品亚洲综合| 成人区人妻精品一区二| 国产高清在线一区不卡极品| 又色又爽又黄又视频毛片| 女生高潮喷水视频免费在线观看| 国产一区二区在线直播| 精品99在线免费视频| 午夜免费在线观看小视频| 日韩不卡毛片午夜在线看片?| 中文字幕人妻A片免费看| 成人免费视频免费在线观看| 国产91av精品在线观看| 午夜精品182视频国产| 国产亚洲精品线视频在线| 成人动漫视频在线观看免费| 日韩素人mium丝袜| 老熟女老熟妇一区二区| 欧美久久久久久久久久久久久| 日本青草视频在线观看| 五十路熟女人妻在线网观看| 污污污黄视频免费观看| 成年网站在线视频免费| 日本一区二区三区不卡免费 | 日本国产一区二区在线观看| 青春草视频免费观看在线| 男人女人40分钟视频| 国产麻豆精品在线视频| 内射中文字幕在线观看| 亚洲国产精品美女papa| 你懂的视频精品在线观看| 久久久久亚洲精品乱码按摩| 欧美激情视频免费观看| 先锋视频资源在线播放| 黄色网页在线免费观看| 久久综合中文字幕日韩精品| 国产熟妇一区二区三区四区| 美女胸18下看禁止免费视频| 国产无码精品久久久久久久| 中文字幕国产乱码视频| 亚洲第一区二区在线观看| 国产精品中文字幕av在线| 可以看手机在线黄色视频网| 日韩熟女少妇一区二区三区| 尤物欧美一区二区三区| 人妻av在线中文字幕| 人妻熟女欧美一区二区| 午夜精品一区二区三区在视| 巨乳人妻中文字幕精品在线| 久久久久99精品成人| 97超频精品在线观看| 亚洲精品你懂的在线观看| 成人亚洲精品在线观看| 在线视频免费观看久久| 26uuu亚洲综合色欧美| 最大的黄色亚洲网站在线观看| av在线男人社区日韩| 国产有色视频在线网址| 在线播放一区二区三区三州| 国产性感丝袜美女av| 国产精品精品免费视频| 国产三级视频在线18播放线观看| 亚洲丝袜av在线观看| 熟女人妻中文字幕在线看| 国产一区二区蜜臀av| 白浆熟女精品国产91| 亚洲第一区二区在线观看| 亚洲中文字幕日韩av| 亚洲精品乱码久久久久久久久| 国产老人一区av二三区| 国产情侣免费观看视频| 91精品国产色综合久久不卡蜜| 爆乳美女粉嫩阴蒂被插视频| 精品熟妇人妻一区二区三区四区| 亚洲av丝袜诱惑在线| 国产视频二区在线观看| 人妻一区二区在线免费播放| 亚洲国产免费视频网站| 国产十日韩十另类十视频新区 | 丰满人妻视频一区二区| 啊啊啊啊插进去你好骚视频| 试婚99天视频免费完整版观看| 1024日韩人妻区二区| 国产69精品久久久久久妇| 欧美一区二区在线观看网站| 国产原创av在线免费播放| 试婚99天视频免费完整版观看| 欧美专区一区二区在线| 韩国三级一区二区在线观看| 超污短视频网站在线观看| av中文在线中文av| 饥渴少妇高潮露脸嗷嗷叫| 午夜精品福利一区二区蜜股av| 我的放荡丝袜美腿老师| 国内自拍 都市激情 人妻| 青青草原精品免费在线视频| 色老久久精品偷偷鲁一区| 九九久久久久无限久久| 91最新国产在线播放| 黄视频网站免费观看视频| 最新成人精品视频在线| 涩播视频在线观看免费| 巨乳人妻中文字幕精品在线| 人妻少妇精品一区二区| 最新午夜在线观看视频| 久久久久久久九九九b热| 鸿观全集在线观看视频| 91av在线观看蜜臀| 超碰在线公开内射日韩版| 欧美 日韩 一区二区三区| 国产熟女人妻在线观看| 亚洲欧美另类视频一区蜜臀 | 亚洲 自拍 露出 极品| 国产精品久久久久久永久牛牛| 99re成人精品免费视频| 男人靠女人靠厉害视频| 国产精品欧美一区二区久久久| 精久久中文字幕人妻最新| 成年av网站18不禁| 人妻互换精品一区二区| 黄色av在线免费播放| 国产日韩欧美精品久久| 911精品在线免费观看| 青青视频在线观看播放观看| 熟女五十路一区二区三区| 亚洲黄色资源在线浏览| 欧美日韩在线精品激情| 中文字幕国产av中文| 久久精品国产v日韩v亚洲| 欧美一区二区免费在线观看| 蜜臀成人av在线观看| 国产高清一级视频在线观看| 巨乳人妻中文字幕精品在线| 日本人妇十八禁在线观看| 欧美日韩三级在线观看| 国产高清在线一区不卡极品| av天堂午夜精品蜜臀| 黄色的网站免费在线看| 国产va欧美va精品va综| 蜜臀av在线一区二区三区四区| 1024在线国产视频| 国产精品成人自产拍在线| 欧美一级色片在线播放| 最新在线一区二区三区| 国产福利精品久久av| 日韩人妻丝袜美腿中文| 久久久久久久九九九b热| 国产黄色片三级三级三级| 国内精品视频免费播放| 24小时在线免费观看高清视频| 精品99在线免费视频| 国产乱人视频免费观看| 亚洲乱码精品中文字幕| 草草视频免费在线观看| 简述土壤监测方案设计流程| 在线观看无码免费你懂的| 人妻在线免费观看二区| 五十路熟女人妻在线网观看| 色偷偷av一区二区三区| 国产a三级三级三级精品91区| 人妻在线免费观看二区| 国产欧美在线视频观看| 欧美 日韩 成人 三级| 女生高潮喷水视频免费在线观看| 性感丝袜美女写真视频| 中文乱码字幕视频观看网站免费 | 国产视频午夜在线播放| 国产午夜福利精品理论片久久| 国产精品久久综合亚洲av| 在线观看资源青青国产视频| 熟妇久久久人妻中文字幕| 性做久久久久久久毛片| 青草视频中文字幕在线观看| 黑人黄色特级猛男人男人区| 美女胸18下看禁止免费视频| 青春草视频免费观看在线| 午夜免费在线观看小视频| 人妻在卧室被老板疯狂进入| 日韩av三级在线网站| 最好看的中文字幕av| 色婷婷av一区二区三区网| 亚洲精选清纯唯美自拍偷拍| av在线不卡中文字幕宾馆| 国产精品短视频在线观看| 能看国产小视频的网站| 国产精品久久久久精品日 | 欧美午夜理论在线观看| 小美女操老头和动物操逼| 日本一区二区不卡精品| 欧美日韩乱码视频在线免费观看| 日韩人妻丝袜美腿中文| 在线播放一区二区三区三州| 国产精品久久综合亚洲av| 亚洲男人天堂超碰在线| 波多野吉衣久久久久久| carpon视频在线观看| 免费在线观看亚州av| 69人妻精品久久久久88| av在线一区二区三区不卡| 国产sese在线播放| 男人天堂中文字幕av| 日韩精品中文字幕人妻| 99久久国产综合精品五月天| 鲁片鲁一区二区三区在线观看| 精品熟女一区二区三区免费视频| 亚洲一区美腿丝袜在线播放| 午夜精品久久久在线观看| 四川熟女a一区二区三区| 青草视频中文字幕在线观看| 亚洲熟女区一区二区三| 美女自拍偷拍亚洲一区| 高潮毛片遮挡免费高清| 国产粉精品高潮呻吟久久av| 成人黄色在线免费播放| 爆操欧美牛仔裤肥臀大屁股| 亚洲av成人噜噜网站| 日本性感丝袜女秘书诱惑| 中文字幕在线不卡97| 我的放荡丝袜美腿老师| 亚洲乱码中文字幕综合久久| 日日摸夜夜添夜夜添破第一次| 快速播放国产精品视频| 制服丝袜 日韩 国产| 精品国产乱码久久久久夂| 老师美女脱了内裤露屁股| 国产成人高清一区二区三区免费视频 | 久久久久这里只出精品| 亚洲成人av免费在线播放| 5060午夜看片免费| 欧美一区二区在线播放视频 | 在线国产视频精品视频| 另类专区日韩有码中文字幕| 欧美激情1区2区3区4区| 毛片久久久久久久久久久| 性感美女肉色丝袜诱惑| 久久精品人妻一区二区| 日韩人妻久久中文字幕| 欧洲美一区二区三区亚洲| 久久精品人妻免费观看| 欧美特级特黄a大片免费| 青青视频在线观看播放观看| 97福利国产在线视频| 久久国产精品99精国产| 朋友的妈妈在线免费观看中字 | 另类专区日韩有码中文字幕| 老女人av一区二区三区| 最新中文在线乱码av| 在线观看资源青青国产视频| 综合人妻一区二区三区| 国产视频二区在线观看 | 亚洲国产精品美女papa| 亚洲一区二区在线看看| 国产一区二区在线97| 久久国产麻豆免费播放| 免费观看国产精品黄色| 911精品在线免费观看| 精品久久99在线观看| 少妇极品一区二区三区| 中文字幕日本在线观看视频| 国产精品人妻中文字幕| 国产精品一级二级盗摄羞羞| 久久国产精品9999p| 制服 丝袜 欧美 国产精品| 国产日韩欧美精品久久| 欧美女同性恋一区二区三区| 国产精品久久久久九九九九| 亚洲精品沙发专享系列av| 亚洲熟女区一区二区三| 欧美日韩精品成人在线| 丰满人妻精品一区二区三区| 国产午夜高潮熟女精品| 少妇直播一区二区三区 | 很黄很色国产精品免费视频| 成人av在线播放网址| 国产精品久久久久九九九九| 日韩人妻有码一区二区| 丰满熟女一区二区三区91| 97人妻在线公开视频| 精久久中文字幕人妻最新| 亚洲人妻av一区二区| 高潮喷水波多野结衣在线观看| 欧美日韩精品一级二级三级| 青青青青草免费视频看看| 五十路熟女人妻在线网观看| 亚洲 人妻 有码 在线| 欧美午夜精品免费视频app| 日韩 国产 欧美 在线 一区| 麻豆av国语对白麻豆| 正在播放99精品视频在线播放 | 人妻丝袜一区二区三区四区av| 亚洲丝袜av在线观看| 成人在线观看免费视频播放| 亚洲国产免费视频网站| 男人插女人下面出浆视频| 2023国产精品自拍视频| 久久久久久噜噜噜久久久精品| 青青操新免费观看视频| 少妇性生活久久久久久| 亚洲情色国产自拍偷拍| 国产偷拍自拍在线免费| av在线中文字幕资源网| 激情福利视频在线观看| 97 在线免费观看视频| 在线亚洲视频中文字幕| 91草草视频在线观看| 98久久久久久久久久| 亚洲乱码国产一区网址| 日韩素人mium丝袜| 麻豆av 无码精品一区二区| 少妇直播一区二区三区| 国产揄拍视频在线观看| 美女主播性感丝袜热舞| 美女扒开胸罩露出奶头免费| 国产精品久久久久久96| 精品久久久中文字幕人妻| 在线成本人视频动漫高清| 蜜月久久99精品久久久久久| 黄色mv在线免费观看| 亚洲乱码国产一区二区| 亚洲国产精品黑丝美女| 久久久久久久精品女人毛片| 国产欧美久久久久久精品一| 91超碰国产在线观看| 人妻少妇亚洲自拍av| 久久99精品久久久久蜜臀| 久久久久国产AV成人网| 欧美一区久久人妻中文字幕| 掰开我的大黑逼快来操我| 久久一区二区三区av| 婷婷色综合一区二区久久久| 蜜桃av精品视频一区二区三区| 熟女系列丰满熟妇一区二区三区| 午夜不卡在线免费视频| 9999中文字幕在线视频| 很黄很色的视频免费在线观看| 区一区二区三在线播放| 亚洲国产日韩精品欧美| 日韩欧美人妻激情一区| 国产AV无码专区AV麻豆| 国产精品高潮呻吟在线观看| 少妇的诱惑免费观看完整版中文| 中文字幕中文av在线精品| 欧美一区二区三区中文字幕| 精品一片二片三片在线| 欧美 自拍 丝袜 人妻| 日韩国产中文字幕精品| 成人黄色在线免费播放| 色婷婷国产精品免费视频| 97人妻超碰在线免费视频| 免费一级av高潮喷水片特| 亚洲天堂中文av网站| 超碰在线最新地址97| 亚洲av日韩精品久久| 成人国产精品视频在线| 成人在线免费播放视频| 国产熟女人妻在线观看| 免费a站网址在线观看| 5060午夜看片免费| 国产欧美精选自拍视频| 91色乱码一区二区三| 蜜臀av在线一区二区三区四区| 国产午夜精品自拍视频| 亚洲欧美丝袜美腿 综合| 精品熟妇人妻一区二区三区四区| 激情视频 超黄 在线免费| 99re这里有精品免费视频| 网友自拍人妻在线视频| 国产美女扒开粉嫩尿口网站| 欧美激情在线播放一区| 一区二区在线观看免费不卡| 免费国产一区二区三区久久久久久| 中文字幕在线亚洲视频| 猫咪av成人永久网站网址| 男人天堂中文字幕av| 24小时在线免费观看高清视频| 激情五月婷亚洲蜜臀av| 午夜男女爽爽爽爽爽爽爽| 女人日男人30分钟视频| 欧美三级精品三级在线| 97超碰人妻在线观看| 成人黄色免费在线网站| 日本丝袜美腿自拍亚洲| 国产美女视频免费观看网| 国产97自拍视频在线观看| av资源在线中文天堂| 国产自拍视频在线免费| 老熟女 一区二区三区| 区一区二区三在线播放| 色视频在线免费观看视频播放| 国产亚洲精品成人av丝袜| 人妻精品在线观看视频| 久久99久久精品免观看吃奶| 国产免费无码午夜福利蜜臀| av中文在线中文av| 午夜免费在线观看小视频| 国产免费九九久久精品a级| 白乳房天天官网性插视频| 噜噜mm视频在线观看| 黄色的网站免费在线看| 国产精品久久久久九九九九| 国产美女爽到喷出水来视频99| 午夜免费在线观看小视频| 日韩中文字幕人妻一区| 激情视频 超黄 在线免费| 欧美激情精品久久久久久蜜臀| 青青草日韩av在线播放| 撒玛利亚女孩在线观看免费全集 | 国产18精品乱码在线看| 欧美日韩精品欧美日韩| 青青青青免费观看视频| 国产高清亚洲精品视频| 国产亚洲成人精品视频| 久久久久久精品久久久久久| 少妇性生活久久久久久| 美女在线观看免费在线观看| 亚洲国产蜜臀系列在线观看| 亚洲综合国产乱码成人| 蜜臀av夜夜澡人人爽人人| 国产白嫩在线观看视频| 精品一片二片三片在线| 美女制服丝袜高跟诱惑| 最新中文字幕av网站| 欧美成人网另类套图超市| 亚洲国产精品黑丝美女| 欧美激情精品久久久久久蜜臀| 视频一区二区三区日韩欧美| 欧美女奴靠bb唆大鸡巴群交| 国内精品乱码在线观看| 亚洲熟妇色自偷自拍另类图片| 丝袜熟女av一区二区三区| 日韩av在线日韩av日韩av| 日本一区二区三级在线观看| 快速播放国产精品视频| 在线欧美三级在线高清观| 亚洲欧美成人自偷自拍一区| 一本92午夜免费不卡福利片 | 国产精品自拍首页视频| 我想看男人日女人的逼| 自拍偷自拍亚洲精品10p| 国产综合日韩精品欧美| 99re这里只有精品在线| 爽爽爽爽成人观看在线。| 99久久无码精品区二区毛片| 国产熟女丝袜一区二区三区四区| 99re成人精品免费视频| 中文字幕亚洲熟女精品人妻| 国产很黄很色精品久久久| 国内自拍视频在线swag| 国产女老师的诱惑在线播放观看 | 在线观看国产精品av| 99久久国产一区二区三区| 伊人网站免费在线观看| 亚洲国产蜜臀系列在线观看| rct378在线中文字幕| 国产免费无码一区二区视频无码| 超长假大鸡巴从肛门捅到胃视频 | 婷婷色综合一区二区久久久| 国产欧美日韩精品在线| 99re这里有精品免费视频| 国产成人黄色在线观看| 你懂得在线免费观看99| 午夜免费在线观看小视频| 久久久久久狠狠综合一本| 国产性感丝袜美女av| 色婷婷av国产精品欧美| 亚洲一区视频免费在线观看| 成人黄色在线免费播放| 午夜精品一区二区三区在视| 久久成人在线播放视频| 超碰97在线公开观看| 国产极品粉嫩交性大片| 99爱在线精品视频免费看| 欧美日韩亚洲在线另类| 好吊色欧美一区二区三区四区| 蜜臀成人av在线观看| 欧美一区二区三区伦理国产| 久久婷婷色香五月综合激激情| 亚洲精品专区一区二区| 国产精品丝袜熟女一二三| 亚洲中文字幕日韩av| 亚洲精品中文字幕午夜| 大型黄色av网站在线播放观看| 人妻中出中文字幕在线| 亚洲激情av一区二区三区| 黄黄的小视频免费在线播放| 快速播放国产精品视频| 鲁片鲁一区二区三区在线观看| 黑人黄色特级猛男人男人区| 国产真实乱子伦清晰对白| 亚洲成人av中文字幕免费播放| 欧美一区二区三区四区免费| 精品一片二片三片在线| 日韩在线不卡一区在线观看| 精品国产久久三级av| 女人嫩水逼让大鸡巴操免费看| 欧美一区二区国产一区| 97自拍视频国产视频| 黄色十八禁精品无遮挡| 96av国产在线播放| 三上悠亚在线中文字幕| 亚洲精品沙发专享系列av| 午夜秋霞在线免费观看| 一本92午夜免费不卡福利片| 国产欧美精品日韩精品视频专区| 丝袜人妻激情在线视频| 日本熟日本熟妇中文在线观看| 久亚洲国产精品蜜臀尤物| 国产精品久久久久久96| 亚洲一区在线人妻视频| 国产精品永久免费自在线观看| 国产97自拍视频在线观看| 99久久麻豆99久久免费| 成人永久免费激情视频在线 | 丝袜人妻激情在线视频| 97超碰免费观看在线| 毛片久久久久久久久久久| 国产哟av精品色哟哟| 成人在线观看免费视频播放 | 亚洲 综合 欧美 日韩| 在线免费观看青青草av| 高跟丝袜诱惑后入av| 在线成本人视频动漫高清| 久久久精品久久久久久69| 日韩不卡毛片午夜在线看片?| 欧美网址一区二区三区| 精品人妻av中文字幕乱码男同| 丝袜熟女av一区二区三区| 国产精品色哟哟在线观看视频| av性感美女免费在线观看| 尤物欧美一区二区三区| 国产白嫩在线观看视频| 亚洲一区在线人妻视频| 国产黄色av网站在线| 在线播放欧美A在线观看| 精品久久久人妻中文字幕| 午夜dj观看在线观看hd| 欧美在线视频午夜精品| 国产欧美亚洲日本网站| 欧美少妇一区二区三区| 色一情一乱一乱一区91Av| 欧美日韩午夜精品不卡综合| 日韩av一区二区三区四| jizz视频在线观看| 日本免费精品一二三区| 免费av在线网站中文字幕| 黄腔女兵最经典十句话| 自拍亚洲一区欧美另类| 爆乳美女粉嫩阴蒂被插视频| 欧美一区二区三区资源| 超碰人人爱人人爽人人av| 欧美在线视频午夜精品| 熟女大胸白嫩自慰流白浆| 国产原创av在线免费播放| 一道一本av精品久久毛片| 国产欧美精选自拍视频| 成人免费三级在线观看| 国产老人一区av二三区| 一区二区在线播放三区| 欧美性色黄大片人与善| 久久亚洲精品色噜噜狠狠| 国产白嫩在线观看视频| 欧美激情高潮无遮挡男男| 91精品久久久久久久久| 久久综合熟女中文字幕| 国产伦理小视频在线观看| 污污黄色免费在线观看| 无码国模大尺度自拍视频在线看 | 在线观看午夜看亚太视频| 欧美国产精品久久综合| 人妻夜夜爽天天爽欧美色院| 国产精品露脸自拍av| 欧美日韩精品欧美日韩| 成年av网站18不禁| 国产成人av在线精品| 欧美激情精品久久久久久蜜臀| 97人妻免费在线视频| 涩播视频在线观看免费| 老女人乱淫一区二区三区| 久久亚洲精品色噜噜狠狠| 青娱乐成人免费公开视频| 青青青爽综合在线视频| 黄色的网站免费在线看| 在线成人免费观看视频网址| 想神马有神马舞蹈视频| 人妻系列少妇极品熟妇| 青青青草原成人在线视频| 午夜精品福利一区二区蜜股av| 欧美精品免费在线播放| 免费激情视频在线观看| 亚洲欧美另类视频一区蜜臀| 国产美女爽到喷出水来视频99| 日韩性感美女在线观看| 在线成人免费观看视频网址 | 粉嫩av蜜乳av蜜臀av| 中文字幕在线乱码观看| 99人妻精品一区二区三区| 最新中文字幕av网站| 人妻熟女一区二区91| 国产69精品久久久久久妇| 97人妻超碰在线免费视频| 色综合久久综合欧美综合| 久久久久久久98亚洲精品| 色婷婷av国产精品欧美| 男人添女人下边视频免费| 免费av在线网站中文字幕| 国产精品每日更新av| 能看国产小视频的网站| 亚洲自拍偷拍 欧美激情| 成人在线观看免费视频播放| 国产粉精品高潮呻吟久久av| 熟妇人妻av一区二区三| 韩剧熔炉在线完整免费观看| 国内少妇高潮毛片免费看| 欧美三级精品三级在线| 国产爱爱视频在线播放| 日韩av中文在线免费观看| 99久久在线免费观看| 在线观看午夜看亚太视频| 暖爱视频在线观看视频| 国产高清亚洲精品视频| 97人妻免费公开视频| 久久精品人妻免费观看| 久久久综合亚洲av家庭乱搞| 粉嫩av一区在线观看| 国产理论亚洲天堂av| 少妇人妻av毛片在线看| 久久久久人妻精品一区二区三区 | 饥渴少妇高潮露脸嗷嗷叫| 在线人妻av播放观看| 国产av一区二区三区老鸦窝| 亚洲乱女色熟一区二区三区| 97精品免费观看视频| 91偷拍老熟女露脸合集| 超碰在线最新地址97| 亚洲熟女一区二区三区观看| 欧美精品网站在线视频| 青青草原精品在线观看视频| 黄视频免费看网站在线观看| 日产日韩亚洲欧美综合在线| 快速播放国产精品视频| 蜜臀av入口一区二区三区| 国产高清三级在线精品福利| 人妻在卧室被老板疯狂进入| 吖v在线观看欧美一区二区三区| 掰开我的大黑逼快来操我| 91久久精品国产91性色| 天海翼一区二区三区免费| 无码国模大尺度自拍视频在线看| 另类专区日韩有码中文字幕| 精久久中文字幕人妻最新| 国产成年免费观看视频| 成人极品av免费观看| 欧美一区久久人妻中文字幕| 亚洲一区视频在线免费播放| 绿帽老公让娇妻蒙眼被人操| 熟女人妻中文字幕在线看| 日韩人妻久久中文字幕| 中文字幕乱码在线观看| 亚洲欧美一区二区三区黑人| 亚洲三级一区二区三区四区| 国产剧情午夜在线观看| 极品视频在线免费播放| 超碰人妻免费一区二区| 中文字幕人妻少妇久久| 久久精品人妻一区二区| 日韩欧美中文字幕人妻| 激情五月婷亚洲蜜臀av| 国产91情侣在线视频| 国产精品久久久久精品日| 免费激情视频在线观看| 黄色mv在线免费观看| rct378在线中文字幕| 国产深夜视频在线观看| 日韩少妇一区二区三区四区五区| 亚洲综合国产一区二区三区| 国产对白av一区二区| 亚洲欧美成人自偷自拍一区| 蜜月久久99精品久久久久久| 美女午夜写真福利视频| 成人区人妻精品一区二区| 成人黄色精品视频网站| 美女制服丝袜高跟诱惑| 丰满人妻精品一区二区三区| 少妇人妻av毛片在线看| 伊人精品久久久久中文字幕| 99久久精品婷婷久久久久久 | 精品一片二片三片在线| 日本一区二区不卡精品| 18成人黄色在线观看| 青青操新免费观看视频| 最近中文字幕免费mv在线直播| 好想被狂操在线无码视频| 国产亚洲欧洲在线成人| 青草视频在线观看亚洲| 国产香蕉97超级碰碰碰| 久久婷婷香蕉国产精品| 超污短视频网站在线观看| 巨乳人妻中文字幕精品在线| 中文字幕精品久久久乱码乱码| 97超碰在线公开免费| 粉嫩av蜜乳av蜜臀av| 日韩极品视频在线观看免费| 国产精品久久久久久永久牛牛| 在线成人av一区二区| 欧美日韩精品欧美日韩| 国产免费av国片精品| 77成人在线免费视频| 国产很黄很色精品久久久| 国产日韩亚洲精品av| 午夜秘密播放器在线观看视频 | 日韩在线一区二区三区中文字幕 | 国产免费黄色av 网站| 青青青色视频在线观看| 亚洲欧美成人自偷自拍一区| 欧美日韩精品一级二级三级| 在线国产视频精品视频| 岛国av丝袜在线播放| 亚洲乱女色熟一区二区三区 | 一区二区三区在线网址| 丰满人妻一区二区三区精品av| 午夜dj观看在线观看hd| 视频一区二区三区日韩欧美| 日韩人妻久久中文字幕| 午夜精品视频一区二区| 男生把小鸡鸡插到大美女的屁股| 精品一片二片三片在线| 午夜mm1314视频| 青青草原国产视频在线观看| 97超碰在线公开免费| 中文字幕av网址在线| 国产丝袜熟女人妻在线观看| 免费女女同黄毛片av网站| 你懂得在线免费观看99| 三级国产精品久久久99| 国产精品久久人妻互换| 国产精品三级av及在线观看| 丰满人妻熟妇乱又精品视| 亚洲中文字幕一区二区三区av| 日韩情色一区二区三区四区| 午夜免费在线视频国产| 国产免费综合视频在线观看| 日韩不卡毛片午夜在线看片? | 国产精品久久久久久永久牛牛| 高清在线一区二区三区亚洲综合| 5060午夜看片免费| 欧美一区二区免费在线观看| 国产精品99久久啊免费黑人| 国产精品99久久久精品| 夜精品一区二区无码A片| 亚洲精品你懂的在线观看| 色综合久久综合欧美综合| 97资源超碰在线中文| 男生把小鸡鸡插到大美女的屁股 | 亚洲综合国产乱码成人| 岛国av久热中文字幕| 草草视频免费在线观看| 久久热视频在线免费观看| 亚洲乱熟女一区二区三区com| 免费的床上很黄不遮挡视频| 国产av 一区二区三区四区| 欧美熟妇乱色一区二区| 男人把女人捅到爽歪歪黄| 夜夜骚av一区二区三区啊| 国产情侣免费观看视频| 国产一区二区在线97| 欧美一区久久人妻中文字幕| 亚洲欧美一区二区福利| 色综合久久久久久久久8噜啦噜| 69久久久久久人妻白浆| 91在线成人在线视频| 久久精品一区二区东京热| 丰满人妻一区二区三区精品av| 国产精品久久久久精品| 97人妻中出中文字幕| 国产精品成人免费av| 久久精品人妻一区二区| 性做久久久久久久毛片| 蜜臀成人av在线观看| 亚洲真人丝袜av一区二区| jizz视频在线观看| 日韩 国产 欧美 在线 一区| 黄色av在线免费播放| 少妇一区二区三区粉嫩av| 亚洲精品专区一区二区| 国产自拍视频在线免费| 日韩中文字幕人妻诱惑| 亚洲一级二级三级国产av| 3p少妇欧美一区二区三区| 丝袜制服诱惑人妻av| 国产一区二区在线观播放| 国产成人自拍视频网址| 亚洲熟妇色自偷自拍另类图片| 久久综合中文字幕日韩精品 | 午夜精品久久久在线观看| 青青青青免费观看视频| 欧美成人精品一级在线观看| 国产自拍精品在线视频| 亚洲 自拍 露出 极品| 得得的爱在线视频免费观看| 超碰97在线视频观看| 国产精品久久久久久久久91| 国产欧美精品日韩精品视频专区| 欧美精品素人在线观看| 自拍偷拍亚洲综合在线| 97久久久久久久久久久| 午夜在线观看视频你懂的| 95国产成人精品视频| 欧美日韩一区三区不卡在线| 果冻传媒av精品国产网站| 真人视频在线免费观看| 青草视频在线观看亚洲| 中文字幕在线日韩第一精品| 老女人av一区二区三区 | 成人黄色av免费网站| 国产有色视频在线网址| 三级国产精品久久久99| 日韩在线一区二区三区中文字幕| 欧美一区二区三区啪啪另类| 精品一区二区三区四区在线播放| 亚洲无av在线中文字幕男男| 蜜臀av国内精品久久久久久| 天海翼一区二区三区免费| 日韩国产精品99久久久久久| 91国产自拍在线视频| 国产性一交一乱―色―情人| 国产白嫩在线观看视频| 久久久综合亚洲av家庭乱搞| 青青草久久久久综合精品| 欧美午夜理论在线观看| av中文字幕官网天堂| 明日花绮罗人妻大乳av| 视频一区二区三区国产在线| 国模在线一区二区三区| 欧美 亚洲一区二区在线| 日韩成人午夜福利片在线播放| 国产免费无码一区二区视频无码| 亚洲国产精品视频免费看| 国产美女扒开粉嫩尿口网站| 国产剧情午夜在线观看| 欧洲一区二区三区在线播放| 超caopor在线公开视频| 97国产视频在线观看| 久久久久久久久99密月| 成人av在线视频资源| av在线中文字幕资源网| 79久久久久久久久久| 成人黄动漫在线观看网站| 最近中文字幕免费mv在线直播| 青青青青草免费视频看看| 久久99精品久久久久蜜臀| 亚洲无av在线中文字幕男男| AV午夜福利一片免费看久久| 97精品国产高清自在线| 绝美人妻一区二区在线观看| 青青视频在线观看播放观看| 91色乱码一区二区三| 久久热视频在线免费观看| 美女自拍偷拍亚洲一区| 美女国产高潮福利片在线看| 国产av自拍资源网址| 97视频在线观看免费播放| 中文字幕视频观看在线中文| 国产理论亚洲天堂av|