精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

聊聊模型量化原理與代碼實現

人工智能
模型量化可以在損失少量精度的前提下對模型進行壓縮,使得原本只能在高性能服務器或GPU上運行的大模型能夠在資源受限的嵌入式設備上運行。

什么是模型量化?

模型量化是一種模型壓縮技術,其核心思想是將原本使用浮點數表示的模型參數轉換為整數表示,以此來減少模型的存儲空間需求并加速計算過程。

具體來說,量化可以將原本使用float32類型的數據轉換為int8類型的數據,這意味著每個權重值占用的空間從32位減少到8位,不僅減少了模型的大小,也降低了計算所需的帶寬和計算資源。

為什么需要進行量化?

隨著深度學習技術在多個領域(如CV、NLP、語音等)的快速應用,模型的規模越來越大,復雜度也越來越高。這導致了模型在內存占用、計算資源以及能耗方面的需求也隨之增加。如需將這些復雜的模型部署在一些低成本的手機、平板等嵌入式設備中,往往難以滿足。

「模型量化應運而生,它可以在損失少量精度的前提下對模型進行壓縮,使得原本只能在高性能服務器或GPU上運行的大模型能夠在資源受限的嵌入式設備上運行。」

模型量化分類

根據映射函數是否是線性可以分為兩類——即線性量化和非線性量化,本文主要研究的是線性量化技術。

1.線性量化

線性量化的過程可以用以下數學表達式來表示:

其中,

  • q表示原始的浮點數值(通常是Float32)。
  • Z表示浮點數值的偏移量(通常稱為 Zero Point)。
  • S表示浮點數值的縮放因子(通常稱為Scale)。
  • Round(?)表示四舍五入近似取整的數學函數,也可以使用向上或向下取整。

根據參數Z是否為零可以將線性量化分為兩類——即對稱量化和非對稱量化。

(1) 對稱量化

對稱量化,即使用一個映射公式將輸入浮點數據映射到[-128,127]的范圍內,圖中-max(|Xf|)表示的是輸入數據的最小值,max(|Xf|)表示輸入數據的最大值。

對稱量化的一個核心即零點的處理,映射公式需要保證原始零點(即輸入浮點數中的0)在量化后依然對應于整數區間的0。總而言之,對稱量化通過映射關系將輸入數據映射在[-128,127]的范圍內,對于映射關系而言,我們需要求解的參數即Z和S。

在對稱量化中,r是用有符號的整型數值(int8)來表示的,此時Z=0,且q=0時恰好有r=0。S的計算公式如下:

其中,

  • n表示用來表示該數值的位寬。
  • max(|x|)表示數據集中所有樣本的絕對值的最大值。

(2) 非對稱量化

非對稱量化,即使用一個映射公式將輸入數據映射到[0,255]的范圍內,圖中min(Xf)表示的是輸入數據的最小值,max(Xf)表示輸入數據的最大值。

對稱量化通過映射關系將輸入數據映射在[0,255]的范圍內,對于映射關系而言,我們需要求解的參數即Z和S。

在非對稱量化中,r 是用有符號的整型數值(uint8)來表示的。可以取Z=min(x),S的計算公式如下:

2.逐層量化、逐組量化和逐通道量化

根據量化的粒度(即共享量化參數的范圍),可以將量化方法分為逐層量化、逐組量化和逐通道量化。

  • 逐層量化:以一個層為單位,整個層的所有權重上使用相同的縮放因子 S 和偏移量 Z 。
  • 逐組量化:將權重按組劃分,每個group使用一組S和Z。
  • 逐通道量化:以通道為單位,每個channel單獨使用一組S和Z。

當 group=1 時,逐組量化與逐層量化等價;當group=num_filters (即dw卷積)時,逐組量化逐通道量化等價。

3.在線量化與離線量化

根據激活值的量化方式,可以分為在線量化和離線量化兩種方法。這兩種方法的主要區別在于量化參數(縮放因子S和偏移量Z)是否在實際推理過程中動態計算。

  • 在線量化:指在實際推理過程中,根據實際的激活值動態計算量化參數S和Z。
  • 離線量化:離線量化是指提前確定好激活值的量化參數S和Z。這樣,在實際推理時就可以直接使用這些預計算好的參數,而不需要動態計算,從而提高了推理速度。

