色综合中文综合网_性猛交娇小69hd_久久精品99久久久久久_欧美日韩精品一区二区三区四区 _97视频色精品_国产高清精品久久久久_日日鲁鲁鲁夜夜爽爽狠狠视频97 _国产成人免费视频精品含羞草妖精 _熟女少妇在线视频播放_精品人妻一区二区三区麻豆91 _久久女同性恋中文字幕_一区二区福利视频

1美元訓練BERT,教你如何薅谷歌TPU羊毛|附Colab代碼

曉查 發自 凹非寺

量子位 出品 | 公眾號 QbitAI

BERT是谷歌去年推出的NLP模型,一經推出就在各項測試中碾壓競爭對手,而且BERT是開源的。只可惜訓練BERT的價格實在太高,讓人望而卻步。

之前需要用64個TPU訓練4天才能完成,后來谷歌用并行計算優化了到只需一個多小時,但是需要的TPU數量陡增,達到了驚人的1024個。

那么總共要多少錢呢?谷歌云TPU的使用價格是每個每小時6.5美元,訓練完成訓練完整個模型需要近4萬美元,簡直就是天價。

現在,有個羊毛告訴你,在培養基上有人找到了薅谷歌羊毛的辦法,只需1美元就能訓練BERT,模型還能留存在你的谷歌云盤中,留作以后使用。

準備工作

為了薅谷歌的羊毛,您需要一個Google云存儲(Google Cloud Storage)空間。按照Google云TPU快速入門指南,創建Google云平臺(Google Cloud Platform)帳戶和Google云存儲賬戶。新的谷歌云平臺用戶可獲得300美元的免費贈送金額。

在TPUv2上預訓練BERT-Base模型大約需要54小時.Google Colab并非設計用于執行長時間運行的作業,它會每8小時左右中斷一次訓練過程。對于不間斷的訓練,請考慮使用付費的不間斷使用TPUv2的方法。

也就是說,使用Colab TPU,你可以在以1美元的價格在谷云盤上存儲模型和數據,以幾乎可忽略成本從頭開始預訓練BERT模型。

以下是整個過程的代碼下面的代碼,可以在Colab Jupyter環境中運行。

設置訓練環境

首先,安裝訓練模型所需的包.Jupyter允許使用直接從筆記本執行的bash命令 ‘!’:

!pip install sentencepiece
!git clone https://github.com/google-research/bert

導入包并在谷歌云中授權:

import os
import sys
import json
import nltk
import random
import logging
import tensorflow as tf
import sentencepiece as spm
from glob import glob
from google.colab import auth, drive
from tensorflow.keras.utils import Progbar
sys.path.append("bert")
from bert import modeling, optimization, tokenization
from bert.run_pretraining import input_fn_builder, model_fn_builder
auth.authenticate_user()
# configure logging
log = logging.getLogger('tensorflow')
log.setLevel(logging.INFO)
# create formatter and add it to the handlers
formatter = logging.Formatter('%(asctime)s : %(message)s')
sh = logging.StreamHandler()
sh.setLevel(logging.INFO)
sh.setFormatter(formatter)
log.handlers = [sh]
if 'COLAB_TPU_ADDR' in os.environ:
 log.info("Using TPU runtime")
 USE_TPU = True
 TPU_ADDRESS = 'grpc://' + os.environ['COLAB_TPU_ADDR']
 with tf.Session(TPU_ADDRESS) as session:
 log.info('TPU address is ' + TPU_ADDRESS)
 # Upload credentials to TPU.
 with open('/content/adc.json', 'r') as f:
 auth_info = json.load(f)
 tf.contrib.cloud.configure_gcs(session, credentials=auth_info)
else:
 log.warning('Not connected to TPU runtime')
 USE_TPU = False

下載原始文本數據

接下來從網絡上獲取文本數據語料庫。在本次實驗中,我們使用OpenSubtitles數據集,該數據集包括65種語言。

與更常用的文本數據集(如維基百科)不同,它不需要任何復雜的預處理,提供預格式化,一行一個句子。

