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

PyTorch分布式訓(xùn)練簡(jiǎn)明教程

共 12874字,需瀏覽 26分鐘

 ·

2020-09-11 21:38

AI編輯:我是小將

神經(jīng)網(wǎng)絡(luò)訓(xùn)練加速的最簡(jiǎn)單方法是使用GPU,對(duì)弈神經(jīng)網(wǎng)絡(luò)中常規(guī)操作(矩陣乘法和加法)GPU運(yùn)算速度要倍超于CPU。隨著模型或數(shù)據(jù)集越來(lái)越大,一個(gè)GPU很快就會(huì)變得不足。例如,BERT和GPT-2等大型語(yǔ)言模型是在數(shù)百個(gè)GPU上訓(xùn)練的。對(duì)于多GPU訓(xùn)練,需要一種在不同GPU之間對(duì)模型和數(shù)據(jù)進(jìn)行切分和調(diào)度的方法。

PyTorch是非常流行的深度學(xué)習(xí)框架,它在主流框架中對(duì)于靈活性和易用性的平衡最好。Pytorch有兩種方法可以在多個(gè)GPU上切分模型和數(shù)據(jù):nn.DataParallelnn.distributedataparallel。DataParallel更易于使用(只需簡(jiǎn)單包裝單GPU模型)。然而,由于它使用一個(gè)進(jìn)程來(lái)計(jì)算模型權(quán)重,然后在每個(gè)批處理期間將分發(fā)到每個(gè)GPU,因此通信很快成為一個(gè)瓶頸,GPU利用率通常很低。而且,nn.DataParallel要求所有的GPU都在同一個(gè)節(jié)點(diǎn)上(不支持分布式),而且不能使用Apex進(jìn)行混合精度訓(xùn)練。nn.DataParallelnn.distributedataparallel的主要差異可以總結(jié)為以下幾點(diǎn)(譯者注):

  1. DistributedDataParallel支持模型并行,而DataParallel并不支持,這意味如果模型太大單卡顯存不足時(shí)只能使用前者;
  2. DataParallel是單進(jìn)程多線程的,只用于單卡情況,而DistributedDataParallel是多進(jìn)程的,適用于單機(jī)和多機(jī)情況,真正實(shí)現(xiàn)分布式訓(xùn)練;
  3. DistributedDataParallel的訓(xùn)練更高效,因?yàn)槊總€(gè)進(jìn)程都是獨(dú)立的Python解釋器,避免GIL問(wèn)題,而且通信成本低其訓(xùn)練速度更快,基本上DataParallel已經(jīng)被棄用;
  4. 必須要說(shuō)明的是DistributedDataParallel中每個(gè)進(jìn)程都有獨(dú)立的優(yōu)化器,執(zhí)行自己的更新過(guò)程,但是梯度通過(guò)通信傳遞到每個(gè)進(jìn)程,所有執(zhí)行的內(nèi)容是相同的;

總的來(lái)說(shuō),Pytorch文檔是相當(dāng)完備和清晰的,尤其是在1.0x版本后。但是關(guān)于DistributedDataParallel的介紹卻較少,主要的文檔有以下三個(gè):

  1. Writing Distributed Applications with PyTorch:主要介紹分布式API,分布式配置,不同通信機(jī)制以及內(nèi)部機(jī)制,但是說(shuō)實(shí)話大部分人不太同意看懂,而且很少會(huì)直接用這些;
  2. Getting Started with Distributed Data Parallel:簡(jiǎn)單介紹了如何使用DistributedDataParallel,但是用例并不清晰完整;
  3. ImageNet training in PyTorch:比較完整的使用實(shí)例,但是僅有代碼,缺少詳細(xì)說(shuō)明;(apex也提供了一個(gè)類似的訓(xùn)練用例Mixed Precision ImageNet Training in PyTorch)
  4. (advanced) PyTorch 1.0 Distributed Trainer with Amazon AWS:如何在亞馬遜云上進(jìn)行分布式訓(xùn)練,但是估計(jì)很多人用不到。

這篇教程將通過(guò)一個(gè)MNISI例子講述如何使用PyTorch的分布式訓(xùn)練,這里將一段段代碼進(jìn)行解釋,而且也包括任何使用apex進(jìn)行混合精度訓(xùn)練。

DistributedDataParallel內(nèi)部機(jī)制

DistributedDataParallel通過(guò)多進(jìn)程在多個(gè)GPUs間復(fù)制模型,每個(gè)GPU都由一個(gè)進(jìn)程控制(當(dāng)然可以讓每個(gè)進(jìn)程控制多個(gè)GPU,但這顯然比每個(gè)進(jìn)程有一個(gè)GPU要慢;也可以多個(gè)進(jìn)程在一個(gè)GPU上運(yùn)行)。GPU可以都在同一個(gè)節(jié)點(diǎn)上,也可以分布在多個(gè)節(jié)點(diǎn)上。每個(gè)進(jìn)程都執(zhí)行相同的任務(wù),并且每個(gè)進(jìn)程都與所有其他進(jìn)程通信。進(jìn)程或者說(shuō)GPU之間只傳遞梯度,這樣網(wǎng)絡(luò)通信就不再是瓶頸。

在訓(xùn)練過(guò)程中,每個(gè)進(jìn)程從磁盤加載batch數(shù)據(jù),并將它們傳遞到其GPU。每一個(gè)GPU都有自己的前向過(guò)程,然后梯度在各個(gè)GPUs間進(jìn)行All-Reduce。每一層的梯度不依賴于前一層,所以梯度的All-Reduce和后向過(guò)程同時(shí)計(jì)算,以進(jìn)一步緩解網(wǎng)絡(luò)瓶頸。在后向過(guò)程的最后,每個(gè)節(jié)點(diǎn)都得到了平均梯度,這樣模型參數(shù)保持同步。

