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

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

共 14109字,需瀏覽 29分鐘

 ·

2020-09-15 09:35

↑ 點(diǎn)擊藍(lán)字?關(guān)注極市平臺(tái)

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

極市導(dǎo)讀

?

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


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

Take-Away

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

1、簡(jiǎn)單方便的 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í)間的測(cè)試,測(cè)試結(jié)果發(fā)現(xiàn) Apex 的加速效果最好,但與 Horovod/Distributed 差別不大,平時(shí)可以直接使用內(nèi)置的 Distributed。Dataparallel 較慢,不推薦使用。(后續(xù)會(huì)補(bǔ)上 V100/K80 上的測(cè)試結(jié)果,穿插了一些試驗(yàn)所以中斷了)

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

簡(jiǎn)單方便的 nn.DataParallel

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

DataParallel 使用起來(lái)非常方便,我們只需要用 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 等等。通過(guò) MPI 實(shí)現(xiàn) CPU 通信,通過(guò) NCCL 實(shí)現(xiàn) GPU 通信。官方也曾經(jīng)提到用 DistributedDataParallel 解決 DataParallel 速度慢,GPU 負(fù)載不均衡的問(wèn)題,目前已經(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í)行過(guò)程中,啟動(dòng)器會(huì)將當(dāng)前進(jìn)程的(其實(shí)就是 GPU的)index 通過(guò)參數(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)練庫(kù)。Apex 對(duì)混合精度訓(xùn)練的過(guò)程進(jìn)行了封裝,改兩三行配置就可以進(jìn)行混合精度的訓(xùn)練,從而大幅度降低顯存占用,節(jié)約運(yùn)算時(shí)間。此外,Apex 也提供了對(duì)分布式訓(xùn)練的封裝,針對(duì) NVIDIA 的 NCCL 通信庫(kù)進(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),可以無(wú)痛與 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í)行過(guò)程中,啟動(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 或者留言~


推薦閱讀


添加極市小助手微信(ID : cvmart2),備注:姓名-學(xué)校/公司-研究方向-城市(如:小極-北大-目標(biāo)檢測(cè)-深圳),即可申請(qǐng)加入極市目標(biāo)檢測(cè)/圖像分割/工業(yè)檢測(cè)/人臉/醫(yī)學(xué)影像/3D/SLAM/自動(dòng)駕駛/超分辨率/姿態(tài)估計(jì)/ReID/GAN/圖像增強(qiáng)/OCR/視頻理解等技術(shù)交流群:月大咖直播分享、真實(shí)項(xiàng)目需求對(duì)接、求職內(nèi)推、算法競(jìng)賽、干貨資訊匯總、與?10000+來(lái)自港科大、北大、清華、中科院、CMU、騰訊、百度等名校名企視覺開發(fā)者互動(dòng)交流~

△長(zhǎng)按添加極市小助手

△長(zhǎng)按關(guān)注極市平臺(tái),獲取最新CV干貨

覺得有用麻煩給個(gè)在看啦~??
瀏覽 59
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

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

手機(jī)掃一掃分享

分享
舉報(bào)

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

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 国产无码中文| 蜜桃免费视频| 噜噜噜色| 久久亚洲一区| 亚洲免费在线婷婷| 77777色婷婷| 人人草人人摸人人看| 综合色色婷婷| 蜜桃视频成人版网站| 97人人艹| 久久久一区二区三区四区| 少妇白洁在线观看| 高清中文字幕在线A片| 日本人妻在线播放| 空姐白洁| AV电影在线观看| 色五月婷婷在线| 亚洲AV秘成人久久无码海归| 五月天婷婷在线观看视频| 青青草免费在线视| 透逼视频| 特级西西44www无码| 精品成人视频| 免费网站观看www在线观| 成人一区二区在线观看| 久久婷婷无码视频| 色色激情视频| 成人久久久| 正在播放JUQ-878木下凛凛子 | 久久H| 91在线亚洲| 张柏芝BBw搡BBBB槡BBBBHDfree| 中文无码观看| 99免费热视频| 天天色天天干天天| 狼人色影院| 翔田千里一区二区| 69er小视频| 在线亚洲一区| av影音先锋在线| 搡BBBB搡BBB搡五十粉嫩| 影音先锋成人AV| 久99久热| 午夜福利91| 99国产精品久久久久久久成人| 人妻丰满熟妇av无码| 亚洲国产成人自拍| 一插菊花综合视频| 无码视频免费播放| 国内自拍激情视频| 天天久久| 五月婷婷深深爱| 97精品人人妻人人| 精品人妻一区二区三区在线视频不卡| 欧美一级免费A片| 18禁裸体美女| 日本欧美在线观看高清| 国产性爱AV| 天天干天天色天天日| 欧美特大黄| 四虎影院污| 国产91免费视频| 一级a片激情啪啪免费观| 色接久久| 先锋资源av| 无码视频在线观看免费| 欧美一级婬片AAAA毛片| 国产欧美黄片| 人妻HDHDHD96XXXX| 免费在线无码视频| 日韩无码123区| 欧美不卡在线视频| 8050午夜| 亚洲骚妇| 亚洲三级片在线播放| 黄色视频在线观看国产| 熟女视频91| av午夜激情| 成人性爱在线视频| 亚洲天堂无码AV| 久久免费9| 自拍偷拍一区二区三区| 无码国产传媒精品一区| 日韩在线中文字幕亚洲| 中文字幕操逼网站| 黄色视频网站在线观看| 久久久亚洲无码| 黄片AAA| 2021狠狠操| 98无码人妻精品一区二区三区| 亚洲美女网站在线观看| 天天干天天色天天射| 亚洲精品久久久久毛片A级牛奶| 日日夜夜天天操| 最新av资源| 国产剧情自拍| 亚洲V在线观看| 久久黄色A片| 国产三级片视频在线观看| 99久久久久久久无码| 无码日韩电影| 亚洲国产精品成人综合色在线婷婷| AV观看免费| 69成人精品| 丁香五月综合啪啪| 亚洲AV成人一区二区三区不卡| 草逼综合网| 午夜性爽视频男人的天堂| 91人妻无码| 亚洲天堂久久| 中文字幕AV在线播放| 特级艺体西西444WWw| 中文字幕成人视频| 91无码在线视频| 国产一级a毛一级a做免费图片| 一本高清无码| www.狠狠撸| 久久久久网站| 高清一区二区三区| 大香蕉一区二区| 国产AV18岁| 91九色丨国产丨爆乳| 久色视频| 黄片视频免费看| 特级西西人体444WWw高清大胆| 日日撸视频| 亚洲欧洲无码在线| 精品伊人大香蕉| 精品中文视频| 日韩在线91| 亚洲男女网站| 日韩三级av| 91大香蕉视频| 先锋成人AV| 亚洲无码视频在线看| 久草中文视频| 国产AV天堂| 人人妻人人爽| 在线成人视频网站大香蕉在线网站 | 日欧美美女逼| 亚洲性爱一区二区三区| 精品久久久无码| 日韩永久免费| 国产毛片777777| av黄片| 一级黄色片视频| 久久成人免费| 成人免费黄片| 青草大香蕉| 中文字幕特黄A片| 吃奶做爱视频| 一本无码视频| 免费操逼视频在线观看| 在线观看禁无码精品| 免费黄色大片| 久色无码| 爱爱电影无码| 中文字幕在线永久| 日韩在线一区二区三区四区| 操综合网| 免费网站观看www在线观看| 成人黄色A片| 成人精品视频| 老妇bbw| 日本黄色电影在线播放| 免费版成人久久幺| 午夜福利影片| 亚洲少妇一区| 一区二区三区久久久| 国产操女人| 国产成人V在线精品一区| 一级A片黄色| 老婆被黑人杂交呻吟视频| 中文无码日韩欧美久久| 亚洲一卡二卡| 男人AV网| 友田真希一级婬片A片| 无码乱码在线观看| 国产美女高潮视频| 国产一区二区三区免费视频| 影音先锋AV啪啪资源| 欧美色色网| 欧美成人性色欲影院| 99久久人妻无码中文字幕系列 | 亚洲图片在线播放| 国产精品囯产三级囯产AV野外| 大香蕉性爱网| 蜜臀AV成人精品| 五月丁香五月婷婷| 国产特黄| 国产美女自拍| 视频一区二区三| 免费看一级A片| AV在线天堂| а√在线中文网新版地址在线| 国产一级片免费视频| A片在线观看网站| 韩国精品无码| 青青草原AV| 伊人五月在线| 熟妇偷拍| 国产美女在线播放| 欧洲成人免费视频| 特级西西444www高清视频| 亚洲无码A片在线| yjizz视频网| 亚洲欧美成人在线观看| 日本无码专区| 殴美色色网| 人妻体内射精| 大香蕉网在线| www.五月婷婷| 日韩人妻无码一区二区三区七区 | 婷婷久久网| 无码一区二区三区在线| 成人视频123| 日本无码毛片| 国产一区二区三区在线观看免费视频免费视频免费视频 | 欧美乱伦一区| JlZZJLZZ亚洲美女18| 中文字幕AV在线观看| 网络自拍亚洲激情| 无码一区二区区| 亚洲中文字幕人妻| 国产精品国产成人国产三级| 中文字幕不卡AV在线观看| av在线小说| 国产精品免费观看久久久久久久久| 日本操逼电影| 2025最新国产精品每日更新 | 色色色999| 成人不卡在线| 色五月婷婷综合| h片在线免费观看| 性猛交AAAA片免费观看直播| 小视频你懂的| 影音先锋三级片| 最新中文字幕在线播放| 国产成人综合在线| 伊人精品视频| 色欧美大香蕉| 国产主播专区| 欧美日韩在线视频观看| GOGO人体做爰大胆视频| 日韩一级在线视频| 天干夜天干天天天爽视频| 日本黄色大片| 国产一级影院| 一本色道久久无码人妻精品69 | 91丨PORNY丨丰满人妻网站| 成人精品鲁一鲁一区二区| 苍井空精毛片精品久久久| 中文字幕无码网站| 国产有码视频| 91在线免费看| 国产视频黄| 国产少妇| www.777熟女人妻| anwuye官方网站| 久久国产AV| 欧美18禁| 2025av在线| 国产成人三级| 热久久国产| 国产口爆在线| 国产精品久久777777是什么意思| 激情五月天开心网| 黄色A片免费看| 黄片网站在线观看| 逼逼AV| 中文字幕国产av| 色婷婷天天操天天干| 国产小黄片在线| 麻豆成人无码精品视频| AV无码精品| 天堂网av2025| 精品国产三级| 中文字幕无码精品三级在线欧美| 在线看一区| 欧美中文字幕在线观看| 97人人爽人人爽人人爽| 国产成人在线免费| 懂色Av| 国产在线97| 成人特级毛片全部免费播放| 国产精品成人国产乱| 四虎蜜桃| 五月丁香综合网| av电影在线免费观看| 国产美女啪啪视频| 中文字幕高清| 97国产成人| 亚洲精品资源| 一区二区三区麻豆| 天天色AV| 男女操逼免费观看| 粉嫩小泬BBBBBB免费看| 四川w搡BBB搡wBBB搡| 蜜芽成人在线视频| 乱伦内射| 熟女人妻一区二区三区| 99精品无码视频| 丰滿老婦BBwBBwBBw| 欧美性爱A片| A级片在线观看| 亚洲北条麻妃一级A片| 国产亚洲三级| 成人性生活视频| 亚洲第一色婷婷| 人人操AV| 免费视频在线观看黄| 毛片在线观看视频| 亚洲一级免费免费在线观看| 一本一本久久a久久精品牛牛影视 91无码人妻精品一区二区蜜桃 | 老妇槡BBBB| 亚洲清高毛无码毛片| 三级高清无码视频| 91麻豆精品国产| 成人国产精品免费观看| 秋霞无码| 国产熟妇码视频户外直播| 豆花成人视频在线观看| 欧美日韩小视频| 三级黄,色| 日韩成人一区二区三区| 69亚洲视频| 国产真实露脸乱子伦对白高清视频| 懂色成人av影院| 玖玖爱在线精品视频| 99爱视频| 国产熟妇码视频app| 婷婷综合视频| 人妻无码人妻| 九哥操逼视频| 扒开让我91看片在线看| 欧美精品一二三| 无码人妻免费视频| av片在线免费观看| www.伊人大香蕉| 暖暖在线视频| 九九九九AV| 丁香色五月婷婷| 国产精品乱草| 无码人妻精品一区| 久久成人综合网| 久久九热| 超碰超爽| 国产女人18水真多18精品一级做| 日韩情色片| 国产精品二| 四虎2025在线51| 国产91精品久久久天天| av福利电影在线| av午夜激情| 韩国毛片基地久久| 欧美在线视频一区| 成人三级电影网| 久草视频大香蕉| 俺来了俺去了www色官网| 国产精品午夜福利视频| 99艹艹| 超碰在线观看免费| 精品人妻一区二区乱码一区二区 | 国产精品揄拍一区二区| 天天躁夜夜躁av| 国产在线拍揄自揄拍无码视频| 四川美人搡BBw搡BBw| 亚洲无码播放| 亚洲日韩欧美成人| 国产成人宗合| 国产一级婬乱片AV片AAA毛片| 激情人妻在线| 亚洲色图另类| 国产精品国内自产| 成片免费观看视频大全| 91av在线观看视频| 亚洲高清在线播放| 色哟哟一中文字慕| 国产日韩欧美在线观看| 国产高清免费无码| 人妻少妇偷人精品无码免费| 神马影院午夜福利| 精品伊人大香蕉| 草草网站| 天天夜夜有| 国产人妖在线观看| 九色PORNY丨自拍蝌蚪| 久久久麻豆| 国产乱子伦一区二区三区在线观看| 胖老板办公室沙发无套爆秘书| 欧美成人怡红院| 亚洲精品色色| 五月天婷婷综合| 久久久久亚洲AV无码成人片 | AA黄色电影| 青青操网站| 免费AV网站在线| 精品91海角乱| 四季AV之日韩人妻无码| 国产久久视频| 欧美成人精品欧美一级| TokyoKot大交乱无码| 一区在线观看视频| 国产精品成| 天天操夜夜爽| 国内久久婷婷| 91中文| 无码AⅤ一区二区三区| 久草综合网| 欧美精品一区二区三区使用方法| 五月丁香激情综合| 欧美aaa| 蜜桃AV一区二区三区| 三级视频国产| 91精品国久久久久久无码一区二区三区| 国产成人AV在线观看| 免费AV黄色| 国产h在线观看| 动漫一区二区三区| 91小电影| 青青操在线| 国产高清无码网站| 天天操网站| 69精品在线| 成人网站视频在线免费观看| 99色综合| 四虎影成人精品A片| 亚洲天堂在线播放| 国产精品福利小视频| 午夜精品一区二区三区在线成人| 神马午夜精品96| 91福利网站| 天堂网中文在线| 成人网站在线观看视频| 日韩免费不卡| 欧美A级视频在线观看| 色五月网| 日韩欧美一区在线| 激情人妻在线| 日老女人逼| 91精品久久久久久久久久久久| 亚洲高清在线| 亚洲日韩欧美视频| 成年人免费毛片| 亚洲高清中文字幕| 日韩人妻斩| 日本爱爱片| 黄色成人网站在线观看| 久久久精品亚洲| 国产网站视频| 日本天堂Tv视频在线观看| 97看片| 台湾精品一区二区三区| 色青草影院久久综合| 日本综合久久| 99久久精品国产成人一区二区| 在线观看av网站中文字幕| 天堂在线无码| 欧美熟妇高潮流白浆| 欧美日韩有码视频网址大全| 99re在线视频观看| 翔田千里无码AV在线观看| 少妇三区| 日韩精品不卡| 台湾毛片| 国产午夜福利免费视频在线观看| 久久69| 18AV在线观看| 老女人肏屄视频| 亚洲精品字幕| 牛牛影视av| 三级黄色免费网站| 西西人体大胆ww4444图片| 日韩黄色三级片| 91国语又粗又大对白| 西西人体444www| 亚洲成人精品少妇| 亚洲高清av| 一级黄色电影免费| 特黄A级毛片| 热热色| 91人妻人人澡人人爽人人精| 亚洲欧洲高清无码| 成人手机AV| 国产AV一级| 欧美成人黄色小说| 五月激情婷婷网| 中文字幕午夜福利| 18禁黄网| 狠狠干伊人| 波多野吉衣中文字幕| 日本三级片在线| 91av免费观看| 污污污污污www网站免费观看| 久婷婷| 亚洲中文字幕久久日| 91精品国产综合久久久蜜臀九色 | 国产拍拍视频| 69超碰| 亚洲黄片免费在线观看| 91美女在线视频| 丁香五月天色婷婷| 波多野42部无码喷潮更新时间| 2025av天堂网| 狠狠干天天操| 超碰在线免费播放| 91综合在线| 日韩超碰在线| 精品人妻一区二区三区在线视频不卡| 91视频入口| 免费一级婬片AAA片毛片A级| 黃色一级A片一級片| 色欲一区二区| 好逼天天有| 欧美一级片免费看| 国产一级a毛一级a爰片| 国产高清无码一区二区三区| 无码AV动漫| 久久视频这里有精品| 国产一区二区00000视频| 大香蕉人人| 亚人精品中文字幕在线观看| 日本午夜无码| 安微妇搡BBBB搡BBBB日| 在线观看免费完整版中文字幕视频 | 摸BBB搡BBB搡BBBB| 日韩操比视频| 人妻少妇偷人精品无码免费| 特级西西人体WWWww| 国产乱人| 色婷婷久综合久久一本国产AV | 欧美日韩中文视频| 日本三级网址| 丁香色婷婷| 中文乱伦视频| 国产三级网址| 中文字幕日韩有码| 黄色激情AV| 日韩A| 97资源超碰| 久久久精品免费| 久久精品免费电影| 爱搞搞就要爱搞搞| 免费成人AV| 欧美黄片在线| 91免费福利| 97日日| 久久久久久久网| 午夜无码福利视频| 天堂网视频| 91成人精品一区在线播放| 狠狠穞A片一區二區三區| 欧美一区二区三区成人片在线| 97人妻一区二区精品视频| 又爽又黄免费网站97双女| 尤物Av| 大香蕉视频在线观看| 小黄片网站| 一级国产欧美成人A片| 夜色视频网| 欧美被操| 国产福利美女网站| 爱精品视频| 桃色AV| 亚洲精品大片| 久久草大香蕉| 黑人精品欧美一区二区蜜桃 | 狠狠做深爱婷婷久久综合一区| 午夜黄色操逼视频| 玖玖在线视频| 一级A片一毛片大全| 草草久久久无码国产专区的优势| 中文字幕aV在线| 青青草原在线视频免费观看 | 五月丁香婷婷激情| 免费黄色福利视频| 91精品国产综合久久久久久久| 999国产精品视频| 欧美韩日高清精彩视频| 91传媒在线观看| 久久无码一区二区三区| 国产精品久久久久久久久夜色| 日韩综合在线视频| 久久91精品| 仓井空一区二区三区| 免费的AV网站| 小黄片高清无码| 男人AV网| 欧美无人区码suv| 无码视频免费在线观看| 麻豆人妻换人妻好紧| 日本不卡在线视频| 日韩成人视频在线| 黄片视频免费播放| 欧美h在线观看| 日韩欧美91| 粉嫩99精品99久久久久久特污兔 | 99爱免费视频| 夜夜嗨AⅤ一区二区三区| 欧美性爱第四页| 在线观看一区二区视频| 日日夜夜天天操| www.大吊视频| 91啪啪| 最近中文字幕免费MV第一季歌词十 | 国产夫妻精品| 成人欧美精品区二区三| 四虎黄色影院| 少妇搡BBBB搡BBB搡AA| 高清视频一区| 男人的天堂一区| 91人人妻人人妻人人澡| 99久久国产视频| 丝袜东京热AV高清| 久久久久久久毛片| 中文字幕东京热加勒比| 激情亚洲| 日韩成人免费视频| 成年人毛片| 影音av| 伊人久久大| 亚洲天堂免费观看| 亚洲精品成人无码毛片| 亚洲AV无码乱码精| 九色PORNY蝌蚪自拍视频| 精品国产久| 99黄片| 男人天堂婷婷| aⅴ在线| 人妻无码久久精品| 亚洲无码AV一区二区| 婷婷五月天激情电影| 天天舔天天操| 久久激情av| 美女高潮网站| 少妇一级婬片内射视频| 日本亚洲精品秘入口A片| 欧美五区| 国产超级无码高清在线视频观看| 五月天激情啪啪| 日日碰狠狠躁久久躁婷婷| 亚洲三级国产| 日韩无码高清网站| 五月天丁香成人| 激情啪啪网站| 亚洲视频欧洲视频| 四季AV一区二区凹凸懂色桃花| 在线观看视频日韩| 大香煮伊在75| 99热中文字幕在线观看| 99久久婷婷国产综合精品青牛牛| 99久久99久久99久久久99国产 | 欧美毛视频| 日韩一级一片内射视频4K| 老师机性爱视频在线播放| 人人操AV在线| 老鸭窝av免费入口在线观看| 91激情在线| 北条麻妃一区二区三区在线观看| 日韩欧美综合一区| 最新中文字幕视频| 五月天色色小说| 亚洲人操逼| 日韩五月婷婷| 1024手机在线观看| 91久久久久久久久久久| 91久久精品一区二区三区| 精品操逼视频| 日韩无码流出| 丁香婷婷在线| 88av在线播放| 草草影院CCYYCOM屁屁影院合集限制影院 | 午夜无码人妻AV大片| 日本欧美视频| 天堂成人网| 日本精品国产| 豆花成人视频| 91九九| 五月天婷婷激情| 欧美,日韩,日| 欧美日韩午夜福利视频| 特黄特色免费大片| 免费AV黄色| 久久综合成人| av天堂电影网| 久久久久一区二区三区| 91社区成人影院| 亚洲精品国产精品国自产A片同性 丰满人妻一区二区三区四区不卡 国产1级a毛a毛1级a毛1级 | 亚洲GV成人无码久久精品| 香蕉视频毛片| 欧美性色网| 91蜜桃网| 七十路の高齢熟妇无码| 韩国久久久| 大肉大捧一进一出两腿| 中文字幕在线观看一区| 搡BBBB推BBBB推BBBB| 国产精品9999久久久久仙踪林| 五月激情黄色| 又爽又黄免费网站97双女| 九九热99视频| 色播av| 上海熟妇搡BBBB搡BBBB| 免费人成网站| 操逼视频免费播放| 黄色一级片视频| 国产成人AV片| 国产色婷婷| 国产日韩欧美综合精品在线观看 | 四川女人毛多水多A片| 熟女一区二区| 中文字幕有码在线观看| 國產美女AV操逼網站| 亚洲国产精品一区二区三区| 亚洲视频入口| 日本中文不卡| 亚洲男人的天堂av| 操屄视频网站| 中文字幕第69页| 免费无码成人片在线播放| 69AV在线观看| 亚洲精品91| 人人摸人人操人人摸| 先锋影音亚洲AV每日资源网站 | 欧美性爱第四页| 青青草原免费在线视频| 特黄AAAAAAAAA真人毛片| 天天日天天日天天干| 成人毛片在线播放| 欧美日韩精品久久久免费观看| 伊人网视频在线观看| 欧美性猛交一区二区三区| 亚洲成人福利电影| 亚洲AV无码成人H动漫| 亚洲狼人综合网| 五月天高清无码| 久久一二三区| 高清免费无码视频| 日韩性视频| 日韩av三级在线观看| 小黄片在线免费观看| 午夜老司机福利一二三区| 五月停亭六月,六月停亭的英语 | 电家庭影院午夜| 北京熟妇搡BBBB搡BBBB电影| 亚州无码免费| 91无码人妻一区二区成人AⅤ | 中国熟女网站| 人人澡人人妻人人爽| 天天爱天天插| 成人免费黄色片| Av一区二区三区| 深爱五月婷婷| 国产AV高清| 黄色污污污网站| 国产香蕉视频在线播放| 中文在线观看免费视频| 久99| 欧美成人无码片免费看A片秀色| 三级片AAA成人免费| 青春草在线免费观看| 国产香蕉视频在线播放| 亚洲人成小说| 欧美色图另类| 尤物视频在线播放| 国产老熟女高潮毛片A片仙踪林| 少妇高潮一区二区三区99| 婷婷五月色综合| 久久久无码视频| 欧美色图在线播放| 丰满人妻一区二区三区视频在线不卡| 九色av| 狠狠色噜噜狠狠狠888米奇视频| 精品孕妇孕交无码专区| 亚洲人妻电影| 搡BBB搡BBBB搡BBBB| 精品视频中文字幕| 午夜人妻AV| 久久久久久毛片| 99自拍视频| 91外围女视频| 男人的天堂婷婷| 久久免费视频,久久免费视频| 日本一区免费| 男人的天堂视频| 撸撸视频| 日韩一级免费观看| 91综合久久| 国产性爱网址| 亚洲一区无码| 欧美后门菊门交4| 强伦轩一区二区三区在线观看| 亚洲无码高清视频在线| 国产中文字幕视频| 日韩在线一级片| 亚洲AV无码乱码国产| 99久久99久久久精品棕色圆| 在线国产小视频| 欧美激情伊人久久五月天| 成人免费一级视频| 丁香五月激情在线| 亚洲成人免费在线观看| 少妇一区二区三区| 最新毛片网站〖网:.〗| 91在线无码精品在线看| 综合色区| 99视频在线免费观看| 久草大香蕉在线视频| 青青草伊人大香蕉| 国产综合久久久7777777| 国产一级18片视频| 91新婚人妻偷拍| 黄色a片视频| 人妻一区| 国产在线观看免费成人视频| 日韩AⅤ无码一区二区三区| 河南熟妇搡BBBB搡BBBB| 亚洲高清无码一区| 国产偷拍精品视频| 特级西西人体www高清大胆| 色综合天天综合成人网| 久久久精品国产| 国产人妻人伦精品一区| 六月激情丁香| 欧美亚洲中文| 黄色日逼视频| 无码在线播放观看| 囯产精品久久久久久久久免费无码 | 亚洲性爱网站| 午夜爱爱免费视频| 99国产热| 亚洲成人A片| 亚洲激情视频网站| 日逼黄色视频| 91含羞草www·Com| 欧洲黑种人日P视频| 亚洲日韩精品成人无码专区AV| 久久久久久久97| 江苏妇搡BBBB搡BBBB| 国产精品视频瘾无码| 男人的天堂青青草| 国产学生妹在线播放| 午夜黄片| 曰曰干| 欧美性夜黄A片爽爽免费视频| 山东熟妇搡BBBB搡BBBB| 亚洲日日夜夜| 国产黄色视频在线免费看| 免费看黄色大片| 亚洲中文字幕无码爆乳av| 国产操逼小视频| 淫香淫色综合网| 日韩精品一区二区三免费视频| 亚洲乱伦图| 91麻豆影院| 中文字字幕中文字幕乱码| 久久嫩草| 五月丁香婷婷色| 五月丁香欧美性爱| 午夜免费小视频| 国产成人大片| 无码不卡视频在线观看| 亚洲欧美另类色图| 91在线看片| 丰满人妻一区二区免费看| 性欧美欧美巨大69| 日逼黄色| 欧美色图视频网站| 91久久午夜无码鲁丝片久久人妻| 日韩免费无码视频| 久久99精品国产.久久久久| 欧美一级日韩| 18禁黄网| 九九色在线视频| 色婷婷国产精品综合在线观看| 国产AV一级片| 男人天堂无码成人| 亚洲免费毛片| 在线中文字幕网站| 51嘿嘿嘿国产精品伦理| 97久久人人| 日韩无码中文字幕| 成人三级片网| 草在线视频| 亚洲无码日| 精品亚洲一区二区三区四区五区 | 亚洲成人一区二区| 国产精品成人3p一区二区三区| 99操逼网| 五月天福利视频| 小黄片高清无码| 欧美日韩国产激情| 熟女人妻人妻の视频| 国产一级黄色毛片| 91亚洲精品在线观看| 日本三级视频| 羞羞涩漫无码免费网站入口 | 操逼网站免费看| 国产在线观看黄| 色色播播|