色综合中文综合网_性猛交娇小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

版權所有,未經授權不得以任何形式轉載及使用,違者必究。
成人网男人的天堂| 成人信息集中地| 亚洲一级片在线观看| 国产日韩欧美大片| 欧美一区二区三区免费在线看| 91在线免费观看网站| 99在线精品一区二区三区| 超碰在线国产97| a天堂资源在线观看| 欧美中文字幕视频| 亚洲欧美中文在线视频| 日韩欧美亚洲范冰冰与中字| 成人小视频免费在线观看| 精品乱色一区二区中文字幕| 日韩午夜激情视频| 一区二区三区中文在线| 久久精品人人做人人爽电影蜜月| www.色.com| 精品日产一区2区三区黄免费 | 久久色成人在线| 亚洲精品视频免费看| 99久久精品国产导航| 蜜臀久久99精品久久久画质超高清 | 午夜影院免费视频| 国产高潮在线观看| 99re国产视频| 精品系列免费在线观看| 国产视频第一页| 亚洲va久久久噜噜噜无码久久| 国产suv精品一区二区69| 国产又黄又粗又硬| 国产伦精品一区二区三区四区| 日韩精品免费在线播放| 国产91富婆露脸刺激对白| 日韩熟女一区二区| 国产jk精品白丝av在线观看| 泷泽萝拉在线播放| 久操视频在线观看免费| 在线观看一区二区三区视频| 亚洲成人aaa| 亚洲精品成人电影| 视频一区视频二区中文字幕| 亚洲av无码乱码国产精品久久| 娇小11一12╳yⅹ╳毛片| 六月丁香激情综合| 欧美特黄aaaaaa| 中文字幕+乱码+中文字幕明步| 久久精品这里有| 久久久久女人精品毛片九一| 自拍视频一区二区| 999精品网站| 最近中文字幕免费| 欧美精品一级片| 区一区二在线观看| 国产精品久免费的黄网站| 97在线播放免费观看| 一区二区视频免费| 动漫av一区二区三区| 天堂影院一区二区| 亚洲国产成人精品激情在线| 日韩在线观看视频一区| 成人性生交大片免费看中文网站| 国产精品高潮呻吟| 精品乱人伦小说| 亚洲国产高清福利视频| 91国产高清在线| 国产精品jvid在线观看蜜臀| 欧美亚洲国产免费| 日本人妻伦在线中文字幕| 久久国产亚洲精品无码| 精品国产一区在线| 精品无码人妻一区二区三区品| 国产乱淫av免费| 免费久久精品视频| 久久久久久久久久久久久久久99| 337p亚洲精品色噜噜狠狠| 国产亚洲欧洲在线| 国产欧美日韩中文| 青青青在线视频播放| 校园春色 亚洲| 轻轻草成人在线| 亚洲亚洲精品在线观看| 亚洲社区在线观看| 热舞福利精品大尺度视频| 污网站免费观看| 在线播放国产一区| 椎名由奈av一区二区三区| 在线电影国产精品| 国产精品流白浆视频| 精品国产_亚洲人成在线| 精品一区二区三区四区五区六区| aaaaaa毛片| 国产一区二区三区免费看| 精品久久久久久久中文字幕 | 一区国产精品视频| 国产精品久久久久99| 国产富婆一区二区三区| 日本精品久久久久中文字幕| 久久高清内射无套| 成人免费av网站| 日韩欧美激情一区| 97成人超碰免| 色免费在线视频| 亚洲综合精品在线| aa级大片欧美| 欧美一区二区三区成人| 国内精品久久久久久久果冻传媒| 丰满人妻一区二区三区大胸| 久久www免费人成看片高清| 欧美大片在线观看| 久久亚洲免费| 日本a级c片免费看三区| 国产一区二区网址| 中文字幕自拍vr一区二区三区| 久久精品ww人人做人人爽| 91香蕉视频在线观看视频| 日韩黄色小视频| 日韩欧美在线视频日韩欧美在线视频| 97久草视频| 一级黄色在线视频| 五月综合激情日本mⅴ| 茄子视频成人在线| 99热99这里只有精品| 国产精品三级视频| 国产成人av网址| 精品少妇人妻av一区二区三区| 亚洲天堂2021av| 欧美激情一区二区三区| 成人a在线观看| 在线观看一区二区三区视频| 午夜免费福利视频| 亚洲男人天堂久| 亚洲午夜精品久久久中文影院av| 中文字幕第三页| 日韩精品在线看片z| 无码中文字幕色专区| 免费观看日韩电影| 欧洲精品在线视频| 亚洲一区二区中文字幕在线观看| 国产精品99久久不卡二区| 欧美乱妇高清无乱码| 亚洲一二三区av| 久久久噜噜噜久久人人看| 亚洲自拍偷拍网址| 无码视频在线观看| 亚洲高清免费观看高清完整版| 国产精品久久中文字幕| 精品人妻少妇AV无码专区 | 欧美日韩黄色一级片| 丝袜诱惑制服诱惑色一区在线观看| 在线成人激情视频| 美国美女黄色片| 色婷婷国产精品| 91视频国产高清| 亚洲欧美高清视频| 最新亚洲国产精品| 国产奶水涨喷在线播放| 精品国产乱子伦一区| 亚洲欧美日韩一级| 亚洲综合偷拍欧美一区色| 午夜精品亚洲一区二区三区嫩草 | 日韩欧美亚洲一区二区三区| 91精品国产综合久久香蕉的特点| 日韩在线第一区| 久久一本综合频道| 97国产精品久久| 五十路在线观看| 国产精品白丝jk喷水视频一区| 欧美videossex极品| 亚洲国产精品一区二区www | 国产精品二区三区四区| 国产一区二区视频免费观看| 欧美一级在线亚洲天堂| 韩国av电影在线观看| 国产欧美 在线欧美| 欧日韩在线视频| 国产精品久久久久久av| 国产富婆一级全黄大片| 欧美久久久久久久久久久| 免费成人深夜夜行网站视频| 国产91对白在线播放| 欧美一区二区三区激情| 欧美日韩亚洲一区二区三区在线观看 | 人妻无码久久一区二区三区免费| 亚洲欧美日韩第一区| 日韩成年人视频| 三级黄色片免费观看| 日韩av手机在线| 欧美日韩精品在线观看| 国产精品久久久久久久久快鸭 | 久久久久成人片免费观看蜜芽| 国产在线一区二| 精品国产电影一区二区| 中文字幕第一区第二区| 久久资源av| 亚洲成人黄色在线| 久久精品久久久久| 日韩av电影在线播放| 亚洲免费视频观看| 精品av在线播放| 久久女同精品一区二区| 狠狠色狠狠色综合系列| 欧美视频在线观看一区二区三区| www.自拍偷拍| 国产精品videossex国产高清| 久久久久久这里只有精品| 77777亚洲午夜久久多人| 91久久在线观看| 狠狠色伊人亚洲综合网站色| 91精品久久久久久久久不口人| 99久久精品无码一区二区毛片 | 欧美成人在线影院| 97久久天天综合色天天综合色hd| 亚洲成人动漫在线| 中文字幕在线观看免费高清| 在线观看免费av片| 亚洲风情第一页| 亚洲精品97久久中文字幕| 黄色大片网站在线观看| 久久黄色精品视频| 国产精品第6页| 国产av无码专区亚洲av| 老司机免费视频久久| 久久午夜无码鲁丝片午夜精品| 国产精品1000部啪视频| 亚洲av无码成人精品国产| 五月激情丁香网| 一级黄色a视频| 黑人巨大精品欧美黑白配亚洲| 狠狠色丁香婷婷综合| 69xxx免费| 九九九九精品九九九九| 国产成人一二三区| 黄色免费观看视频网站| 北条麻妃av高潮尖叫在线观看| 日韩福利视频| 日韩理论片在线观看| 亚洲va码欧洲m码| 一本大道亚洲视频| 色偷偷偷综合中文字幕;dd| 精品国精品自拍自在线| 色偷偷成人一区二区三区91| 偷拍一区二区三区| 午夜久久久久久电影| 欧美日韩一区不卡| 精品国产成人在线影院| 亚洲色图校园春色| 国产日韩欧美91| 日本www在线视频| 加勒比综合在线| 97在线观看免费视频| 日本黄色录像片| 国产精品毛片一区二区| 男人天堂视频在线| 国产伦精品一区二区三区视频青涩| 国产ts变态重口人妖hd| 国产模特av私拍大尺度| 久久成人免费日本黄色| 欧美美女bb生活片| 91在线观看网站| www.av毛片| 69av视频在线| 国产亚洲一二三区| 国产激情偷乱视频一区二区三区| 国产精品一品二品| 精品精品欲导航| 成人久久18免费网站图片| www精品久久| 日日骚一区二区三区| 久久99国产精品免费网站| 国产亚洲精品资源在线26u| 久久精品欧美日韩精品 | 日韩一区二区电影在线观看| 亚洲国产精品女人| 欧美亚洲视频一区| 中国黄色a级片| av免费观看在线| 亚洲激情第一页| 800av在线免费观看| 青娱乐国产精品视频| 91丨porny丨在线中文 | 午夜精品在线视频| 久久国产劲爆∧v内射| 精品一区二区国语对白| www.欧美三级电影.com| 亚洲欧洲精品一区二区| 娇妻高潮浓精白浆xxⅹ| 日韩xxxxxxxxx| 久久精品一二三| 亚洲天堂成人在线视频| 青青草成人网| 国产xxxxx在线观看| 四虎永久免费在线| 麻豆免费精品视频| 欧亚洲嫩模精品一区三区| www.av片| 国产精品一区二区你懂的| 在线视频你懂得一区二区三区| 欧美中文字幕在线观看| 精品亚洲视频在线| 麻豆精品在线播放| 在线免费观看日本欧美| 国产午夜精品视频| 在线免费观看av的网站| 国产91在线看| 国产精品精品视频| 日本aⅴ精品一区二区三区| 97热精品视频官网| 青青草视频在线观看免费| 中文字幕日韩免费视频| 国产精品美女免费看| 国产一级做a爱免费视频| 精品久久久久久久久久久久久| 国产免费一区二区三区在线能观看| 欧美一区二区三区成人精品| 少妇又色又爽又黄的视频| 日韩在线视频观看| xvideos国产精品| 911亚洲精选| 亚洲色图欧美视频| 欧洲国内综合视频| 国产九九精品视频| 91av手机在线| 丰满熟妇人妻中文字幕| 欧美刺激性大交免费视频| 欧美极品jizzhd欧美| 伊人在线视频观看| 欧美日韩免费在线| 成人国产精品av| 国产三级精品三级在线观看| 久久成人av网站| 免费看a级黄色片| 中文字幕不卡一区| 精品国产乱码一区二区三区四区 | 精品人妻午夜一区二区三区四区| 日韩成人中文电影| 精品国产午夜福利在线观看| 日本乱码高清不卡字幕| 五月天av网站| 欧美激情综合色| 99在线精品视频免费观看20| 奇米影视亚洲狠狠色| 亚洲国产精一区二区三区性色| 粉嫩av一区二区三区免费野| 男人天堂成人网| 国产精品999在线观看| 亚洲精品国产拍免费91在线| 日韩少妇内射免费播放| 国产精品综合一区二区三区| 4p变态网欧美系列| 欧美xxxxx精品| 99精品视频在线免费观看| 国产精品二区二区三区| 国产美女在线精品| 成年人深夜视频| eeuss影院一区二区三区| 成人免费看吃奶视频网站| 国产不卡精品视频| 国产精品精品国产| www.久久久久久久| 亚洲精品成人在线| 欧美精品在欧美一区二区| 亚洲男人的天堂一区二区| 一区二区三区网址| 欧美国产综合一区二区| 免费看欧美一级片| 亚洲精品日日夜夜| 国内av一区二区| 宅男在线国产精品| 久久久久亚洲AV成人无在| 欧美一区二区三区在线观看视频| 免费网站在线高清观看| 久久久999精品| 精品人妻无码一区二区| 精品国产_亚洲人成在线| 日本一区二区三区久久久久久久久不 | 久久综合久久综合亚洲| 岳乳丰满一区二区三区| 精品中文字幕久久久久久| 麻豆视频在线观看| 欧美福利小视频| 精品亚洲永久免费| 久久综合伊人77777| 波多野结衣av无码| 国产精品国产自产拍高清av水多| 国产精选久久久| 99在线首页视频| yourporn久久国产精品| 免费看污污视频| 奇米影视一区二区三区| 免费成人深夜夜行网站视频| 亚洲国产中文字幕在线视频综合| 90岁老太婆乱淫| 国产精品亚洲аv天堂网| 顶级嫩模精品视频在线看| 特级丰满少妇一级| 一本大道亚洲视频| 99久久精品国产导航| 色偷偷中文字幕| 欧美成在线视频| 国产原创中文av| 国产精品视频500部| 精品久久久久久国产| 麻豆一区二区三区精品视频| 国产亚洲欧美另类一区二区三区| 欧美在线一区二区| 天天摸天天碰天天爽天天弄| 久久久99免费视频| 少妇高潮惨叫久久久久| 日本精品中文字幕|