離線量化通常采用以下幾種方法來確定量化參數:

  • 指數平滑法:將校準數據集送入模型,收集每個量化層的輸出特征圖,計算每個batch的S和Z值,并通過指數平滑法來更新S和Z值。
  • 直方圖截斷法:在計算量化參數S和Z的過程中,考慮到有些特征圖可能會出現偏離較遠的奇異值,導致最大值非常大。可以采用直方圖截取的形式,比如拋棄最大的前 1% 數據,以前 1% 分界點的數值作為最大值來計算量化參數。
  • KL 散度校準法:通過計算量化前后的兩個分布之間的 KL 散度(也稱為相對熵)來評估這兩個分布之間的差異,以搜索并選取KL散度最小的量化參數Z和S作為最終的結果。

4.比特量化

根據存儲一個權重元素所需的位數,可以將其分為8bit量化、4bit量化、2bit量化和1bit量化。

  • 二進制神經網絡:即在運行時具有二進制權重和激活的神經網絡,以及在訓練時計算參數的梯度。
  • 三元權重網絡:即權重約束為+1,0和-1的神經網絡。
  • XNOR網絡:即過濾器和卷積層的輸入是二進制的。XNOR網絡主要使用二進制運算來近似卷積。

模型量化原理詳解

1.原理詳解

模型量化橋接定點和浮點,建立一種有效的數據映射關系。要弄懂模型量化的原理就要弄懂這種數據映射關系。浮點與定點數據的轉換公式如下:

其中,

  • R表示輸入的浮點數據
  • Q表示量化之后的定點數據
  • Z表示零點(Zero Point)的數值
  • S表示縮放因子(Scale)的數值

根據S和Z這兩個參數來確定這個映射關系。求解 S 和 Z 有很多種方法,這里列舉中其中的一種求解方式(MinMax)如下:

其中,

  • max(R)表示輸入浮點數值的最大值。
  • min(R)表示輸入浮點數值的最小值。
  • max(Q)表示量化之后的整數數值的最大值(127/255)。
  • min(Q)表示量化之后的整數數值的最小值(-128/0)。

每通道或每張量的權重用int8進行定點量化的可表示范圍為[-127,127],且zero-point就是量化值0。

每張量的激活值或輸入值用int8進行定點量化的可表示范圍為[-128,127],其zero-point在[-128,127]內依據公式求得。

2.具體案例

在這個案例中,我們將展示如何根據給定的激活值范圍 [-2.0, 6.0] 使用 int8 類型進行定點量化的過程。

步驟1: 計算量化尺度S和zero-point Z。

量化尺度S的計算公式為:

Zero-point Z的計算公式為:

代入給定的值:

  • 激活值范圍 [-2.0, 6.0],因此 max_val = 6.0 和 min_val = -2.0
  • 定點量化值范圍 [-128, 127],因此 quant_max = 127 和 quant_min = -128

計算得到:

步驟 2: 對激活值進行量化.

使用計算出的 S 和 Z 值對一個具體的激活值進行量化。假設有一個真實的激活值R = 0.28,則量化后的值 Q為:

代入S和Z的值:

模型量化實現步驟

模型量化具體的執行步驟如下所示:

  • 在量化前,需要先統計出輸入數據(通常是權重或者激活值)中的最小值 min_value 和最大值 max_value。
  • 根據模型的需求選擇合適的量化類型,常見的有對稱量化(int8)和非對稱量化(uint8)。
  • 根據選擇的量化類型,計算量化參數 Z(Zero point)和 S(Scale)。
  • 根據計算出的量化參數 Z 和 S,對模型執行量化操作,即將 FP32 數據轉換為 INT8 數據。
  • 驗證量化后的模型性能是否滿足要求。如果不滿足,可以嘗試使用不同的方式計算 S 和 Z,然后重新執行量化操作。

Pytorch模型量化詳解

