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

GPU和CPU如何混合訓練?大模型訓練的GPU聯手CPU顯存優化分析方法 精華

發布于 2024-9-27 10:09
瀏覽
0收藏

隨著深度學習模型復雜度和數據集規模的增大,計算效率成為了不可忽視的問題。GPU憑借強大的并行計算能力,成為深度學習加速的標配。然而,由于服務器的顯存非常有限,隨著訓練樣本越來越大,顯存連一個樣本都容不下的現象頻頻發生。除了升級硬件(燒錢)、使用分布式訓練(費力),你知道還有哪些方法嗎?即使顯存充足,所有運算都在GPU上執行就是最高效嗎?只要掌握以下小知識,模型訓練的種種問題統統搞定,省時省力省錢,重點是高效


其實CPU和GPU是協同工作的,如果能合理地利用它們各自的優勢,就能夠節省顯存資源(顯存不夠內存來湊),甚至獲得更好的訓練性能。本文為您提供了device_guard接口,只需要一行命令,即可實現GPU和CPU的混合訓練,不僅可以解決訓練模型時通過調整批尺寸(batch size)顯存依然超出的問題,讓原本無法在單臺服務器執行的模型可以訓練,同時本文還給出了提高GPU和CPU混合訓練效率的方法,將服務器資源利用到極致,幫助您提升模型的性能!

一、模型訓練的特點

深度學習任務通常使用GPU進行模型訓練。這是因為GPU相對于CPU具有更多的算術邏輯單元(ALU),可以發揮并行計算的優勢,特別適合計算密集型任務,可以更高效地完成深度學習模型的訓練。GPU模式下的模型訓練如圖1所示,總體可以分為4步:
第1步,將輸入數據從系統內存拷貝到顯存。
第2步,CPU指示GPU處理數據。
第3步,GPU并行地完成一系列的計算。
第4步,將計算結果從顯存拷貝到內存。

GPU和CPU如何混合訓練?大模型訓練的GPU聯手CPU顯存優化分析方法-AI.x社區

圖1 模型訓練示意圖

從圖中可以了解到,雖然GPU并行計算能力優異,但無法單獨工作,必須由CPU進行控制調用;而且顯存和內存之間的頻繁數據拷貝也可能會帶來較大的性能開銷。CPU雖然計算能力不如GPU,但可以獨立工作,可以直接訪問內存數據完成計算。因此,想獲得更好的訓練性能,需要合理利用GPU和CPU的優勢。

二、模型訓練的常見問題

問題一:GPU顯存爆滿,資源不足

你建的模型不錯,在這個簡潔的任務中可能成為新的SOTA,但每次嘗試批量處理更多樣本時,你都會得到一個CUDA RuntimeError:out of memory。


這是因為GPU卡的顯存是非常有限的,一般遠低于系統內存。以V100為例,其顯存最高也僅有32G,甚至有些顯存僅12G左右。因此當模型的參數量較大時,在GPU模式下模型可能無法訓練起來。


設置CPU模式進行模型訓練,可以避免顯存不足的問題,但是訓練速度往往太慢。


那么有沒有一種方法,可以在單機訓練中充分地利用GPU和CPU資源,讓部分層在CPU執行,部分層在GPU執行呢?

問題二:頻繁數據拷貝,訓練效率低

在顯存足夠的情況下,我們可以直接采用GPU模式去訓練模型,但是讓所有的網絡層都運行在GPU上就一定最高效嗎?其實GPU只對特定任務更快,而CPU擅長各種復雜的邏輯運算。框架中有一些OP會默認在CPU上執行,或者有一些OP的輸出會被存儲在CPU上,因為這些輸出往往需要在CPU上訪問。這就會導致訓練過程中,CPU和GPU之間存在數據拷貝。


圖2是CPU和GPU數據傳輸示意圖。假設模型的中間層存在下圖中的4個算子。其中算子A和算子B都在CPU執行,因此B可以直接使用A的輸出。算子C和算子D都在GPU上執行,那么算子D也可以直接使用C的輸出。但是算子B執行完,其輸出在CPU上,在算子C執行時,就會將B的輸出從CPU拷貝到GPU。


頻繁的數據拷貝,也會影響模型的整體性能。如果能把算子A和B設置在GPU上執行,或者算子C和D設置在CPU上執行,避免數據傳輸,或許會提升模型性能。那么應該如何更加合理地為算子分配設備,使得訓練過程更加高效呢?我們需要更綜合地考慮,在發揮GPU和CPU各自計算優勢的前提下,降低數據拷貝帶來的時間消耗。

