久久精品国产精品国产精品污,男人扒开添女人下部免费视频,一级国产69式性姿势免费视频,夜鲁夜鲁很鲁在线视频 视频,欧美丰满少妇一区二区三区,国产偷国产偷亚洲高清人乐享,中文 在线 日韩 亚洲 欧美,熟妇人妻无乱码中文字幕真矢织江,一区二区三区人妻制服国产

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

探秘Transformer系列之(31)--- Medusa

發(fā)布時間:2025/5/22 编程问答 40 如意码农
生活随笔 收集整理的這篇文章主要介紹了 探秘Transformer系列之(31)--- Medusa 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

探秘Transformer系列之(31)--- Medusa

目錄
  • 探秘Transformer系列之(31)--- Medusa
    • 0x00 概述
    • 0x01 原理
      • 1.1 動機
      • 1.2 借鑒
      • 1.3 思路
        • 1.3.1 單模型 & 多頭
        • 1.3.2 Tree 驗證
        • 1.3.3 小結(jié)
    • 0x02 設(shè)計核心點
      • 2.1 流程
      • 2.2 模型結(jié)構(gòu)
      • 2.3 多頭
        • 2.3.1 head結(jié)構(gòu)
        • 2.3.2 位置
      • 2.4 缺點
    • 0x03 Tree Verification
      • 3.1 解碼路徑
      • 3.2 最佳構(gòu)造方式
      • 3.3 實現(xiàn)
        • 3.3.1 關(guān)鍵變量
        • 3.3.2 示例代碼
        • 3.3.3 總體可視化
        • 3.3.4 使用
          • 調(diào)用
          • 初始化
          • 生成候選路徑
          • 驗證候選路徑
          • 計算最優(yōu)路徑
      • 3.4 Typical Acceptance
        • 3.4.1 常見采用方法
        • 3.4.2 思路
        • 3.4.3 Typical Acceptance
    • 0x04 訓(xùn)練
      • 4.1 MEDUSA-1
      • 4.2 MEDUSA-2
      • 4.3 代碼
    • 0x05 Decoding
      • 5.1 示例
      • 5.2 計算和空間復(fù)雜度
    • 0xFF 參考

0x00 概述

Medusa 是自投機領(lǐng)域較早的一篇工作,對后續(xù)工作啟發(fā)很大,其主要思想是multi-decoding head + tree attention + typical acceptance(threshold)。Medusa 沒有使用獨立的草稿模型,而是在原始模型的基礎(chǔ)上增加多個解碼頭(MEDUSA heads),并行預(yù)測多個后續(xù) token。

正常的LLM只有一個用于預(yù)測t時刻token的head。Medusa 在 LLM 的最后一個 Transformer層之后保留原始的 LM Head,然后額外增加多個(假設(shè)是k個) 可訓(xùn)練的Medusa Head(解碼頭),分別負(fù)責(zé)預(yù)測t+1,t+2,...,和t+k時刻的不同位置的多個 Token。Medusa 讓每個頭生成多個候選 token,而非像投機解碼那樣只生成一個候選。然后將所有的候選結(jié)果組裝成多個候選序列,多個候選序列又構(gòu)成一棵樹。再通過樹注意力機制并行驗證這些候選序列。


注:全部文章列表在這里,估計最終在35篇左右,后續(xù)每發(fā)一篇文章,會修改此文章列表。

cnblogs 探秘Transformer系列之文章列表


0x01 原理

1.1 動機

投機采樣的核心思路如上圖下方所示,首先以低成本的方式(一般來說是用小模型)快速生成多個候選 Token,然后通過一次并行驗證階段快速驗證多個 Token,進而減少大模型的 Decoding Step,實現(xiàn)加速的目的。然而,采用一個獨立的“推測”模型也有缺點,具體如下:

  • 很難找到一個小而強的模型來生成對于原始的模型來說比較簡單的token。

    • draft模型和大模型很難對齊,存在distribution shift。
    • 并不是所有的LLM都能找到現(xiàn)成的小模型。重新訓(xùn)練一個小模型需要較多的額外投入。
  • 在一個系統(tǒng)中維護2個不同的模型,即增加了推理過程的計算復(fù)雜度,也導(dǎo)致架構(gòu)上的復(fù)雜性,在分布式系統(tǒng)上的部署難度增大。
  • 使用投機采樣的時候,會帶來額外的解碼開銷,尤其是當(dāng)使用一個比較高的采樣溫度值時。

1.2 借鑒

Medua主要借鑒了兩個工作:BPD和SpecInfer。

  • 大模型自身帶有一個LM head,用于把隱藏層輸出映射到詞表的概率分布,以實現(xiàn)單個token的解碼。為了生成多個token,論文“Blockwise Parallel Decoding for Deep Autoregressive Models”在骨干模型上使用多個解碼頭來加速推理,通過訓(xùn)練輔助模型,使得模型能夠預(yù)測未來位置的輸出,然后利用這些預(yù)測結(jié)果來跳過部分貪心解碼步驟,從而加速解碼過程。

  • 論文“SpecInfer: Accelerating Generative Large Language Model Serving with Speculative Inference and Token Tree Verification”的思路是:既然小模型可以猜測大模型的輸出并且效率非常高,那么一樣可以使用多個小模型來猜測多個 Token 序列,這樣提供的候選更多,猜對的機會也更大;為了提升這多個 Token 序列的驗證效率,作者提出 Token Tree Attention 的機制,首先將多個小模型生成的多個 Token 序列組合成 Token 樹,然后將其展開輸入模型,即可實現(xiàn)一次 decoding step 完成整個 Token 樹的驗證。

1.3 思路

基于這兩個思路來源,Medusa決定讓target LLM自己進行預(yù)測,即在target LLM最后一層decoder layer之上引入了多個額外的預(yù)測頭,使得模型可以在每個解碼步并行生成多個token,作為“推測”結(jié)果。我們進行具體分析。

1.3.1 單模型 & 多頭

為了拋棄獨立的 Draft Model,只保留一個模型,同時保留 Draft-then-Verify 范式,Medusa 在主干模型的最終隱藏層之后添加了若干個 Medusa Heads,每個解碼頭是一個帶殘差連接的單層前饋網(wǎng)絡(luò)。這些Medusa Heads是對BPD中多 Head 的升級,即由原來的一個 Head 生成一個 Token 變成一個 head 生成多個候選 Token。因為這些 Heads 具有預(yù)測對應(yīng)位置 token 的能力,并且可以并行地執(zhí)行,因此可以實現(xiàn)在一次前向中得到多個 draft tokens。具體如下圖所示。

可能有讀者會有疑問,后面幾個head要跨詞預(yù)測,其準(zhǔn)確率應(yīng)該很難保證吧?確實是這樣的,但是,如果我每個預(yù)測時間步都取top3出來,那么最終預(yù)測成功的概率就高不少了。而且,Medusa 作者觀察到,雖然在預(yù)測 next next Token 的時候 top1 的準(zhǔn)確率可能只有 60%,但是如果選擇 top5,則準(zhǔn)確率有可能超過 80%。而且,因為 MEDUSA 解碼頭與原始模型共享隱藏層狀態(tài),所以分布差異較小。

1.3.2 Tree 驗證

因為貪心解碼的正確率不夠高,加速效果不夠顯著,因此Medusa讓每個Head解碼top-k個候選,不同head的候選集合組成一個樹狀結(jié)構(gòu)。為了更高效地驗證這些 draft tokens,Medusa根據(jù)這些 Head 生成 Token 的笛卡爾積來構(gòu)建出多個 Token 序列。然后使用Tree Attention方法,在注意力計算中,只允許同一延續(xù)中的 token 互相看到(attention mask),再加上位置編碼的配合,就可以在不增加 batch size 的情況下并行處理多個候選。

Medusa 中的樹和注意力掩碼矩陣如下圖所示。在每一跳中,我們看到圖中Medusa保留了多個可能的token,也就是概率最高的幾個token。這樣構(gòu)成了所謂的樹結(jié)構(gòu),直觀來說,就是每1跳的每1個token都可能和下1跳的所有token組合成句子,也可以就在這1跳終止。例如,在圖中,一共2個head生成了2跳的token,那么這棵樹包含了6種可能的句子:Head 1 在下一個位置生成 2 個可能的 Token(It 和 I),Head 2 在下下一個位置生成 3 個可能的 Token(is,’ 和 the),這樣下一個位置和下下一個位置就有了 2 x 3 = 6 種可能的候選序列,如下圖左側(cè)所示。

而其對應(yīng)的 Attention Mask 矩陣如右側(cè)所示。與原始投機解碼略有不同的地方是,樹中有多條解碼路徑,不同解碼路徑之間不能相互訪問。比如,(1) "It is"和 (2) "I is"是兩條路徑,那么在計算(1).is的概率分布時,只能看到(1).it,而不能看到(2)中的"I"。因此,Medusa新建了在并行計算多條路徑概率分布時需要的attention mask,稱為"Tree attention"。本質(zhì)上就是同一條路徑內(nèi)遵從因果mask的規(guī)則,不同路徑之間不能相互訪問。

Medusa作者稱,SpecInfer中每個speculator生成稱的序列長度不同,所以Mask是動態(tài)變化的。而Medusa的Tree Attention Mask在Infrence過程中是靜態(tài)不變的,這使得對樹注意力Mask的預(yù)處理進一步提高了效率。

1.3.3 小結(jié)

下表給出了BPD,SpecInfer,Medusa之間的差異。

領(lǐng)域 Blockwise Parallel Decoding SpecInfer Medusa
多模型 沒有真的構(gòu)造出k-1個輔助模型,只對原始模型略作改造,讓其具備預(yù)測后k個token的能力 采用一批small speculative models(SSMs),并行預(yù)測多個候選SSM,可以是原始LLM的蒸餾、量化、剪枝版本
多頭 加入k個project layer,這k個project layer的輸出就是k個不同位置token的logits 在 LLM 的最后一個 Transformer Layer 之后保留原始的 LM Head,然后額外增加多個 Medusa Head,獲得多個候選的 Token 序列
Tree 將SSMs預(yù)測的多個候選merge為一個新的token tree,采用原始LLM做并行驗證。SpecInfer中每個speculator生成稱的序列長度不同,所以Mask是動態(tài)變化的。 Medusa的Tree Attention Mask在Infrence過程中是靜態(tài)不變的,這使得對樹注意力Mask的預(yù)處理進一步提高了效率。
訓(xùn)練 重新訓(xùn)練原始模型 訓(xùn)練小模型 并不需要重新訓(xùn)練整個大模型,而是凍結(jié)大模型而只訓(xùn)練解碼頭

0x02 設(shè)計核心點

2.1 流程

MEDUSA的大致思路和投機解碼類似,其中每個解碼步驟主要由三個子步驟組成:

  • 生成候選者。MEDUSA通過接在原模型的多個Medusa解碼頭來獲取多個位置的候選token
  • 處理候選者。MEDUSA把各個位置的候選token進行處理,選出一些候選序列。然后通過tree attention來進行驗證。由于 MEDUSA 頭位于原始模型之上,因此,此處計算的 logits可以用于下一個解碼步驟。
  • 接受候選者。通過typical acceptance(典型接受)來選擇最終輸出的結(jié)果。

Medusa更大的優(yōu)勢在于,除了第一次Prefill外,后續(xù)可以達到邊verify邊生成的效果,即 Medusa 的推理流程可以理解:Prefill + Verify + Verify + ...。

2.2 模型結(jié)構(gòu)

下面代碼給出了美杜莎的模型結(jié)構(gòu)。Medusa 是在 LLM 的最后一個 Transformer Layer 之后保留原始的 LM Head,然后額外加多個 Medusa Head,也就是多個不同分支輸出。這樣可以預(yù)測出多個候選的 Token 序列。

Medusa head的輸入是大模型的隱藏層輸出。這是和使用外掛小模型投機解碼的另一個重要不同。外掛小模型的輸入是查表得到的token embedding,比這里的大模型最后一層隱藏層要弱的多,因此比較依賴小模型的性能。正是因為借助大模型的隱藏層輸出,這里的Medusa head的結(jié)構(gòu)都十分簡單。

class MedusaLlamaModel(KVLlamaForCausalLM):
"""The Medusa Language Model Head.
This module creates a series of prediction heads (based on the 'medusa' parameter)
on top of a given base model. Each head is composed of a sequence of residual blocks
followed by a linear layer.
""" def __init__(
self,
config,
):
# Load the base model
super().__init__(config)
# For compatibility with the old APIs medusa_num_heads = config.medusa_num_heads
medusa_num_layers = config.medusa_num_layers
base_model_name_or_path = config._name_or_path
self.hidden_size = config.hidden_size
self.vocab_size = config.vocab_size
self.medusa = medusa_num_heads
self.medusa_num_layers = medusa_num_layers
self.base_model_name_or_path = base_model_name_or_path
self.tokenizer = AutoTokenizer.from_pretrained(self.base_model_name_or_path)
# Create a list of Medusa heads
self.medusa_head = nn.ModuleList(
[
nn.Sequential(
*([ResBlock(self.hidden_size)] * medusa_num_layers),
nn.Linear(self.hidden_size, self.vocab_size, bias=False),
)
for _ in range(medusa_num_heads)
]
) def forward(
self,
input_ids=None,
attention_mask=None,
past_key_values=None,
output_orig=False,
position_ids=None,
medusa_forward=False,
**kwargs,
):
"""Forward pass of the MedusaModel. Args:
input_ids (torch.Tensor, optional): Input token IDs.
attention_mask (torch.Tensor, optional): Attention mask.
labels (torch.Tensor, optional): Ground truth labels for loss computation.
past_key_values (tuple, optional): Tuple containing past key and value states for attention.
output_orig (bool, optional): Whether to also output predictions from the original LM head.
position_ids (torch.Tensor, optional): Position IDs. Returns:
torch.Tensor: A tensor containing predictions from all Medusa heads.
(Optional) Original predictions from the base model's LM head.
"""
if not medusa_forward:
return super().forward(
input_ids=input_ids,
attention_mask=attention_mask,
past_key_values=past_key_values,
position_ids=position_ids,
**kwargs,
)
with torch.inference_mode():
# Pass input through the base model
outputs = self.base_model.model(
input_ids=input_ids,
attention_mask=attention_mask,
past_key_values=past_key_values,
position_ids=position_ids,
**kwargs,
)
if output_orig:
# 原始模型輸出
orig = self.base_model.lm_head(outputs[0])
# Clone the output hidden states
hidden_states = outputs[0].clone()
medusa_logits = []
# TODO: Consider parallelizing this loop for efficiency?
for i in range(self.medusa):
# 美杜莎頭輸出
medusa_logits.append(self.medusa_head[i](hidden_states))
if output_orig:
return torch.stack(medusa_logits, dim=0), outputs, orig
return torch.stack(medusa_logits, dim=0)

2.3 多頭

2.3.1 head結(jié)構(gòu)

Medusa 額外新增 medusa_num_heads 個 Medusa Head,每個 Medusa Head 是一個加上了殘差連接的單層前饋網(wǎng)絡(luò),其中的 Linear 和模型的默認(rèn) lm_head 維度一樣,這樣可以預(yù)測后續(xù)的 Token。

self.medusa_head = nn.ModuleList(
[
nn.Sequential(
*([ResBlock(self.hidden_size)] * medusa_num_layers),
nn.Linear(self.hidden_size, self.vocab_size, bias=False),
)
for _ in range(medusa_num_heads)
]
)

下面代碼為打印出來的實際內(nèi)容。

ModuleList(
(0-3): 4 x Sequential(
(0): ResBlock(
(linear): Linear(in_features=4096, out_features=4096, bias=True)
(act): SiLU()
)
(1): Linear(in_features=4096, out_features=32000, bias=False)
)
)

把第k個解碼頭在詞表上的輸出分布記作 \(p_t^{(t)}\),其計算方式如下。d是hidden state的輸出維度,V是詞表大小,原始模型的預(yù)測表示為 \(p_t^{(0)}\) 。

下面是把代碼和模型結(jié)構(gòu)結(jié)合起來的示意圖。

2.3.2 位置

Medusa每個頭預(yù)測的偏移量是不同的,第k個頭用來預(yù)測位置t+k+1的輸出token(k的取值是1~K)。原模型的解碼頭依然預(yù)測位置t+1的輸出,相當(dāng)于k=0。具體而言,把原始模型在位置t的最后隱藏狀態(tài) \(?_t\)接入到K個解碼頭上,對于輸入token序列 \(t_0,t_1,..,t_i\),原始的head根據(jù)輸入預(yù)測$ t_{i+1}$,Medusa新增的第一個head根據(jù)輸入預(yù)測 \(t_{i+2}\)的token,也就是跳過token \(t_{i+1}\) 預(yù)測下一個未來的token。并且每個頭可以指定topk個結(jié)果。這些頭的預(yù)測結(jié)果構(gòu)成了多個候選詞匯序列,然后利用樹形注意力機制同時處理這些候選序列。在每個解碼步,選擇最長被接受的候選序列作為最終的預(yù)測結(jié)果。這樣,每步可以預(yù)測多個詞匯,從而減少了總的解碼步數(shù),提高了推理速度。

如下圖所示,Medusa在原始模型基礎(chǔ)上,增加了3個額外的Head,可以并行預(yù)測出后4個token的候選。

2.4 缺點

Medusa的缺點如下:

  • Medusa 新增的 lm_head 和最后一個 Transformer Block 中間只有一個 MLP,表達能力可能有限。
  • Medusa 增加了模型參數(shù)量,會增加顯存占用;
  • Medusa 每個 head 都是獨立執(zhí)行的,也就是 “next next token” 預(yù)測并不會依賴上一個 “next token” 的結(jié)果,導(dǎo)致生成效果不佳,接受率比較低,在大 batch size 時甚至可能負(fù)優(yōu)化。
  • 缺乏序列依賴也可能導(dǎo)致低效的樹剪枝算法。
  • 草稿質(zhì)量仍然不高,加速效果有限,并且在非貪婪解碼 (non-greedy decoding) 下不能保證輸出分布與目標(biāo)LLM一致。