PyTorch提供了三種量化模型的方法,具體包括訓練后動態量化、訓練后靜態量化和訓練時量化。

1.訓練后動態量化

訓練后動態量化(Post Training Dynamic Quantization,PTDQ)是最簡單的量化形式,其中權重被提前量化,而激活在推理過程中被動態量化。這種方法用于模型執行時間由從內存加載權重而不是計算矩陣乘法所支配的情況,適合批量較小的LSTM和Transformer模型。步驟如下:

  • 準備模型:將模型設置為評估模式 (model.eval()),對于需要動態量化的模型,通常不需要添加額外的量化或反量化模塊。
  • 量化模型:使用 torch.quantization.quantize_dynamic() 函數來量化模型,這個函數會自動識別模型中適合動態量化的層,并將其轉換為量化版本。

2.訓練后靜態量化

訓練后靜態量化(Post-Training Static Quantization, PTQ)是最常用的量化形式,其中權重是提前量化的,并且基于在校準過程中觀察模型的行為來預先計算激活張量的比例因子和偏差。CNN是一個典型的用例,訓練后量化通常是在內存帶寬和計算節省都很重要的情況下進行的。訓練后量化的步驟如下:

  • 準備模型:添加 QuantStub 和 DeQuantStub 模塊,以指定在何處顯式量化和反量化激活值。確保不重復使用模塊。將需要重新量化的任何操作轉換為模塊的模式。
  • 融合操作:將諸如 conv + relu 或 conv + batchnorm + relu 之類的組合操作融合在一起,以提高模型的準確性和性能。
  • 指定量化配置:例如選擇對稱或非對稱量化以及MinMax或L2Norm校準技術。
  • 使用 torch.quantization.prepare() 函數來插入觀察模塊,以便在校準期間觀察激活張量。
  • 使用校準數據集對模型執行校準操作。
  • 使用 torch.quantization.convert() 函數來轉換模型。包括計算并存儲每個激活張量要使用的比例和偏差值,并替換關鍵算子的量化實現。

3.訓練時量化

在某些情況下,訓練后量化不能提供足夠的準確性,這時可以使用訓練時量化(Quantization-Aware Training,QAT)。步驟:

  • 準備模型:添加 QuantStub 和 DeQuantStub 模塊,以指定在何處顯式量化和反量化激活值。確保不重復使用模塊。將需要重新量化的任何操作轉換為模塊的模式。
  • 將諸如 conv + relu 或 conv + batchnorm + relu 之類的組合操作融合在一起,以提高模型的準確性和性能。
  • 指定偽量化配置:例如選擇對稱或非對稱量化以及MinMax或L2Norm校準技術.
  • 用 torch.quantization.prepare_qat() 函數來插入偽量化模塊,以便在訓練過程中模擬量化。
  • 使用標準訓練流程訓練或微調模型。
  • 使用 torch.quantization.convert() 函數來轉換模型,包括計算并存儲每個激活張量要使用的比例和偏差值,并替換關鍵算子的量化實現。

示例代碼

下面是一個簡單的示例,展示了如何使用PyTorch進行模型量化。

# 導入第三方的庫函數
import os
from io import open
import time

import torch
import torch.nn as nn
import torch.quantization
import torch.nn.functional as F

# 創建LSTM模型類
class LSTMModel(nn.Module):
    """整個網絡包含一個encoder, 一個recurrent模塊和一個decoder."""

    def __init__(self, ntoken, ninp, nhid, nlayers, dropout=0.5):
        super(LSTMModel, self).__init__()
        # 預定義一些網絡層
        self.drop = nn.Dropout(dropout)
        # 嵌入層
        self.encoder = nn.Embedding(ntoken, ninp)
        # LSTM層
        self.rnn = nn.LSTM(ninp, nhid, nlayers, dropout=dropout)
        # 線性層
        self.decoder = nn.Linear(nhid, ntoken)
        self.init_weights()
        self.nhid = nhid
        self.nlayers = nlayers

    def init_weights(self):
     '''
     初始化模型權重
     '''
        initrange = 0.1
        self.encoder.weight.data.uniform_(-initrange, initrange)
        self.decoder.bias.data.zero_()
        self.decoder.weight.data.uniform_(-initrange, initrange)

    def forward(self, input, hidden):
     '''
     搭建網絡并執行前向推理
     '''
        emb = self.drop(self.encoder(input))
        output, hidden = self.rnn(emb, hidden)
        output = self.drop(output)
        decoded = self.decoder(output)
        return decoded, hidden

    def init_hidden(self, bsz):
     '''
     初始化hidden層的權重
     '''
        weight = next(self.parameters())
        return (weight.new_zeros(self.nlayers, bsz, self.nhid),
                weight.new_zeros(self.nlayers, bsz, self.nhid))