這都要求多個(gè)進(jìn)程(可能在多個(gè)節(jié)點(diǎn)上)同步并通信。Pytorch通過(guò)distributed.init_process_group函數(shù)來(lái)實(shí)現(xiàn)這一點(diǎn)。他需要知道進(jìn)程0位置以便所有進(jìn)程都可以同步,以及預(yù)期的進(jìn)程總數(shù)。每個(gè)進(jìn)程都需要知道進(jìn)程總數(shù)及其在進(jìn)程中的順序,以及使用哪個(gè)GPU。通常將進(jìn)程總數(shù)稱為world_size.Pytorch提供了nn.utils.data.DistributedSampler來(lái)為各個(gè)進(jìn)程切分?jǐn)?shù)據(jù),以保證訓(xùn)練數(shù)據(jù)不重疊。

實(shí)例講解

這里通過(guò)一個(gè)MNIST實(shí)例來(lái)講解,我們先將其改成分布式訓(xùn)練,然后增加混合精度訓(xùn)練。

普通單卡訓(xùn)練

首先,導(dǎo)入所需要的庫(kù):

import os
from datetime import datetime
import argparse
import torch.multiprocessing as mp
import torchvision
import torchvision.transforms as transforms
import torch
import torch.nn as nn
import torch.distributed as dist
from apex.parallel import DistributedDataParallel as DDP
from apex import amp

然后我們定義一個(gè)簡(jiǎn)單的CNN模型處理MNIST數(shù)據(jù):

class ConvNet(nn.Module):
def __init__(self, num_classes=10):
super(ConvNet, self).__init__()
self.layer1 = nn.Sequential(
nn.Conv2d(1, 16, kernel_size=5, stride=1, padding=2),
nn.BatchNorm2d(16),
nn.ReLU(),
nn.MaxPool2d(kernel_size=2, stride=2))
self.layer2 = nn.Sequential(
nn.Conv2d(16, 32, kernel_size=5, stride=1, padding=2),
nn.BatchNorm2d(32),
nn.ReLU(),
nn.MaxPool2d(kernel_size=2, stride=2))
self.fc = nn.Linear(7*7*32, num_classes)

def forward(self, x):
out = self.layer1(x)
out = self.layer2(out)
out = out.reshape(out.size(0), -1)
out = self.fc(out)
return out

主函數(shù)main()接受參數(shù),執(zhí)行訓(xùn)練:

def main():
parser = argparse.ArgumentParser()
parser.add_argument('-n', '--nodes', default=1, type=int, metavar='N')
parser.add_argument('-g', '--gpus', default=1, type=int,
help='number of gpus per node')
parser.add_argument('-nr', '--nr', default=0, type=int,
help='ranking within the nodes')
parser.add_argument('--epochs', default=2, type=int, metavar='N',
help='number of total epochs to run')
args = parser.parse_args()
train(0, args)

其中訓(xùn)練部分主函數(shù)為:

def train(gpu, args):
torch.manual_seed(0)
model = ConvNet()
torch.cuda.set_device(gpu)
model.cuda(gpu)
batch_size = 100
# define loss function (criterion) and optimizer
criterion = nn.CrossEntropyLoss().cuda(gpu)
optimizer = torch.optim.SGD(model.parameters(), 1e-4)
# Data loading code
train_dataset = torchvision.datasets.MNIST(root='./data',
train=True,
transform=transforms.ToTensor(),
download=True)
train_loader = torch.utils.data.DataLoader(dataset=train_dataset,
batch_size=batch_size,
shuffle=True,
num_workers=0,
pin_memory=True)

start = datetime.now()
total_step = len(train_loader)
for epoch in range(args.epochs):
for i, (images, labels) in enumerate(train_loader):
images = images.cuda(non_blocking=True)
labels = labels.cuda(non_blocking=True)
# Forward pass
outputs = model(images)
loss = criterion(outputs, labels)

# Backward and optimize
optimizer.zero_grad()
loss.backward()
optimizer.step()
if (i + 1) % 100 == 0 and gpu == 0:
print('Epoch [{}/{}], Step [{}/{}], Loss: {:.4f}'.format(
epoch + 1,
args.epochs,
i + 1,
total_step,
loss.item())
)
if gpu == 0:
print("Training complete in: " + str(datetime.now() - start))

通過(guò)啟動(dòng)主函數(shù)來(lái)開(kāi)始訓(xùn)練:

if __name__ == '__main__':
main()

你可能注意到有些參數(shù)是多余的,但是對(duì)后面的分布式訓(xùn)練是有用的。我們通過(guò)執(zhí)行以下語(yǔ)句就可以在單機(jī)單卡上訓(xùn)練:

python src/mnist.py -n 1 -g 1 -nr 0

分布式訓(xùn)練

使用多進(jìn)程進(jìn)行分布式訓(xùn)練,我們需要為每個(gè)GPU啟動(dòng)一個(gè)進(jìn)程。每個(gè)進(jìn)程需要知道自己運(yùn)行在哪個(gè)GPU上,以及自身在所有進(jìn)程中的序號(hào)。對(duì)于多節(jié)點(diǎn),我們需要在每個(gè)節(jié)點(diǎn)啟動(dòng)腳本。

首先,我們要配置基本的參數(shù):

def main():
parser = argparse.ArgumentParser()
parser.add_argument('-n', '--nodes', default=1,
type=int, metavar='N')
parser.add_argument('-g', '--gpus', default=1, type=int,
help='number of gpus per node')
parser.add_argument('-nr', '--nr', default=0, type=int,
help='ranking within the nodes')
parser.add_argument('--epochs', default=2, type=int,
metavar='N',
help='number of total epochs to run')
args = parser.parse_args()
#########################################################
args.world_size = args.gpus * args.nodes #
os.environ['MASTER_ADDR'] = '10.57.23.164' #
os.environ['MASTER_PORT'] = '8888' #
mp.spawn(train, nprocs=args.gpus, args=(args,)) #
#########################################################

