国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

詳解:深度學習框架數(shù)據(jù)Pipeline設(shè)計

共 12096字,需瀏覽 25分鐘

 ·

2021-03-05 22:05

↑ 點擊藍字 關(guān)注極市平臺

作者丨清華大學軟件學院 袁秀龍(已授權(quán))
來源丨h(huán)ttps://zhuanlan.zhihu.com/p/353373735
編輯丨極市平臺

極市導讀

 

隨著GPU算力越來越強,對于數(shù)據(jù)處理Pipeline的效率也提出了越來越高的要求。本文整理分析了Pytorch的數(shù)據(jù)Pipeline、MindSpore && Tensorflow的local數(shù)據(jù)處理pipeline、Tensorflow中的分布式數(shù)據(jù)處理Pipeline >>加入極市CV技術(shù)交流群,走在計算機視覺的最前沿

前言

過去的雙月我一直在做訓練框架中數(shù)據(jù)模塊的工作。核心目的在于優(yōu)化IO的效率和預處理的加速,致力于支持更多更豐富的數(shù)據(jù)處理方式,以及提升整個數(shù)據(jù)處理的pipeline的效率。隨著日后GPU算力越來越強,對于數(shù)據(jù)處理Pipeline的效率也提出了越來越高的要求。于是在雙月的結(jié)束整理分析各個框架數(shù)據(jù)處理pipeline的設(shè)計。

以下文章第一節(jié),第二節(jié)主要參考MindSpore架構(gòu)師金雪峰的文章,這部分內(nèi)容文章里面寫得很全了,基本把我所想表達整理的內(nèi)容全部寫了。

金雪鋒:AI框架中數(shù)據(jù)處理的挑戰(zhàn)與解決思路

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

一、AI框架中的數(shù)據(jù)處理

深度學習框架核心三大件事:數(shù)據(jù),計算和通信。數(shù)據(jù)模塊主要包括數(shù)據(jù)讀取(IO密集型)和數(shù)據(jù)變換(CPU密集型)。典型的訓練數(shù)據(jù)處理流程如下圖所示:

圖片來自于 https://zhuanlan.zhihu.com/p/352487023

加載:指從各種異構(gòu)存儲中將訓練數(shù)據(jù)加載到內(nèi)存中,加載時涉及數(shù)據(jù)的IO、解碼等處理;目前一般都會從HDFS中或者OBS中讀取序列化存儲的數(shù)據(jù),并在內(nèi)存中進行解析校驗。

Shuffle:訓練一般是多個epoch,通過shuffle打亂數(shù)據(jù)集不同epoch的數(shù)據(jù)排序,防止訓練過擬合。如果數(shù)據(jù)集支持隨機訪問,則只需按不同順序隨機選擇數(shù)據(jù)就可以非常有效地進行混洗shuffle。如果數(shù)據(jù)集不支持隨機訪問(或僅部分隨機訪問像多個文件對象),那么一個子集的數(shù)據(jù)可以加載到一個特殊的混洗緩沖區(qū)shuffle buffer中。

map:完成訓練數(shù)據(jù)的預處理工作。map為數(shù)據(jù)集算子,表示對整個數(shù)據(jù)集的變換操作。這是tensorflow和mindspore這類框架的算子抽象模式。在pytorch中,更多是以單個數(shù)據(jù)為粒度的處理算子。

batch:數(shù)據(jù)的batch邏輯處理。

repeat:可以通過repeat的方式增加訓練的總數(shù)據(jù)量;一次repeat就是加載一遍整個訓練集。

模型在進行推理時,同樣會涉及到數(shù)據(jù)處理,不同的是推理時一般加載單樣本進行處理,而非數(shù)據(jù)集。典型的過程如下圖所示:

圖片來自于https://zhuanlan.zhihu.com/p/352487023

二、難點與挑戰(zhàn)

2.1 數(shù)據(jù)處理的高效性

當前各AI框架的數(shù)據(jù)處理主要利用CPU運算,訓練則利用GPU/AI芯片,兩者是并行的。理想情況下,應該在每輪迭代開始前,就準備好完成增強之后的數(shù)據(jù),保持訓練過程持續(xù)地進行。然而在實際的訓練中,很多時候數(shù)據(jù)處理成為了阻礙性能提升的瓶頸:或是因為從存儲中讀取數(shù)據(jù)的速度不足(I/O bound),或是因為數(shù)據(jù)增強操作效率過低(CPU bound)。

根據(jù)黃氏定律,GPU/AI芯片的算力每一年會提升一倍,相比于即將失效的摩爾定律,AI芯片的算力提升速度會遠大于CPU。模型迭代計算效率的不斷提升,對數(shù)據(jù)處理也提出了更高的要求:數(shù)據(jù)處理過程必須足夠高效,才能夠避免GPU/AI芯片因為等待訓練數(shù)據(jù)而空閑。

2.2 數(shù)據(jù)處理的靈活性

數(shù)據(jù)處理的靈活性挑戰(zhàn)主要體現(xiàn)在以下兩個方面:

  • 多源數(shù)據(jù)集讀取

多源數(shù)據(jù)集讀取主要有兩種情況

  1. 不同數(shù)據(jù)源有著不同的格式。
  2. 在一個訓練數(shù)據(jù)處理pipeline中涉及到不同數(shù)據(jù)源數(shù)據(jù)讀取處理如下圖所示

針對問題1目前常規(guī)的解決方案主要有針對不同的數(shù)據(jù)源定制相應的Reader和數(shù)據(jù)打包成統(tǒng)一格式,兩種解決方案。問題2在tensorflow這種場景下不會成為大的問題,但是在pytorch中遇到這樣的問題就需要特殊的處理,避免不同數(shù)據(jù)源的數(shù)據(jù)讀取變成串行讀取。

  • 數(shù)據(jù)增強算法非常靈活,需要框架提供足夠易用的接口來支持用戶定制數(shù)據(jù)處理過程

為了方便算法工程師快速的實驗各種預處理方法,算法框架要允許算法工程師輕易的增加新的預處理算子。但是數(shù)據(jù)pipeline的靈活性常常和效率是一對矛盾的點,很難兼顧二者。想要高效基本都需要底層C++實現(xiàn)算子,但是這對靈活性帶來了麻煩。pytorch很靈活,但是做到高效需要做很多二次開發(fā)。