AVAILABLE = {'af','ar','bg','bn','br','bs','ca','cs',
 'da','de','el','en','eo','es','et','eu',
 'fa','fi','fr','gl','he','hi','hr','hu',
 'hy','id','is','it','ja','ka','kk','ko',
 'lt','lv','mk','ml','ms','nl','no','pl',
 'pt','pt_br','ro','ru','si','sk','sl','sq',
 'sr','sv','ta','te','th','tl','tr','uk',
 'ur','vi','ze_en','ze_zh','zh','zh_cn',
 'zh_en','zh_tw','zh_zh'}
LANG_CODE = "en" #@param {type:"string"}
assert LANG_CODE in AVAILABLE, "Invalid language code selected"
!wget http://opus.nlpl.eu/download.php?f=OpenSubtitles/v2016/mono/OpenSubtitles.raw.'$LANG_CODE'.gz -O dataset.txt.gz
!gzip -d dataset.txt.gz
!tail dataset.txt

你可以通過設置代碼隨意選擇你需要的語言。出于演示目的,代碼只默認使用整個語料庫的一小部分。在實際訓練模型時,請務必取消選中DEMO_MODE復選框,使用大100倍的數據集。

當然,100M數據足以訓練出相當不錯的BERT基礎模型。

DEMO_MODE = True #@param {type:"boolean"}
if DEMO_MODE:
 CORPUS_SIZE = 1000000
else:
 CORPUS_SIZE = 100000000 #@param {type: "integer"}
!(head -n $CORPUS_SIZE dataset.txt) > subdataset.txt
!mv subdataset.txt dataset.txt

預處理文本數據

我們下載的原始文本數據包含標點符號,大寫字母和非UTF符號,我們將在繼續下一步之前將其刪除。在推理期間,我們將對新數據應用相同的過程。

如果你需要不同的預處理方式(例如在推理期間預期會出現大寫字母或標點符號),請修改以下代碼以滿足你的需求。

regex_tokenizer = nltk.RegexpTokenizer("\w+")
def normalize_text(text):
 # lowercase text
 text = str(text).lower()
 # remove non-UTF
 text = text.encode("utf-8", "ignore").decode()
 # remove punktuation symbols
 text = " ".join(regex_tokenizer.tokenize(text))
 return text
def count_lines(filename):
 count = 0
 with open(filename) as fi:
 for line in fi:
 count += 1
 return count

現在讓我們預處理整個數據集:

RAW_DATA_FPATH = "dataset.txt" #@param {type: "string"}
PRC_DATA_FPATH = "proc_dataset.txt" #@param {type: "string"}
# apply normalization to the dataset
# this will take a minute or two
total_lines = count_lines(RAW_DATA_FPATH)
bar = Progbar(total_lines)
with open(RAW_DATA_FPATH,encoding="utf-8") as fi:
 with open(PRC_DATA_FPATH, "w",encoding="utf-8") as fo:
 for l in fi:
 fo.write(normalize_text(l)+"\n")
 bar.add(1)

構建詞匯表

下一步,我們將訓練模型學習一個新的詞匯表,用于表示我們的數據集。

BERT文件使用WordPiece分詞器,在開源中不可用。我們將在單字模式下使用SentencePiece分詞器。雖然它與BERT不直接兼容,但是通過一個小的處理方法,可以使它工作。

SentencePiece需要相當多的運行內存,因此在Colab中的運行完整數據集會導致內核崩潰。

為避免這種情況,我們將隨機對數據集的一小部分進行子采樣,構建詞匯表。另一個選擇是使用更大內存的機器來執行此步驟。

此外,SentencePiece默認情況下將BOS和EOS控制符號添加到詞匯表中。我們通過將其索引設置為-1來禁用它們。

VOC_SIZE的典型值介于32000和128000之間。如果想要更新詞匯表,并在預訓練階段結束后對模型進行微調,我們會保留NUM_PLACEHOLDERS個令牌。

MODEL_PREFIX = "tokenizer" #@param {type: "string"}
VOC_SIZE = 32000 #@param {type:"integer"}
SUBSAMPLE_SIZE = 12800000 #@param {type:"integer"}
NUM_PLACEHOLDERS = 256 #@param {type:"integer"}
SPM_COMMAND = ('--input={} --model_prefix={} '
 '--vocab_size={} --input_sentence_size={} '
 '--shuffle_input_sentence=true ' 
 '--bos_id=-1 --eos_id=-1').format(
 PRC_DATA_FPATH, MODEL_PREFIX, 
 VOC_SIZE - NUM_PLACEHOLDERS, SUBSAMPLE_SIZE)