因此,后續(xù)有研究工作對此進行了改進。比如Clover重點是提供序列依賴和加入比單個 MLP 具有更強的表征能力的模塊。Hydra 增加了 draft head 預(yù)測之間的關(guān)聯(lián)性。Hydra++使用 base model 的輸出預(yù)測概率作為知識蒸餾的教師模型輸出來訓(xùn)練 draft head。并且類似EAGLE,Hydra++增加一個獨立的 decoder layer,每個 Hydra head 除了上一個 token 本身,還添加了上一個 token 在這個 decoder layer 的 representation 作為輸入。

0x03 Tree Verification

每個Medusa Head 會生成 top-k 個預(yù)測標(biāo)記,然后通過計算這些預(yù)測的笛卡爾積來形成候選序列。我們可以對于每個候選序列都走一遍模型來驗證,但是這樣做太耗時。因此,Medusa 作者設(shè)計了一種tree attention的機制,在候選樹內(nèi)進行掩碼操作,掩碼限制某個token對前面token的注意力。同時,也要為相應(yīng)地為position embedding設(shè)置正確的位置索引。因為有 tree attention 的存在,所以 Medusa 可以并行地構(gòu)建、維護和驗證多個候選序列。

3.1 解碼路徑

在Medusa中,基礎(chǔ)版本解碼采用greedy方式取Top-1 Token。Medusa增加額外的解碼頭之后,使用 Top-K Sampling,每一個 Head 都會輸出 k 個 tokens。不同Medusa頭之間預(yù)測結(jié)果不一致。\(p(t_{t+1}|t_0,...,t_i)\)和\(p(t_{t+2}|t_0,...,t_i)\)形式上是條件獨立的,但是實際上\(p_{t+2}\)依賴\(p_{t+1}\),不能直接取\(p(t_{t+1}|t_0,...,t_i)\)和\(p(t_{t+2}|t_0,...,t_i)\)最大的token作為verify階段的輸入,這樣組成的句子可能會在邏輯上不一致。因此,Medusa還引入采樣topk組合作為候選序列的方式去緩解這個問題。最終把LM_head 的輸出作為根節(jié)點構(gòu)建出樹狀結(jié)構(gòu),樹的深度自頂向下遍歷稱為解碼路徑(論文中叫做candidates path)。每個候選序列可以表示所構(gòu)建的tree上的一條路徑上所有的node(而不只是leaf node,因為tree attention驗證的時候會把路徑上所有token都進行驗證)。

在構(gòu)建樹形結(jié)構(gòu)時,最簡單的方法是通過笛卡爾積來獲取多個解碼頭組成的所有可能的候選序列。下圖例子使用了Cartesian product對兩個解碼頭的結(jié)果進行處理,獲得所有候選序列。具體來說就是將每個頭的top-k個詞作為節(jié)點,每個頭作為樹的一層。圖上一共存在6條解碼路徑,相當(dāng)于 Head 1 在下一個位置生成 2 個可能的 Token(It 和 I),Head 2 在下下一個位置生成 3 個可能的 Token(is,’ 和 the),這樣下一個位置和下下一個位置就有了 2 x 3 = 6 種可能的候選序列。為了區(qū)分不同的 prefix,Medusa 設(shè)置了一些冗余,例如 Head 2 的三個預(yù)測 token 均出現(xiàn)了兩次,這是為了分別對應(yīng) It 和 I 這兩個不同的 prefix。每個 token 在 tree mask 的作用下只可以看見自己的 prefix。

3.2 最佳構(gòu)造方式

上圖采用top-3,兩個頭一共有6條候選路徑。如果解碼頭數(shù)量數(shù)量比較多,每個頭給出的候選token也比較多。解碼路徑會隨著Top-k 和頭數(shù)增多急劇增加,會產(chǎn)生大量的候選路徑,具有龐大的搜索空間。雖然增加候選序列的數(shù)量,最終接受token的命中率就會提升,但是驗證更多候選序列也會帶來額外的計算消耗。那么新的問題是:

  • 如何能減少候選解碼路徑?
  • 如何能在候選解碼路徑中,得到最優(yōu)解碼路徑?

直觀上來說,那些由不同頭部的topk預(yù)測組成的候選結(jié)果可能具有不同的準(zhǔn)確率。應(yīng)該優(yōu)先選擇那些更準(zhǔn)確的預(yù)測,從而構(gòu)建一個更有效的樹,而不需要使用所有可能的排列組合。Medusa 通過在校準(zhǔn)數(shù)據(jù)集上統(tǒng)計每個解碼頭的 top-k 預(yù)測的準(zhǔn)確率,然后貪婪地選擇那些能夠最大化期望接受長度的節(jié)點,將它們加入到樹中。這樣可以在相同的節(jié)點總數(shù)下,獲得更高的加速比。

具體來說,我們可以使用一個calibration dataset(比如Alpaca-eval dataset)來獲取不同解碼頭給出的各個token的準(zhǔn)確率:把第 k 個解碼頭給出的第 i 個token的準(zhǔn)確率記為 \(a_k^{(i)}\)。假設(shè)各個token的準(zhǔn)確率之間是獨立的,那么一個由$[i_1,i_2,\cdots,i_k] $構(gòu)成的候選序列的準(zhǔn)確率可以寫作 \(\prod_{j=1}^ka_j^{(i_j)}\)。我們用 I 表示候選序列的集合,那么集合里的候選序列的expectation of acceptance length就表示為:

\[\sum_{[i_1,i_2,\cdots,i_k]\in I}\prod_{j=1}^ka_j^{(i_j)}
\]

在構(gòu)建tree的時候,Medusa 用貪心算法優(yōu)先加入當(dāng)前有最大準(zhǔn)確率的候選序列,直到tree的節(jié)點數(shù)量達到接受長度的期望值上限,這樣能最大化expectation of acceptance length,也就能最大化acceleration rate。這是一種手工設(shè)計的稀疏樹結(jié)構(gòu),越靠前的節(jié)點,有更多的子節(jié)點路徑。MEDUSA-2 Vicuna-7B模型的一個稀疏樹示例如下圖所示。這個樹結(jié)構(gòu)延伸了四個層次,表明有四個MEDUSA頭參與了計算。該樹最初通過笛卡爾積方法生成,隨后根據(jù)每個MEDUSA頭在Alpaca-eval數(shù)據(jù)集上測量的前 k 個預(yù)測的統(tǒng)計期望值進行修剪。樹向左傾斜在視覺上代表了算法傾向于使用更高準(zhǔn)確率的token,每個節(jié)點表示MEDUSA頭部的top-k預(yù)測中的一個token,邊顯示了它們之間的連接,紅線突出顯示了正確預(yù)測未來token的路徑。這樣就將1000個路徑的樹優(yōu)化到只有42條路徑,而且,這里的路徑可以提前結(jié)束,不要求一定要遍歷到最后一層。

3.3 實現(xiàn)

3.3.1 關(guān)鍵變量

我們首先看看注意力樹所涉及的關(guān)鍵變量。

demo_tensor

demo_tensor是輸入張量,例子如下:

[2, 3, 0, 0, 0, 0, 0, 0 ...] # 1st depth we choose top 2
[4, 5, 6, 0, 0, 0, 0, 0 ...] # 2nd depth we choose top 3

對應(yīng)下圖。

medusa_choices

medusa_choices是一個嵌套列表,表示medusa樹結(jié)構(gòu),決定解碼路徑。外部列表對應(yīng)于樹中的節(jié)點,每個內(nèi)部列表給出該節(jié)點在樹中的祖先及其位置。根據(jù)Medusa choies 我們可以構(gòu)建稀疏樹的所有數(shù)據(jù)成員,源碼中的例子如下。

vicuna_7b_stage2 = [(0,), (0, 0), (1,), (0, 1), (0, 0, 0), (1, 0), (2,), (0, 2), (0, 0, 1), (0, 3), (3,), (0, 1, 0), (2, 0), (4,), (0, 0, 2), (0, 4), (1, 1), (1, 0, 0), (0, 0, 0, 0), (5,), (0, 0, 3), (0, 5), (0, 2, 0), (3, 0), (0, 1, 1), (0, 6), (6,), (0, 7), (0, 0, 4), (4, 0), (1, 2), (0, 8), (7,), (0, 3, 0), (0, 0, 0, 1), (0, 0, 5), (2, 1), (0, 0, 6), (1, 0, 1), (0, 0, 1, 0), (2, 0, 0), (5, 0), (0, 9), (0, 1, 2), (8,), (0, 4, 0), (0, 2, 1), (1, 3), (0, 0, 7), (0, 0, 0, 2), (0, 0, 8), (1, 1, 0), (0, 1, 0, 0), (6, 0), (9,), (0, 1, 3), (0, 0, 0, 3), (1, 0, 2), (0, 5, 0), (3, 1), (0, 0, 2, 0), (7, 0), (1, 4)]
vicuna_7b_stage1_ablation = [(0,), (0, 0), (1,), (0, 0, 0), (0, 1), (1, 0), (2,), (0, 2), (0, 0, 1), (3,), (0, 3), (0, 1, 0), (2, 0), (0, 0, 2), (0, 4), (4,), (0, 0, 0, 0), (1, 0, 0), (1, 1), (0, 0, 3), (0, 2, 0), (0, 5), (5,), (3, 0), (0, 1, 1), (0, 6), (6,), (0, 0, 4), (1, 2), (0, 0, 0, 1), (4, 0), (0, 0, 5), (0, 7), (0, 8), (0, 3, 0), (0, 0, 1, 0), (1, 0, 1), (7,), (2, 0, 0), (0, 0, 6), (2, 1), (0, 1, 2), (5, 0), (0, 2, 1), (0, 9), (0, 0, 0, 2), (0, 4, 0), (8,), (1, 3), (0, 0, 7), (0, 1, 0, 0), (1, 1, 0), (6, 0), (9,), (0, 0, 8), (0, 0, 9), (0, 5, 0), (0, 0, 2, 0), (1, 0, 2), (0, 1, 3), (0, 0, 0, 3), (3, 0, 0), (3, 1)]
vicuna_7b_stage1 = [(0,), (0, 0), (1,), (2,), (0, 1), (1, 0), (3,), (0, 2), (4,), (0, 0, 0), (0, 3), (5,), (2, 0), (0, 4), (6,), (0, 5), (1, 1), (0, 0, 1), (7,), (3, 0), (0, 6), (8,), (9,), (0, 1, 0), (0, 7), (0, 8), (4, 0), (0, 0, 2), (1, 2), (0, 9), (2, 1), (5, 0), (1, 0, 0), (0, 0, 3), (1, 3), (0, 2, 0), (0, 1, 1), (0, 0, 4), (6, 0), (1, 4), (0, 0, 5), (2, 2), (0, 3, 0), (3, 1), (0, 0, 6), (7, 0), (1, 5), (1, 0, 1), (2, 0, 0), (0, 0, 7), (8, 0), (0, 0, 0, 0), (4, 1), (0, 1, 2), (0, 4, 0), (9, 0), (0, 2, 1), (2, 3), (1, 6), (0, 0, 8), (0, 5, 0), (3, 2), (5, 1)]

我們此處例子為:[[0], [0, 0], [0, 1], [0, 2], [1], [1, 0], [1, 1], [1, 2]],這里[1]為根節(jié)點,則可視化如下。

[1]
[2, 3]
[4, 5, 6]

medusa_buffers

medusa_buffers數(shù)據(jù)結(jié)構(gòu)信息如下。

medusa_buffers = generate_medusa_buffers(medusa_choices, device='cpu')

medusa_buffers = {
"medusa_attn_mask": medusa_attn_mask.unsqueeze(0).unsqueeze(0),
"tree_indices": medusa_tree_indices,
"medusa_position_ids": medusa_position_ids,
"retrieve_indices": retrieve_indices,
}

其中成員變量作用如下:

  • medusa_attn_mask:就是樹注意力用到的掩碼。
  • tree_indices:demo_tensor中元素在樹的哪個位置,在 generate_candidates()函數(shù)中會用到。
  • medusa_position_ids:保證同一深度的節(jié)點具有同樣的position ID,加到位置編碼上,后續(xù)在訓(xùn)練時加入這些信息,可以得到更好的medusa頭。在tree_decoding()函數(shù)中用到。
  • retrieve_indices:從樹映射到笛卡爾積,代表每個笛卡爾積在logits中的位置。依據(jù)這些信息,可以從logits里面提取每個笛卡爾積對應(yīng)的logits。在tree_decoding()函數(shù)和generate_candidates()函數(shù)中用到。

tree_indices

tree_indices代表demo_tensor中元素在樹的哪個位置。對于給定的輸入張量,對應(yīng)的tree_indices如下。

[0, 1, 2, 3, 4, 5, 3, 4, 5]

長成的樹如下。

1
|-- 2
| |-- 4
| |-- 5
| |-- 6
|-- 3
| |-- 4
| |-- 5
| |-- 6

從demo_tensor 拿到展平的樹節(jié)點如下。

[1, 2, 3, 4, 5, 6, 4, 5, 6]

參見下圖。

medusa_position_ids

medusa_position_ids:保證同一深度的節(jié)點具有同樣的position ID。加入這些信息之后,每個token對應(yīng)的位置編碼是:序列中的位置 + 樹中的深度。這樣在后續(xù)訓(xùn)練medusa頭時就知道深度信息,可以訓(xùn)練出更好的medusa頭。在tree_decoding()函數(shù)中用到此變量。

輸入張量對應(yīng)的位置id如下。

[0, 1, 1, 2, 2, 2, 2, 2, 2] # Medusa position IDs
| | | | | | | | |
[1, 2, 3, 4, 5, 6, 4, 5, 6] # Flatten tree representation of the tensor

可視化如下。

retrieve_indices

retrieve_indices是從樹映射到笛卡爾積,代表每個笛卡爾積在logits中的位置。依據(jù)這些信息,可以從logits里面提取每個笛卡爾積對應(yīng)的logits。

本例的retrieve_indices如下。

[0, 2, 8]
[0, 2, 7]
[0, 2, 6]
[0, 1, 5]
[0, 1, 4]
[0, 1, 3]

把樹映射到笛卡爾積之后如下。

[1, 3, 6]
[1, 3, 5]
[1, 3, 4]
[1, 2, 6]
[1, 2, 5]
[1, 2, 4]

具體可視化如下。

medusa_attn_mask

因為最終組成的樹是將每個頭的top-k個詞作為節(jié)點,每個頭作為樹的一層,每條直到葉子節(jié)點的路徑構(gòu)成一組待驗證的預(yù)測。在這棵樹內(nèi),Attention Mask需要新的設(shè)計,該Mask只限制一個token對前面token的注意力。同時,要為相應(yīng)地為position embedding設(shè)置正確的位置索引。掩碼矩陣的細(xì)節(jié)如下:

  • Mask矩陣的每行都可以代表一個token預(yù)測任務(wù)
  • Tree Mask矩陣中,需要對位置編碼進行錯位編碼

論文中例子如下。

對于本例的掩碼如下。

3.3.2 示例代碼

示例代碼如下

demo_tensor = torch.zeros(2,10).long()
demo_tensor[0,0] = 2
demo_tensor[0,1] = 3
demo_tensor[1,0] = 4
demo_tensor[1,1] = 5
demo_tensor[1,2] = 6
print('Demo tensor: \n', demo_tensor)
demo_tensor = demo_tensor.flatten()
demo_tensor = torch.cat([torch.ones(1).long(), demo_tensor])
print('='*50)
medusa_choices = [[0], [0, 0], [0, 1], [0, 2], [1], [1, 0], [1, 1], [1, 2]]
medusa_buffers = generate_medusa_buffers(medusa_choices, device='cpu')
tree_indices = medusa_buffers['tree_indices']
medusa_position_ids = medusa_buffers['medusa_position_ids']
retrieve_indices = medusa_buffers['retrieve_indices']
print('Tree indices: \n', tree_indices.tolist())
print('Tree reprentation of the tensor: \n', demo_tensor[tree_indices].tolist())
print('='*50)
print('Medusa position ids: \n', medusa_position_ids.tolist())
print('='*50)
print('Retrieve indices: \n', retrieve_indices.tolist())
demo_tensor_tree = demo_tensor[tree_indices]
demo_tensor_tree_ext = torch.cat([demo_tensor_tree, torch.ones(1).long().mul(-1)])
print('Retrieve reprentation of the tensor: \n', demo_tensor_tree_ext[retrieve_indices].tolist())
print('='*50)
demo_tensor_tree_ext[retrieve_indices].tolist()
print('='*50)
print(medusa_buffers['medusa_attn_mask'][0,0,:,:].int())
print('='*50)
print(medusa_buffers['medusa_attn_mask'][0,0,:,:].int())

打印結(jié)果:

Demo tensor:
tensor([[2, 3, 0, 0, 0, 0, 0, 0, 0, 0],
[4, 5, 6, 0, 0, 0, 0, 0, 0, 0]])
==================================================
Tree indices:
[0, 1, 2, 11, 12, 13, 11, 12, 13]
Tree reprentation of the tensor:
[1, 2, 3, 4, 5, 6, 4, 5, 6]
==================================================
Medusa position ids:
[0, 1, 1, 2, 2, 2, 2, 2, 2]
==================================================
Retrieve indices:
[[0, 2, 8], [0, 2, 7], [0, 2, 6], [0, 1, 5], [0, 1, 4], [0, 1, 3]]
Retrieve reprentation of the tensor:
[[1, 3, 6], [1, 3, 5], [1, 3, 4], [1, 2, 6], [1, 2, 5], [1, 2, 4]]
==================================================
tensor([[1, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 1, 0, 0, 0, 0, 0, 0, 0],
[1, 0, 1, 0, 0, 0, 0, 0, 0],
[1, 1, 0, 1, 0, 0, 0, 0, 0],
[1, 1, 0, 0, 1, 0, 0, 0, 0],
[1, 1, 0, 0, 0, 1, 0, 0, 0],
[1, 0, 1, 0, 0, 0, 1, 0, 0],
[1, 0, 1, 0, 0, 0, 0, 1, 0],
[1, 0, 1, 0, 0, 0, 0, 0, 1]], dtype=torch.int32)