三、現(xiàn)有的框架中的數(shù)據(jù)pipeline流程

接下來我們介紹一下現(xiàn)存框架的數(shù)據(jù)pipeline,我們核心關(guān)心的是pipeline的靈活性和高效性設(shè)計。靈活性體現(xiàn)在要允許算法工程師靈活的自定義算子,降低開發(fā)的成本,高效性體現(xiàn)在要能夠可拓展,能夠高性能。沒錯,這是一個既要,又要,還要的問題。

Pytorch的數(shù)據(jù)Pipeline設(shè)計與實現(xiàn)

Pytorch的pipeline設(shè)計整體比較清晰明了,所以我們首先拿他開刀。接下來的內(nèi)容中我主要依據(jù)我的這篇博客為主進行介紹,限于篇幅,這篇文章中主要以圖片為主。

大龍:Pytorch數(shù)據(jù)Pipeline設(shè)計總結(jié)

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

關(guān)于Pytorch,我們首先介紹其數(shù)據(jù)Pipeline的抽象: Sampler, Dataset, Dataloader, DataloaderItor四個層次,其關(guān)系如下圖所示。Sampler負責生成讀取處理的數(shù)據(jù)Index序列,Dataset模塊負責定義是數(shù)據(jù)的加載和預處理,DataloaderItor負責進行單進程/多進程數(shù)據(jù)處理的管理,Dataloader則負責最高層的用戶交互。

從pipeline的靈活性上講,pytorch無疑是最靈活的,因為本身就是純python的實現(xiàn),自然對算法工程師來講靈活定制成本最低,我們接下來介紹pipeline的高效性設(shè)計。pytorch中支持多進程數(shù)據(jù)加載,其核心流程圖如下所示。

由主進程生成采樣序列,放到各個讀取進程的index隊列中,每個進程讀取處理完數(shù)據(jù)之后,把數(shù)據(jù)通過進程間隊列result_queue來傳給主進程,主進程中的子線程對數(shù)據(jù)做簡單的處理(在pytorch中主要是pin memory的操作,加快CPU到GPU的數(shù)據(jù)拷貝)。主線程從數(shù)據(jù)隊列中讀取數(shù)據(jù)返回給模型進行。

MindSpore && Tensorflow的local數(shù)據(jù)處理pipeline

MindSpore和TF中的pipeline設(shè)計比較像,故在此一并介紹。這兩個框架中的pipeline的設(shè)計思想我是非常喜歡的。其核心是把數(shù)據(jù)處理算子處理抽象為了兩類:數(shù)據(jù)集算子和Tensor算子。數(shù)據(jù)集算子主要負責計算資源的調(diào)度和輸入輸出的控制,Tensor算子負責具體的數(shù)據(jù)增強的計算。一段典型的數(shù)據(jù)tensorflow預處理代碼如下所示:

import tensorflow as tf import tensorflow_addons as tfa from tensorflow.keras.applications.resnet50 import ResNet50 from tensorflow.keras.layers.experimental import preprocessing def get_dataset(batch_size):     # parse TFRecord     def parse_image_function(example_proto):         image_feature_description =             {'image': tf.io.FixedLenFeature([], tf.string),             'label': tf.io.FixedLenFeature([], tf.int64)}         features = tf.io.parse_single_example(                       example_proto, image_feature_description)         image = tf.io.decode_raw(features['image'], tf.uint8)         image.set_shape([3 * 32 * 32])         image = tf.reshape(image, [32, 32, 3])         label = tf.cast(features['label'], tf.int32)         return image, label     # dilation filter     def dilate(image, label):         dilateFilter = tf.zeros([3, 3, 3], tf.uint8)         image = tf.expand_dims(image, 0)         image = tf.nn.dilation2d(                     image, dilateFilter, strides=[1, 1, 1, 1],                     dilations=[1, 1, 1, 1],                     padding='SAME',                      data_format='NHWC')         image = tf.squeeze(image)         return image, label     # blur filter     def blur(image, label):         image = tfa.image.gaussian_filter2d(image=image,                             filter_shape=(11, 11), sigma=0.8)         return image, label     # rescale filter     def rescale(image, label):         image = preprocessing.Rescaling(1.0 / 255)(image)         return image, label     # augmentation filters     def augment(image, label):         data_augmentation = tf.keras.Sequential(            [preprocessing.RandomFlip("horizontal"),             preprocessing.RandomRotation(0.1),             preprocessing.RandomZoom(0.1)])         image = data_augmentation(image)         return image, label     autotune = tf.data.experimental.AUTOTUNE     options = tf.data.Options()     options.experimental_deterministic = False     records = tf.data.Dataset.list_files('data/*',                              shuffle=True).with_options(options)     # load from TFRecord files     ds = tf.data.TFRecordDataset(records,                   num_parallel_reads=autotune).repeat()     ds = ds.map(parse_image_function, num_parallel_calls=autotune)     ds = ds.map(dilate, num_parallel_calls=autotune)     ds = ds.map(blur, num_parallel_calls=autotune)     ds = ds.batch(batch_size)     ds = ds.map(rescale,num_parallel_calls=autotune)     ds = ds.map(augment, num_parallel_calls=autotune)     ds = ds.prefetch(autotune)     return ds if __name__ == "__main__":         model = ResNet50(weights=None,                      input_shape=(32, 32, 3),                      classes=10)     model.compile(loss=tf.losses.SparseCategoricalCrossentropy(),                   optimizer=tf.optimizers.Adam())     dataset = get_dataset(batch_size = 1024)     model.fit(dataset, steps_per_epoch=100, epochs=10))

整體實際上是采用了類似于Spark中RDD這樣的處理思想:對數(shù)據(jù)集進行變換
通過map函數(shù)中傳入各種處理算子(實際上對于Tensorflow底層的節(jié)點來說,就是一個C++函數(shù)調(diào)用鏈),我們構(gòu)建了一個計算圖。計算圖上的每個節(jié)點定義了對數(shù)據(jù)集的處理操作,每個節(jié)點輸入是一個Dataset,變換后輸出仍然是一個Dataset。所以Dataset是tensorflow中處理的基礎(chǔ)核心概念。我們查看MapDatasetOp的源碼會發(fā)現(xiàn),Map的核心輸入是一個Dataset,輸出是一個Dataset,操作是一個Opcontext。