spm.SentencePieceTrainer.Train(SPM_COMMAND)

現在,讓我們看看如何讓SentencePiece在BERT模型上工作。

下面是使用來自官方的預訓練英語BERT基礎模型的WordPiece詞匯表標記的語句。

>>> wordpiece.tokenize("Colorless geothermal substations are generating furiously")
['color',
 '##less',
 'geo',
 '##thermal',
 'sub',
 '##station',
 '##s',
 'are',
 'generating',
 'furiously']

WordPiece標記器在“##”的單詞中間預置了出現的子字。在單詞開頭出現的子詞不變。如果子詞出現在單詞的開頭和中間,則兩個版本(帶和不帶” ##’)都會添加到詞匯表中。

SentencePiece創建了兩個文件:tokenizer.model和tokenizer.vocab讓我們來看看它學到的詞匯:

def read_sentencepiece_vocab(filepath):
 voc = []
 with open(filepath, encoding='utf-8') as fi:
 for line in fi:
 voc.append(line.split("\t")[0])
 # skip the first <unk> token
 voc = voc[1:]
 return voc
snt_vocab = read_sentencepiece_vocab("{}.vocab".format(MODEL_PREFIX))
print("Learnt vocab size: {}".format(len(snt_vocab)))
print("Sample tokens: {}".format(random.sample(snt_vocab, 10)))

運行結果:

Learnt vocab size: 31743 
Sample tokens: ['▁cafe', '▁slippery', 'xious', '▁resonate', '▁terrier', '▁feat', '▁frequencies', 'ainty', '▁punning', 'modern']

SentencePiece與WordPiece的運行結果完全相反從文檔中可以看出:SentencePiece首先使用元符號“_”將空格轉義為空格,如下所示:

Hello_World。

然后文本被分段為小塊:

[Hello] [_Wor] [ld] [.]

在空格之后出現的子詞(也是大多數詞開頭的子詞)前面加上“_”,而其他子詞不變。這排除了僅出現在句子開頭而不是其他地方的子詞。然而,這些案件應該非常罕見。

因此,為了獲得類似于WordPiece的詞匯表,我們需要執行一個簡單的轉換,從包含它的標記中刪除“_”,并將“##”添加到不包含它的標記中。

我們還添加了一些BERT架構所需的特殊控制符號。按照慣例,我們把它們放在詞匯的開頭。

另外,我們在詞匯表中添加了一些占位符標記。

如果你希望使用新的用于特定任務的令牌來更新預先訓練的模型,那么這些方法是很有用的。

在這種情況下,占位符標記被替換為新的令牌,重新生成預訓練數據,并且對新數據進行微調。

def parse_sentencepiece_token(token):
 if token.startswith("▁"):
 return token[1:]
 else:
 return "##" + token
bert_vocab = list(map(parse_sentencepiece_token, snt_vocab))
ctrl_symbols = ["[PAD]","[UNK]","[CLS]","[SEP]","[MASK]"]
bert_vocab = ctrl_symbols + bert_vocab
bert_vocab += ["[UNUSED_{}]".format(i) for i in range(VOC_SIZE - len(bert_vocab))]
print(len(bert_vocab))

最后,我們將獲得的詞匯表寫入文件。

VOC_FNAME = "vocab.txt" #@param {type:"string"}
with open(VOC_FNAME, "w") as fo:
 for token in bert_vocab:
 fo.write(token+"\n")

現在,讓我們看看新詞匯在實踐中是如何運作的:

>>> testcase = "Colorless geothermal substations are generating furiously"
>>> bert_tokenizer = tokenization.FullTokenizer(VOC_FNAME)
>>> bert_tokenizer.tokenize(testcase)
['color', 
 '##less', 
 'geo', 
 '##ther', 
 '##mal', 
 'sub', 
 '##station', 
 '##s', 
 'are', 
 'generat', 
 '##ing', 
 'furious', 
 '##ly']

創建分片預訓練數據(生成預訓練數據)

通過手頭的詞匯表,我們可以為BERT模型生成預訓練數據。

由于我們的數據集可能非常大,我們將其拆分為碎片:

mkdir ./shards
split -a 4 -l 256000 -d $PRC_DATA_FPATH ./shards/shard_

現在,對于每個部分,我們需要從BERT倉庫調用create_pretraining_data.py腳本,需要使用xargs的命令。