# 創建一個詞典類,用來處理數據
# 構建詞匯表,包括詞到索引的映射和索引到詞的映射
class Dictionary(object):
    def __init__(self):
        self.word2idx = {}
        self.idx2word = []

    def add_word(self, word):
     '''
     在詞典中添加新的word
     '''
        if word not in self.word2idx:
            self.idx2word.append(word)
            self.word2idx[word] = len(self.idx2word) - 1
        return self.word2idx[word]

    def __len__(self):
     '''
     返回詞典的長度
     '''
        return len(self.idx2word)

#  Corpus 類:處理文本數據,包括讀取文件、構建詞匯表和將文本轉換為索引序列
class Corpus(object):
    def __init__(self, path):
        self.dictionary = Dictionary()
        # 分別獲取訓練集、驗證集和測試集
        self.train = self.tokenize(os.path.join(path, 'train.txt'))
        self.valid = self.tokenize(os.path.join(path, 'valid.txt'))
        self.test = self.tokenize(os.path.join(path, 'test.txt'))

    def tokenize(self, path):
        """對輸入的文件執行分詞操作"""
        assert os.path.exists(path)
        # 將新的單詞添加到詞典中
        with open(path, 'r', encoding="utf8") as f:
            for line in f:
                words = line.split() + ['<eos>']
                for word in words:
                    self.dictionary.add_word(word)

        # 標記文件的內容
        with open(path, 'r', encoding="utf8") as f:
            idss = []
            for line in f:
                words = line.split() + ['<eos>']
                ids = []
                for word in words:
                    ids.append(self.dictionary.word2idx[word])
                idss.append(torch.tensor(ids).type(torch.int64))
            ids = torch.cat(idss)
        return ids

# 設置模型的路徑
model_data_filepath = 'data/'
corpus = Corpus(model_data_filepath + 'wikitext-2')
ntokens = len(corpus.dictionary)

# 搭建網絡模型
model = LSTMModel(
    ntoken = ntokens,
    ninp = 512,
    nhid = 256,
    nlayers = 5,
)

# 加載預訓練的模型權重
model.load_state_dict(
    torch.load(
        model_data_filepath + 'word_language_model_quantize.pth',
        map_location=torch.device('cpu')
        )
    )
# 將模型切換為推理模式,并打印整個模型
model.eval()
print(model)

# 獲取一個隨機的輸入數值
input_ = torch.randint(ntokens, (1, 1), dtype=torch.long)
hidden = model.init_hidden(1)
temperature = 1.0
num_words = 1000

# 遍歷數據集進行前向推理并將結果保存起來
with open(model_data_filepath + 'out.txt', 'w') as outf:
    with torch.no_grad():  # no tracking history
        for i in range(num_words):
            output, hidden = model(input_, hidden)
            word_weights = output.squeeze().div(temperature).exp().cpu()
            word_idx = torch.multinomial(word_weights, 1)[0]
            input_.fill_(word_idx)
            word = corpus.dictionary.idx2word[word_idx]
            outf.write(str(word.encode('utf-8')) + ('\n' if i % 20 == 19 else ' '))
            if i % 100 == 0:
                print('| Generated {}/{} words'.format(i, 1000))

with open(model_data_filepath + 'out.txt', 'r') as outf:
    all_output = outf.read()
    print(all_output)

bptt = 25
criterion = nn.CrossEntropyLoss()
eval_batch_size = 1