其中args.nodes是節(jié)點(diǎn)總數(shù),而args.gpus是每個(gè)節(jié)點(diǎn)的GPU總數(shù)(每個(gè)節(jié)點(diǎn)GPU數(shù)是一樣的),而args.nr 是當(dāng)前節(jié)點(diǎn)在所有節(jié)點(diǎn)的序號(hào)。節(jié)點(diǎn)總數(shù)乘以每個(gè)節(jié)點(diǎn)的GPU數(shù)可以得到world_size,也即進(jìn)程總數(shù)。所有的進(jìn)程需要知道進(jìn)程0的IP地址以及端口,這樣所有進(jìn)程可以在開(kāi)始時(shí)同步,一般情況下稱進(jìn)程0是master進(jìn)程,比如我們會(huì)在進(jìn)程0中打印信息或者保存模型。PyTorch提供了mp.spawn來(lái)在一個(gè)節(jié)點(diǎn)啟動(dòng)該節(jié)點(diǎn)所有進(jìn)程,每個(gè)進(jìn)程運(yùn)行train(i, args),其中i從0到args.gpus - 1

同樣,我們要修改訓(xùn)練函數(shù):

def train(gpu, args):
############################################################
rank = args.nr * args.gpus + gpu
dist.init_process_group(
backend='nccl',
init_method='env://',
world_size=args.world_size,
rank=rank
)
############################################################

torch.manual_seed(0)
model = ConvNet()
torch.cuda.set_device(gpu)
model.cuda(gpu)
batch_size = 100
# define loss function (criterion) and optimizer
criterion = nn.CrossEntropyLoss().cuda(gpu)
optimizer = torch.optim.SGD(model.parameters(), 1e-4)

###############################################################
# Wrap the model
model = nn.parallel.DistributedDataParallel(model,
device_ids=[gpu])
###############################################################

# Data loading code
train_dataset = torchvision.datasets.MNIST(
root='./data',
train=True,
transform=transforms.ToTensor(),
download=True
)
################################################################
train_sampler = torch.utils.data.distributed.DistributedSampler(
train_dataset,
num_replicas=args.world_size,
rank=rank
)
################################################################

train_loader = torch.utils.data.DataLoader(
dataset=train_dataset,
batch_size=batch_size,
##############################
shuffle=False, #
##############################
num_workers=0,
pin_memory=True,
#############################
sampler=train_sampler) #
#############################
...

這里我們首先計(jì)算出當(dāng)前進(jìn)程序號(hào):rank = args.nr * args.gpus + gpu,然后就是通過(guò)dist.init_process_group初始化分布式環(huán)境,其中backend參數(shù)指定通信后端,包括mpi, gloo, nccl,這里選擇nccl,這是Nvidia提供的官方多卡通信框架,相對(duì)比較高效。mpi也是高性能計(jì)算常用的通信協(xié)議,不過(guò)你需要自己安裝MPI實(shí)現(xiàn)框架,比如OpenMPI。gloo倒是內(nèi)置通信后端,但是不夠高效。init_method指的是如何初始化,以完成剛開(kāi)始的進(jìn)程同步;這里我們?cè)O(shè)置的是env://,指的是環(huán)境變量初始化方式,需要在環(huán)境變量中配置4個(gè)參數(shù):MASTER_PORT,MASTER_ADDR,WORLD_SIZE,RANK,前面兩個(gè)參數(shù)我們已經(jīng)配置,后面兩個(gè)參數(shù)也可以通過(guò)dist.init_process_group函數(shù)中world_sizerank參數(shù)配置。其它的初始化方式還包括共享文件系統(tǒng)以及TCP,比如init_method='tcp://10.1.1.20:23456',其實(shí)也是要提供master的IP地址和端口。注意這個(gè)調(diào)用是阻塞的,必須等待所有進(jìn)程來(lái)同步,如果任何一個(gè)進(jìn)程出錯(cuò),就會(huì)失敗。

對(duì)于模型側(cè),我們只需要用DistributedDataParallel包裝一下原來(lái)的model即可,在背后它會(huì)支持梯度的All-Reduce操作。對(duì)于數(shù)據(jù)側(cè),我們nn.utils.data.DistributedSampler來(lái)給各個(gè)進(jìn)程切分?jǐn)?shù)據(jù),只需要在dataloader中使用這個(gè)sampler就好,值得注意的一點(diǎn)是你要訓(xùn)練循環(huán)過(guò)程的每個(gè)epoch開(kāi)始時(shí)調(diào)用train_sampler.set_epoch(epoch),(主要是為了保證每個(gè)epoch的劃分是不同的)其它的訓(xùn)練代碼都保持不變。

最后就可以執(zhí)行代碼了,比如我們是4節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)是8卡,那么需要在4個(gè)節(jié)點(diǎn)分別執(zhí)行:

python src/mnist-distributed.py -n 4 -g 8 -nr i

要注意的是,此時(shí)的有效batch_size其實(shí)是batch_size_per_gpu * world_size,對(duì)于有BN的模型還可以采用同步BN獲取更好的效果:

model = torch.nn.SyncBatchNorm.convert_sync_batchnorm(model)

上述講述的是分布式訓(xùn)練過(guò)程,其實(shí)同樣適用于評(píng)估或者測(cè)試過(guò)程,比如我們把數(shù)據(jù)劃分到不同的進(jìn)程中進(jìn)行預(yù)測(cè),這樣可以加速預(yù)測(cè)過(guò)程。實(shí)現(xiàn)代碼和上述過(guò)程完全一樣,不過(guò)我們想計(jì)算某個(gè)指標(biāo),那就需要從各個(gè)進(jìn)程的統(tǒng)計(jì)結(jié)果進(jìn)行All-Reduce,因?yàn)槊總€(gè)進(jìn)程僅是計(jì)算的部分?jǐn)?shù)據(jù)的內(nèi)容。比如我們要計(jì)算分類準(zhǔn)確度,我們可以統(tǒng)計(jì)每個(gè)進(jìn)程的數(shù)據(jù)總數(shù)total和分類正確的數(shù)量count,然后進(jìn)行聚合。這里要提的一點(diǎn),當(dāng)用dist.init_process_group初始化分布式環(huán)境時(shí),其實(shí)就是建立一個(gè)默認(rèn)的分布式進(jìn)程組(distributed process group),這個(gè)group同時(shí)會(huì)初始化Pytorch的torch.distributed包。這樣我們可以直接用torch.distributed的API就可以進(jìn)行分布式基本操作了,下面是具體實(shí)現(xiàn):