GPU和CPU如何混合訓練?大模型訓練的GPU聯手CPU顯存優化分析方法-AI.x社區

圖2 CPU和GPU數據傳輸示意圖

三、定義化GPU和CPU混合訓練

上面兩個場景都是希望為模型中的部分層指定運行設備。飛槳提供了fluid.CUDAPlace和fluid.CPUPlace用于指定運行設備,但這兩個接口在指定設備時是二選一的,也就是說要么在GPU模式下訓練,要么在CPU模式下訓練。過去我們無法指定某一部分計算在GPU上執行還是在CPU上執行。飛槳開源框架從1.8版本開始提供了device_guard接口,使用該接口可以為網絡中的計算層指定設備為CPU或者GPU,實現更靈活的異構計算調度。


如何使用device_guard接口解決上面兩個場景中提到的問題呢?接下來,我們看看具體的例子。


好處一:充分利用CPU資源,避免顯存超出

如果使用fluid.CUDAPlace指定了全局的運行設備,飛槳將會自動把支持GPU計算的OP分配在GPU上執行,然而當模型參數量過大并且顯存有限時,很可能會遇到顯存超出的情況。如下面的示例代碼,embedding層的參數size包含兩個元素,第一個元素為vocab_size(詞表大小),第二個為emb_size(embedding層維度)。實際場景中,詞表可能會非常大。示例代碼中,詞表大小被設置為10,000,000,該層創建的權重矩陣的大小為(10000000, 150),僅這一層就需要占用5.59G的顯存。如果再加上其他的網絡層,在這種大詞表場景下,很有可能會顯存超出。

import paddle.fluid as fluid

data = fluid.layers.fill_constant(shape=[1], value=128, dtype='int64')
label = fluid.layers.fill_constant(shape=[1, 150], value=0.5, dtype='float32')
emb = fluid.embedding(input=data, size=(10000000, 150), dtype='float32')
out = fluid.layers.l2_normalize(x=emb, axis=-1)

cost = fluid.layers.square_error_cost(input=out, label=label)
avg_cost = fluid.layers.mean(cost)
sgd_optimizer = fluid.optimizer.SGD(learning_rate=0.001)
sgd_optimizer.minimize(avg_cost)

place = fluid.CUDAPlace(0)
exe = fluid.Executor(place)
exe.run(fluid.default_startup_program())
result = exe.run(fluid.default_main_program(), fetch_list=[avg_cost])

embedding是根據input中的id信息從embedding矩陣中查詢對應embedding信息,它并不是一個計算密度非常高的OP,因此在CPU上進行計算,其速度也是可接受的。如果將embedding層設置在CPU上運行,就能夠充分利用CPU大內存的優勢,避免顯存超出。可以參考如下代碼,使用device_guard將embedding層設置在CPU上。那么,除了embedding層,其他各層都會在GPU上運行。

import paddle.fluid as fluid

data = fluid.layers.fill_constant(shape=[1], value=128, dtype='int64')
label = fluid.layers.fill_constant(shape=[1, 150], value=0.5, dtype='float32')
with fluid.device_guard("cpu"): #一行命令,指定該網絡層運行設備為CPU
    emb = fluid.embedding(input=data, size=(10000000, 150), dtype='float32')
out = fluid.layers.l2_normalize(x=emb, axis=-1)

cost = fluid.layers.square_error_cost(input=out, label=label)
avg_cost = fluid.layers.mean(cost)
sgd_optimizer = fluid.optimizer.SGD(learning_rate=0.001)
sgd_optimizer.minimize(avg_cost)

place = fluid.CUDAPlace(0)
exe = fluid.Executor(place)
exe.run(fluid.default_startup_program())
result = exe.run(fluid.default_main_program(), fetch_list=[avg_cost])

因此,在顯存有限時你可以參考上面的示例將一些計算密度不高的網絡層設置在CPU上避免顯存超出。


好處二:合理設置運行設備,減少數據傳輸

如果你在GPU模式下訓練模型,希望提升訓練速度,那么可以看看模型中是否存在一些不必要的數據傳輸。在文章開頭我們提到CPU和GPU之間的數據拷貝是耗時的,因此如果能夠避免這樣的情況,就有可能提升模型的性能。