# 創建測試數據集
def batchify(data, bsz):
    # 對測試數據集進行分塊
    nbatch = data.size(0) // bsz
    # 去掉多余的元素
    data = data.narrow(0, 0, nbatch * bsz)
    # 在bsz批處理中平均劃分數據
    return data.view(bsz, -1).t().contiguous()

test_data = batchify(corpus.test, eval_batch_size)

# 獲取bath塊的輸入數據
def get_batch(source, i):
    seq_len = min(bptt, len(source) - 1 - i)
    data = source[i:i+seq_len]
    target = source[i+1:i+1+seq_len].view(-1)
    return data, target

def repackage_hidden(h):
  """
  用新的張量把隱藏的狀態包裝起來,把它們從歷史中分離出來
  """
  if isinstance(h, torch.Tensor):
      return h.detach()
  else:
      return tuple(repackage_hidden(v) for v in h)
# 評估函數
def evaluate(model_, data_source):
    # 打開評估模式
    model_.eval()
    total_loss = 0.
    hidden = model_.init_hidden(eval_batch_size)
    with torch.no_grad():
        for i in range(0, data_source.size(0) - 1, bptt):
         # 獲取測試數據
            data, targets = get_batch(data_source, i)
            # 執行前向推理
            output, hidden = model_(data, hidden)
            hidden = repackage_hidden(hidden)
            output_flat = output.view(-1, ntokens)
            # 獲取訓練loss
            total_loss += len(data) * criterion(output_flat, targets).item()
    return total_loss / (len(data_source) - 1)

# 初始化動態量化模塊
quantized_model = torch.quantization.quantize_dynamic(
    model, {nn.LSTM, nn.Linear}, dtype=torch.qint8
)
print(quantized_model)

def print_size_of_model(model):
    torch.save(model.state_dict(), "temp.p")
    print('Size (MB):', os.path.getsize("temp.p")/1e6)
    os.remove('temp.p')

print_size_of_model(model)
print_size_of_model(quantized_model)

torch.set_num_threads(1)
# 評估模型的運行時間
def time_model_evaluation(model, test_data):
    s = time.time()
    loss = evaluate(model, test_data)
    elapsed = time.time() - s
    print('''loss: {0:.3f}\nelapsed time (seconds): {1:.1f}'''.format(loss, elapsed))

time_model_evaluation(model, test_data)
time_model_evaluation(quantized_model, test_data)
責任編輯:趙寧寧 來源: 小喵學AI
相關推薦

2024-08-19 02:35:00

模型量化深度學習

2024-09-11 15:59:31

LLM.int8()大模型量化

2024-08-05 11:14:45

2024-12-23 15:05:29

2021-07-14 14:05:24

Fragment項目結構

2022-12-11 20:09:50

網絡編程通信

2021-02-08 21:40:04

SockmapBPF存儲

2025-07-18 07:19:00

2020-02-19 19:18:02

緩存查詢速度淘汰算法

2023-03-29 08:31:28

寫代碼微服務遠程

2025-01-15 15:47:36

2021-06-28 11:29:50

生成水印插件

2023-12-22 13:58:00

C++鏈表開發

2021-09-03 23:01:58

CSS 技巧代碼重構

2023-05-26 08:24:17

短信渠道模型

2018-03-28 08:52:53

阻塞非阻塞I

2023-06-30 07:51:44

springboot初始化邏輯

2022-08-16 08:17:09

CDPCRM數據

2025-02-25 09:29:34

2025-03-20 09:54:47

點贊
收藏

51CTO技術棧公眾號

