国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

體驗中國自主知識產權天元深度學習引擎與TensorFlow,PyTorch的對比

原創
人工智能 深度學習
深度學習驅動之下最早創業的中國AI獨角獸曠視,宣布開源自研深度學習框架MegEngine(Brain++核心組件之一),中文名天元——取自圍棋棋盤中心點的名稱。

【51CTO.com原創稿件】深度學習驅動之下很早創業的中國AI獨角獸曠視,宣布開源自研深度學習框架MegEngine(Brain++核心組件之一),中文名天元——取自圍棋棋盤中心點的名稱。

[[320459]]

今天就來帶大家體驗一下天元深度學習框架,安裝天元深度學習引擎需要Linux,目前天元只支持Linux,對于熟悉Windows的人員還不夠友好。需要在Windows的sublinux中安裝。除非安裝雙系統,Linux裸機,否則可能支持不了GPU深度學習加速。這一點還不夠足夠方便。但是國產的初創引擎可以理解,后面一定會改進的。

pip3 install megengine -f https://megengine.org.cn/whl/mge.html

這樣就可以直接安裝。

手寫識別數據集的官網在這里,主要是手寫識別的系列數據集。http://yann.lecun.com/exdb/mnist/index.html,我們可以從這里下載數據集。

MNIST數據集中的圖片是28*28的,每張圖被轉化為一個行向量,長度是28*28=784,每一個值代表一個像素點。數據集中共有60000張手寫數據圖片,其中55000張訓練數據,5000張測試數據。

在MNIST中,mnist.train.images是一個形狀為[55000, 784]的張量,其中的第一個維度是用來索引圖片,第二個維度是圖片中的像素。MNIST數據集包含有三部分,訓練數據集,驗證數據集,測試數據集(mnist.validation)。

標簽是介于0-9之間的數字,用于描述圖片中的數字,轉化為one-hot向量即表示的數字對應的下標為1,其余的值為0。標簽的訓練數據是[55000,10]的數字矩陣。

今天就來拿MNIST來做一個測試。

這是天元進行深度學習進行手寫識別。今天就來測試一下深度學習的GPU場景下訓練速度。

GPU用英偉達顯卡1080ti。對比一下三大框架的訓練速度,代碼實現敏捷度。