3.3.3 總體可視化

具體可視化參見下圖。

3.3.4 使用

調(diào)用

整體調(diào)用代碼如下?;具壿嬍牵?/p>

  • 根據(jù)設(shè)定的medusa choices得到稀疏的樹結(jié)構(gòu)表達,具體涉及generate_medusa_buffers()函數(shù)。
  • 初始化key和value。
  • 構(gòu)建樹注意力掩碼,根據(jù)輸入的 Prompt 進行預(yù)測,輸出 logits 和 medusa_logits。具體涉及initialize_medusa()函數(shù)。logits對應(yīng) lm_head 的輸出,medusa_logits對應(yīng)medusa_head 的輸出。
  • 從樹中提取用美杜莎頭得到的topk預(yù)測。這些預(yù)測構(gòu)成了候選路徑。具體涉及generate_candidates()函數(shù)。
  • 用樹注意力驗證候選路徑,得到最佳路徑。具體涉及tree_decoding()函數(shù)和evaluate_posterior()函數(shù)。tree_decoding()函數(shù)執(zhí)行基于樹注意力(tree-attention-based)的推理。evaluate_posterior()函數(shù)執(zhí)行對樹的驗證。
  • 根據(jù)候選 Token 序列選出對應(yīng)的 logits,medusa_logits,并更新輸入,key、value cache 等。具體涉及update_inference_inputs()函數(shù)。
def medusa_forward(input_ids, model, tokenizer, medusa_choices, temperature, posterior_threshold, posterior_alpha, top_p=0.8, sampling = 'typical', fast = True, max_steps = 512):

    # Avoid modifying the input_ids in-place
input_ids = input_ids.clone() # Cache medusa buffers (the fixed patterns for tree attention)
if hasattr(model, "medusa_choices") and model.medusa_choices == medusa_choices:
# Load the cached medusa buffer
medusa_buffers = model.medusa_buffers
else:
# Initialize the medusa buffer
# 1. 根據(jù)設(shè)定的medusa choices得到稀疏的樹結(jié)構(gòu)表達
medusa_buffers = generate_medusa_buffers(
medusa_choices, device=model.base_model.device
)
model.medusa_buffers = medusa_buffers
model.medusa_choices = medusa_choices # Initialize the past key and value states
if hasattr(model, "past_key_values"):
past_key_values = model.past_key_values
past_key_values_data = model.past_key_values_data
current_length_data = model.current_length_data
# Reset the past key and value states
current_length_data.zero_()
else:
(
past_key_values,
past_key_values_data,
current_length_data,
) = initialize_past_key_values(model.base_model)
model.past_key_values = past_key_values
model.past_key_values_data = past_key_values_data
model.current_length_data = current_length_data input_len = input_ids.shape[1]
reset_medusa_mode(model) # Initialize tree attention mask and process prefill tokens
medusa_logits, logits = initialize_medusa(
input_ids, model, medusa_buffers["medusa_attn_mask"], past_key_values
)
new_token = 0 for idx in range(max_steps):
# Generate candidates with topk predictions from Medusa heads
# 用美杜莎頭得到的topk預(yù)測來生成候選路徑。candidates是多個候選 Token 序列。tree_candidates是Token 樹
candidates, tree_candidates = generate_candidates(
medusa_logits,
logits,
medusa_buffers["tree_indices"],
medusa_buffers["retrieve_indices"],
temperature, posterior_threshold, posterior_alpha, top_p, sampling, fast
)
# Use tree attention to verify the candidates and get predictions
# 用樹注意力驗證候選路徑。使用 Tree Attention 機制對 tree_candidates 進行驗證推理,獲得新的 logits 和 medusa_logits 輸出。
medusa_logits, logits, outputs = tree_decoding(
model,
tree_candidates,
past_key_values,
medusa_buffers["medusa_position_ids"],
input_ids,
medusa_buffers["retrieve_indices"],
)
# 評估每條路徑合理性,得到最佳路徑。如果所有序列都沒有通過,則只使用第一個 Token,對應(yīng) accept_length 為 0,如果某個序列通過,則使用該序列中的已接受的 Token
best_candidate, accept_length = evaluate_posterior(
logits, candidates, temperature, posterior_threshold, posterior_alpha , top_p, sampling, fast
)
# 根據(jù)候選 Token 序列選出對應(yīng)的 logits,medusa_logits,并更新輸入,key、value cache 等
input_ids, logits, medusa_logits, new_token = update_inference_inputs(
input_ids,
candidates,
best_candidate,
accept_length,
medusa_buffers["retrieve_indices"],
outputs,
logits,
medusa_logits,
new_token,
past_key_values_data,
current_length_data,
)
if tokenizer.eos_token_id in input_ids[0, input_len:].tolist():
break
if new_token > 1024:
break
return input_ids, new_token, idx
初始化

initialize_medusa()函數(shù)會進行初始化操作,得到logits和mask。

def initialize_medusa(input_ids, model, medusa_attn_mask, past_key_values):
"""
Initializes the Medusa structure for a given model. This function performs the following operations:
1. Forward pass through the model to obtain the Medusa logits, original model outputs, and logits.
2. Sets the Medusa attention mask within the base model. Args:
- input_ids (torch.Tensor): The input tensor containing token ids.
- model (MedusaLMHead): The model containing the Medusa layers and base model.
- medusa_attn_mask (torch.Tensor): The attention mask designed specifically for the Medusa structure.
- past_key_values (list of torch.Tensor): Contains past hidden states and past attention values. Returns:
- medusa_logits (torch.Tensor): Logits from the Medusa heads.
- logits (torch.Tensor): Original logits from the base model.
"""
medusa_logits, outputs, logits = model(
input_ids, past_key_values=past_key_values, output_orig=True, medusa_forward=True
)
model.base_model.model.medusa_mask = medusa_attn_mask
return medusa_logits, logits

在具體模型中,會把medusa_mask和causal mask組合在一起,形成一個新的mask。最終在前向傳播時候,傳遞的就是這個最終組合mask。

class LlamaModel(LlamaPreTrainedModel):
# Copied from transformers.models.bart.modeling_bart.BartDecoder._prepare_decoder_attention_mask
def _prepare_decoder_attention_mask(
self, attention_mask, input_shape, inputs_embeds, past_key_values_length
):
# create causal mask
# [bsz, seq_len] -> [bsz, 1, tgt_seq_len, src_seq_len]
combined_attention_mask = None
if input_shape[-1] > 1:
combined_attention_mask = _make_causal_mask(
input_shape,
# inputs_embeds.dtype,
torch.float32, # [MODIFIED] force to cast to float32
device=inputs_embeds.device,
past_key_values_length=past_key_values_length,
) if attention_mask is not None:
# [bsz, seq_len] -> [bsz, 1, tgt_seq_len, src_seq_len]
expanded_attn_mask = _expand_mask(
attention_mask, inputs_embeds.dtype, tgt_len=input_shape[-1]
).to(inputs_embeds.device)
combined_attention_mask = (
expanded_attn_mask
if combined_attention_mask is None
else expanded_attn_mask + combined_attention_mask
) # [MODIFIED] add medusa mask
if hasattr(self, "medusa_mask") and self.medusa_mask is not None:
medusa_mask = self.medusa_mask
medusa_len = medusa_mask.size(-1)
combined_attention_mask[:, :, -medusa_len:, -medusa_len:][
medusa_mask == 0
] = combined_attention_mask.min()
if hasattr(self, "medusa_mode"):
# debug mode
if self.medusa_mode == "debug":
torch.save(combined_attention_mask, "medusa_mask.pt") return combined_attention_mask @add_start_docstrings_to_model_forward(LLAMA_INPUTS_DOCSTRING)
def forward(
self,
input_ids: torch.LongTensor = None,
attention_mask: Optional[torch.Tensor] = None,
position_ids: Optional[torch.LongTensor] = None,
past_key_values=None, # [MODIFIED] past_key_value is KVCache class
inputs_embeds: Optional[torch.FloatTensor] = None,
use_cache: Optional[bool] = None,
output_attentions: Optional[bool] = None,
output_hidden_states: Optional[bool] = None,
return_dict: Optional[bool] = None,
) -> Union[Tuple, BaseModelOutputWithPast]: # ...... # embed positions
if attention_mask is None:
attention_mask = torch.ones(
(batch_size, seq_length_with_past),
dtype=torch.bool,
device=inputs_embeds.device,
)
attention_mask = self._prepare_decoder_attention_mask(
attention_mask,
(batch_size, seq_length),
inputs_embeds,
past_key_values_length,
) # ...... # decoder layers
for idx, decoder_layer in enumerate(self.layers):
if self.gradient_checkpointing and self.training:
# ......
else:
layer_outputs = decoder_layer(
hidden_states,
attention_mask=attention_mask,
position_ids=position_ids,
past_key_value=past_key_value,
output_attentions=output_attentions,
use_cache=use_cache,
) hidden_states = layer_outputs[0] hidden_states = self.norm(hidden_states) # ......
生成候選路徑

generate_candidates()函數(shù)的細(xì)節(jié)如下,主要是預(yù)測每個頭的topk的token,并且用笛卡爾積組裝成可以解析成tree的候選序列。

def generate_candidates(medusa_logits, logits, tree_indices, retrieve_indices, temperature = 0, posterior_threshold=0.3, posterior_alpha = 0.09, top_p=0.8, sampling = 'typical', fast = False):
"""
Generate candidates based on provided logits and indices. Parameters:
- medusa_logits (torch.Tensor): Logits from a specialized Medusa structure, aiding in candidate selection.
- logits (torch.Tensor): Standard logits from a language model.
- tree_indices (list or torch.Tensor): Indices representing a tree structure, used for mapping candidates.
- retrieve_indices (list or torch.Tensor): Indices for extracting specific candidate tokens.
- temperature (float, optional): Controls the diversity of the sampling process. Defaults to 0.
- posterior_threshold (float, optional): Threshold for typical sampling. Defaults to 0.3.
- posterior_alpha (float, optional): Scaling factor for the entropy-based threshold in typical sampling. Defaults to 0.09.
- top_p (float, optional): Cumulative probability threshold for nucleus sampling. Defaults to 0.8.
- sampling (str, optional): Defines the sampling strategy ('typical' or 'nucleus'). Defaults to 'typical'.
- fast (bool, optional): If True, enables faster, deterministic decoding for typical sampling. Defaults to False. Returns:
- tuple (torch.Tensor, torch.Tensor): A tuple containing two sets of candidates:
1. Cartesian candidates derived from the combined original and Medusa logits.
2. Tree candidates mapped from the Cartesian candidates using tree indices.
"""
# Greedy decoding: Select the most probable candidate from the original logits.
if temperature == 0 or fast:
candidates_logit = torch.argmax(logits[:, -1]).unsqueeze(0)
else:
if sampling == 'typical':
candidates_logit = get_typical_one_token(logits[:, -1], temperature, posterior_threshold, posterior_alpha).squeeze(0)
elif sampling == 'nucleus':
candidates_logit = get_nucleus_one_token(logits[:, -1], temperature, top_p).squeeze(0)
else:
raise NotImplementedError
# Extract the TOPK candidates from the medusa logits.
candidates_medusa_logits = torch.topk(medusa_logits[:, 0, -1], TOPK, dim = -1).indices # Combine the selected candidate from the original logits with the topk medusa logits.
# 把lm head和medusa heads的logits拼接在一起
candidates = torch.cat([candidates_logit, candidates_medusa_logits.view(-1)], dim=-1) # Map the combined candidates to the tree indices to get tree candidates.
# 從candidates中拿到樹對應(yīng)的節(jié)點
tree_candidates = candidates[tree_indices] # Extend the tree candidates by appending a zero.
tree_candidates_ext = torch.cat([tree_candidates, torch.zeros((1), dtype=torch.long, device=tree_candidates.device)], dim=0) # 從樹節(jié)點中拿到笛卡爾積
# Retrieve the cartesian candidates using the retrieve indices.
cart_candidates = tree_candidates_ext[retrieve_indices] # Unsqueeze the tree candidates for dimension consistency.
tree_candidates = tree_candidates.unsqueeze(0)
return cart_candidates, tree_candidates
驗證候選路徑

tree_decoding()函數(shù)細(xì)節(jié)如下。對上面的得到的拉平的序列,用基礎(chǔ)的LLM模型預(yù)測每一條路徑的概率,最后根據(jù)retrieve_indices還原到原始的笛卡爾積的路徑,可以得到路徑上每個位置的概率。

def tree_decoding(
model,
tree_candidates,
past_key_values,
medusa_position_ids,
input_ids,
retrieve_indices,
):
"""
Decode the tree candidates using the provided model and reorganize the logits. Parameters:
- model (nn.Module): Model to be used for decoding the tree candidates.
- tree_candidates (torch.Tensor): Input candidates based on a tree structure.
- past_key_values (torch.Tensor): Past states, such as key and value pairs, used in attention layers.
- medusa_position_ids (torch.Tensor): Positional IDs associated with the Medusa structure.
- input_ids (torch.Tensor): Input sequence IDs.
- retrieve_indices (list or torch.Tensor): Indices for reordering the logits. Returns:
- tuple: Returns medusa logits, regular logits, and other outputs from the model.
""" # Compute new position IDs by adding the Medusa position IDs to the length of the input sequence.
position_ids = medusa_position_ids + input_ids.shape[1] # Use the model to decode the tree candidates.
# The model is expected to return logits for the Medusa structure, original logits, and possibly other outputs.
tree_medusa_logits, outputs, tree_logits = model(
tree_candidates,
output_orig=True,
past_key_values=past_key_values,
position_ids=position_ids,
medusa_forward=True,
) # Reorder the obtained logits based on the retrieve_indices to ensure consistency with some reference ordering.
logits = tree_logits[0, retrieve_indices] # 從logits里面根據(jù)retrieve_indices獲取笛卡爾積
medusa_logits = tree_medusa_logits[:, 0, retrieve_indices]
return medusa_logits, logits, outputs
計算最優(yōu)路徑

evaluate_posterior()函數(shù)會計算最優(yōu)路徑。

def evaluate_posterior(
logits, candidates, temperature, posterior_threshold=0.3, posterior_alpha = 0.09, top_p=0.8, sampling = 'typical', fast = True
):
"""
Evaluate the posterior probabilities of the candidates based on the provided logits and choose the best candidate. Depending on the temperature value, the function either uses greedy decoding or evaluates posterior
probabilities to select the best candidate. Args:
- logits (torch.Tensor): Predicted logits of shape (batch_size, sequence_length, vocab_size).
- candidates (torch.Tensor): Candidate token sequences.
- temperature (float): Softmax temperature for probability scaling. A value of 0 indicates greedy decoding.
- posterior_threshold (float): Threshold for posterior probability.
- posterior_alpha (float): Scaling factor for the threshold.
- top_p (float, optional): Cumulative probability threshold for nucleus sampling. Defaults to 0.8.
- sampling (str, optional): Defines the sampling strategy ('typical' or 'nucleus'). Defaults to 'typical'.
- fast (bool, optional): If True, enables faster, deterministic decoding for typical sampling. Defaults to False.
Returns:
- best_candidate (torch.Tensor): Index of the chosen best candidate.
- accept_length (int): Length of the accepted candidate sequence.
"""
# Greedy decoding based on temperature value
if temperature == 0:
# Find the tokens that match the maximum logits for each position in the sequence
posterior_mask = (
candidates[:, 1:] == torch.argmax(logits[:, :-1], dim=-1)
).int()
candidates_accept_length = (torch.cumprod(posterior_mask, dim=1)).sum(dim=1)
accept_length = candidates_accept_length.max()
# Choose the best candidate
if accept_length == 0:
# Default to the first candidate if none are accepted
best_candidate = torch.tensor(0, dtype=torch.long, device=candidates.device)
else:
best_candidate = torch.argmax(candidates_accept_length).to(torch.long)
return best_candidate, accept_length if sampling == 'typical':
if fast:
posterior_prob = torch.softmax(logits[:, :-1] / temperature, dim=-1)
candidates_prob = torch.gather(
posterior_prob, dim=-1, index=candidates[:, 1:].unsqueeze(-1)
).squeeze(-1)
posterior_entropy = -torch.sum(
posterior_prob * torch.log(posterior_prob + 1e-5), dim=-1
) # torch.sum(torch.log(*)) is faster than torch.prod
threshold = torch.minimum(
torch.ones_like(posterior_entropy) * posterior_threshold,
torch.exp(-posterior_entropy) * posterior_alpha,
)
posterior_mask = candidates_prob > threshold
candidates_accept_length = (torch.cumprod(posterior_mask, dim=1)).sum(dim=1) # Choose the best candidate based on the evaluated posterior probabilities
accept_length = candidates_accept_length.max()
if accept_length == 0:
# If no candidates are accepted, just choose the first one
best_candidate = torch.tensor(0, dtype=torch.long, device=candidates.device)
else:
best_candidates = torch.where(candidates_accept_length == accept_length)[0]
# Accept the best one according to likelihood
likelihood = torch.sum(
torch.log(candidates_prob[best_candidates, :accept_length]), dim=-1
)
best_candidate = best_candidates[torch.argmax(likelihood)]
return best_candidate, accept_length
# Calculate posterior probabilities and thresholds for candidate selection
posterior_mask = get_typical_posterior_mask(logits, candidates, temperature, posterior_threshold, posterior_alpha, fast)
candidates_accept_length = (torch.cumprod(posterior_mask, dim=1)).sum(dim=1)
# Choose the best candidate based on the evaluated posterior probabilities
accept_length = candidates_accept_length.max() if accept_length == 0:
# If no candidates are accepted, just choose the first one
best_candidate = torch.tensor(0, dtype=torch.long, device=candidates.device)
else:
best_candidate = torch.argmax(candidates_accept_length).to(torch.long)
# Accept the best one according to likelihood
return best_candidate, accept_length if sampling == 'nucleus':
assert top_p < 1.0 + 1e-6, "top_p should between 0 and 1"
posterior_mask = get_nucleus_posterior_mask(logits, candidates, temperature, top_p)
candidates_accept_length = (torch.cumprod(posterior_mask, dim=1)).sum(dim=1)
accept_length = candidates_accept_length.max()
# Choose the best candidate
if accept_length == 0:
# Default to the first candidate if none are accepted
best_candidate = torch.tensor(0, dtype=torch.long, device=candidates.device)
else:
best_candidate = torch.argmax(candidates_accept_length).to(torch.long)
return best_candidate, accept_length
else:
raise NotImplementedError