在開始生成之前,我們需要設置一些參數傳遞給腳本。你可以從自述文件中找到有關它們含義的更多信息。

MAX_SEQ_LENGTH = 128 #@param {type:"integer"}
MASKED_LM_PROB = 0.15 #@param
MAX_PREDICTIONS = 20 #@param {type:"integer"}
DO_LOWER_CASE = True #@param {type:"boolean"}
PRETRAINING_DIR = "pretraining_data" #@param {type:"string"}
# controls how many parallel processes xargs can create
PROCESSES = 2 #@param {type:"integer"}

運行此操作可能需要相當長的時間,具體取決于數據集的大小。

XARGS_CMD = ("ls ./shards/ | "
 "xargs -n 1 -P {} -I{} "
 "python3 bert/create_pretraining_data.py "
 "--input_file=./shards/{} "
 "--output_file={}/{}.tfrecord "
 "--vocab_file={} "
 "--do_lower_case={} "
 "--max_predictions_per_seq={} "
 "--max_seq_length={} "
 "--masked_lm_prob={} "
 "--random_seed=34 "
 "--dupe_factor=5")
XARGS_CMD = XARGS_CMD.format(PROCESSES, '{}', '{}', PRETRAINING_DIR, '{}', 
 VOC_FNAME, DO_LOWER_CASE, 
 MAX_PREDICTIONS, MAX_SEQ_LENGTH, MASKED_LM_PROB)
tf.gfile.MkDir(PRETRAINING_DIR)
!$XARGS_CMD

為數據和模型設置GCS存儲,將數據和模型存儲到云端

為了保留來之不易的訓練模型,我們會將其保留在谷歌云存儲中。

在谷歌云存儲中創建兩個目錄,一個用于數據,一個用于模型。在模型目錄中,我們將放置模型詞匯表和配置文件。

在繼續操作之前,請配置BUCKET_NAME變量,否則將無法訓練模型。

BUCKET_NAME = "bert_resourses" #@param {type:"string"}
MODEL_DIR = "bert_model" #@param {type:"string"}
tf.gfile.MkDir(MODEL_DIR)
if not BUCKET_NAME:
 log.warning("WARNING: BUCKET_NAME is not set. "
 "You will not be able to train the model.")

下面是BERT基的超參數配置示例:

# use this for BERT-base
bert_base_config = {
 "attention_probs_dropout_prob": 0.1, 
 "directionality": "bidi", 
 "hidden_act": "gelu", 
 "hidden_dropout_prob": 0.1, 
 "hidden_size": 768, 
 "initializer_range": 0.02, 
 "intermediate_size": 3072, 
 "max_position_embeddings": 512, 
 "num_attention_heads": 12, 
 "num_hidden_layers": 12, 
 "pooler_fc_size": 768, 
 "pooler_num_attention_heads": 12, 
 "pooler_num_fc_layers": 3, 
 "pooler_size_per_head": 128, 
 "pooler_type": "first_token_transform", 
 "type_vocab_size": 2, 
 "vocab_size": VOC_SIZE
}
with open("{}/bert_config.json".format(MODEL_DIR), "w") as fo:
 json.dump(bert_base_config, fo, indent=2)
with open("{}/{}".format(MODEL_DIR, VOC_FNAME), "w") as fo:
 for token in bert_vocab:
 fo.write(token+"\n")

現在,我們已準備好將模型和數據存儲到谷歌云當中:

if BUCKET_NAME:
 !gsutil -m cp -r $MODEL_DIR $PRETRAINING_DIR gs://$BUCKET_NAME

在云TPU上訓練模型

注意,之前步驟中的某些參數在此處不用改變。請確保在整個實驗中設置的參數完全相同。

BUCKET_NAME = "bert_resourses" #@param {type:"string"}
MODEL_DIR = "bert_model" #@param {type:"string"}
PRETRAINING_DIR = "pretraining_data" #@param {type:"string"}
VOC_FNAME = "vocab.txt" #@param {type:"string"}
# Input data pipeline config
TRAIN_BATCH_SIZE = 128 #@param {type:"integer"}
MAX_PREDICTIONS = 20 #@param {type:"integer"}
MAX_SEQ_LENGTH = 128 #@param {type:"integer"}
MASKED_LM_PROB = 0.15 #@param
# Training procedure config
EVAL_BATCH_SIZE = 64
LEARNING_RATE = 2e-5
TRAIN_STEPS = 1000000 #@param {type:"integer"}
SAVE_CHECKPOINTS_STEPS = 2500 #@param {type:"integer"}
NUM_TPU_CORES = 8
if BUCKET_NAME:
 BUCKET_PATH = "gs://{}".format(BUCKET_NAME)
