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

當(dāng)代研究生應(yīng)當(dāng)掌握的5種Pytorch并行訓(xùn)練方法(單機(jī)多卡)

共 13949字,需瀏覽 28分鐘

 ·

2022-03-01 21:48

點(diǎn)擊上方“程序員大白”,選擇“星標(biāo)”公眾號(hào)

重磅干貨,第一時(shí)間送達(dá)

作者丨縱橫@知乎
來源丨h(huán)ttps://zhuanlan.zhihu.com/p/98535650
編輯丨極市平臺(tái)

導(dǎo)讀

?

利用PyTorch,作者編寫了不同加速庫在ImageNet上的單機(jī)多卡使用示例,方便讀者取用。


又到適宜劃水的周五啦,機(jī)器在學(xué)習(xí),人很無聊。在打開 b 站 “學(xué)習(xí)” 之前看著那空著一半的顯卡決定寫點(diǎn)什么喂飽它們~因此,從 V100-PICE/V100/K80 中各拿出 4 張卡,試驗(yàn)一下哪種分布式學(xué)習(xí)庫速度最快!這下終于能把剩下的顯存吃完啦,又是老師的勤奮好學(xué)生啦(我真是個(gè)小機(jī)靈鬼)!

Take-Away

筆者使用 PyTorch 編寫了不同加速庫在 ImageNet 上的使用示例(單機(jī)多卡),需要的同學(xué)可以當(dāng)作 quickstart 將需要的部分 copy 到自己的項(xiàng)目中(Github 請(qǐng)點(diǎn)擊下面鏈接):

1、簡單方便的 nn.DataParallel

https://github.com/tczhangzhi/pytorch-distributed/blob/master/dataparallel.py

2、使用 torch.distributed 加速并行訓(xùn)練

https://github.com/tczhangzhi/pytorch-distributed/blob/master/distributed.py

3、使用 torch.multiprocessing 取代啟動(dòng)器

https://github.com/tczhangzhi/pytorch-distributed/blob/master/multiprocessing_distributed.py

4、使用 apex 再加速

https://github.com/tczhangzhi/pytorch-distributed/blob/master/apex_distributed.py

5、horovod 的優(yōu)雅實(shí)現(xiàn)

https://github.com/tczhangzhi/pytorch-distributed/blob/master/horovod_distributed.py

這里,筆者記錄了使用 4 塊 Tesla V100-PICE 在 ImageNet 進(jìn)行了運(yùn)行時(shí)間的測試,測試結(jié)果發(fā)現(xiàn) Apex 的加速效果最好,但與 Horovod/Distributed 差別不大,平時(shí)可以直接使用內(nèi)置的 Distributed。Dataparallel 較慢,不推薦使用。(后續(xù)會(huì)補(bǔ)上 V100/K80 上的測試結(jié)果,穿插了一些試驗(yàn)所以中斷了)

簡要記錄一下不同庫的分布式訓(xùn)練方式,當(dāng)作代碼的 README(我真是個(gè)小機(jī)靈鬼)~

簡單方便的 nn.DataParallel

DataParallel 可以幫助我們(使用單進(jìn)程控)將模型和數(shù)據(jù)加載到多個(gè) GPU 中,控制數(shù)據(jù)在 GPU 之間的流動(dòng),協(xié)同不同 GPU 上的模型進(jìn)行并行訓(xùn)練(細(xì)粒度的方法有 scatter,gather 等等)。

DataParallel 使用起來非常方便,我們只需要用 DataParallel 包裝模型,再設(shè)置一些參數(shù)即可。需要定義的參數(shù)包括:參與訓(xùn)練的 GPU 有哪些,device_ids=gpus;用于匯總梯度的 GPU 是哪個(gè),output_device=gpus[0] 。DataParallel 會(huì)自動(dòng)幫我們將數(shù)據(jù)切分 load 到相應(yīng) GPU,將模型復(fù)制到相應(yīng) GPU,進(jìn)行正向傳播計(jì)算梯度并匯總:

model = nn.DataParallel(model.cuda(), device_ids=gpus, output_device=gpus[0])

值得注意的是,模型和數(shù)據(jù)都需要先 load 進(jìn) GPU 中,DataParallel 的 module 才能對(duì)其進(jìn)行處理,否則會(huì)報(bào)錯(cuò):

# 這里要 model.cuda()
model = nn.DataParallel(model.cuda(), device_ids=gpus, output_device=gpus[0])

for epoch in range(100):
for batch_idx, (data, target) in enumerate(train_loader):
# 這里要 images/target.cuda()
images = images.cuda(non_blocking=True)
target = target.cuda(non_blocking=True)
...
output = model(images)
loss = criterion(output, target)
...
optimizer.zero_grad()
loss.backward()
optimizer.step()
匯總一下,DataParallel 并行訓(xùn)練部分主要與如下代碼段有關(guān):
# main.py
import torch
import torch.distributed as dist

gpus = [0, 1, 2, 3]
torch.cuda.set_device('cuda:{}'.format(gpus[0]))

train_dataset = ...

train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=...)

model = ...
model = nn.DataParallel(model.to(device), device_ids=gpus, output_device=gpus[0])

optimizer = optim.SGD(model.parameters())

for epoch in range(100):
for batch_idx, (data, target) in enumerate(train_loader):
images = images.cuda(non_blocking=True)
target = target.cuda(non_blocking=True)
...
output = model(images)
loss = criterion(output, target)
...
optimizer.zero_grad()
loss.backward()
optimizer.step()
在使用時(shí),使用 python 執(zhí)行即可:
python main.py
在 ImageNet 上的完整訓(xùn)練代碼,請(qǐng)點(diǎn)擊Github。

使用 torch.distributed 加速并行訓(xùn)練