下列是天元引擎代碼。

  1. from megengine.data.dataset import MNIST  #導入數據集 
  2. train_dataset = MNIST(root="./dataset/MNIST", train=True, download=True
  3. test_dataset = MNIST(root="./dataset/MNIST", train=False, download=False
  4. import megengine.module as M 
  5. import megengine.functional as F 
  6.  
  7. class Net(M.Module): 
  8.     def __init__(self): 
  9.         super().__init__() 
  10.         self.conv0 = M.Conv2d(1, 20, kernel_size=5, bias=False
  11.         self.bn0 = M.BatchNorm2d(20) 
  12.         self.relu0 = M.ReLU() 
  13.         self.pool0 = M.MaxPool2d(2) 
  14.         self.conv1 = M.Conv2d(20, 20, kernel_size=5, bias=False
  15.         self.bn1 = M.BatchNorm2d(20) 
  16.         self.relu1 = M.ReLU() 
  17.         self.pool1 = M.MaxPool2d(2) 
  18.         self.fc0 = M.Linear(500, 64, bias=True
  19.         self.relu2 = M.ReLU() 
  20.         self.fc1 = M.Linear(64, 10, bias=True
  21.  
  22.     def forward(self, x): 
  23.         x = self.conv0(x) 
  24.         x = self.bn0(x) 
  25.         x = self.relu0(x) 
  26.         x = self.pool0(x) 
  27.         x = self.conv1(x) 
  28.         x = self.bn1(x) 
  29.         x = self.relu1(x) 
  30.         x = self.pool1(x) 
  31.         x = F.flatten(x, 1) 
  32.         x = self.fc0(x) 
  33.         x = self.relu2(x) 
  34.         x = self.fc1(x) 
  35.         return x 
  36. from megengine.jit import trace 
  37.  
  38.  
  39. @trace(symbolic=True
  40. def train_func(data, label, *, opt, net): 
  41.     net.train() 
  42.     pred = net(data) 
  43.     loss = F.cross_entropy_with_softmax(pred, label) 
  44.     opt.backward(loss) 
  45.     return pred, loss 
  46.  
  47.  
  48. @trace(symbolic=True
  49. def eval_func(data, label, *, net): 
  50.     net.eval() 
  51.     pred = net(data) 
  52.     loss = F.cross_entropy_with_softmax(pred, label) 
  53.     return pred, loss 
  54. import time 
  55. import numpy as np 
  56.  
  57. import megengine as mge 
  58. from megengine.optimizer import SGD 
  59. from megengine.data import DataLoader 
  60. from megengine.data.transform import ToMode, Pad, Normalize, Compose 
  61. from megengine.data.sampler import RandomSampler 
  62.  
  63.  
  64. # 讀取訓練數據并進行預處理 
  65. dataloader = DataLoader( 
  66.     train_dataset, 
  67.     transform=Compose([ 
  68.         Normalize(mean=0.1307*255, std=0.3081*255), 
  69.         Pad(2), 
  70.         ToMode('CHW'), 
  71.     ]), 
  72.     sampler=RandomSampler(dataset=train_dataset, batch_size=64),
  73.  # 訓練時一般使用RandomSampler來打亂數據順序 
  74.  
  75. # 實例化網絡 
  76. net = Net() 
  77.  
  78. # SGD優化方法,學習率lr=0.01,動量momentum=0.9 
  79. optimizer = SGD(net.parameters(), lr=0.01, momentum=0.9, weight_decay=5e-4) 
  80.  
  81. total_epochs = 10 # 共運行10個epoch 
  82. for epoch in range(total_epochs): 
  83.     total_loss = 0 
  84.     for step, (batch_data, batch_label) in enumerate(dataloader): 
  85.         batch_label = batch_label.astype(np.int32) 
  86.         optimizer.zero_grad() # 將參數的梯度置零 
  87.         pred, loss = train_func(batch_data, batch_label, opt=optimizer, net=net) 
  88.         optimizer.step()  # 根據梯度更新參數值 
  89.         total_loss += loss.numpy().item() 
  90.     print("epoch: {}, loss {}".format(epoch, total_loss/len(dataloader))) 
  91. mge.save(net.state_dict(), 'mnist_net.mge'
  92. net = Net() 
  93. state_dict = mge.load('mnist_net.mge'
  94. net.load_state_dict(state_dict) 
  95. from megengine.data.sampler import SequentialSampler 
  96.  
  97. # 測試數據 
  98. test_sampler = SequentialSampler(test_dataset, batch_size=500) 
  99. dataloader_test = DataLoader( 
  100.     test_dataset, 
  101.     sampler=test_sampler, 
  102.     transform=Compose([ 
  103.         Normalize(mean=0.1307*255, std=0.3081*255), 
  104.         Pad(2), 
  105.         ToMode('CHW'), 
  106.     ]), 
  107.  
  108. correct = 0 
  109. total = 0 
  110. for idx, (batch_data, batch_label) in enumerate(dataloader_test): 
  111.     batch_label = batch_label.astype(np.int32) 
  112.     pred, loss = eval_func(batch_data, batch_label, net=net) 
  113.     predicted = F.argmax(pred, axis=1) 
  114.     correct += (predicted == batch_label).sum().numpy().item() 
  115.     total += batch_label.shape[0] 
  116. print("correct: {}, total: {}, accuracy: {}".format(correct, total, float(correct) / total)) 

這是TensorFlow版本。

  1. import tensorflow as tf 
  2. import numpy as np 
  3. from tensorflow.examples.tutorials.mnist import input_data 
  4. import matplotlib.pyplot as plt 
  5. mnist = input_data.read_data_sets('MNIST_data', one_hot=True
  6. tf.reset_default_graph() 
  7. x = tf.placeholder(tf.float32, [None, 784]) 
  8. y = tf.placeholder(tf.float32, [None, 10]) 
  9. w = tf.Variable(tf.random_normal([784, 10])) 
  10. b = tf.Variable(tf.zeros([10])) 
  11. pred = tf.matmul(x, w) + b 
  12. pred = tf.nn.softmax(pred) 
  13. cost = tf.reduce_mean(-tf.reduce_sum(y * tf.log(pred), reduction_indices=1)) 
  14. learning_rate = 0.01 
  15. optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost) 
  16. training_epochs = 25 
  17. batch_size = 100 
  18. display_step = 1 
  19. save_path = 'model/' 
  20. saver = tf.train.Saver() 
  21. with tf.Session() as sess: 
  22.     sess.run(tf.global_variables_initializer()) 
  23.     for epoch in range(training_epochs): 
  24.         avg_cost = 0 
  25.         total_batch = int(mnist.train.num_examples/batch_size) 
  26.         for i in range(total_batch): 
  27.             batch_xs, batch_ys = mnist.train.next_batch(batch_size) 
  28.             _, c = sess.run([optimizer, cost], feed_dict={x:batch_xs, y:batch_ys}) 
  29.             avg_cost += c / total_batch 
  30.  
  31.         if (epoch + 1) % display_step == 0: 
  32.             print('epoch= ', epoch+1, ' cost= ', avg_cost) 
  33.     print('finished'
  34.     correct_prediction = tf.equal(tf.argmax(pred, 1), tf.argmax(y, 1)) 
  35.     accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) 
  36.     print('accuracy: ', accuracy.eval({x:mnist.test.images, y:mnist.test.labels})) 
  37.     save = saver.save(sess, save_path=save_path+'mnist.cpkt'
  38. print(" starting 2nd session ...... "
  39. with tf.Session() as sess: 
  40.     sess.run(tf.global_variables_initializer()) 
  41.     saver.restore(sess, save_path=save_path+'mnist.cpkt'
  42.     correct_prediction = tf.equal(tf.argmax(pred, 1), tf.argmax(y, 1)) 
  43.     accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) 
  44.     print('accuracy: ', accuracy.eval({x: mnist.test.images, y: mnist.test.labels})) 
  45.     output = tf.argmax(pred, 1) 
  46.     batch_xs, batch_ys = mnist.test.next_batch(2) 
  47.     outputval= sess.run([output], feed_dict={x:batch_xs, y:batch_ys}) 
  48.     print(outputval) 
  49.     im = batch_xs[0] 
  50.     im = im.reshape(-1, 28) 
  51.     plt.imshow(im, cmap='gray'
  52.     plt.show() 
  53.     im = batch_xs[1] 
  54.     im = im.reshape(-1, 28) 
  55.     plt.imshow(im, cmap='gray'
  56.     plt.show() 

這是PyTorch版本。

  1. import torch 
  2. import torch.nn as nn 
  3. import torch.nn.functional as F 
  4. import torch.optim as optim 
  5. from torchvision import datasets, transforms 
  6. from torch.autograd import Variable 
  7. batch_size = 64 
  8. train_dataset = datasets.MNIST(root='./data/'
  9.                                train=True
  10.                                transform=transforms.ToTensor(), 
  11.                                download=True
  12.  
  13. test_dataset = datasets.MNIST(root='./data/'
  14.                               train=False
  15.                               transform=transforms.ToTensor()) 
  16.  
  17. # Data Loader (Input Pipeline) 
  18. train_loader = torch.utils.data.DataLoader(dataset=train_dataset, 
  19.                                            batch_size=batch_size, 
  20.                                            shuffle=True
  21.  
  22. test_loader = torch.utils.data.DataLoader(dataset=test_dataset, 
  23.                                           batch_size=batch_size, 
  24.                                           shuffle=False
  25. class Net(nn.Module): 
  26.     def __init__(self): 
  27.         super(Net, self).__init__() 
  28.         # 輸入1通道,輸出10通道,kernel 5*5 
  29.         self.conv1 = nn.Conv2d(in_channels=1, out_channels=10, kernel_size=5) 
  30.         self.conv2 = nn.Conv2d(10, 20, 5) 
  31.         self.conv3 = nn.Conv2d(20, 40, 3) 
  32.  
  33.         self.mp = nn.MaxPool2d(2) 
  34.         # fully connect 
  35.         self.fc = nn.Linear(40, 10)#(in_features, out_features) 
  36.     def forward(self, x): 
  37.         # in_size = 64 
  38.         in_size = x.size(0) # one batch     此時的x是包含batchsize維度為4的tensor,
  39. 即(batchsize,channels,x,y),x.size(0)指batchsize的值    
  40. 把batchsize的值作為網絡的in_size 
  41.         # x: 64*1*28*28 
  42.         x = F.relu(self.mp(self.conv1(x))) 
  43.         # x: 64*10*12*12  feature map =[(28-4)/2]^2=12*12 
  44.         x = F.relu(self.mp(self.conv2(x))) 
  45.         # x: 64*20*4*4 
  46.         x = F.relu(self.mp(self.conv3(x))) 
  47.  
  48.         x = x.view(in_size, -1) # flatten the tensor 相當于resharp 
  49.         # print(x.size()) 
  50.         # x: 64*320 
  51.         x = self.fc(x) 
  52.         # x:64*10 
  53.         # print(x.size()) 
  54.         return F.log_softmax(x)  #64*10 
  55. model = Net() 
  56. optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.5) 
  57. def train(epoch): 
  58.     for batch_idx, (data, target) in enumerate(train_loader):
  59. #batch_idx是enumerate()函數自帶的索引,從0開始 
  60.         # data.size():[64, 1, 28, 28] 
  61.         # target.size():[64] 
  62.         output = model(data) 
  63.         #output:64*10 
  64.         loss = F.nll_loss(output, target) 
  65.         if batch_idx % 200 == 0: 
  66.             print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format( 
  67.                 epoch, batch_idx * len(data), len(train_loader.dataset), 
  68.                 100. * batch_idx / len(train_loader), loss.data[0])) 
  69.         optimizer.zero_grad()   # 所有參數的梯度清零 
  70.         loss.backward()         #即反向傳播求梯度 
  71.         optimizer.step()        #調用optimizer進行梯度下降更新參數 
  72. def test(): 
  73.     test_loss = 0 
  74.     correct = 0 
  75.     for data, target in test_loader: 
  76.         data, target = Variable(data, volatile=True), Variable(target) 
  77.         output = model(data) 
  78.         # sum up batch loss 
  79.         test_loss += F.nll_loss(output, target, size_average=False).data[0] 
  80.         # get the index of the max log-probability 
  81.         pred = output.data.max(1, keepdim=True)[1] 
  82.         print(pred) 
  83.         correct += pred.eq(target.data.view_as(pred)).cpu().sum() 
  84.     test_loss /= len(test_loader.dataset) 
  85.     print('\nTest set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)\n'.format( 
  86.         test_loss, correct, len(test_loader.dataset), 
  87.         100. * correct / len(test_loader.dataset))) 
  88. for epoch in range(1, 10): 
  89.     train(epoch) 
  90.     test() 

測試時間,在1080ti,Ubuntu 18.04的系統下,訓練時間如下。

MegEngine 45.3429

TensorFlow 87.3634

PyTorch 68.8535

弄完代碼測試完了以后,對于天元深度學習框架與TensorFlow與PyTorch進行了一下小節。

1.易用性

易用性上,MegEngine與PyTorch最為簡潔,代碼比TensorFlow要簡潔優化的多,并且無縫兼容PyTorch。TensorFlow較為復雜,學習難度較大。如果要快速上手,用MegEngine也不錯。

TensorFlow是比較不友好的,與Python等語言差距很大,有點像基于一種語言重新定義了一種編程語言,并且在調試的時候比較復雜。每次版本的更新,TensorFlow的各種接口經常會有很大幅度的改變,這也大大增加了對其的學習時間。

PyTorch支持動態計算圖,追求盡量少的封裝,代碼簡潔易讀,應用十分靈活,接口沿用Torch,具有很強的易用性,同時可以很好的利用主語言Python的各種優勢。

對于文檔的詳細程度,TensorFlow具備十分詳盡的官方文檔,查找起來十分方便,同時保持很快的更新速度,但是條理不是很清晰,教程眾多。MegEngine與PyTorch相對而言,條理清晰。PyTorch案例豐富度略多,MegEngine還在建設,相信將來一定會很多。整體而言,易用性上MegEngine與PyTorch差不多。TensorFlow的易用性最差。 MegEngine可以無縫借用PyTorch的所有案例,這一點兼容性上做的非常贊。

2.速度

曠世對寫出的天元深度學習框架做了許多優化,在我的顯卡1080ti的狀態MegEngine >PyTorch>TensorFlow。就單機訓練速度而言,MegEngine速度相當快,并且用的內存最小。據說MegEngine采用靜態內存分配,做到了極致的內存優化。這一點上來說是相當難得的。

3.算子數量

這一點TensorFlow無疑是最大的贏家,提供的Python API達到8000多個(參見https://tensorflow.google.cn/api_docs/python),基本上不存在用戶找不到的算子,所有的算法都可以用TensorFlow算子拼出來。不過API過多也是個負擔,又是low level又是high level,容易把用戶整暈。PyTorch的算子其次,優化較TensorFlow較多。天元深度學習框架算子數量目前最少,但是優化較好,算子質量較高。其中任意圖在訓練MNIST上就有很大幫助。目前TensorFlow與PyTorch都不支持。

4.開源模型數據集案例

目前TensorFlow>PyTorch>MegEngine,這一塊TensorFlow時間最久,案例最多,PyTorch其次,MegEngine最少。

5.開源社區

目前MegEngine的開源社區最小,不過也在籌備組建中,盡早加入也能成為類似PyTorch,TensorFlow社區的大牛。如果招聘天元深度學習框架的人越多,可能促進學習的人越多。目前國產還在起步路上,但是非常看好天元的深度學習框架的未來。

6.靈活性

TensorFlow主要支持靜態計算圖的形式,計算圖的結構比較直觀,但是在調試過程中十分復雜與麻煩,一些錯誤更加難以發現。但是在2017年底發布了動態圖機制Eager Execution,加入對于動態計算圖的支持,但是目前依舊采用原有的靜態計算圖形式為主。TensorFlow擁有TensorBoard應用,可以監控運行過程,可視化計算圖。

PyTorch為動態計算圖的典型代表,便于調試,并且高度模塊化,搭建模型十分方便,同時具備極其優秀的GPU支持,數據參數在CPU與GPU之間遷移十分靈活。MegEngine無縫兼容PyTorch,并且具備動態圖這樣的優點,在分布式部署,模型推斷上有較大優勢。MegEngine的靈活性相比TensorFlow有較大優勢。

以表格的形式對比如下: 

注:分數越高越好

總結下MegEngine 有下列優點。

  1. 上手簡單
  2. 兼容PyTorch
  3. 支持靜態圖/動態圖兩種機制
  4. 中文教程詳細
  5. 中文社區,有利于英文不好的童鞋。

也有一些不足有待改進。

  1. 支持 Windows/Mac及其他 Linux發行版。目前只支持 Ubuntu 16.04 及以上,這個確實有點少。而且應該還不支持 Docker等安裝方式。
  2. 更多的案例庫與模型庫。
  3. 盡量早日進駐各大高校,有教材與教程,建立中國自己的AI人才梯隊。

希望MegEngine為中國的人工智能產業做出自己的貢獻,打造中國智造的人工智能深度學習引擎,為中華民族崛起貢獻自己的光輝力量,我們也可以好好用用國產深度學習引擎,打造我們偉大的祖國成為AI強國。

作者介紹:

尹成,清華碩士,微軟人工智能領域全球最有價值專家,精通C/C++,Python,Go,TensorFlow,擁有15年編程經驗與5年的教學經驗,資深軟件架構師,Intel軟件技術專家 ,具備深厚的項目管理經驗以及研發經驗,擁有兩項人工智能發明專利。

51CTO的世界五百強算法課

https://edu.51cto.com/sd/0a881

【51CTO原創稿件,合作站點轉載請注明原文作者和出處為51CTO.com】

 

責任編輯:華軒 來源: 51CTO
相關推薦

2019-05-17 14:24:09

物聯網云計算技術

2011-03-29 11:01:34

2010-04-26 09:50:02

2013-10-22 11:33:29

華云用友云計算

2009-04-23 16:08:07

RSA互聯網控制管理

2023-07-14 11:32:39

2021-02-02 10:40:10

區塊鏈版權保護技術

2015-10-13 15:54:09

2013-01-08 10:41:01

殺毒軟件國產國外

2023-12-21 14:27:36

2020-04-09 14:26:29

曙光

2021-08-31 15:48:28

深度學習模型人工智能

2020-09-17 10:25:36

計算機系統 技術

2021-02-24 15:50:45

系統運維識別

2009-05-05 14:15:22

Soul存儲虛擬化

2011-05-13 10:51:11

曙光刀片服務器云計算

2016-05-11 10:19:48

IT168

2018-04-11 17:50:14

深度學習PyTorchTensorFlow

2010-05-10 10:29:58

SMP結構龍芯刀片
點贊
收藏

51CTO技術棧公眾號

国产一区二区不卡在线| 人人干人人视频| 国产精品91xxx| 成人女性文胸| 日本乱码高清不卡字幕| 国产精品美女午夜爽爽| 成人黄色av播放免费| 国产一区二区导航在线播放| 在线观看污网站| 正在播放亚洲1区| 欧美精品不卡| 黄色永久免费网站| 亚洲第一色在线| 欧美日韩在线观看视频小说| 国产午夜精品视频一区二区三区| 一区二区三区四区五区视频在线观看 | 国产又色又爽又黄刺激在线视频| 欧美精品videossex性护士| 亚洲精品美女| 成人免费在线观看网站| 国产亚洲精品久久久| 一区免费在线| 男人天堂v视频| 久久在线免费视频| 秋霞午夜av一区二区三区| xxav视频| 久久激情视频免费观看| 麻豆精品91| 2222www色视频在线观看| 日韩视频免费观看高清完整版| 激情综合中文娱乐网| 妞干网在线观看视频| 亚洲欧洲韩国日本视频| 久久成年人免费电影| 欧美亚洲三区| 日韩欧美电影在线观看| 97在线观看视频国产| 国产精品亚洲成人| av在线看片| 豆国产97在线| 欧美日韩在线影院| 精品福利久久久| 男操女免费网站| 伊人伊人伊人久久| 一区二区三区高清在线观看| 亚洲女同志freevdieo| 狠狠爱免费视频| 97天天综合网| 国产精品免费一区二区三区| 夜夜亚洲天天久久| 日韩精品一区二区三区中文| 午夜在线视频免费观看| 欧美一级久久久久久久大片| 中文字幕日韩一区二区不卡| 濑亚美莉一二区在线视频| 欧美高清激情视频| 久久综合av免费| 韩国精品视频在线观看 | 蜜乳av另类精品一区二区| 国产一级二级三级在线观看| 7777奇米亚洲综合久久| 色88888久久久久久影院野外| 99久久夜色精品国产亚洲狼| 超碰在线中文| 成人久久一区二区三区| 欧美午夜宅男影院在线观看| 欧美一区91| 一区二区三区视频在线观看视频| 99视频网站| 欧美日韩高清一区二区三区| 99精品国产在热久久婷婷| 精品国产99久久久久久| 日本一区二区三区免费看 | 久久超级碰碰| 好吊妞这里只有精品| 国产精品第8页| 欧美午夜性色大片在线观看| 日韩午夜一区| 嗯~啊~轻一点视频日本在线观看| 亚洲视频欧美在线| 视频直播国产精品| 国产偷国产偷精品高清尤物| 亚洲+变态+欧美+另类+精品| 最新天堂资源在线| 久久国产精品久久精品国产| 亚洲精品在线三区| eeuss国产一区二区三区 | 国产99久久久国产精品潘金| 四虎地址8848精品| 免费欧美一级视频| 欧美在线观看日本一区| 亚洲一二三区在线观看| 黄色精品免费| av电影院在线看| 亚洲中文字幕无码专区| 欧洲成人在线视频| 欧美日韩一区二区电影| 国产精品18久久久久久久久久久久 | 在线网址91| 欧美调教在线| 中文字幕在线三区| 一二三区在线视频| 女人天堂亚洲aⅴ在线观看| 免费a在线观看| 日韩欧美精品久久| 最近2019年手机中文字幕| 国产精品10p综合二区| 日韩精品国内| 日韩av色综合| 国产精品视频一区国模私拍| 欧美激情综合色| 国产精品普通话| 欧美激情在线一区二区三区| 国产中文字幕一区二区三区| 米奇777四色精品人人爽| 国产日韩第一页| 人人澡人人澡人人看欧美| 7799精品视频| 国产亚洲一本大道中文在线| 欧美日韩三级| 麻豆精品一区| 91精彩视频在线观看| 国产v亚洲v天堂无码久久久| 国产精品久久7| 久久久电影免费观看完整版| 日韩欧美在线看| proumb性欧美在线观看| 欧美一区国产在线| 国产亚洲亚洲国产一二区| 中文字幕日本在线| 在线黄色免费观看| 日韩欧美一区二区三区四区五区 | 亚洲五月综合| 日本不卡1234视频| 啊灬啊灬啊灬啊灬高潮在线看| 成人在线免费观看网址| 国产精品私拍pans大尺度在线| 亚洲欧美三级伦理| 日韩欧美成人网| 国产女主播一区| 蜜桃av一区二区在线观看| 欧美视频免费| 国产一区二区视频在线看| caopeng在线| 中文在线播放| xxxx一级片| 欧美少妇一级片| av一区二区三区免费| 久久露脸国产精品| 亚洲毛片在线看| 欧美在线观看视频一区二区三区| av资源站一区| 人人精品人人爱| 欧美三级不卡| 免费黄色成人| 成人午夜大片| 欧美一级做a| 99久久精品免费看国产小宝寻花 | 成年人视频在线观看免费| 国产精彩免费视频| 伊人情人网综合| 极品尤物一区二区三区| 国产一区私人高清影院| 欧美激情亚洲综合一区| 色偷偷偷亚洲综合网另类 | 激情综合网五月| 久久国产精品美女| 欧美性理论片在线观看片免费| 日本黄色片在线观看| 最猛黑人系列在线播放| jizzjizzjizz亚洲| 欧美色图另类小说| 欧美中日韩在线| 亚洲欧美成人一区| 欧美久久久久久久| 国产伦精品一区二区三区高清版 | 一区二区三区成人| 国产日韩精品视频一区| 成熟亚洲日本毛茸茸凸凹| 麻豆精品一区二区三区| 久久国产88| 免播放器亚洲| 久久一区亚洲| 日本麻豆一区二区三区视频| 日韩中文字幕亚洲一区二区va在线| 亚洲午夜在线| 在线观看日韩av电影| 99av国产精品欲麻豆| 亚洲精品色图| 亚洲一区日韩| 丝袜美腿亚洲一区| 日本伊人午夜精品| 首页国产欧美久久| 免费成人在线视频观看| 狠狠色丁香婷综合久久| 国产精品一品二品| 成人av片在线观看| 国产亚洲综合性久久久影院| 亚洲欧洲av一区二区三区久久| 亚洲欧美偷拍三级|