else:
 BUCKET_PATH = "."
BERT_GCS_DIR = "{}/{}".format(BUCKET_PATH, MODEL_DIR)
DATA_GCS_DIR = "{}/{}".format(BUCKET_PATH, PRETRAINING_DIR)
VOCAB_FILE = os.path.join(BERT_GCS_DIR, VOC_FNAME)
CONFIG_FILE = os.path.join(BERT_GCS_DIR, "bert_config.json")
INIT_CHECKPOINT = tf.train.latest_checkpoint(BERT_GCS_DIR)
bert_config = modeling.BertConfig.from_json_file(CONFIG_FILE)
input_files = tf.gfile.Glob(os.path.join(DATA_GCS_DIR,'*tfrecord'))
log.info("Using checkpoint: {}".format(INIT_CHECKPOINT))
log.info("Using {} data shards".format(len(input_files)))

準備訓練運行配置,建立評估器和輸入函數,啟動BERT!

model_fn = model_fn_builder(
 bert_config=bert_config,
 init_checkpoint=INIT_CHECKPOINT,
 learning_rate=LEARNING_RATE,
 num_train_steps=TRAIN_STEPS,
 num_warmup_steps=10,
 use_tpu=USE_TPU,
 use_one_hot_embeddings=True)
tpu_cluster_resolver = tf.contrib.cluster_resolver.TPUClusterResolver(TPU_ADDRESS)
run_config = tf.contrib.tpu.RunConfig(
 cluster=tpu_cluster_resolver,
 model_dir=BERT_GCS_DIR,
 save_checkpoints_steps=SAVE_CHECKPOINTS_STEPS,
 tpu_config=tf.contrib.tpu.TPUConfig(
 iterations_per_loop=SAVE_CHECKPOINTS_STEPS,
 num_shards=NUM_TPU_CORES,
 per_host_input_for_training=tf.contrib.tpu.InputPipelineConfig.PER_HOST_V2))
estimator = tf.contrib.tpu.TPUEstimator(
 use_tpu=USE_TPU,
 model_fn=model_fn,
 config=run_config,
 train_batch_size=TRAIN_BATCH_SIZE,
 eval_batch_size=EVAL_BATCH_SIZE)
train_input_fn = input_fn_builder(
 input_files=input_files,
 max_seq_length=MAX_SEQ_LENGTH,
 max_predictions_per_seq=MAX_PREDICTIONS,
 is_training=True)

執行!

estimator.train(input_fn=train_input_fn, max_steps=TRAIN_STEPS)

最后,使用默認參數訓練模型需要100萬步,約54小時的運行時間。如果內核由于某種原因重新啟動,可以從斷點處繼續訓練。

以上就是是在云TPU上從頭開始預訓練BERT的指南。

下一步

好的,我們已經訓練好了模型,接下來可以做什么?

如圖1所示,使用預訓練的模型作為通用的自然語言理解模塊;

2,針對某些特定的分類任務微調模型;

3,使用BERT作為構建塊,去創建另一個深度學習模型。

傳送門

原文地址:

https ://towardsdatascience.com/pre-training-bert-from-scratch-with-cloud-tpu-6e2f71028379

Colab代碼:

https ://colab.research.google.com/drive/1nVn6AFpQSzXBt8_ywfx6XR8ZfQXlKGAz