在 pytorch 1.0 之后,官方終于對(duì)分布式的常用方法進(jìn)行了封裝,支持 all-reduce,broadcast,send 和 receive 等等。通過 MPI 實(shí)現(xiàn) CPU 通信,通過 NCCL 實(shí)現(xiàn) GPU 通信。官方也曾經(jīng)提到用 DistributedDataParallel 解決 DataParallel 速度慢,GPU 負(fù)載不均衡的問題,目前已經(jīng)很成熟了~
與 DataParallel 的單進(jìn)程控制多 GPU 不同,在 distributed 的幫助下,我們只需要編寫一份代碼,torch 就會(huì)自動(dòng)將其分配給 個(gè)進(jìn)程,分別在 個(gè) GPU 上運(yùn)行。
在 API 層面,pytorch 為我們提供了 torch.distributed.launch 啟動(dòng)器,用于在命令行分布式地執(zhí)行 python 文件。在執(zhí)行過程中,啟動(dòng)器會(huì)將當(dāng)前進(jìn)程的(其實(shí)就是 GPU的)index 通過參數(shù)傳遞給 python,我們可以這樣獲得當(dāng)前進(jìn)程的 index:
parser = argparse.ArgumentParser()
parser.add_argument('--local_rank', default=-1, type=int,
help='node rank for distributed training')
args = parser.parse_args()
print(args.local_rank)
接著,使用 init_process_group 設(shè)置GPU 之間通信使用的后端和端口:
dist.init_process_group(backend='nccl')
之后,使用 DistributedSampler 對(duì)數(shù)據(jù)集進(jìn)行劃分。如此前我們介紹的那樣,它能幫助我們將每個(gè) batch 劃分成幾個(gè) partition,在當(dāng)前進(jìn)程中只需要獲取和 rank 對(duì)應(yīng)的那個(gè) partition 進(jìn)行訓(xùn)練:
train_sampler = torch.utils.data.distributed.DistributedSampler(train_dataset)

train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=..., sampler=train_sampler)
然后,使用 DistributedDataParallel 包裝模型,它能幫助我們?yōu)椴煌?GPU 上求得的梯度進(jìn)行 all reduce(即匯總不同 GPU 計(jì)算所得的梯度,并同步計(jì)算結(jié)果)。all reduce 后不同 GPU 中模型的梯度均為 all reduce 之前各 GPU 梯度的均值:
model = torch.nn.parallel.DistributedDataParallel(model, device_ids=[args.local_rank])
最后,把數(shù)據(jù)和模型加載到當(dāng)前進(jìn)程使用的 GPU 中,正常進(jìn)行正反向傳播:
torch.cuda.set_device(args.local_rank)

model.cuda()

for epoch in range(100):
for batch_idx, (data, target) in enumerate(train_loader):
images = images.cuda(non_blocking=True)
target = target.cuda(non_blocking=True)
...
output = model(images)
loss = criterion(output, target)
...
optimizer.zero_grad()
loss.backward()
optimizer.step()


匯總一下,torch.distributed 并行訓(xùn)練部分主要與如下代碼段有關(guān):
# main.py
import torch
import argparse
import torch.distributed as dist

parser = argparse.ArgumentParser()
parser.add_argument('--local_rank', default=-1, type=int,
help='node rank for distributed training')
args = parser.parse_args()

dist.init_process_group(backend='nccl')
torch.cuda.set_device(args.local_rank)

train_dataset = ...
train_sampler = torch.utils.data.distributed.DistributedSampler(train_dataset)

train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=..., sampler=train_sampler)

model = ...
model = torch.nn.parallel.DistributedDataParallel(model, device_ids=[args.local_rank])

optimizer = optim.SGD(model.parameters())

for epoch in range(100):
for batch_idx, (data, target) in enumerate(train_loader):
images = images.cuda(non_blocking=True)
target = target.cuda(non_blocking=True)
...
output = model(images)
loss = criterion(output, target)
...
optimizer.zero_grad()
loss.backward()
optimizer.step()
在使用時(shí),調(diào)用 torch.distributed.launch 啟動(dòng)器啟動(dòng):
CUDA_VISIBLE_DEVICES=0,1,2,3 python -m torch.distributed.launch --nproc_per_node=4 main.py
在 ImageNet 上的完整訓(xùn)練代碼,請(qǐng)點(diǎn)擊Github。

使用 torch.multiprocessing 取代啟動(dòng)器

有的同學(xué)可能比較熟悉 torch.multiprocessing,也可以手動(dòng)使用 torch.multiprocessing 進(jìn)行多進(jìn)程控制。繞開 torch.distributed.launch 自動(dòng)控制開啟和退出進(jìn)程的一些小毛病~
使用時(shí),只需要調(diào)用 torch.multiprocessing.spawn,torch.multiprocessing 就會(huì)幫助我們自動(dòng)創(chuàng)建進(jìn)程。如下面的代碼所示,spawn 開啟了 nprocs=4 個(gè)線程,每個(gè)線程執(zhí)行 main_worker 并向其中傳入 local_rank(當(dāng)前進(jìn)程 index)和 args(即 4 和 myargs)作為參數(shù):
import torch.multiprocessing as mp

mp.spawn(main_worker, nprocs=4, args=(4, myargs))
這里,我們直接將原本需要 torch.distributed.launch 管理的執(zhí)行內(nèi)容,封裝進(jìn) main_worker 函數(shù)中,其中 proc 對(duì)應(yīng) local_rank(當(dāng)前進(jìn)程 index),ngpus_per_node 對(duì)應(yīng) 4, args 對(duì)應(yīng) myargs:
def main_worker(proc, ngpus_per_node, args):

dist.init_process_group(backend='nccl', init_method='tcp://127.0.0.1:23456', world_size=4, rank=gpu)
torch.cuda.set_device(args.local_rank)

train_dataset = ...
train_sampler = torch.utils.data.distributed.DistributedSampler(train_dataset)

train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=..., sampler=train_sampler)

model = ...
model = torch.nn.parallel.DistributedDataParallel(model, device_ids=[args.local_rank])

optimizer = optim.SGD(model.parameters())