国产精品丝袜91| 中文字幕91视频| 免费无码毛片一区二区app| 2021天堂中文幕一二区在线观| 美国十次av导航亚洲入口| 中文久久乱码一区二区| 亚洲最大福利视频网站| 国产成人无码av在线播放dvd| 国产av精国产传媒| 欧洲美女日日| 欧美性猛交xxxx偷拍洗澡| 91亚洲一区精品| 少妇高潮在线观看| 影视一区二区三区| 91一区二区在线| 欧美激情亚洲另类| 久久精品亚洲天堂| a视频网址在线观看| 午夜综合激情| 亚洲精品99久久久久| 欧美美女黄色网| 91一区二区视频| 欧美日韩一区二区三区视频播放| 91精品国产综合久久国产大片| 色综合666| 黄色一区二区视频| 国产精品免费不| 欧美伊人久久大香线蕉综合69| 你懂的网址一区二区三区| 日韩女同强女同hd| 群体交乱之放荡娇妻一区二区| 午夜不卡av在线| 国产亚洲情侣一区二区无| 国产一级特黄视频| 久久97久久97精品免视看秋霞| 欧美日韩在线综合| 在线观看免费91| 国产又粗又猛又黄又爽| 久久精品亚洲人成影院| 日韩一区二区视频| 黄网站色视频免费观看| 欧美视频久久久| 国产精品嫩草99av在线| 亚洲人成网站999久久久综合| 欧美日韩激情视频在线观看| 精品欧美一区二区精品少妇| 国模吧视频一区| 亚洲国产欧美一区二区三区同亚洲| 成人不卡免费视频| 欧洲成人综合网| 91亚洲国产成人精品一区二区三| 国产成人精品在线| 日本猛少妇色xxxxx免费网站| 久久69成人| 亚洲激情自拍视频| 国产有色视频色综合| 国产成年妇视频| 国产伦精品一区二区三区在线观看| 欧美高清激情视频| 国产精品探花一区二区在线观看| 卡通欧美亚洲| 亚洲欧美一区二区不卡| 国产精品乱码| 自拍偷拍校园春色| 中文字幕一区二区三区在线视频 | 成人91在线观看| 91高清免费视频| 亚洲精品国产精品国自| 欧美日韩黑人| 精品国产一区二区三区四区在线观看| 国产农村妇女精品久久| 国产美女精品视频免费播放软件| 亚洲成人动漫在线观看| 香蕉久久免费影视| 在线播放日本| 99久久99久久综合| 久久综合久久久| 日本ー区在线视频| 国产精品自在在线| 岛国一区二区三区高清视频| 国产精品第6页| 美腿丝袜在线亚洲一区| 午夜精品一区二区三区在线| 欧美18—19性高清hd4k| 亚洲日本va| 欧美日韩视频在线观看一区二区三区| 国产欧美一区二| 日韩一区二区三区高清在线观看| 色综合婷婷久久| www.xxx麻豆| 免费观看在线午夜影视| 久久精品视频在线免费观看| 91视频网页| 欧美一级特黄aaaaaa| 久久综合久久综合九色| 国产欧美一区二区视频| 免费在线高清av| 97精品国产露脸对白| 热re99久久精品国产99热| 人妻va精品va欧美va| ww亚洲ww在线观看国产| 中文字幕欧美日韩一区二区三区| 久草免费在线色站| 欧美在线观看一区二区| 三大队在线观看| 不卡一区视频| 欧美日韩一区二区在线视频| 欧美日韩一区二区区| 免费观看不卡av| 亚洲精品中文字幕女同| 艳妇乳肉豪妇荡乳xxx| 在这里有精品| 亚洲一区二区久久久| av女人的天堂| 欧美美女在线观看| 欧美老妇交乱视频| 91人妻一区二区三区蜜臀| 日韩在线视频精品| 在线亚洲午夜片av大片| 丰满的亚洲女人毛茸茸| 雨宫琴音一区二区在线| 国内精品视频在线| 日韩精品一区三区| 亚洲制服av| 91久久精品www人人做人人爽| 久久久资源网| 亚洲国产综合视频在线观看| 欧美视频在线观看视频| 精品国产美女a久久9999| 日韩高清中文字幕| 久久av无码精品人妻系列试探| 亚洲免费观看高清完整版在线观| 国产视频久久久| 国产性一乱一性一伧一色| 亚洲东热激情| 亚洲综合色av| 午夜18视频在线观看| 久久免费美女视频| 日韩欧美国产综合在线| 天堂av中文在线观看| 91国产精品成人| 伊人五月天婷婷| 色乱码一区二区三区网站| 国产成人精品久久| 四虎精品在线| 国产精品网站一区| 美女网站免费观看视频| 91精品国产一区二区在线观看| 亚洲深夜福利网站| 久久精品无码av| 久久精品国产亚洲a| 91国产在线免费观看| 麻豆网站视频在线观看| 欧美乱妇23p| www.日本高清| 97久久视频| 国模精品一区二区三区色天香| 国产av无码专区亚洲av| 亚洲欧美福利一区二区| 国产免费黄色av| 天堂99x99es久久精品免费| 日韩网站免费观看| 中文字幕在线观看国产| 9色porny自拍视频一区二区| 先锋在线资源一区二区三区| 国产香蕉久久| 另类视频在线观看| 日韩在线 中文字幕| 久久久久9999亚洲精品| 91视频免费版污| 99re热精品视频| 在线看国产精品| 中文字幕第15页| 国产精品一区二区三区网站| 99热这里只有精品免费| 久久精品亚洲成在人线av网址| 91国产中文字幕| 国产在线三区| 午夜视频一区二区三区| 免费无码一区二区三区| 日韩电影免费在线| 国产在线欧美日韩| 欧美大片免费高清观看| 亚洲国产毛片完整版| 黄色片网站在线免费观看| 国产精品一卡二| 国产乱子伦农村叉叉叉| 99久久人爽人人添人人澡| 2018日韩中文字幕| 在线免费观看黄色av| 一本色道综合亚洲| 黄色录像一级片| 成人h动漫精品| 黄色在线视频网| 国产影视一区| http;//www.99re视频| 黄色网页在线播放| 欧美精品tushy高清| 久久久久久国产精品免费播放| 久久日一线二线三线suv| 天天操狠狠操夜夜操| 欧美视频免费| 国产成人免费av| 丝袜美腿av在线| 日韩欧美激情一区| 中文字幕在线观看成人| 国产一区二区不卡老阿姨| www.午夜色| 婷婷综合福利| 亚洲永久免费观看| 欧美精选视频一区二区| 久久免费少妇高潮久久精品99| 国产对白叫床清晰在线播放| 欧美三级日韩三级| 国产精品第一页在线观看| 成人欧美一区二区三区在线播放| 男人的天堂最新网址| 日韩一区二区免费看| 久久久久久国产精品mv| 中文字幕 在线观看| 久久天天躁日日躁| 波多野结衣一区二区| 亚洲电影天堂av| 天堂а√在线中文在线新版| 一区二区三区免费网站| 中文字幕a在线观看| 国内精品久久久久影院一蜜桃| 裸体裸乳免费看| 中文字幕一区二区三区日韩精品| 国产欧美精品一区二区三区-老狼| 日本蜜桃在线观看| 亚洲一区二区久久| 黄色片在线播放| 亚洲另类欧美自拍| 中文字幕一区二区三区免费看| 精品久久久久久电影| 在线观看日本中文字幕| av不卡在线观看| 亚洲高清无码久久| 首页国产欧美久久| 正在播放一区| 成人情趣视频网站| 色一情一乱一伦一区二区三区丨| 欧美激情在线免费| 日产精品久久久一区二区| avtt久久| 91丨九色丨国产在线| 亚洲日日夜夜| 91日本在线观看| 欧美久久亚洲| 欧美一性一乱一交一视频| 在线视频婷婷| 北条麻妃99精品青青久久| 日本成人网址| 精品国产一区久久久| 天天摸天天碰天天爽天天弄| 欧美视频在线播放| 综合久久中文字幕| 欧美日韩国产一级| 91美女免费看| 欧美午夜影院在线视频| 精品国产xxx| 在线国产电影不卡| 国产精彩视频在线| 图片区小说区区亚洲影院| 亚洲精品男人的天堂| 欧美性猛交一区二区三区精品| 中文字幕人妻一区二区三区视频 | 国产精品无人区| 日韩欧美国产成人精品免费| 一区二区三区日韩欧美| 精品在线视频免费观看| 欧美性猛交xxxxx免费看| 日韩欧美国产另类| 69堂精品视频| 日韩精品在线一区二区三区| 欧美午夜免费电影| 国产高清在线免费| 亚洲精品视频二区| 精品黄色免费中文电影在线播放 | 男人皇宫亚洲男人2020| 国产精品久久久久久影视| 九色porny自拍视频在线观看| 久久在线视频在线| а√在线中文网新版地址在线| 久久亚洲精品小早川怜子66| 手机在线免费看av| 555www成人网| 国产欧美日韩成人| 韩国自拍一区| 久久综合久久网| 丝袜脚交一区二区| 午夜免费一级片| 久久久蜜臀国产一区二区| 国产精品免费在线视频| 五月婷婷久久综合| 影音先锋国产在线| 无码av中文一区二区三区桃花岛| 久久精品视频2| 日韩欧美亚洲另类制服综合在线| 三级av在线播放| 久久综合伊人77777尤物| 理论不卡电影大全神| 91免费精品视频| 黑人操亚洲人| 日韩精品在线视频免费观看| 日韩不卡免费视频| 国产不卡一二三| 亚洲欧美日韩国产另类专区| 日本中文字幕在线| 欧美成人a∨高清免费观看| 国产强伦人妻毛片| 亚洲欧美另类在线观看| 四虎av在线| 国产日韩综合一区二区性色av| 婷婷久久免费视频| 91精品中文在线| 最新精品国偷自产在线| 日韩精品在线观看av| 九九国产精品视频| 国产精欧美一区二区三区白种人| 99久久免费视频.com| 中文字幕在线有码| 亚洲一区二区三区四区在线观看| 久久午夜鲁丝片| 亚洲欧美成人精品| 98色花堂精品视频在线观看| 亚洲xxxxx性| 久久美女精品| 91热这里只有精品| 久久色成人在线| 黄色在线观看国产| 亚洲国产精品成人av| 亚洲欧美成人影院| 91丝袜脚交足在线播放| 91视频综合| 天天色综合社区| 中文字幕免费一区| 亚洲精品国产精品乱码视色| 亚洲精品小视频| 天堂网在线最新版www中文网| 国产精品一区二区欧美黑人喷潮水| 中文字幕人成人乱码| 日批视频在线看| 亚洲人123区| jizz中国少妇| 久久99精品视频一区97| 精品中文字幕一区二区三区四区| eeuss中文| 亚洲少妇诱惑| av鲁丝一区鲁丝二区鲁丝三区| 污片在线观看一区二区| 五月天激情婷婷| 91福利视频在线观看| 免费电影一区二区三区| 无码少妇一区二区三区芒果| 国产亚洲一区二区三区四区| 九九热精品免费视频| 日韩精品一区二区三区视频播放| 日本在线视频www鲁啊鲁| www.av一区视频| 亚洲黄色免费| 国产免费中文字幕| 亚洲猫色日本管| 亚洲毛片欧洲毛片国产一品色| 永久免费看mv网站入口亚洲| 久久精品国产福利| 成人在线免费观看网址| 国产99久久久国产精品潘金 | 26uuu亚洲婷婷狠狠天堂| 一级成人黄色片| 尤物yw午夜国产精品视频明星| 欧美成人三级| 成人一级生活片| 老司机精品视频一区二区三区| 欧美88888| 日韩欧美亚洲国产另类 | 天天射综合影视| 欧美91精品久久久久国产性生爱| 国产精品色视频| 亚洲欧美综合| av网站在线不卡| 亚洲欧美日韩在线播放| 欧美熟女一区二区| 国产精品久久久久久av福利软件| 国内精品国产成人国产三级粉色 | 欧美r级在线| 国产九区一区在线| 日韩二区三区四区| 日本老熟俱乐部h0930| 亚洲精品日韩欧美| 国产麻豆一区二区三区| 国产精品视频一区二区三区四区五区| 亚洲国产电影在线观看| 性一交一乱一精一晶| 日韩小视频在线| 国产精品qvod| 亚洲欧美日韩一级| 午夜伊人狠狠久久| 欧美极品视频|