在下面的內容中,我們將教你如何通過profile工具分析數據傳輸開銷,以及如何使用device_guard避免不必要的數據傳輸,從而提升模型性能。大致流程如下:

  1. 首先使用profile工具對模型進行分析,查看是否存在GpuMemcpySync的調用耗時。若存在,則進一步分析發生數據傳輸的原因。
  2. 通過Profiling Report找到發生GpuMemcpySync的OP。如果需要,可以通過打印log,找到GpuMemcpySync發生的具體位置。
  3. 嘗試使用device_guard設置部分OP的運行設備,來減少GpuMemcpySync的調用。
  4. 最后比較修改前后模型的Profiling Report,或者其他用來衡量性能的指標,確認修改后是否帶來了性能提升。

步驟1、使用profile工具確認是否發生了數據傳輸

首先我們需要分析模型中是否存在CPU和GPU之間的數據傳輸。在OP執行過程中,如果輸入Tensor所在的設備與OP執行的設備不同,就會自動將輸入Tensor從CPU拷貝到GPU,或者從GPU拷貝到CPU,這個過程是同步的數據拷貝,通常比較耗時。下列示例代碼的14行設置了profile,利用profile工具我們可以看到模型的性能數據。

import paddle.fluid as fluid
import paddle.fluid.compiler as compiler
import paddle.fluid.profiler as profiler

data1 = fluid.layers.fill_constant(shape=[1, 3, 8, 8], value=0.5, dtype='float32')
data2 = fluid.layers.fill_constant(shape=[1, 3, 5, 5], value=0.5, dtype='float32')
shape = fluid.layers.shape(data2)
shape = fluid.layers.slice(shape, axes=[0], starts=[0], ends=[4])
out = fluid.layers.crop_tensor(data1, shape=shape)
place = fluid.CUDAPlace(0)
exe = fluid.Executor(place)
exe.run(fluid.default_startup_program())
compiled_prog = compiler.CompiledProgram(fluid.default_main_program())
with profiler.profiler('All', 'total') as prof:
    for i in range(10):
        result = exe.run(program=compiled_prog, fetch_list=[out])

在上述程序運行結束后,將會自動地打印出下面的Profiling Report,可以看到GpuMemCpy Summary中給出了2項數據傳輸的調用耗時。如果GpuMemCpy Summary中存在GpuMemcpySync,那么就說明你的模型中存在同步的數據拷貝。


進一步分析,可以看到slice和crop_tensor執行中都發生了GpuMemcpySync。我們通過查看網絡的定義,就會發現盡管我們在程序中設置了GPU模式運行,但是shape這個OP將輸出結果存放在CPU上,導致后面在GPU上執行的slice使用這個結果時發生了從CPU到GPU的數據拷貝。slice的輸出結果存放在GPU上,而crop_tensor用到這個結果的參數默認是從CPU上取數據,因此又發生了一次數據拷貝。

------------------------->     Profiling Report     <-------------------------

Note! This Report merge all thread info into one.
Place: All
Time unit: ms
Sorted by total time in descending order in the same thread

Total time: 26.6328
  Computation time       Total: 13.3133     Ratio: 49.9884%
  Framework overhead     Total: 13.3195     Ratio: 50.0116%

-------------------------     GpuMemCpy Summary     -------------------------

GpuMemcpy                Calls: 30          Total: 1.47508     Ratio: 5.5386%
  GpuMemcpyAsync         Calls: 10          Total: 0.443514    Ratio: 1.66529%
  GpuMemcpySync          Calls: 20          Total: 1.03157     Ratio: 3.87331%

-------------------------       Event Summary       -------------------------