for epoch in range(100):
for batch_idx, (data, target) in enumerate(train_loader):
images = images.cuda(non_blocking=True)
target = target.cuda(non_blocking=True)
...
output = model(images)
loss = criterion(output, target)
...
optimizer.zero_grad()
loss.backward()
optimizer.step()
在上面的代碼中值得注意的是,由于沒有 torch.distributed.launch 讀取的默認(rèn)環(huán)境變量作為配置,我們需要手動(dòng)為 init_process_group 指定參數(shù):
dist.init_process_group(backend='nccl', init_method='tcp://127.0.0.1:23456', world_size=4, rank=gpu)
匯總一下,添加 multiprocessing 后并行訓(xùn)練部分主要與如下代碼段有關(guān):
# main.py
import torch
import torch.distributed as dist
import torch.multiprocessing as mp

mp.spawn(main_worker, nprocs=4, args=(4, myargs))

def main_worker(proc, ngpus_per_node, args):

dist.init_process_group(backend='nccl', init_method='tcp://127.0.0.1:23456', world_size=4, rank=gpu)
torch.cuda.set_device(args.local_rank)

train_dataset = ...
train_sampler = torch.utils.data.distributed.DistributedSampler(train_dataset)

train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=..., sampler=train_sampler)

model = ...
model = torch.nn.parallel.DistributedDataParallel(model, device_ids=[args.local_rank])

optimizer = optim.SGD(model.parameters())

for epoch in range(100):
for batch_idx, (data, target) in enumerate(train_loader):
images = images.cuda(non_blocking=True)
target = target.cuda(non_blocking=True)
...
output = model(images)
loss = criterion(output, target)
...
optimizer.zero_grad()
loss.backward()
optimizer.step()
在使用時(shí),直接使用 python 運(yùn)行就可以了:
python main.py
在 ImageNet 上的完整訓(xùn)練代碼,請(qǐng)點(diǎn)擊Github。

使用 Apex 再加速

Apex 是 NVIDIA 開源的用于混合精度訓(xùn)練和分布式訓(xùn)練庫。Apex 對(duì)混合精度訓(xùn)練的過程進(jìn)行了封裝,改兩三行配置就可以進(jìn)行混合精度的訓(xùn)練,從而大幅度降低顯存占用,節(jié)約運(yùn)算時(shí)間。此外,Apex 也提供了對(duì)分布式訓(xùn)練的封裝,針對(duì) NVIDIA 的 NCCL 通信庫進(jìn)行了優(yōu)化。
在混合精度訓(xùn)練上,Apex 的封裝十分優(yōu)雅。直接使用 amp.initialize 包裝模型和優(yōu)化器,apex 就會(huì)自動(dòng)幫助我們管理模型參數(shù)和優(yōu)化器的精度了,根據(jù)精度需求不同可以傳入其他配置參數(shù)。
from apex import amp

model, optimizer = amp.initialize(model, optimizer)
在分布式訓(xùn)練的封裝上,Apex 在膠水層的改動(dòng)并不大,主要是優(yōu)化了 NCCL 的通信。因此,大部分代碼仍與 torch.distributed 保持一致。使用的時(shí)候只需要將 torch.nn.parallel.DistributedDataParallel 替換為 apex.parallel.DistributedDataParallel 用于包裝模型。在 API 層面,相對(duì)于 torch.distributed ,它可以自動(dòng)管理一些參數(shù)(可以少傳一點(diǎn)):
from apex.parallel import DistributedDataParallel

model = DistributedDataParallel(model)
# # torch.distributed
# model = torch.nn.parallel.DistributedDataParallel(model, device_ids=[args.local_rank])
# model = torch.nn.parallel.DistributedDataParallel(model, device_ids=[args.local_rank], output_device=args.local_rank)
在正向傳播計(jì)算 loss 時(shí),Apex 需要使用 amp.scale_loss 包裝,用于根據(jù) loss 值自動(dòng)對(duì)精度進(jìn)行縮放:
with amp.scale_loss(loss, optimizer) as scaled_loss:
scaled_loss.backward()
匯總一下,Apex 的并行訓(xùn)練部分主要與如下代碼段有關(guān):
# main.py
import torch
import argparse
import torch.distributed as dist

from apex.parallel import DistributedDataParallel

parser = argparse.ArgumentParser()
parser.add_argument('--local_rank', default=-1, type=int,
help='node rank for distributed training')
args = parser.parse_args()

dist.init_process_group(backend='nccl')
torch.cuda.set_device(args.local_rank)

train_dataset = ...
train_sampler = torch.utils.data.distributed.DistributedSampler(train_dataset)

train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=..., sampler=train_sampler)

model = ...
model, optimizer = amp.initialize(model, optimizer)
model = DistributedDataParallel(model, device_ids=[args.local_rank])

optimizer = optim.SGD(model.parameters())

for epoch in range(100):
for batch_idx, (data, target) in enumerate(train_loader):
images = images.cuda(non_blocking=True)
target = target.cuda(non_blocking=True)
...
output = model(images)
loss = criterion(output, target)
optimizer.zero_grad()
with amp.scale_loss(loss, optimizer) as scaled_loss:
scaled_loss.backward()
optimizer.step()
在使用時(shí),調(diào)用 torch.distributed.launch 啟動(dòng)器啟動(dòng):
UDA_VISIBLE_DEVICES=0,1,2,3 python -m torch.distributed.launch --nproc_per_node=4 main.py
在 ImageNet 上的完整訓(xùn)練代碼,請(qǐng)點(diǎn)擊Github。

Horovod 的優(yōu)雅實(shí)現(xiàn)

Horovod 是 Uber 開源的深度學(xué)習(xí)工具,它的發(fā)展吸取了 Facebook "Training ImageNet In 1 Hour" 與百度 "Ring Allreduce" 的優(yōu)點(diǎn),可以無痛與 PyTorch/Tensorflow 等深度學(xué)習(xí)框架結(jié)合,實(shí)現(xiàn)并行訓(xùn)練。
在 API 層面,Horovod 和 torch.distributed 十分相似。在 mpirun 的基礎(chǔ)上,Horovod 提供了自己封裝的 horovodrun 作為啟動(dòng)器。
與 torch.distributed.launch 相似,我們只需要編寫一份代碼,horovodrun 啟動(dòng)器就會(huì)自動(dòng)將其分配給 個(gè)進(jìn)程,分別在 個(gè) GPU 上運(yùn)行。在執(zhí)行過程中,啟動(dòng)器會(huì)將當(dāng)前進(jìn)程的(其實(shí)就是 GPU的)index 注入 hvd,我們可以這樣獲得當(dāng)前進(jìn)程的 index:
import horovod.torch as hvd