3.4 Typical Acceptance

在投機解碼中,拒絕采樣是指從草稿模型的輸出中隨機采樣一個 token 序列,然后使用原始模型來驗證是否接受。如果驗證失敗,就重新采樣,直至找到一個合適的 token 序列。而在實際應(yīng)用中,往往不需要完全匹配原始模型的分布,只要保證輸出的質(zhì)量和多樣性即可,這樣可以獲取更加合理的候選token,也可以加速解碼過程。因此 Medusa 使用了典型接受方案。該方案是基于原始模型預(yù)測的概率,使用溫度來設(shè)定一個閾值,根據(jù)這個閾值來決定是否接受候選的 token。如果候選 token 的概率超過了閾值,就認(rèn)為這個 token 是「典型」的,應(yīng)該接受。

3.4.1 常見采用方法

LLM模型的輸出是在詞表上的概率分布,采樣策略直接決定了我們得到怎么樣的輸出效果。有時候我們希望得到完全確定的結(jié)果,有時候希望得到更加豐富有趣的結(jié)果。

確定性采樣的輸出結(jié)果是確定性的,本質(zhì)上是搜索過程,典型兩種方法如下。

  • Greedy Search。每次選取概率最高的token輸出。
  • Beam Search。維護beam的大小為k,對當(dāng)前beam中的所有path做下個token的展開,選取累積概率最高的前k個path,作為新的beam,以此類推。

概率性采樣會基于概率分布做采樣,常見的有以下3種

  • Multinomial采樣。直接基于概率分布做純隨機采樣,容易采到極低概率的詞。
  • Top-k采樣。在概率排名前k的候選集中做隨機采樣,注意采樣前做重新歸一化。
  • Top-p采樣。也叫Nucleus采樣,先對輸出概率做從大到小的排序,然后在累積概率達到p的這些候選集中做隨機采樣,同樣需要做重新歸一化。

基于采樣的方法中往往有一個溫度參數(shù),溫度越高采樣的多樣性越高,適用于創(chuàng)意生成的場景,比如寫作文。

3.4.2 思路

推測解碼中,作者采用拒絕采樣來產(chǎn)生與原始模型的分布一致的不同輸出。然而,后續(xù)的研究工作發(fā)現(xiàn),隨著采樣溫度的升高,這種采樣策略會導(dǎo)致效率降低。比如,draft模型與target模型一樣好,他們的分布完美地對齊。在這種狀態(tài)下,我們應(yīng)該接受draft模型所有輸出。然而,因為草稿模型與原始模型進行獨立采樣,temperature提升一般對應(yīng)更強的creativity特性,draft model所選擇的候選token的多樣性就增大,也就降低了命中原模型token被接受的概率,從而導(dǎo)致并行解碼長度很短。而此時,貪婪解碼會接受草稿模型的所有輸出,反而會最大化效率。

但是這種特性并不合理。因為在現(xiàn)實場景中,語言模型的采樣通常用于生成不同的響應(yīng),而溫度參數(shù)僅用于調(diào)節(jié)響應(yīng)的"創(chuàng)造力"。因此,較高的溫度應(yīng)該會導(dǎo)致原始模型有更多機會接受草稿模型的輸出,但不一定要匹配原始模型的分布。那么,為什么不只是專注于接受似乎合理(plausible)的候選token呢?

3.4.3 Typical Acceptance

MEDUSA認(rèn)為既然采樣就是追求創(chuàng)造性,候選序列的分布沒有必要完全匹配原模型的分布。我們要做的應(yīng)該是選出typical的候選,也就是,只要候選序列不是極不可能的結(jié)果,就可以被接受。直觀理解是我們在LLM解碼過程,不需要太確定的詞,也不能有太超出預(yù)期的詞,這樣就能保證我們能得到豐富且避免重復(fù)生成的詞匯。

于是,Medusa從截斷采樣(Truncation Sampling)工作中汲取靈感,旨在擴大選擇原始模型可能接受的候選項。Medusa 根據(jù)原始模型的預(yù)測概率設(shè)定一個閾值,如果候選token超過了這個閾值,就會被接受該token 及其 prefix,并在這些token中做Greedy采樣選擇top-k。而這個閾值由原始模型的預(yù)測概率相關(guān)。

具體來說,作者采取hard threshold和entropy-dependent threshold的最小值來決定是否像在truncation sampling中那樣接受一個候選token。這確保了在解碼過程中選擇有意義的token和合理的延續(xù)。作者總是使用Greedy Decoding接受第一個token,確保每一步至少生成一個token。最后選擇被接受的解碼長度最長的候選序列作為最終結(jié)果。這種方法的好處是其適應(yīng)性:如果你將采樣溫度設(shè)為零,它就簡單地回歸到最高效的形式Greedy Search。當(dāng)你提高溫度時,此方法變得更加高效,允許更長的接受序列。

  • 當(dāng)概率分布中有個別token的概率很高,這時熵小, exp?(?(?)) 大,token接受的條件更嚴(yán)格。
  • 當(dāng)概率分布中每個token的概率比較平均時,熵大, exp?(?(?)) 小,token接受的條件寬松一些。

具體實現(xiàn)位于evaluate_posterior()函數(shù)中,這里不再贅述。

0x04 訓(xùn)練

MEDUSA的這些分類頭需要經(jīng)過訓(xùn)練才能有比較好的預(yù)測效果。針對不同的條件,可以選擇不同的訓(xùn)練方式:

  • MEDUSA-1:凍結(jié)原模型的backbone(包括原模型的解碼頭),只訓(xùn)練增加的解碼頭。這種方案適用于計算資源比較少,或者不想影響原模型的效果的情況。還可以使用QLoRA對解碼頭進行訓(xùn)練,進一步節(jié)省內(nèi)存和計算資源。
  • MEDUSA-2:原模型和MEDUSA的解碼頭一起訓(xùn)練。MEDUSA-1這樣的訓(xùn)練方法雖然可以節(jié)省資源,但是并不能最大程度發(fā)揮多個解碼頭的加速效果,而MEDUSA-2則可以進一步發(fā)揮MEDUSA解碼頭的提速能力。而且,由于是基干模型與Medusa Heads一起進行訓(xùn)練,確保了MEDUSA heads的分布與原始模型的分布保持一致,從而減輕了分布漂移問題,顯著提高Heads的準(zhǔn)確性。MEDUSA-2適用于計算資源充足,或者從Base模型進行SFT的場景。

另外,如果原模型的SFT數(shù)據(jù)集是available的,那可以直接進行訓(xùn)練。如果不能獲得原模型的SFT數(shù)據(jù),或者原模型是經(jīng)過RLHF訓(xùn)練的,則可以通過self-distillation來獲取MEDUSA head的訓(xùn)練數(shù)據(jù)。

4.1 MEDUSA-1

MEDUSA-1凍結(jié)了原模型的參數(shù),而只對新增的解碼頭進行訓(xùn)練。使用Medusa-1訓(xùn)練Heads,主要計算Medusa Heads預(yù)測的結(jié)果與Ground Truth之間的交叉熵?fù)p失。具體計算為,給定位置 t+k+1 處的Ground Truth \(y_{t+k+1}\) ,則第 k 個Head的訓(xùn)練loss可以寫作:

\[\mathcal{L}_k=-\log p_t^{(k)}(y_{t+k+1})
\]

并且當(dāng)k 較大時, \(\mathcal{L}_k\) 也會隨之變大,因為當(dāng) k 變大時,靠后的Head的預(yù)測將更加不確定。為了平衡各個 Head 上 loss 的大小,因此在 \(\mathcal{L}_k\) 上增加指數(shù)衰減的權(quán)重參數(shù) \(\lambda_k\) 來平衡不同head的損失。最終Medusa的損失計算如下:

\[\mathcal{L}_{\text{MEDUSA-l}}=\sum_{k=1}^K-\lambda_k\log p_t^{(k)}(y_{t+k+1})
\]

這里的 \(\lambda_{k}\) 是每個解碼頭的縮放系數(shù),是一系列超參。因為 k 越大,對應(yīng)解碼頭的預(yù)測難度越大,loss也就越大,為了防止靠后的解碼頭過分主導(dǎo)訓(xùn)練,因此使用一個縮放系數(shù)進行調(diào)整。實際使用中,\(\lambda_{k}=0.8^{k}\)。

4.2 MEDUSA-2

為了進一步提高Medusa Heads的準(zhǔn)確性,MEDUSA-2把原模型和多個解碼頭一起訓(xùn)練,因此各個解碼頭的準(zhǔn)確率能達到更高的水平,acceleration rate也更高。但是為了保持原模型的輸出質(zhì)量,需要一些特殊的訓(xùn)練技巧。Medusa-2使用以下三個策略來實現(xiàn)這個目標(biāo)。

Combined loss

為了保持backbone模型 next token預(yù)測的能力,需要將backbone模型的交叉熵?fù)p失 \(L_{LM}\)添加到Medusa損失中,即把原模型解碼頭的loss也加上。同時還需要添加一個權(quán)重因子 \(\lambda_0\) 來平衡backbone和Medusa Heads之間的損失。具體如下式

\[\mathcal{L}_{\text{MEDUSA-}2}=\mathcal{L}_{\text{LM}}+\lambda_0\mathcal{L}_{\text{MEDUSA-}1} \\\mathcal{L}_{\text{LM}}=-\log p_t^{(0)}(y_{t+1})
\]

實際使用中,直接訓(xùn)練時 \(\lambda_0=0.2\),使用self-distillation時\(\lambda_0=0.01\)。

Differential learning rates

原模型已經(jīng)是訓(xùn)練好了的,,而 MEDUSA heads需要更多訓(xùn)練,因此原模型和新加入的解碼頭使用相同的學(xué)習(xí)率并不合適。我們可以讓新的解碼頭使用更大的學(xué)習(xí)率,而原模型參數(shù)使用相對小的學(xué)習(xí)率,以實現(xiàn) MEDUSA heads更快的收斂,同時保留backbone模型的能力。實踐中把學(xué)習(xí)率差距設(shè)為4倍,比如分別使用2e-3和5e-4。

Heads warmup

新加入的解碼頭在一開始訓(xùn)練會有比較大的loss,從而導(dǎo)致更大的梯度,有可能損害原模型的能力。針對這個問題,可以使用兩階段訓(xùn)練過程g的方式。在第一階段,先在MEDUSA-1的策略下僅訓(xùn)練解碼頭,在第二階段,再進行MEDUSA-2的訓(xùn)練。這其實相當(dāng)于把 \(\lambda_0\) 在訓(xùn)練過程中逐漸增大。

4.3 代碼

我們再來看看一個已經(jīng)訓(xùn)練好的LLM如何適配MEDUSA,具體分為如下幾步:

  • 添加解碼頭:在 LLM 最后一個隱藏層后添加若干個 MEDUSA 解碼頭。
  • 初始化解碼頭:可使用隨機初始化,也可使用原始模型解碼頭的參數(shù)進行初始化,這樣可以加快訓(xùn)練速度。
  • 選擇訓(xùn)練策略 :根據(jù)實際情況選擇 MEDUSA-1 或 MEDUSA-2 策略。
  • 準(zhǔn)備訓(xùn)練數(shù)據(jù) :可以復(fù)用原始模型的訓(xùn)練數(shù)據(jù),也可以使用自蒸餾方法生成訓(xùn)練數(shù)據(jù)。
  • 訓(xùn)練 :根據(jù)選擇的策略和數(shù)據(jù),訓(xùn)練 MEDUSA 解碼頭或同時微調(diào) LLM。

訓(xùn)練具體代碼如下。首先需要訓(xùn)練幾個新增的頭,不同的頭預(yù)測的label的偏移量不同,所以可以組裝每個頭的topk作為候選。

# Customized for training Medusa heads
class CustomizedTrainer(Trainer):
def compute_loss(self, model, inputs, return_outputs=False):
"""
Compute the training loss for the model. Args:
model (torch.nn.Module): The model for which to compute the loss.
inputs (dict): The input data, including input IDs, attention mask, and labels.
return_outputs (bool): Whether to return model outputs along with the loss. Returns:
Union[float, Tuple[float, torch.Tensor]]: The computed loss, optionally with model outputs.
"""
# DDP will give us model.module
if hasattr(model, "module"):
medusa = model.module.medusa
else:
medusa = model.medusa logits = model(
input_ids=inputs["input_ids"], attention_mask=inputs["attention_mask"]
)
labels = inputs["labels"]
# Shift so that tokens < n predict n
loss = 0
loss_fct = CrossEntropyLoss()
log = {}
for i in range(medusa):
medusa_logits = logits[i, :, : -(2 + i)].contiguous()
# 常規(guī)的標(biāo)簽需要偏移1個位置, 由于不訓(xùn)練LM Head,所以偏移2個位置.
medusa_labels = labels[..., 2 + i :].contiguous()
medusa_logits = medusa_logits.view(-1, logits.shape[-1])
medusa_labels = medusa_labels.view(-1)
medusa_labels = medusa_labels.to(medusa_logits.device)
loss_i = loss_fct(medusa_logits, medusa_labels)
loss += loss_i
not_ignore = medusa_labels.ne(IGNORE_TOKEN_ID)
medusa_labels = medusa_labels[not_ignore] # Add top-k accuracy
for k in range(1, 2):
_, topk = medusa_logits.topk(k, dim=-1)
topk = topk[not_ignore]
correct = topk.eq(medusa_labels.unsqueeze(-1)).any(-1) return (loss, logits) if return_outputs else loss

0x05 Decoding

5.1 示例

官方github源碼給出了前向傳播代碼如下。

@contextmanager
def timed(wall_times, key):
start = time.time()
torch.cuda.synchronize()
yield
torch.cuda.synchronize()
end = time.time()
elapsed_time = end - start
wall_times[key].append(elapsed_time) def medusa_forward(input_ids, model, tokenizer, medusa_choices, temperature, posterior_threshold, posterior_alpha, max_steps = 512):
wall_times = {'medusa': [], 'tree': [], 'posterior': [], 'update': [], 'init': []} with timed(wall_times, 'init'):
if hasattr(model, "medusa_choices") and model.medusa_choices == medusa_choices:
# Load the cached medusa buffer
medusa_buffers = model.medusa_buffers
else:
# Initialize the medusa buffer
medusa_buffers = generate_medusa_buffers(
medusa_choices, device=model.base_model.device
)
model.medusa_buffers = medusa_buffers
model.medusa_choices = medusa_choices # Initialize the past key and value states
if hasattr(model, "past_key_values"):
past_key_values = model.past_key_values
past_key_values_data = model.past_key_values_data
current_length_data = model.current_length_data
# Reset the past key and value states
current_length_data.zero_()
else:
(
past_key_values,
past_key_values_data,
current_length_data,
) = initialize_past_key_values(model.base_model)
model.past_key_values = past_key_values
model.past_key_values_data = past_key_values_data
model.current_length_data = current_length_data input_len = input_ids.shape[1]
reset_medusa_mode(model)
medusa_logits, logits = initialize_medusa(
input_ids, model, medusa_buffers["medusa_attn_mask"], past_key_values
)
new_token = 0 for idx in range(max_steps):
with timed(wall_times, 'medusa'):
candidates, tree_candidates = generate_candidates(
medusa_logits,
logits,
medusa_buffers["tree_indices"],
medusa_buffers["retrieve_indices"],
) with timed(wall_times, 'tree'):
medusa_logits, logits, outputs = tree_decoding(
model,
tree_candidates,
past_key_values,
medusa_buffers["medusa_position_ids"],
input_ids,
medusa_buffers["retrieve_indices"],
) with timed(wall_times, 'posterior'):
best_candidate, accept_length = evaluate_posterior(
logits, candidates, temperature, posterior_threshold, posterior_alpha
) with timed(wall_times, 'update'):
input_ids, logits, medusa_logits, new_token = update_inference_inputs(
input_ids,
candidates,
best_candidate,
accept_length,
medusa_buffers["retrieve_indices"],
outputs,
logits,
medusa_logits,
new_token,
past_key_values_data,
current_length_data,
) if tokenizer.eos_token_id in input_ids[0, input_len:].tolist():
break return input_ids, new_token, idx, wall_times

調(diào)用方法樣例如下。

import os
os.environ["CUDA_VISIBLE_DEVICES"] = "3" # define GPU id, remove if you want to use all GPUs available
import torch
from tqdm import tqdm
import time
from contextlib import contextmanager
import numpy as np
from medusa.model.modeling_llama_kv import LlamaForCausalLM as KVLlamaForCausalLM
from medusa.model.medusa_model import MedusaModel
from medusa.model.kv_cache import *
from medusa.model.utils import *
from medusa.model.medusa_choices import *
import transformers
from huggingface_hub import hf_hub_download # 加載模型
model_name = 'FasterDecoding/medusa-vicuna-7b-v1.3'
model = MedusaModel.from_pretrained(
model_name,
medusa_num_heads = 4,
torch_dtype=torch.float16,
low_cpu_mem_usage=True,
device_map="auto"
)
tokenizer = model.get_tokenizer() medusa_choices = mc_sim_7b_63 # 設(shè)置推理參數(shù)
temperature = 0.
posterior_threshold = 0.09
posterior_alpha = 0.3 # 設(shè)置prompt
prompt = "A chat between a curious user and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the user's questions. USER: Hi, could you share a tale about a charming llama that grows Medusa-like hair and starts its own coffee shop? ASSISTANT:" # 執(zhí)行推理
with torch.inference_mode():
input_ids = tokenizer([prompt]).input_ids
output_ids, new_token, idx, wall_time = medusa_forward(
torch.as_tensor(input_ids).cuda(),
model,
tokenizer,
medusa_choices,
temperature,
posterior_threshold,
posterior_alpha,
)
output_ids = output_ids[0][len(input_ids[0]) :]
print("Output length:", output_ids.size(-1))
print("Compression ratio:", new_token / idx) # 解碼
output = tokenizer.decode(
output_ids,
spaces_between_special_tokens=False,
)
print(output)