# define tensor on GPU, count and total is the result at each GPU
t = torch.tensor([count, total], dtype=torch.float64, device='cuda')
dist.barrier() # synchronizes all processes
dist.all_reduce(t, op=torch.distributed.ReduceOp.SUM,) # Reduces the tensor data across all machines in such a way that all get the final result.
t = t.tolist()
all_count = int(t[0])
all_total = int(t[1])
acc = all_count / all_total

混合精度訓(xùn)練(采用apex)

混合精度訓(xùn)練(混合FP32和FP16訓(xùn)練)可以適用更大的batch_size,而且可以利用NVIDIA Tensor Cores加速計(jì)算。采用NVIDIA的apex進(jìn)行混合精度訓(xùn)練非常簡(jiǎn)單,只需要修改部分代碼:

 rank = args.nr * args.gpus + gpu
dist.init_process_group(
backend='nccl',
init_method='env://',
world_size=args.world_size,
rank=rank)

torch.manual_seed(0)
model = ConvNet()
torch.cuda.set_device(gpu)
model.cuda(gpu)
batch_size = 100
# define loss function (criterion) and optimizer
criterion = nn.CrossEntropyLoss().cuda(gpu)
optimizer = torch.optim.SGD(model.parameters(), 1e-4)
# Wrap the model
##############################################################
model, optimizer = amp.initialize(model, optimizer,
opt_level='O2')
model = DDP(model)
##############################################################
# Data loading code
...
start = datetime.now()
total_step = len(train_loader)
for epoch in range(args.epochs):
for i, (images, labels) in enumerate(train_loader):
images = images.cuda(non_blocking=True)
labels = labels.cuda(non_blocking=True)
# Forward pass
outputs = model(images)
loss = criterion(outputs, labels)

# Backward and optimize
optimizer.zero_grad()
##############################################################
with amp.scale_loss(loss, optimizer) as scaled_loss:
scaled_loss.backward()
##############################################################
optimizer.step()
...

其實(shí)就兩處變化,首先是采用amp.initialize來(lái)包裝model和optimizer以支持混合精度訓(xùn)練,其中opt_level指的是優(yōu)化級(jí)別,如果為O0或者O3不是真正的混合精度,但是可以用來(lái)確定模型效果和速度的baseline,而O1O2是混合精度的兩種設(shè)置,可以選擇某個(gè)進(jìn)行混合精度訓(xùn)練。另外一處是在進(jìn)行根據(jù)梯度更新參數(shù)前,要先通過(guò)amp.scale_loss對(duì)梯度進(jìn)行scale以防止梯度下溢(underflowing)。此外,你還可以用apex.parallel.DistributedDataParallel替換nn.DistributedDataParallel。

題外話

我覺(jué)得PyTorch官方的分布式實(shí)現(xiàn)已經(jīng)比較完善,而且性能和效果都不錯(cuò),可以替代的方案是horovod,不僅支持PyTorch還支持TensorFlow和MXNet框架,實(shí)現(xiàn)起來(lái)也是比較容易的,速度方面應(yīng)該不相上下。

參考

  1. Distributed data parallel training in Pytorch https://yangkky.github.io/2019/07/08/distributed-pytorch-tutorial.html?(大部分內(nèi)容來(lái)自此處)
  2. torch.distributed?https://pytorch.org/docs/stable/distributed.html

AI編輯:我是小將


推薦閱讀

堪比Focal Loss!解決目標(biāo)檢測(cè)中樣本不平衡的無(wú)采樣方法

超越BN和GN!谷歌提出新的歸一化層:FRN

這份Kaggle Grandmaster的圖像分類訓(xùn)練技巧,你知道多少?

TensorFlow 2.2.0-rc0,這次更新讓人驚奇!

2020年,我終于決定入門GCN

另辟蹊徑!斯坦福大學(xué)提出邊界框回歸任務(wù)新Loss:GIoU

人人必須要知道的語(yǔ)義分割模型:DeepLabv3+



機(jī)器學(xué)習(xí)算法工程師


? ??? ? ? ? ? ? ? ? ? ? ? ??????????????????一個(gè)用心的公眾號(hào)


?

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

手機(jī)掃一掃分享

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

手機(jī)掃一掃分享