hvd.local_rank()
與 init_process_group 相似,Horovod 使用 init 設(shè)置GPU 之間通信使用的后端和端口:
hvd.init()
接著,使用 DistributedSampler 對(duì)數(shù)據(jù)集進(jìn)行劃分。如此前我們介紹的那樣,它能幫助我們將每個(gè) batch 劃分成幾個(gè) partition,在當(dāng)前進(jìn)程中只需要獲取和 rank 對(duì)應(yīng)的那個(gè) partition 進(jìn)行訓(xùn)練:
train_sampler = torch.utils.data.distributed.DistributedSampler(train_dataset)

train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=..., sampler=train_sampler)
之后,使用 broadcast_parameters 包裝模型參數(shù),將模型參數(shù)從編號(hào)為 root_rank 的 GPU 復(fù)制到所有其他 GPU 中:
hvd.broadcast_parameters(model.state_dict(), root_rank=0)
然后,使用 DistributedOptimizer 包裝優(yōu)化器。它能幫助我們?yōu)椴煌?GPU 上求得的梯度進(jìn)行 all reduce(即匯總不同 GPU 計(jì)算所得的梯度,并同步計(jì)算結(jié)果)。all reduce 后不同 GPU 中模型的梯度均為 all reduce 之前各 GPU 梯度的均值:
hvd.DistributedOptimizer(optimizer, named_parameters=model.named_parameters(), compression=hvd.Compression.fp16)
最后,把數(shù)據(jù)加載到當(dāng)前 GPU 中。在編寫代碼時(shí),我們只需要關(guān)注正常進(jìn)行正向傳播和反向傳播:
torch.cuda.set_device(args.local_rank)

for epoch in range(100):
for batch_idx, (data, target) in enumerate(train_loader):
images = images.cuda(non_blocking=True)
target = target.cuda(non_blocking=True)
...
output = model(images)
loss = criterion(output, target)
...
optimizer.zero_grad()
loss.backward()
optimizer.step()
匯總一下,Horovod 的并行訓(xùn)練部分主要與如下代碼段有關(guān):
# main.py
import torch
import horovod.torch as hvd

hvd.init()
torch.cuda.set_device(hvd.local_rank())

train_dataset = ...
train_sampler = torch.utils.data.distributed.DistributedSampler(
train_dataset, num_replicas=hvd.size(), rank=hvd.rank())

train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=..., sampler=train_sampler)

model = ...
model.cuda()

optimizer = optim.SGD(model.parameters())

optimizer = hvd.DistributedOptimizer(optimizer, named_parameters=model.named_parameters())
hvd.broadcast_parameters(model.state_dict(), root_rank=0)

for epoch in range(100):
for batch_idx, (data, target) in enumerate(train_loader):
images = images.cuda(non_blocking=True)
target = target.cuda(non_blocking=True)
...
output = model(images)
loss = criterion(output, target)
...
optimizer.zero_grad()
loss.backward()
optimizer.step()

在使用時(shí),調(diào)用 horovodrun 啟動(dòng)器啟動(dòng):
CUDA_VISIBLE_DEVICES=0,1,2,3 horovodrun -np 4 -H localhost:4 --verbose python main.py
在 ImageNet 上的完整訓(xùn)練代碼,請(qǐng)點(diǎn)擊Github。

尾注

本文中使用的 V100-PICE (前 4 個(gè) GPU)的配置:
圖 2:配置詳情
本文中使用的 V100 (前 4 個(gè) GPU)的配置:
圖 3:配置詳情
本文中使用的 K80 (前 4 個(gè) GPU)的配置:
圖 4:配置詳情
筆者本身是 CV 研究生,今天摸魚的時(shí)候一時(shí)興起研究了一下,后面再慢慢完善~工業(yè)界的同學(xué)應(yīng)該有自己的 best practice,feel free to 提 PR 或者留言~


13個(gè)你一定要知道的PyTorch特性

解讀:為什么要做特征歸一化/標(biāo)準(zhǔn)化?

一文搞懂 PyTorch 內(nèi)部機(jī)制

張一鳴:每個(gè)逆襲的年輕人,都具備的底層能力


關(guān)


學(xué),西學(xué)學(xué)運(yùn)護(hù)號(hào)質(zhì),結(jié)識(shí)關(guān)[],學(xué)習(xí)進(jìn)