class MapDatasetOp : public UnaryDatasetOpKernel {  public:   static constexpr const char* const kDatasetType = "Map";   static constexpr const char* const kInputDataset = "input_dataset";   static constexpr const char* const kOtherArguments = "other_arguments";   static constexpr const char* const kFunc = "f";   static constexpr const char* const kTarguments = "Targuments";   static constexpr const char* const kOutputTypes = "output_types";   static constexpr const char* const kOutputShapes = "output_shapes";   static constexpr const char* const kUseInterOpParallelism =       "use_inter_op_parallelism";   static constexpr const char* const kPreserveCardinality =       "preserve_cardinality";    explicit MapDatasetOp(OpKernelConstruction* ctx);   protected:   void MakeDataset(OpKernelContext* ctx, DatasetBase* input,                    DatasetBase** output) override;   private:   class Dataset;   std::shared_ptr<FunctionMetadata> func_metadata_ = nullptr;   DataTypeVector output_types_;   std::vector<PartialTensorShape> output_shapes_;   bool preserve_cardinality_; };

以MindSpore為例子,其數(shù)據(jù)處理pipeline如下圖所示(圖片來源于此:https://zhuanlan.zhihu.com/p/352487023)。這樣抽象的好處在于各個Map算子處理的計算資源解耦。對于處理速度慢的算子我們可以分配更多的計算資源,對于處理速度快的算子我們可以分配更少的計算資源。因為在我們的Dolphin中很明顯的發(fā)現(xiàn),不同的算子耗時差異非常大。更合理的講我們就需要對不同的算子給不同的計算資源,來加速整個預處理。

從訓練的可復現(xiàn)性上講,Tensorflow和MindSpore采用了各自的保序處理。整個數(shù)據(jù)訓練的數(shù)據(jù)保序是通過遞歸算子保序來保證的,即對于一個Map算子來說,保序性意味著輸出的數(shù)據(jù)和輸入的數(shù)據(jù)的順序要一致,如果所有的Map算子都能保證這一點,那么整體來講模型獲得的數(shù)據(jù)順序就是保序的。

MindSpore中使用統(tǒng)一抽象的Connector來處理,Tensorflow中則在各個Map算子中用鎖和異步等待來完成保序處理。

MindSpore中Connector的核心目的就是保證輸出的順序和輸入的順序保持一致。其源碼中的Push和Pop的實現(xiàn)代碼如下所示:

virtual Status Pop(int32_t worker_id,  // The worker-id of the caller. See the requirement at the top of this file.                      T *result) noexcept {     {       MS_ASSERT(worker_id < num_consumers_);       std::unique_lock<std::mutex> lk(m_);       RETURN_IF_NOT_OK(cv_.Wait(&lk, [this, worker_id]() { return expect_consumer_ == worker_id; }));       RETURN_IF_NOT_OK(queues_[pop_from_]->PopFront(result));       pop_from_ = (pop_from_ + 1) % num_producers_;       out_buffers_count_++;       expect_consumer_ = (expect_consumer_ + 1) % num_consumers_;     }      cv_.NotifyAll();     return Status::OK();   }    // Add an element into the DbConnector without the overhead of synchronization.   // It may block when the internal queue is full.   // The element passed to this function will be copied into the internal queue.   // @param worker_id The id of a worker thread calling this method.   // @param el A const lvalue element to be passed/added/pushed.   Status Push(int32_t worker_id, const T &el) noexcept {     MS_ASSERT(worker_id < static_cast<int32_t>(queues_.size()));     MS_ASSERT(queues_[worker_id] != nullptr);     return (queues_[worker_id]->Add(el));   }

天下沒有免費的午餐,上述的pipeline我認為基本上從效率上來講,是local能夠?qū)崿F(xiàn)的最優(yōu)pipeline,但是缺點在于不易做靈活的定制。這點MindSpore做的更好一些,Tensorflow底層pipeline實現(xiàn)由C++函數(shù)調(diào)用鏈完成,那么就意味著對于自定義的Python處理不能很好的兼容,上層的Python算子為了能夠被底層C++調(diào)用,需要滿足相應的限制才可以。

Tensorflow中的分布式數(shù)據(jù)處理Pipeline

Tensorflow好不好用單說,從工程的角度而言,Tensorflow的每個單獨功能的設(shè)計還是做得相當不錯。這篇文章重點介紹其中一個就是Tensorflow在2.3版本中推出的分布式數(shù)據(jù)加載Dataservice的功能, 這個功能牛就牛在對用戶來說可以完全無感的切換處理。這個功能的具體內(nèi)容可在我的這篇文章中進行查看。限于篇幅,本文主要直接對圖進行說明。

大龍:分布式數(shù)據(jù)預處理——TensorFlow DataService架構(gòu)設(shè)計總結(jié)

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

如下是一段使用Dataservice的簡短示例代碼:

dispatcher = tf.data.experimental.service.DispatchServer() dispatcher_address = dispatcher.target.split("://")[1] worker = tf.data.experimental.service.WorkerServer(     tf.data.experimental.service.WorkerConfig(         dispatcher_address=dispatcher_address)) dataset = tf.data.Dataset.range(10) dataset = dataset.apply(tf.data.experimental.service.distribute(     processing_mode="parallel_epochs", service=dispatcher.target)) print(list(dataset.as_numpy_iterator()))

TFDataservice的設(shè)計實際上是一個簡易版的MapReduce。但其任務分配、執(zhí)行機制和與客戶端的交互邏輯上則簡單了很多。

我們用幾張圖介紹TFDataservice中的機制和概念。首先是任務的概念。

TFDataservice中有Dataset, Task, Job三層核心概念。對于數(shù)據(jù)集處理算子來說,Dataset是數(shù)據(jù)處理的基本單位,所以數(shù)據(jù)集的概念是最好理解的,就是多個Tensor的集合。針對該數(shù)據(jù)集的一個處理變換pipeline的定義我們稱之為一個Job。對于Job的每一個執(zhí)行實體我們稱之為一個Task。

而在任務分配與執(zhí)行中,TFDataservice也有三層概念Dispatcher,Worker, TaskRunner,其與上述的任務概念的交互關(guān)系如下圖所示。具體我們接下來一一解釋。

任務執(zhí)行這部分和MapReduce的執(zhí)行很像,所以我們回顧一下MR中的任務執(zhí)行。

在MR中有JobTracker負責Job和Task的新建、執(zhí)行以及狀態(tài)維護。客戶端同過JobTracker新建一個Job,新建Job的同時JobTracker會根據(jù)用戶的定義進行Task的拆分以及新建,在MR中其實就是MapTask以及ReduceTask的新建。每個TaskTracker會通過Heartbeat和JobTracker進行任務的領(lǐng)取以及當前正在執(zhí)行的Task的狀態(tài)的更新。TaskTracker領(lǐng)取到一個任務之后,會啟用或者復用一個JVM來執(zhí)行,每個Task的執(zhí)行最終由TaskRunner來完成。

Dataservice中采用幾乎一一對應的概念,其中Dispatcher對應JobTracker,Worker對應TaskTracker,TaskRunner對應TaskRunner。只不過在TF中,worker接收到一個Task之后不需要重新起一個JVM來執(zhí)行代碼,而是直接進行函數(shù)調(diào)用即可。整體而言TFDataservice中的分布式數(shù)據(jù)處理的架構(gòu)如下圖所示。這個圖看起來有點亂,但是基本上就描述清了TFDataservice中的設(shè)計。Dispatcher和Worker都是兩個RPC Server。Dataset和Dispatcher,Dispatcher和Worker以及Dataset和Worker之間都是采用RPC調(diào)用進行通信。

四、一些未來需要解決的數(shù)據(jù)pipleline的問題:

1.  資源的自適應分配

預處理pipeline執(zhí)行的進程數(shù)和當前各數(shù)據(jù)增強算子使用的處理線程數(shù)目由用戶手工配置,對用戶的調(diào)優(yōu)經(jīng)驗要求極高。通過自適應判斷Pipeline瓶頸,由框架給各個數(shù)據(jù)增強算子合理分配CPU資源,可以在訓練過程中動態(tài)優(yōu)化數(shù)據(jù)處理性能,免去用戶繁瑣的調(diào)優(yōu)過程。

2. 異構(gòu)硬件加速

當前的數(shù)據(jù)處理Pipeline操作在CPU執(zhí)行,一旦出現(xiàn)瓶頸,帶來AI芯片/GPU等待空閑,用戶無法充分利用所有硬件的計算能力。期望構(gòu)建用戶無感知的異構(gòu)硬件資源調(diào)度能力:通過監(jiān)測硬件資源使用,完善TPU/GPU上的數(shù)據(jù)處理算子,采用代價模型自適應地將數(shù)據(jù)處理任務調(diào)度至合適的資源,實現(xiàn)異構(gòu)硬件的充分利用。我們在音頻混響操作(核心為FFT和IFFT操作)中發(fā)現(xiàn)GPU的使用能極大的加速數(shù)據(jù)預處理,然而過多的進程申請GPU緩存池對訓練本身會造成一定的影響,這個問題我們下個雙月會著重研究GPU顯存的精細化管理。

3. 用戶無感知的分布式數(shù)據(jù)加載

當前大部分框架使用本地多進程、多線程進行數(shù)據(jù)預處理。但是隨著GPU的性能的逐年提升、AIOT端測模型的進一步減小,CPU Bound和IO Bound會越發(fā)的明顯,本地的數(shù)據(jù)處理已經(jīng)難以滿足模型的需求。使用分布式的預處理是解決數(shù)據(jù)處理和讀取瓶頸的出路。如何做到本地、分布式預處理用戶無感知切換是未來非常有前景的方向。Tensorflow中的TFDataservice給眾多框架開了一個頭,估計后續(xù)MindSpore等框架會持續(xù)跟上。


推薦閱讀


機器學習 pipeline 的可視化

2020-10-17

PyTorch提速四倍!提高DALI利用率,創(chuàng)建基于CPU的Pipeline

2020-02-13

RAMMER:一種可以成倍提升深度學習計算速度的編譯框架|OSDI 2020

2020-11-14



# CV技術(shù)社群邀請函 #

△長按添加極市小助手
添加極市小助手微信(ID : cvmart2)

備注:姓名-學校/公司-研究方向-城市(如:小極-北大-目標檢測-深圳)


即可申請加入極市目標檢測/圖像分割/工業(yè)檢測/人臉/醫(yī)學影像/3D/SLAM/自動駕駛/超分辨率/姿態(tài)估計/ReID/GAN/圖像增強/OCR/視頻理解等技術(shù)交流群


每月大咖直播分享、真實項目需求對接、求職內(nèi)推、算法競賽、干貨資訊匯總、與 10000+來自港科大、北大、清華、中科院、CMU、騰訊、百度等名校名企視覺開發(fā)者互動交流~


△點擊卡片關(guān)注極市平臺,獲取最新CV干貨

覺得有用麻煩給個在看啦~  
瀏覽 221
點贊
評論
收藏
分享

手機掃一掃分享

分享
舉報
評論
圖片
表情
推薦
點贊
評論
收藏
分享

手機掃一掃分享

分享
舉報

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 怡春院视频| 日韩AV中文字幕在线| 玖玖爱这里只有精品| 麻豆视频在线免费观看| 51福利视频| 国产一级a一级a免费视频| 日韩一级片免费观看| www.午夜福利| 亚洲AV综合色区无码国产播放 | 3D动漫精品啪啪一区二区下载| 草草国产| 天天干天天天天| 日韩无码一区二区三| 午夜福利干B在线免费小视频| 一级A片60分钟免费看| 色色视频在线观看| 狠狠狠狠狠操| 另类TS人妖一区二区三区| 日韩AV一区二区在线观看| 无码天堂| 91精品久久香蕉国产线看观看| 九色PORNY蝌蚪自拍视频| 亚洲日韩免费| 婷婷成人在线| 国产美女18毛片水真多| 亚洲小视频| 亚洲激情AV| 好色婷婷| 日韩人妻码一区二区三区| 91久久无码一区人妻A片蜜桃| 亚洲天堂AV2025| 免费无码视频一区二区| 97精品| 欧美视频中文字幕| 2025av天堂| 丁香五月情| 日韩专区中文字幕| 中文字幕性爱电影| 污污污污污www在线观看优势| a天堂8| 69久久| 天天色天天干天天日| 亚洲无码专区在线观看| 青青草91视频| 欧美亚洲成人视频| 人妻精品免费| 在线播放高清无码| 成人自拍网站| 高清无码片| 亚洲高清国产欧美综合s8| a在线视频| 日本不卡一区二区三区| 久久黄色网址| 国产午夜成人| 九九99热| 噜噜噜色| 国产av一区二区三区四区| 国产资源AV| 丁香五月成人网| 精品日韩在线视频| 国产小视频免费在线观看| 欧美级毛片高潮| 影音先锋成人电影| 久久久网站| 日皮视频免费观看| 日韩成人小电影| 色色777| JULIA超乳JULIA无码| 北条麻妃精品在线| 91艹逼| 91乱| 成人av免费观看| 国产性爱免费视频| 无码人妻中文| 欧美一级性爱在线观看| 四川揉BBB搡BBB| 国产乱国产乱老熟300视频| 天天干天天操综合| 黄工厂精品视频在线播| 韩国午夜激情| 欧洲天堂在线视频网站| 久久偷拍视频| 国产三级| 精品福利导航| 日韩黄色网| 东京热综合网| 欧美A片在线观看| 五月婷婷av| 国产怡红院| 先锋影音资源av| 97人人爽人人爽人人人| 午夜无码人妻AV| 在线无码视频播放| 成人三级无码| 无码a区| 韩国无码一区二区三区| 成人特级毛片全部免费播放| 成人黄片视频| 国产乱国产乱300精品| 四川BBB搡BBB搡多人乱| 青青草超碰在线| 日本亚洲黄色视频| 色婷婷色五月| 羽月希无码| 毛多水多丰满女人A片| 人人肏人人摸| 人人天天夜夜| 操BAV| 噜噜色色噜噜| 水果派av解说| 唐山熟女工棚嗷嗷叫| 18禁网站在线| 日本黄色电影网址| 国产毛片在线| 伊人成人在线视频| 亚洲天堂在线视频| 成人视频123| 高清无码色播| 日韩图片区小说视频区日| 懂色一区二区三区免费| 国产精品无码毛片| 91精品国际| 婷婷视频导航| 2017天天干天天射| 成人无码影院日韩,成人年…| 日韩欧美人妻无码精品| 成人毛片av| 国产69久久精品成人看| 97国产在线观看| 亚洲无码AV片| 亚洲秘一区二区三区-精品亚洲二区- | 东北A片| 粉嫩99精品99久久久久久特污 | 性猛交AAAA片免费观看直播| 麻豆秘在线观看国产| 亚洲天堂成人在线| 中文无码在线观看中文字幕av中文| 熟女老阿V8888AV| 欧美日P| 男女日皮的视频| 丁香五月天AV| 日韩成人高清无码| 久久国产av| 超碰麻豆| 国产黄色AV| 爱爱帝国综合社区| 欧美成人性色欲影院| 国产精品久久免费视频| 激情视频在线播放| 夜夜骑夜夜撸| 成人网站无码| AAAAA毛片| 中文字幕在线观看网址最新地址| 亚洲综合一区二区| 蜜桃一区二区三区| 99久久国内精品成人免费| 美女av免费| 五月丁香婷婷开心| 操鸡视频在线观看| 亚洲精品国产成人AV在线| 久久久蜜桃| 亚洲精品999| 亚洲AV激情无码专区在线播放| 国产精品扒开腿做爽爽爽A片唱戏 中文字幕一区二区三区精华液 | 日韩一区二区三区四区久久久精品有吗 | 成人aV无码精品国产一区二区| 先锋资源在线视频| 日韩性爱视频在线观看| 欧美大香蕉在线| 91豆花视频18| 一区二区三区国产视频| 午夜成人一区二区| 日日骚影院| www.操操操| 黄色免费看视频| 黄片一区二区三区| 五月天无码视频| 成人免费视频在线观看| 成人免看一级a一片| 91.射| 久久婷综合| 欧美三级网站在线观看| 亚洲无码一级片| 日本免费黄色电影| 一本道不卡色色| 免费成人国产| 男人手机天堂| 午夜麻豆| 色丁香五月婷婷| 韩国成人啪啪无码高潮| 伊人狼人香蕉| WW免费视频| 国产精品久久久久久久久久久久久久久久| 男人的天堂手机在线| 九九黄片| 欧美在线不卡| 色狠狠网| 99久久成人| 玖玖激情| 国产黄色免费乱伦片| 日韩综合一区| 一級免費网站| 国产精品黑人ThePorn| www.久久精品视频| 小视频你懂的| 自拍偷拍欧美| 天天操B| 六月婷婷在线观看| 男女黄色免费网站| 免费A片在线播放| jk无码| 午夜婷婷| 亚洲vs无码蜜桃少妇| 国产精品久久久久久久久借妻 | 国产欧美一区二区三区四区 | 2019国产精品| 黄色小网站在线观看| 99热这里都是精品| 欧美日韩加勒比| 69国产成人综合久久精品欧美| 亚洲日韩欧美在线观看| 西西特级无码444www| 驲韩在线视频免费观看| 日日夜夜天天综合| 午夜AV福利| 自拍偷拍一区| 亚洲综合伊人| 99r6热只有精品免费观看| 中文字幕黄色| 另类小说五月天| 日韩毛片在线| 色婷婷电影网| 最新中文字幕av| 91人妻在线视频| 日本精品一区二区| 黄页免费无码| 三级片免费网址| 亚洲免费一区二区| AV在线观看黄| www.jiujiujiu| 在线网址你懂的| 久久嫩草精品久久久久| 日韩精品一区二区三区免费观看高清 | 激情麻豆论坛| 国产av二区| 很很干在线视频| 天堂中文字幕在线观看| 中国少妇xxx| 强伦轩一区二区三区在线观看| 影音先锋在线视频| 五月丁香六月| 欧美成人在线免费| 99久久久国产| 干片网| 北条麻妃一区二区三区在线| 亚洲AV无码成人精品一区| 一区二区三区电影| 亚洲日本中文字幕| 国产精品男女| 一区二区无码高清| 国产成人秘免费观看一区二区三区 | 日本伊人在线综合视频| 国产精品视频色| 91麻豆精品国产91久久久吃药| 国产精品秘久久久久久免费播放| 亚洲影院第一页在线观看| 欧美婬乱片A片AAA毛片地址| 暗呦网一区二区三区| 日韩免费在线视频观看| 草草影院CCYYCOM屁屁影院合集限制影院 | 在线观看者亚洲| 欧美特级AAA| 免费作爱视频| 四虎一区二区| 婷婷综合缴情亚洲另类在线| 自拍偷拍激情视频| 欧美成人在线观看视频| 成人禁区| 国产青草视频| 波多野结衣亚洲| 中文字幕在线观看一区二区三区| 西西4444大胆无码视频| 无码精品一区二区| 就爱操逼网| 国产精品美女毛片j酒店| 日本成人黄色视频| 五月婷婷免费视频| AV怡红院| 日本成人视频| 黄色高清视频在线观看| 97香蕉网| 激情无码视频| 免费看黄色毛片| 一级特黄AAAA片| 亚洲精品一区二区三区蜜桃| 亚洲无码AV一区二区| 怡红院男人天堂| 少妇在线视频| 麻豆精品在线观看| 成人电影一区二区三区| 中文字幕东京热| 粉嫩小泬BBBBBB免费| 天天色免费视频| 国内精品久久久久久久久久| www.人人操| 国产高清精品无码| 亚洲男人天堂AV| 青草视频在线| 人人干超碰| 91在线无码精品秘| 又大又长又粗91| 人妻精品久久久久中文字幕69| 国产一级内射| 国产伦精品一级A片视频夜夜 | 蜜臀av一区二区| 牛牛AV| 天堂网av2014| 大香蕉人人| 91精品91久久久中77777| 在线观看免费成人网站| 东京热久久综合色五月老师| 高潮喷水视频| 69AV在线观看| 午夜久| 亚洲精品无码久久久| 特级西西444WWW高清大视频 | 青娱乐亚洲精品视频| 午夜福利视频91| 亚欧无码| 大鸡巴草逼| 加勒比综合在线| 先锋资源日韩| 最近2021中文字幕免费| 亚洲色视频在线| 黄片免费播放| 中文字幕午夜福利| 高清无码日本| 操逼综合网| 永久AV免费网站| 欧美成人精品AAA| 午夜激情国产| 日韩黄色av| 91一区在线观看| www.一区| 一区二区精品视频| 丁香五月综合网| 91在线无码精品秘网站| 玖玖资源站中文字幕| AV免费激情影院| 可以免费看的黄色| 大香蕉国产视频| 久久精品波多野结衣| 怡红院AV| 国产在线播放av| 国产777777| 成人精品秘久久久按摩下载| 中文字幕av无码| 国精品无码一区二区三区在线秋菊| 99色综合| 午夜理论在线| 久久一级视频| 天天草网| 91aaa在线观看| AV婷婷在线| 护士小雪的yin荡高日记H视频| 中文字幕精品一区久久久久| 五月天婷婷基地| 加勒比无码综合| 91网站免费看| 苏妲己一级婬片A片| 色综合久久天天综合网| 午夜伦理福利| 国产黄色精品视频| 中文字幕综合在线| 99精品人妻| 少妇高潮一区二区三区99| 色婷婷AV国产精品| 97超碰自拍| 成人无码区免费AV毛片| 亚洲成人大片| 男女激情网站| 天天插天天狠| 高清无码在线免费观看| 久热精品在线观看视频| 日本三级片视频不卡| 99久久婷婷| 中文字幕系列| 亚欧洲精品| 亚洲AV色香蕉一区二区三区| 国产精品国产三级国产专业不| 亚洲Av在线观看| 国产婷婷色一区二区在线观看| 日韩AV在线天堂| 蜜芽av在线| 欧美三级欧美三级三级| 91狠狠综合久久| 在线观看视频你懂的| 中文字幕亚洲在线| 亚洲色,天堂网| 亚洲精品国产精品乱玛不99| 国产AV日韩AV| 天天干天天色天天射| 91乱子伦国产乱子伦海的味道 | av女人天堂| 影音先锋亚洲AV| 久久午夜无码鲁丝片午夜精品偷窥 | 日韩精品一区二区三区免费观看高清 | 翔田千里在线观看| 无码内射视频| 国产老女人操逼| 成人黄色网址| 张柏芝BBw搡BBBB槡BBBBHDfree | 无码内射视频| 嫩BX区二区三区的区别| 国家一级A片| 日韩v在线| 操美女的网站| 大香蕉在线电影| 亚洲午夜久久久久久久久| 手机看片午夜福利网| 日本高清无码在线| 999热这里只有精品| 大香蕉性爱视频| 久久综合17p| 日本三级网站| 无码一区二区三区在线观看| 强开小嫩苞毛片一二三区| 久久久久久亚洲AV无码专区| 欧美午夜性爱视频| 夜夜撸视频| 国产三级片精品| 久了中文字幕| 成人精品久久久| 日本亲子乱婬一级A片| 国产精品免费久久影院| 蜜芽AV在线| 日本成人黄色| www国产亚洲精品久久网站| 91AV一区二区| 欧美3P视频| 欧美a在线观看| 人人澡人人摸| 91色色| 日韩成人一区二区| 一级aa免费视频| 内射免费视频| 豆花天天吃最新视频| 丁香花在线高清完整版视频| 亚洲有码在线观看| 亚洲精品久久久久毛片A级绿茶| 久久中文字幕免费| 超碰人人摸| 另类TS人妖一区二区三区| 亚洲中文字幕电影| 91视频免费播放| 日日摸日日添日日躁AV| 成人在线视频免费观看| 日韩AV一二三| 91人妻人澡| 丁香六月婷婷综合| 久草视频网| 精品久久久无码| 四虎永久www成人影院| 亚洲一区二区在线视频| 日本成人性爱视频网站一区| 亚洲成人久久久| 玖玖婷婷| 天天澡天天爽日日AV| 中文字幕免费在线播放| 人妻人操| 美国一级A片草草视频| 一本色道久久综合亚洲精品小说| 人人草人人舔| 看一级黄色毛片| 四川BBB搡BBB搡多人乱| 日韩在线观看中文字幕| 亚洲午夜无码精品专区| 欧美三P囗交做爰XXXⅩ| 97AV视频| 一级片AA| 婷婷五月丁香六月| 免费A片观看| 超碰在线人人爱| www.青青草视频| av中文字幕网| 91AV一区二区| 精品免费黄色视频| 黄色在线观看免费| 久久久久久久久久8888| 97人妻精品一区二区三区软件| 日AV在线无| 中文字幕亚洲一区| 国产精品永久久久久久久久久| 中文无码熟妇一区二区| 久久久久久亚洲Av无码精品专口| 亚洲性爱小说| 国产精品做爱| 久操视频一区二区三区| 亚洲色情在线观看| 中文字幕无码网站| 亚洲中文字幕免费观看视频| 国产三级黄色视频| 久久亚洲婷婷| 亚洲中文字幕色| 羞羞AV| 人人妻人人摸| 无码插逼| 成人在线一区二区三区| 欧美一级AAA大片免费观看| 天天做天天爱天天高潮| 少妇高潮无码| 丁香六月婷婷综合激情欧美| 99re热在线视频| 精产国品一区二区区别| 欧美性受XXXX黑人XYX性爽冫| 北条麻妃99精品青青久久| 骚逼中文字幕| 亚洲日韩中文字幕| AV中文字幕在线播放| 一区二区三区www污污污网站| 亚洲wwwwww| 波多野结衣网址| 亚洲无码精品久久| 成年人黄色视频网站| 欧美黄片无码| 黄片在线免费观看| 人妻体内射精一区二区| 欧美一级特黄AAAAAA片| 大香蕉伊人视频在线观看| 久久91人妻无码精品蜜桃HD| 97无码人妻| 久久丝袜视频| 日本色网址| 久久高潮| 日本一节片在线播放| 成人精品免费| AV色片| 中文字幕免费MV第一季歌词| 嗯啊在线视频| 国产激情都市一区二区三区欧美| 狼友视频在线播放| 男女啪啪免费视频| 69国产成人综合久久精品欧美| 亚洲Av在线观看| 蜜桃在线视频| 欧美三级片网址| 成人伊人综合| 色色激情五月天| 黄色视频A片| 一本一道vs波多野结衣| 国产av影院| 欧洲成人免费视频| 人人射人人爱| 九九亚洲精品| 国产精品久久久久久最猛| 亚洲中文字幕久久日| 老熟女痒到不行-ThePorn| 欧美一级aaa| 国产成人精品777777| 国产3p绿帽骚妻视频| 国产一区二区三区成人| 成人网在线视频| 琪琪色视频| 久草视频大香蕉| 精品一区二区三区四| 日韩av无码中文字幕| 久久99精品国产.久久久久| 人人插人人| 成人午夜视频在线观看| 福利在线| 五月天久久久久| 久久亚洲一区| 性欧美XXXX| 韩国高清无码60.70.80| 婷婷色在线| 亚洲精品97久久中文字幕| 久久久人妻熟妇精品无码蜜桃| 激情爱爱网站| 亚洲午夜福利视频在线观看| 亚洲无吗在线播放| 欧美性猛交一区二区三区| 欧美肏逼视频| 日本免费中文字幕| 日本二区三区| 天天爽天天爽成人A片影院| 天天操天天日天天射| 日韩极品在线观看| 嫩BBB槡BBBB槡BBB小号| 日本高清一区二区高清免费视频| 91色欲| 波多野吉衣毛片| 日韩AV片| 青娱乐偷拍视频| 色色色热| 蜜桃视频无码区在线观看| 2024av在线| 国产乱国产乱老熟300视频| 熟女探花精选| 婷婷涩嫩草鲁丝久久午夜精品| 天天看天天射| 日韩在线精品| 天天狠狠干| 亚洲不卡中文字幕| chinese搡老熟老妇人| 亚洲中出| 性爱av在线观看| 亚洲日韩一区二区三区| 久久av综合| 日韩欧美综合| 蜜桃av秘无码一区三区四| 亚洲精品a| 91狠狠色丁香婷婷综合久久| 亚洲AV小说| 中文区中文字幕免费看| 波多野结衣一二三区| 日韩精品无码AV| 91探花秘入囗| 午夜无码福利视频| 亚洲欧美日韩不卡| 日本三级久久| 韩国中文字幕HD久久精品| 青春草视频| 国产啊啊啊| 九九色视频| 97人人插| 狠狠干大香蕉| 一曲二曲三曲在线观看中文字| 蜜臀av一区二区| 男女视频91| 亚洲男人天堂视频| 无码动漫av| 亚洲无码av在线观看| 日韩精品在线一区| 日韩A毛片| www.97cao| 国产精品久久7777777精品无码| 精品多人P群无码视频| 加勒比无码综合| 99er这里只有精品| 99热日| 无套进入无套内谢| 字幕一区二区久久人妻网站| 日韩欧美一区二区三区| 一区二区三区免费观看| 国产欧美一区二区| 久久久在线| 操逼操| 中文字幕免费在线| 超碰久热| 黑人操逼视频| 中文字幕视频在线| 超碰日韩| 插逼综合网| 无码免费播放| 欧美日韩精品| 天天爽天天操| 无码一区二区三区免费| 无码人妻一区二区三区精品不付款 | 激情小说五月天| 免费观看一区二区三区| JULIA超乳JULIA无码| 中文无码第一页| 人妻人人骑| 欧美性爱一级| 婷婷五月丁香色| 日韩有码一区| 黑人狂躁女人高潮视频| 亚洲中文免费视频| 欧美A在线| 成人黄片免费| 欧美日本国产| 青春草在线观看视频| 一级黄色电影在线观看| 国产精品成人午夜福利| 久久99热这里只频精品6学生| 99久久婷婷国产综合精品电影| 先锋资源AV| 日日夜夜精品视频| 欧美性爱小说| 麻豆回家视频区一区二| 夜夜骚精品人妻av一区| 国产九九九| 国产欧美综合精品| 午夜亚洲AV永久无码精品蜜芽| 亚洲AV无码一区二区三区少妇| 黄色大片中国一级片-免费看特一级片-亚洲黄色AV| 黄片高清免费观看| 黄色成人毛片| 一牛影视精品av| 北条麻妃无码视频在线| 台湾AV在线| www.97cao| 国产无码观看| 青青草原在线免费| 91麻豆免费视频| 一区二区三区四区精品视频| 九九精品视频在线播放| 欧美三级毛片| jk无码| 人人插人人摸| 77777色婷婷| 热逼视频| 日韩av三级在线观看| 日日操天天操夜夜操| 欧美一级AAA大片免费观看 | 丰满人妻一区二区三区视频54 | 黄色电影天堂| 久久精品网| 东方av在线免费观看| 青娱乐亚洲| 日本一区免费观看| www.天天干| 毛片操逼视频| 北条麻妃一区二区三区在线观看| 久草视频播放| 一线天嫩穴少妇| www.日批| 久久黄色网| 熟女人妻在线| 日韩中文毛片| 丁香五月激情小说| 欧美MV日韩MV国产网站| 黄色一级大片| 日韩不卡视频在线| 国产综合自拍| 国产手机精品视频| A片在线免费播放| 色六月婷婷| 午夜精品在线观看| 黄色免费在线观看视频| 成人做爰100片免费着| 成人免费观看视频| 西西WWW888大胆无码| 成人在线视频免费观看| 毛片动态图| 无码一区二区三区免费| 超碰97人人爱| 西西人体大胆ww4444| A一级黄片| 夜操| 国精品无码人妻一区二区三区免费 | 国产动态图| 正在播放李彩斐被洋老外| 国产黄色视频在线免费看| 欧美日韩h| 国产午夜免费| 黄91在线观看| 国产小视频在线| ppypp电影频道| 在线免费三级| 美女黄片| 国产成人综合在线| 亚洲精品一区二区三区新线路| 亚洲男女免费视频| 自拍偷拍综合网| 四川少妇BBBB槡BBBB槡| 欧美性网| 日韩视频免费观看高清完整版在线观 | 精品码一区二在线观看| 在线免费看av| 亚洲色图狠狠撸| 五月花在线视频| 狠狠艹狠狠干| 操操av| 日本欧美在线观看| 国产精品久久久久毛片SUV| 日本久久久久久久久视频在线观看| 3D动漫精品啪啪一区二区| 免费在线观看AV片| 狠狠狠狠狠操| 91久久婷婷国产| 高潮喷水在线观看| 久久久精品电影91| 国产在线视频第一页| 婷婷福利导航| 91秦先生在线播放| 午夜激情视频| 加勒比黑人和翔田千里在线播放| 亚洲色成人网站www永久四虎| 永久免费AV无码| 码人妻免费视频| 国产精品一卡二卡| 精品人妻一区二区三区含羞草| AⅤ视频在线观看| 最新亚洲无码在线观看| 搡老熟女-91Porn| 99无码国产成人精品| 亚洲性爱AV| 午夜福利av在线| 欧美深夜福利视频| 中文字幕手机在线视频| 天天色情| 北条麻妃视频在线观看| 北条麻妃视频在线播放| 欧美日韩在线观看中文字幕| 江苏妇搡BBB搡BBBB| 国产成人在线免费视频| 国产一区二区三区在线| 久久精品视频播放| 51妺嘿嘿在线电影免费观看| 北条麻妃无码一区二区| 天天操天天拍| 国产婷婷色一区二区| 蜜桃91在线| 先锋资源在线视频| 97人人插| 麻豆传媒猫爪| 日本A一级片| 少妇bbb搡bbbb搡bbbb| 尻屄网| 99国产视频| 色婷婷激情在线| 大香蕉免费网站| 俺去| 日韩无码中文字幕| 台湾AV在线| 337P人体美鮑高清| 东北女人操逼| 午夜福利手机在线| 亚洲无码69| 日韩av中文字幕在线| 特级特黄AAAAAAAA片| 国产三级国产三级国产普通话| TheAV精尽人亡av| 看一级黄色片| 麻豆乱码国产一区二区三区| 影音av在线| 无码电影在线播放| 91人人看| 亚洲精品久久久久中文字幕二区| 婷婷五月18永久免费视频| 99久久伊人| 日韩欧美午夜成人无码| 北条麻妃一区二区三区| 午夜亚洲视频| 国产TS变态重口人妖| 成人电影91| 91视频青青草| 欧美性爱XXXX黑人XYX性爽| 免费看黄片的网站| 亚洲AV电影在线观看| AV777777| 在线观看日韩av| 少妇搡BBBB搡BBB搡澳门| 国产综合色婷婷精品久久| 狠狠干2025| 日韩小视频在线观看| 中文字幕永久在线| 国产精品国产三级国产AⅤ| 国产精品啪啪视频| 最新中文字幕777私人在线| 美女毛片网站| 69成人视频| 欧美自拍视频在线观看| 人人操干| 操逼视频网站免费| 曰韩毛片| 精品国产乱码一区二区| 亚洲一级a| 亚洲色婷婷综合| 一本大道香蕉av久久精东影业| 国产成人69| 婷婷六月综合| yOujiZZ欧美精品| 美女91小视频| 色婷婷亚洲婷婷| 欧美高清无码| 九九香蕉网| 在线免费黄| 91成人情欲影视网| ThePorn精品无码| 欧美成人网站在线| 日韩精品欧美一区二区三区| 国产av日韩av| 国产亚洲一区二区三区| 成人一区二区三区| 国产精品久久久久久久久借妻 | 四虎精品一区二区三区| 日韩精品免费一区二区在线观看| 国产亚洲久一区二区三区| 欧美黄色A片| 日韩无码乱码| 91啦丨露脸丨熟女色啦| 人人操人人射| 日韩二三区| 四虎精品一区二区| 亚洲色在线播放| 色悠悠久久综合| 婷婷中文字幕| 在线观看免费高清无码| 欧美内射网站| 免费一级黄色电影| 人人操人人看人人| 亚洲无码成人在线观看| 色撸AⅤ| 亚洲AV无码国产精品久久不卡| 不卡无码在线观看| 成人精品A片免费网站| 撸一撸在线观看| 少妇特黄A一区二区三区|