成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識(shí)庫 > pytorch DistributedDataParallel 多卡訓(xùn)練結(jié)果變差的解決方案

pytorch DistributedDataParallel 多卡訓(xùn)練結(jié)果變差的解決方案

熱門標(biāo)簽:儋州電話機(jī)器人 地圖標(biāo)注面積 朝陽手機(jī)外呼系統(tǒng) 所得系統(tǒng)電梯怎樣主板設(shè)置外呼 市場(chǎng)上的電銷機(jī)器人 小蘇云呼電話機(jī)器人 北京電銷外呼系統(tǒng)加盟 佛山400電話辦理 北瀚ai電銷機(jī)器人官網(wǎng)手機(jī)版

DDP 數(shù)據(jù)shuffle 的設(shè)置

使用DDP要給dataloader傳入sampler參數(shù)(torch.utils.data.distributed.DistributedSampler(dataset, num_replicas=None, rank=None, shuffle=True, seed=0, drop_last=False)) 。 默認(rèn)shuffle=True,但按照pytorch DistributedSampler的實(shí)現(xiàn):

    def __iter__(self) -> Iterator[T_co]:
        if self.shuffle:
            # deterministically shuffle based on epoch and seed
            g = torch.Generator()
            g.manual_seed(self.seed + self.epoch)
            indices = torch.randperm(len(self.dataset), generator=g).tolist()  # type: ignore
        else:
            indices = list(range(len(self.dataset)))  # type: ignore

產(chǎn)生隨機(jī)indix的種子是和當(dāng)前的epoch有關(guān),所以需要在訓(xùn)練的時(shí)候手動(dòng)set epoch的值來實(shí)現(xiàn)真正的shuffle:

for epoch in range(start_epoch, n_epochs):
    if is_distributed:
        sampler.set_epoch(epoch)
    train(loader)

DDP 增大batchsize 效果變差的問題

large batchsize:

理論上的優(yōu)點(diǎn):

數(shù)據(jù)中的噪聲影響可能會(huì)變小,可能容易接近最優(yōu)點(diǎn);

缺點(diǎn)和問題:

降低了梯度的variance;(理論上,對(duì)于凸優(yōu)化問題,低的梯度variance可以得到更好的優(yōu)化效果; 但是實(shí)際上Keskar et al驗(yàn)證了增大batchsize會(huì)導(dǎo)致差的泛化能力);

對(duì)于非凸優(yōu)化問題,損失函數(shù)包含多個(gè)局部最優(yōu)點(diǎn),小的batchsize有噪聲的干擾可能容易跳出局部最優(yōu)點(diǎn),而大的batchsize有可能停在局部最優(yōu)點(diǎn)跳不出來。

解決方法:

增大learning_rate,但是可能出現(xiàn)問題,在訓(xùn)練開始就用很大的learning_rate 可能導(dǎo)致模型不收斂 (https://arxiv.org/abs/1609.04836)

使用warming up (https://arxiv.org/abs/1706.02677)

warmup

在訓(xùn)練初期就用很大的learning_rate可能會(huì)導(dǎo)致訓(xùn)練不收斂的問題,warmup的思想是在訓(xùn)練初期用小的學(xué)習(xí)率,隨著訓(xùn)練慢慢變大學(xué)習(xí)率,直到base learning_rate,再使用其他decay(CosineAnnealingLR)的方式訓(xùn)練.

# copy from https://github.com/ildoonet/pytorch-gradual-warmup-lr/blob/master/warmup_scheduler/scheduler.py
from torch.optim.lr_scheduler import _LRScheduler
from torch.optim.lr_scheduler import ReduceLROnPlateau
class GradualWarmupScheduler(_LRScheduler):
    """ Gradually warm-up(increasing) learning rate in optimizer.
    Proposed in 'Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour'.
    Args:
        optimizer (Optimizer): Wrapped optimizer.
        multiplier: target learning rate = base lr * multiplier if multiplier > 1.0. if multiplier = 1.0, lr starts from 0 and ends up with the base_lr.
        total_epoch: target learning rate is reached at total_epoch, gradually
        after_scheduler: after target_epoch, use this scheduler(eg. ReduceLROnPlateau)
    """
    def __init__(self, optimizer, multiplier, total_epoch, after_scheduler=None):
        self.multiplier = multiplier
        if self.multiplier  1.:
            raise ValueError('multiplier should be greater thant or equal to 1.')
        self.total_epoch = total_epoch
        self.after_scheduler = after_scheduler
        self.finished = False
        super(GradualWarmupScheduler, self).__init__(optimizer)
    def get_lr(self):
        if self.last_epoch > self.total_epoch:
            if self.after_scheduler:
                if not self.finished:
                    self.after_scheduler.base_lrs = [base_lr * self.multiplier for base_lr in self.base_lrs]
                    self.finished = True
                return self.after_scheduler.get_last_lr()
            return [base_lr * self.multiplier for base_lr in self.base_lrs]
        if self.multiplier == 1.0:
            return [base_lr * (float(self.last_epoch) / self.total_epoch) for base_lr in self.base_lrs]
        else:
            return [base_lr * ((self.multiplier - 1.) * self.last_epoch / self.total_epoch + 1.) for base_lr in self.base_lrs]
    def step_ReduceLROnPlateau(self, metrics, epoch=None):
        if epoch is None:
            epoch = self.last_epoch + 1
        self.last_epoch = epoch if epoch != 0 else 1  # ReduceLROnPlateau is called at the end of epoch, whereas others are called at beginning
        if self.last_epoch = self.total_epoch:
            warmup_lr = [base_lr * ((self.multiplier - 1.) * self.last_epoch / self.total_epoch + 1.) for base_lr in self.base_lrs]
            for param_group, lr in zip(self.optimizer.param_groups, warmup_lr):
                param_group['lr'] = lr
        else:
            if epoch is None:
                self.after_scheduler.step(metrics, None)
            else:
                self.after_scheduler.step(metrics, epoch - self.total_epoch)
    def step(self, epoch=None, metrics=None):
        if type(self.after_scheduler) != ReduceLROnPlateau:
            if self.finished and self.after_scheduler:
                if epoch is None:
                    self.after_scheduler.step(None)
                else:
                    self.after_scheduler.step(epoch - self.total_epoch)
                self._last_lr = self.after_scheduler.get_last_lr()
            else:
                return super(GradualWarmupScheduler, self).step(epoch)
        else:
            self.step_ReduceLROnPlateau(metrics, epoch)

分布式多卡訓(xùn)練DistributedDataParallel踩坑

近幾天想研究了多卡訓(xùn)練,就花了點(diǎn)時(shí)間,本以為會(huì)很輕松,可是好多坑,一步一步踏過來,一般分布式訓(xùn)練分為單機(jī)多卡與多機(jī)多卡兩種類型;

主要有兩種方式實(shí)現(xiàn):

1、DataParallel: Parameter Server模式,一張卡位reducer,實(shí)現(xiàn)也超級(jí)簡(jiǎn)單,一行代碼

DataParallel是基于Parameter server的算法,負(fù)載不均衡的問題比較嚴(yán)重,有時(shí)在模型較大的時(shí)候(比如bert-large),reducer的那張卡會(huì)多出3-4g的顯存占用

2、DistributedDataParallel:官方建議用新的DDP,采用all-reduce算法,本來設(shè)計(jì)主要是為了多機(jī)多卡使用,但是單機(jī)上也能用

為什么要分布式訓(xùn)練?

可以用多張卡,總體跑得更快

可以得到更大的 BatchSize

有些分布式會(huì)取得更好的效果

主要分為以下幾個(gè)部分:

單機(jī)多卡,DataParallel(最常用,最簡(jiǎn)單)

單機(jī)多卡,DistributedDataParallel(較高級(jí))、多機(jī)多卡,DistributedDataParallel(最高級(jí))

如何啟動(dòng)訓(xùn)練

模型保存與讀取

注意事項(xiàng)

一、單機(jī)多卡(DATAPARALLEL)

from torch.nn import DataParallel
 
device = torch.device("cuda")
?;蛘遜evice = torch.device("cuda:0" if True else "cpu")
 
model = MyModel()
model = model.to(device)
model = DataParallel(model)
?;蛘適odel = nn.DataParallel(model,device_ids=[0,1,2,3])

比較簡(jiǎn)單,只需要加一行代碼就行, model = DataParallel(model)

二、多機(jī)多卡、單機(jī)多卡(DISTRIBUTEDDATAPARALLEL)

建議先把注意事項(xiàng)看完在修改代碼,防止出現(xiàn)莫名的bug,修改訓(xùn)練代碼如下:

其中opt.local_rank要在代碼前面解析這個(gè)參數(shù),可以去后面看我寫的注意事項(xiàng);

    from torch.utils.data.distributed import DistributedSampler
    import torch.distributed as dist
    import torch
 
    # Initialize Process Group
    dist_backend = 'nccl'
    print('args.local_rank: ', opt.local_rank)
    torch.cuda.set_device(opt.local_rank)
    dist.init_process_group(backend=dist_backend)
 
    model = yourModel()#自己的模型
    if torch.cuda.device_count() > 1:
        print("Let's use", torch.cuda.device_count(), "GPUs!")
        # 5) 封裝
        # model = torch.nn.parallel.DistributedDataParallel(model,
        #                                                   device_ids=[opt.local_rank],
        #                                                   output_device=opt.local_rank)
        model = torch.nn.parallel.DistributedDataParallel(model.cuda(), device_ids=[opt.local_rank])
    device = torch.device(opt.local_rank)
    model.to(device)
    dataset = ListDataset(train_path, augment=True, multiscale=opt.multiscale_training, img_size=opt.img_size, normalized_labels=True)#自己的讀取數(shù)據(jù)的代碼
    world_size = torch.cuda.device_count()
    datasampler = DistributedSampler(dataset, num_replicas=dist.get_world_size(), rank=opt.local_rank)
 
    dataloader = torch.utils.data.DataLoader(
        dataset,
        batch_size=opt.batch_size,
        shuffle=False,
        num_workers=opt.n_cpu,
        pin_memory=True,
        collate_fn=dataset.collate_fn,
        sampler=datasampler
    )#在原始讀取數(shù)據(jù)中加sampler參數(shù)就行
 
 
.....
 
訓(xùn)練過程中,數(shù)據(jù)轉(zhuǎn)cuda
      imgs = imgs.to(device)
      targets = targets.to(device)

三、如何啟動(dòng)訓(xùn)練

1、DataParallel方式

正常訓(xùn)練即可,即

python3 train.py

2、DistributedDataParallel方式

需要通過torch.distributed.launch來啟動(dòng),一般是單節(jié)點(diǎn),

CUDA_VISIBLE_DEVICES=0,1 python3 -m torch.distributed.launch --nproc_per_node=2 train.py

其中CUDA_VISIBLE_DEVICES 設(shè)置用的顯卡編號(hào),--nproc_pre_node 每個(gè)節(jié)點(diǎn)的顯卡數(shù)量,一般有幾個(gè)顯卡就用幾個(gè)顯卡

多節(jié)點(diǎn)

python3 -m torch.distributed.launch --nproc_per_node=NUM_GPUS_YOU_HAVE --nnodes=2 --node_rank=0
#兩個(gè)節(jié)點(diǎn),在0號(hào)節(jié)點(diǎn)

要是訓(xùn)練成功,就會(huì)打印出幾個(gè)信息,有幾個(gè)卡就打印幾個(gè)信息,如下圖所示:

四、模型保存與讀取

以下a、b是對(duì)應(yīng)的,用a保存,就用a方法加載

1、保存

a、只保存參數(shù)

torch.save(model.module.state_dict(), path)

b、保存參數(shù)與網(wǎng)絡(luò)

torch.save(model.module,path)

2、加載

a、多卡加載模型預(yù)訓(xùn)練;

model = Yourmodel()
if opt.pretrained_weights:
        if opt.pretrained_weights.endswith(".pth"):
            model.load_state_dict(torch.load(opt.pretrained_weights))
        else:
            model.load_darknet_weights(opt.pretrained_weights)

單卡加載模型,需要加載模型時(shí)指定主卡讀模型,而且這個(gè)'cuda:0',是看你訓(xùn)練的模型是0還是1(否則就會(huì)出錯(cuò)RuntimeError: Attempting to deserialize object on CUDA device 1 but torch.cuda.device_count() is 1. Please use torch.load with map_location to map your storages to an existing device),可以根據(jù)自己的更改:

model = Yourmodel()
if opt.pretrained_weights:
        if opt.pretrained_weights.endswith(".pth"):
            model.load_state_dict(torch.load(opt.pretrained_weights,map_location="cuda:0"))
        else:
            model.load_darknet_weights(opt.pretrained_weights)

b、單卡加載模型;

同樣也要指定讀取模型的卡。  

model = torch.load(opt.weights_path, map_location="cuda:0")

多卡加載預(yù)訓(xùn)練模型,以b這種方式還沒跑通。

五、注意事項(xiàng)

1、model后面添加module

獲取到網(wǎng)絡(luò)模型后,使用并行方法,并將網(wǎng)絡(luò)模型和參數(shù)移到GPU上。注意,若需要修改網(wǎng)絡(luò)模塊或者獲得模型的某個(gè)參數(shù),一定要在model后面加上.module,否則會(huì)報(bào)錯(cuò),比如:

model.img_size  要改成  model.module.img_size

2、.cuda或者.to(device)等問題

device是自己設(shè)置,如果.cuda出錯(cuò),就要化成相應(yīng)的device

model(如:model.to(device))

input(通常需要使用Variable包裝,如:input = Variable(input).to(device))

target(通常需要使用Variable包裝

nn.CrossEntropyLoss()(如:criterion = nn.CrossEntropyLoss().to(device))

3、args.local_rank的參數(shù)

通過torch.distributed.launch來啟動(dòng)訓(xùn)練,torch.distributed.launch 會(huì)給模型分配一個(gè)args.local_rank的參數(shù),所以在訓(xùn)練代碼中要解析這個(gè)參數(shù),也可以通過torch.distributed.get_rank()獲取進(jìn)程id。

parser.add_argument("--local_rank", type=int, default=-1, help="number of cpu threads to use during batch generation")
 

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • 關(guān)于pytorch多GPU訓(xùn)練實(shí)例與性能對(duì)比分析
  • 解決pytorch多GPU訓(xùn)練保存的模型,在單GPU環(huán)境下加載出錯(cuò)問題
  • 解決Pytorch訓(xùn)練過程中l(wèi)oss不下降的問題
  • pytorch 指定gpu訓(xùn)練與多gpu并行訓(xùn)練示例

標(biāo)簽:酒泉 江蘇 寧夏 商丘 金融催收 云南 定西 龍巖

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《pytorch DistributedDataParallel 多卡訓(xùn)練結(jié)果變差的解決方案》,本文關(guān)鍵詞  pytorch,DistributedDataParallel,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《pytorch DistributedDataParallel 多卡訓(xùn)練結(jié)果變差的解決方案》相關(guān)的同類信息!
  • 本頁收集關(guān)于pytorch DistributedDataParallel 多卡訓(xùn)練結(jié)果變差的解決方案的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    亚洲网在线观看| 久久无码人妻一区二区三区| 欧美黑人一级爽快片淫片高清| 国产一区二区三区久久精品| 婷婷综合久久中文字幕蜜桃三电影| 日韩一区自拍| 久久亚洲精品中文字幕冲田杏梨| 精品在线视频一区二区三区| 成人a视频在线观看| 中文字幕乱在线伦视频乱在线伦视频| 精品一区91| 久久国产精品首页| 亚洲国产欧美一区二区三区丁香婷| 亚洲自拍偷拍欧美| 91在线超碰| 国产成人av电影在线播放| 久久国产免费看| 久久无码高潮喷水| 国产精品成人无码| 国产日韩一区二区在线观看| 5858p先锋影音资源网| 在线一区免费观看| 免费在线观看成人av| 亚洲精品视频在线观看视频| 日本欧美一区二区在线观看| 91麻豆精品国产综合久久久久久| 国产大屁股喷水视频在线观看| 久久综合九色综合97婷婷| 四虎成人精品一区二区免费网站| 国产a∨精品一区二区三区仙踪林| 久久久午夜影院| 日韩在线理论| 日韩中文第一页| www.超碰97.com| 一区二区三区日韩精品视频| 国产在线不卡一区二区三区| 中文字幕有码在线| 国产无遮挡又黄又爽又色| 亚洲精品一区二区三区新线路| 德国一级在线视频| 色狠狠色噜噜噜综合网| 欧美肥婆xxxx欧美另类| 中文字幕人成高清视频| 日韩欧美一区二区不卡| 国内视频精品| 国产一二三视频| 欧美成人精品网站| 欧美日韩国产高清视频| 美女视频黄免费| 国产精品网红直播| 91麻豆精品国产91久久久更新资源速度超快| 亚洲福利一二三区| 欧美日韩大陆在线| 欧美日本不卡高清| 美女扒开尿口让男人操| 国产91免费视频| 日韩中文字幕亚洲一区二区va在线| 9191国产视频| 亚洲精品视频久久久| 成人欧美精品久久久久影院| a天堂在线视频| 国产精品入口久久| 日韩在线亚洲| 国产精品国产三级国产aⅴ无密码| 亚洲第一天堂av| 欧美aⅴ一区二区三区视频| 国产特级淫片高清视频| 国产农村妇女精品一二区| 亚洲免费观看高清完整版在线| 亚洲日韩中文字幕| 中文字幕在线永久在线视频| 国内精品美女av在线播放| 91九色极品视频| 日韩欧美一区二区在线观看| 国产精品久久久国产盗摄| www.99re.av| 神马久久久久久久| 欧美性视频一区二区三区| 国产精品一区二区三区四| 久热综合在线亚洲精品| 欧美日韩综合| 精品视频一区二区在线| 成人av资源站| www.av精品| 精品伦精品一区二区三区视频密桃| 国产在线观看a视频| 国产日韩中文字幕在线| 国产999精品久久久| 欧美高清性xxxxhdvideosex| 精品欧美一区二区精品久久| 欧美极品在线| 久久亚洲精品一区二区| 久久中文在线| 国产视频一区二| heisi视频网在线观看| 欧美一级视频一区二区| 日韩极品精品视频免费观看| www.豆豆成人网.com| 欧美日韩一二三区| 激情丁香综合五月| 一级片视频免费| 国产欧美中文在线| 欧美国产一区二区在线| 国产91网红主播在线观看| 久久99热这里只有精品国产| www.99.热| 久久国产精品免费精品3p| 免费视频亚洲| 女人天堂av在线播放| 欧美亚洲另类在线| 在线观看国产成人| 久久久成人精品一区二区三区| 成人av在线一区二区三区| 欧美 日韩 国产 在线观看| 91欧美视频网站| 超碰在线国产97| 黄色激情网站| 伊人影院蕉久552| 2019中文字幕在线免费观看| 91国内精品在线视频| 伊人成人在线视频| 日本成本人片免费观看| 东京热无码av男人的天堂| 一级毛片在线视频| 国产无码精品在线播放| 不许穿内裤随时挨c调教h苏绵| 日韩成人av毛片| 丁香激情五月婷婷| 91超碰碰碰碰久久久久久综合| 欧美+亚洲+精品+三区| 国产精品秘入口| 亚洲视频一起| 少妇黄色一级片| 9191国产精品| 粉嫩久久久久久久极品| 中文在线最新版天堂| 公侵犯人妻一区二区三区| 日本中文字幕在线视频观看| 成人sese在线| 91精品国产自产拍在线观看蜜| 成年女人免费视频| 成人精品视频一区二区三区| 成人午夜碰碰视频| 小小影院久久| www黄色在线观看| 成人精品网站在线观看| 国产精品视频永久免费播放| 最近中文字幕在线mv视频在线| 国产黄色高清在线| 成人av集中营| 欧洲精品毛片网站| 日韩激情视频在线播放| 精品国产成人在线影院| 欧美日本色图| 精品久久久久av| wwwwxxxx国产| 六月婷婷激情综合| 天天操天天操天天干| 亚洲一区免费看| www.夜色| 久久午夜夜伦鲁鲁一区二区| 国产午夜精品一区二区三区四区| 在线观看欧美www| av中文字幕免费| 国产99精品视频| 久久久久国产| 在线免费观看毛片| 精品国产乱码久久久久久蜜坠欲下| a级精品国产片在线观看| 欧美日韩国产123| 久久99精品久久久久久动态图| 日韩av电影在线播放| 日韩电影免费在线观看| 成人国产视频在线| 日韩精品一区二区三区swag| xvideos国产精品| 变态黄色小视频网站| 欧美美女黄视频| av免费网站在线观看| 国产精选在线视频拍拍拍| 欧美精品一区三区| www.操操| 精品亚洲va在线va天堂资源站| 91官网在线| 任我爽在线视频精品一| 国产日韩精品suv| 久久综合99re88久久爱| 免费在线你懂的| 欧美做受777cos| 97超碰国产一区二区三区| 中文精品一区二区| 欧美一区二区三区喷汁尤物| 日本精品视频一区二区| 亚洲欧美久久久久| 欧美一级视频免费| 97久久超碰福利国产精品…| 亚洲欧美国产中文| 四虎影视最新网址| 91九蝌蚪视频| 国产精品护士白丝一区av| 国产高清视频免费观看| 亚洲人成7777| 小明精品国产一区二区三区| 黄色亚洲免费| 女人在下体塞跳蛋在线观看| 亚洲国产剧情在线观看| 三级外国片在线观看视频| 亚洲最大福利视频| 一区二区三区高清视频在线观看| 天堂在线观看| 一二三四视频社区在线| 国产手机精品在线| 亚洲高清免费在线| 欧美三级美国一级| 奇米影视亚洲色图| 黄色一区二区三区| 亚洲图区综合网| 亚洲三级免费看| 美女网站在线观看| 久久亚洲精品石原莉奈| 精品亚洲一区二区三区| 日本 国产 欧美色综合| 99福利在线观看| 国产成人视屏| 欧美老少配视频| 亚洲精品一区二区三区99| 欧美精品一区二区三区在线播放| 日本精品久久久久| 日本三级在线电影| 一本一本久久a久久综合精品| 91精品国产综合久久蜜臀| 欧美色播在线播放| 亚洲一区av在线| www国产精品视频| 欧美丝袜美女中出在线| 日本在线视频中文字幕| 国自产拍偷拍福利精品免费一| 国产成人av电影免费在线观看| 这里只有精品999| 国产又爽又黄又刺激的软件| 嫩草影院网站在线| 精品夜夜澡人妻无码av| 色老太综合网| 国产在线观看中文字幕| 国产精品一区免费在线| 最新在线你懂的| 18一19gay欧美视频网站| 久久综合九色| 黄色成人在线网站| 国产女主播喷水视频在线观看| 中文字幕日韩欧美在线视频| 成人一区二区av| 色呦色呦色精品| 久久精品午夜一区二区福利| 国产精品乱人伦中文| 九九精品在线观看| 久草在线免费二| 国产黄色录像片| 2021中文字幕在线| 亚洲国产裸拍裸体视频在线观看乱了中文| 99re99热| 国产精品毛片无码| 久久裸体网站| 精品在线视频一区二区| 欧美变态口味重另类| 日本成人一区二区三区| 91成人免费网站| 好男人官网在线| 欧美成人手机在线视频| 中文字幕在线中文字幕二区| 搞黄视频在线观看| 黄色av网站在线| 污视频免费在线观看网站| 酒色婷婷桃色成人免费av网| 91成人破解版| 综合电影一区二区三区| 亚洲福利一区二区三区| 国产对白在线播放| 精品国产百合女同互慰| www免费网站在线观看| 免费毛片小视频| 一区二区不卡| 一二三区免费视频| 亚洲一区尤物| av电影在线观看| 亚洲aaa在线观看| 欧美日韩综合精品| 国产成人精品免高潮费视频| 欧美午夜电影在线| 中文字幕亚洲欧美在线不卡| 亚洲国产日韩美| 免费三级毛片| 亚洲精品系列| 国产精品日韩久久久久| 91精品在线观| 中文字幕亚洲专区| 黑巨人与欧美精品一区| 欧美福利一区二区三区| 色屁屁www国产馆在线观看| 中文字幕第一页亚洲| wwwxxxx国产| 粗大的内捧猛烈进出视频| 亚洲福利视频三区| 99精品国产视频| 国产福利视频一区二区| av高清在线免费观看| 欧美高清一级片在线| 色橹橹欧美在线观看视频高清| 色播视频在线播放| 亚洲欧洲高清在线| 国产一区二区剧情av在线| 国产亚洲综合视频| 亚洲午夜影视影院在线观看| 色播亚洲视频在线观看| 欧美日韩免费精品| 中文字幕黄色片| 91麻豆123| 女人帮男人橹视频播放| 九九久久精品视频| 男人的午夜天堂| 色综合色综合| 国产精品麻豆久久久| 先锋影音av在线| 国产精品成人免费一区久久羞羞| 亚洲性生活视频在线观看| 欧美激情www| 亚洲国产一区二区三区在线播放| 亚洲国产老妈|