瀏覽 117
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)
評(píng)論
圖片
表情
推薦
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)

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

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 国产成人视频免费观看| 久久久aaa| AV色图| 豆花视频成人精品视频| 久久成人综合网| 中文字幕12页| 91人妻无码精品一区二区| 98在线++传媒麻豆的视频| 亚洲福利免费观看| 大香蕉伊人av| 黄色视频网站亚洲| 欧美性爱怡红院| 亚洲综合激情| 家庭乱伦影视| 456亚洲影院| 亚洲精品乱码久久久久久按摩观| 三级在线网| 欧美一级片在线| 操一线天逼| 欧美伦妇AAAAAA片| 另类罕见稀奇videos| 樱桃码一区二区三区| 国产精品免费观看久久久久久久久 | 日韩AV免费在线观看| 99久久人妻无码中文字幕系列| 西西4444WWW无码精品| 韩国日本美国免费毛片| 国产一级a毛一级a毛视频在线网站? | 中文字幕无码人妻在线视频| 内射视频网站| 亚洲成人无码视频在线观看| 免费无码国产在线观看快色| 夜夜撸一撸| 亚洲精品一区二区三| 久久久婷婷五月亚洲国产精品 | 天天爽夜夜爽夜夜爽精品| 中文字幕日韩在线观看| 天天拍天天日| 国产高清自拍视频| 午夜视频无码| 美女自慰网站在线观看| 亚洲三级自拍| 2025AV天堂网| 少妇熟女视频一区二区三区| 亚洲无码大全| 一道本视频在线| 伊人大香蕉电影| 夜夜AV| 日韩一级片在线播放| 免费中文资源在线观看| 一区久久| 亚洲国产精品一区二区三区| 中国免费一级无码成人片| 99re欧美激情| 欧美国产日韩在线观看| 国产老熟女高潮毛片A片仙踪林| 东京热黄色| 日本成人午夜福利| 五月婷婷六月色| 国产成人精品a区在线观看| 久久久久无码精品国产91福利 | 欧美福利在线观看| 黑人无码| 家庭乱伦AV| 天天日天天操天天| 另类老妇奶BBBBwBB| 亚洲人人色| 无码免费毛片一区二区三区古代| 精品黑人| 青青啪啪啪| 亚洲小说欧美激情另类A片小说 | 18禁黄网站| 丁香五月天天| 亚洲小电影| 黄色视频在线观看地址| 囯产一级a一级a免费视频| 日本a片| 天天成人| 91精品视频在线播放| 俺来俺去www色官网| 欧美亚洲激情| 操b视频在线播放| 免费无码成人片在线观看在线| 羽月希奶水饱胀在线播放| 国产无码内射| 天天爽天天搞| 好逼123| 成人区精品一区二区婷婷| 中文字幕AV在线免费观看| 蜜臀久久99精品久久久晴天影视 | 色色网站视频| 黄色A级毛片| 欧美日韩国产成人在线观看| 中文字幕在线观看av| 五月天久久久久| 欧美性爱综合网| 日韩不卡电影| 五月欧美激情| 日本午夜福利电影| 国产三级免费观看| 青娱乐国产AV| 青青草无码| 在线免费看黄视频| 亚洲欧美精品AAAAAA片| 囯产精品久久久久久久久久| 夜夜撸日日| 日产久久久| 麻豆精品在线| 亚洲AV成人无码精品区| 欧美老妇日韩| 亚洲性爱视频在线观看| 爱爱爱爱视频| 亚洲在线无码播放| 高清无码18| 丰满岳乱妇一区二区三区全文阅读| 操逼操逼操逼操逼操逼操逼| 欧美日韩黄片| 国产精品日韩无码| 伊人大香蕉视频在线观看| 韩国三级HD中文字幕2019年| 无码福利电影| 欧美爱爱网站| 小佟丽娅大战91哥| 91av成人| 污网站免费观看| 天天拍天天日| 91大神免费观看| 亚洲一区二区三区在线| 色色五月丁香婷婷| 成人精品二区| 超碰在线| 激情综合婷婷| 天天干天天日天天干天天日| 中文字幕首页| 一区二区三区四区五区在线| 亚洲国产毛片| 国产成人无码精品一区秘二区| 俺来了俺去了www色官网| av电影在线观看| 色婷婷精品视频| 99久久亚洲精品日本无码| 久草黄色电影在线观看| 在线永久看片免费的视频| av资源在线看| 欧美MV日韩MV国产网站| 精品无码一区二区人妻久久蜜桃| 北条麻妃无码在线播放| 国产一级女婬乱免费看| 伊人久久香蕉网| 好爽~要尿了~要喷了~同桌| 欧美成人免费| 高清国产mv在线观看| 九九精品视频在线观看| 一个人看的www日本高清视频| 2020人妻中文字幕| 久久丁香五月婷婷五月天激情视频 | 日韩中文字幕在线播放| 欧美一级一级| 老太色HD色老太HD| 精品一区二区三区四区五区六区 | 久久911| 免费黄色在线| H片在线免费观看| 影音先锋av资源网站| 丁香激情综合| 人妻超碰在线| 日韩毛片在线| 国产精品无码无套在线| 欧美午夜视频| 91无码人妻一区二区成人AⅤ| 超碰97老师| 久久久久亚洲AV无码成人片| 蜜桃av久久久亚洲精品| 熟妇高潮一区二区高潮| 大香蕉av在线| 欧洲成人在线| 99热91| 亚洲高清成人动漫| 草草浮力院| 国产视频无码在线| 中国老女人日逼| 操操操操一本到| 国产精品无毛五区六区| 精品视频一区二区三区| www.久久99| 一区二区三区四区免费观看| 日本欧美黄色| 怡春院AV| 国产36页| 国产九九九九九九| 刘玥一级婬片A片AAA| 无码激情18激情视频| 中文字幕成人av| 成人国产精品在线观看| 久草黄色电影在线观看| 97人妻精品| 人人操人| 麻豆AV96熟妇人妻| 精品久久久久久久久久| 色久在线| 亚洲色情在线观看| 欧美成人三级在线观看| 国产黄片免费在线观看| 亚洲精品无码中文字幕| 成人短视频在线观看| 日本国产在线| 99久久99久久久精品棕色圆| 91人人妻人人澡人人爽人人精品| 亚洲成人精品一区| 羞羞涩漫无码免费网站入口| 欧美色图视频在线观看| 国产欧美综合在线观看| 成人片网站在线观看| 久久精品性爱| 人人操天天干| 日日爱99| 蝌蚪九色啦403| 99久久爱re热6在播放| 国产一级婬片A片免费妖精视频| 国产香蕉视屏| 亚洲一级免费免费在线观看| 午夜免费播放观看在线视频| 日日夜夜天天操| 综合五月婷婷| 亚洲国产成人精品激情在线| 99热在线观看精品| 午夜性爱福利视频| 日韩无码视频播放| 中文字幕乱码中文乱码图片| 在线中文字幕亚洲| www.日逼| 少妇搡BBBB搡BBB搡HD(| 五月婷婷婷婷| 北条麻妃人妻中文字幕91影视 | 亚洲少妇熟女| 自拍偷拍15p| 中文字幕国产精品| 午夜无码人妻AV大片| av黄色在线| 日韩成人一区| 九九在线视频| 就去se超碰| 久久久久国产一区二区三区四区 | 国产精品国产精品国产| 男人天堂中文字幕| 熟女啪啪| 亚洲AV无码成人精品区www| 丰满人妻-区二区三区| 亚洲AV无码成人精品一区| 色婷婷播放| 亚州中文字幕| 黄色AV免费看| 国产色av| 日本三级网站| 国产精品一区网站| 东北骚妇大战黑人视频| 美女扣逼网站| 国产三级在线免费观看| 超碰在线网站| 色噜噜在线| 麻豆操逼| 四虎国产精品成人久久| 乱伦91视频| 成人黄色免费在线| 日本免费在线视频| 亚洲成人网在线| 毛片网站在线| 日韩强操逼网| 中国人妻HDbute熟睡| 变态另类av| 日日射天天干| 亚洲最新中文字幕| 最近中文字幕免费| 日韩视频一级| 欧洲无码一区二区三区| 亚洲激情自拍| 深夜福利18| 影音先锋男人资源站| 51无码| 大香蕉视频在线观看| 国产欧美二区综合中文字幕精品一| 五月天啪啪视频| 黄色视频在线免费观看网站| 日韩精品综合| 強姦婬片A片AAA毛片Mⅴ| 脓肿是什么原因引起的,该怎么治疗 | 51无码| 日本黄色视频在线播放| 91在线看片| 人人色人人摸| 成人AV片导航| 在线看黄网站| 免费AV在线| 亚州精品成人片| 国产小黄片在线| 国产在线精品观看| 久草小视频| 国产人国产视频成人免费观看…| 五月丁香中文| 奇米影视77777| 亚洲成人天堂| 色aV牛牛在线观看| Www.黄色| 亚洲激情图| 国产婷婷久久| 美女视频黄a视频全免费不卡 | 苍井空一区二区三区| 人妻人人爱| 一级a片在线免费观看| 麻豆一区在线| 九一久久| 日韩一级在线| 亚洲福利在线免费观看| 人人草大香蕉| 中文字幕+乱码+中文乱码91| 日韩av一级| 北条麻妃JUX-869无码播放| 大鸡吧在线视频| 久久午夜无码鲁丝片午夜精品偷窥| 围内精品久久久久久久久白丝制服| 囯产精品99久久久久久WWW| 日韩无码激情| 亚洲色婷| 免费18禁网站| 精品人妻中文字幕| 在线观看AⅤ| 大香蕉三级| 九九在线视频| 国产精品伦子伦免费视频| 婷婷五月精品| 伊人网视频在线观看| 精品国产一二三区| 成人欧美精品区二区三| 青娱乐青青草| 久草大香蕉视频| 亚洲视频成人| 老司机永久免费91| 在线播放国产精品| 婷婷99狠狠躁天天躁| 小黃片秘嗯嗯啊| 福利视频三区| 欧美操逼逼| 亚洲一本大道| 亚洲精品国产成人综合久久久久久久久| 一级黄色大毛片| 性欧美欧美巨大69| 91做爱视频| 综合视频一区| 欧美人妻精品| а√天堂中文最新版8| 成人免费精品视频| 黄色福利在线观看| 蜜桃久久久亚洲精| 午夜久久电影| 亚洲欧美日韩在线| 1插菊花网| 欧美77777| 九色蝌蚪9l视频蝌蚪9l视频成人熟妇 | 学生妹毛片| 黄色av网| 日韩人妻视频| 欧美久色| 91精品国产日韩91久久久久久 | 亚洲高清视频免费| 无码国产精品一区二区免费96| 九九re精品视频在线观看| 网址你懂得| 操小逼视频| 日韩人妻中文| 国产欧美一区二区三区国产幕精品 | 丝瓜视频| jzzijzzij亚洲成熟少妇在线观看 九色蝌蚪9l视频蝌蚪9l视频成人熟妇 | 国产主播一区二区| 日韩国产中文字幕| 国产在线色视频| 激情视频国产| 亚洲欧美久久久久久久久久久久| 青娱乐欧美| 精品九九九九九九| 波多野结衣东京热| 按摩性高湖婬AAA片A片中国| 日韩AV免费电影| 日韩网站在线| 妻子互换被高潮了三次| 国产精品尤物| 亚洲中文字幕码mv| 人人操夜夜爽| 无码人妻一区二区三区| 91在线一区| 一夲道无码专区av无码A片| 无码乱| 欧美精产国品一二三区| 欧美成人福利在线观看| 9I看片成人免费视频| 亚洲综合在线播放| 草比网| 操逼视频免费网站| 亚洲AV无码日韩AV无码导航 | 少妇厨房愉情理伦BD在线观看| 国产成人av| 久久久久久久成人| 国产精品视频你懂的| 日本a片在线观看| 在线中文字幕第一页| 99这里只有精品视频| 五月婷婷导航| a无码| 欧美另类综合| 久久久人妻无码精品蜜桃| 人妻操| 欧美MV日韩MV国产网站| 色婷婷久久综合久色| 久久婷婷国产麻豆91天堂| 亚洲色逼图片| 日韩人妻精品无码| 国语精品自拍| 精品视频一区二区三区四区| 91叉叉叉| 久爱视频| 99热网站| 少妇人妻精品| 国产亚洲色情| 久久婷五月| 夜夜爱视频| 色色免费黄色视频| 亚洲精品国产成人综合久久久久久久久| 友田真希一级婬片A片| 国产成人视频在线| 午夜福利成人网站| 亚洲三级片免费观看| 中国熟妇XXXX18| 国产成人亚洲综合AV婷婷| 午夜影院操| 久久精品国产亚洲| 国产香蕉在线视频| 3d动漫一区二区| 亚洲视频播放| 日韩一区二区三| 欧美一级特黄AAAAAA片在线视频| 狼人香蕉网| 激情二区| 亚洲日韩电影| 亚洲无码字幕| 免费在线观看Av| 日韩视频播放在线综合| 国产成人AV在线播放| 综合色色婷婷| 成人伊人AV| 亚洲欧美视频在线观看| 无码在线不卡| 国产欧美综合三级伦| 中文字幕永久在线| 成人免费在线| www.91熊猫成人网| 98无码人妻精品一区二区三区 | 成年人免费黄色视频| 黄色三级片网站| 四川婬妇BBw搡BBBB搡| 青青操日日干| 久久成人综合网| 男女啪啪免费网站| 亚洲AV电影天堂| 黑人AV在线观看| 一道本不卡视频| 欧美日韩毛| 夜夜操网站| 黄色电影网页| 自拍偷拍一区二区三区| 人人色人人摸| 亚洲欧美国产日韩字幕| 三级片亚洲无码| 蜜桃无码视频小说网站| 影音先锋资源| 亚洲欧美日韩一区二区| WWW色色| 日本A∨在线| 国产一级a毛一级a做免费的视频l 精品国产免费观看久久久_久久天天 | 东京热一区二区三区| 色噜噜人妻丝袜无码影院| 欧美V亚洲| 五月色婷婷撸| 毛片久久| 亚洲黄色小视频| 久久探花| 影音先锋黄色资源| 熟妇私拍| 国产69精品久久久久久久久久久久 | 操逼精品| 天堂网av在线| 成全在线观看高清的| 黄在线免费观看| 激情五月天亚洲| 国产绿奴09-01| 第一页在线| 青娱乐亚洲自拍| 无码人妻精品一区二区三区蜜桃91 | 九九乱伦| 伊人看片| 黄在观看线| 99热这里只有精品999| 国内自拍99| 日韩东京热中文字幕| 中文字幕有码视频| 婷婷五月在线观看| 日韩欧美123| 91精品日韩| 免费黄色成人| 五月天激情av| 黄色污污污网站| 国产激情视频在线免费观看| 日韩性爱在线| 久久久精品国产| 一区二区高清视频| 日韩久久电影| 不卡不在线中文| 97人人人人人人| 国产视频a| 成年人黄色视频| 伊人久久久影视大全| 北条麻纪视频| 欧美人妻视频在线| 久久婷婷五月| 91在线观看高清18| 天天爽日日澡AAAA片| 日韩A级毛片| 婷婷五月精品中文字幕| 欧美日韩网站| 亚洲精品国产成人综合久久久久久久久| 精品欧美一区二区三区久久久 | 在线日韩视频| 91口爆| 波多野结衣亚洲无码| www.av91| 久久精品一区二区三区蜜芽的特点| 五月天婷婷丁香综合视频| 丁香婷婷激情五月| 男人天堂资源网| 黄色成人大片| 2020无码| 欧美老熟妇BBBBB搡BBB| 人妻丰满熟妇av无码| 奇米狠狠777| 亚洲免费观看高清完整| 欧美精品久| 爆操无码| 东北奇淫老老妇| 国产人成视频| 欧美久久性爱视频| 亚洲天堂无码av| 99热99re6国产线播放| 无码日韩av| 天天日天天日天天日| 国产免费一区二区三区四区| 豆花网无码视频观看| www91久久| 黄色视频在线| 噼里啪啦免费观看视频大全| www.日本黄色| 中文字幕乱码视频| 91aV视频| jizz久久| 中文字幕在线不卡视频| 在线观看的av网站| 亚洲国产爱| 色综合久久天天综合网| 西西444WWW无码大胆| 国精产品一区一区三区| 亚洲日本在线观看| 99综合| 国产精品三级片| 国产非洲欧美在线| 粉嫩一区二区三区四区| 日夜夜操| 国产精品女人777777| 日本一级特黄大片AAAAA级| 开心激情婷婷| 美女自慰网站免费| 99久久久国产精品无码| 欧美性猛交XXXX乱大交3| 香蕉一区| 日韩免费视频| 无码不卡视频在线| 精品人人人| 丁香六月色| 日韩成人一级片| 91高清在线| 国产精品无码成人AV在线播放| 日韩欧美在线免费观看| 中文字幕免费看| 日韩一级二级| 亚洲AV无码成人精品久久久| 日韩无码波多野结衣| 国产日韩欧美成人| 欧美三级欧美三级三级| 一插菊花综合视频| 人人操人人骑| 99无码| 欧美丰满少妇人妻精品| 日韩电影免费在线观看中文字幕| 人妻一区二区三区| 色老汉视频| 国产美女自拍| 日逼导航| 乱轮视频| 国产秘精品一区二区三区免费| 欧美色图另类| 亚洲日韩AV无码专区影院| 中文字幕一区三区三A片密月| 91破处网站| 欧美日韩一区视频| 久久免费视屏| 日韩人妻无码专区| 国产91在线中日| 国产有码在线观看| 日B视频在线观看| 蜜芽成人在线| 亚洲女人被黑人巨大的原因| 麻豆成人无码| 九色PORNY丨自拍蝌蚪| 99re伊人| 白浆av| 亚洲人气无码AV| 梁祝艳谭A级毛片| 日韩性爱在线观看| 97精品在线| 色玉米地熟妇| 日韩一区二区视频在线观看| 国产无遮挡又黄又爽又色| 人妻大屁股-91Porn| 狠狠干狠狠操| 丁香五月伊人| 91久久成人| 四虎黄色| 搞搞网日本9| 国产AⅤ无码一区二区| 四虎永久在线精品| 超碰人人在线| 色丁香五月| 日本中文字幕免费| 国产精品一二三区夜夜躁| 日韩乱轮小说与视频| 青青草黄色视频| www.99精品| 国产性爱精品影片免费看| 91久久久久久久久久| 国产三级片在线观看视频| 国产人妖在线| 黑人AV在线播放| 春色AV| 成人国产在线| 中文亚洲精品字幕电影| 国产粉嫩在线观看| jizz99| 69AV视频网站| 丁香六月综合激情| 日韩成人综合| 国精产品九九国精产品| 日韩在线视频一区二区三区 | 99导航| 2019人人操| 中文字幕有码视频| 91香蕉网站| 欧美日韩大香蕉| 91成人片| 四虎成人在线| 蜜臀99久久精品久久久久久软件| 国产操逼免费看| 自拍视频国产| 免费a视频| 久久精品无码一区二区无码性色 | 99在线免费观看视频| 麻豆熟妇乱妇熟色A片在线看| 日韩欧美123| 最新va在线观看| 亚洲AV无码久久寂寞少妇多毛| 久久久久久亚洲AV无码专区| 欧美操日本| 懂色av蜜臀av粉嫩av分享| 国产精品国产精品国产| 黑人亚洲娇小videos∞| 久久99精品久久久久久| 444444在线观看免费高清电视剧木瓜一 | 久草五月| 国产激情| 亚洲三级无码视频| 69xx视频| 日本久久久久久久久视频在线观看 | 西西人体大胆ww4444图片| 午夜福利视频91| 少妇精品无码一区二区免费视频| 亚洲av大全| 豆花成人社区,视频| 婷婷丁香五月网| 婷婷激情久久| 欧美日韩V| 国产精品无码成人AV在线播放| 男女怕怕网站| 天天弄天天操| 久久久999精品视频| 91精品人妻少妇无码影院| 精品无码一区二区三区| 中文字幕亚洲无码视频| 黄片免费大全| aaa三级片| 婷婷综合| 亚洲中文字幕在线视频播放| 无码人妻丰满熟妇bbbb| 爱搞搞爱干干| 久久精品熟妇丰满人妻99| 国产成人精品久久二区二区91 | 中文字幕免费一区| 大香蕉久热| 人人操人人爱人人摸| 中文字幕99| 91av免费看| 色久在线| 骚逼自拍| 欧美一卡二卡三卡| 欧美做受高潮白| 人人舔| 欧美午夜爱爱| 三级无码| 成人网站三级片| 欧美日韩不卡在线| 影音先锋av中文字幕| 狼人综合色| 免费网站观看www在线观看| 粉嫩99国产精品久久久久久人妻| 操逼网站大全| 国产女人与禽zOz0性| 免费观看无码| 玖玖激情| 欧美国产在线观看综合| 日日摸日日操| 一道本视频在线免费观看| 抽插视频免费| 欧美成人免费观看| 日韩无码电影网| 亚洲无码免费播放| 97人妻碰碰中文无码久热丝袜 | 久操视频免费在线观看| 大香蕉伊人丁香五月| 青青草伊人网| 99re这里只有精品6| 亚洲日韩电影| AV一区二区在线观看| 777国产盗摄偷窥精品0000| 国产免费麻豆| 午夜亚洲精品| 乱轮少妇| 色xxx| 国产精品欧美日韩| 欧美日韩A片| 国产视频在线播放| 日韩大吊| 伊人亚洲综合| 天堂网亚洲| 91吊逼| 99热免费在线| 爱爱爱爱视频| 亚洲欧洲免费看| 欧美精品成人| AV网站免费在线观看| 五月丁香婷婷久久| 操逼视频在线免费观看| 日韩AV成人电影| 先锋成人影音| 成人黄色免费网站| 中文字幕国产AV| 2017天天射| 91日韩| 亚洲免费观看高清完整版在线| 国产成人三级片在线观看| 伊人成人在线观看| 久操视频网站| 91无码国产成人精品| 亚洲第一中文字幕网| 丁香花小说完整视频免费观看| 刘玥一级婬片A片AAA| 久久黄色视| 国产又粗又长的视频| 欧美一级欧美三级在线观看| 欧美爱爱试看| 日韩高清在线| 再深点灬好爽灬轻点久久国产| 精品a片| S牛牛AV| 青青草免费公开视频| 狠狠干在线观看| 足交在线播放| 草比网| 操批视频| 亚洲成人一级片| 国产精品1区2区3区| 日P免费视频| 中文字幕av久久久久久欧洲尺码 | 三级片免费网址| 国产精品嫩草久久久久yw193| 成人国产精品秘在线看| 91精品人妻一区二| 操日本少妇| 亚洲色图欧美| 久久精品v| 超碰9| 五月在线| 亚洲av偷拍| 人妻啪啪| 加勒比无码综合| 国产av高清| 2025中文字幕| 狠狠综合网| 无码不卡av| 国产在线欧美| 日韩AV三级片| 蜜桃av秘无码一区三区四| 亚洲成人黄色网| 日韩视频区| 在线黄色视频网站| 99色亚洲| 国产欧美综合在线三区| 大香蕉伊人综合| 欧美在线视频免费观看| 福利视频三区| 国产无码影视| 国产乱码一区二区三区| 日本成人午夜福利| 亚洲av在线观看| A片在线观看视频| 中文字幕不卡视频| 操逼中文字幕| 成人色色| 超碰97成人| 青青草国产在线视频| 午夜视频在线| 欧美不卡视频| 97久久精品国产熟妇高清网 | 97爱爱爱| 免费黄色视频网站大全| 天天舔九色婷婷| 西西888WWW大胆视频| 翔田千里无码流出两部| 国产成人免费视频| 野花AV| 91AV在线看| 91亚洲国产AⅤ精品一区二区 | 蜜桃视频com.www| 在线操逼视频| 青青草原视频在线免费观看| 无码日韩av| 欧美美女视频网站| 一区二区三区精品| 欧美视频免费| 三级网站在线播放| 激情动态视频| 人人操人人干人人爽| 日本特黄AA片免费视频| 亚洲午夜免费视频| 黄色激情五月| 中文无码在线观看中文字幕av中文| 日韩性爱一区| 男人天堂资源网| 少妇喷水在线观看| 性性性性性XXXXX| 婷婷五月激情小说| 性欧美一区二区| 亚洲精品鲁一鲁一区二区三区| 女人高潮天天躁夜夜躁| 手机看片福利一区二区| 在线免费看av| 亚洲福利片| 在线观看高清无码视频| 欧美日在线| 2025中文字幕| 无码三级在线观看| 五月丁香影院| 韩日毛片| 国产高清在线视频| 四川BBBB擦BBBB| 日韩视频在线免费观看| 欧美精品久久久久久久多人混战| 18禁在线播放| 夜夜骚AV一二三区无码| 天天日夜夜| 亚洲欧美视频| AV天堂影视在线观看| 亚洲精品中文字幕在线| 大奶一区二区| 国产在线一二三| 99re热在线视频| 三级不卡视频| AAA一区二区三区| 瑟瑟免费视频| 国产美女免费视频| 99免费小视频| 一区二区三区精品无码| 色视频在线播放| 日本A在线观看| 牛牛影视av老牛影视av| 亚洲色图一区二区三区| 午夜成人毛片|