色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

深度學習Pytorch翻車記錄:單卡改多卡踩坑記

深度學習自然語言處理 ? 來源:深度學習自然語言處理 ? 作者:喲林小平 ? 2021-01-18 17:06 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

先說明一下背景,目前正在魔改以下這篇論文的代碼:

https://github.com/QipengGuo/GraphWriter-DGLgithub.com

由于每次完成實驗需要5個小時(baseline),自己的模型需要更久(2倍),非常不利于調參和發現問題,所以開始嘗試使用多卡加速。

torch.nn.DataParallel ==> 簡稱 DP

torch.nn.parallel.DistributedDataParallel ==> 簡稱DDP

一開始采用dp試圖加速,結果因為dgl的實現(每個batch的點都會打包進一個batch,從而不可分割),而torch.nn.DataParallel的實現是把一個batch切分成更小,再加上他的加速性能也不如ddp,所以我開始嘗試魔改成ddp。

另外,作者在實現Sampler的時候是繼承了torch.utils.data.Sampler這個類的,目的在于agenda數據集的文本長度嚴重不均衡,如下:

68176276-58b2-11eb-8b86-12bb97331649.jpg

為了讓模型更快train完,把長度相近的文本打包成一個batch(溫馨提醒,torchtext也有相關的類 bucketiterator[1],大概形式如下:

class BucketSampler(torch.utils.data.Sampler):
    def __init__(self, data_source, batch_size=32):
        self.data_source = data_source
        self.batch_size = batch_size 

    def __iter__(self):
        idxs, lens, batch, middle_batch_size, long_batch_size = basesampler(self.data_source , self.batch_size)
        for idx in idxs:
            batch.append(idx)
            mlen = max([0]+[lens[x] for x in batch])
            #if (mlen<100 and len(batch) == 32) or (mlen>100 and mlen<220 and len(batch) >= 24) or (mlen>220 and len(batch)>=8) or len(batch)==32:
            if (mlen<100 and len(batch) == self.batch_size) or (mlen>100 and mlen<220 and len(batch) >= middle_batch_size) or (mlen>220 and len(batch)>=long_batch_size) or len(batch)==self.batch_size:
                yield batch
                batch = []
        if len(batch) > 0:
            yield batch

    def __len__(self):
        return (len(self.data_source)+self.batch_size-1)//self.batch_size

這是背景。

寫bug第一步:繼承DistributedSampler的漏洞百出

我一開始理想當然的把作者的sampler源碼crtl-cv下來,唯獨只改動了這里:

class DDPBaseBucketSampler(torch.utils.data.distributed.DistributedSampler):

隨后就發現了幾個問題:

  • dataloader不會發包;
  • dataloader給每個進程發的是完整的數據,按武德來說,應該是1/n的數據,n為你設置的gpu數量;

然后我就開始看起了源碼[2],很快啊:

 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

        if not self.drop_last:
            # add extra samples to make it evenly divisible
            padding_size = self.total_size - len(indices)
            if padding_size <= len(indices):
                indices += indices[:padding_size]
            else:
                indices += (indices * math.ceil(padding_size / len(indices)))[:padding_size]
        else:
            # remove tail of data to make it evenly divisible.
            indices = indices[:self.total_size]
        assert len(indices) == self.total_size

        # subsample
        indices = indices[self.rankself.num_replicas] # 這一步保證每個進程拿到的數據不同
        assert len(indices) == self.num_samples

        return iter(indices)

這里最關鍵的問題是是什么呢?首先在torch.utils.data.distributed.DistributedSampler里面,數據集的變量叫self.dataset而不是data_source;其次和torch.utils.data.Sampler要求你_重寫__iter__函數不同:

def __iter__(self) -> Iterator[T_co]:
        raise NotImplementedError

DistributedSampler這個父類里有部分實現,如果你沒有考慮到這部分,就自然會出現每個進程拿到的數據都是all的情況。

于是我重寫了我的DDPBaseBucketSampler類:

def basesampler(lens, indices, batch_size):
    # the magic number comes from the author's code
    t1 = []
    t2 = []
    t3 = []
    for i, l in enumerate(lens):
        if (l<100):
            t1.append(indices[i])
        elif (l>100 and l<220):
            t2.append(indices[i])
        else:
            t3.append(indices[i])
    datas = [t1,t2,t3]
    random.shuffle(datas)
    idxs = sum(datas, [])
    batch = []

    #為了保證不爆卡,我們給不同長度的數據上保護鎖
    middle_batch_size = min(int(batch_size * 0.75) , 32)
    long_batch_size = min(int(batch_size * 0.5) , 24)

    return idxs, batch, middle_batch_size, long_batch_size

class DDPBaseBucketSampler(torch.utils.data.distributed.DistributedSampler):
    '''
    這里要注意和單GPU的sampler類同步
    '''
    def __init__(self, dataset, num_replicas, rank, shuffle=True, batch_size=32):
        super(DDPBaseBucketSampler, self).__init__(dataset, num_replicas, rank, shuffle)
        self.batch_size = batch_size

    def __iter__(self):
        # deterministically shuffle based on epoch
        g = torch.Generator()
        g.manual_seed(self.epoch)
        #print('here is pytorch code and you can delete it in the /home/lzk/anaconda3/lib/python3.7/site-packages/torch/utils/data')
        if self.shuffle:
            indices = torch.randperm(len(self.dataset), generator=g).tolist()
        else:
            indices = list(range(len(self.dataset)))
        # add extra samples to make it evenly divisible
        indices += indices[:(self.total_size - len(indices))]
        assert len(indices) == self.total_size

        indices = indices[self.rankself.num_replicas]
        assert len(indices) == self.num_samples

        # 然后我也要拿到每個數據的長度 (每個rank不同)
        lens = torch.Tensor([len(x) for x in self.dataset])

        idxs, batch, middle_batch_size, long_batch_size = basesampler(lens[indices], indices, self.batch_size)
        
        for idx in idxs:
            batch.append(idx)
            mlen = max([0]+[lens[x] for x in batch])
            #if (mlen<100 and len(batch) == 32) or (mlen>100 and mlen<220 and len(batch) >= 24) or (mlen>220 and len(batch)>=8) or len(batch)==32:
            if (mlen<100 and len(batch) == self.batch_size) or (mlen>100 and mlen<220 and len(batch) >= middle_batch_size) or (mlen>220 and len(batch)>=long_batch_size) or len(batch)==self.batch_size:
                yield batch
                batch = []
        # print('應該出現2次如果是2個進程的話')
        if len(batch) > 0:
            yield batch

    def __len__(self):
        return (len(self.dataset)+self.batch_size-1)//self.batch_size

后面每個進程終于可以跑屬于自己的數據了(1/n,n=進程數量=GPU數量,單機)

緊接著問題又來了,我發現訓練過程正常結束后,主進程無法退出mp.spawn()函數。

寫bug第二步,master進程無法正常結束

number workers ddp pytorch下無法正常結束。具體表現為,mp.spawn傳遞的函數參數可以順利運行完,但是master進程一直占著卡,不退出。一開始我懷疑是sampler函數的分發batch的機制導致的,什么意思呢?就是由于每個進程拿到的數據不一樣,各自進程執行sampler類的時候,由于我規定了長度接近的文本打包在一起,所以可能master進程有一百個iter,slave只有80個,然后我馬上試了一下,很快啊:

68655972-58b2-11eb-8b86-12bb97331649.jpg

▲DDPBucketSampler(torch.utils.data.distributed.DistributedSampler)類迭代函數__iter__

6897a242-58b2-11eb-8b86-12bb97331649.jpg

▲都能夠正常打印,證明__iter__函數沒有問題

發現只有細微的差別,并且,程序最后都越過了這些print,應該不會是batch數量不一致導致的問題。(順便指的一提的是,sampler在很早的時候就把batch打包好了)

加了摧毀進程,也于事無補

if args.is_ddp:
     dist.destroy_process_group()
     print('rank destroy_process_group: ' , rank)

然后只能點擊強制退出

File "train.py", line 322, in 
    main(args.gpu, args)
  File "/home/lzk/anaconda3/lib/python3.7/site-packages/torch/multiprocessing/spawn.py", line 171, in spawn
    while not spawn_context.join():
  File "/home/lzk/anaconda3/lib/python3.7/site-packages/torch/multiprocessing/spawn.py", line 77, in join
    timeout=timeout,
  File "/home/lzk/anaconda3/lib/python3.7/multiprocessing/connection.py", line 920, in wait
    ready = selector.select(timeout)
  File "/home/lzk/anaconda3/lib/python3.7/selectors.py", line 415, in select
    fd_event_list = self._selector.poll(timeout)
TypeError: keyboard_interrupt_handler() takes 1 positional argument but 2 were given
^CError in atexit._run_exitfuncs:
Traceback (most recent call last):
  File "/home/lzk/anaconda3/lib/python3.7/multiprocessing/popen_fork.py", line 28, in poll
    pid, sts = os.waitpid(self.pid, flag)
TypeError: keyboard_interrupt_handler() takes 1 positional argument but 2 were given

代碼參考:基于Python初探Linux下的僵尸進程和孤兒進程(三)[3]、Multiprocessing in python blocked[4]

很顯然是pytorch master進程產生死鎖了,變成了僵尸進程。

再探究,發現當我把dataloader的number workers設為0的時候,程序可以正常結束。經過我的注釋大法后我發現,哪怕我把for _i , batch in enumerate(dataloader)內的代碼全部注釋改為pass,程序還是會出現master無法正常結束的情況。所以問題鎖定在dataloader身上。參考:nero:PyTorch DataLoader初探[5]

另外一種想法是,mp.spawn出現了問題。使用此方式啟動的進程,只會執行和 target 參數或者 run() 方法相關的代碼。Windows 平臺只能使用此方法,事實上該平臺默認使用的也是該啟動方式。相比其他兩種方式,此方式啟動進程的效率最低。參考:Python設置進程啟動的3種方式[6]

現在試一下,繞開mp.spawn函數,用shell腳本實現ddp,能不能不報錯:

python -m torch.distributed.launch --nproc_per_node=2 --nnodes=1 --node_rank=0 --master_addr="192.168.1.201" --master_port=23456 我的文件.py

參數解釋:

  • nnodes:因為是單機多卡,所以設為1,顯然node_rank 只能是0了
  • local_rank:進程在運行的時候,會利用args插入local_rank這個參數標識進程序號

一番改動后,發現問題有所好轉,最直觀的感受是速度快了非常多!!現在我沒有父進程的問題了,但還是在運行完所有的程序后,無法正常結束:

68c16578-58b2-11eb-8b86-12bb97331649.jpg

此時我的代碼運行到:

692dbfc0-58b2-11eb-8b86-12bb97331649.jpg

上面的代碼是main函數,2個進程(master,salve)都可以越過barrier,其中slave順利結束,但是master卻遲遲不見蹤影:

6968adba-58b2-11eb-8b86-12bb97331649.jpg

這個時候ctrl+c終止,發現:

69a049e6-58b2-11eb-8b86-12bb97331649.jpg

順著報錯路徑去torch/distributed/launch.py, line 239找代碼:

def main():
    args = parse_args()

    # world size in terms of number of processes
    dist_world_size = args.nproc_per_node * args.nnodes

    # set PyTorch distributed related environmental variables
    current_env = os.environ.copy()
    current_env["MASTER_ADDR"] = args.master_addr
    current_env["MASTER_PORT"] = str(args.master_port)
    current_env["WORLD_SIZE"] = str(dist_world_size)

    processes = []

    if 'OMP_NUM_THREADS' not in os.environ and args.nproc_per_node > 1:
        current_env["OMP_NUM_THREADS"] = str(1)
        print("*****************************************
"
              "Setting OMP_NUM_THREADS environment variable for each process "
              "to be {} in default, to avoid your system being overloaded, "
              "please further tune the variable for optimal performance in "
              "your application as needed. 
"
              "*****************************************".format(current_env["OMP_NUM_THREADS"]))

    for local_rank in range(0, args.nproc_per_node):
        # each process's rank
        dist_rank = args.nproc_per_node * args.node_rank + local_rank
        current_env["RANK"] = str(dist_rank)
        current_env["LOCAL_RANK"] = str(local_rank)

        # spawn the processes
        if args.use_env:
            cmd = [sys.executable, "-u",
                   args.training_script] + args.training_script_args
        else:
            cmd = [sys.executable,
                   "-u",
                   args.training_script,
                   "--local_rank={}".format(local_rank)] + args.training_script_args

        process = subprocess.Popen(cmd, env=current_env)
        processes.append(process)

    for process in processes:
        process.wait() # 等待運行結束
        if process.returncode != 0:
            raise subprocess.CalledProcessError(returncode=process.returncode,
                                                cmd=cmd)

可惡,master和dataloader到底有什么關系哇。。

這個問題終于在昨天(2020/12/22)被解決了,說來也好笑,左手是graphwriter的ddp實現,無法正常退出,右手是minst的ddp最小例程,可以正常退出,于是我開始了刪減大法。替換了數據集,model,然后讓dataloader空轉,都沒有發現問題,最后一步步逼近,知道我把自己的代碼這一行注釋掉以后,終于可以正常結束了:

def main(args):
    ############################################################
    print('local_rank : ' , args.local_rank )
    if args.is_ddp:
        dist.init_process_group(
        backend='nccl',
       init_method='env://',
        world_size=args.world_size,
        rank=args.local_rank
        )
    ############################################################
    # torch.multiprocessing.set_sharing_strategy('file_system')  萬惡之源

    os.environ["CUDA_VISIBLE_DEVICES"] = os.environ["CUDA_VISIBLE_DEVICES"].split(',')[args.local_rank]
    args.device = torch.device(0) 
    ...

為什么我當時會加上這句話呢?因為當時在調試number worker的時候(當時年輕,以為越大越好,所以設置成了number workers = cpu.count()),發現系統報錯,說超出了打開文件的最大數量限制。在torch.multiprocessing的設定里,共享策略(參考pytorch中文文檔[7])默認是File descriptor,此策略將使用文件描述符作為共享內存句柄。當存儲被移動到共享內存中,一個由shm_open獲得的文件描述符被緩存。當時,文檔還提到:

如果你的系統對打開的文件描述符數量有限制,并且無法提高,你應該使用file_system策略。

所以我換成了torch.multiprocessing.set_sharing_strategy('file_system'),但是卻忽略文檔里的共享內存泄露警告。顯然,或許這不是嚴重的問題,文檔里提到:

69eb6b92-58b2-11eb-8b86-12bb97331649.jpg

也有可能我所說的master進程就是這個torch_shm_manager,因為destory進程組始終無法結束0號進程:

6a35e19a-58b2-11eb-8b86-12bb97331649.jpg

這個BUG結束了,真開心,期待下一個BUG快快到來。

責任編輯:xj

原文標題:Pytorch翻車記錄:單卡改多卡踩坑記!

文章出處:【微信公眾號:深度學習自然語言處理】歡迎添加關注!文章轉載請注明出處。


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 機器學習
    +關注

    關注

    66

    文章

    8513

    瀏覽量

    135107
  • 深度學習
    +關注

    關注

    73

    文章

    5569

    瀏覽量

    123092
  • pytorch
    +關注

    關注

    2

    文章

    810

    瀏覽量

    14098

原文標題:Pytorch翻車記錄:單卡改多卡踩坑記!

文章出處:【微信號:zenRRan,微信公眾號:深度學習自然語言處理】歡迎添加關注!文章轉載請注明出處。

收藏 0人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    UWB自動跟隨技術原理、算法融合優化和實錄

    UWB為什么是最靠譜的自動跟隨技術?原理是什么?需要做什么算法融合、優化?我們在開發過程中過的
    的頭像 發表于 08-14 17:45 ?189次閱讀
    UWB自動跟隨技術原理、算法融合優化和<b class='flag-5'>踩</b><b class='flag-5'>坑</b>實錄

    PLC工業智能網關:功能解析、場景落地與選型避攻略

    如何避免選型?本文從技術原理、核心價值、典型場景、避指南四大維度,結合真實案例與行業趨勢,為您徹底拆解PLC工業智能網關的“真面目”。
    的頭像 發表于 07-16 13:21 ?174次閱讀
    PLC工業智能網關:功能解析、場景落地與選型避<b class='flag-5'>坑</b>攻略

    使用Word/Excel管理需求的10個痛點及解決方案Perforce ALM

    還在用Word/Excel做需求管理?10個“翻車信號”,都是小伙伴們過的~來看看你過哪些?是不是也該升級到更專業的ALM工具了~
    的頭像 發表于 07-10 15:59 ?269次閱讀
    使用Word/Excel管理需求的10個痛點及解決方案Perforce ALM

    當CCLink IE遇上DeviceNet,數據記錄儀秒變\"卷王\"?

    \"協議不兼容\"\"數據延遲\"痛點。對工程師來說,不用硬件、不啃協議文檔,用網關讓記錄儀\"自動卷\"——現場少,才有空研究真·效率秘籍,這是打工人的終極浪漫。
    發表于 06-11 14:48

    HarmonyOS:路由跳轉

    背景 ** 隨著華為純血版HarmonyOS NEXT的推出,鴻蒙系統脫離安卓的日子越來越近了。作為車企大廠的我們當然要第一時間學習鴻蒙開發,提前做好技術儲備,為日后鴻蒙應用的開發做好準備工作。于是
    的頭像 發表于 06-09 15:29 ?188次閱讀

    利用Arm Kleidi技術實現PyTorch優化

    PyTorch 是一個廣泛應用的開源機器學習 (ML) 庫。近年來,Arm 與合作伙伴通力協作,持續改進 PyTorch 的推理性能。本文將詳細介紹如何利用 Arm Kleidi 技術提升 Arm
    的頭像 發表于 12-23 09:19 ?1197次閱讀
    利用Arm Kleidi技術實現<b class='flag-5'>PyTorch</b>優化

    PyTorch 2.5.1: Bugs修復版發布

    ? 一,前言 在深度學習框架的不斷迭代中,PyTorch 社區始終致力于提供更穩定、更高效的工具。最近,PyTorch 2.5.1 版本正式發布,這個版本主要針對 2.5.0 中發現的
    的頭像 發表于 12-03 16:11 ?1718次閱讀
    <b class='flag-5'>PyTorch</b> 2.5.1: Bugs修復版發布

    ADC高速采樣電路設計詳解之STM32

    一、過程 最近用STM32F334做數字電源,用到了高速ADC采集電壓電流。設計的參考電壓VREF為3.3V,輸入信號經運放跟隨后直接接入單片機的采樣通道。一開始測試一切正常,但隨著輸入信號
    的頭像 發表于 12-02 09:27 ?3209次閱讀
    ADC高速采樣電路設計詳解之STM32<b class='flag-5'>踩</b><b class='flag-5'>坑</b>

    4G模組SD接口編程:深度學習

    今天我們需要深度學習的是4G模組SD接口編程,以我常用的模組Air724UG為例,分享給大家。
    的頭像 發表于 11-20 23:14 ?762次閱讀
    4G模組SD<b class='flag-5'>卡</b>接口編程:<b class='flag-5'>深度</b><b class='flag-5'>學習</b>

    NPU在深度學習中的應用

    隨著人工智能技術的飛速發展,深度學習作為其核心驅動力之一,已經在眾多領域展現出了巨大的潛力和價值。NPU(Neural Processing Unit,神經網絡處理單元)是專門為深度學習
    的頭像 發表于 11-14 15:17 ?2191次閱讀

    學習go語言的過程過的

    作為一個5年的phper,這兩年公司和個人都在順應技術趨勢,新項目慢慢從php轉向了go語言,從2021年到現在,筆者手上也先后開發了兩個go項目。在學習go語言的過程中也學習并總結了一些相關的東西,這篇文章就分享下自己過的一
    的頭像 發表于 11-11 09:22 ?533次閱讀

    PyTorch 數據加載與處理方法

    PyTorch 是一個流行的開源機器學習庫,它提供了強大的工具來構建和訓練深度學習模型。在構建模型之前,一個重要的步驟是加載和處理數據。 1. Py
    的頭像 發表于 11-05 17:37 ?1036次閱讀

    如何使用 PyTorch 進行強化學習

    強化學習(Reinforcement Learning, RL)是一種機器學習方法,它通過與環境的交互來學習如何做出決策,以最大化累積獎勵。PyTorch 是一個流行的開源機器
    的頭像 發表于 11-05 17:34 ?1117次閱讀

    Pytorch深度學習訓練的方法

    掌握這 17 種方法,用最省力的方式,加速你的 Pytorch 深度學習訓練。
    的頭像 發表于 10-28 14:05 ?740次閱讀
    <b class='flag-5'>Pytorch</b><b class='flag-5'>深度</b><b class='flag-5'>學習</b>訓練的方法

    GPU深度學習應用案例

    GPU在深度學習中的應用廣泛且重要,以下是一些GPU深度學習應用案例: 一、圖像識別 圖像識別是深度學習
    的頭像 發表于 10-27 11:13 ?1607次閱讀
    主站蜘蛛池模板: 胖女人毛片 | 青青国产视频 | 九草网 | 超碰97人人射妻 | 成人免费毛片明星色大师 | 国产爆乳美女娇喘呻吟 | 日本欧美中文字幕 | 男人av无码天堂 | 国产乱淫视频免费 | 免费又黄又裸乳的视频 | 嫩草av久久伊人妇女超级a | 久久亚洲精品国产亚洲老地址 | 日本三级做爰在线播放 | 成人精品国产 | 蜜臀av在线播放一区二区三区 | 一级大片网站 | 26uuu精品一区二区在线观看 | 欧美精品v国产精品v日韩精品 | 亚洲高潮毛片无遮挡免费 | 亚洲色图日韩 | 激情久久一区二区三区 | 亚洲九九九九 | 中文字幕第22页 | 国产九色在线 | 在线一级片 | 精品国产欧美一区二区三区成人 | xvideos成人免费中文版 | 嫩草影院在线观看视频 | 午夜无码人妻av大片色欲 | 日韩精品成人一区二区在线观看 | 日本一卡2卡3卡四卡精品网站 | 91精品免费 | 免费人妻无码不卡中文字幕系 | 午夜三级做爰高潮 | 欧美一级片网站 | 情侣作爱视频网站 | 亚洲大尺度专区 | 国产亚洲影院 | 久久婷婷国产91天堂综合精品 | 国内精品久久久久影视老司机 | 亚洲欧洲综合网 | av亚洲产国偷v产偷v自拍软件 | 亚洲国产制服 | 欧美成人精品一区二区三区在线观看 | 国产偷久久一区精品69 | 久久国产乱子伦精品免费午夜,浪货好紧 | 亚洲久久综合 | 久久h视频| 麻豆91精品91久久久的内涵 | 亚洲精品成人在线视频 | 一本色道久久综合狠狠躁的推荐 | 色网在线看 | 亚洲综合网址 | 欧美极品jizzhd欧美仙踪林 | 一级黄色片看看 | 潮喷失禁大喷水无码 | 摸丰满大乳奶水www免费 | 一本久久综合亚洲鲁鲁五月天 | 日韩在线综合 | 成人444kkkk在线观看 | 国产精品一区二区三区四区 | 欧美成人高清ww | 少妇做爰α片免费视频网站 | 国产精品久久久久久久久福交 | 亚洲欧美另类一区 | 欧美激情一区在线 | 一级片免费观看 | 我要看黄色1级片 | 一区二区视频网站 | 岛国av免费在线观看 | 久久综合久久综合久久 | 最近中文字幕2019视频1 | 中文字幕一区二区三区又粗 | 日本黄色免费网站 | 亚洲日韩中文无码久久 | 日本黄色激情视频 | 亚洲国产一区二区天堂 | 国产一区二区三区四区三区 | 麻豆网神马久久人鬼片 | 国产精品久久久久久久第一福利 | 日日爽日日操 | 精品国产一区二区三区久久久狼 | 日韩中文字幕在线视频 | 毛片永久新网址首页 | 久久人人人 | 99久久无码一区人妻 | 日本护士毛茸茸 | 国产一区中文字幕 | 久久曰视频 | 高清视频一区二区三区 | av网站大全在线 | 精品国产乱码久久久久久蜜退臀 | 天堂√中文最新版在线 | 毛片网在线 | 好吊色网站 | 亚洲精品一区二区三区在线观看 | 亚洲小视频 | 精品国产乱码久久久久久图片 | 少妇高潮毛片免费看 | 亚洲一区二区色 | 亚洲视频一二三四 | 天天综合天天添夜夜添狠狠添 | 日韩免费久久 | 爱爱视频免费网址 | 中文字幕精品亚洲一区 | 亚洲色无码一区二区三区 | 亚洲一区二区在线视频观看 | 99久久精品免费看国产免费软件 | 午夜精品久久久久久久久久久久 | 亚洲综合av一区二区三区 | 91成人免费视频 | 美国av一区二区 | 丁香五香天堂综合小说 | 久久久久久综合网 | 天天看天天摸天天操 | 国产福利在线永久视频 | 亚洲精品一区二区 | 欧美日韩亚洲国产精品 | 爱爱网站免费 | 亚洲男人的天堂网 | 国产精品天干天干 | 99久久人人爽亚洲精品美女 | 国产香蕉尹人视频在线 | a级黄色片免费 | 国产精品久久久久久久久久妞妞 | 啪啪的网站 | 精品无码国模私拍视频 | 亚洲xxxxx | 国产精品自产拍在线观看55亚洲 | 思思99精品视频在线观看 | 一区二区视频在线免费观看 | 亚洲国产人午在线一二区 | 日韩高清在线中文字带字幕 | 色婷婷av一区二区三区影片 | 国内少妇毛片视频 | 男人午夜剧场 | 性欧美videos另类极品小说 | 亚洲国产综合无码一区 | 国产精品好爽好紧好大 | 欧美野外猛男的大粗鳮台湾同胞 | 明星毛片 | 国产成人高潮免费观看精品 | 国产av一区二区三区无码野战 | 国产农村妇女露脸对白视频 | 欧美性猛交xxx乱久交 | 久久久久久久av麻豆果冻 | 国产αv视频 | 围产精品久久久久久久 | 偷拍女人私密按摩高潮视频 | 精品欧美乱码久久久久久 | 视频二区在线 | 美女av毛片 | 欧美亚洲另类小说 | 黄色91视频| 久久久.com | 女总裁呻吟双腿大开sm视频 | 美女搞黄在线观看 | 免费看成人aa片无码视频吃奶 | 男人添女荫道口视频a | 五月天激情国产综合婷婷婷 | 女人毛片av | av网址在线看 | 村上凉子在线播放av88 | 91精品国产黑色瑜伽裤 | 国产精品亚洲成在人线 | 91精品国产一区二区三密臀 | 少妇一区二区三区四区 | 成人免费看类便视频 | 精品不卡一区二区 | 依人成人 | 羽月希奶水一区二区三区 | 久久婷婷色一区二区三区asmr | 在线免费视频 | 一区二区三区小说 | 日本高清aⅴ毛片免费 | 精品久久久网站 | 亚洲欧美在线视频免费 | 午夜小视频在线播放 | 69综合| 无遮挡19禁啪啪成人黄软件 | 人人摸人人搞人人透 | 中文字幕在线精品中文字幕导入 | 四虎网站 | 国产肉体xxxx裸体784大胆 | 无码人妻精品一区二区在线视频 | 欧美黑人猛猛猛 | 精品一卡二卡三卡四卡 | 色香影院 | 4438xx亚洲最大五色丁香 | 69精品丰满人妻无码视频a片 | 国产成年无码v片在线 | 国产精品久久久久影院 | 亚洲一区二区三区无码国产 | 88国产精品久久现线拍久青草 | 久久久精品国产99久久精品麻追 | 日本老妇70sex另类 | 国产精品欧美福利久久 | 一区二区中文字幕在线观看 | 天天超碰 | 精品国产免费看 | 福利影院av | 黄色大片毛片 | 在线亚洲天堂 | 欧美日韩一区二区三区视频播放 | 午夜88| 日本韩无专砖码高清 | 四虎黄色片 | 国产人成高清在线视频99最全资源 | 精品国产一区二区三区四区vr | 爱丝aiss无内高清丝袜视频 | 人人澡人人透人人爽 | 乌克兰极品少妇xxxx做受小说 | 国产精品久久久久久久久久影院 | 日韩av无码精品一二三区 | 人成免费a级毛片 | 农村乡下女人毛片 | 国产小视频在线免费观看 | 午夜影吧 | 欧美黑人巨大videos精品 | 超碰人人人人人 | 另类亚洲小说图片综合区 | 日本亚洲欧美在线 | 动漫av永久无码精品每日更新 | 91精彩视频 | 国产精品综合色区在线观看 | 一级黄色大片视频 | 国产伦精品一区二区三区四区 | 日日摸夜夜添夜夜添特色大片 | 三级免费看 | 白浆导航| 任你躁国产自任一区二区三区 | 浴室激情hd免费看 | 久久亚洲一区二区三区四区 | 天堂а√在线地址中文在线 | 精品视频免费在线观看 | 亚洲精品xxxx | 狠狠躁天天躁夜夜躁婷婷 | 国产精品videossex国产高清 | 精品一区二区久久久久久久网站 | 国产亚洲精品久久久优势 | 国产一级特黄,真人毛片 | 国产乱弄免费视频 | 亚洲免费视频一区二区三区 | 久久偷偷 | 成人做爰免费视频免费看 | 亚洲一区二区三区写真 | 国产一区二区精彩视频 | 四虎影视亚洲精品一区二区 | 国产亚洲日韩一区二区三区 | 国产天堂| www.视频一区 | 浪潮av激情高潮国产精品 | 天天5g天天爽免费观看 | 在线国产一区二区三区 | 日本中文字幕网 | 蜜臀久久99精品久久一区二区 | 亚洲视频中文字幕 | 亚洲国产一线二线三线 | 欧美人与zoxxxx另类 | 人人妻人人澡人人爽秒播 | 国产日韩在线观看一区 | 日本亚洲欧洲色α | 可以看片的网站色 | 精品国产18久久久久久依依影院 | 免费成人小视频 | 日本少妇做爰大尺裸体视频 | 亚洲成人毛片 | 美丽姑娘免费观看在线观看 | 日日碰狠狠躁久久躁96avv | 精品国产色 | 综合色区亚洲熟妇另类 | 自拍偷自拍亚洲精品情侣 | 国产精品日本一区二区不卡视频 | 污动漫网站 | 中文字幕第一区 | 亚洲欧洲精品成人久久奇米网 | 久久午夜夜伦鲁鲁片不卡 | 四虎4hu永久免费 | 天堂在线日本 | 日本黄网站 | 99久久精品免费 | 精品久久国产老人久久综合 | 日产国产欧美视频一区精品 | 久久视频一区 | 色一情一区二 | 欧美午夜精品久久久久免费视 | 国产码视频 | 亚洲色av性色在线观无码 | 亚洲日韩一页精品发布 | 欧美成人一区二免费视频软件 | 日韩欧美国产中文字幕 | 在线观看免费黄色av | 少妇做爰免费视看片 | 欧美另类激情 | 成人性生交大片免费看 | 成人自拍视频在线 | 99热久久是国产免费66 | a级黄色片网站 | 亚洲www| 人妻少妇精品无码专区二区 | 日美韩一区二区三区 | 国产又黄又爽又刺激的免费网址 | 免费观看国产精品 | 激情宗合网 | 装睡被陌生人摸出水好爽 | 毛葺葺老太做受视频 | 成人夜色视频 | 麻豆免费在线视频 | 亚洲国产精品无码一线岛国 | 午夜影院h | 国产亚洲黄色片 | 亚洲区小说区激情区图片区 | 四虎影视免费永久在线 | 大陆国语对白国产av片 | 国产色在线 | 国产 狠狠色噜噜狠狠狠狠7777米奇 | 欧美午夜性春猛交xxxx按摩师 | 香蕉久久人人爽人人爽人人片av | 久久999精品久久久有什么优势 | 欧美日韩中文国产一区发布 | 北条麻妃久久 | 亚洲色欲在线播放一区二区三区 | 国产成人综合在线女婷五月99播放 | 在线播放黄色av | 色综合综合色 | 欧美日韩在线观看视频 | 精品免费 | 国产 浪潮av性色四虎 | 国产精品密蕾丝袜 | 成人欧美日韩一区二区三区 | 精品久久久久久久久久久久久久久久久 | 无码精品人妻一区二区三区免费看 | 男人天堂综合网 | 欧美在线性视频 | 精品国产91久久久久久浪潮蜜月 | 99精品偷拍视频一区二区三区 | 乱码av午夜噜噜噜噜动漫 | 日韩精品一区二区免费视频 | 欧美经典一区二区三区 | 日韩欧美成人网 | 伊人色婷婷 | 影视av久久久噜噜噜噜噜三级 | 女人精69xxxxxx免费 | 欧美日韩成人一区 | 日本欧美精91品成人久久久 | 国产精品vⅰdeoxxxx国产 | 黄色av地址 | 国产免费一级 | 日本国产精品 | 一女被多男玩喷潮视频 | 国产一级淫片a级aaa | 先锋影音人妻啪啪va资源网站 | 五月婷婷深深爱 | 亚洲精品国产综合99久久夜夜嗨 | 少妇av| 欧美老女人性生活视频 | 欧美视频黄色 | 大地资源网中文第五页 | 水蜜桃亚洲一二三四在线 | 少妇性做爰xxxⅹ性视频 | 精品免费二区三区三区高中清不卡 | 久久成熟| 99久久无色码中文字幕婷婷 | 天天射中文 | 亚洲精品久久久久久国产精华液 | 成人在线激情视频 | 亚洲精品视频久久久 | 国产高清自拍av | aaa日本裸体 | 一级片麻豆| 国产成人综合一区二区三区 | 久久亚洲精华国产精华液 | 日本一区午夜艳熟免费 | 国产丝袜无码一区二区三区视频 | 亚洲乱码国产一区三区 | 丰满少妇弄高潮了www | 日本少妇裸体做爰高潮片 | 亚洲日韩乱码一区二区三区四区 | 丁香综合激情 | 伊人色综合久久天天人手人婷 | 韩国三级 女的和老头做 | 精品国产一区二区三区四区阿崩 | 人少妇精品123在线观看 | 在线观看免费av网 | 成人欧美一区二区三区黑人麻豆 | 潘金莲性生交大片免费看图片 | 蜜臀av一区二区 | 黄色av免费网址 | 水蜜桃久久夜色精品一区怎么玩 | 91精品国产综合久久久久影院不卡 | 一二三四在线视频观看社区 | 8mav在线 | 国产成人精品亚洲午夜麻豆 | 黄色大片免费看 | 日本xxxwww在线观看 | 国产污污视频 | 成人私密视频 | 狠狠插综合网 | 91丨九色丨蝌蚪丨老版 | 亚洲a毛片 | 亚洲 欧美 国产 制服 动漫 | 怡红院成人在线 | 岛国精品资源网站 | 黄色片免费网站 | www.xxx国产| 国产激情免费视频在线观看 | 男女激情啪啪18 | 国产高潮好爽受不了了夜色 | 精品在线观看免费 | 少妇精品无码一区二区免费视频 | 本道久久综合无码中文字幕 | 91精选视频| 免费一级a毛片夜夜看 | 哪里可以看毛片 | 亚洲一区动漫 | 玖玖精品在线视频 | 国产一区视频在线观看免费 | 亚洲伊人色综合网站小说 | 国产精品一线天 | hd日本xxxx| 9l视频自拍九色9l视频大全 | 成人免费毛片嘿嘿连载视频 | 久久久青草婷婷精品综合日韩 | 人人草网 | 欧美一区2区 | 在线日韩精品视频 | 乌克兰少妇xxxx做受野外 | 青青草免费视频在线观 | 超碰人人爱人人 | 老司机精品视频一区二区三区 | 国产九色porny| 深夜爽爽福利 | 都市激情亚洲综合 | 欧美xxxⅹ性欧美大片 | 成长快手短视频在线观看 | 亚洲同性同志一二三专区 | 性欧美1819性猛交 | 免费在线精品视频 | 51视频国产精品一区二区 | 久久中文免费视频 | 都市激情 在线 亚洲 国产 | 国产精品一品二区三区四区五区 | 欧美视频在线免费 | 国产中年夫妇交换高潮呻吟 | 高h喷水荡肉爽腐调教 | 偷拍亚洲| 国产喷水在线 | 美女国内精品自产拍在线播放 | 亚洲一区和二区 | 911色| 西西人体44www大胆无码 | 亚洲一区国产精品 | 国产伦精品一区二区三区视频黑人 | 久久综合国产伦精品免费 | 色婷婷综合激情综在线播放 | 久久草在线视频 | 91麻豆产精品久久久久久 | 日韩欧美视频在线 | 绫濑遥av| 国产91对白在线播放丿 | 国产精品99久久久久久大便 | 欧美性欧美巨大黑白大战 | 久久国产欧美日韩精品图片 | 成人综合激情网 | 伊人久久青青草 | 张柏芝hd一区二区 | 最新精品国偷自产在线下载 | 天天综合一区 | 96久久久| 丁香色欲久久久久久综合网 | 亚洲激情视频在线播放 | 在线a毛片| 亚洲成人中文字幕在线 | 欧美中文| 日本无遮挡真人祼交视频 | 中文字幕在线观看你懂的 | 成年人晚上看的视频 | 公车乳尖揉捏酥软呻吟 | 欧美色图国产精品 | 97久久精品人人澡人人爽 | 香蕉毛片 | 亚洲 欧美 激情 另类 校园 | 男人猛吃奶女人爽视频 | 日韩a视频 | 日韩欧美日本 | 无码精品a∨在线观看中文 亚洲熟妇自偷自拍另欧美 无码少妇a片一区二区三区 | 搡女人真爽免费午夜网站 | 亚洲中文字幕精品久久 | 狠狠色依依成人婷婷九月 | 韩国三级一区 | 99热6这里只有精品 99热99re6国产在线播放 | 黄色三级片毛片 | 亚洲综合免费视频 | 欧美一区二区三区 | 国产真实乱偷精品视频 | 宅男666在线永久免费观看 | 男人一边吃奶一边做爰网站 | 免费观看午夜视频 | 欧美日韩成人 | 日女人毛片 | 人人草人| 色一情一乱一伦 | 国产精品刺激对白麻豆99 | 人人艹人人爽 | 午夜美女久久久久爽久久 | 自拍偷自拍亚洲精品被多人伦好爽 | 亚洲精品乱码久久久久久不卡 | 欧美亚洲天堂网 | 欧美日本国产一区 | 久久综合一区二区 | 少妇交换浪荡h肉辣文视频 少妇交换做爰中文字幕 | 国产精品无码久久久久成人影院 | 国产特级毛片潘金莲 | 性感美女一区 | 日本真人做爰免费视频120秒 | 国产午夜网站 | 九九热精品视频在线观看 | 伊人成年网 | 欧美熟妇xxxxx欧美老妇不卡 | 黄色自拍网站 | 欧洲av在线 | 久久九九国产视频 | 中文字幕 亚洲一区 | 久久激情五月丁香伊人 | 欧美精品aa | 无码国产精品一区二区免费3p | 午夜第一页 | 亚洲色成人www永久在线观看 | 婷婷国产天堂久久综合五月 | 亚洲精品在线视频免费观看 | 成人日韩在线观看 | 日韩综合夜夜香内射 | 胸大美女又黄的网站 | 强行糟蹋人妻hd中文 | 国产成人在线播放视频 | 中文字幕丝袜一区二区 | 国产成人欧美 | 在线a亚洲视频播放在线观看 | 国产 一二三四五六 | 午夜视频免费在线 | 7777精品伊人久久久大香线蕉 | 少妇特黄a片一区二区三区 精品香蕉一区二区三区 | 偷拍亚洲综合20p | 激情av小说| 午夜网站在线观看 | 羞羞影院午夜男女爽爽 | 在线毛片观看 | 在线观看国产精品视频 | 古装清宫性艳史 | 成人三及片 | 亚洲一区二区不卡视频 | 青青草成人免费在线视频 | 成人影视在线播放 | 亚洲精品久久区二区三区蜜桃臀 | 亚洲精品综合在线 | 粉嫩粉嫩的虎白女18在线软件 | 亚洲 激情 小说 另类 欧美 | 亚洲综合p| 夫の部长が调教中文字幕 | 国产日韩精品一区二区三区在线 | 黄色一级淫片 | 一本之道综合在线 | 国产日韩欧美激情 | 性按摩xxxx在线观看 | 久久国语露脸国产精品电影 | 欧美精品videosex性欧美 | 亚洲色大成网站www 亚洲色大成网站www久久九九 | 精品国产免费一区二区三区香蕉 | 免费黄网在线观看 | 激情六月综合 | 一区二区三区国产视频 | 性视频网站免费 | 玖玖精品视频 | 91爱啪啪| 久久777| 午夜视频一区二区 | 一二三四观看视频社区在线 | 交专区videossex | 在线视频 91| 日韩成人毛片在线 | 国产免费一区二区三区 | 亲嘴扒胸摸屁股激烈网站 | 成年人色片 | www.青青草.com | 久久影院午夜理论片无码 | h片在线观看视频 | 日本特黄特色a大片免费高清观看视频 | 一级黄色网 | 免费三级网 | 日本护士xxxxhd少妇 | 日韩一级中文字幕 | 妞干网这里只有精品 | 免费人成在线观看 | 三级五月天 | 四虎永久免费地址 | 青青草原在线免费 | 欧美日韩一区二区三区精品 | 97人人超碰国产精品最新 | 嫩草av久久伊人妇女超级a | 亚洲精品综合一区二区三区在线 | 强制中出し~大桥未久10在线播放 | 91理论片午午伦夜理片久久 | 国内最真实的xxxx人伦 | 伊人国 | 欧美日韩1区 | 久久久老熟女一区二区三区 | 91激情在线视频 | 国产精品无码永久免费888 | 四面虎影最新播放网址 | 久久黄色一级视频 | 亚洲精品66 | 无遮挡粉嫩小泬久久久久久久 | 一区二区在线免费观看视频 | 国产福利一区在线观看 | 日本免费在线观看视频 | 日啪|

    電子發燒友

    中國電子工程師最喜歡的網站

    • 2931785位工程師會員交流學習
    • 獲取您個性化的科技前沿技術信息
    • 參加活動獲取豐厚的禮品