分享
舉報(bào)

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

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 91ncom| 强伦轩一区二区三区四区| 婷婷五月天电影网| 91亚色视频| 精品秘无码一区二区三区老师| 亚洲第1页| 午夜亚洲福利| 中文激情网| 暴操美女网站| 免费一区二区三区四区| 在线观看你懂得| 日欧无码| AⅤ在线观看| 伊人成人网视频| 日韩性爱视屏| 中文字幕成人电影| 亚洲国产精品久久人人爱| 俺也去五月婷婷| 污网站18禁| 国产无限资源| 五月天色色小说| 国产精品久久777777是什么意思| 日韩性爱无码| 影音先锋av中文字幕| 91超碰在线播放| 俺去也在线播放| 麻豆毛片| 国产午夜男女性爱| 日韩国产在线观看| 日韩在观看线| 操天天操| 成人在线不卡| 迷情校园综合| 国产精品国产精品国产专区不52| 91AV在线观看视频| A片地址| 大鸡巴网站| 干片网| 麻豆视频一区二区| 婷婷五月影院| 一区二区三区久久久久〖网:.〗| 亚洲超碰在线观看| 97视频网站| 青草视频在线观看免费| 青娱乐国产AV| 精品乱码一区| 成人免费A片| 大香蕉在线电影| 成人特级毛片全部免费播放| 日韩一区在线视频| 成年人黄色电影| 俺也去网站| 2025无码视频| 在线观看AV网站| 国产成人自拍视频在线| 黄色激情av| 青青热视频| 国产精品色在线回看| 日本精品人妻无码77777| 婷婷久| 国产精品一区在线| 操逼网国产| 国产精品久久久久精| 亚洲.无码.制服.日韩.中文字幕| 青青草性爱| 国产精品久免费的黄网站| 久久w| 一本色道久久88综合无码| 肥臀AV在线| 狠狠干亚洲视频| 中文字幕有码在线观看| 免费看黄色大片| 97资源超碰| 国产欧美一区二区三区四区| 蝌蚪窝视频在线| 亚洲成人观看| 99人妻在线| 天天视频国产| 69欧美| 182在线视频| 成人免费乱码大片a毛片蜜芽| 欧美AAAAAAAAAA特级| 国产熟女AV| 永久免费黄色视频网站| 日韩无码人妻视频| 安徽妇搡BBBB搡BBB| 东京热无码高清| 久久99草| 五月激情婷婷基地| 黄色福利网址| 亚洲aV影院| 亚洲综合免费观看高清完整| 免费中文字幕| 天天视频狠狠狠狠| 亚洲成人中文字幕在线| 国产在线久久久| 黄片高清免费观看| WWW.豆花视频精品| 影视先锋久久| 国产美女18毛片水真多| 做爱视频毛片人乱| 啪啪人妻| 丁香五月婷婷综合网| 久久久国产一区二区三区| 国产剧情自拍| 伊人蕉 | 超碰97人人爱| TheAV精尽人亡av| A级毛片视频| 欧洲综合视频| 五月网婷婷| 97精品人妻一区二区| 强伦轩一区二区三区在线观看| 婷婷69| 午夜福利100理论片| 高清中文字幕在线A片| 九色蝌蚪视频| 日本免费爱爱| 欧美一级特黄AAAAAA片| 国产AV小电影| 日本特黄AA片免费视频| 一级片在线视频| 91免费| 男女视频网站| 黄片视频网站| 欧美肏逼视频| 日本操逼网| 青娱乐av| youjizzcom日本| 西西4444www无码精品| 日本a一级片| 天天摸天天摸| 亚洲经典一| 人人操人人看人人| 亚洲精品二| 学生妹一级片内射视频| 91一级特黄大片| 久久婷婷激情| 免费视频一区二区三区四区| 久热官网| www.狠狠| 亚洲AV成人片无码网站| 色aV牛牛在线观看| 国产成人精品无码片区在线观91| 操碰人人操| 开心五月色婷婷综合开心网| 天堂色播| 老湿机福利院| 俺也去五月婷婷| 一本色道久久综合狠狠躁的推荐 | 亚洲日韩欧美视频| 草比视频| 国产成人在线免费观看| 空姐白洁| 操逼基地| 日本无码毛片| 丁香六月婷婷综合激情欧美| 国产精品久久久999| 亚洲天堂在线观看免费| 亚洲精品无码久久久| 大香蕉精品视频在线| 成人视频免费在线观看| 亚洲草比视频网| 国产成人小视频在线观看| 中文字幕+乱码+中文字幕一区| 中文字幕精品一级A片| 国产高清无码一区| av在线免费观看网站| 逼特逼视频在线观看| 一区二区三区无码在线观看| 精品无码视频| 精品一区二区三区蜜桃臀www | 国产熟女一区二区视频网站| 精品成人无码一区二区三区| 韩国无码视频在线观看| 偷拍精品视频| 无码爱爱视频| 强奸乱伦制服丝袜| 国产精品一麻了麻了| 鸡巴在线观看| 亚洲区一区二| 日韩日日夜夜| 九九碰九九爱97超碰| 淫香淫色综合网| 在线观看a片| 午夜亚洲AV永久无码精品蜜芽 | 色444| 九一精品| av福利在线观看| 亚洲成人视频网| 欧美后门菊门交3p、| 国产日韩一区二区| 超碰人人射| 欧美大香蕉视频| 午夜成人福利视频| 国产婬片lA片www777| 人人草人人舔| 欧美乱欲视频| 国产精品扒开腿做爽爽爽视频| 日韩爱爱爱| 欧美动态视频| 国产精品一区在线观看| 操逼视频观看免费| 国产日韩一区二区三免费高清| 国产三级片无码| 黑人大荫蒂女同互磨| 欧美级毛片一进一出| 国产欧美一区二区三区视频| 婷婷精品秘进入| 日韩色逼| www.激情| 伊人网成人| 先锋影音资源站av每日资源在线| 美女黄视频网站| 偷拍亚洲天堂| 91亚洲在线| 欧美性爱在线| 污污污污污www在线观看优势| 日韩一级免费在线观看| 亚洲字幕无码| 91黄色片| 日韩性网| 男人视频网| 欧美精产国品一区二区区别| 成人无码中文字幕| 大地8免费高清视频观看大全| www操逼| 亚洲婷婷三级成人网| WWW亚洲视频| 又黄又爽的视频| 最近中文字幕mv第三季歌词| 国产无码专区| www.91超碰在线| 亚洲码成人| 大香蕉伊| 无码秘蜜桃一区二区| 欧美射图| 成人午夜福利高清视频| 久草中文视频| 嫩草av在线| 久久另类TS人妖一区二区免费| 俺去俺来WWW色官方| 东方av在线观看| 996视频| 蜜桃人妻无码AV天堂三区| 婷婷五月六月丁香| 特级WWW444至码| 日韩精彩视频| 欧美日韩一区二区三区四区| 成人三级电影在线观看| 日韩在线观看免费| 91无码人妻东京热精品一区| 欧美成人精品在线观看| 操逼视频国产| 日韩无码人妻视频| 五月婷婷激情五月| 欧美美穴| 亚洲国产视频在线观看| 黄片视频在线播放| 国产艹逼视频| 国产日韩性爱视频| 中文无码高清视频| 狠狠草狠狠干| 中文字幕精品在线免费视频观看视频| 嫩BBB搡BBB搡BBB四川| 四色永久成人网站| 久久久五月天| 欧美日韩在线观看一区二区三区| 婷婷久久婷婷| 亚洲中文字幕AV| 欧美亚洲小说| 欧美三级片网| 欧美黄色影院| 精品人妻无码一区二区三区| 亚洲爆乳无码一区二区三区| 成人免费三级片| 操美女的逼| 精品人妻一区二区三区在线视频不卡| 高清无码免费在线| 成年人视频在线观看免费| 黄色草逼视频| www.婷婷五月天| 色五月婷婷五月天激情| 亚洲免费观看高清完整版在va线观看| 黄色大片在线免费观看| 综合天堂| 亚洲视频a| 亚洲激情在线| 国产成人无码精免费视频| 免费看黄片的网站| 蜜臀AV一区二区三区免费看| 亚洲一级黄色大片| 国内成人精品| 狠狠撸狠狠撸| 日韩中文字幕免费在线观看| 欧美黄片在线| 亚洲一区视频在线| 91免费在线看| 日本高清版色视频| 国产白丝精品91爽爽久久| 91超碰在线免费观看| 肏逼视频免费看| 天码人妻一区二区三区在线看| 懂色aV| 伊人日逼| 日韩AV中文字幕在线| 欧美一二三区黄色免费视屏| 久久久久久伊人| 欧美激情网址| 大香蕉啪啪啪啪| 久久狼友| 中文字幕东京热加勒比| 国产精品天天| 奇米狠狠干| 久久久久久久久久久国产精品 | 无码精品成人观看A片| 欧美性爱中文字幕| 无套内射在线播放| 蜜臀AV成人精品| 天天色伊人| 日韩一级片免费看| 91在线视频免费观看| 成人小说亚洲一区二区三区| 特黄aaaaaaaa真人毛片| 女公务员人妻呻吟求饶| 日韩精品一区二区在线观看| 九九99电影| 日韩一级毛| 玉米地一级婬片A片| 人人摸人人操人人看| 久99视频| 日韩91在线视频| 国产一级婬乱片AV片AAA毛片| 一区二区三区精品| 超碰97在线精品国产| 97人妻人人澡| 欧美老熟妇BBBBB搡BBB| 97人人爽人人爽人人人| 欧美成人福利视频| av在线直播| 国产日本在线视频| 一起草在线视频| 日本久久久久久久久视频在线观看| 韩国免费一级a一片在线播放| 熟妇一区| 夜夜撸天天操| 伊人久久大香| 人妻18无码人伦一区二区三区精品| 国产精品一线| 成人视频毛片| 男人色天堂网| 中文字幕H| 97精品在线视频| 狠狠精品| 欧美v| 操一操干一干| 国产精品乱子伦视频一区二区| 亚欧成人在线视频| 久久黄色大片| 三级片在线观看网站| 亚州高清无码视频| 久草社区在线| 中文解说AⅤ水果派| 精品一区二区三区蜜桃臀www| 亚洲九区| 黄色3A片在线观看| 五月天AV在线| 国产一级精品视频| 91乱子伦国产乱| 四虎激情影院| 国产真实露脸乱子伦对白高清视频| 香蕉成人视频| 国产精品一区二区不卡| 国产老熟女高潮毛片A片仙踪林| 国产精品蜜| 久久黄色毛片| 国产精品无码在线| 日韩性网| www欧美日韩| 国产欧美精品一区二区三区| 亚洲免费观看高清完整版在va线观| 青青草原视频在线免费观看 | 久久永久视频| 欧美一级片免费看| 国产精品色8| 日皮视频在线观看免费| 国产h在线观看| 精品一区二区三区四区学生| www.伊人| 成人性爱免费网站| 波多野结衣黄色| 久草青| 大香蕉一级红色片青青河边草| 大鸡巴免费视频| 青草大香蕉| 久久亭亭| 成人中文字幕无码| 日韩黄色av| P站免费版-永久免费的福利视频平台| 狠狠色婷婷7777| 大帝av| 亚洲在线| 国产无码一二三| 五月天丁香成人| 久久99精品久久久水蜜桃| 亚洲色伦| 亚洲国产高清视频| 免费看操逼逼| 一级色色片| 青娱乐国产视频| 国产AVwww| 肏屄在线视频| 国产高清a| 色婷婷av| 91人妻最真实刺激绿帽| 亚洲色视频在线| 最好看的MV中文字幕国语| 精品国内视频| 中文字幕有码在线观看| 欧一美一婬一伦一区二区三区自慰, | 国产人人操| 69式荫蒂被添全过程| 天天狠天天干| 国产午夜无码视频在线观看 | 一区二区三区毛片| 丁香五月中文| 99成人乱码一区二区三区在线| 亚洲性爱影院| 久操国产视频| 久久精品人妻| 亚洲欧美日韩高清| 一本色道久久88综合无码| 日本一级黄色电影| 欧美成在线视频| 浪潮在线观看完整版| 丁香五月六月| 国产精品国产三级国产专区52 | 女人18片毛片90分钟免费明星| 新亚洲天堂男子Av-| 五月婷婷激情综合| 最近中文字幕av| 91啦丨露脸丨熟女| 蜜桃91精品入口| 激情婷婷av| 一级aa片| 牛牛AV在线| 四川搡BBBBB搡BBB| 无码高清免费| 亚洲AV无码成人精品区在线欢看 | www.四虎成人网站| 国产AV影片| 在线不卡无码| 夜夜国自一区| 欧美搡BBBB搡BBB| 亚洲av综合在线| 国产视频中文字幕| 想要xx在线观看| 无码视频免费播放| 免费a片在线观看| 可以免费看的AV| 久久精品国产AV一区二区三区 | 亚洲国产一区二区三区四区| 无码黄| 日韩色逼| 污视频在线| 超碰99在线观看| 3D动漫精品啪啪一区二区竹笋| 欧美精品一区二区少妇免费A片| 日韩成人在线免费观看| 成人毛片18| 欧美区在线观看| 国模精品无码一区二区免费蜜桃| 一级电影视频去去去| 青青草做爱视频| 亚洲日韩高清无码| 久久私拍| 91丨国产丨白丝| 超碰99在线| 日本爱爱免费| 日韩无码视频一区二区| 亚洲精品视频在线观看网站| 欧美动态视频| 亚洲天堂大香蕉| 中国一级黄片| 国产熟妇婬乱一区二区| 麻豆射区| 欧美一二三| 亚洲猛男操逼欧美国产视频 | 大香蕉伊人视频在线观看| 台湾省成人网站| 狠狠婷婷| 日韩AV无码成人精品| 麻豆91精品91久久久停运原因| 江苏妇搡BBBB搡BBBB小说| 久久国产精品一区二区三区| 波多野结衣AV网站| 99视频在线| 亚洲日韩av在线| 四虎蜜桃| 无码高清18| 中文字幕无码不卡| 91资源在线观看| 国产愉拍91九色国产愉拍| 青青草大香蕉在线| 亚洲免费观看视频| 国产三级国产三级国产| 草逼毛片| 麻妃无码| 99操| 亚洲性视频| 嫩小槡BBBB槡BBBB槡免费-百度 | 亚洲天堂大香蕉| 超碰在线免费播放| 成人视频网站在线观看| 91资源在线观看| 成人网站www污污污网站公司| 色哟哟视频在线观看| 99热在线免费观看| 中文字幕精品亚洲熟女| 丰满人妻一区二区三区四区54| 西西人体BBBBBB| 欧美一级视频| 3D动漫精品啪啪一区二区下载| 撸一撸AV| 日本无码成人片在线播放| 九九久久国产精品| 欧美日韩精品| 无码插逼| 中文一区在线| 亚洲成人动漫免费| 老司机AV91| 免费福利在线观看| 亚洲熟女少妇| 天堂网亚洲| 午夜无码精品| 色四播播| 一区不卡| 无码色色| 成人无码免费一区二区中文| 欧美一级生活片| 操逼视频观看免费| 国产午夜福利视频| 亚洲中文字幕视频在线观看| 国产丝袜人妖TS系列| 亚洲一级a片| 国产午夜精品视频| 欧美偷拍| 久久99热这里只频精品6学生| 亚洲va欧洲va国产va不卡| 国产一级a毛一级a毛观看视频网站www.jn| 色老板在线精品免费观看| 黄网站在线观看| 污污污www精品国产网站| 黄色小说视频网站| 伊香蕉大综综综合| 亚洲综合网在线观看| 在线观看AV无码| 97一区二区| 成人影音先锋| 亚洲色久悠悠| 丁香五月亚洲| 综合久久视频| 猫咪亚洲AV成人无码电影| 色婷婷丁香五月| 人妻精品一区二区三区| 欧美一级性爱视频| 亚洲AV播放| 亚洲黄色视频免费观看| 超碰997| 91大神免费在线观看| 伊人网址| 操逼影视| 美女91视频| 中文字幕aV在线| 91精品国产成人做爰观看奶头| 69AV网站| 欧美特级黄片| 国产黄色视频在线观看| 天天干天天干天天日| AV网站在线播放| 色婷婷一区二区三区久久| 99视频在线精品| 国产精品香蕉国产| 国产一级a毛一级a做免费的视频| 激情男人网| 日日夜夜干| 欧美精品在线播放| 伊人成人大香蕉| 国产在线观看免费| 四虎成人无码A片观看| 午夜欧美性爱视频| 婷婷日韩在线| 欧美一级特黄AAAAAA片在线视频| 激情片AAA| 91丨露脸丨熟女| 国产美女自慰网站| 色婷婷色99国产综合精品| 丁香欧美| 国产亚洲欧洲| 国产乱子伦无码视频免费| 在线伊人网| 五月天激情啪啪| 成人欧美一区二区三区白人| 九九99电影| wwwA片| 国产性爱AV| 日韩A电影| a在线观看视频| 无码中文字幕在线播放| 国产乱伦内射| 成人免费精品视频| 日本黄色免费在线观看| 天天天做夜夜夜爽无码| 午夜一区二区三区免费| 成人视频高清无码| 成人操B视频在线观看| 91成人情欲影视网| AV中文在线| 中国操逼网| 黄页网站在线免费观看| 一道本一区二区| 日本親子亂子倫XXXX50路 | 一级免费黄片| 丁香五月婷婷综合| 人妻无码电影推荐| 西西4444WWW无码精品| 青青草中文字幕| 日韩成年视频| 天天干天天干天| 欧美熟女在线| 成人网中文字幕| 加勒比一区二区三区| 欧美成人综合色| 午夜精品久久久久久久99热精东| 国产一级A片在线观看| 成人手机看片| 操逼无码精品| 日韩美在线视频| 国产日韩欧美综合精品在线观看 | 日本不卡在线| 精品欧美无人区乱码毛片| 亚洲资源在线观看| 草视频| 西西人体大胆ww4444| 五月丁香天堂网| 日产无码久久久久久| 免费做爱网站| 亚洲va视频| 少妇白洁在线观看| 亚洲欧美激情小说| 岛国AV在线播放| 中文字幕不卡无码| 色秘乱码一区二区三区唱戏| 中文字幕在线视频免费观看| 久久99人妻无码精品一区| 国内自拍无码| 国产在线精品观看| 国产色视频一区二区三区QQ号| 亚洲午夜免费视频| 色婷网| 中文在线a∨在线| 亚洲一级免费视频| 蜜臀av在线观看| 色哟哟无码| 婷婷五月天网| 99精品视频免费看| 天堂国产| 精品国产一区二区三区久久久蜜月| 狠狠草狠狠干| 俺去| 人人妻人人爽人人澡人人精品| 怡红院视频| 在线免费观看黄色电影| 成人区精品一区二区婷婷| 欧美国产日韩在线| 无码视频免费看| 在线中文字幕视频| 亚洲黄色影院| 2025精品偷拍视频| 久久香蕉网| 亚洲无码在线播放| 国产性交网站| 无码在线视频免费观看| 午夜视频99| 3D精品啪啪一区二区免费| 亚洲插逼视频| 人成视频免费观看| 国产一级片免费视频| 人人舔人人草| 欧美日韩久久久| 99精品国自产在线| 亚洲无码免费播放| 9热精品| 亚洲一区二区精品| 另类老妇奶BBBBwBB| 大香蕉av在线观看| 岛国AV免费看| 亚洲精品免费视频| 亚洲在线免费视频| 青青草原av| 亚洲视频日韩在线观看| 一区二区三区四区不卡| 国产精品成人3p一区二区三区| 人妻丰满熟妇| 99热在线观看者| 免费黄视频在线观看| 动漫一区二区| 2024天天操| 人人爱天天做| 欧美群交在线观看| 91香蕉在线观看| 特级西西人体大胆无码| 嫩草视频在线观看| 日本操逼视频| 亚洲操逼无码| 日韩无码人妻视频| 日韩porn| 宅男噜噜噜66一区二区| 上床视频网站| 亚洲中文字幕在线看| 亚洲精品人伦一区二区| 中文在线字幕电视剧免费平台 | 国产精品一区网站| 国产成人免费观看视频| 亚洲天堂国产视频| 2025中文字幕在线| 天天视频国产| 免费看18禁| 高清无码视频在线免费观看| 操逼视频国产| 狠狠久久| 欧美性BBwBBwBBwHD| 亚洲人成77777| 国产99久久| 成人免费在线网站| 俺也去五月婷婷| 五月天伊人| 日本黄色免费| 亚洲不卡视频| 国产欧美二区综合中文字幕精品一| 亚洲综合成人在线| 国产精品在线免费观看| 日韩不卡电影| 一级国产欧美成人A片| 国产丝袜视频| 大香蕉人妻| 欧美午夜精品久久久| 日韩AV免费网站| 天堂AV网站| 日本黄色毛片| 免费无码国产在线55| 一区二区黄| 国产精品午夜成人免费| 欧美性爱一区二区| 99久久99久国产黄毛片| 日本熟妇HD| 台湾精品一区二区三区| 97AV人妻无码视频二区| A在线| 91在线精品一区二区| 欧美一级a| 蝌蚪窝视频网| 精品1区2区| 草草影院国产第一页| 成人一级黄片| 天天日天天操天天干| 高清无码免费| 激情婷婷亚洲| 九色91PORNY国产| 熟妇人妻中文| 91欧美在线| 在线视频91| 日本人妻中出| 无码国产精品一区二区性色AV | 蜜桃人妻无码AV天堂二区| 91蜜桃传媒在线观看| 欧美亚洲一区二区三区| 黄色av天堂| 大香蕉现在视频中心一| 伊人黄色网| 欧美成人电影在线观看| 日韩不卡在线观看| 亚洲人妻电影| 丁香五月综合| 成人福利免费视频| 大伊香蕉视频| 久操福利视频| 亚洲的天堂的αⅴ| 69久久久久久久久久| 天天做天天爱夜夜爽| 亚洲无码色色| 中文字幕免费在线播放| 高清无码在线观看视频| 中国A级片| 亚洲中文免费观看| 91在线无码精品秘入口男同| 亚洲无码一区二区在线观看| 天天操天天日天天干| 免费无码婬片A片AA片| 17c白丝喷水自慰| 日韩高清在线播放| 麻豆精品久久久久久久99蜜桃| 麻豆视频在线观看| 国产女人操逼视频| 国产又爽又黄网站免费观看| 操逼三级| 超碰在线观看91| 日韩无码人妻久久一区二区三区| 黄色片亚洲| 色欲欲www成人网站| 日老女人逼| 中文字幕精品人妻在线| 亚洲日日夜夜| 在线a免费| 大鸡巴视频在线观看| 北条麻妃无码在线| 欧美AAAAA| 乱子伦毛片国产| 国产区精品| 懂色中国闺密偷情懂色AV| 国产熟女AV| 欧美激情视频一区二区| 欧美黄片免费观看| 黄色视频在线免费观看高清视频| 一卡二卡三卡无码| 蜜桃毛片| 亚洲无码免费观看视频| 最新国产毛片| 久久久久久久久久成人| 中文字幕日韩电影| www.超碰| 亚洲中文免费| 3d动漫精品一区二区三区在线观看 | 高清一区二区三区| 久久久久久一区| 自拍亚洲欧美| 成人色色网| 日韩大尺度Av| 一区二区三区无码专区| 欧美日韩国产精品成人| 韩国av在线| 狠狠操夜夜操| 啪啪网站免费观看| 一级片在线免费观看| 亚洲成人免费福利| 青草99| 无码一区二区视频| 麻豆av人人乐| 在线免费观看成人网站| 免费色片| 中文字幕精品无码| 啪啪啪网址| 七六十路の高齢熟妇无码| 激情网站在线观看| 精品国产成人| 欧美日韩中文字幕在线视频| 操屄视频在线观看| 国产精品久久久一区二区三区| 多啪啪免费视频| 黄色小视频免费观看| 成人做爱免费网站| 玖玖爱这里只有精品| 中文字幕2018第一页| 一线天嫩穴少妇| 色色网站在线观看| 99热这里有精品| 欧美日韩中文| 18禁看网站| 日韩欧美成人视频| 国产又爽又黄免费观看视频| 国产成人h| 国产成人精品免高潮在线人与禽一| 无码免费观看| 天天日日日干| 黄色成人网站在线观看免费| 青草中文娱乐网在线| 狼友视频免费在线观看| 日韩成人在线观看视频| AⅤ中文字幕在线免费观看| 日韩欧美在线一区| 操逼视频免费播放| 日韩无码人妻一区二区三区| 人人操超碰在线观看| 亚洲无码自拍偷拍| 黄网在线观看视频| 国产av网站大全| 国产成人99久久亚洲综合精品| 99视频在线免费| www.黄色电影| 草逼com| 91亚洲精华国产精华精华液| 国产精品福利小视频| 操逼视频免费观看| 大鸡吧操视频| 欧美熟妇精品黑人巨大一二三区| 国产和日韩中文字幕| 色悠悠久久综合| 熟女一区二区| 超碰最新在线观看| 操逼视频网址|