Event                                                       Calls       Total       CPU Time (Ratio)        GPU Time (Ratio)        Min.        Max.        Ave.        Ratio.
FastThreadedSSAGraphExecutorPrepare                         10          9.16493     9.152509 (0.998645)     0.012417 (0.001355)     0.025192    8.85968     0.916493    0.344122
shape                                                       10          8.33057     8.330568 (1.000000)     0.000000 (0.000000)     0.030711    7.99849     0.833057    0.312793
fill_constant                                               20          4.06097     4.024522 (0.991025)     0.036449 (0.008975)     0.075087    0.888959    0.203049    0.15248
slice                                                       10          1.78033     1.750439 (0.983212)     0.029888 (0.016788)     0.148503    0.290851    0.178033    0.0668471
GpuMemcpySync:CPU->GPU                                      10          0.45524     0.446312 (0.980388)     0.008928 (0.019612)     0.039089    0.060694    0.045524    0.0170932
crop_tensor                                                 10          1.67658     1.620542 (0.966578)     0.056034 (0.033422)     0.143906    0.258776    0.167658    0.0629515
GpuMemcpySync:GPU->CPU                                      10          0.57633     0.552906 (0.959357)     0.023424 (0.040643)     0.050657    0.076322    0.057633    0.0216398
Fetch                                                       10          0.919361    0.895201 (0.973721)     0.024160 (0.026279)     0.082935    0.138122    0.0919361   0.0345199
GpuMemcpyAsync:GPU->CPU                                     10          0.443514    0.419354 (0.945526)     0.024160 (0.054474)     0.040639    0.059673    0.0443514   0.0166529
ScopeBufferedMonitor::post_local_exec_scopes_process        10          0.341999    0.341999 (1.000000)     0.000000 (0.000000)     0.028436    0.057134    0.0341999   0.0128413
eager_deletion                                              30          0.287236    0.287236 (1.000000)     0.000000 (0.000000)     0.005452    0.022696    0.00957453  0.010785
ScopeBufferedMonitor::pre_local_exec_scopes_process         10          0.047864    0.047864 (1.000000)     0.000000 (0.000000)     0.003668    0.011592    0.0047864   0.00179718
InitLocalVars                                               1           0.022981    0.022981 (1.000000)     0.000000 (0.000000)     0.022981    0.022981    0.022981    0.000862883

步驟2、通過log查看發生數據傳輸的具體位置

有時同一個OP會在模型中被用到很多次,例如可能我們會在網絡的幾個不同位置,都定義了slice層。這時候想要確認究竟是在哪個位置發生了數據傳輸,就需要去查看更加詳細的調試信息,那么可以打印出運行時的log。依然以上述程序為例,執行GLOG_vmodule=operator=3 python test_case.py,會得到如下log信息,可以看到這兩次數據傳輸:

  • 第3~7行log顯示:shape輸出的結果在CPU上,在slice運行時,shape的輸出被拷貝到GPU上
  • 第9~10行log顯示:slice執行完的結果在GPU上,當crop_tensor執行時,它會被拷貝到CPU上。

I0406 14:56:23.286592 17516 operator.cc:180] CUDAPlace(0) Op(shape), inputs:{Input[fill_constant_1.tmp_0:float[1, 3, 5, 5]({})]}, outputs:{Out[shape_0.tmp_0:int[4]({})]}.
I0406 14:56:23.286628 17516 eager_deletion_op_handle.cc:107] Erase variable fill_constant_1.tmp_0 on CUDAPlace(0)
I0406 14:56:23.286725 17516 operator.cc:1210] Transform Variable shape_0.tmp_0 from data_type[int]:data_layout[NCHW]:place[CPUPlace]:library_type[PLAIN] to data_type[int]:data_layout[ANY_LAYOUT]:place[CUDAPlace(0)]:library_type[PLAIN]
I0406 14:56:23.286763 17516 scope.cc:169] Create variable shape_0.tmp_0
I0406 14:56:23.286784 17516 data_device_transform.cc:21] DeviceTransform in, src_place CPUPlace dst_place: CUDAPlace(0)
I0406 14:56:23.286867 17516 tensor_util.cu:129] TensorCopySync 4 from CPUPlace to CUDAPlace(0)
I0406 14:56:23.287099 17516 operator.cc:180] CUDAPlace(0) Op(slice), inputs:{EndsTensor[], EndsTensorList[], Input[shape_0.tmp_0:int[4]({})], StartsTensor[], StartsTensorList[]}, outputs:{Out[slice_0.tmp_0:int[4]({})]}.
I0406 14:56:23.287140 17516 eager_deletion_op_handle.cc:107] Erase variable shape_0.tmp_0 on CUDAPlace(0)
I0406 14:56:23.287220 17516 tensor_util.cu:129] TensorCopySync 4 from CUDAPlace(0) to CPUPlace
I0406 14:56:23.287473 17516 operator.cc:180] CUDAPlace(0) Op(crop_tensor), inputs:{Offsets[], OffsetsTensor[], Shape[slice_0.tmp_0:int[4]({})], ShapeTensor[], X[fill_constant_0.tmp_0:float[1, 3, 8, 8]({})]}, outputs:{Out[crop_tensor_0.tmp_0:float[1, 3, 5, 5]({})]}.

步驟3、使用device_guard避免不必要的數據傳輸