5.2 計算和空間復(fù)雜度

下圖給出了prefill,decoding、MEDUSA decoding階段的計算和空間復(fù)雜度。

  • b是batch size。
  • s是序列長度。
  • h是hidden dimension。
  • i是intermediate dimension。
  • n是注意力頭個數(shù)。
  • d是頭維度。
  • q是MEDUSA的候選長度。

另外,下圖給出了Medusa 的操作流程。當(dāng)沒有算子融合或者Tiling策略時,\(QK^?\),DCM(Dense Causal Mask),Softmax都會導(dǎo)致顯存和片上緩存之間大量的IO操作。

0xFF 參考

SpecInfer: Accelerating Generative Large Language Model Serving with Speculative Inference and Token Tree Verification

Medusa: Simple LLM Inference Acceleration Framework with Multiple Decoding Heads

LLM 投機解碼 & 美杜莎(Medusa)實現(xiàn) AI閑談

【手撕LLM-Medusa】并行解碼范式: 美杜莎駕到, 通通閃開??! 小冬瓜AIGC

方佳瑞:大模型推理妙招—投機采樣(Speculative Decoding)

[Transformer 101系列] 深入LLM投機采樣(上) aaronxic

https://github.com/FasterDecoding/Medusa/blob/main/notebooks/medusa_introduction.ipynb

Medusa: Simple LLM Inference Acceleration Framework with Multiple Decoding Heads, Jan 2024, Princeton University. Proceedings of the ICML 2024.

[2401.10774] Medusa: Simple LLM Inference Acceleration Framework with Multiple Decoding Heads

Medusa: Simple LLM Inference Acceleration Framework with Multiple Decoding Heads

GitHub - FasterDecoding/Medusa: Medusa: Simple Framework for Accelerating LLM Generation with Multiple Decoding Heads

LLM推理加速之Medusa:Blockwise Parallel Decoding的繼承與發(fā)展 方佳瑞

方佳瑞:LLM推理加速的文藝復(fù)興:Noam Shazeer和Blockwise Parallel Decoding?

萬字綜述 10+ 種 LLM 投機采樣推理加速方案 AI閑談

[2401.07851] Unlocking Efficiency in Large Language Model Inference: A Comprehensive Survey of Speculative Decoding

速覽Medusa與Lookahead投機推理 是阿沅啊

開源進展 | Medusa: 使用多頭解碼,將大模型推理速度提升2倍以上 洪洗象

arXiv:1811.03115: Berkey, Google Brain, Blockwise Parallel Decoding for Deep Autoregressive Models.

arXiv:2211.17192: Google Research, Fast Inference from Transformers via Speculative Decoding

arXiv:2202.00666: ETH Zu?rich、University of Cambridge,Locally Typical Sampling

[4] arXiv:2106.05234: Dalian University of Technology、Princeton University、Peking University、Microsoft Research Asia,Do Transformers Really Perform Bad for Graph Representation?

3萬字詳細(xì)解析清華大學(xué)最新綜述工作:大模型高效推理綜述 zenRRan

大模型推理加速-MEDUSA Linsight

LLM推理加速-Medusa uuuuu

【手撕LLM-Medusa】并行解碼范式: 美杜莎駕到, 通通閃開!! 小冬瓜AIGC

Blockwise Parallel Decoding 論文解讀 AI閑談

LLM 投機解碼 & 美杜莎(Medusa)實現(xiàn) AI閑談

https://sites.google.com/view/medusa-llm

https://github.com/FasterDecoding/Medusa

百川 Clover:優(yōu)于 Medusa 的投機采樣 AI閑談

[2405.00263] Clover: Regressive Lightweight Speculative Decoding with Sequential Knowledge

Hydra: Sequentially-Dependent Draft Heads for Medusa Decoding 灰瞳六分儀

Hydra: Sequentially-Dependent Draft Heads for Medusa Decoding

【論文解讀】Medusa:使用多個解碼頭并行預(yù)測后續(xù)多個token tomsheep

LLM推理加速(三): Medusa投機采樣 悅大

總結(jié)

以上是生活随笔為你收集整理的探秘Transformer系列之(31)--- Medusa的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