版權所有,未經授權不得以任何形式轉載及使用,違者必究。
国产999精品久久久| 日韩专区在线观看| 精品综合久久久久久97| 国产欧美日韩在线播放| jizz欧美激情18| 自拍偷拍你懂的| 国模无码一区二区三区| 日本一区二区成人在线| 制服丝袜日韩国产| 国产成人精品在线播放| 国产在线无码精品| 激情五月激情综合| 久久精品二区亚洲w码| 亚洲大片精品永久免费| 日韩视频在线观看免费| 美乳视频一区二区| xfplay5566色资源网站| 国产精品系列视频| 亚洲国产精品传媒在线观看| 日韩成人黄色av| 国产青春久久久国产毛片| 91 视频免费观看| 日本熟女毛茸茸| 2017欧美狠狠色| 亚洲精品国产综合区久久久久久久| 国产精品夜间视频香蕉| 韩国日本美国免费毛片| 欧美亚洲另类小说| 国产精品无圣光一区二区| 亚洲人成免费电影| 午夜精品区一区二区三| 三区四区在线观看| 国产另类ts人妖一区二区| 欧美精品乱码久久久久久按摩| 国产99视频精品免视看7| 成人在线观看黄| 最近中文字幕在线免费观看| 国产亚洲短视频| 欧美大码xxxx| 国产免费黄色av| 波多野结衣黄色| 一区二区三区在线观看欧美| 久久久在线视频| 免费在线a视频| 亚洲中文无码av在线| 亚洲欧美日韩在线播放| 久久久亚洲影院| 中文字幕欧美人妻精品一区| 精品国产18久久久久久| 欧美亚洲高清一区| 国产成人av一区二区三区| 天堂久久久久久| 国产乱理伦片在线观看夜一区| 欧美va亚洲va| 亚洲精品成人自拍| 麻豆成人免费视频| 婷婷开心激情综合| 91免费电影网站| 37p粉嫩大胆色噜噜噜| 国产成人av资源| 中文字幕av一区中文字幕天堂 | 亚洲综合精品伊人久久| 亚洲第一黄色网址| 豆国产96在线|亚洲| 丝袜一区二区三区| 哪个网站能看毛片| 色一情一乱一乱一区91av| 日韩一级黄色大片| 最新精品视频| 在线中文字幕网站| 欧美日韩一区二区三区在线看| 国产一区免费| 可以免费看的av毛片| 欧美日韩国产一中文字不卡| 国产视色精品亚洲一区二区| 亚洲国产精品成人无久久精品| 成人欧美一区二区三区白人| 国产精品亚洲第一区| 伊人影院综合网| 国产精品久久福利| 99国产在线观看| 91在线看视频| 欧美又粗又大又爽| 在线看无码的免费网站| 精品人妻午夜一区二区三区四区 | 亚洲成av人影院在线观看网| 不卡日韩av| 美女又爽又黄免费视频| 欧美三级视频在线| 97超碰人人爱| 久久九九国产| 另类色图亚洲色图| 天堂久久久久久| 亚洲乱码中文字幕| 久久综合福利| 99热这里只有精品1| 亚洲国内精品在线| 涩多多在线观看| 99久久亚洲一区二区三区青草| 国产成人精品一区二区在线| 久久香蕉精品视频| 欧美日韩中文字幕一区二区| 老司机午夜免费福利视频| 久久久国产精品一区二区中文| 日韩在线观看精品| 国产精品毛片一区二区| 亚洲午夜免费电影| 中文字幕不卡每日更新1区2区| 亚洲第一页视频| 久久视频免费观看| www中文在线| 欧美午夜片在线看| 国产黄色特级片| 91色.com| 欧美精品一区二区三区在线看午夜| 国产一区二区三区成人| 中文字幕最新精品| 农村老熟妇乱子伦视频| 精品视频一区三区九区| www.99av.com| 亚洲视频在线一区| 手机成人av在线| 国产在线精品免费| 91精品久久久久| 亚洲一二区视频| 日韩中文在线中文网三级| 一区二区三区伦理片| 在线日韩av片| 亚洲欧美国产中文| 亚洲欧美成人一区二区三区| 五月天男人天堂| 国产成人在线视频网站| 国产另类自拍| 久久一区激情| 国产日韩欧美黄色| 亚洲av无码国产综合专区| 欧美裸体男粗大视频在线观看| 日本高清不卡免费| 亚洲欧洲在线看| 亚洲综合久久av一区二区三区| 91麻豆精品国产综合久久久久久 | 国产精品69页| 亚洲欧美日韩国产中文在线| 免费看欧美黑人毛片| 国产网站一区二区三区| 日本人妻伦在线中文字幕| 2017欧美狠狠色| 欧美性视频在线播放| 久久综合色婷婷| 777久久精品一区二区三区无码 | 国产欧美视频一区二区| 欧美日韩一区二区三区电影| 久久先锋影音av| 二级片在线观看| 国产日韩欧美精品综合| 久久在线中文字幕| 一区二区三区不卡在线观看| 国产免费又粗又猛又爽| 色视频欧美一区二区三区| 女同性αv亚洲女同志| 欧美日韩中字一区| 88久久精品无码一区二区毛片| 精品乱码亚洲一区二区不卡| fc2ppv在线播放| 日韩在线视频一区| 国产精品午夜福利| 国产精品加勒比| 99久久99久久久精品齐齐| 亚洲区成人777777精品| 一区二区三区不卡视频| 国产亚洲视频一区| 欧美日韩国产另类一区| 午夜成人亚洲理伦片在线观看| 日韩av综合中文字幕| 成人精品免费在线观看| 性欧美长视频免费观看不卡| 国产情侣一区二区| 亚洲va国产va天堂va久久| 日韩国产在线观看一区| 久久精品国产一区二区三区日韩| 国产成人欧美日韩在线电影| 亚洲第一在线综合在线| 国产精品日韩成人| 久久久久久无码精品人妻一区二区| 欧美在线观看视频在线| 色天使在线视频| 亚洲欧美国内爽妇网| 一级片手机在线观看| 精品国产一区二区三区久久狼黑人 | 久久精品视频一区二区| 美女喷白浆视频| 亚洲欧美另类久久久精品2019| 国产无色aaa| 亚洲成av人片在线观看香蕉| 欧美日韩精品亚洲精品| 91成人免费观看网站| 国产精品99久久不卡二区| 日韩成人手机在线| 欧美午夜片欧美片在线观看| 国产亚洲精品熟女国产成人| 午夜精品福利视频| 日本女人一区二区三区| 日本在线视频www色| 一本久久综合亚洲鲁鲁五月天| 特级特黄刘亦菲aaa级| 欧美日韩一区二区在线观看| 婷婷激情四射网| 午夜精品www| 粉嫩一区二区三区性色av| 热久久精品国产| 亚洲国产欧美一区二区丝袜黑人 | 日韩精品一区二区视频| 中文字幕 欧美激情| 91网站免费看| 国产三区在线成人av| 极品粉嫩小仙女高潮喷水久久| 色伦专区97中文字幕| 久久人人精品| 欧美精品一区免费| 欧美一区二区三区电影| 亚洲成人第一网站| 久久精品日产第一区二区三区乱码 | 国产精品成人一区二区三区吃奶 | 在线观看国产区| 久久久久九九九| 亚洲成人福利片| 久久97人妻无码一区二区三区| 国产美女扒开尿口久久久| 国产精品电影院| www.日本高清视频| 国产一区二区丝袜高跟鞋图片| 久久久久国产精品厨房| 四虎永久免费在线观看| 国产精品久久久久不卡| 欧美国产禁国产网站cc| 91动漫免费网站| 亚洲free性xxxx护士hd| 亚洲国产精品一区二区www在线| 国产午夜手机精彩视频| 91日韩久久| 欧美丝袜一区二区三区| 国产精品视频在线观看免费| 可以免费看的黄色网址| 日韩欧美一二区| 亚洲精品中文字幕成人片| 亚洲熟妇av一区二区三区| 国产一区二区三区久久精品| 男女男精品视频网| 精品无码国产一区二区三区51安| 秋霞久久久久久一区二区| 亚洲毛片一区二区| 久久精品亚洲精品国产欧美kt∨ | 欧美久久高跟鞋激| 欧美日韩大陆在线| 日本中文字幕一区二区视频| 国模私拍在线观看| 日韩成人手机在线| 成人免费看吃奶视频网站| 亚洲黄色成人网| 天天色天天操综合| 亚洲精品日韩久久久| 在线观看日韩av| 在线亚洲+欧美+日本专区| 欧美一区二区免费观在线| 欧美日韩国产一级片| 精品国模在线视频| 日本精品一区二区三区高清 久久 日本精品一区二区三区不卡无字幕 | 日本精品免费视频| 少妇特黄a一区二区三区| 国产免费成人av| 国产成人av网| 久久人人爽人人| 美女扒开尿口让男人操亚洲视频网站| 国产欧美日韩最新| 日韩精品小视频| 精品久久久久久久久久久| 波多野结衣视频一区| 色丁香婷婷综合久久| 蜜臀久久99精品久久久久久| 久久久久久久久久网| 性xxxxxxxxx| 人妻久久一区二区| 日本在线观看网址| 麻豆久久久久久久久久| 久久久久在线观看| 国产亚洲福利一区| 神马影院午夜我不卡| 成人在线短视频| 狠狠人妻久久久久久综合| 激情综合色综合久久| 久久精品日韩一区二区三区| 欧美探花视频资源| 亚洲欧洲色图综合| 欧洲精品中文字幕| 亚洲欧美精品伊人久久| 国产精品久久久久久av福利| 大桥未久一区二区| 久久久久久免费看| 在线免费观看成人| 黄色网络在线观看| 久久综合久久网| 亚洲视频在线观看一区二区三区| 日韩中文字幕在线视频观看 | 91麻豆精品视频| 国产精品久久久久久久浪潮网站| 欧美性色综合网| 国产精品日韩在线观看| 免费人成视频在线播放| 99精品视频免费在线观看| 色噜噜亚洲精品中文字幕| 97伦伦午夜电影理伦片| 国产精品夜夜嗨| 高清视频欧美一级| 五月开心播播网| 亚洲精品喷潮一区二区三区| 中文字幕亚洲区| 欧美日韩国产大片| 国产一区二区高清不卡| 五月婷婷之婷婷| 亚洲天堂中文字幕在线| 国产亚洲va综合人人澡精品 | 97香蕉超级碰碰久久免费软件| 女人床在线观看| 亚州视频一区二区三区| 亚洲色图19p| 欧美中文在线免费| 大桥未久恸哭の女教师| 丁香激情综合五月| 国产大陆a不卡| 国产精品区一区二区三| 国产精品h在线观看| 免费在线观看亚洲视频| 极品美女销魂一区二区三区免费| 亚洲黄色在线看| 国产视频在线免费观看| 亚洲视频你懂的| 91国产精品电影| 永久av免费在线观看| 亚洲男人天堂网址| 蓝色福利精品导航| 欧美日韩一二区| 亚洲18私人小影院| 亚洲AV无码成人精品一区| 欧美 变态 另类 人妖| 亚洲国产av一区二区| 日韩欧美视频一区二区三区| 在线观看免费黄色片| 久久精品国产秦先生| 欧美欧美午夜aⅴ在线观看| 欧美色图亚洲自拍| 天天干天天插天天射| 欧美精品一区二区三区在线播放| 日韩精品在线中文字幕| 岛国一区二区三区| 色综合久久悠悠| 日本乱子伦xxxx| 国产成人啪午夜精品网站男同| 欧美成人免费网站| 日韩精品久久久| 超碰在线免费97| 欧美午夜免费电影| 亚洲高清123| 中文字幕第31页| 欧美一区二区国产| 青青草原国产免费| 麻豆国产精品一区二区三区| 久久久一本精品99久久精品| wwwxxx亚洲| 1000部国产精品成人观看| 不卡视频一区| 久久精品官网| 色综合视频一区中文字幕| 超碰caoprom| 日韩成人一区二区三区在线观看| 日韩中文视频免费在线观看| 国产精品无码毛片| 在线一区二区三区做爰视频网站| 3d动漫精品啪啪一区二区下载| 亚洲一级免费视频| 国产三级自拍视频| 欧美 日韩 国产精品| 亚洲欧洲精品一区二区三区不卡| 亚洲中文字幕无码不卡电影| 一道本成人在线| 奇米精品一区二区三区| 成人激情免费电影网址| 国产精品久久久久久久久免费看| 国产真实夫妇交换视频| 久久免费福利视频| 久久久久久久久艹| 欧美天堂亚洲电影院在线播放| 亚洲精品国产精品国自产网站| 国产精品夜夜爽| 韩国成人一区| 欧美超碰在线观看| 欧美寡妇偷汉性猛交| 天天干天天色天天| 国产成人在线小视频| 久久精品国产网站| 视频一区二区精品| 亚洲另类在线视频| 国内av免费观看| 日韩午夜在线观看视频| 亚洲欧美日韩另类精品一区二区三区| 美腿丝袜亚洲综合| 色综合视频二区偷拍在线 | 韩国av永久免费| 国产综合免费视频| 欧美—级高清免费播放| 成人av中文字幕|