在上面的例子中,shape輸出的是一個1-D的Tensor,因此在slice執行時,計算代價相對于數據傳輸代價或許是更小的。如果將slice設置在CPU上運行,就可以避免2次數據傳輸,那么是不是有可能提升模型速度呢?我們嘗試修改程序,將slice層設置在CPU上執行:

import paddle.fluid as fluid
import paddle.fluid.compiler as compiler
import paddle.fluid.profiler as profiler

data1 = fluid.layers.fill_constant(shape=[1, 3, 8, 8], value=0.5, dtype='float32')
data2 = fluid.layers.fill_constant(shape=[1, 3, 5, 5], value=0.5, dtype='float32')
shape = fluid.layers.shape(data2)
with fluid.device_guard("cpu"): # 一行命令,指定該網絡層運行設備為CPU
    shape = fluid.layers.slice(shape, axes=[0], starts=[0], ends=[4])
out = fluid.layers.crop_tensor(data1, shape=shape)
place = fluid.CUDAPlace(0)
exe = fluid.Executor(place)
exe.run(fluid.default_startup_program())
compiled_prog = compiler.CompiledProgram(fluid.default_main_program())
with profiler.profiler('All', 'total') as prof:
    for i in range(10):
        result = exe.run(program=compiled_prog, fetch_list=[out])

步驟4、比較修改前后模型,確認是否帶來性能提升

再次觀察Profiling Report 中GpuMemCpy Summary的內容,可以看到GpuMemCpySync 這一項已經被消除了。同時注意到,下面的Total time為 14.5345 ms,而修改前是26.6328 ms,速度提升一倍! 此實驗說明使用device_guard避免數據傳輸后,示例模型的性能有了明顯的提升。


在實際的模型中,若GpuMemCpySync調用耗時占比較大,并且可以通過設置device_guard避免,那么就能夠帶來一定的性能提升。

------------------------->     Profiling Report     <-------------------------

Note! This Report merge all thread info into one.
Place: All
Time unit: ms
Sorted by total time in descending order in the same thread

Total time: 14.5345
  Computation time       Total: 4.47587     Ratio: 30.7948%
  Framework overhead     Total: 10.0586     Ratio: 69.2052%

-------------------------     GpuMemCpy Summary     -------------------------

GpuMemcpy                Calls: 10          Total: 0.457033    Ratio: 3.14447%
  GpuMemcpyAsync         Calls: 10          Total: 0.457033    Ratio: 3.14447%

-------------------------       Event Summary       -------------------------

Event                                                       Calls       Total       CPU Time (Ratio)        GPU Time (Ratio)        Min. Max.        Ave.        Ratio.
FastThreadedSSAGraphExecutorPrepare                         10    7.70113     7.689066 (0.998433)     0.012064 (0.001567)     0.032657    7.39363     0.770113    0.529852
fill_constant                                               20          2.62299     2.587022 (0.986287)     0.035968 (0.013713)     0.071097    0.342082    0.13115     0.180466
shape                                                       10          1.93504     1.935040 (1.000000)     0.000000 (0.000000)     0.026774    1.6016      0.193504    0.133134
Fetch                                                       10          0.880496    0.858512 (0.975032)     0.021984 (0.024968)     0.07392     0.140896    0.0880496   0.0605797
GpuMemcpyAsync:GPU->CPU                                     10        0.457033    0.435049 (0.951898)     0.021984 (0.048102)     0.037836    0.071424    0.0457033   0.0314447
crop_tensor                                                 10          0.705426    0.671506 (0.951916)     0.033920 (0.048084)     0.05841     0.123901    0.0705426   0.0485346
slice                                                       10          0.324241    0.324241 (1.000000)     0.000000 (0.000000)     0.024299    0.07213     0.0324241   0.0223084
eager_deletion                                              30          0.250524    0.250524 (1.000000)     0.000000 (0.000000)     0.004171    0.016235    0.0083508   0.0172365
ScopeBufferedMonitor::post_local_exec_scopes_process        10   0.047794    0.047794 (1.000000)     0.000000 (0.000000)     0.003344    0.014131    0.0047794   0.00328831
InitLocalVars                                               1           0.034629    0.034629 (1.000000)     0.000000 (0.000000)     0.034629    0.034629    0.034629    0.00238254
ScopeBufferedMonitor::pre_local_exec_scopes_process         10   0.032231    0.032231 (1.000000)     0.000000 (0.000000)     0.002952    0.004076    0.0032231   0.00221755

總結