久久99久久99精品中文字幕 | 久久午夜夜伦鲁鲁片无码免费 | 亚洲自偷精品视频自拍 | 国产高清不卡无码视频 | 国产亲子乱弄免费视频 | 亚洲色欲久久久综合网东京热 | 久久久久久av无码免费看大片 | 日本一本二本三区免费 | 欧洲美熟女乱又伦 | 成人精品天堂一区二区三区 | 无遮无挡爽爽免费视频 | 亚洲 a v无 码免 费 成 人 a v | 骚片av蜜桃精品一区 | 中文精品无码中文字幕无码专区 | 午夜男女很黄的视频 | 国产超级va在线观看视频 | 人人妻人人澡人人爽人人精品浪潮 | 精品久久久久久人妻无码中文字幕 | 久久综合给合久久狠狠狠97色 | 水蜜桃亚洲一二三四在线 | 久久久婷婷五月亚洲97号色 | 亚洲va中文字幕无码久久不卡 | 久久午夜无码鲁丝片午夜精品 | 在线播放无码字幕亚洲 | av无码电影一区二区三区 | 国产成人精品优优av | 樱花草在线播放免费中文 | 国产精品igao视频网 | 午夜嘿嘿嘿影院 | 丰满人妻精品国产99aⅴ | 久久无码中文字幕免费影院蜜桃 | 无码av中文字幕免费放 | 午夜精品久久久内射近拍高清 | 亚洲综合伊人久久大杳蕉 | 国产无遮挡又黄又爽又色 | 国精产品一品二品国精品69xx | 少妇被黑人到高潮喷出白浆 | 成人无码精品一区二区三区 | 久久精品国产亚洲精品 | 青草视频在线播放 | 国产三级精品三级男人的天堂 | 国产精品无码一区二区三区不卡 | 午夜无码区在线观看 | 国产热a欧美热a在线视频 | 一区二区三区乱码在线 | 欧洲 | 国产精品美女久久久久av爽李琼 | 久久视频在线观看精品 | 成人免费视频视频在线观看 免费 | 少妇被粗大的猛进出69影院 | 国产精品久久久久久无码 | 亚洲欧美日韩成人高清在线一区 | 久久国语露脸国产精品电影 | 国产精品亚洲五月天高清 | 久久精品人妻少妇一区二区三区 | а天堂中文在线官网 | 午夜嘿嘿嘿影院 | 亚洲欧美国产精品专区久久 | 强伦人妻一区二区三区视频18 | 欧美丰满熟妇xxxx性ppx人交 | 丰满妇女强制高潮18xxxx | 国产亚洲欧美日韩亚洲中文色 | 黑人巨大精品欧美一区二区 | 天堂а√在线中文在线 | 国产内射爽爽大片视频社区在线 | 国色天香社区在线视频 | 亚洲综合在线一区二区三区 | аⅴ资源天堂资源库在线 | 欧美肥老太牲交大战 | 国产色视频一区二区三区 | 亚洲一区二区三区无码久久 | 国产亚洲精品久久久久久国模美 | 国产精品美女久久久网av | 老熟妇仑乱视频一区二区 | 麻花豆传媒剧国产免费mv在线 | 鲁一鲁av2019在线 | 亚洲成在人网站无码天堂 | 久久99精品国产麻豆 | 午夜精品一区二区三区的区别 | 久久精品国产日本波多野结衣 | 久久99热只有频精品8 | 国产精华av午夜在线观看 | 福利一区二区三区视频在线观看 | 疯狂三人交性欧美 | 丰满人妻精品国产99aⅴ | 又大又黄又粗又爽的免费视频 | 亚洲中文字幕在线无码一区二区 | 亚洲精品国产a久久久久久 | 51国偷自产一区二区三区 | 亚洲区欧美区综合区自拍区 | 免费人成在线视频无码 | 欧美老妇与禽交 | 久久精品无码一区二区三区 | 亚洲色偷偷男人的天堂 | 色诱久久久久综合网ywww | 女人被爽到呻吟gif动态图视看 | 97精品人妻一区二区三区香蕉 | 亚洲狠狠色丁香婷婷综合 | 九九热爱视频精品 | 国产欧美精品一区二区三区 | 精品久久久无码中文字幕 | 久久人人爽人人爽人人片av高清 | 国产av人人夜夜澡人人爽麻豆 | 永久免费观看国产裸体美女 | 欧美国产亚洲日韩在线二区 | 亚洲狠狠色丁香婷婷综合 | 欧美 日韩 人妻 高清 中文 | 亚洲日韩av一区二区三区四区 | 久久久婷婷五月亚洲97号色 | 欧美阿v高清资源不卡在线播放 | 国产精品自产拍在线观看 | 国产精品理论片在线观看 | 日韩无码专区 | 又色又爽又黄的美女裸体网站 | 成人三级无码视频在线观看 | 暴力强奷在线播放无码 | av无码久久久久不卡免费网站 | 成人动漫在线观看 | 国产绳艺sm调教室论坛 | 欧美亚洲日韩国产人成在线播放 | 亚洲精品一区三区三区在线观看 | 成人影院yy111111在线观看 | 久久综合色之久久综合 | 免费人成网站视频在线观看 | 无码吃奶揉捏奶头高潮视频 | 西西人体www44rt大胆高清 | 亚洲精品无码人妻无码 | 日本一区二区三区免费高清 | 国产欧美精品一区二区三区 | 一本大道久久东京热无码av | 九九在线中文字幕无码 | 国产精品va在线观看无码 | 国产成人无码av片在线观看不卡 | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 国产亚洲精品久久久ai换 | 丰满岳乱妇在线观看中字无码 | 奇米影视888欧美在线观看 | 欧美国产亚洲日韩在线二区 | 久久久www成人免费毛片 | 国产精品久久久久久亚洲影视内衣 | 亚洲精品中文字幕乱码 | 永久免费精品精品永久-夜色 | 偷窥日本少妇撒尿chinese | 2019nv天堂香蕉在线观看 | 性欧美牲交在线视频 | 欧美日韩一区二区综合 | 免费无码肉片在线观看 | 激情亚洲一区国产精品 | 国产真实夫妇视频 | 国产精品亚洲一区二区三区喷水 | 国产真实乱对白精彩久久 | a在线观看免费网站大全 | 国产成人综合色在线观看网站 | 亚洲日韩av一区二区三区中文 | 大色综合色综合网站 | 无码毛片视频一区二区本码 | 熟女俱乐部五十路六十路av | 自拍偷自拍亚洲精品10p | 久久亚洲精品中文字幕无男同 | 男女下面进入的视频免费午夜 | 亚洲aⅴ无码成人网站国产app | 77777熟女视频在线观看 а天堂中文在线官网 | 无码人妻精品一区二区三区下载 | 国产成人精品优优av | 国产午夜无码视频在线观看 | 97无码免费人妻超级碰碰夜夜 | 蜜臀av在线观看 在线欧美精品一区二区三区 | 久久久久亚洲精品中文字幕 | 一本色道久久综合亚洲精品不卡 | 99精品视频在线观看免费 | 中文字幕乱码人妻无码久久 | 国产成人av免费观看 | 丝袜人妻一区二区三区 | 免费无码肉片在线观看 | 亚洲国产精品一区二区第一页 | 亚洲一区二区观看播放 | 亚洲区小说区激情区图片区 | 午夜精品久久久久久久久 | 久久综合给合久久狠狠狠97色 | 国产国产精品人在线视 | 精品久久久无码人妻字幂 | 国产69精品久久久久app下载 | 亚洲综合色区中文字幕 | 免费看男女做好爽好硬视频 | 国产熟妇另类久久久久 | a片在线免费观看 | 亚洲日韩中文字幕在线播放 | 蜜桃无码一区二区三区 | 日韩人妻无码一区二区三区久久99 | 国产亚洲精品久久久久久 | 黑人巨大精品欧美一区二区 | 在线播放免费人成毛片乱码 | 欧美xxxxx精品 | 色综合久久久久综合一本到桃花网 | 久久午夜无码鲁丝片秋霞 | 亚洲va欧美va天堂v国产综合 | 一二三四在线观看免费视频 | 久久国产精品偷任你爽任你 | 亚洲毛片av日韩av无码 | 亚洲欧美综合区丁香五月小说 | 亚洲精品一区二区三区大桥未久 | 日韩精品一区二区av在线 | 无码帝国www无码专区色综合 | 乱码av麻豆丝袜熟女系列 | 亚洲色在线无码国产精品不卡 | 双乳奶水饱满少妇呻吟 | 国产精品香蕉在线观看 | 久久无码中文字幕免费影院蜜桃 | 亚洲欧洲无卡二区视頻 | 永久免费观看国产裸体美女 | 啦啦啦www在线观看免费视频 | 在线看片无码永久免费视频 | 亚洲精品一区三区三区在线观看 | 色婷婷av一区二区三区之红樱桃 | 熟女少妇在线视频播放 | 欧美亚洲国产一区二区三区 | 中文字幕亚洲情99在线 | av无码电影一区二区三区 | 国产又爽又猛又粗的视频a片 | 亚洲毛片av日韩av无码 | 欧美日韩色另类综合 | 国产特级毛片aaaaaaa高清 | 鲁大师影院在线观看 | 国内老熟妇对白xxxxhd | 人人超人人超碰超国产 | 一区二区三区高清视频一 | 中文字幕乱码人妻无码久久 | 熟妇人妻中文av无码 | 俺去俺来也在线www色官网 | 日本一卡2卡3卡四卡精品网站 | 亚洲自偷自偷在线制服 | 午夜福利试看120秒体验区 | 亚洲色在线无码国产精品不卡 | 四虎国产精品免费久久 | 波多野结衣高清一区二区三区 | 亚洲乱码国产乱码精品精 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 一二三四社区在线中文视频 | 日韩欧美中文字幕公布 | 色偷偷人人澡人人爽人人模 | 亚洲精品久久久久久久久久久 | 特级做a爰片毛片免费69 | 一本大道久久东京热无码av | 少妇被粗大的猛进出69影院 | 久久 国产 尿 小便 嘘嘘 | 国产一区二区三区精品视频 | 国产精品对白交换视频 | 国产av一区二区精品久久凹凸 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 伊人色综合久久天天小片 | 国产莉萝无码av在线播放 | 十八禁真人啪啪免费网站 | 内射后入在线观看一区 | 天天综合网天天综合色 | 国产手机在线αⅴ片无码观看 | 又粗又大又硬又长又爽 | 无码吃奶揉捏奶头高潮视频 | 亚洲小说春色综合另类 | 精品国产一区二区三区四区在线看 | 2020最新国产自产精品 | 国产成人精品视频ⅴa片软件竹菊 | 中文字幕av日韩精品一区二区 | 成人性做爰aaa片免费看不忠 | 亚洲精品综合一区二区三区在线 | 丰满少妇高潮惨叫视频 | 亚洲日本一区二区三区在线 | 久久综合给合久久狠狠狠97色 | 亚洲成av人在线观看网址 | 国产精品视频免费播放 | 大肉大捧一进一出视频出来呀 | 国产av一区二区精品久久凹凸 | 国产精品久久福利网站 | 国产成人精品三级麻豆 | 久久国产自偷自偷免费一区调 | 午夜福利不卡在线视频 | 波多野结衣乳巨码无在线观看 | 欧美 亚洲 国产 另类 | 日本饥渴人妻欲求不满 | 熟女俱乐部五十路六十路av | 国产精品亚洲综合色区韩国 | 精品无码av一区二区三区 | 亚洲综合精品香蕉久久网 | 老熟妇乱子伦牲交视频 | 久久97精品久久久久久久不卡 | 成人影院yy111111在线观看 | 双乳奶水饱满少妇呻吟 | 一本一道久久综合久久 | 精品日本一区二区三区在线观看 | 久久精品人人做人人综合试看 | 免费无码av一区二区 | 精品国产青草久久久久福利 | 无人区乱码一区二区三区 | 久久午夜无码鲁丝片 | 少妇激情av一区二区 | 性史性农村dvd毛片 | 亚洲欧美日韩国产精品一区二区 | 成人欧美一区二区三区黑人免费 | 亚洲の无码国产の无码步美 | 国产麻豆精品精东影业av网站 | 国产高清av在线播放 | 欧美阿v高清资源不卡在线播放 | 人妻少妇精品久久 | 国产成人综合在线女婷五月99播放 | 成人av无码一区二区三区 | 成人欧美一区二区三区黑人 | 午夜成人1000部免费视频 | 内射后入在线观看一区 | 国产熟妇另类久久久久 | 亚洲精品一区二区三区婷婷月 | 亚洲熟妇色xxxxx亚洲 | 人人澡人人妻人人爽人人蜜桃 | 成人片黄网站色大片免费观看 | 思思久久99热只有频精品66 | 久久久久99精品成人片 | 99麻豆久久久国产精品免费 | 嫩b人妻精品一区二区三区 | 国产黑色丝袜在线播放 | 亚洲国产精品无码一区二区三区 | 人妻无码αv中文字幕久久琪琪布 | 国产成人精品一区二区在线小狼 | 国产精品久久久久久久9999 | 内射爽无广熟女亚洲 | 国产人妻精品一区二区三区 | 2019午夜福利不卡片在线 | 无码纯肉视频在线观看 | 国产在线精品一区二区三区直播 | 东京热一精品无码av | 一二三四社区在线中文视频 | 久久久久久av无码免费看大片 | av无码久久久久不卡免费网站 | 中文字幕乱码人妻二区三区 | 国产精品人妻一区二区三区四 | 久久无码专区国产精品s | 色欲av亚洲一区无码少妇 | 青春草在线视频免费观看 | 国产精品二区一区二区aⅴ污介绍 | 亚洲欧美精品伊人久久 | 精品成人av一区二区三区 | 无码av岛国片在线播放 | 成年美女黄网站色大免费全看 | 夜夜高潮次次欢爽av女 | 欧美怡红院免费全部视频 | 成人aaa片一区国产精品 | 亚洲狠狠色丁香婷婷综合 | 狂野欧美性猛xxxx乱大交 | 久久久久av无码免费网 | 两性色午夜视频免费播放 | 色诱久久久久综合网ywww | 亚洲国产精品一区二区第一页 | 欧美成人免费全部网站 | 偷窥日本少妇撒尿chinese | 中文字幕中文有码在线 | 国产国语老龄妇女a片 | 人妻aⅴ无码一区二区三区 | 色一情一乱一伦 | 女人被男人爽到呻吟的视频 | 亚洲经典千人经典日产 | 十八禁真人啪啪免费网站 | 精品久久久无码中文字幕 | 成熟女人特级毛片www免费 | 伊人久久大香线蕉亚洲 | 亚洲乱码日产精品bd | 久久精品中文字幕大胸 | 99riav国产精品视频 | 久久婷婷五月综合色国产香蕉 | 亚洲一区av无码专区在线观看 | 日本va欧美va欧美va精品 | 日产国产精品亚洲系列 | 少妇人妻大乳在线视频 | 国产人妻久久精品二区三区老狼 | 久久无码中文字幕免费影院蜜桃 | 精品厕所偷拍各类美女tp嘘嘘 | 无码国产乱人伦偷精品视频 | 亚洲va欧美va天堂v国产综合 | 青青久在线视频免费观看 | 漂亮人妻洗澡被公强 日日躁 | 草草网站影院白丝内射 | 男人的天堂2018无码 | 亚洲国产精品久久久久久 | 男人的天堂2018无码 | 荡女精品导航 | 国产美女精品一区二区三区 | 亚洲成a人片在线观看无码3d | 露脸叫床粗话东北少妇 | 捆绑白丝粉色jk震动捧喷白浆 | 国产肉丝袜在线观看 | 99精品无人区乱码1区2区3区 | 最新国产麻豆aⅴ精品无码 | 中文无码伦av中文字幕 | 伊人久久大香线蕉亚洲 | 丰满人妻翻云覆雨呻吟视频 | 日韩 欧美 动漫 国产 制服 | 荫蒂被男人添的好舒服爽免费视频 | 成人一区二区免费视频 | 久久久亚洲欧洲日产国码αv | 日日摸日日碰夜夜爽av | 欧美成人家庭影院 | 永久免费观看国产裸体美女 | 狠狠综合久久久久综合网 | 国产九九九九九九九a片 | 日日橹狠狠爱欧美视频 | 久久亚洲精品成人无码 | 欧美国产日产一区二区 | 久久国产36精品色熟妇 | 欧美成人高清在线播放 | 女人被男人爽到呻吟的视频 | 131美女爱做视频 | 永久黄网站色视频免费直播 | 午夜福利试看120秒体验区 | 人妻无码久久精品人妻 | 日本精品人妻无码免费大全 | 任你躁在线精品免费 | 中文字幕无码人妻少妇免费 | 巨爆乳无码视频在线观看 | 亚洲の无码国产の无码步美 | 国产精品a成v人在线播放 | 久久精品国产日本波多野结衣 | 俺去俺来也在线www色官网 | 性欧美大战久久久久久久 | 人妻夜夜爽天天爽三区 | 亚洲欧美中文字幕5发布 | 国产精品美女久久久久av爽李琼 | 国产sm调教视频在线观看 | 成人精品一区二区三区中文字幕 | 少妇性l交大片 | 午夜成人1000部免费视频 | 国产sm调教视频在线观看 | 白嫩日本少妇做爰 | 精品成人av一区二区三区 | 亚洲精品国产精品乱码视色 | 女人和拘做爰正片视频 | 荫蒂添的好舒服视频囗交 | 激情国产av做激情国产爱 | 扒开双腿疯狂进出爽爽爽视频 | 性开放的女人aaa片 | 国语精品一区二区三区 | 久久久久久a亚洲欧洲av冫 | 免费人成在线观看网站 | 国产精品福利视频导航 | 未满小14洗澡无码视频网站 | 国产凸凹视频一区二区 | 性色av无码免费一区二区三区 | 免费网站看v片在线18禁无码 | 日本一本二本三区免费 | 国产无套内射久久久国产 | a片免费视频在线观看 | 欧美一区二区三区视频在线观看 | 国产内射爽爽大片视频社区在线 | 国产免费久久精品国产传媒 | 中文字幕无码av激情不卡 | 又粗又大又硬又长又爽 | 精品久久久久久人妻无码中文字幕 | aⅴ亚洲 日韩 色 图网站 播放 | 国产亚洲精品久久久闺蜜 | 成人欧美一区二区三区黑人 | 国产成人无码av一区二区 | 国产乱人伦av在线无码 | 狠狠色噜噜狠狠狠7777奇米 | 欧洲精品码一区二区三区免费看 | 欧美日韩一区二区免费视频 | 久久99久久99精品中文字幕 | 国内少妇偷人精品视频 | 中文字幕无码人妻少妇免费 | 成人无码精品1区2区3区免费看 | 亚洲精品久久久久avwww潮水 | 高潮喷水的毛片 | 日韩精品乱码av一区二区 | 欧美三级不卡在线观看 | 精品人妻人人做人人爽 | 99久久久无码国产精品免费 | 国产无套内射久久久国产 | 精品人妻人人做人人爽 | 久久国产精品萌白酱免费 | 荫蒂添的好舒服视频囗交 | 人妻少妇精品视频专区 | 精品一二三区久久aaa片 | 欧美精品无码一区二区三区 | 国产在线aaa片一区二区99 | 午夜无码区在线观看 | 狂野欧美性猛交免费视频 | 精品国产aⅴ无码一区二区 | 亚洲精品中文字幕久久久久 | 蜜臀av无码人妻精品 | 亚洲日韩av一区二区三区四区 | 一本精品99久久精品77 | 无码一区二区三区在线观看 | 无码精品国产va在线观看dvd | 国产亚洲精品久久久ai换 | 免费无码一区二区三区蜜桃大 | 久久久精品国产sm最大网站 | 免费无码一区二区三区蜜桃大 | 76少妇精品导航 | 日产精品99久久久久久 | 少妇愉情理伦片bd | 亚洲区小说区激情区图片区 | 一本久久a久久精品亚洲 | 狂野欧美性猛交免费视频 | 野外少妇愉情中文字幕 | 人妻有码中文字幕在线 | 在线亚洲高清揄拍自拍一品区 | 成人无码精品1区2区3区免费看 | 好爽又高潮了毛片免费下载 | 性欧美牲交在线视频 | 中文字幕无码av激情不卡 | 国产精品国产三级国产专播 | 色综合久久久无码中文字幕 | 国产在线aaa片一区二区99 | 国内揄拍国内精品少妇国语 | 少妇激情av一区二区 | 波多野结衣 黑人 | 国产女主播喷水视频在线观看 | 野外少妇愉情中文字幕 | aⅴ在线视频男人的天堂 | 国产绳艺sm调教室论坛 | 亚洲乱码国产乱码精品精 | 亚洲第一网站男人都懂 | 久久这里只有精品视频9 | 中文字幕av日韩精品一区二区 | 亚洲精品久久久久久久久久久 | 色婷婷av一区二区三区之红樱桃 | 亚洲精品国偷拍自产在线观看蜜桃 | 国内少妇偷人精品视频免费 | 日韩欧美中文字幕在线三区 | 亚洲成av人片在线观看无码不卡 | 狠狠色色综合网站 | 日韩欧美中文字幕在线三区 | 久久久久久久久蜜桃 | 久久精品国产99精品亚洲 | 无码中文字幕色专区 | 日本大香伊一区二区三区 | 亚洲国产精品一区二区第一页 | 欧美丰满熟妇xxxx性ppx人交 | 亚洲人亚洲人成电影网站色 | 日日摸日日碰夜夜爽av | 人妻尝试又大又粗久久 | 天天躁日日躁狠狠躁免费麻豆 | 国产人妻人伦精品 | 成人av无码一区二区三区 | 99久久精品国产一区二区蜜芽 | 久久久久久久女国产乱让韩 | 国产在线精品一区二区高清不卡 | 天天爽夜夜爽夜夜爽 | 天天av天天av天天透 | 国产成人无码区免费内射一片色欲 | 亚洲精品国偷拍自产在线观看蜜桃 | 国产99久久精品一区二区 | 国产亚洲日韩欧美另类第八页 | 国产69精品久久久久app下载 | 免费观看又污又黄的网站 | 日本大乳高潮视频在线观看 | 中国女人内谢69xxxx | 色婷婷av一区二区三区之红樱桃 | 亚洲欧美国产精品久久 | 女人色极品影院 | 久久97精品久久久久久久不卡 | 99视频精品全部免费免费观看 | 成 人 网 站国产免费观看 | 国产精品久久久久无码av色戒 | 久久精品人人做人人综合试看 | 少妇高潮一区二区三区99 | 无码人妻丰满熟妇区五十路百度 | 色五月丁香五月综合五月 | 亚洲乱亚洲乱妇50p | 亚洲热妇无码av在线播放 | 国产精品美女久久久久av爽李琼 | www国产亚洲精品久久网站 | 国产亚洲日韩欧美另类第八页 | 成人精品视频一区二区 | 精品成在人线av无码免费看 | 国产真人无遮挡作爱免费视频 | 亚洲国产精品无码一区二区三区 | 久久精品国产99久久6动漫 | 日韩在线不卡免费视频一区 | 亚洲精品鲁一鲁一区二区三区 | 日韩精品无码一本二本三本色 | 国产午夜亚洲精品不卡下载 | 伊在人天堂亚洲香蕉精品区 | 男人和女人高潮免费网站 | 天天爽夜夜爽夜夜爽 | 成人性做爰aaa片免费看不忠 | 国产在线一区二区三区四区五区 | 国产农村妇女高潮大叫 | 中文毛片无遮挡高清免费 | av无码电影一区二区三区 | 亚洲色www成人永久网址 | 国产精品久久久久7777 | 亚洲无人区一区二区三区 | 人人妻人人澡人人爽人人精品 | 国产无套粉嫩白浆在线 | 欧美激情综合亚洲一二区 | 精品 日韩 国产 欧美 视频 | 亚洲一区二区三区含羞草 | 亚洲区小说区激情区图片区 | 性做久久久久久久久 | 内射后入在线观看一区 | 成 人 网 站国产免费观看 | 国内揄拍国内精品少妇国语 | 无码人妻av免费一区二区三区 | 55夜色66夜色国产精品视频 | 国产人妻人伦精品1国产丝袜 | 国产真实乱对白精彩久久 | 无码纯肉视频在线观看 | 99视频精品全部免费免费观看 | 4hu四虎永久在线观看 | 高清国产亚洲精品自在久久 | 亚洲国产日韩a在线播放 | 四虎影视成人永久免费观看视频 | 精品乱码久久久久久久 | 亚洲乱码国产乱码精品精 | 又大又硬又黄的免费视频 | 嫩b人妻精品一区二区三区 | 人妻无码αv中文字幕久久琪琪布 | 亚洲国产精品美女久久久久 | 亚洲国产欧美日韩精品一区二区三区 | 亚洲国产欧美国产综合一区 | 99精品国产综合久久久久五月天 | 蜜桃视频插满18在线观看 | 精品无码成人片一区二区98 | 亚洲aⅴ无码成人网站国产app | 色欲久久久天天天综合网精品 | 日产国产精品亚洲系列 | 欧美午夜特黄aaaaaa片 | 国产免费观看黄av片 | 国产成人综合在线女婷五月99播放 | 国产办公室秘书无码精品99 | 内射巨臀欧美在线视频 | 亚洲综合在线一区二区三区 | 亚洲日韩乱码中文无码蜜桃臀网站 | 99久久人妻精品免费一区 | 亚洲成av人影院在线观看 | 粗大的内捧猛烈进出视频 | 婷婷五月综合激情中文字幕 | 国产精品视频免费播放 | 亚洲人成网站在线播放942 | 波多野结衣av在线观看 | 无套内射视频囯产 | 国产人妻精品一区二区三区 | 精品亚洲韩国一区二区三区 | 久久精品视频在线看15 | 国产精品高潮呻吟av久久 | 宝宝好涨水快流出来免费视频 | 精品人人妻人人澡人人爽人人 | 美女张开腿让人桶 | 成人免费视频一区二区 | 亚洲欧美日韩综合久久久 | 少妇性俱乐部纵欲狂欢电影 | 久激情内射婷内射蜜桃人妖 | 亚洲中文无码av永久不收费 | 亚洲午夜久久久影院 | 粉嫩少妇内射浓精videos | 一区二区传媒有限公司 | 国产做国产爱免费视频 | 无套内谢老熟女 | 国产偷抇久久精品a片69 | 欧美性猛交xxxx富婆 | 国产激情无码一区二区 | 亚洲大尺度无码无码专区 | 无码毛片视频一区二区本码 | 国产内射老熟女aaaa | 亚洲 激情 小说 另类 欧美 | 国产精品人人爽人人做我的可爱 | 亚洲s色大片在线观看 | 亚洲成av人影院在线观看 | 久久精品国产一区二区三区肥胖 | 日本又色又爽又黄的a片18禁 | 曰本女人与公拘交酡免费视频 | 免费国产成人高清在线观看网站 | 欧美熟妇另类久久久久久多毛 | 妺妺窝人体色www婷婷 | 偷窥村妇洗澡毛毛多 | 99精品久久毛片a片 | 国产香蕉尹人视频在线 | 亚洲午夜福利在线观看 | 国产黑色丝袜在线播放 | 人人妻人人澡人人爽精品欧美 | 国产av人人夜夜澡人人爽麻豆 | 亚洲va欧美va天堂v国产综合 | 爽爽影院免费观看 | 国产精品美女久久久 | 日韩精品a片一区二区三区妖精 | 久久97精品久久久久久久不卡 | 四虎4hu永久免费 | 亚洲色大成网站www国产 | 熟女少妇在线视频播放 | 久热国产vs视频在线观看 | 日韩成人一区二区三区在线观看 | 亚洲欧洲日本无在线码 | 国产午夜无码视频在线观看 | 日本护士xxxxhd少妇 | 少妇邻居内射在线 | 国产亚洲欧美日韩亚洲中文色 | 亚洲毛片av日韩av无码 | 国产午夜福利亚洲第一 | 国产黄在线观看免费观看不卡 | 国产精品久久久一区二区三区 | 丰满少妇高潮惨叫视频 | 午夜免费福利小电影 | 精品国产一区二区三区av 性色 | 国产特级毛片aaaaaa高潮流水 | 欧美性生交活xxxxxdddd | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 中文精品无码中文字幕无码专区 | 国产超碰人人爽人人做人人添 | 小鲜肉自慰网站xnxx | 亚洲 日韩 欧美 成人 在线观看 | 中文字幕久久久久人妻 | 日韩在线不卡免费视频一区 | 成人三级无码视频在线观看 | 97无码免费人妻超级碰碰夜夜 | 夜先锋av资源网站 | 精品无码一区二区三区爱欲 | 欧美乱妇无乱码大黄a片 | 超碰97人人射妻 | 又湿又紧又大又爽a视频国产 | 久久精品中文字幕大胸 | 一区二区传媒有限公司 | 少妇久久久久久人妻无码 | 人妻体内射精一区二区三四 | 日本精品人妻无码免费大全 | 最新版天堂资源中文官网 | 奇米影视888欧美在线观看 | 天堂亚洲2017在线观看 | 国产精品永久免费视频 | 久久精品国产一区二区三区 | 日韩亚洲欧美精品综合 | 亚洲熟妇色xxxxx欧美老妇 | 亚洲国产欧美日韩精品一区二区三区 | 在线精品国产一区二区三区 | 国产精品久久久久无码av色戒 | 国产精品亚洲lv粉色 | 奇米影视7777久久精品人人爽 | 国产成人精品久久亚洲高清不卡 | 老熟女重囗味hdxx69 | 久久精品国产一区二区三区肥胖 | 狠狠色丁香久久婷婷综合五月 | 又大又硬又爽免费视频 | 中国女人内谢69xxxxxa片 | 精品无码一区二区三区的天堂 | 97色伦图片97综合影院 | 天天躁夜夜躁狠狠是什么心态 | 亚洲综合久久一区二区 | 无码福利日韩神码福利片 | 性色欲网站人妻丰满中文久久不卡 | 国产偷国产偷精品高清尤物 | 美女扒开屁股让男人桶 | 国内少妇偷人精品视频免费 | 国产人成高清在线视频99最全资源 | 老司机亚洲精品影院 | 好男人www社区 | 窝窝午夜理论片影院 | 亚洲gv猛男gv无码男同 | 色一情一乱一伦一区二区三欧美 | 丰满少妇熟乱xxxxx视频 | 亚洲欧美色中文字幕在线 | 亚洲精品美女久久久久久久 | 99er热精品视频 | 成人综合网亚洲伊人 | 久久精品中文字幕大胸 | 久久久www成人免费毛片 | 久久久久久久女国产乱让韩 | 国产深夜福利视频在线 | 国产午夜无码精品免费看 | 窝窝午夜理论片影院 | 国产亲子乱弄免费视频 | 成人aaa片一区国产精品 | 少妇无码一区二区二三区 | 国产无遮挡吃胸膜奶免费看 | 亚洲色成人中文字幕网站 | 国产9 9在线 | 中文 | 强辱丰满人妻hd中文字幕 | 中国女人内谢69xxxx | 日本成熟视频免费视频 | 四十如虎的丰满熟妇啪啪 | 99久久亚洲精品无码毛片 | 亚洲小说春色综合另类 | 男女作爱免费网站 | 欧美xxxx黑人又粗又长 | 在线观看国产一区二区三区 | 久久午夜无码鲁丝片午夜精品 | 久精品国产欧美亚洲色aⅴ大片 | 国产成人无码av片在线观看不卡 | 波多野42部无码喷潮在线 | 午夜不卡av免费 一本久久a久久精品vr综合 | 人妻aⅴ无码一区二区三区 | 天天躁日日躁狠狠躁免费麻豆 | 色情久久久av熟女人妻网站 | 人妻无码久久精品人妻 | 夜夜影院未满十八勿进 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 国产又爽又黄又刺激的视频 | 中文字幕无码热在线视频 | 成人毛片一区二区 | 97无码免费人妻超级碰碰夜夜 | 天堂在线观看www | 亚洲综合无码久久精品综合 | 丰满肥臀大屁股熟妇激情视频 | 亚洲精品成人福利网站 | 亚洲人成网站色7799 | 老司机亚洲精品影院 | 亚洲精品久久久久久一区二区 | 国产av无码专区亚洲a∨毛片 | 欧美野外疯狂做受xxxx高潮 | 无码中文字幕色专区 | 国产两女互慰高潮视频在线观看 | 国产无套粉嫩白浆在线 | 日本精品人妻无码77777 天堂一区人妻无码 | 亚洲va中文字幕无码久久不卡 | 国产精品久久久久影院嫩草 | 一二三四在线观看免费视频 | 对白脏话肉麻粗话av | 欧美人与牲动交xxxx | 亚洲欧美色中文字幕在线 | 国产av无码专区亚洲a∨毛片 | 樱花草在线社区www | 精品少妇爆乳无码av无码专区 | 亚洲の无码国产の无码影院 | 水蜜桃色314在线观看 | 国产无套内射久久久国产 | 丰满人妻精品国产99aⅴ | 久久99热只有频精品8 | 久久99国产综合精品 | 欧美国产日产一区二区 | 国产莉萝无码av在线播放 | 色 综合 欧美 亚洲 国产 | 亚洲阿v天堂在线 | 婷婷色婷婷开心五月四房播播 | 又大又黄又粗又爽的免费视频 | 300部国产真实乱 | 日日麻批免费40分钟无码 | 欧美成人高清在线播放 | 精品无码一区二区三区爱欲 | 免费观看黄网站 | www国产精品内射老师 | 久久精品人人做人人综合 | 亚洲色大成网站www | 中文字幕乱码人妻二区三区 | 超碰97人人做人人爱少妇 | 婷婷六月久久综合丁香 | 国产午夜视频在线观看 | 欧美性生交活xxxxxdddd | 性啪啪chinese东北女人 | 性色欲网站人妻丰满中文久久不卡 | 香港三级日本三级妇三级 | 99精品无人区乱码1区2区3区 | 夜夜夜高潮夜夜爽夜夜爰爰 | 国产午夜亚洲精品不卡下载 | 亚洲精品国偷拍自产在线观看蜜桃 | 亚洲欧美中文字幕5发布 | 麻豆av传媒蜜桃天美传媒 | 国产网红无码精品视频 | 亚拍精品一区二区三区探花 | 国产精品美女久久久网av | 欧美 丝袜 自拍 制服 另类 | 中文字幕人成乱码熟女app | 国产黄在线观看免费观看不卡 | 久久久久成人精品免费播放动漫 | 四十如虎的丰满熟妇啪啪 | 国产成人无码午夜视频在线观看 | 激情五月综合色婷婷一区二区 | 午夜嘿嘿嘿影院 | 黑人巨大精品欧美黑寡妇 | 久久综合给久久狠狠97色 | 亚洲国产av美女网站 | 亚洲男人av香蕉爽爽爽爽 | 一本久久a久久精品亚洲 | 国产女主播喷水视频在线观看 | 性欧美疯狂xxxxbbbb | 无码纯肉视频在线观看 | 色情久久久av熟女人妻网站 | 狠狠色丁香久久婷婷综合五月 | 久久久久se色偷偷亚洲精品av | 国产综合在线观看 | 国产精品久久久久影院嫩草 | 日韩av无码一区二区三区 | 久久久精品国产sm最大网站 | 欧美日韩一区二区综合 | 亚洲男女内射在线播放 | 欧美人与牲动交xxxx | 免费男性肉肉影院 | 亚洲日韩av片在线观看 | 熟妇人妻中文av无码 | 中文精品久久久久人妻不卡 | 免费无码一区二区三区蜜桃大 | 亚洲欧美国产精品久久 | 亚洲精品午夜国产va久久成人 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 天天躁日日躁狠狠躁免费麻豆 | 亚洲精品午夜无码电影网 | 中文无码成人免费视频在线观看 | 亚洲欧美色中文字幕在线 | 奇米影视7777久久精品 | 偷窥日本少妇撒尿chinese | 亚洲国产欧美在线成人 | 国产精品美女久久久久av爽李琼 | 欧美性猛交内射兽交老熟妇 | 国产亚洲日韩欧美另类第八页 | 国产精品怡红院永久免费 | 麻豆果冻传媒2021精品传媒一区下载 | 国产精品.xx视频.xxtv | 久久午夜夜伦鲁鲁片无码免费 | 天天摸天天透天天添 | 欧美xxxx黑人又粗又长 | 亚洲综合色区中文字幕 | 一二三四在线观看免费视频 | 日日摸日日碰夜夜爽av | 中文字幕无码日韩专区 | √天堂资源地址中文在线 | 男人扒开女人内裤强吻桶进去 | 无码任你躁久久久久久久 | 黑人大群体交免费视频 | 国产舌乚八伦偷品w中 | 黑森林福利视频导航 | 久久精品国产一区二区三区肥胖 | 三上悠亚人妻中文字幕在线 | 国内老熟妇对白xxxxhd | 国产av剧情md精品麻豆 | 亚洲一区二区三区国产精华液 | 欧美黑人性暴力猛交喷水 | 伊人久久大香线蕉av一区二区 | 日本乱人伦片中文三区 | 人人妻人人澡人人爽欧美精品 | 麻豆国产人妻欲求不满谁演的 | 无码精品国产va在线观看dvd | 小鲜肉自慰网站xnxx | 性啪啪chinese东北女人 | 中文字幕无码日韩专区 | 国产综合在线观看 | 色婷婷香蕉在线一区二区 | 98国产精品综合一区二区三区 | 丰满人妻被黑人猛烈进入 | 久久久久人妻一区精品色欧美 | 成人综合网亚洲伊人 | 亚洲精品久久久久久一区二区 | 久久 国产 尿 小便 嘘嘘 | 欧美zoozzooz性欧美 | 亚洲色欲色欲欲www在线 | 国产国产精品人在线视 | 76少妇精品导航 | 天天摸天天碰天天添 | 人妻夜夜爽天天爽三区 | 中国女人内谢69xxxx | 亚洲成a人片在线观看日本 | 国产成人精品一区二区在线小狼 | 国产三级久久久精品麻豆三级 | 波多野结衣高清一区二区三区 | 男人的天堂2018无码 | 无码纯肉视频在线观看 | 呦交小u女精品视频 | 牲欲强的熟妇农村老妇女 | 国产免费久久久久久无码 | 国产亚洲精品久久久闺蜜 | a在线亚洲男人的天堂 | 国产成人精品一区二区在线小狼 | 色婷婷欧美在线播放内射 | 无码福利日韩神码福利片 | 无码毛片视频一区二区本码 | 九九综合va免费看 | 久久亚洲精品成人无码 | 亚洲国产精品无码一区二区三区 | 天天拍夜夜添久久精品 | 爆乳一区二区三区无码 | 欧美人与动性行为视频 | 日韩av无码一区二区三区 | 九九久久精品国产免费看小说 | 色窝窝无码一区二区三区色欲 | 亚洲爆乳无码专区 | 熟女体下毛毛黑森林 | 特大黑人娇小亚洲女 | 精品无码一区二区三区爱欲 | 自拍偷自拍亚洲精品10p | 精品久久8x国产免费观看 | 亚洲码国产精品高潮在线 | 久久综合色之久久综合 | 乌克兰少妇性做爰 | 牛和人交xxxx欧美 | 欧美喷潮久久久xxxxx | 特级做a爰片毛片免费69 | 日本丰满护士爆乳xxxx | 国产又爽又黄又刺激的视频 | 六十路熟妇乱子伦 | 亚洲人成网站在线播放942 | 成人无码视频在线观看网站 | 亚洲精品久久久久久一区二区 | 国产真实伦对白全集 | 成年女人永久免费看片 | 疯狂三人交性欧美 | 久久精品国产大片免费观看 | 成人女人看片免费视频放人 | 国产做国产爱免费视频 | 亚洲色大成网站www国产 | 国产精品丝袜黑色高跟鞋 | 精品国产精品久久一区免费式 | 激情内射亚州一区二区三区爱妻 | 四虎影视成人永久免费观看视频 | 亚洲精品中文字幕 | 性生交大片免费看女人按摩摩 | 一本久久伊人热热精品中文字幕 | 亚洲午夜久久久影院 | 色婷婷香蕉在线一区二区 | 欧美精品无码一区二区三区 | 国产亚洲人成a在线v网站 | 人人妻人人澡人人爽欧美一区九九 | 日本精品久久久久中文字幕 | 亚洲第一无码av无码专区 | 成在人线av无码免观看麻豆 | 亚洲精品久久久久久久久久久 | 精品久久久无码中文字幕 | 国产一区二区三区日韩精品 | 波多野结衣一区二区三区av免费 | 色欲久久久天天天综合网精品 | 99精品国产综合久久久久五月天 | 中文字幕乱妇无码av在线 | 国产亚洲精品久久久久久 | 无套内谢的新婚少妇国语播放 | 欧美大屁股xxxxhd黑色 | 色噜噜亚洲男人的天堂 | 中文字幕人妻无码一区二区三区 | 国产精品亚洲а∨无码播放麻豆 | 久久精品中文字幕大胸 | 色老头在线一区二区三区 | 无码吃奶揉捏奶头高潮视频 | 国产卡一卡二卡三 | 香港三级日本三级妇三级 | 国产乱人伦偷精品视频 | 国产片av国语在线观看 | 国产电影无码午夜在线播放 | 国产精品va在线播放 | 日韩av无码中文无码电影 | 国产精品无码永久免费888 | 亚洲经典千人经典日产 | 中文字幕乱码中文乱码51精品 | 欧美性生交xxxxx久久久 | 国产三级久久久精品麻豆三级 | 国产乱码精品一品二品 | 搡女人真爽免费视频大全 | 久久久久国色av免费观看性色 | 色老头在线一区二区三区 | 国产一区二区三区四区五区加勒比 | 国产亚洲欧美在线专区 | 人妻体内射精一区二区三四 | 亚洲中文无码av永久不收费 | 东京一本一道一二三区 | 亚洲 欧美 激情 小说 另类 | 亚洲欧美日韩综合久久久 | 麻豆国产97在线 | 欧洲 | 久久久成人毛片无码 | 精品人妻中文字幕有码在线 | 国产另类ts人妖一区二区 | av无码久久久久不卡免费网站 | 亚无码乱人伦一区二区 | 亚洲中文字幕va福利 | 色综合天天综合狠狠爱 | 欧美xxxx黑人又粗又长 | 水蜜桃亚洲一二三四在线 | 黑人粗大猛烈进出高潮视频 | 国产熟妇高潮叫床视频播放 | 强辱丰满人妻hd中文字幕 | 精品午夜福利在线观看 | 黑人玩弄人妻中文在线 | 国产成人亚洲综合无码 | 人妻人人添人妻人人爱 | 人妻有码中文字幕在线 | 国产猛烈高潮尖叫视频免费 | 在线精品国产一区二区三区 | 国产又爽又猛又粗的视频a片 | 人人爽人人爽人人片av亚洲 | 人人妻人人澡人人爽欧美一区九九 | 国产精品视频免费播放 | 国产av一区二区三区最新精品 | 国产无遮挡吃胸膜奶免费看 | 亚洲精品鲁一鲁一区二区三区 | 亚洲精品国产品国语在线观看 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 色综合视频一区二区三区 | 久久久久国色av免费观看性色 | 美女黄网站人色视频免费国产 | 久久精品99久久香蕉国产色戒 | 丝袜 中出 制服 人妻 美腿 | www国产精品内射老师 | 久久99精品国产.久久久久 | 久青草影院在线观看国产 | 国产艳妇av在线观看果冻传媒 | 国产精品丝袜黑色高跟鞋 | 荫蒂被男人添的好舒服爽免费视频 | 东北女人啪啪对白 | 97精品人妻一区二区三区香蕉 | 久久久久久九九精品久 | 久久精品人人做人人综合试看 | 亚洲色欲久久久综合网东京热 | 中文字幕日韩精品一区二区三区 | 日本熟妇人妻xxxxx人hd | 久久久久99精品国产片 | 日本熟妇浓毛 | 国产精品二区一区二区aⅴ污介绍 | 日韩精品无码一本二本三本色 | аⅴ资源天堂资源库在线 | 亚洲毛片av日韩av无码 | 久久精品人妻少妇一区二区三区 | 亚洲色www成人永久网址 | www成人国产高清内射 | 亚洲春色在线视频 | 精品一区二区三区波多野结衣 | 欧美第一黄网免费网站 | 亚洲欧美日韩综合久久久 | 一个人看的www免费视频在线观看 | 午夜时刻免费入口 | 国内少妇偷人精品视频免费 | 中文字幕+乱码+中文字幕一区 | 性生交大片免费看女人按摩摩 | 爆乳一区二区三区无码 | 亚洲日本va午夜在线电影 | ass日本丰满熟妇pics | 精品国精品国产自在久国产87 | 国产黄在线观看免费观看不卡 | 毛片内射-百度 | 国产精品多人p群无码 | 国产真实乱对白精彩久久 | 国产亚洲欧美在线专区 | 亚洲精品成人av在线 | 无码精品国产va在线观看dvd | 亚洲人成网站在线播放942 | 99视频精品全部免费免费观看 | 久久久av男人的天堂 | 无码一区二区三区在线观看 | 色 综合 欧美 亚洲 国产 | 麻豆md0077饥渴少妇 | 亲嘴扒胸摸屁股激烈网站 | 亚洲va中文字幕无码久久不卡 | 欧美老妇交乱视频在线观看 | 国产亚洲精品久久久久久久 | 国产成人精品三级麻豆 | 中文字幕av无码一区二区三区电影 | 在线 国产 欧美 亚洲 天堂 | 内射老妇bbwx0c0ck | 最新国产麻豆aⅴ精品无码 | 国产九九九九九九九a片 | 日本丰满熟妇videos | 免费无码午夜福利片69 | 欧美三级不卡在线观看 | 特黄特色大片免费播放器图片 | 日日噜噜噜噜夜夜爽亚洲精品 | 丝袜足控一区二区三区 | 中文字幕人妻无码一夲道 | 亚拍精品一区二区三区探花 | 无遮无挡爽爽免费视频 | 久久亚洲日韩精品一区二区三区 | 久久久中文久久久无码 | 日本一区二区三区免费高清 | 2020久久香蕉国产线看观看 | 中文字幕无码人妻少妇免费 | 久久亚洲精品成人无码 | 人妻aⅴ无码一区二区三区 | 精品成人av一区二区三区 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 丝袜足控一区二区三区 | 自拍偷自拍亚洲精品被多人伦好爽 | 性色欲网站人妻丰满中文久久不卡 | 丰满肥臀大屁股熟妇激情视频 | 成人片黄网站色大片免费观看 | 日本一区二区三区免费高清 | 亚洲日韩中文字幕在线播放 | 国产 精品 自在自线 | 精品成在人线av无码免费看 | 国产精品对白交换视频 | 国产suv精品一区二区五 | 无码精品人妻一区二区三区av | 国产高潮视频在线观看 | 老司机亚洲精品影院无码 | www国产亚洲精品久久久日本 | 中文字幕av无码一区二区三区电影 | 国产精品久久久久久久9999 | 在线精品国产一区二区三区 | 一本久久a久久精品亚洲 | 人妻与老人中文字幕 | 免费无码av一区二区 | 精品国精品国产自在久国产87 | 精品日本一区二区三区在线观看 | 亚洲精品国产精品乱码不卡 | 伊人久久大香线蕉av一区二区 | av无码久久久久不卡免费网站 | 亚洲国产成人a精品不卡在线 | 久久久久亚洲精品中文字幕 | 狠狠色噜噜狠狠狠狠7777米奇 | 国产国语老龄妇女a片 | 久久久www成人免费毛片 | 成人三级无码视频在线观看 | 国产精品久久久久9999小说 | 性做久久久久久久免费看 | 欧洲精品码一区二区三区免费看 | 日日碰狠狠躁久久躁蜜桃 | 精品一区二区三区无码免费视频 | 精品久久8x国产免费观看 | 老子影院午夜精品无码 | 久久精品人人做人人综合 | 日本熟妇浓毛 | 娇妻被黑人粗大高潮白浆 | 亚洲色大成网站www | 日本丰满熟妇videos | 久久精品中文闷骚内射 | 久久久久久久人妻无码中文字幕爆 | 丰腴饱满的极品熟妇 | 国产精品爱久久久久久久 | 日本熟妇大屁股人妻 | 国产精华av午夜在线观看 | 国产精品a成v人在线播放 | 成人片黄网站色大片免费观看 | 国产激情无码一区二区 | 日韩在线不卡免费视频一区 | 亚洲精品一区二区三区婷婷月 | 在线观看国产一区二区三区 | 国内丰满熟女出轨videos | 色五月丁香五月综合五月 | aⅴ亚洲 日韩 色 图网站 播放 | 99视频精品全部免费免费观看 | 亚洲日本va中文字幕 | 国产精品久久久av久久久 | 99久久婷婷国产综合精品青草免费 | 国产口爆吞精在线视频 | 狂野欧美激情性xxxx | 内射白嫩少妇超碰 | 免费无码肉片在线观看 | 人人妻在人人 | 国产精品久久精品三级 | 高清无码午夜福利视频 | 久久久精品456亚洲影院 | 色综合久久久无码中文字幕 | 精品国产一区二区三区四区在线看 | 丰满岳乱妇在线观看中字无码 | 日日碰狠狠躁久久躁蜜桃 | 99麻豆久久久国产精品免费 | 色欲久久久天天天综合网精品 | 亚洲精品欧美二区三区中文字幕 | 人妻无码αv中文字幕久久琪琪布 | 麻豆国产97在线 | 欧洲 | 美女黄网站人色视频免费国产 | 亚洲国产精品久久久天堂 | 成年女人永久免费看片 | 久久精品国产大片免费观看 | 婷婷六月久久综合丁香 | 国内精品九九久久久精品 | 国产后入清纯学生妹 | 久久久精品456亚洲影院 | 日韩精品无码免费一区二区三区 | 在线播放亚洲第一字幕 | a片在线免费观看 | 亚洲国产欧美在线成人 | 无码人妻丰满熟妇区五十路百度 | 中文字幕精品av一区二区五区 | 天堂а√在线中文在线 | 亚洲一区二区三区偷拍女厕 | 欧美成人免费全部网站 | 精品国产福利一区二区 | 国产色精品久久人妻 | 天堂久久天堂av色综合 | 四十如虎的丰满熟妇啪啪 | 纯爱无遮挡h肉动漫在线播放 | 日本精品高清一区二区 | 国产成人一区二区三区在线观看 | 亚洲大尺度无码无码专区 | 婷婷六月久久综合丁香 | 亚洲国产精品久久久久久 | 日韩人妻无码一区二区三区久久99 | 欧美肥老太牲交大战 | 亚洲精品国产精品乱码视色 | 欧美精品一区二区精品久久 | 国产香蕉97碰碰久久人人 | 在线a亚洲视频播放在线观看 | 久久午夜无码鲁丝片秋霞 | 野外少妇愉情中文字幕 | 中文字幕乱码中文乱码51精品 | 欧美人与善在线com | 免费无码午夜福利片69 | 国产精品高潮呻吟av久久 | 日韩无码专区 | 国产激情无码一区二区app | 亚洲欧美日韩综合久久久 | 一本色道久久综合亚洲精品不卡 | 国产网红无码精品视频 | 97久久精品无码一区二区 | 国产精品人人妻人人爽 | 久久久中文久久久无码 | 精品厕所偷拍各类美女tp嘘嘘 | 日本精品少妇一区二区三区 | 一本无码人妻在中文字幕免费 | 爆乳一区二区三区无码 | 国产精品手机免费 | 99久久99久久免费精品蜜桃 | 高潮毛片无遮挡高清免费 | 男女超爽视频免费播放 | 亚洲爆乳无码专区 | 久久久久久国产精品无码下载 | 在线欧美精品一区二区三区 | 性欧美videos高清精品 | 国产欧美精品一区二区三区 | 国产精品久久久久久无码 | 国产内射爽爽大片视频社区在线 | 国产性生交xxxxx无码 | 97夜夜澡人人双人人人喊 | 亚洲 欧美 激情 小说 另类 | 纯爱无遮挡h肉动漫在线播放 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 国产特级毛片aaaaaa高潮流水 | 国产成人无码av一区二区 | 精品国产麻豆免费人成网站 | 久久精品中文字幕大胸 | 中文字幕 人妻熟女 | 久久精品国产99精品亚洲 | 亚洲熟妇色xxxxx欧美老妇 | 无码吃奶揉捏奶头高潮视频 | 97资源共享在线视频 | 亚洲欧美色中文字幕在线 | 久久aⅴ免费观看 | 亚洲精品一区二区三区四区五区 | 精品国产精品久久一区免费式 | 精品国产国产综合精品 | 国产无遮挡又黄又爽又色 | 日本欧美一区二区三区乱码 | 欧美日本精品一区二区三区 | 国产激情无码一区二区 | 国产一区二区三区日韩精品 | 99精品国产综合久久久久五月天 | 永久免费精品精品永久-夜色 | 在线播放免费人成毛片乱码 | 欧美人与禽猛交狂配 | 思思久久99热只有频精品66 | 亚洲高清偷拍一区二区三区 | 欧美xxxx黑人又粗又长 | 99国产欧美久久久精品 | 国产精品爱久久久久久久 | 无码国内精品人妻少妇 | 成人免费视频一区二区 | 久久国产精品萌白酱免费 | 樱花草在线社区www | 午夜精品一区二区三区在线观看 | 日韩精品a片一区二区三区妖精 | 亚洲综合色区中文字幕 | 亚洲人成影院在线无码按摩店 | 色婷婷香蕉在线一区二区 | 亚洲一区二区三区偷拍女厕 | 国产熟女一区二区三区四区五区 | 夜先锋av资源网站 | 扒开双腿疯狂进出爽爽爽视频 | 少妇被黑人到高潮喷出白浆 | 国产乱人偷精品人妻a片 | 扒开双腿疯狂进出爽爽爽视频 | 久久伊人色av天堂九九小黄鸭 | 99国产精品白浆在线观看免费 | 成人欧美一区二区三区黑人 | 丰满少妇人妻久久久久久 | 亚洲人成影院在线无码按摩店 | 在线播放无码字幕亚洲 | 精品偷拍一区二区三区在线看 | 久久精品国产亚洲精品 | 国产舌乚八伦偷品w中 | 丰满妇女强制高潮18xxxx | 草草网站影院白丝内射 | 国产精品va在线播放 | 无码任你躁久久久久久久 | 东京热无码av男人的天堂 | 老司机亚洲精品影院无码 | 青青草原综合久久大伊人精品 | 国产精品久久久一区二区三区 | 成人精品天堂一区二区三区 | 丰满少妇熟乱xxxxx视频 | 久久久久久亚洲精品a片成人 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 久久天天躁狠狠躁夜夜免费观看 | 亚洲熟妇色xxxxx欧美老妇y | 色欲综合久久中文字幕网 | 日韩精品一区二区av在线 | 青青青手机频在线观看 | 丰腴饱满的极品熟妇 | 九九久久精品国产免费看小说 | 国产精品99久久精品爆乳 | 亚洲综合无码一区二区三区 | 亚洲中文字幕在线观看 | 人妻无码久久精品人妻 | 好男人社区资源 | 日韩精品成人一区二区三区 | 国产又爽又猛又粗的视频a片 | 成年美女黄网站色大免费视频 | 精品国产aⅴ无码一区二区 | 国产成人综合在线女婷五月99播放 | 亚洲综合无码久久精品综合 | 两性色午夜视频免费播放 | 青青草原综合久久大伊人精品 | 国产亚洲欧美日韩亚洲中文色 | 精品人妻av区 | 精品成人av一区二区三区 | 精品久久久无码人妻字幂 | 精品成人av一区二区三区 | 国产精品亚洲五月天高清 | 久久精品人妻少妇一区二区三区 | 天堂久久天堂av色综合 | a在线亚洲男人的天堂 | 久久五月精品中文字幕 | 午夜精品久久久内射近拍高清 | 76少妇精品导航 | 在线观看国产一区二区三区 | 国产乱人伦偷精品视频 | 国产亚洲人成a在线v网站 | 日韩av无码中文无码电影 | 无码人中文字幕 | 2020久久超碰国产精品最新 | 色综合久久中文娱乐网 | 中文字幕无码av激情不卡 | www国产精品内射老师 | 国产乱人无码伦av在线a | 99久久精品午夜一区二区 | 色综合天天综合狠狠爱 | 国产精品久久国产三级国 | 少妇无套内谢久久久久 | 疯狂三人交性欧美 | 久久精品国产99久久6动漫 | 亚洲啪av永久无码精品放毛片 | 少妇被粗大的猛进出69影院 | 国产一区二区三区影院 | 免费人成在线观看网站 | 亚洲色欲久久久综合网东京热 | 日本饥渴人妻欲求不满 | 中文字幕乱码亚洲无线三区 | 成人无码视频在线观看网站 | 日本www一道久久久免费榴莲 | 久久久久se色偷偷亚洲精品av | 99久久精品国产一区二区蜜芽 | 亚洲乱码日产精品bd | 六十路熟妇乱子伦 | 女人和拘做爰正片视频 | 亚洲中文字幕无码中文字在线 | 成人女人看片免费视频放人 | 久久久久免费精品国产 | 国产真实伦对白全集 | 国产精品igao视频网 | 无码精品人妻一区二区三区av | 国产亚洲日韩欧美另类第八页 | 中文字幕无码av波多野吉衣 | 国内精品人妻无码久久久影院蜜桃 | 青春草在线视频免费观看 | 欧美亚洲国产一区二区三区 | 久久这里只有精品视频9 | 波多野42部无码喷潮在线 | 理论片87福利理论电影 | 中文字幕人成乱码熟女app | 国产性生交xxxxx无码 | 精品国产一区二区三区四区在线看 | 丁香花在线影院观看在线播放 | 性色欲情网站iwww九文堂 | 无码乱肉视频免费大全合集 | 人人妻人人澡人人爽欧美一区 | 麻豆av传媒蜜桃天美传媒 | 99久久99久久免费精品蜜桃 | 亚洲国产精品成人久久蜜臀 | 一二三四在线观看免费视频 | 日韩精品久久久肉伦网站 | 国产一精品一av一免费 | 无码av岛国片在线播放 | 久久亚洲a片com人成 | 日本乱偷人妻中文字幕 | 久久久av男人的天堂 | 国产精品美女久久久 | 亚欧洲精品在线视频免费观看 | 色综合久久久无码网中文 | 亚洲一区二区三区含羞草 | 丝袜足控一区二区三区 | 精品国产一区av天美传媒 | 久久综合九色综合欧美狠狠 | 日本爽爽爽爽爽爽在线观看免 | 一本大道伊人av久久综合 | 国产莉萝无码av在线播放 | 午夜男女很黄的视频 | 日产国产精品亚洲系列 | 欧美大屁股xxxxhd黑色 | 日本精品人妻无码免费大全 | 六月丁香婷婷色狠狠久久 | 日本爽爽爽爽爽爽在线观看免 | 国产麻豆精品一区二区三区v视界 | 色欲综合久久中文字幕网 | 亚洲阿v天堂在线 | 天堂一区人妻无码 | 精品无码av一区二区三区 | 国产综合色产在线精品 | 精品 日韩 国产 欧美 视频 | 国产另类ts人妖一区二区 | 爆乳一区二区三区无码 | v一区无码内射国产 | 免费视频欧美无人区码 | 在线看片无码永久免费视频 | 丰满护士巨好爽好大乳 | 中文字幕人成乱码熟女app | 成人免费视频一区二区 | 亚洲中文字幕乱码av波多ji | 国产三级精品三级男人的天堂 | 东京热无码av男人的天堂 | 一本色道久久综合亚洲精品不卡 | 大屁股大乳丰满人妻 | 婷婷六月久久综合丁香 | 午夜熟女插插xx免费视频 | 夜夜影院未满十八勿进 | 成人欧美一区二区三区黑人 | 无码帝国www无码专区色综合 | 亚洲高清偷拍一区二区三区 | 国产三级精品三级男人的天堂 | 青青青手机频在线观看 | 精品国产成人一区二区三区 | 青青青爽视频在线观看 | 色五月五月丁香亚洲综合网 | 性生交大片免费看女人按摩摩 | 久久国产精品_国产精品 | 狠狠色噜噜狠狠狠7777奇米 | 精品久久8x国产免费观看 | 中文字幕人妻丝袜二区 | 性欧美videos高清精品 | 色一情一乱一伦一视频免费看 | 国产成人一区二区三区在线观看 | 老熟妇仑乱视频一区二区 | 极品嫩模高潮叫床 | 国色天香社区在线视频 | 国产性生交xxxxx无码 | 欧美老人巨大xxxx做受 | 鲁大师影院在线观看 | 国产精品无码成人午夜电影 | 亚洲精品午夜无码电影网 | 亚洲va欧美va天堂v国产综合 | 久久综合给合久久狠狠狠97色 | 国产激情精品一区二区三区 | 伊人久久大香线蕉午夜 | 亚洲精品国产品国语在线观看 | 欧美 亚洲 国产 另类 | 国产精品久久久久久久9999 | 久久精品女人天堂av免费观看 | 精品久久久久久人妻无码中文字幕 | 国产亚洲美女精品久久久2020 | 亚洲成a人片在线观看无码3d | 综合网日日天干夜夜久久 | 亚洲国产欧美日韩精品一区二区三区 | 久久这里只有精品视频9 | 国产麻豆精品一区二区三区v视界 | 久久精品国产99久久6动漫 | 天堂а√在线中文在线 | 蜜臀av无码人妻精品 | 中文字幕人妻丝袜二区 | 日日天干夜夜狠狠爱 | a在线观看免费网站大全 | 影音先锋中文字幕无码 | 精品国精品国产自在久国产87 | 亚洲一区二区三区在线观看网站 | 小sao货水好多真紧h无码视频 | 国产乱人伦av在线无码 | 午夜精品一区二区三区在线观看 | 久久精品人妻少妇一区二区三区 | 乱人伦中文视频在线观看 | 久久久无码中文字幕久... | 成人无码视频免费播放 | 亚洲大尺度无码无码专区 | 性色欲情网站iwww九文堂 | 亚洲の无码国产の无码影院 | 成人无码视频在线观看网站 | 国产精品久久久久影院嫩草 | 岛国片人妻三上悠亚 | 久久精品一区二区三区四区 | 国产人妻人伦精品1国产丝袜 | 东京无码熟妇人妻av在线网址 | 久久久久成人片免费观看蜜芽 | 精品国产一区av天美传媒 | 给我免费的视频在线观看 | 亚洲国产精品美女久久久久 | 精品无人区无码乱码毛片国产 | 精品aⅴ一区二区三区 | 丰满少妇熟乱xxxxx视频 | 亚洲乱码国产乱码精品精 | 性欧美熟妇videofreesex | 亚洲精品综合五月久久小说 | 免费观看的无遮挡av | 国产深夜福利视频在线 | 成人无码视频免费播放 | 亚洲无人区一区二区三区 | 国产人妻人伦精品1国产丝袜 | 国产精品嫩草久久久久 | 欧美 丝袜 自拍 制服 另类 | 无码国模国产在线观看 | 亚洲色欲久久久综合网东京热 | 国产偷国产偷精品高清尤物 | 亚洲成av人综合在线观看 | 欧洲熟妇精品视频 | 国产精品亚洲五月天高清 | 狠狠色色综合网站 | 国产麻豆精品精东影业av网站 | 九九综合va免费看 | 久久天天躁夜夜躁狠狠 | 国产精品亚洲五月天高清 | 中国大陆精品视频xxxx | 水蜜桃色314在线观看 | 亚洲精品无码国产 | 精品厕所偷拍各类美女tp嘘嘘 | 国产又爽又黄又刺激的视频 | 成人精品视频一区二区三区尤物 | 麻豆精产国品 | 久久无码中文字幕免费影院蜜桃 | 国产乱人偷精品人妻a片 | 一个人看的视频www在线 | 无码人妻久久一区二区三区不卡 | 国产一精品一av一免费 | 亚洲日本一区二区三区在线 | 久久综合色之久久综合 | 欧美人与善在线com | 国产成人无码av片在线观看不卡 | 久久婷婷五月综合色国产香蕉 | 婷婷五月综合缴情在线视频 | 图片区 小说区 区 亚洲五月 | 又湿又紧又大又爽a视频国产 | 国产精品久久久久久亚洲毛片 | 色婷婷综合中文久久一本 | 国产精品成人av在线观看 | 国产又粗又硬又大爽黄老大爷视 | 国产av久久久久精东av | 欧美 日韩 人妻 高清 中文 | 国产综合在线观看 | 久久人妻内射无码一区三区 | 欧美 亚洲 国产 另类 | 国产亚洲精品久久久闺蜜 | 国精产品一品二品国精品69xx | 免费看男女做好爽好硬视频 | 男女爱爱好爽视频免费看 | 黑人大群体交免费视频 | 性欧美熟妇videofreesex | 女人被爽到呻吟gif动态图视看 | 亚洲成av人影院在线观看 | 色情久久久av熟女人妻网站 | www一区二区www免费 | 牲欲强的熟妇农村老妇女视频 | 国产成人无码一二三区视频 | 两性色午夜免费视频 | 精品一区二区三区无码免费视频 | 色 综合 欧美 亚洲 国产 | 一本久道高清无码视频 | 国产亚洲精品久久久久久大师 | 亚洲日本va中文字幕 | 亚洲一区二区三区在线观看网站 | 天天摸天天透天天添 | 亚洲欧美国产精品专区久久 | 久久精品视频在线看15 | 亚洲男人av天堂午夜在 | 精品人妻人人做人人爽夜夜爽 | 欧美 日韩 人妻 高清 中文 | 激情国产av做激情国产爱 | 久青草影院在线观看国产 | 亚洲国产欧美日韩精品一区二区三区 | 日韩精品a片一区二区三区妖精 | 夜夜影院未满十八勿进 | 性欧美熟妇videofreesex | 国产免费观看黄av片 | 狠狠色色综合网站 | 水蜜桃色314在线观看 | 久久综合九色综合97网 | 老熟女重囗味hdxx69 | 亚洲国产精品久久久天堂 | 偷窥村妇洗澡毛毛多 | 国产午夜无码视频在线观看 | 理论片87福利理论电影 | 国产一区二区三区四区五区加勒比 | 日本爽爽爽爽爽爽在线观看免 | 日本又色又爽又黄的a片18禁 | 精品人妻中文字幕有码在线 | 欧美变态另类xxxx | 99久久精品日本一区二区免费 | 377p欧洲日本亚洲大胆 | 亚洲の无码国产の无码影院 | 全黄性性激高免费视频 | 午夜精品久久久久久久 | 亚洲中文字幕成人无码 | 国产特级毛片aaaaaaa高清 | 中文字幕无码av波多野吉衣 | 四虎永久在线精品免费网址 | 亚洲中文字幕在线无码一区二区 | 精品久久久无码人妻字幂 | 77777熟女视频在线观看 а天堂中文在线官网 | 极品尤物被啪到呻吟喷水 |