通過以上實驗對比可以發現,device_guard接口能夠做到一條命令即可合理設置模型網絡層的運行設備,對模型進行GPU和CPU計算的更靈活調度,將服務器的資源利用到極致,解決顯存容量捉襟見肘導致模型無法訓練的問題。怎么樣,這個功能是不是相當實用!心動不如心動,快快參考本文的方法,盡情訓練自己的模型吧!


本文轉自 AI生成未來 ,作者:嫖姚


原文鏈接:??https://mp.weixin.qq.com/s/gFzCFwTSeqLdinHrU5ISig??

收藏
回復
舉報
回復
相關推薦
久久精品一二三区| 97精品国产97久久久久久免费| 日韩精品无码一区二区三区免费| 九色网友自拍视频手机在线| 久久er精品视频| 欧美疯狂做受xxxx高潮| 精品成人av一区二区三区| 久久爱.com| 亚洲国产成人91porn| 日本一区二区在线| 超碰在线人人干| 视频一区中文字幕国产| 欧美精品电影在线| 精品熟妇无码av免费久久| 国产精品丝袜在线播放| 欧美日韩中字一区| 妞干网在线观看视频| av资源种子在线观看| 成人深夜在线观看| 国产美女被下药99| 6080午夜伦理| 99国产精品私拍| 最新的欧美黄色| 欧美精品欧美极品欧美激情| 欧美精品影院| 欧美日韩亚洲综合一区| 久久久久久久久久久福利| 亚洲第一图区| 中文字幕视频一区二区三区久| 精品国产免费久久久久久尖叫| 91精品国自产| 免费国产亚洲视频| 日韩男女性生活视频| 日韩欧美视频在线免费观看| 中文字幕一区二区三区久久网站| 最近2019中文字幕mv免费看| 中文字幕免费高清| 欧美一级二级三级视频| 精品日韩在线一区| 日本亚洲一区二区三区| 国产精品免费精品自在线观看| 欧洲精品视频在线观看| 国内外成人免费激情视频| √最新版天堂资源网在线| 亚洲精品日日夜夜| 成年丰满熟妇午夜免费视频| 老司机午夜在线视频| 中文字幕精品一区二区三区精品| 欧美精品二区三区四区免费看视频| 国产成人手机在线| 岛国精品一区二区| 99在线影院| www.黄色一片| 成人av在线看| 精品无人乱码一区二区三区的优势| 亚洲精品国偷拍自产在线观看蜜桃| 韩国理伦片一区二区三区在线播放 | 亚洲精品免费一区亚洲精品免费精品一区 | 欧美亚洲国产另类| 久久精品无码av| 久久久久国产精品一区三寸| 国产成人极品视频| 中文字幕人成人乱码亚洲电影| 日韩精品一二三区| 国产精品亚发布| 97av免费视频| 懂色av一区二区夜夜嗨| 高清av免费一区中文字幕| 免费的黄色av| 26uuu另类欧美亚洲曰本| 欧美一区激情视频在线观看| 成人午夜在线观看视频| 国产精品盗摄一区二区三区| 日韩欧美一级在线| 国产福利电影在线播放| 91成人在线精品| 不用播放器的免费av| 哺乳挤奶一区二区三区免费看| 欧美精品一区二区在线播放| 亚洲第一页av| 色爱综合网欧美| 欧美大片免费看| jizz国产在线观看| 精品写真视频在线观看| 国产欧美一区二区三区另类精品| 国产专区在线| 亚洲人成亚洲人成在线观看图片| 日日摸日日碰夜夜爽无码| 深夜视频一区二区| 日韩亚洲欧美中文三级| 国产毛片久久久久久久| 国产精品久久久乱弄| 久久免费精品视频| 进去里视频在线观看| 国产成人av电影免费在线观看| 免费久久久一本精品久久区| 浪潮av一区| 欧美午夜久久久| 日本人dh亚洲人ⅹxx| 国产99久久久国产精品成人免费| 久久伊人91精品综合网站| 亚洲天堂视频网站| 国产高清精品网站| 日韩精品久久一区二区三区| 国产精品69xx| 欧美一区二区三区在线电影| 亚洲成人日韩在线| 欧美激情性爽国产精品17p| 国产成人一区二区三区电影| 性做久久久久久久久久| 国产色爱av资源综合区| 欧美日韩性生活片| 91亚洲精品在看在线观看高清| 亚洲精品久久久久国产| 久久精品一区二区三| 另类中文字幕网| 欧美精品七区| av资源在线| 日韩女优毛片在线| 美国精品一区二区| 久久精品亚洲一区二区| 精品国产综合| 免费毛片在线看片免费丝瓜视频| 欧美日韩在线播放一区| 白白色免费视频| 日韩午夜激情| 高清视频一区二区三区| 最近中文字幕免费mv2018在线| 欧美色倩网站大全免费| 国产真人做爰视频免费| 性一交一乱一区二区洋洋av| 国产成人免费电影| 天天色天天射天天综合网| 欧美军同video69gay| 国产18无套直看片| 丝袜脚交一区二区| 久久久久欧美| 欧美男人天堂| 日韩精品中文字幕在线| 国产午夜在线播放| 99久久久免费精品国产一区二区| 久久人人爽人人爽人人av| 精品国产伦一区二区三区观看说明 | 欧美午夜电影在线播放| 免费看91的网站| 日韩成人免费看| 丝袜美腿玉足3d专区一区| 午夜欧美巨大性欧美巨大| 亚洲精品一区av在线播放| 国产99久久久| 国产日韩欧美高清| 第四色婷婷基地| 久久看人人摘| 成人黄色av网站| 成人福利网站| 精品不卡在线视频| 国产一区二区视频播放| 日本美女bbw| 极品av少妇一区二区| 动漫美女被爆操久久久| 蜜桃视频在线观看免费视频| 日韩h在线观看| 波多野结衣不卡| 国产精品你懂的在线| 一级黄色片在线免费观看| 在线中文字幕亚洲| 国产一区二区不卡视频| 欧美电影免费观看高清完整| 在线视频亚洲欧美| 国产av无码专区亚洲a∨毛片| 亚洲精品欧美专区| 99久久人妻精品免费二区| 久久一区国产| 中文字幕av日韩精品| 视频一区日韩精品| 欧美又大又粗又长| 免费黄色在线| 亚洲第一av在线| 国产精品传媒在线观看| 亚洲乱码国产乱码精品精可以看| 538国产视频| 免费人成精品欧美精品| 人人妻人人澡人人爽欧美一区双| 亚洲激情77| 成人网在线视频| 美女扒开腿让男人桶爽久久软| 搡老女人一区二区三区视频tv| 国模私拍视频在线| 欧美中文字幕一区二区三区亚洲| 日本中文字幕免费在线观看| 91视频在线看| 欧美在线a视频| 精品久久久久久久久久久国产字幕| 国产乱国产乱300精品| 男人日女人下面视频| 97偷自拍亚洲综合二区| 精品无人乱码一区二区三区的优势| 人人玩人人添人人澡欧美| 久久99久久99精品中文字幕| 青青久在线视频免费观看| 欧美人与z0zoxxxx视频| 99精品在线播放| 亚洲精品写真福利| 国产精品视频在| 91视频免费看| 成人做爰69片免费| 蜜桃av一区二区| aⅴ在线免费观看| 国产综合自拍| 国产成人三级视频| 欧美艳星介绍134位艳星| 久久精品日韩精品| 粉嫩久久久久久久极品| 成人激情视频在线观看| 亚洲精品555| 91国产视频在线播放| 在线不卡日本v二区707| 日韩一区二区三区xxxx| 黄色大片在线免费观看| 日韩av在线免费观看| 国产精品51麻豆cm传媒| 日韩欧美国产网站| 国产成人亚洲精品自产在线| 一区二区三区**美女毛片| 国产精品久久久免费看| 国产日韩高清在线| 国产精品一二三区在线观看| 久久先锋资源网| 精品黑人一区二区三区观看时间| 成人少妇影院yyyy| 粗大的内捧猛烈进出视频| 国产九九视频一区二区三区| 57pao国产成永久免费视频| 欧美96一区二区免费视频| 欧美 日韩精品| 一区二区三区四区五区精品视频 | 国产精品最新自拍| 丝袜人妻一区二区三区| 伊人久久成人| 欧美国产综合在线| 亚洲第一黄网| 欧美日韩一道本| 最新亚洲一区| 777久久久精品一区二区三区| 99在线精品视频在线观看| www.射射射| 香蕉久久夜色精品国产| aa免费在线观看| 视频一区中文字幕| 天天干天天爽天天射| 蜜桃精品在线观看| 成年人三级黄色片| 国产最新精品免费| 波多野吉衣在线视频| 懂色av一区二区夜夜嗨| 久久人妻少妇嫩草av无码专区 | 久久精品午夜一区二区福利| 妖精视频一区二区三区免费观看 | 99久久久久久中文字幕一区| 亚洲国产精品影视| 好吊一区二区三区| 欧美日韩亚洲一| 青青草国产精品亚洲专区无| 999在线观看| 国产精品456| 中文文字幕文字幕高清| 日本一区二区在线不卡| 国产美女久久久久久| 亚洲线精品一区二区三区| 可以在线观看av的网站| 欧美亚洲动漫另类| av网站免费播放| 亚洲激情免费观看| 第一视频专区在线| 九九热视频这里只有精品| 国产美女高潮在线| 国产日韩欧美影视| 成人性生交大片免费看中文视频 | 黄色在线免费观看大全| 日韩一区av在线| 理论不卡电影大全神| 国产精品日韩久久久久| 欧美午夜网站| 日本一区二区三区四区高清视频| 亚洲精品二区三区| 99精品免费在线观看| 精品一区二区三区免费毛片爱| 亚洲成年人在线观看| 国产欧美日韩三区| 国产亚洲第一页| 欧洲一区在线电影| 性生活视频软件| 在线观看中文字幕亚洲| 草美女在线观看| 成人精品在线视频| 女优一区二区三区| 日韩视频一二三| 日韩中文欧美在线| 在线xxxxx| 亚洲日本成人在线观看| 中文字幕在线观看视频免费| 日韩一区二区影院| 1024国产在线| 国产91成人video| 日韩欧美高清一区二区三区| 五月天色一区| 午夜宅男久久久| 国产成人av免费观看| 中文字幕一区二区三区在线播放| 五月激情六月丁香| 亚洲国产精彩中文乱码av在线播放| 欧美激情办公室videoshd| 日韩av123| 偷窥自拍亚洲色图精选| 国产精品videossex国产高清| 蜜臀久久99精品久久久画质超高清 | 黄色国产一级视频| 国产高清一区日本| 亚洲怡红院在线观看| 欧美视频中文字幕| 免费黄网站在线观看| 97精品免费视频| 亚洲精品一区国产| 超碰人人爱人人| 国产精品综合在线视频| 久久99久久99精品免费看小说| 欧美三级韩国三级日本三斤 | 久久久久国产成人精品亚洲午夜 | 91精品福利在线| 日漫免费在线观看网站| 97国产精品视频| www.爱久久| 精品少妇人欧美激情在线观看| 国产传媒久久文化传媒| 免费在线看黄网址| 日韩欧美中文字幕精品| 伊人手机在线| 97netav| 欧美视频二区| 国产在线不卡av| 亚瑟在线精品视频| 天天干视频在线观看| 97色在线播放视频| 香蕉视频一区二区三区| 久久国产亚洲精品无码| 91视频xxxx| 在线免费观看国产精品| 一本色道久久综合狠狠躁篇怎么玩 | 欧美va天堂| av在线天堂网| 午夜私人影院久久久久| 日韩亚洲视频在线观看| 国产成+人+综合+亚洲欧洲| 国产一区二区三区网| 国产小视频精品| 亚洲蜜臀av乱码久久精品蜜桃| www.日日夜夜| 久久久亚洲成人| 蜜桃国内精品久久久久软件9| 男人的天堂日韩| 中文字幕一区不卡| www香蕉视频| 日本精品视频在线| 日韩一区二区在线免费| 又黄又爽又色的视频| 亚洲成人精品一区| 国产免费视频在线| 91丨九色丨国产在线| 99视频在线精品国自产拍免费观看| 国产福利短视频| 欧美日韩成人一区二区| 男男gaygays亚洲| 欧美一区二区三区成人久久片| 久久成人羞羞网站| 国产精彩视频在线| 国产亚洲福利一区| 日韩影片在线观看| 春日野结衣av| 亚洲欧美怡红院| 香蕉国产在线视频| 国产日韩专区在线| av成人天堂| 娇小11一12╳yⅹ╳毛片| 亚洲第一页在线| 久久久久伊人| 欧美啪啪免费视频| 中文字幕日韩欧美一区二区三区| 亚洲女人18毛片水真多| 国产经典一区二区| 亚洲小说欧美另类社区| 东京热无码av男人的天堂| 精品日韩成人av| 福利一区二区三区视频在线观看| 国产精品国产三级国产专区51| 国产亚洲欧美一区在线观看| 精品国产亚洲av麻豆| 国产精品久久久久久超碰| 怡红院精品视频在线观看极品| 东京热无码av男人的天堂| 亚洲国产精品人人爽夜夜爽|