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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

类ChatGPT的部署与微调(上):从LLaMA、Alpaca/Vicuna/BELLE、中文版

發(fā)布時間:2024/1/8 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 类ChatGPT的部署与微调(上):从LLaMA、Alpaca/Vicuna/BELLE、中文版 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言?

近期,除了研究ChatGPT背后的各種技術(shù)細節(jié) 不斷看論文(至少100篇,100篇目錄見此:ChatGPT相關(guān)技術(shù)必讀論文100篇),還開始研究一系列開源模型(包括各自對應(yīng)的模型架構(gòu)、訓(xùn)練方法、訓(xùn)練數(shù)據(jù)、本地私有化部署、硬件配置要求、微調(diào)等細節(jié))?

本文一開始是作為此文《ChatGPT技術(shù)原理解析:從RL之PPO算法、RLHF到GPT4、instructGPT》的第4部分,但隨著研究深入 為避免該文篇幅又過長,將把『第4部分 開源項目』抽取出來 獨立成本文,然后不斷續(xù)寫本文直至成了一個系列

畢竟我上半年的目標(biāo)之一,便是把ChatGPT涉及的所有一切關(guān)鍵技術(shù)細節(jié),以及相關(guān)的開源項目都研究的透透的,故過程中會不斷產(chǎn)出一篇篇新文章出來
?

第一部分 LLaMA的代碼級解讀:RMSNorm/SwiGLU/RoPE/Transformer

1.1 Meta發(fā)布LLaMA((7B 13B 33B 65B):參數(shù)少但多數(shù)任務(wù)的效果好于GPT3

一直致力于LLM模型研究的國外TOP 3大廠除了OpenAI、Google,便是Meta(原來的Facebook)

Meta曾第一個發(fā)布了基于LLM的聊天機器人——BlenderBot 3,但輸出不夠安全,很快下線;再后來,Meta發(fā)布一個專門為科學(xué)研究設(shè)計的模型Galactica,但用戶期望過高,發(fā)布三天后又下線

23年2.24日,Meta通過論文《LLaMA: Open and Efficient Foundation Language Models》發(fā)布了自家的大型語言模型LLaMA(這是解讀之一),有多個參數(shù)規(guī)模的版本(7B 13B 33B 65B)

LLaMA只使用公開的數(shù)據(jù)(總計1.4T即1,400GB的token,其中CommonCrawl的數(shù)據(jù)占比67%,C4數(shù)據(jù)占比15%,Github Wikipedia Books這三項數(shù)據(jù)均各自占比4.5%,ArXiv占比2.5%,StackExchange占比2%),論文中提到

When training a 65B-parameter model, our code processes around 380 tokens/sec/GPU on 2048 A100 GPU with 80GB of RAM.

This means that training over our dataset containing 1.4T tokens takes approximately 21 days

且試圖證明小模型在足夠多的的數(shù)據(jù)上訓(xùn)練后,也能達到甚至超過大模型的效果

  • 比如13B參數(shù)的版本在多項基準(zhǔn)上測試的效果好于2020年的參數(shù)規(guī)模達175B的GPT-3
  • 而對于65B參數(shù)的LLaMA,則可與DeepMind的Chinchilla(70B參數(shù))和谷歌的PaLM(540B參數(shù))旗鼓相當(dāng)
  • 且Meta還嘗試使用了論文「Scaling Instruction-Finetuned Language Models」中介紹的指令微調(diào)方法,由此產(chǎn)生的模型LLaMA-I,在MMLU(Massive Multitask Language Understanding,大型多任務(wù)語言理解)上要優(yōu)于Google的指令微調(diào)模型Flan-PaLM-cont(62B)

1.2 代碼級解讀:LLaMA的模型架構(gòu)——RMSNorm/SwiGLU/RoPE/Transformer

1.2.1?項目環(huán)境依賴:torch、fairscale、fire、sentencepiece

此項目給出的環(huán)境依賴有4個:

  • torch
  • fairscale,fairscale是用來做GPU分布的,一般是當(dāng)使用DDP仍然遇到超顯存的問題時使用fairscale
  • fire,fire是一個命令行工具,用或者不用他都可以
  • sentencepiece,sentencepiece是用于tokenizer的工具包 from sentencepiece import SentencePieceProcessor from logging import getLogger from typing import List import oslogger = getLogger()class Tokenizer:def __init__(self, model_path: str):# reload tokenizerassert os.path.isfile(model_path), model_pathself.sp_model = SentencePieceProcessor(model_file=model_path)logger.info(f"Reloaded SentencePiece model from {model_path}")# BOS / EOS token IDsself.n_words: int = self.sp_model.vocab_size()self.bos_id: int = self.sp_model.bos_id()self.eos_id: int = self.sp_model.eos_id()self.pad_id: int = self.sp_model.pad_id()logger.info(f"#words: {self.n_words} - BOS ID: {self.bos_id} - EOS ID: {self.eos_id}")assert self.sp_model.vocab_size() == self.sp_model.get_piece_size()def encode(self, s: str, bos: bool, eos: bool) -> List[int]:assert type(s) is strt = self.sp_model.encode(s)if bos:t = [self.bos_id] + tif eos:t = t + [self.eos_id]return tdef decode(self, t: List[int]) -> str:return self.sp_model.decode(t)
  • 1.2.2 RMSNorm:對每個Transformer子層的輸入進行歸一化

    為了提高訓(xùn)練的穩(wěn)定性,對每個transformer子層的輸入進行歸一化,而不是對輸出進行歸一化,且使用由Zhang和Sennrich(2019)提出的RMSNorm(Root Mean Square Layer Normalization)
    RMS Norm是一般LayerNorm的一種變體,可以在梯度下降時令損失更加平滑
    與layerNorm相比,RMS Norm的主要區(qū)別在于去掉了減去均值的部分(re-centering),只保留方差部分(re-scaling)

    為一目了然,我們看下它們各自的歸一化的表達式

    • 一般的LN:

      其中

    • RMS Norm:

      其中

    至于RMS Norm為什么有用,需要求梯度進行分析,感興趣的同學(xué)可以閱讀RMS Norm的論文

    class RMSNorm(torch.nn.Module):def __init__(self, dim: int, eps: float = 1e-6):super().__init__()// eps防止取倒數(shù)之后分母為0self.eps = epsself.weight = nn.Parameter(torch.ones(dim))// x是輸入def _norm(self, x):// torch.rsqrt是開平方并取倒數(shù)// x.pow(2)是平方/ mean(-1)是在最后一個維度(即hidden特征維度)上取平均return x * torch.rsqrt(x.pow(2).mean(-1, keepdim=True) + self.eps)def forward(self, x):output = self._norm(x.float()).type_as(x)// weight是末尾乘的可訓(xùn)練參數(shù),即gireturn output * self.weight

    1.2.3?SwiGLU替代ReLU

    用Shazeer(2020)提出的SwiGLU替代ReLU,在維度上使用的維度是2/3*4d,而不是PaLM中的4d

    LLaMA采用SwiGLU替換了原有的ReLU,具體是采用SwiGLU的FNN,在論文中以如下公式進行表述:

    其中

    對應(yīng)論文見:Ramachandran et al., 2017
    代碼實現(xiàn)上:可以通過調(diào)用torch內(nèi)置方法F.silu()實現(xiàn),會在下文的FFN部分介紹

    1.2.4 位置編碼:旋轉(zhuǎn)位置嵌入(RoPE)

    在位置編碼上,刪除了絕對位置嵌入,而在網(wǎng)絡(luò)的每一層增加了蘇劍林等人(2021)提出的旋轉(zhuǎn)位置嵌入(RoPE),其思想是采用絕對位置編碼的形式,實現(xiàn)相對位置編碼

    • RoPE主要借助了復(fù)數(shù)的思想,為了引入復(fù)數(shù),首先假設(shè)了在加入位置信息之前,原有的編碼向量是二維行向量,其中是絕對位置,現(xiàn)在需要構(gòu)造一個變換,將引入到中,即尋找變換:?

      考慮到Attention的核心計算是內(nèi)積:

      所以,尋求的這個變換,應(yīng)該具有特性:
    • 這里直接說結(jié)論,尋求的變換就是,也就是給乘以,相應(yīng)地,乘以
      做了這樣一個變換之后,根據(jù)復(fù)數(shù)的特性,有:

      也就是,如果把二維向量看做復(fù)數(shù),那么它們的內(nèi)積,等于一個復(fù)數(shù)乘以另一個復(fù)數(shù)的共軛,得到的結(jié)果再取實部,代入上面的變換,也就有:

      這樣一來,內(nèi)積的結(jié)果就只依賴于,也就是相對位置了
      換言之,經(jīng)過這樣一番操作,通過給Embedding添加絕對位置信息,可以使得兩個token的編碼,經(jīng)過內(nèi)積變換(self-attn)之后,得到結(jié)果是受它們位置的差值,即相對位置影響的
    • 于是對于任意的位置為的二維向量,把它看做復(fù)數(shù),乘以,而根據(jù)歐拉公式,有:

      于是上述的相乘變換也就變成了:

      把上述式子寫成矩陣形式:

      而這個變換的幾何意義,就是在二維坐標(biāo)系下,對向量進行了旋轉(zhuǎn),因而這種位置編碼方法,被稱為旋轉(zhuǎn)位置編碼
    • 根據(jù)剛才的結(jié)論,結(jié)合內(nèi)積的線性疊加性,可以將結(jié)論推廣到高維的情形。可以理解為,每兩個維度一組,進行了上述的“旋轉(zhuǎn)”操作,然后再拼接在一起:

      由于矩陣的稀疏性,會造成計算上的浪費,所以在計算時采用逐位相乘再相加的方式進行:

      其中為矩陣逐位相乘操作

    原理理解了,接下來可以代碼實現(xiàn)旋轉(zhuǎn)位置編碼

    def precompute_freqs_cis(dim: int, end: int, theta: float = 10000.0):// 首先torch.arange創(chuàng)建了一個tensor,[ 0 , 2 , 4 , . . . , 60 , 62 ] [0, 2, 4, ..., 60, 62][0,2,4,...,60,62]// 然后統(tǒng)一除以64,把它變成分?jǐn)?shù),然后整體作為基礎(chǔ)角度的指數(shù),它的shape是(32)freqs = 1.0 / (theta ** (torch.arange(0, dim, 2)[: (dim // 2)].float() / dim))// t比較容易理解,也就是絕對位置信息,它的shape是(1024)t = torch.arange(end, device=freqs.device)// torch.outer是把一個向量的轉(zhuǎn)置乘以另一個向量:torch.outer(a, b) = a^T * b// 于是根據(jù)torch.outer運算,我們得到了一個shape為(1024, 32)的tensor。其意義也就是將每一個絕對位置,分配到對應(yīng)的角度,相乘// 直觀理解一下,就是每一個絕對位置上,都有32個角度// 為什么是這樣的呢,回顧計算的公式,對于旋轉(zhuǎn)矩陣,每兩個元素為一組,它們乘以的角度是同一個θ,所以這個(1024, 32)// 在后續(xù)的過程中,就可以reshape成(512, 64),并且在64的那個維度上,每兩個是相同的freqs = torch.outer(t, freqs).float()// torch.polar(abs, angle)利用一個絕對數(shù)值和一個角度值,從而在極坐標(biāo)下構(gòu)造一個復(fù)數(shù)張量// 即abs?cos(angle)+abs?sin(angle)j// torch.polar(torch.tensor([1], dtype=torch.float64), torch.tensor([np.pi / 2], dtype=torch.float64))// # tensor([6.1232e-17+1.j], dtype=torch.complex128)// freqs_cis其實就是需要計算出來的mθ,也就是跟絕對位置相關(guān)的旋轉(zhuǎn)的角度,在極坐標(biāo)下對應(yīng)的復(fù)數(shù)tensor// 這一步就是在生成我們需要的位置信息// 直觀理解一下,像是在復(fù)平面內(nèi),以原點為中心,轉(zhuǎn)了1024組,每一組64個的單位向量,它的shape是(1024, 64)freqs_cis = torch.polar(torch.ones_like(freqs), freqs) # complex64return freqs_cis// 第二個函數(shù)reshape_for_broadcast,是把freqs_cis變成和輸入的tensor相同的形狀 def reshape_for_broadcast(freqs_cis: torch.Tensor, x: torch.Tensor):ndim = x.ndimassert 0 <= 1 < ndimassert freqs_cis.shape == (x.shape[1], x.shape[-1])// 這個方法的作用是為了把freqs_cis變成和輸入的tensor相同的形狀// 需要注意的是,這里的freqs_cis并不是precompute_freqs_cis生成的形狀為(1024, 64)的那個tensor// 而是根據(jù)輸入的絕對位置,在(1024, 64)的tensor中,截取了長度為當(dāng)前seq_len的一部分// 代碼在Transformer類的forward方法中freqs_cis = self.freqs_cis[start_pos : start_pos + seqlen]// 也就是說,假如當(dāng)前輸入的序列長度是512,那么截取出來的這個新的freqs_cis,形狀就是(512, 64)// reshape之后,形狀就變成了(1, 512, 1, 32),也就是在每一個位置上,都對應(yīng)有32個角度// 根據(jù)上面torch.polar的介紹,當(dāng)我們固定絕對值(也就是向量的模長)時,角度就可以在笛卡爾坐標(biāo)系下唯一確定一個復(fù)數(shù)// 這樣一來也就是32個復(fù)數(shù),即64個特征維度,所以就可以對應(yīng)的將它融合到每個attention head的64個特征中去了shape = [d if i == 1 or i == ndim - 1 else 1 for i, d in enumerate(x.shape)]return freqs_cis.view(*shape)// apply_rotary_emb方法,這個方法其實就是把位置信息添加到原有的編碼結(jié)果上,在multi-head attention階段調(diào)用 def apply_rotary_emb(xq: torch.Tensor,xk: torch.Tensor,freqs_cis: torch.Tensor, ) -> Tuple[torch.Tensor, torch.Tensor]:// torch.view_as_complex是把一個tensor轉(zhuǎn)為復(fù)數(shù)形式// 比如torch.view_as_complex(torch.Tensor([[1, 2], [3, 4], [5, 6]]))// # tensor([1.+2.j, 3.+4.j, 5.+6.j])// 假設(shè)輸入x_q的尺寸就是(2, 512, 12, 64)// 那么這一句操作的reshape,就是把它變成(2, 512, 12, -1, 2),也就是(2, 512, 12, 32, 2)。x_k同理,略// 緊接著把它變成復(fù)數(shù)形式,也就是變成了(2, 512, 12, 32)的形狀。xq_ = torch.view_as_complex(xq.float().reshape(*xq.shape[:-1], -1, 2))xk_ = torch.view_as_complex(xk.float().reshape(*xk.shape[:-1], -1, 2))// 然后進入到上面的第二個函數(shù)reshape_for_broadcastfreqs_cis = reshape_for_broadcast(freqs_cis, xq_)// torch.view_as_real是把復(fù)數(shù)tensor變回實數(shù)// torch.view_as_real(torch.view_as_complex(torch.Tensor([[1, 2], [3, 4], [5, 6]])))// # tensor([[1., 2.],// # [3., 4.],// # [5., 6.]])// reshape之后,就是將位置信息融入query和key中// 這一步將二者相乘得到的復(fù)數(shù)tensor,重新轉(zhuǎn)換為實數(shù)形式,得到的shape為(2, 512, 12, 32, 2)// 然后再flatten成(2, 512, 12, 64),這樣一來,就變回了和最開始x_q相同的形狀,也就完成了將位置信息融入到x_q的這一操作,x_k同理xq_out = torch.view_as_real(xq_ * freqs_cis).flatten(3)xk_out = torch.view_as_real(xk_ * freqs_cis).flatten(3)return xq_out.type_as(xq), xk_out.type_as(xk)

    引用此文的介紹,再著重解釋下precompute_freqs_cis的作用

    • 假設(shè)
      batch_size為2
      seq_len固定為512
      attention_head的數(shù)量為12
      每個attention_head的維度為64,那么,對于輸入到multi-head attn中的輸入的尺寸就是
      (2, 512, 12, 64)
    • 而freqs_cis其實就是需要計算出來的也就是跟絕對位置相關(guān)的旋轉(zhuǎn)的角度,在極坐標(biāo)下對應(yīng)的復(fù)數(shù)tensor

    而precompute_freqs_cis就是提前將這些旋轉(zhuǎn)角度對應(yīng)的tensor給創(chuàng)建出來,并可以重復(fù)利用。因為確定了序列的最大長度,所以這個tensor是固定死的。根據(jù)后續(xù)的數(shù)據(jù)流我們可以發(fā)現(xiàn),在調(diào)用該函數(shù)時,傳入的兩個參數(shù)分別是attention_head的維度,以及最大長度的兩倍,具象地,也就是64和1024

    1.2.4 Transform架構(gòu)的實現(xiàn):Attention計算、SA、FFN

    LLaMA和GPT一樣,都是基于Transformer這個架構(gòu),通常,我們在構(gòu)建transformer時,是按Block構(gòu)建的,每個transformer Block包含SA和FFN兩部分,然后再通過堆疊block的形式,構(gòu)建起整個transformer網(wǎng)絡(luò),LLaMA也是這樣做的

    回顧一下Attention計算的總體過程是:

  • 輸入,分別經(jīng)過三個Linear得到
  • 在??和中加入旋轉(zhuǎn)位置編碼
  • 緩存??和??
  • 計算
  • 其中有一個細節(jié)就是緩存機制,它設(shè)計的目的是在generate時減少token的重復(fù)計算。簡單解釋一下,就是在計算第n個token特征的時候,需要用到第個token,即每次生成時,需要知道前面所有的過往信息,如果每次都從頭算的話,那就會造成極大的浪費,所以就沒算一個位置的信息,就把它緩存下來

    接下來,我們來看下代碼實現(xiàn),首先是SA部分:

    class Attention(nn.Module):def __init__(self, args: ModelArgs):super().__init__()self.n_local_heads = args.n_heads // fs_init.get_model_parallel_world_size()self.head_dim = args.dim // args.n_headsself.wq = ColumnParallelLinear(args.dim,args.n_heads * self.head_dim,bias=False,gather_output=False,init_method=lambda x: x,)self.wk = ColumnParallelLinear(args.dim,args.n_heads * self.head_dim,bias=False,gather_output=False,init_method=lambda x: x,)self.wv = ColumnParallelLinear(args.dim,args.n_heads * self.head_dim,bias=False,gather_output=False,init_method=lambda x: x,)self.wo = RowParallelLinear(args.n_heads * self.head_dim,args.dim,bias=False,input_is_parallel=True,init_method=lambda x: x,)self.cache_k = torch.zeros((args.max_batch_size, args.max_seq_len, self.n_local_heads, self.head_dim)).cuda()self.cache_v = torch.zeros((args.max_batch_size, args.max_seq_len, self.n_local_heads, self.head_dim)).cuda()def forward(self, x: torch.Tensor, start_pos: int, freqs_cis: torch.Tensor, mask: Optional[torch.Tensor]):bsz, seqlen, _ = x.shapexq, xk, xv = self.wq(x), self.wk(x), self.wv(x)xq = xq.view(bsz, seqlen, self.n_local_heads, self.head_dim)xk = xk.view(bsz, seqlen, self.n_local_heads, self.head_dim)xv = xv.view(bsz, seqlen, self.n_local_heads, self.head_dim)xq, xk = apply_rotary_emb(xq, xk, freqs_cis=freqs_cis)self.cache_k = self.cache_k.to(xq)self.cache_v = self.cache_v.to(xq)self.cache_k[:bsz, start_pos : start_pos + seqlen] = xkself.cache_v[:bsz, start_pos : start_pos + seqlen] = xvkeys = self.cache_k[:bsz, : start_pos + seqlen]values = self.cache_v[:bsz, : start_pos + seqlen]xq = xq.transpose(1, 2)keys = keys.transpose(1, 2)values = values.transpose(1, 2)scores = torch.matmul(xq, keys.transpose(2, 3)) / math.sqrt(self.head_dim)if mask is not None:scores = scores + mask # (bs, n_local_heads, slen, cache_len + slen)scores = F.softmax(scores.float(), dim=-1).type_as(xq)output = torch.matmul(scores, values) # (bs, n_local_heads, slen, head_dim)output = output.transpose(1, 2).contiguous().view(bsz, seqlen, -1)return self.wo(output)

    然后是FFN部分,需要注意的點就是采用的激活函數(shù),以及激活函數(shù)的位置

    class FeedForward(nn.Module):def __init__(self,dim: int,hidden_dim: int,multiple_of: int,):super().__init__()hidden_dim = int(2 * hidden_dim / 3)hidden_dim = multiple_of * ((hidden_dim + multiple_of - 1) // multiple_of)self.w1 = ColumnParallelLinear(dim, hidden_dim, bias=False, gather_output=False, init_method=lambda x: x)self.w2 = RowParallelLinear(hidden_dim, dim, bias=False, input_is_parallel=True, init_method=lambda x: x)self.w3 = ColumnParallelLinear(dim, hidden_dim, bias=False, gather_output=False, init_method=lambda x: x)def forward(self, x):return self.w2(F.silu(self.w1(x)) * self.w3(x))

    這里與常見模型中的FFN做一下簡單的對比

    • BART中的FFN,用的是fc->act->fc,用了兩層全連接
    • GPT中的FFN,用的是conv1D->act->conv1D,也是只用了兩層
    • 而LLaMA中的FFN采用了三個全連接層以實現(xiàn)FFNSwiGLU,即

    然后將SA和FFN這兩部分拼在一起就是一個transformer block

    class TransformerBlock(nn.Module):def __init__(self, layer_id: int, args: ModelArgs):super().__init__()self.n_heads = args.n_headsself.dim = args.dimself.head_dim = args.dim // args.n_headsself.attention = Attention(args)self.feed_forward = FeedForward(dim=args.dim, hidden_dim=4 * args.dim, multiple_of=args.multiple_of)self.layer_id = layer_idself.attention_norm = RMSNorm(args.dim, eps=args.norm_eps)self.ffn_norm = RMSNorm(args.dim, eps=args.norm_eps)def forward(self, x: torch.Tensor, start_pos: int, freqs_cis: torch.Tensor, mask: Optional[torch.Tensor]):h = x + self.attention.forward(self.attention_norm(x), start_pos, freqs_cis, mask)out = h + self.feed_forward.forward(self.ffn_norm(h))return out

    最后利用torch的module list將transformer block進行堆疊,拼上最前頭的embedding部分,就是一個完整的transformer decoder結(jié)構(gòu)了

    class Transformer(nn.Module):def __init__(self, params: ModelArgs):super().__init__()self.params = paramsself.vocab_size = params.vocab_sizeself.n_layers = params.n_layersself.tok_embeddings = ParallelEmbedding(params.vocab_size, params.dim, init_method=lambda x: x)self.layers = torch.nn.ModuleList()for layer_id in range(params.n_layers):self.layers.append(TransformerBlock(layer_id, params))self.norm = RMSNorm(params.dim, eps=params.norm_eps)self.output = ColumnParallelLinear(params.dim, params.vocab_size, bias=False, init_method=lambda x: x)self.freqs_cis = precompute_freqs_cis(self.params.dim // self.params.n_heads, self.params.max_seq_len * 2)@torch.inference_mode()def forward(self, tokens: torch.Tensor, start_pos: int):_bsz, seqlen = tokens.shape// 輸入是token,先做token embedding,然后添加位置信息h = self.tok_embeddings(tokens)self.freqs_cis = self.freqs_cis.to(h.device)freqs_cis = self.freqs_cis[start_pos : start_pos + seqlen]// 對于decoder模型,為了防止標(biāo)簽泄漏,需要mask,所以做了一個上三角的mask矩陣mask = Noneif seqlen > 1:mask = torch.full((1, 1, seqlen, seqlen), float("-inf"), device=tokens.device)mask = torch.triu(mask, diagonal=start_pos + 1).type_as(h)// 接下來就是逐層的計算transformerfor layer in self.layers:h = layer(h, start_pos, freqs_cis, mask)h = self.norm(h)output = self.output(h[:, -1, :]) # only compute last logitsreturn output.float()

    接著看下生成過程,如下:

  • 對prompts進行tokenize,得到token ids;
  • 計算當(dāng)前batch的最大長度total_len,用來創(chuàng)建輸入的token tensor,最大長度不能超過前文所述緩存的大小;
  • 從當(dāng)前batch中,最短的一個prompt的位置,作為生成的開始位置,開始生成;
  • 輸入的token tensor傳入transformer模型,計算logits,得到形狀為(batch_size, hidden_size)的logits(transformer最后一層的輸出);
  • softmax+top_p采樣,得到當(dāng)前預(yù)測的token,并更新當(dāng)前位置,準(zhǔn)備預(yù)測下一個token;
  • 解碼得到生成的文本
  • 代碼如下

    class LLaMA:def __init__(self, model: Transformer, tokenizer: Tokenizer):self.model = modelself.tokenizer = tokenizerdef generate(self,prompts: List[str],max_gen_len: int,temperature: float = 0.8,top_p: float = 0.95,) -> List[str]:bsz = len(prompts)params = self.model.paramsassert bsz <= params.max_batch_size, (bsz, params.max_batch_size)prompt_tokens = [self.tokenizer.encode(x, bos=True, eos=False) for x in prompts]min_prompt_size = min([len(t) for t in prompt_tokens])max_prompt_size = max([len(t) for t in prompt_tokens])total_len = min(params.max_seq_len, max_gen_len + max_prompt_size)tokens = torch.full((bsz, total_len), self.tokenizer.pad_id).cuda().long()for k, t in enumerate(prompt_tokens):tokens[k, : len(t)] = torch.tensor(t).long()input_text_mask = tokens != self.tokenizer.pad_idstart_pos = min_prompt_sizeprev_pos = 0for cur_pos in range(start_pos, total_len):logits = self.model.forward(tokens[:, prev_pos:cur_pos], prev_pos)if temperature > 0:probs = torch.softmax(logits / temperature, dim=-1)next_token = sample_top_p(probs, top_p)else:next_token = torch.argmax(logits, dim=-1)next_token = next_token.reshape(-1)# only replace token if prompt has already been generatednext_token = torch.where(input_text_mask[:, cur_pos], tokens[:, cur_pos], next_token)tokens[:, cur_pos] = next_tokenprev_pos = cur_posdecoded = []for i, t in enumerate(tokens.tolist()):# cut to max gen lent = t[: len(prompt_tokens[i]) + max_gen_len]# cut to eos tok if anytry:t = t[: t.index(self.tokenizer.eos_id)]except ValueError:passdecoded.append(self.tokenizer.decode(t))return decodeddef sample_top_p(probs, p):probs_sort, probs_idx = torch.sort(probs, dim=-1, descending=True)probs_sum = torch.cumsum(probs_sort, dim=-1)mask = probs_sum - probs_sort > pprobs_sort[mask] = 0.0probs_sort.div_(probs_sort.sum(dim=-1, keepdim=True))next_token = torch.multinomial(probs_sort, num_samples=1)next_token = torch.gather(probs_idx, -1, next_token)return next_token

    1.3 LLaMA的Optimizer設(shè)計、模型加速優(yōu)化與微型版本

    在Optimizer設(shè)計上

    • 該模型使用AdamW優(yōu)化器(Loshchilov和Hutter,2017)進行訓(xùn)練,超參數(shù)設(shè)置為β1=0.9,β2=0.95
      此外,使用余弦學(xué)習(xí)率方式,使最終學(xué)習(xí)率等于最大學(xué)習(xí)率的10%,以及使用0.1的權(quán)重衰減和1.0的梯度剪裁,和2000個warm up策略,使得可以根據(jù)模型的大小改變學(xué)習(xí)率和批次大小

    在模型的加速優(yōu)化方面

  • 首先,使用一個高效的因果多頭注意力方式的實現(xiàn),靈感來自Rabe和Staats(2021)以及Dao等人(2022),這個實現(xiàn)可在xformers庫中找到,可以有效減少內(nèi)存的使用和計算
    具體原理為通過不存儲注意力權(quán)重和不計算由于語言建模任務(wù)的因果性質(zhì)而被掩蓋的鍵/查詢分?jǐn)?shù)來實現(xiàn)的
  • 其次,為了進一步提高訓(xùn)練效率,減少了在check point的后向傳遞中重新計算的激活量,在實現(xiàn)上,通過手動實現(xiàn)trasnformer層的后向函數(shù)來進行操作
    為了充分受益于這種優(yōu)化,還通過如Korthikanti等人(2022)中采用的方法,進行使用模型和序列并行來減少模型的內(nèi)存使用
  • 最后,該工作還盡可能地重疊激活的計算和GPU之間在網(wǎng)絡(luò)上的通信
    最終的優(yōu)化性能效果為:當(dāng)訓(xùn)練一個65B參數(shù)的模型時,代碼在2048A100的GPU上處理大約380個token/秒/GPU,并耗費80GB的內(nèi)存,這意味著對包含1.4Ttoken的數(shù)據(jù)集進行訓(xùn)練大約花費了21天
  • LLaMA發(fā)布不久后,一些研究者基于它做了不少工作

    • 一開始最小參數(shù)7B的模型也需要近30GB的GPU才能運行,但通過比特和字節(jié)庫進行浮點優(yōu)化,能夠讓模型在單個NVIDIA RTX 3060(顯存一般12G)上運行
    • 之后,GitHub 上的一名研究人員甚至能夠在Ryzen 7900X CPU上運行LLM的7B 版本,每秒能推斷出幾個單詞
    • 再之后,有研究者推出了llama.cpp,無需 GPU,就能運行 LLaMA
      llama.cpp 項目實現(xiàn)了在MacBook上運行 LLaMA,還有開發(fā)者成功的在 4GB RAM 的樹莓派上運行了 LLaMA 7B

    第二部分 各種微調(diào)LLaMA:Alpaca(self-instruct)、Vicuna(shareGPT)、BELLE(self-instruct)

    2.1 Stanford Alpaca:結(jié)合英文語料通過Self Instruct方式微調(diào)LLaMA 7B

    2.1.1 什么是self-instruct方式:提示GPT3/GPT3.5/GPT4的API收集數(shù)據(jù)

    3月中旬,斯坦福發(fā)布Alpaca(中文名:羊駝):號稱只花100美元,人人都可微調(diào)Meta家70億參數(shù)的LLaMA大模型(即LLaMA 7B),具體做法是通過52k指令數(shù)據(jù),然后在8個80GB A100上訓(xùn)練3個小時,使得Alpaca版的LLaMA 7B在單純對話上的性能比肩GPT-3.5(text-davinci-003),這便是指令調(diào)優(yōu)LLaMA的意義所在

    • 論文《Alpaca: A Strong Open-Source Instruction-Following Model》
    • 代碼地址:https://github.com/tatsu-lab/stanford_alpaca

    可能有讀者有疑問,即52k數(shù)據(jù)都長啥樣呢?這52K數(shù)據(jù)存在Alpaca項目的alpaca_data.json文件中,這個JSON文件是一個字典列表,每個字典包含以下字段:

    • instruction: str,描述了模型應(yīng)該執(zhí)行的任務(wù),52K 條指令中的每一條都是唯一的
    • input: str,要么是上下文,要么直接輸入(optional context or input for the task),例如,當(dāng)指令是“總結(jié)以下文章”時,輸入就是文章,大約 40% 的示例有輸入
    • output: str,由GPT3.5對應(yīng)的API即 text-davinci-003生成的指令的答案

    而斯坦福團隊微調(diào)LLaMA 7B所用的52K指令數(shù)據(jù),便是通過Self-Instruct『Self-Instruct是來自華盛頓大學(xué)Yizhong Wang等22年12月通過這篇論文《SELF-INSTRUCT: Aligning Language Model with Self Generated Instructions》提出的』提示GPT3的API拿到的

    ?具體而言,論文中提出

  • 人工設(shè)計175個任務(wù),每個任務(wù)都有對應(yīng)的{指令 輸入 輸出/實例}或{指令 輸出/實例},將這175個任務(wù)數(shù)據(jù)作為種子集
  • 然后提示模型比如GPT3對應(yīng)的API即 text-davinci-001 (原論文中沒用text-davinci-003,because their newer engines are trained with the latest user data and are likely to already see the SUPERNI evaluation set,但實際應(yīng)用時比如斯坦福Alpaca指定的GPT3.5的API即 text-davinci-003生成指令,包括很快你將看到,23年4月還有微軟的研究者指定GPT4的API生成指令),使用種子集作為上下文示例來生成更多新的指令
  • 對該模型生成的指令判斷是否分類任務(wù)
  • 使用模型生成實例
  • 對上述模型生成的數(shù)據(jù){指令 輸入 輸出/實例}過濾掉低質(zhì)量或相似度高的
  • 將經(jīng)過過濾和后處理的數(shù)據(jù)添加到種子池中
    一直重復(fù)上述2-6步直到種子池有足夠多的數(shù)據(jù)
    關(guān)鍵代碼如下: def openai_completion(prompts: Union[str, Sequence[str], Sequence[dict[str, str]], dict[str, str]],decoding_args: OpenAIDecodingArguments,model_name="text-davinci-003",sleep_time=2,batch_size=1,max_instances=sys.maxsize,max_batches=sys.maxsize,return_text=False,**decoding_kwargs, ) -> Union[Union[StrOrOpenAIObject], Sequence[StrOrOpenAIObject], Sequence[Sequence[StrOrOpenAIObject]],]:"""prompts:輸入提示,可以是單個字符串、字符串列表、字典或字典列表decoding_args:解碼參數(shù),用于指定如何生成文本model_name:要使用的模型名稱,默認(rèn)為"text-davinci-003"sleep_time:在達到速率限制時,程序暫停的時間(以秒為單位)batch_size:在單個請求中發(fā)送的prompts的數(shù)量max_instances:要解碼的prompts的最大數(shù)量max_batches:要解碼的批次的最大數(shù)量(此參數(shù)將在未來被棄用)return_text:如果為True,則返回文本而不是包含諸如logprob等信息的完整completion對象decoding_kwargs:其他解碼參數(shù),例如best_of和logit_bias"""# 函數(shù)首先檢查是否有單個prompt,如果是,則將其轉(zhuǎn)換為列表# 然后,根據(jù)最大實例數(shù)量截取prompts。接著,將prompts分成批次以便進行批處理is_single_prompt = isinstance(prompts, (str, dict))if is_single_prompt:prompts = [prompts]if max_batches < sys.maxsize:logging.warning("`max_batches` will be deprecated in the future, please use `max_instances` instead.""Setting `max_instances` to `max_batches * batch_size` for now.")max_instances = max_batches * batch_sizeprompts = prompts[:max_instances]num_prompts = len(prompts)prompt_batches = [prompts[batch_id * batch_size : (batch_id + 1) * batch_size]for batch_id in range(int(math.ceil(num_prompts / batch_size)))]'''函數(shù)遍歷這些批次,并嘗試與OpenAI API進行交互。當(dāng)遇到OpenAIError時,會根據(jù)錯誤類型采取不同的措施如果是因為速率限制,程序?qū)和R欢螘r間再重試。如果提示過長,程序?qū)p小目標(biāo)長度再重試。'''completions = []for batch_id, prompt_batch in tqdm.tqdm(enumerate(prompt_batches),desc="prompt_batches",total=len(prompt_batches),):batch_decoding_args = copy.deepcopy(decoding_args) # cloning the decoding_argswhile True:try:shared_kwargs = dict(model=model_name,**batch_decoding_args.__dict__,**decoding_kwargs,)completion_batch = openai.Completion.create(prompt=prompt_batch, **shared_kwargs)choices = completion_batch.choicesfor choice in choices:choice["total_tokens"] = completion_batch.usage.total_tokenscompletions.extend(choices)breakexcept openai.error.OpenAIError as e:logging.warning(f"OpenAIError: {e}.")if "Please reduce your prompt" in str(e):batch_decoding_args.max_tokens = int(batch_decoding_args.max_tokens * 0.8)logging.warning(f"Reducing target length to {batch_decoding_args.max_tokens}, Retrying...")else:logging.warning("Hit request rate limit; retrying...")time.sleep(sleep_time) # Annoying rate limit on requests.# 最后,函數(shù)根據(jù)return_text、decoding_args.n以及是否為單個prompt的情況返回不同類型的結(jié)果if return_text:completions = [completion.text for completion in completions]if decoding_args.n > 1:# make completions a nested list, where each entry is a consecutive decoding_args.n of original entries.completions = [completions[i : i + decoding_args.n] for i in range(0, len(completions), decoding_args.n)]if is_single_prompt:# Return non-tuple if only 1 input and 1 generation.(completions,) = completionsreturn completions
  • 而斯坦福的Alpaca,就是花了不到500美元使用OpenAI API生成了5.2萬個這樣的示例微調(diào)LLaMA搞出來的,個人覺得可以取名為?instructLLaMA-7B,^_^

    值得一提的是,后來23年4月有微軟的研究者提示GPT4的API進行指令微調(diào)「論文地址:INSTRUCTION TUNING WITH GPT-4、GitHub地址:instruction-Tuning-with-GPT-4、項目地址:使用GPT4進行指令調(diào)優(yōu)」,從而生成以下數(shù)據(jù)

    • English Instruction-Following Data,generated by GPT-4 using Alpaca prompts

      這部分?jǐn)?shù)據(jù)在項目文件?alpaca_gpt4_data.json?里,contains 52K instruction-following data generated by GPT-4 with prompts in Alpaca. This JSON file has the same format as Alpaca data, except the output is generated by GPT-4:
      instruction: str, describes the task the model should perform. Each of the 52K instructions is unique.
      input: str, optional context or input for the task.
      output: str, the answer to the instruction as generated by GPT-4.
    • Chinese Instruction-Following Data,即上面英文數(shù)據(jù)的中文翻譯,存儲在項目文件alpaca_gpt4_data_zh.json 里
    • Comparison Data ranked by GPT-4,好訓(xùn)練一個獎勵模型

      存儲在?comparision_data.json?文件里,ranked responses from three models, including GPT-4, GPT-3.5 and OPT-IML by asking GPT-4 to rate the quality.
      user_input: str, prompts used for quering LLMs.
      completion_a: str, a model completion which is ranked higher than completion_b.
      completion_b: str, a different model completion which has a lower quality score.
    • Answers on Unnatural Instructions Data,該數(shù)據(jù)用于大規(guī)模量化 GPT-4 與我們的指令調(diào)整模型(即LLaMA by instruction tuning with GPT4)之間的差距,而縮小與GPT4的差距便是本次指令調(diào)優(yōu)的目標(biāo)

    2.1.2 微調(diào)LLM時一般都會用到Hugging face實現(xiàn)的Transformers庫的Trainer類

    可能有讀者疑問,那微調(diào)的代碼長啥樣呢?實際上,微調(diào)步驟大同小異,據(jù)代碼:tatsu-lab/stanford_alpaca · GitHub,可得微調(diào)的步驟如下

  • 導(dǎo)入所需的庫:包括torch,transformers等。
  • 定義一些全局變量,如特殊字符、提示模板等。
  • 定義用于處理模型、數(shù)據(jù)和訓(xùn)練參數(shù)的數(shù)據(jù)類。
  • 定義輔助函數(shù),如:
    • safe_save_model_for_hf_trainer:安全地保存訓(xùn)練器中的模型;
    • smart_tokenizer_and_embedding_resize:調(diào)整分詞器和詞嵌入大小;
    • _tokenize_fn:將字符串序列進行分詞;
    • preprocess:預(yù)處理數(shù)據(jù),對源數(shù)據(jù)和目標(biāo)數(shù)據(jù)進行分詞。
  • 定義SupervisedDataset類,用于加載數(shù)據(jù)、格式化輸入、進行分詞等操作。
  • 定義DataCollatorForSupervisedDataset類,用于將數(shù)據(jù)集的實例整理為批次。
  • 定義make_supervised_data_module函數(shù),用于創(chuàng)建監(jiān)督學(xué)習(xí)任務(wù)的數(shù)據(jù)集和整理器。
  • 定義train函數(shù),用于執(zhí)行以下操作:
    a. 解析命令行參數(shù):使用transformers.HfArgumentParser解析命令行參數(shù),將它們分為模型參數(shù)、數(shù)據(jù)參數(shù)和訓(xùn)練參數(shù)
    b.?加載預(yù)訓(xùn)練模型:使用transformers.AutoModelForCausalLM.from_pretrained從預(yù)訓(xùn)練的模型檢查點加載一個用于因果語言建模的模型
    c.?加載分詞器:使用transformers.AutoTokenizer.from_pretrained從預(yù)訓(xùn)練的模型檢查點加載分詞器
    d.?為分詞器添加特殊字符:根據(jù)需要,將特殊字符添加到分詞器中
    e. 創(chuàng)建數(shù)據(jù)集和整理器:使用make_supervised_data_module函數(shù)為監(jiān)督學(xué)習(xí)任務(wù)創(chuàng)建數(shù)據(jù)集和整理器
    f. 實例化Trainer類:實例化transformers.Trainer類,并傳入模型、分詞器、訓(xùn)練參數(shù)以及數(shù)據(jù)集。Trainer類負責(zé)管理訓(xùn)練過程
    g.?訓(xùn)練模型:調(diào)用Trainer類的train()方法對模型進行微調(diào),相當(dāng)于鏈路就是:transformers庫 ?Trainer類 ?train函數(shù)
    h.?保存模型狀態(tài):在訓(xùn)練完成后,調(diào)用Trainer.save_state()方法保存模型的狀態(tài)
    i.?將訓(xùn)練器的模型安全地保存到磁盤:使用safe_save_model_for_hf_trainer函數(shù)將訓(xùn)練器中的模型安全地保存到磁盤
  • 如果這個腳本是主程序,則調(diào)用train函數(shù)以開始訓(xùn)練過程
  • 可能,很快便有同學(xué)疑問,怎么沒有預(yù)想中的損失計算、梯度下降、參數(shù)更新呢,實際上這三步的具體實現(xiàn)都封裝在了Hugging face社區(qū)實現(xiàn)的鼎鼎大名的transformers的Trainer類中:transformers/trainer.py at main · huggingface/transformers · GitHub

    這個?transformers/trainer.py?文件的主要部分如下

    ????????? 導(dǎo)入:文件首先導(dǎo)入了一些必要的Python庫,如os、sys、logging以及其他一些庫。它還導(dǎo)入了Hugging Face庫中的一些相關(guān)模塊,如datasets、transformers等
    ????????? TrainerState:這個類用于保存訓(xùn)練器的狀態(tài),包括當(dāng)前的epoch、迭代步數(shù)、最佳指標(biāo)值等

    ????????? TrainOutput:這個類用于返回訓(xùn)練過程的結(jié)果,包括訓(xùn)練損失、訓(xùn)練步數(shù)等

    ????????? TrainerControl:這個類提供了一種用于控制訓(xùn)練循環(huán)的機制,例如,當(dāng)用戶想要在某個特定的迭代步數(shù)時停止訓(xùn)練

    ????????? Trainer:這是文件中的主要類,用于訓(xùn)練和評估Transformers模型,它包含許多方法,如train、evaluate、predict等

    更具體的,Trainer類包括如下關(guān)鍵方法:

    __init__:初始化方法,用于創(chuàng)建訓(xùn)練器對象。它接收模型、訓(xùn)練參數(shù)、數(shù)據(jù)集等作為輸入,并設(shè)置相關(guān)屬性

    def __init__(self,model: PreTrainedModel,args: TrainingArguments,train_dataset: Optional[Dataset] = None,eval_dataset: Optional[Dataset] = None,tokenizer: Optional[PreTrainedTokenizerBase] = None,data_collator: Optional[DataCollator] = None,train_iterator: Optional[DataLoader] = None,eval_iterator: Optional[DataLoader] = None,... ):

    train:這個方法負責(zé)整個訓(xùn)練過程,它包括遍歷數(shù)據(jù)集、計算損失、計算梯度、更新模型參數(shù)以及日志記錄等

    • 遍歷數(shù)據(jù)集:train方法通過使用dataloader來遍歷訓(xùn)練數(shù)據(jù)集 for step, inputs in enumerate(epoch_iterator):
    • 計算損失:損失計算在training_step方法中,接收輸入數(shù)據(jù)并產(chǎn)生預(yù)測輸出,然后,這個預(yù)測輸出會與真實輸出(標(biāo)簽)進行比較,以計算損失 outputs = model(**inputs) 上述代碼行使用model(已經(jīng)加載了預(yù)訓(xùn)練模型)和inputs(包含輸入數(shù)據(jù)的字典)計算模型的預(yù)測輸出。這個outputs變量包含模型預(yù)測的結(jié)果
      接下來,我們從outputs中獲取預(yù)測結(jié)果,并與真實標(biāo)簽(即labels)進行比較,以計算損失 loss = outputs.loss outputs.loss是模型預(yù)測輸出和真實輸出(標(biāo)簽)之間的損失。這個損失值將用于計算梯度并更新模型參數(shù)
    • 計算梯度:loss.backward()這行代碼計算模型參數(shù)關(guān)于損失的梯度 loss.backward()
    • 梯度累積:當(dāng)gradient_accumulation_steps大于1時,梯度會被累積,而不是立即更新模型參數(shù) if (step + 1) % self.args.gradient_accumulation_steps == 0:
    • 更新模型參數(shù):optimizer.step()這行代碼根據(jù)計算出的梯度來更新模型參數(shù) self.optimizer.step()
    • 學(xué)習(xí)率調(diào)整:lr_scheduler.step()根據(jù)預(yù)定義的學(xué)習(xí)率調(diào)度策略更新學(xué)習(xí)率 self.lr_scheduler.step()
    • 日志記錄:log方法用于記錄訓(xùn)練過程中的一些關(guān)鍵指標(biāo),例如損失、學(xué)習(xí)率等

    ?evaluate:這個方法用于評估模型在驗證數(shù)據(jù)集上的性能,返回評估結(jié)果

    def evaluate(self, eval_dataset: Optional[Dataset] = None, ignore_keys: Optional[List[str]] = None ) -> Dict[str, float]:

    predict:這個方法用于在給定的數(shù)據(jù)集上進行預(yù)測,返回預(yù)測結(jié)果

    def predict(self, test_dataset: Dataset, ignore_keys: Optional[List[str]] = None ) -> PredictionOutput:

    save_model:這個方法用于將訓(xùn)練好的模型保存到指定的目錄

    def save_model(self, output_dir: Optional[str] = None):

    ????????? ShardedDDPOption:這是一個可選的類,用于支持使用混合精度和ZeRO進行分布式訓(xùn)練


    2.1.3 Alpaca-LoRA:通過PEFT庫在消費級GPU上微調(diào)「基于LLaMA的Alpaca」

    在神經(jīng)網(wǎng)絡(luò)模型中,模型參數(shù)通常以矩陣的形式表示。對于一個預(yù)訓(xùn)練好的模型,其參數(shù)矩陣已經(jīng)包含了很多有用的信息。為了使模型適應(yīng)特定任務(wù),我們需要對這些參數(shù)進行微調(diào)

    LoRA的核心思想是用一種低秩的方式來調(diào)整這些參數(shù)矩陣。在數(shù)學(xué)上,低秩意味著一個矩陣可以用兩個較小的矩陣相乘來近似,通過論文《LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS》可知(這是解讀之一)

  • 選擇目標(biāo)層:首先,在預(yù)訓(xùn)練神經(jīng)網(wǎng)絡(luò)模型中選擇要應(yīng)用LoRA的目標(biāo)層。這些層通常是與特定任務(wù)相關(guān)的,如自注意力機制中的查詢Q和鍵K矩陣
  • 初始化映射矩陣和逆映射矩陣:為目標(biāo)層創(chuàng)建兩個較小的矩陣A和B
    ? A是映射矩陣(隨機高斯分布初始化),維度上是升維
    ? B是逆映射矩陣(用0矩陣初始化),維度上是降維
    其中,矩陣的大小由LoRA的秩(rank)和alpha值確定
  • 參數(shù)變換:將目標(biāo)層的原始參數(shù)矩陣W通過映射矩陣A和逆映射矩陣B進行變換。計算公式為:W' = W + A?* B。這里W'是變換后的參數(shù)矩陣
  • 微調(diào)模型:使用新的參數(shù)矩陣W'替換目標(biāo)層的原始參數(shù)矩陣W,然后在特定任務(wù)的訓(xùn)練數(shù)據(jù)上對模型進行微調(diào)
  • 梯度更新:在微調(diào)過程中,計算損失函數(shù)關(guān)于映射矩陣A和逆映射矩陣B的梯度,并使用優(yōu)化算法(如Adam、SGD等)對A和B進行更新
    注意,在更新過程中,原始參數(shù)矩陣W保持不變,說白了,訓(xùn)練的時候固定原始PLM的參數(shù),只訓(xùn)練降維矩陣A與升維矩陣B
  • 重復(fù)更新:在訓(xùn)練的每個批次中,重復(fù)步驟3-5,直到達到預(yù)定的訓(xùn)練輪次(epoch)或滿足收斂條件
  • 總之,LoRA的詳細步驟包括選擇目標(biāo)層、初始化映射矩陣和逆映射矩陣、進行參數(shù)變換和模型微調(diào)。在微調(diào)過程中,模型會通過更新映射矩陣U和逆映射矩陣V來學(xué)習(xí)特定任務(wù)的知識,從而提高模型在該任務(wù)上的性能。

    額外說一下,這個LoRA的應(yīng)用還是挺廣的,比如后續(xù)微軟推出的DeepSpeed-Chat便用了這個方法

    DeepSpeed-Chat的實現(xiàn)中,當(dāng)設(shè)置LoRA的低秩維度lora_dim(如lora_dim=128)時,即認(rèn)為啟用了LoRA訓(xùn)練,則將原始模型中名稱含有“deoder.layers.”且為線性層修改為LoRA層,具體操作為:

  • 將原始結(jié)構(gòu)的weight參數(shù)凍結(jié);
  • 新引入了2個線性層lora_right_weight和lora_left_weight,可實現(xiàn)先降維至lora_dim再升維回原維度;
  • LoRA層主要實現(xiàn)了兩分支通路,一條分支為已被凍結(jié)weight參數(shù)的原始結(jié)構(gòu)、另一條分支為新引入的降維再升維線性層組
  • # applications/DeepSpeed-Chat/training/step1_supervised_finetuning/main.py # 判斷是否啟用LoRA模式 if args.lora_dim > 0: """ 如果啟用,則對名稱中含有“decoder.layers.”且為線性層的結(jié)構(gòu)部分引入LoRA旁路(實現(xiàn)先降維后升維的2個線性層), 這類結(jié)構(gòu)基本都是attention、信息交互用的inner線性層, 這類結(jié)構(gòu)的Weight參數(shù)將被凍結(jié),轉(zhuǎn)而優(yōu)化LoRA旁路的參數(shù)。 """args.lora_module_name = "decoder.layers."model = convert_linear_layer_to_lora(model, args.lora_module_name,args.lora_dim)# applications/DeepSpeed-Chat/training/utils/module/lora.py def convert_linear_layer_to_lora(model,part_module_name,lora_dim=0,lora_scaling=1,lora_droppout=0):"""將名稱中帶有"decoder.layers."的線性層轉(zhuǎn)換為lora層""""""取出模型中參數(shù)名含有decoder.layers.的線性層"""repalce_name = []for name, module in model.named_modules():if isinstance(module, nn.Linear) and part_module_name in name:repalce_name.append(name)for name in repalce_name:"""recursive_getattr實現(xiàn)了從model中根據(jù)屬性名取出對應(yīng)原始結(jié)構(gòu)"""module = recursive_getattr(model, name)"""納入原始結(jié)構(gòu)的參數(shù),實例化lora層"""tmp = LinearLayer_LoRA(module.weight, lora_dim, lora_scaling, lora_droppout,module.bias).to(module.weight.device).to(module.weight.dtype)"""recursive_getattr實現(xiàn)了將model對應(yīng)屬性的結(jié)構(gòu)換成lora層實例"""recursive_setattr(model, name, tmp)return model# applications/DeepSpeed-Chat/training/utils/module/lora.py class LinearLayer_LoRA(nn.Module):"""具體的lora層"""def __init__(...):..."""此處的weight和bias即為原始結(jié)構(gòu)中的參數(shù)"""self.weight = weightself.bias = bias···"""凍結(jié)weight部分的參數(shù)"""self.weight.requires_grad = False···self.lora_right_weight = nn.Parameter(torch.zeros(columns, lora_dim))self.lora_left_weight = nn.Parameter(torch.zeros(lora_dim, rows))def forward(self, input):"""LoRA的正向傳播"""···else:return F.linear(input, self.weight, self.bias) + (self.lora_dropout(input) @ self.lora_right_weight @ self.lora_left_weight) * self.lora_scaling

    再額外分析下 這段代碼的最后部分

    # applications/DeepSpeed-Chat/training/utils/module/lora.py class LinearLayer_LoRA(nn.Module):"""具體的lora層"""···def forward(self, input):"""LoRA的正向傳播"""···else:return F.linear(input, self.weight,self.bias) + (self.lora_dropout(input) @ self.lora_right_weight@ self.lora_left_weight) * self.lora_scaling

    常規(guī)部分的正向傳播由transformers所定義,而LoRA部分的正向傳播則由LinearLayer_LoRA(nn.Module)的forward()所定義,即“LoRA層的兩條分支結(jié)果進行加和”

    在代碼中體現(xiàn)為

    F.linear(input, self.weight, self.bias) + (self.lora_dropout(input) @ self.lora_right_weight @ self.lora_left_weight) * self.lora_scaling

    加號左側(cè)為原結(jié)構(gòu)支路,加號右側(cè)為新增支路,self.lora_right_weight和self.lora_left_weight分別為兩個新引入線性層的參數(shù)

    而Huggingface公司推出的PEFT(Parameter-Efficient Fine-Tuning)庫也封裝了LoRA這個方法,PEFT庫可以使預(yù)訓(xùn)練語言模型高效適應(yīng)各種下游任務(wù),而無需微調(diào)模型的所有參數(shù),即僅微調(diào)少量(額外)模型參數(shù),從而大大降低了計算和存儲成本

    ModelFull FinetuningPEFT-LoRA PyTorchPEFT-LoRA DeepSpeed with CPU Offloading
    bigscience/T0_3B (3B params)47.14GB GPU / 2.96GB CPU14.4GB GPU / 2.96GB CPU9.8GB GPU / 17.8GB CPU
    bigscience/mt0-xxl (12B params)OOM GPU56GB GPU / 3GB CPU22GB GPU / 52GB CPU
    bigscience/bloomz-7b1 (7B params)OOM GPU32GB GPU / 3.8GB CPU18.1GB GPU / 35GB CPU

    且PEFT庫支持以下流行的方法

  • LoRA:?LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS
  • Prefix Tuning:?Prefix-Tuning: Optimizing Continuous Prompts for Generation,?P-Tuning v2: Prompt Tuning Can Be Comparable to Fine-tuning Universally Across Scales and Tasks
  • P-Tuning:?GPT Understands, Too
  • Prompt Tuning:?The Power of Scale for Parameter-Efficient Prompt Tuning
  • 而Alpaca-LoRA則可以通過PEFT庫實現(xiàn)的LoRA方法在消費級GPU微調(diào)「基于LLaMA的Alpaca」,比如項目中的這個文件finetune.py 包含了PEFT在LLaMA上的直接應(yīng)用,以及一些與prompt construction和tokenization相關(guān)的代碼,以下是用法示例:

    python finetune.py \--base_model 'decapoda-research/llama-7b-hf' \--data_path 'yahma/alpaca-cleaned' \--output_dir './lora-alpaca'

    我們還可以調(diào)整我們的超參數(shù)(為方便大家理解,我給每個參數(shù)都加了注釋說明):

    python finetune.py \ # 運行微調(diào)腳本--base_model 'decapoda-research/llama-7b-hf' \ # 選擇預(yù)訓(xùn)練的基礎(chǔ)模型--data_path 'yahma/alpaca-cleaned' \ # 用于微調(diào)的數(shù)據(jù)集路徑--output_dir './lora-alpaca' \ # 微調(diào)后模型的輸出目錄--batch_size 128 \ # 設(shè)置每個批次的樣本數(shù)量--micro_batch_size 4 \ # 設(shè)置每個小批次的樣本數(shù)量--num_epochs 3 \ # 設(shè)置訓(xùn)練的輪次(epoch)--learning_rate 1e-4 \ # 設(shè)置學(xué)習(xí)速率--cutoff_len 512 \ # 設(shè)置截斷長度--val_set_size 2000 \ # 設(shè)置驗證集的大小--lora_r 8 \ # 設(shè)置LoRA方法中的秩--lora_alpha 16 \ # 設(shè)置LoRA方法中的alpha值--lora_dropout 0.05 \ # 設(shè)置LoRA方法中的dropout率--lora_target_modules '[q_proj,v_proj]' \ # 設(shè)置使用LoRA進行微調(diào)的模型模塊--train_on_inputs # 指示模型在訓(xùn)練時使用輸入文本

    2.1.4 Alpaca所用的self-instruct的影響力:解決一大批模型的數(shù)據(jù)擴展問題

    很快,通過下文你會發(fā)現(xiàn)

  • self-instruct啟發(fā)出很多「羊駝類模型」
    羊駝率先帶動的self-instruct,啟發(fā)后續(xù)很多人/團隊也用這個方式去采集『提示ChatGPT API』的數(shù)據(jù),比如BELLE、ChatLLaMA、ColossalChat
  • 很多「羊駝類模型」的數(shù)據(jù)被用于微調(diào)新一批模型
    然后還有一批模型各種疊加組合比如『Alpaca/BELLE』,又用于微調(diào)一批批模型
    比如ChatDoctor 有用到Alpaca的數(shù)據(jù)進行微調(diào),再比如有人拿BELLE數(shù)據(jù)tuning去調(diào)chatglm
  • ?一下子出來這么新的模型 似乎有點懵,沒事,請看下文及下一篇文章娓娓道來..

    2.2 Vicuna/FastChat:通過ShareGPT.com的7萬條對話數(shù)據(jù)微調(diào)LLaMA

    23年3.31日,受 Meta LLaMA 和 Stanford Alpaca 項目的啟發(fā),加州大學(xué)伯克利分校(UC?Berkeley)等大學(xué)的研究者根據(jù)從 ShareGPT.com (ShareGPT是一個用戶可以分享他們的 ChatGPT 對話的網(wǎng)站)收集的用戶共享對話微調(diào) LLaMA?推出了Vicuna-13B(中文稱小羊駝,代碼地址:FastChat)。

    在數(shù)據(jù)規(guī)模上,Vicuna從ShareGPT.com 的公共 API 收集了大約 70K 用戶共享對話,且為了確保數(shù)據(jù)質(zhì)量,原作者們將 HTML 轉(zhuǎn)換回 markdown 并過濾掉一些不合適或低質(zhì)量的樣本。此外,將冗長的對話分成更小的部分,以適應(yīng)模型的最大上下文長度,并做了以下改進

    • 內(nèi)存優(yōu)化:為了使 Vicuna 能夠理解長上下文,將最大上下文長度從羊駝中的 512 擴展到 2048,這大大增加了 GPU 內(nèi)存需求,對此通過利用梯度檢查點和閃存注意力來解決內(nèi)存壓力
    • 多輪對話:調(diào)整訓(xùn)練損失以考慮多輪對話,并僅根據(jù)聊天機器人的輸出計算微調(diào)損失。
    • 通過Spot Instance 降低成本:40 倍大的數(shù)據(jù)集和 4 倍的訓(xùn)練序列長度對訓(xùn)練費用提出了相當(dāng)大的挑戰(zhàn)。原作者們使用SkyPilot managed spot 來降低成本『SkyPilot是加州大學(xué)伯克利分校構(gòu)建的一個框架,用于在各種云上輕松且經(jīng)濟高效地運行 ML 工作負載』,方法是利用更便宜的spot instances以及auto-recovery for preemptions and auto zone switch

      該解決方案將 7B 模型的訓(xùn)練成本從 500 美元削減至 140 美元左右,將 13B 模型的訓(xùn)練成本從 1000 美元左右削減至 300 美元

    有兩點值得一提的是

  • 對于個人開發(fā)者而言,Vicuna-13B 只需要大約 28GB 的??GPU 顯存,Vicuna-7B 大約需要14GB GPU顯存,但對于機構(gòu)而言,一般通過8個具有 80GB 顯存的 A100 GPU 進行訓(xùn)練
  • 且Vicuna使用了和Alpaca差不多的超參數(shù) Hyperparameter

    全局批量大小

    Batch Size

    學(xué)習(xí)率

    Learning rate

    EpochsMax lengthWeight decay
    Vicuna-13B1282e-5320480
  • 最終通過直接使用GPT4評估之后,效果還不錯

    Model NameLLaMA(駱駝)Alpaca(羊駝)Vicuna(小羊駝)Bard/ChatGPT
    DatasetPublicly available datasets
    (1.4T token)
    Self-instruct from davinci-003 API
    (52K samples)
    User-shared conversations
    (70K samples)
    N/A
    Training codeN/AAvailableAvailableN/A
    Evaluation metricsAcademic benchmarkAuthor evaluationGPT-4 assessmentMixed
    Training cost
    (7B)
    82K GPU-hours$500 (data) + $100 (training)$140 (training)N/A
    Training cost
    (13B)
    135K GPU-hoursN/A$300 (training)N/A

    2.3 BELLE:結(jié)合中文語料通過Self Instruct方式微調(diào)BLOOMZ-7B或LLaMA

    Stanford Alpaca的種子任務(wù)都是英語,收集的數(shù)據(jù)也都是英文,因此訓(xùn)練出來的模型未對中文優(yōu)化。為了提升對話模型在中文上的效果,70 億參數(shù)的中文對話大模型 BELLE『Bloom-Enhanced Large Language model Engine』來了(這是項目地址)。

    在數(shù)據(jù)方面,結(jié)合以下兩方面的數(shù)據(jù):

    • Alpaca 的 5.2 萬條英文數(shù)據(jù)
    • 通過Alpaca的數(shù)據(jù)收集代碼生成的約 100 萬條中文數(shù)據(jù)『也僅使用由 GPT3.5 即模型text-davinci-003 生產(chǎn)的數(shù)據(jù),不包含任何其他數(shù)據(jù),如果想使用ChatGPT的API比如gpt-3.5-turbo模型,可通過參數(shù)控制』

    模型訓(xùn)練上,有

    • 基于BLOOMZ-7B1-mt優(yōu)化后的模型:BELLE-7B-0.2M,BELLE-7B-0.6M,BELLE-7B-1M,BELLE-7B-2M
    • 基于huggingface的LLaMA實例實現(xiàn)調(diào)優(yōu)的模型:BELLE-LLAMA-7B-2M,BELLE-LLAMA-13B-2M

    BLOOM是由HuggingFace于2022年3月中旬推出的大模型,規(guī)模最大版本的參數(shù)量達到176B(GPT-3是175B),基于從 Megatron-LM GPT-2修改而來的僅解碼器 transformer 模型架構(gòu),對應(yīng)的論文為《BLOOM: A 176B-Parameter Open-Access Multilingual Language Model》(翻譯之一,解讀之一)
    至于HuggingFace是著名開源工具Transformers的開發(fā)公司,很多推理工具都會支持Transformers中的模型


    截至23年3月中旬,超過100B參數(shù)量且能夠支持中文的開源大模型只有BLOOM和GLM-130B

    該項目主要包含以下三部分內(nèi)容:

    • 175 個中文種子任務(wù),斯坦福Alpaca一樣,每個任務(wù)都包含對應(yīng)的指令/任務(wù)、prompt、輸出
      ? zh_seed_tasks.jsonl:樣例如下
      ?{??"id": "seed_task_20", "name": "horror_movie_opening",
      "instruction": "你需要為一部恐怖電影寫一個創(chuàng)意的開場場景。",
      "instances": [{"input": "","output":" 太陽已經(jīng)落山,留下了一個黑暗的小鎮(zhèn)。微風(fēng)吹拂空蕩的街道,讓每一個冒險走出門外的人感到一陣寒意。唯一的聲音是被風(fēng)吹動的樹葉發(fā)出的輕微沙沙聲。突然,一聲令人毛骨悚然的尖叫聲劃破了寂靜,隨后是玻璃破碎的聲音。一所房子亮起了燈光,可以看到一個人影朝鎮(zhèn)中心奔跑。當(dāng)> 那個人影越來越靠近時,清楚地看到那是一個年輕女子,她渾身血跡斑斑。"}],
      "is_classification": false??}
    • ? prompt_cn.txt: 生成所使用的提示語
      ? 0.5M 生成的數(shù)據(jù)
    • 生成數(shù)據(jù)及其代碼
      沿用 Alpaca 的方式:
      pip install -r requirements.txt
      export OPENAI_API_KEY=YOUR_API_KEY
      python generate_instruction.py generate_instruction_following_data

      默認(rèn)使用 Completion API,模型 text-davinci-003。如果想使用 Chat API 并使用 gpt-3.5-turbo 模型,可通過參數(shù)控制:
      python generate_instruction.py generate_instruction_following_data \
      ??--api=chat --model_name=gpt-3.5-turbo

      輸出文件在 Belle.train.json,可以人工篩選后再使用
    • 基于 BLOOMZ-7B1-mt 模型和 Belle.train.json 訓(xùn)練模型

    2.4 Chinese-LLaMA/Chinese-Alpaca:通過中文數(shù)據(jù)預(yù)訓(xùn)練/指令微調(diào)

    Chinese LLaMA(也稱中文LLaMA,有7B和13B兩個版本,項目地址),相當(dāng)于在原版LLaMA的基礎(chǔ)上擴充了中文詞表并使用了中文數(shù)據(jù)進行二次預(yù)訓(xùn)練,進一步提升了中文基礎(chǔ)語義理解能力,同時,在中文LLaMA的基礎(chǔ)上,且用中文指令數(shù)據(jù)進行指令精調(diào)得Chinese-Alpaca(也稱中文Alpaca,同樣也有7B和13B兩個版本)

    具體而言,主要做了以下三方面的工作

    2.4.1 詞表擴充中文數(shù)據(jù)

    在通用中文語料上訓(xùn)練了基于sentencepiece的20K中文詞表并與原版LLaMA模型的32K詞表進行合并
    排除重復(fù)的token后,得到的最終中文LLaMA詞表大小為49953
    需要注意的是,在fine-tune階段Alpaca比LLaMA多一個pad token,所以中文Alpaca的詞表大小為49954

    這么做的主要原因是原版LLaMA模型的詞表大小是32K,其主要針對英語進行訓(xùn)練,對多語種支持不是特別理想(可以對比一下多語言經(jīng)典模型XLM-R的詞表大小為250K)。通過初步統(tǒng)計發(fā)現(xiàn),LLaMA詞表中僅包含很少的中文字符,所以在切詞時會把中文切地更碎,需要多個byte token才能拼成一個完整的漢字,進而導(dǎo)致信息密度降低

    其對應(yīng)的擴充詞表的腳本代碼為(為方便大家更好的理解,我給每一行的代碼 都加上了注釋)

    # # 導(dǎo)入os模塊,用于操作系統(tǒng)相關(guān)操作 import os # 設(shè)置環(huán)境變量,使得Protocol Buffers使用Python實現(xiàn) os.environ["PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION"]="python" # 導(dǎo)入LlamaTokenizer類 from transformers import LlamaTokenizer # 導(dǎo)入Protocol Buffers格式的sentencepiece模型 from sentencepiece import sentencepiece_model_pb2 as sp_pb2_model # 導(dǎo)入sentencepiece模塊 import sentencepiece as spm # 導(dǎo)入argparse模塊,用于處理命令行參數(shù) import argparse # 創(chuàng)建一個命令行參數(shù)解析器實例 parser = argparse.ArgumentParser() # 添加llama_tokenizer_dir參數(shù),必需 parser.add_argument('--llama_tokenizer_dir', default=None, type=str, required=True) # 添加chinese_sp_model_file參數(shù),可選 parser.add_argument('--chinese_sp_model_file', default='./chinese_sp.model', type=str) # 解析命令行參數(shù) args = parser.parse_args() # 獲取llama_tokenizer_dir參數(shù)值 llama_tokenizer_dir = args.llama_tokenizer_dir # 獲取chinese_sp_model_file參數(shù)值 chinese_sp_model_file = args.chinese_sp_model_file # load, 加載預(yù)訓(xùn)練LlamaTokenizer實例 llama_tokenizer = LlamaTokenizer.from_pretrained(llama_tokenizer_dir) # 創(chuàng)建SentencePieceProcessor實例 chinese_sp_model = spm.SentencePieceProcessor() # 加載中文sentencepiece模型 chinese_sp_model.Load(chinese_sp_model_file) # 將LlamaTokenizer和中文sentencepiece模型轉(zhuǎn)換為Protocol Buffers格式 llama_spm = sp_pb2_model.ModelProto() llama_spm.ParseFromString(llama_tokenizer.sp_model.serialized_model_proto()) chinese_spm = sp_pb2_model.ModelProto() chinese_spm.ParseFromString(chinese_sp_model.serialized_model_proto())# print number of tokens # 輸出LlamaTokenizer和中文sentencepiece模型的詞匯數(shù)量 print(len(llama_tokenizer),len(chinese_sp_model)) # 輸出LlamaTokenizer的所有特殊詞匯 print(llama_tokenizer.all_special_tokens) # 輸出LlamaTokenizer的所有特殊詞匯ID print(llama_tokenizer.all_special_ids) # 輸出LlamaTokenizer的特殊詞匯映射 print(llama_tokenizer.special_tokens_map) # 將中文詞匯添加到LLaMA tokenizer中 # 提取LLaMA tokenizer中的詞匯 llama_spm_tokens_set=set(p.piece for p in llama_spm.pieces) print(len(llama_spm_tokens_set)) print(f"Before:{len(llama_spm_tokens_set)}") for p in chinese_spm.pieces:piece = p.piece# 如果中文詞匯不存在于LLaMA tokenizer中if piece not in llama_spm_tokens_set: new_p = sp_pb2_model.ModelProto().SentencePiece()new_p.piece = piecenew_p.score = 0# 將中文詞匯添加到LLaMA tokenizer中l(wèi)lama_spm.pieces.append(new_p) print(f"New model pieces: {len(llama_spm.pieces)}")# Save, 設(shè)置輸出目錄,用于保存合并后的sentencepiece模型 output_sp_dir = 'merged_tokenizer_sp' # 設(shè)置輸出目錄,用于保存合并后的Chinese-LLaMA tokenizer output_hf_dir = 'merged_tokenizer_hf' # 創(chuàng)建輸出目錄(如果不存在) os.makedirs(output_sp_dir, exist_ok=True) # 打開合并后的sentencepiece模型文件,準(zhǔn)備寫入 with open(output_sp_dir + '/chinese_llama.model', 'wb') as f: # 將合并后的sentencepiece模型序列化為字符串并寫入文件 f.write(llama_spm.SerializeToString()) # 從合并后的sentencepiece模型文件中創(chuàng)建LlamaTokenizer實例 tokenizer = LlamaTokenizer(vocab_file=output_sp_dir + '/chinese_llama.model') # 保存合并后的Chinese-LLaMA tokenizer到指定目錄 tokenizer.save_pretrained(output_hf_dir) # 輸出保存信息 print(f"Chinese-LLaMA tokenizer has been saved to {output_hf_dir}") # Test # 重新加載原始的LLaMA tokenizer llama_tokenizer = LlamaTokenizer.from_pretrained(llama_tokenizer_dir) # 加載合并后的Chinese-LLaMA tokenizer chinese_llama_tokenizer = LlamaTokenizer.from_pretrained(output_hf_dir) # 輸出合并后的tokenizer的所有特殊詞匯 print(tokenizer.all_special_tokens) # 輸出合并后的tokenizer的所有特殊詞匯ID print(tokenizer.all_special_ids) # 輸出合并后的tokenizer的特殊詞匯映射 print(tokenizer.special_tokens_map) # 定義測試文本 text = '''白日依山盡,黃河入海流。欲窮千里目,更上一層樓。 The primary use of LLaMA is research on large language models, including''' # 輸出測試文本 print("Test text:\n", text) print # 使用原始的LLaMA tokenizer對文本進行分詞 print(f"Tokenized by LLaMA tokenizer:{llama_tokenizer.tokenize(text)}") # 使用合并后的Chinese-LLaMA tokenizer對文本進行分詞 print(f"Tokenized by Chinese-LLaMA tokenizer:{chinese_llama_tokenizer.tokenize(text)}")

    這段代碼的主要目的是將一個中文的sentencepiece模型與一個已經(jīng)預(yù)訓(xùn)練好的LLaMA tokenizer進行合并,以便在處理中文文本時,LLaMA tokenizer能更好地進行分詞

    整個過程包括了加載模型、合并模型、保存新的tokenizer以及進行測試等步驟,具體如下

  • 首先,通過argparse模塊獲取命令行參數(shù),包括原始的LLaMA tokenizer的路徑和中文sentencepiece模型的路徑
  • 接著,加載這兩個模型,并將它們轉(zhuǎn)換為Protocol Buffers格式,方便進行操作
  • 然后,從中文sentencepiece模型中提取詞匯,并將這些詞匯添加到LLaMA tokenizer中
    在這個過程中,需要檢查每個中文詞匯是否已經(jīng)存在于LLaMA tokenizer中,以避免重復(fù)添加
  • 將合并后的模型保存到指定的目錄
    即首先保存為sentencepiece模型文件,然后創(chuàng)建一個新的LlamaTokenizer實例,并將其保存為Hugging Face格式的tokenizer
  • 最后,對原始的LLaMA tokenizer和合并后的Chinese-LLaMA tokenizer進行測試,以驗證合并是否成功
    測試包括輸出特殊詞匯、特殊詞匯ID、特殊詞匯映射等信息,以及使用這兩個tokenizer對給定文本進行分詞
    從測試結(jié)果可以看出,合并后的Chinese-LLaMA tokenizer能夠更好地處理中文文本
  • 此外,七月在線ChatGPT原理解析課一學(xué)員在群內(nèi)問道:“如何擴充詞表,訓(xùn)練embedding,然后再與llama的合并,想在自己的數(shù)據(jù)上試試
    “吹牛班的春天”答道:“我知道的方法就是直接改embedding結(jié)構(gòu):初始化參數(shù)concat到以前embedding層上,以前的權(quán)embedding權(quán)重就保留,多出來的部分就后面更新,下圖是以前BERT無損擴詞的思路,可做參考”

    2.4.2 加入中文數(shù)據(jù)的預(yù)訓(xùn)練

    在預(yù)訓(xùn)練階段,使用約20G左右的通用中文語料(與中文BERT-wwmMacBERTLERTPERT中使用的語料一致)在原版LLaMA權(quán)重的基礎(chǔ)上進一步進行預(yù)訓(xùn)練。該過程又分為兩個階段:
    第一階段:凍結(jié)transformer參數(shù),僅訓(xùn)練embedding,在盡量不干擾原模型的情況下適配新增的中文詞向量
    第二階段:使用LoRA技術(shù),為模型添加LoRA權(quán)重(adapter),訓(xùn)練embedding的同時也更新LoRA參數(shù)

    2.4.3 指令精調(diào)

    指令精調(diào)階段的任務(wù)形式基本與Stanford Alpaca相同,訓(xùn)練方案同樣采用了LoRA進行高效精調(diào),并進一步增加了可訓(xùn)練參數(shù)數(shù)量
    在prompt設(shè)計上,精調(diào)以及預(yù)測時采用的都是原版Stanford Alpaca不帶input的模版。對于包含input字段的數(shù)據(jù),采用f"{instruction}+\n+{input}"的形式進行拼接

    且指令精調(diào)階段使用了以下數(shù)據(jù),其中7B模型約2M數(shù)據(jù)、13B模型約3M數(shù)據(jù)。基本構(gòu)成如下:

    數(shù)據(jù)量級來源說明
    中英翻譯數(shù)據(jù)500K外部鏈接在原數(shù)據(jù)集的基礎(chǔ)上進行了采樣+規(guī)則篩選
    pCLUE數(shù)據(jù)300K外部鏈接在原數(shù)據(jù)集的基礎(chǔ)上進行了采樣+規(guī)則篩選
    Alpaca數(shù)據(jù)(英)50K外部鏈接斯坦福原版Alpaca訓(xùn)練數(shù)據(jù)
    Alpaca數(shù)據(jù)(中)50K本地鏈接本項目使用ChatGPT接口將英文版翻譯為中文(篩掉一部分)
    Self-instruction數(shù)據(jù)1~2M(暫無)本項目使用ChatGPT接口進行爬取,提供了一個動態(tài)生成不同領(lǐng)域和指令類型的prompt爬取腳本script/crawl_prompt.py。

    python script/crawl_prompt.py output-file

    思路與Stanford Alpaca中的做法基本一致,一次批量生成20組數(shù)據(jù)(可自行修改模板),以降低爬取成本
    生成的文件包含通過gpt-3.5-turbo爬取的數(shù)據(jù)(你必須擁有OpenAI API key才可以使用)
    雖然指令模板中要求輸出JSON,但系統(tǒng)并不總是會返回合法的JSON,需要自行對返回數(shù)據(jù)進行清洗
    由于爬取時間比較長,建議后臺運行該腳本,且多線程運行時注意OpenAI API的調(diào)用限制上限

    當(dāng)然,針對一些任務(wù)上效果不好!原作者也給出了幾個可能的原因,
    ????????1)本身LLaMA對中文支持不是很好,大多數(shù)相關(guān)衍生工作是直接在原版上進行pretrain/finetune的,而我們采取了更大膽的策略——增加中文詞表,可能進一步加劇中文訓(xùn)練不充分的問題,但從長遠看是否有利于后續(xù)進一步預(yù)訓(xùn)練就得靠時間檢驗了;
    ????????2)指令數(shù)據(jù)的質(zhì)量有待進一步提升;
    ????????3)訓(xùn)練時間、超參等方面還有很大調(diào)整空間;
    ????????4)沒有RLHF;
    ????????5)4-bit量化后效果可能會下降,因此可以嘗試加載FP16模型,效果相對更好一些(也更慢)

    2.5? 小結(jié):基于LLaMA微調(diào)的各模型對比:Alpaca/Vicuna/BELLE/Chinese-LLaMA

    項目一句話描述

    Stanford Alpaca

    結(jié)合英文語料通過Self Instruct方式微調(diào)LLaMA 7B

    Vicuna-13B

    通過ShareGPT.com的7萬條對話數(shù)據(jù)微調(diào)LLaMA
    BELLE

    結(jié)合中文語料通過Self Instruct方式微調(diào)BLOOMZ-7B或LLaMA

    Chinese-LLaMA/Chinese-Alpaca

    通過中文數(shù)據(jù)預(yù)訓(xùn)練/指令微調(diào)LLaMA
    ChatLLaMA(英文版)

    LLaMA的RLHF版

    ColossalChat

    通過self-instruct技術(shù)指令微調(diào)LLaMA且加上RLHF

    更多請查看下一篇:從GLM、ChatGLM到MOSS、ChatDoctor、可商用

    總結(jié)

    以上是生活随笔為你收集整理的类ChatGPT的部署与微调(上):从LLaMA、Alpaca/Vicuna/BELLE、中文版的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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

    精品国产乱码久久久久乱码 | 久久久国产精品无码免费专区 | 老子影院午夜伦不卡 | 波多野结衣一区二区三区av免费 | 成熟人妻av无码专区 | 乱人伦人妻中文字幕无码 | 中国大陆精品视频xxxx | 成 人影片 免费观看 | 国产精品毛多多水多 | 免费无码的av片在线观看 | 女人和拘做爰正片视频 | 又紧又大又爽精品一区二区 | 日韩无码专区 | 午夜无码人妻av大片色欲 | 又大又黄又粗又爽的免费视频 | 国产无套内射久久久国产 | 国产亚洲欧美日韩亚洲中文色 | 亚洲熟妇色xxxxx欧美老妇y | 精品国产麻豆免费人成网站 | 久久人人爽人人爽人人片ⅴ | 色五月五月丁香亚洲综合网 | 国产无套粉嫩白浆在线 | 国产精品香蕉在线观看 | 国产内射爽爽大片视频社区在线 | 曰本女人与公拘交酡免费视频 | 野外少妇愉情中文字幕 | 暴力强奷在线播放无码 | 亚洲熟妇自偷自拍另类 | 国产无套粉嫩白浆在线 | 偷窥日本少妇撒尿chinese | 国产成人亚洲综合无码 | 蜜桃av抽搐高潮一区二区 | 国产香蕉97碰碰久久人人 | 亚洲 高清 成人 动漫 | 精品一区二区三区无码免费视频 | 亚洲乱亚洲乱妇50p | 激情综合激情五月俺也去 | 超碰97人人射妻 | 亚洲啪av永久无码精品放毛片 | 国产婷婷色一区二区三区在线 | 又大又硬又黄的免费视频 | 久久精品一区二区三区四区 | 精品国偷自产在线视频 | 狠狠色噜噜狠狠狠狠7777米奇 | 最新版天堂资源中文官网 | 噜噜噜亚洲色成人网站 | 免费无码一区二区三区蜜桃大 | 久久久成人毛片无码 | 国产欧美熟妇另类久久久 | 国产精品久久久久影院嫩草 | 中文字幕色婷婷在线视频 | 性欧美疯狂xxxxbbbb | 欧美野外疯狂做受xxxx高潮 | 在线精品亚洲一区二区 | 久久国产精品偷任你爽任你 | 国产精品高潮呻吟av久久 | 内射爽无广熟女亚洲 | 中文亚洲成a人片在线观看 | 国产午夜手机精彩视频 | 日韩人妻无码一区二区三区久久99 | 377p欧洲日本亚洲大胆 | 色婷婷香蕉在线一区二区 | 亚洲精品国产第一综合99久久 | 亚洲日韩乱码中文无码蜜桃臀网站 | 国产综合在线观看 | 女人被爽到呻吟gif动态图视看 | 成人欧美一区二区三区黑人免费 | 国产综合久久久久鬼色 | 丰满妇女强制高潮18xxxx | 亚洲人成无码网www | 免费中文字幕日韩欧美 | 一区二区传媒有限公司 | 麻豆人妻少妇精品无码专区 | 亚洲精品成人av在线 | 国产精品久久久久9999小说 | 日日天日日夜日日摸 | 国产av无码专区亚洲awww | 77777熟女视频在线观看 а天堂中文在线官网 | 国内丰满熟女出轨videos | 国产精品久久久久久无码 | 乱中年女人伦av三区 | 精品一区二区三区无码免费视频 | 亚洲综合在线一区二区三区 | 欧美性黑人极品hd | 中文精品无码中文字幕无码专区 | 亚洲欧洲日本无在线码 | 鲁大师影院在线观看 | 国产两女互慰高潮视频在线观看 | 日本护士xxxxhd少妇 | 国产做国产爱免费视频 | 国产sm调教视频在线观看 | 亚洲色成人中文字幕网站 | a片在线免费观看 | 波多野结衣一区二区三区av免费 | 丰满少妇女裸体bbw | 久久精品国产精品国产精品污 | 欧洲欧美人成视频在线 | 最新国产乱人伦偷精品免费网站 | 好男人社区资源 | 丁香花在线影院观看在线播放 | 啦啦啦www在线观看免费视频 | 熟妇人妻无码xxx视频 | 国产亚洲精品久久久久久国模美 | 午夜免费福利小电影 | 成人无码精品一区二区三区 | 日日夜夜撸啊撸 | 国产精品丝袜黑色高跟鞋 | 四虎国产精品一区二区 | 亚洲阿v天堂在线 | 国产口爆吞精在线视频 | 国产精品亚洲lv粉色 | 人妻少妇精品视频专区 | 国产午夜福利亚洲第一 | 久久久亚洲欧洲日产国码αv | 国产精品人人爽人人做我的可爱 | 女人和拘做爰正片视频 | 乱人伦人妻中文字幕无码久久网 | 永久免费观看美女裸体的网站 | 亚洲中文字幕久久无码 | 成人无码视频免费播放 | 377p欧洲日本亚洲大胆 | 捆绑白丝粉色jk震动捧喷白浆 | 男人的天堂av网站 | 在线成人www免费观看视频 | 最近中文2019字幕第二页 | 成人av无码一区二区三区 | 国产网红无码精品视频 | 精品人人妻人人澡人人爽人人 | 乌克兰少妇xxxx做受 | aa片在线观看视频在线播放 | 捆绑白丝粉色jk震动捧喷白浆 | 给我免费的视频在线观看 | 国产精品爱久久久久久久 | 国产另类ts人妖一区二区 | 久久精品国产99精品亚洲 | 亚洲狠狠婷婷综合久久 | 欧美 日韩 人妻 高清 中文 | 午夜精品久久久久久久 | 久久亚洲a片com人成 | 久久久久成人精品免费播放动漫 | 国产高清不卡无码视频 | 亚洲欧美中文字幕5发布 | 国产一区二区不卡老阿姨 | 高清国产亚洲精品自在久久 | 欧美人与禽猛交狂配 | 18精品久久久无码午夜福利 | 精品一区二区不卡无码av | 一本久道高清无码视频 | 国语精品一区二区三区 | 欧美丰满熟妇xxxx性ppx人交 | 国产综合久久久久鬼色 | 欧洲vodafone精品性 | 又大又黄又粗又爽的免费视频 | 强开小婷嫩苞又嫩又紧视频 | 精品国产一区av天美传媒 | 国产成人综合美国十次 | 国产偷国产偷精品高清尤物 | 免费看少妇作爱视频 | www国产亚洲精品久久网站 | 国精产品一品二品国精品69xx | 国产精品高潮呻吟av久久4虎 | 亚洲欧洲中文日韩av乱码 | 丰满少妇弄高潮了www | 日产精品99久久久久久 | 午夜精品久久久久久久 | 精品国产一区av天美传媒 | 国产九九九九九九九a片 | 精品无码国产自产拍在线观看蜜 | 人妻无码αv中文字幕久久琪琪布 | 久久伊人色av天堂九九小黄鸭 | 国产美女极度色诱视频www | 国产精品第一区揄拍无码 | 亚洲午夜无码久久 | 99久久亚洲精品无码毛片 | 久久久精品国产sm最大网站 | 欧美丰满少妇xxxx性 | 欧美日韩在线亚洲综合国产人 | 无码国模国产在线观看 | 国产在线精品一区二区三区直播 | 国产激情一区二区三区 | 日本成熟视频免费视频 | 国产精品无码一区二区三区不卡 | 无码人妻精品一区二区三区下载 | 久久婷婷五月综合色国产香蕉 | 亚洲成av人片在线观看无码不卡 | 久久精品女人天堂av免费观看 | 日韩人妻无码中文字幕视频 | 九九久久精品国产免费看小说 | 毛片内射-百度 | 亚洲自偷自拍另类第1页 | 成人欧美一区二区三区黑人 | 国产手机在线αⅴ片无码观看 | 国产免费久久精品国产传媒 | 色婷婷综合中文久久一本 | 永久免费观看美女裸体的网站 | 一个人看的www免费视频在线观看 | 波多野结衣av一区二区全免费观看 | 亚洲人成影院在线无码按摩店 | 国产精品爱久久久久久久 | 乱码av麻豆丝袜熟女系列 | 亚洲精品国产a久久久久久 | 四虎国产精品免费久久 | 亚洲熟妇色xxxxx欧美老妇y | 亚洲七七久久桃花影院 | 欧美乱妇无乱码大黄a片 | 亚洲成av人影院在线观看 | 人人澡人摸人人添 | 奇米影视7777久久精品人人爽 | 日韩精品一区二区av在线 | 无码人妻丰满熟妇区毛片18 | 丰满岳乱妇在线观看中字无码 | 免费人成网站视频在线观看 | 老熟妇仑乱视频一区二区 | 人人妻人人澡人人爽欧美一区 | 国产人妖乱国产精品人妖 | 性色欲网站人妻丰满中文久久不卡 | 精品夜夜澡人妻无码av蜜桃 | 亚洲国产av精品一区二区蜜芽 | 国产精品久免费的黄网站 | 奇米影视7777久久精品 | 精品国精品国产自在久国产87 | 人人澡人人妻人人爽人人蜜桃 | 日日噜噜噜噜夜夜爽亚洲精品 | 国产又粗又硬又大爽黄老大爷视 | 无码av岛国片在线播放 | 老司机亚洲精品影院 | 免费人成网站视频在线观看 | 无码人妻少妇伦在线电影 | 国产绳艺sm调教室论坛 | 99久久婷婷国产综合精品青草免费 | 中文字幕乱码人妻无码久久 | 无码人妻精品一区二区三区不卡 | 欧美黑人巨大xxxxx | 欧美 日韩 人妻 高清 中文 | 久久伊人色av天堂九九小黄鸭 | 性欧美熟妇videofreesex | 蜜桃av抽搐高潮一区二区 | 动漫av网站免费观看 | 国产在线无码精品电影网 | 秋霞成人午夜鲁丝一区二区三区 | 国产精品办公室沙发 | 男人的天堂2018无码 | 天堂а√在线地址中文在线 | 国产乱人伦av在线无码 | 中文无码伦av中文字幕 | 亚洲欧美日韩国产精品一区二区 | 97精品人妻一区二区三区香蕉 | 国色天香社区在线视频 | 国产精品沙发午睡系列 | 午夜福利一区二区三区在线观看 | 夜先锋av资源网站 | 久久久久久九九精品久 | 国产精品毛多多水多 | 最近中文2019字幕第二页 | 荡女精品导航 | 亚洲小说春色综合另类 | 欧美国产日产一区二区 | 国产精品人妻一区二区三区四 | 亚洲精品鲁一鲁一区二区三区 | 爱做久久久久久 | 久久午夜无码鲁丝片 | 老熟女重囗味hdxx69 | 色综合视频一区二区三区 | 99久久精品国产一区二区蜜芽 | 成人亚洲精品久久久久 | 国产成人久久精品流白浆 | 东京无码熟妇人妻av在线网址 | 亚洲中文无码av永久不收费 | 国产人妻久久精品二区三区老狼 | 红桃av一区二区三区在线无码av | 日本va欧美va欧美va精品 | 亚洲成av人综合在线观看 | 乱人伦中文视频在线观看 | 精品一二三区久久aaa片 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 久在线观看福利视频 | 免费人成在线视频无码 | 久青草影院在线观看国产 | 亚洲s码欧洲m码国产av | 色欲人妻aaaaaaa无码 | 亚洲欧美精品伊人久久 | 无码av中文字幕免费放 | 好爽又高潮了毛片免费下载 | 亚洲精品一区二区三区在线 | 三上悠亚人妻中文字幕在线 | 国产成人无码专区 | 国产成人一区二区三区在线观看 | 无码av岛国片在线播放 | 国产熟妇高潮叫床视频播放 | 又黄又爽又色的视频 | 国产一区二区三区精品视频 | 精品国产麻豆免费人成网站 | 99久久99久久免费精品蜜桃 | 人人妻人人澡人人爽欧美一区 | 国产免费久久精品国产传媒 | 亚洲国产精品久久久久久 | 熟妇人妻中文av无码 | 国产亚洲精品久久久久久久 | 在线播放亚洲第一字幕 | 亚洲日本va中文字幕 | 四虎永久在线精品免费网址 | 在线а√天堂中文官网 | 久久久久成人精品免费播放动漫 | 中国女人内谢69xxxxxa片 | 青青草原综合久久大伊人精品 | 久久精品一区二区三区四区 | 天天爽夜夜爽夜夜爽 | 日本乱偷人妻中文字幕 | 日本xxxx色视频在线观看免费 | 黑人巨大精品欧美一区二区 | 无遮挡啪啪摇乳动态图 | 国产精品鲁鲁鲁 | 亚洲另类伦春色综合小说 | 国产乱人偷精品人妻a片 | 久久综合狠狠综合久久综合88 | 欧美丰满老熟妇xxxxx性 | 日韩少妇白浆无码系列 | 曰韩少妇内射免费播放 | 强开小婷嫩苞又嫩又紧视频 | 97久久国产亚洲精品超碰热 | 国产99久久精品一区二区 | 扒开双腿吃奶呻吟做受视频 | 97色伦图片97综合影院 | 又色又爽又黄的美女裸体网站 | 色窝窝无码一区二区三区色欲 | 丰满诱人的人妻3 | 纯爱无遮挡h肉动漫在线播放 | 小泽玛莉亚一区二区视频在线 | 亚洲人交乣女bbw | 草草网站影院白丝内射 | 国产香蕉尹人综合在线观看 | 亚洲精品成人av在线 | 亚洲va中文字幕无码久久不卡 | 国产激情艳情在线看视频 | 亚洲日韩中文字幕在线播放 | 国产九九九九九九九a片 | 扒开双腿疯狂进出爽爽爽视频 | 久久久久亚洲精品中文字幕 | 久久精品无码一区二区三区 | 强辱丰满人妻hd中文字幕 | 亚洲午夜无码久久 | 亚洲欧美中文字幕5发布 | 人妻天天爽夜夜爽一区二区 | 男女猛烈xx00免费视频试看 | 成人aaa片一区国产精品 | www一区二区www免费 | 伦伦影院午夜理论片 | 国模大胆一区二区三区 | 国产亚洲美女精品久久久2020 | 久久99精品国产.久久久久 | 日韩av无码一区二区三区 | 2019nv天堂香蕉在线观看 | 成人免费视频在线观看 | 影音先锋中文字幕无码 | 人妻少妇被猛烈进入中文字幕 | 97se亚洲精品一区 | 亚洲欧美精品aaaaaa片 | 成熟人妻av无码专区 | 中文字幕+乱码+中文字幕一区 | 亚洲а∨天堂久久精品2021 | 爆乳一区二区三区无码 | 全黄性性激高免费视频 | 久久精品中文闷骚内射 | 我要看www免费看插插视频 | 欧美人妻一区二区三区 | 日本熟妇人妻xxxxx人hd | 黑森林福利视频导航 | 99麻豆久久久国产精品免费 | 国产精品办公室沙发 | 亚洲欧美日韩国产精品一区二区 | 日欧一片内射va在线影院 | 曰韩无码二三区中文字幕 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 一区二区传媒有限公司 | 激情内射日本一区二区三区 | 成人性做爰aaa片免费看 | 澳门永久av免费网站 | 未满成年国产在线观看 | 无码人妻久久一区二区三区不卡 | 无码午夜成人1000部免费视频 | 狠狠色丁香久久婷婷综合五月 | 伊人色综合久久天天小片 | 美女黄网站人色视频免费国产 | 呦交小u女精品视频 | 又大又黄又粗又爽的免费视频 | 欧美日韩一区二区三区自拍 | 国产精品怡红院永久免费 | www国产亚洲精品久久网站 | 欧美成人家庭影院 | 成人亚洲精品久久久久软件 | 国产无遮挡吃胸膜奶免费看 | 欧美大屁股xxxxhd黑色 | 美女极度色诱视频国产 | 亚洲а∨天堂久久精品2021 | 亚洲乱码日产精品bd | 波多野42部无码喷潮在线 | а√天堂www在线天堂小说 | 捆绑白丝粉色jk震动捧喷白浆 | 国产人妻大战黑人第1集 | 国产精品国产自线拍免费软件 | 蜜桃视频插满18在线观看 | 学生妹亚洲一区二区 | 俺去俺来也www色官网 | 伊在人天堂亚洲香蕉精品区 | 欧美日韩一区二区三区自拍 | 少妇无码一区二区二三区 | 婷婷五月综合缴情在线视频 | 粉嫩少妇内射浓精videos | 夜夜夜高潮夜夜爽夜夜爰爰 | 午夜时刻免费入口 | 欧美freesex黑人又粗又大 | 午夜免费福利小电影 | 成人亚洲精品久久久久 | 国产av一区二区精品久久凹凸 | 欧美激情一区二区三区成人 | 少妇的肉体aa片免费 | 男女爱爱好爽视频免费看 | 欧美熟妇另类久久久久久不卡 | 少妇性俱乐部纵欲狂欢电影 | aa片在线观看视频在线播放 | 国产乡下妇女做爰 | 沈阳熟女露脸对白视频 | 亚洲国产精品久久久久久 | 免费无码的av片在线观看 | 老司机亚洲精品影院无码 | 国产真人无遮挡作爱免费视频 | а√资源新版在线天堂 | 内射老妇bbwx0c0ck | 久久精品人人做人人综合 | 国产亚洲人成a在线v网站 | 亚洲高清偷拍一区二区三区 | 色欲久久久天天天综合网精品 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 婷婷色婷婷开心五月四房播播 | 乱人伦人妻中文字幕无码 | 正在播放老肥熟妇露脸 | 久久国产自偷自偷免费一区调 | 午夜熟女插插xx免费视频 | 牲欲强的熟妇农村老妇女视频 | 精品久久久无码人妻字幂 | 无码乱肉视频免费大全合集 | 国产无遮挡又黄又爽免费视频 | 久久久久成人片免费观看蜜芽 | 亚洲 a v无 码免 费 成 人 a v | 三上悠亚人妻中文字幕在线 | 老熟妇乱子伦牲交视频 | 欧美乱妇无乱码大黄a片 | 男人扒开女人内裤强吻桶进去 | 国精品人妻无码一区二区三区蜜柚 | 免费男性肉肉影院 | 永久免费观看美女裸体的网站 | 国产成人精品无码播放 | 国产精品多人p群无码 | 欧美激情综合亚洲一二区 | 亚洲性无码av中文字幕 | 一本一道久久综合久久 | 久久久国产一区二区三区 | 国产午夜亚洲精品不卡下载 | 婷婷五月综合缴情在线视频 | 夜先锋av资源网站 | 久久国语露脸国产精品电影 | 天天躁日日躁狠狠躁免费麻豆 | 性欧美大战久久久久久久 | 国产成人无码区免费内射一片色欲 | 国产精品资源一区二区 | 亚洲日韩av一区二区三区中文 | 久久综合九色综合97网 | 亚洲成a人片在线观看无码3d | 嫩b人妻精品一区二区三区 | 黑人巨大精品欧美黑寡妇 | 久久精品国产一区二区三区肥胖 | 国产猛烈高潮尖叫视频免费 | 亚洲人成影院在线无码按摩店 | 美女极度色诱视频国产 | 东京热无码av男人的天堂 | 亚洲欧美色中文字幕在线 | 亚洲国产精品无码一区二区三区 | 日日躁夜夜躁狠狠躁 | 妺妺窝人体色www婷婷 | 成人欧美一区二区三区黑人 | 亚洲成在人网站无码天堂 | 美女毛片一区二区三区四区 | 亚洲乱亚洲乱妇50p | 精品一二三区久久aaa片 | 欧美丰满熟妇xxxx | 国产熟妇另类久久久久 | ass日本丰满熟妇pics | 天下第一社区视频www日本 | 婷婷五月综合缴情在线视频 | 人妻少妇被猛烈进入中文字幕 | 国产农村妇女高潮大叫 | 十八禁视频网站在线观看 | 在线天堂新版最新版在线8 | 色狠狠av一区二区三区 | 亚洲人成网站免费播放 | 玩弄中年熟妇正在播放 | 国产精品99爱免费视频 | 18禁黄网站男男禁片免费观看 | 日本一区二区更新不卡 | 亚洲成a人一区二区三区 | 国产精品a成v人在线播放 | 国产色在线 | 国产 | 自拍偷自拍亚洲精品10p | 日本精品人妻无码77777 天堂一区人妻无码 | 精品久久久久久人妻无码中文字幕 | 精品水蜜桃久久久久久久 | 亚洲无人区一区二区三区 | 亚洲日韩av片在线观看 | 亚洲 欧美 激情 小说 另类 | 中文字幕人妻丝袜二区 | 久久久成人毛片无码 | 日日天干夜夜狠狠爱 | 色偷偷人人澡人人爽人人模 | 中文字幕乱码亚洲无线三区 | 欧美日韩人成综合在线播放 | 久久亚洲精品成人无码 | 久久久精品欧美一区二区免费 | 色综合久久中文娱乐网 | 国产精品美女久久久 | 影音先锋中文字幕无码 | 国产精品-区区久久久狼 | 少妇被黑人到高潮喷出白浆 | 国产熟妇高潮叫床视频播放 | 国产乱码精品一品二品 | 亚洲男人av天堂午夜在 | 伊人色综合久久天天小片 | 色一情一乱一伦 | 中文字幕人妻无码一区二区三区 | 亚洲精品国产a久久久久久 | 久久综合给合久久狠狠狠97色 | 亚洲精品久久久久久一区二区 | 国产凸凹视频一区二区 | 亚洲精品一区二区三区在线观看 | 麻豆精产国品 | 国产无遮挡吃胸膜奶免费看 | av人摸人人人澡人人超碰下载 | 久久国产36精品色熟妇 | 免费中文字幕日韩欧美 | 无码成人精品区在线观看 | 国产成人综合在线女婷五月99播放 | 色婷婷香蕉在线一区二区 | 伊人久久大香线蕉亚洲 | 初尝人妻少妇中文字幕 | 夫妻免费无码v看片 | 久久亚洲日韩精品一区二区三区 | 一本大道伊人av久久综合 | 一本色道久久综合亚洲精品不卡 | 日产精品高潮呻吟av久久 | 欧美 日韩 人妻 高清 中文 | 无码播放一区二区三区 | 亚洲综合精品香蕉久久网 | 东京一本一道一二三区 | 无码精品人妻一区二区三区av | 国产片av国语在线观看 | 成人一区二区免费视频 | 久久久精品国产sm最大网站 | 中文字幕无码视频专区 | 九月婷婷人人澡人人添人人爽 | 欧美亚洲日韩国产人成在线播放 | 日韩人妻少妇一区二区三区 | 动漫av一区二区在线观看 | 亚洲综合无码一区二区三区 | 亚洲综合精品香蕉久久网 | 国产无遮挡又黄又爽免费视频 | 亚洲国产午夜精品理论片 | 日本精品久久久久中文字幕 | 乱人伦人妻中文字幕无码 | 日本va欧美va欧美va精品 | av无码久久久久不卡免费网站 | 日日碰狠狠躁久久躁蜜桃 | 欧美亚洲国产一区二区三区 | 久久精品国产99精品亚洲 | 东京热男人av天堂 | 乌克兰少妇性做爰 | 日日摸夜夜摸狠狠摸婷婷 | 国产又爽又黄又刺激的视频 | 亚洲成a人片在线观看日本 | 偷窥村妇洗澡毛毛多 | 麻豆国产丝袜白领秘书在线观看 | 日日噜噜噜噜夜夜爽亚洲精品 | 亚洲国产精品成人久久蜜臀 | 夜夜影院未满十八勿进 | 丰满护士巨好爽好大乳 | 亚洲熟妇色xxxxx欧美老妇 | 色爱情人网站 | 欧美国产亚洲日韩在线二区 | 男女性色大片免费网站 | 国产三级精品三级男人的天堂 | 俺去俺来也在线www色官网 | 精品国产av色一区二区深夜久久 | 理论片87福利理论电影 | 日韩精品成人一区二区三区 | 午夜无码人妻av大片色欲 | 国产口爆吞精在线视频 | 永久黄网站色视频免费直播 | 国产精品久久久 | 国产精品美女久久久久av爽李琼 | 成人亚洲精品久久久久 | 正在播放东北夫妻内射 | 成人性做爰aaa片免费看不忠 | 国产在线精品一区二区高清不卡 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 香蕉久久久久久av成人 | 日本熟妇人妻xxxxx人hd | 丰满少妇高潮惨叫视频 | 国产激情一区二区三区 | 久久久国产精品无码免费专区 | 国产精品亚洲一区二区三区喷水 | 窝窝午夜理论片影院 | 国产极品视觉盛宴 | 日韩成人一区二区三区在线观看 | 欧美喷潮久久久xxxxx | 色妞www精品免费视频 | 日本一区二区三区免费播放 | 男人的天堂2018无码 | 成熟妇人a片免费看网站 | 香蕉久久久久久av成人 | 亚洲午夜福利在线观看 | 久久精品99久久香蕉国产色戒 | 欧美亚洲国产一区二区三区 | 欧美日本精品一区二区三区 | 国产乱码精品一品二品 | 亚洲日韩中文字幕在线播放 | 久久久久久久女国产乱让韩 | 国产精品国产三级国产专播 | 麻豆国产97在线 | 欧洲 | 成人无码精品1区2区3区免费看 | 亚洲中文字幕av在天堂 | 狠狠色噜噜狠狠狠7777奇米 | 国产亲子乱弄免费视频 | 无码国产激情在线观看 | 欧美丰满熟妇xxxx性ppx人交 | 中文字幕乱码人妻无码久久 | 六月丁香婷婷色狠狠久久 | 日韩av激情在线观看 | 国产精品亚洲专区无码不卡 | 日本欧美一区二区三区乱码 | 亚洲 欧美 激情 小说 另类 | 熟妇女人妻丰满少妇中文字幕 | 国产九九九九九九九a片 | 精品久久久无码中文字幕 | 一本大道久久东京热无码av | 久久亚洲精品成人无码 | 欧美国产日韩亚洲中文 | 国产色精品久久人妻 | 欧美日韩久久久精品a片 | 亚洲熟女一区二区三区 | 国产av无码专区亚洲a∨毛片 | 学生妹亚洲一区二区 | 久久熟妇人妻午夜寂寞影院 | 久久久亚洲欧洲日产国码αv | 超碰97人人做人人爱少妇 | 国产成人无码av片在线观看不卡 | 亚洲国产一区二区三区在线观看 | 丰满少妇人妻久久久久久 | 国产综合在线观看 | 午夜嘿嘿嘿影院 | 午夜福利不卡在线视频 | 久久人妻内射无码一区三区 | 人妻无码久久精品人妻 | 日日鲁鲁鲁夜夜爽爽狠狠 | 日韩精品成人一区二区三区 | 一区二区三区乱码在线 | 欧洲 | 黑人大群体交免费视频 | 亚洲 另类 在线 欧美 制服 | 99re在线播放 | 性做久久久久久久免费看 | 欧美激情综合亚洲一二区 | 久久亚洲中文字幕精品一区 | 亚洲色欲久久久综合网东京热 | 99精品无人区乱码1区2区3区 | 大肉大捧一进一出视频出来呀 | 欧美激情内射喷水高潮 | 永久免费观看美女裸体的网站 | 国产香蕉尹人视频在线 | 亚洲の无码国产の无码步美 | 18无码粉嫩小泬无套在线观看 | 少妇性l交大片欧洲热妇乱xxx | 性欧美牲交在线视频 | 国产免费观看黄av片 | 国产成人无码一二三区视频 | 国产精品99爱免费视频 | 1000部啪啪未满十八勿入下载 | 人妻天天爽夜夜爽一区二区 | 亚洲中文字幕在线无码一区二区 | 久久aⅴ免费观看 | 东京热无码av男人的天堂 | 人妻有码中文字幕在线 | 亚洲精品中文字幕 | 国产亚洲美女精品久久久2020 | 国产成人无码a区在线观看视频app | 久久99精品国产麻豆 | 国产69精品久久久久app下载 | 国产亚洲精品久久久久久国模美 | 人妻少妇精品视频专区 | 国产精品久久国产三级国 | 国产成人无码一二三区视频 | 永久黄网站色视频免费直播 | 亚洲日韩精品欧美一区二区 | 色婷婷欧美在线播放内射 | 麻花豆传媒剧国产免费mv在线 | 国产成人亚洲综合无码 | 性啪啪chinese东北女人 | 久久久久av无码免费网 | 亚洲人成网站色7799 | 成在人线av无码免观看麻豆 | 夫妻免费无码v看片 | 日本va欧美va欧美va精品 | 日本高清一区免费中文视频 | 丰满少妇人妻久久久久久 | 少妇性l交大片欧洲热妇乱xxx | 精品成在人线av无码免费看 | 午夜福利一区二区三区在线观看 | 狠狠色丁香久久婷婷综合五月 | 成人av无码一区二区三区 | 精品人妻人人做人人爽 | 亚洲一区二区三区在线观看网站 | 成年女人永久免费看片 | 亚洲 欧美 激情 小说 另类 | 天天躁夜夜躁狠狠是什么心态 | 九一九色国产 | 三上悠亚人妻中文字幕在线 | 国产乱人伦av在线无码 | 强开小婷嫩苞又嫩又紧视频 | 精品少妇爆乳无码av无码专区 | 男女猛烈xx00免费视频试看 | 成人亚洲精品久久久久 | 国产亚洲精品久久久闺蜜 | 国产成人无码a区在线观看视频app | 高潮毛片无遮挡高清免费视频 | 欧美丰满熟妇xxxx性ppx人交 | 人妻aⅴ无码一区二区三区 | 国内老熟妇对白xxxxhd | 伊人色综合久久天天小片 | 极品嫩模高潮叫床 | 免费男性肉肉影院 | 97精品国产97久久久久久免费 | 成人av无码一区二区三区 | 无码国内精品人妻少妇 | 久久 国产 尿 小便 嘘嘘 | 六月丁香婷婷色狠狠久久 | 亚洲一区二区三区在线观看网站 | 亚洲精品国产精品乱码不卡 | 国内精品久久久久久中文字幕 | 无码人妻av免费一区二区三区 | 最新版天堂资源中文官网 | 亚洲理论电影在线观看 | 色欲综合久久中文字幕网 | 人人澡人摸人人添 | 亚洲a无码综合a国产av中文 | 国产人妻人伦精品 | 亚洲成av人综合在线观看 | 日日噜噜噜噜夜夜爽亚洲精品 | 搡女人真爽免费视频大全 | 国产精品久久久久影院嫩草 | 精品国产一区二区三区av 性色 | 国产片av国语在线观看 | 国产精品人人爽人人做我的可爱 | 狠狠综合久久久久综合网 | 日本高清一区免费中文视频 | 久久久久亚洲精品中文字幕 | 亚洲国产精品无码一区二区三区 | 国产美女精品一区二区三区 | 久久久久久国产精品无码下载 | 无码人妻少妇伦在线电影 | 99久久精品午夜一区二区 | 天堂在线观看www | 久久亚洲a片com人成 | 熟女少妇在线视频播放 | 中文无码伦av中文字幕 | 欧美老熟妇乱xxxxx | 成人亚洲精品久久久久软件 | 无码福利日韩神码福利片 | 免费乱码人妻系列无码专区 | 亚洲成色在线综合网站 | 日本精品少妇一区二区三区 | 少女韩国电视剧在线观看完整 | 亚洲精品国产品国语在线观看 | 国产精品久久国产三级国 | 精品国产aⅴ无码一区二区 | 国产在线精品一区二区高清不卡 | 精品人妻人人做人人爽 | 国产乱人偷精品人妻a片 | 成年美女黄网站色大免费全看 | 小sao货水好多真紧h无码视频 | 男人的天堂av网站 | 成在人线av无码免观看麻豆 | 成人精品视频一区二区 | 成人免费视频一区二区 | 亚洲无人区午夜福利码高清完整版 | 国内精品久久久久久中文字幕 | 天天爽夜夜爽夜夜爽 | 国产亚洲日韩欧美另类第八页 | 国产精品久久久久久久影院 | 日本精品久久久久中文字幕 | 波多野结衣av一区二区全免费观看 | 亚洲日本在线电影 | 亚洲一区二区三区在线观看网站 | ass日本丰满熟妇pics | 国精产品一区二区三区 | 兔费看少妇性l交大片免费 | 国产精品欧美成人 | 狠狠cao日日穞夜夜穞av | 97夜夜澡人人爽人人喊中国片 | 久久久久成人精品免费播放动漫 | 国产精品亚洲专区无码不卡 | 一本大道久久东京热无码av | 日产精品99久久久久久 | 国产精品久久国产三级国 | 日日碰狠狠丁香久燥 | av在线亚洲欧洲日产一区二区 | 久久国产精品二国产精品 | 精品一区二区三区波多野结衣 | 强奷人妻日本中文字幕 | 大乳丰满人妻中文字幕日本 | 欧美国产日韩久久mv | 欧洲熟妇精品视频 | 女人被男人躁得好爽免费视频 | 国产av无码专区亚洲a∨毛片 | 熟女少妇人妻中文字幕 | 国产精品沙发午睡系列 | 俺去俺来也在线www色官网 | 无码人妻出轨黑人中文字幕 | 无码国内精品人妻少妇 | 内射后入在线观看一区 | 一本久久a久久精品亚洲 | 日韩精品一区二区av在线 | 国产成人综合在线女婷五月99播放 | 精品欧洲av无码一区二区三区 | 沈阳熟女露脸对白视频 | 对白脏话肉麻粗话av | 青春草在线视频免费观看 | 国产激情无码一区二区app | 亚洲中文字幕无码中字 | 欧美喷潮久久久xxxxx | 久久99国产综合精品 | 国产免费无码一区二区视频 | 在教室伦流澡到高潮hnp视频 | 国产精品第一国产精品 | 久久 国产 尿 小便 嘘嘘 | 麻豆av传媒蜜桃天美传媒 | 性欧美牲交在线视频 | 国产69精品久久久久app下载 | 国产精品二区一区二区aⅴ污介绍 | 麻豆果冻传媒2021精品传媒一区下载 | 久久精品国产一区二区三区肥胖 | 伊人久久大香线蕉av一区二区 | 中文字幕无线码 | 免费无码肉片在线观看 | 中文字幕无码日韩欧毛 | 一本久道高清无码视频 | 国产精品美女久久久久av爽李琼 | 少妇的肉体aa片免费 | 久久综合香蕉国产蜜臀av | 宝宝好涨水快流出来免费视频 | 强奷人妻日本中文字幕 | 精品日本一区二区三区在线观看 | av香港经典三级级 在线 | 女人色极品影院 | 亚洲成a人一区二区三区 | 成人一在线视频日韩国产 | 人妻少妇精品视频专区 | 国产精品a成v人在线播放 | 97夜夜澡人人双人人人喊 | 亚洲第一网站男人都懂 | 久久国内精品自在自线 | 一本大道久久东京热无码av | 亚洲a无码综合a国产av中文 | 免费中文字幕日韩欧美 | 精品国产成人一区二区三区 | 国产精品怡红院永久免费 | 在线观看国产一区二区三区 | 精品一区二区三区波多野结衣 | 亚洲精品国偷拍自产在线麻豆 | 日产国产精品亚洲系列 | 亚洲日韩乱码中文无码蜜桃臀网站 | 波多野结衣av一区二区全免费观看 | √天堂中文官网8在线 | 中文字幕无码日韩欧毛 | 中文字幕无码免费久久99 | 波多野结衣高清一区二区三区 | 久久伊人色av天堂九九小黄鸭 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 国内综合精品午夜久久资源 | 欧美性猛交xxxx富婆 | 日日鲁鲁鲁夜夜爽爽狠狠 | 成人免费视频视频在线观看 免费 | 色老头在线一区二区三区 | 四虎永久在线精品免费网址 | av无码久久久久不卡免费网站 | 精品亚洲韩国一区二区三区 | 日日鲁鲁鲁夜夜爽爽狠狠 | 国产成人无码专区 | 日韩精品a片一区二区三区妖精 | 牲交欧美兽交欧美 | 婷婷六月久久综合丁香 | 亚洲中文字幕av在天堂 | 熟女俱乐部五十路六十路av | 捆绑白丝粉色jk震动捧喷白浆 | 国产激情艳情在线看视频 | 色窝窝无码一区二区三区色欲 | 乱人伦人妻中文字幕无码 | 蜜桃视频韩日免费播放 | 亚洲国产精品无码久久久久高潮 | 国产人妻精品一区二区三区 | 无码人妻丰满熟妇区五十路百度 | 久久久婷婷五月亚洲97号色 | 98国产精品综合一区二区三区 | 亚洲天堂2017无码中文 | av香港经典三级级 在线 | 亚洲日韩av一区二区三区四区 | 漂亮人妻洗澡被公强 日日躁 | 亚洲欧美日韩综合久久久 | 亚洲国产精品成人久久蜜臀 | 久久久精品国产sm最大网站 | 99久久婷婷国产综合精品青草免费 | 丝袜 中出 制服 人妻 美腿 | 九九在线中文字幕无码 | 国产精品久久久久影院嫩草 | 三级4级全黄60分钟 | 欧美阿v高清资源不卡在线播放 | 无码午夜成人1000部免费视频 | 国产免费无码一区二区视频 | 免费无码一区二区三区蜜桃大 | 国产欧美精品一区二区三区 | 久久精品中文字幕一区 | 三上悠亚人妻中文字幕在线 | 亚洲欧美国产精品专区久久 | 亚洲精品午夜无码电影网 | 中国大陆精品视频xxxx | 色诱久久久久综合网ywww | 一本色道久久综合亚洲精品不卡 | 性开放的女人aaa片 | 亚洲欧美日韩国产精品一区二区 | 奇米影视7777久久精品 | 免费观看的无遮挡av | 无码人妻久久一区二区三区不卡 | 国产精品无码一区二区三区不卡 | 小鲜肉自慰网站xnxx | 亚洲乱亚洲乱妇50p | 精品欧洲av无码一区二区三区 | 学生妹亚洲一区二区 | 日韩av无码中文无码电影 | 亚洲精品一区二区三区婷婷月 | 牲欲强的熟妇农村老妇女 | 亚洲精品午夜无码电影网 | 国产无套内射久久久国产 | 午夜精品一区二区三区的区别 | 久久亚洲精品中文字幕无男同 | 一本精品99久久精品77 | 国产在线精品一区二区高清不卡 | 国产三级精品三级男人的天堂 | 国产亚洲精品久久久久久久 | 久久久久久a亚洲欧洲av冫 | 欧洲精品码一区二区三区免费看 | 丰满少妇女裸体bbw | 麻豆果冻传媒2021精品传媒一区下载 | 熟妇人妻无乱码中文字幕 | 国产亚洲美女精品久久久2020 | 最新版天堂资源中文官网 | 亚洲欧美国产精品专区久久 | 久久五月精品中文字幕 | 国产亚洲美女精品久久久2020 | 欧美国产日产一区二区 | 久久精品人人做人人综合 | 国产成人精品一区二区在线小狼 | 国产两女互慰高潮视频在线观看 | 日本一区二区三区免费高清 | 未满小14洗澡无码视频网站 | 动漫av一区二区在线观看 | 欧美35页视频在线观看 | 无套内谢的新婚少妇国语播放 | 亚洲国产精华液网站w | 久久久精品456亚洲影院 | 国产av一区二区精品久久凹凸 | 日韩精品无码免费一区二区三区 | 色综合久久中文娱乐网 | 国产精品久久久久久无码 | 中文亚洲成a人片在线观看 | 人妻有码中文字幕在线 | 四虎影视成人永久免费观看视频 | 婷婷五月综合缴情在线视频 | 国产亚洲视频中文字幕97精品 | 欧美变态另类xxxx | 久久久久免费看成人影片 | 暴力强奷在线播放无码 | 窝窝午夜理论片影院 | 国内揄拍国内精品少妇国语 | 色五月丁香五月综合五月 | 亚洲成a人片在线观看无码 | 国产成人精品无码播放 | 婷婷五月综合激情中文字幕 | 中文精品久久久久人妻不卡 | 久久久久99精品成人片 | 两性色午夜视频免费播放 | 荡女精品导航 | 西西人体www44rt大胆高清 | 76少妇精品导航 | 最近免费中文字幕中文高清百度 | 色综合久久88色综合天天 | 久久无码中文字幕免费影院蜜桃 | 亚洲 a v无 码免 费 成 人 a v | 国产激情精品一区二区三区 | www国产亚洲精品久久久日本 | 在线看片无码永久免费视频 | 窝窝午夜理论片影院 | 日日摸日日碰夜夜爽av | 中文字幕人妻丝袜二区 | 午夜福利一区二区三区在线观看 | 国产精品第一国产精品 | 天天躁夜夜躁狠狠是什么心态 | 国产亚洲精品久久久久久大师 | 国产精品99爱免费视频 | 久久久久免费看成人影片 | 特级做a爰片毛片免费69 | 偷窥日本少妇撒尿chinese | 妺妺窝人体色www婷婷 | 国产做国产爱免费视频 | 国产成人人人97超碰超爽8 | 老司机亚洲精品影院无码 | 国产精品久久久久影院嫩草 | 中文字幕无码人妻少妇免费 | 中文字幕+乱码+中文字幕一区 | 午夜精品一区二区三区在线观看 | 国产莉萝无码av在线播放 | 亚洲经典千人经典日产 | 亚洲 欧美 激情 小说 另类 | 性欧美牲交在线视频 | 国产区女主播在线观看 | 国产激情无码一区二区app | 精品成人av一区二区三区 | 国产特级毛片aaaaaaa高清 | 国产又爽又黄又刺激的视频 | 丝袜人妻一区二区三区 | 色欲久久久天天天综合网精品 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 激情爆乳一区二区三区 | 亚洲一区二区观看播放 | 久久婷婷五月综合色国产香蕉 | 免费视频欧美无人区码 | 99久久精品日本一区二区免费 | 亚洲 日韩 欧美 成人 在线观看 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 亚洲日韩av片在线观看 | 亚洲自偷自拍另类第1页 | 无码人妻丰满熟妇区五十路百度 | 狠狠cao日日穞夜夜穞av | 精品日本一区二区三区在线观看 | 国产情侣作爱视频免费观看 | 大地资源网第二页免费观看 | 成熟女人特级毛片www免费 | 国产精品无码一区二区三区不卡 | 亚洲男人av天堂午夜在 | 久久久无码中文字幕久... | 美女黄网站人色视频免费国产 | 国产成人精品三级麻豆 | 亚洲爆乳大丰满无码专区 | 精品国产一区二区三区av 性色 | 中文字幕乱码人妻二区三区 | 欧美国产亚洲日韩在线二区 | 中文字幕乱妇无码av在线 | 久久天天躁狠狠躁夜夜免费观看 | 男人扒开女人内裤强吻桶进去 | 久久午夜无码鲁丝片午夜精品 | 久久精品人妻少妇一区二区三区 | 人妻少妇精品无码专区动漫 | 国产精品亚洲综合色区韩国 | 久久精品人人做人人综合 | 亚洲国产成人a精品不卡在线 | 亚洲欧洲日本综合aⅴ在线 | 男女作爱免费网站 | 亚洲中文字幕成人无码 | 国产香蕉97碰碰久久人人 | 国产精品亚洲lv粉色 | 女高中生第一次破苞av | 麻花豆传媒剧国产免费mv在线 | 在线天堂新版最新版在线8 | 亚洲精品成人av在线 | 未满小14洗澡无码视频网站 | 免费国产成人高清在线观看网站 | 亚洲欧洲中文日韩av乱码 | 国产日产欧产精品精品app | 日韩欧美群交p片內射中文 | 扒开双腿吃奶呻吟做受视频 | 呦交小u女精品视频 | 内射老妇bbwx0c0ck | 波多野结衣aⅴ在线 | 国产亚洲精品久久久久久久久动漫 | 人妻天天爽夜夜爽一区二区 | 国产精品久久精品三级 | 亚洲欧美国产精品专区久久 | 国产精品办公室沙发 | 高清国产亚洲精品自在久久 | 精品 日韩 国产 欧美 视频 | 中文字幕亚洲情99在线 | 久久久久久久人妻无码中文字幕爆 | 夜精品a片一区二区三区无码白浆 | 国产麻豆精品一区二区三区v视界 | 大乳丰满人妻中文字幕日本 | 性欧美牲交xxxxx视频 | 狠狠综合久久久久综合网 | 最新国产乱人伦偷精品免费网站 | 国産精品久久久久久久 | 亚欧洲精品在线视频免费观看 | 久久久av男人的天堂 | 成人免费视频视频在线观看 免费 | 天堂在线观看www | 欧美高清在线精品一区 | 丰满少妇女裸体bbw | 久久久久se色偷偷亚洲精品av | 欧美丰满熟妇xxxx性ppx人交 | 一本久久a久久精品亚洲 | 亚洲国产精品毛片av不卡在线 | 一个人看的www免费视频在线观看 | 国产明星裸体无码xxxx视频 | 亚洲精品国偷拍自产在线麻豆 | 亚洲午夜久久久影院 | 久久综合激激的五月天 | 无码毛片视频一区二区本码 | 国产精品对白交换视频 | 老子影院午夜伦不卡 | 精品国产一区二区三区四区 | 丰满诱人的人妻3 | 欧美日韩一区二区三区自拍 | 99久久精品国产一区二区蜜芽 | 玩弄人妻少妇500系列视频 | а√资源新版在线天堂 | 久久久精品456亚洲影院 | 欧美三级a做爰在线观看 | 欧美35页视频在线观看 | 久久精品国产亚洲精品 | 天天摸天天透天天添 | 久久久久免费精品国产 | 无码毛片视频一区二区本码 | 免费网站看v片在线18禁无码 | 狠狠亚洲超碰狼人久久 | 国产激情无码一区二区 | 久久精品中文闷骚内射 | 国产精品二区一区二区aⅴ污介绍 | 国产女主播喷水视频在线观看 | 精品国产一区av天美传媒 | 亚洲欧美综合区丁香五月小说 | 国产片av国语在线观看 | 久久精品99久久香蕉国产色戒 | 人妻与老人中文字幕 | 国产69精品久久久久app下载 | 一个人看的视频www在线 | 中文无码伦av中文字幕 | 亚洲另类伦春色综合小说 | 亚洲日本在线电影 | 欧美freesex黑人又粗又大 | 天堂无码人妻精品一区二区三区 | 男女作爱免费网站 | 成人亚洲精品久久久久软件 | 国产精品久久久一区二区三区 | 亚洲自偷自拍另类第1页 | 美女张开腿让人桶 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 又色又爽又黄的美女裸体网站 | 欧美freesex黑人又粗又大 | av无码久久久久不卡免费网站 | 国产无av码在线观看 | 国产精品欧美成人 | 又紧又大又爽精品一区二区 | 成人免费无码大片a毛片 | 麻豆精产国品 | 97久久精品无码一区二区 | 日韩人妻无码中文字幕视频 | 久久精品99久久香蕉国产色戒 | 国产真实伦对白全集 | 亚洲精品久久久久中文第一幕 | 天堂亚洲2017在线观看 | 又大又紧又粉嫩18p少妇 | 国产av一区二区三区最新精品 | 国产精品无套呻吟在线 | 亚洲日本va中文字幕 | 精品无码一区二区三区的天堂 | 久久久久人妻一区精品色欧美 | 亚洲成a人片在线观看无码 | 国产无套粉嫩白浆在线 | 最新国产乱人伦偷精品免费网站 | 国产成人人人97超碰超爽8 | 久久五月精品中文字幕 | 一本无码人妻在中文字幕免费 | 噜噜噜亚洲色成人网站 | 亚洲 高清 成人 动漫 | 在线视频网站www色 | 熟女俱乐部五十路六十路av | 国产亚洲精品久久久久久大师 | 中文字幕人成乱码熟女app | v一区无码内射国产 | 精品夜夜澡人妻无码av蜜桃 | 草草网站影院白丝内射 | 特级做a爰片毛片免费69 | 丰满少妇熟乱xxxxx视频 | 特黄特色大片免费播放器图片 | 亚洲一区二区三区偷拍女厕 | 久久久www成人免费毛片 | 中文字幕乱码人妻二区三区 | 国产精品对白交换视频 | 人人妻人人澡人人爽欧美精品 | 激情五月综合色婷婷一区二区 | 久久99精品久久久久婷婷 | 亚洲精品成人福利网站 | 久久久国产精品无码免费专区 | 四虎国产精品免费久久 | 麻豆精品国产精华精华液好用吗 | 国产精品久久久久久久9999 | 少妇邻居内射在线 | 99久久久国产精品无码免费 | 兔费看少妇性l交大片免费 | 久久人人97超碰a片精品 | 欧美丰满老熟妇xxxxx性 | 天天爽夜夜爽夜夜爽 | 日本熟妇乱子伦xxxx | 中文字幕乱妇无码av在线 | 国产偷国产偷精品高清尤物 | 成人欧美一区二区三区黑人免费 | av人摸人人人澡人人超碰下载 | 国产精品久久久久久亚洲影视内衣 | 在线精品国产一区二区三区 | 国产无av码在线观看 | 精品一二三区久久aaa片 | 99久久精品国产一区二区蜜芽 | 女人被男人躁得好爽免费视频 | 青青草原综合久久大伊人精品 | 丰满人妻精品国产99aⅴ | 九九在线中文字幕无码 | 亚洲成a人一区二区三区 | 国产成人无码一二三区视频 | 无码人妻出轨黑人中文字幕 | 女人被男人躁得好爽免费视频 | 色情久久久av熟女人妻网站 | 玩弄人妻少妇500系列视频 | 国产美女精品一区二区三区 | 亚洲欧美国产精品久久 | 欧美国产日韩亚洲中文 | 无码国产乱人伦偷精品视频 | 丰满岳乱妇在线观看中字无码 | 中文字幕无码日韩专区 | 亚洲欧美日韩国产精品一区二区 | 国产午夜无码精品免费看 | 精品国产一区二区三区av 性色 | 免费视频欧美无人区码 | 日本一区二区更新不卡 | 国产精品怡红院永久免费 | 99久久久无码国产aaa精品 | 日本大乳高潮视频在线观看 | 亚洲七七久久桃花影院 | 国产高潮视频在线观看 | 狂野欧美性猛交免费视频 | 亚洲熟熟妇xxxx | 香港三级日本三级妇三级 | 国内老熟妇对白xxxxhd | 高中生自慰www网站 | 精品久久久久久亚洲精品 | 狂野欧美性猛xxxx乱大交 | 无码人妻精品一区二区三区不卡 | 久精品国产欧美亚洲色aⅴ大片 | 成人aaa片一区国产精品 | 成人aaa片一区国产精品 | 精品国产一区二区三区四区在线看 | www一区二区www免费 | 四虎国产精品一区二区 | 亚洲a无码综合a国产av中文 | 亚洲性无码av中文字幕 | 久久精品一区二区三区四区 | 亚洲一区二区三区在线观看网站 | 97久久国产亚洲精品超碰热 | 国模大胆一区二区三区 | 免费人成在线视频无码 | 大屁股大乳丰满人妻 | 亚洲精品无码人妻无码 | 国产香蕉97碰碰久久人人 | 无码人妻黑人中文字幕 | 中文久久乱码一区二区 | 未满成年国产在线观看 | 国产成人综合在线女婷五月99播放 | 强奷人妻日本中文字幕 | 曰韩无码二三区中文字幕 | 久久无码人妻影院 | 综合激情五月综合激情五月激情1 | 日韩成人一区二区三区在线观看 | 亚洲爆乳无码专区 | 国产人妖乱国产精品人妖 | 久久久久av无码免费网 | 亚洲第一无码av无码专区 | 丰满诱人的人妻3 | 麻豆国产丝袜白领秘书在线观看 | 欧洲熟妇色 欧美 | 99久久亚洲精品无码毛片 | 色情久久久av熟女人妻网站 | 精品无码一区二区三区爱欲 | 蜜桃av抽搐高潮一区二区 | 水蜜桃亚洲一二三四在线 | 亚洲色大成网站www国产 | 国产在线一区二区三区四区五区 | 好男人www社区 | 国产真实伦对白全集 | 精品国产一区二区三区四区在线看 | 在线精品亚洲一区二区 | 55夜色66夜色国产精品视频 | 无码人妻精品一区二区三区不卡 | 国产在线精品一区二区三区直播 | 国产偷抇久久精品a片69 | 色狠狠av一区二区三区 | 国产真人无遮挡作爱免费视频 | 亚洲乱码中文字幕在线 | 无码精品国产va在线观看dvd | 国产成人午夜福利在线播放 | 女人被男人爽到呻吟的视频 | 亚洲欧洲日本综合aⅴ在线 | 丰满少妇弄高潮了www | 樱花草在线播放免费中文 | 亚洲国产成人av在线观看 | 99在线 | 亚洲 | 欧美三级a做爰在线观看 | 久久久精品欧美一区二区免费 | 樱花草在线社区www | 日韩 欧美 动漫 国产 制服 | 国产成人无码av一区二区 | 风流少妇按摩来高潮 | 领导边摸边吃奶边做爽在线观看 | 天堂在线观看www | 曰本女人与公拘交酡免费视频 | 又紧又大又爽精品一区二区 | 人妻少妇精品无码专区动漫 | 强奷人妻日本中文字幕 | 红桃av一区二区三区在线无码av | 久在线观看福利视频 | 国产成人无码一二三区视频 | 亚洲大尺度无码无码专区 | 人妻插b视频一区二区三区 | 国内老熟妇对白xxxxhd | 色婷婷综合激情综在线播放 | 亚洲精品久久久久avwww潮水 | 亚洲色欲色欲欲www在线 | 少妇高潮一区二区三区99 | 无码纯肉视频在线观看 | 久久熟妇人妻午夜寂寞影院 | 国产深夜福利视频在线 | 亚洲综合久久一区二区 | 亚洲日韩一区二区三区 | 两性色午夜视频免费播放 | 疯狂三人交性欧美 | 亚洲熟妇自偷自拍另类 | 亚洲日本va中文字幕 | 色 综合 欧美 亚洲 国产 | 无码人妻丰满熟妇区五十路百度 | 成 人 网 站国产免费观看 | 欧美乱妇无乱码大黄a片 | 人妻插b视频一区二区三区 | 一本一道久久综合久久 | 啦啦啦www在线观看免费视频 | 蜜桃视频韩日免费播放 | 又大又黄又粗又爽的免费视频 | 色窝窝无码一区二区三区色欲 | 狠狠色丁香久久婷婷综合五月 | 国产在线一区二区三区四区五区 | 欧美 亚洲 国产 另类 | 国产片av国语在线观看 | 国产精品久久久久久久影院 | 老司机亚洲精品影院无码 | 男人扒开女人内裤强吻桶进去 | 国产精品18久久久久久麻辣 | 中国女人内谢69xxxxxa片 | 精品偷拍一区二区三区在线看 | 国产两女互慰高潮视频在线观看 | 亚洲日韩乱码中文无码蜜桃臀网站 | 亚洲精品国产品国语在线观看 | 国产一区二区三区影院 | 亚洲va欧美va天堂v国产综合 | 任你躁国产自任一区二区三区 | 野外少妇愉情中文字幕 | 强伦人妻一区二区三区视频18 | 东京一本一道一二三区 | 亚洲综合另类小说色区 | 在教室伦流澡到高潮hnp视频 | 久久久精品欧美一区二区免费 | 伊人久久大香线蕉亚洲 | 午夜嘿嘿嘿影院 | 久久久中文字幕日本无吗 | 蜜桃无码一区二区三区 | 国产亚洲欧美在线专区 | 少妇一晚三次一区二区三区 | 久久久久人妻一区精品色欧美 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 欧美怡红院免费全部视频 | 无码国产乱人伦偷精品视频 | 亚洲中文字幕乱码av波多ji | 又色又爽又黄的美女裸体网站 | 动漫av一区二区在线观看 | 久久久久久久女国产乱让韩 | 丰满肥臀大屁股熟妇激情视频 | 成人亚洲精品久久久久 | 国产偷抇久久精品a片69 | 成人一区二区免费视频 | 少妇人妻av毛片在线看 | 乌克兰少妇xxxx做受 | 成人一区二区免费视频 | 国产内射老熟女aaaa | 久久99精品久久久久婷婷 | 亚洲精品成a人在线观看 | 亚洲国产av精品一区二区蜜芽 | 精品一区二区不卡无码av | 国产亚洲日韩欧美另类第八页 | 国内综合精品午夜久久资源 | 乌克兰少妇xxxx做受 | av香港经典三级级 在线 | 性生交片免费无码看人 | 亚洲七七久久桃花影院 | 99久久婷婷国产综合精品青草免费 | 亚洲精品久久久久中文第一幕 | 欧美性色19p | 狠狠cao日日穞夜夜穞av | 久久精品女人的天堂av | 欧美人与禽zoz0性伦交 | 欧美成人高清在线播放 | 内射老妇bbwx0c0ck | 夫妻免费无码v看片 | 国产在热线精品视频 | 麻豆蜜桃av蜜臀av色欲av | 女人被男人躁得好爽免费视频 | 人妻体内射精一区二区三四 | 亚洲无人区一区二区三区 | 男人的天堂2018无码 | 欧美三级不卡在线观看 | 国产av无码专区亚洲a∨毛片 | 日日夜夜撸啊撸 | 噜噜噜亚洲色成人网站 | 国产成人无码av在线影院 | 好男人www社区 | 国产又爽又猛又粗的视频a片 | 草草网站影院白丝内射 | 东京热一精品无码av | 久久综合给合久久狠狠狠97色 | 免费观看又污又黄的网站 | 久久这里只有精品视频9 | 4hu四虎永久在线观看 | 国产成人综合美国十次 | 亚洲乱亚洲乱妇50p | 大肉大捧一进一出视频出来呀 | 欧美35页视频在线观看 | 十八禁真人啪啪免费网站 | 色婷婷久久一区二区三区麻豆 | 久久久av男人的天堂 | 日韩精品久久久肉伦网站 | 内射欧美老妇wbb | 精品一区二区三区波多野结衣 | 国内精品人妻无码久久久影院蜜桃 | 国产精品美女久久久久av爽李琼 | 免费观看又污又黄的网站 | 4hu四虎永久在线观看 | 三上悠亚人妻中文字幕在线 | 成人一区二区免费视频 | 日本va欧美va欧美va精品 | 中文字幕 人妻熟女 | 亚洲综合在线一区二区三区 | 亚洲精品久久久久久久久久久 | 日韩精品无码免费一区二区三区 | 国产精品久久久午夜夜伦鲁鲁 | 国产免费观看黄av片 | 国产精品视频免费播放 | 99久久99久久免费精品蜜桃 | 日韩在线不卡免费视频一区 | 中文精品无码中文字幕无码专区 | 在线天堂新版最新版在线8 | 精品国产av色一区二区深夜久久 | 乱人伦人妻中文字幕无码 | 国产精品久久国产三级国 | 亚洲色偷偷男人的天堂 | 2019午夜福利不卡片在线 | а天堂中文在线官网 | 精品人人妻人人澡人人爽人人 | 少妇人妻大乳在线视频 | 中文字幕人妻丝袜二区 | 狠狠色噜噜狠狠狠狠7777米奇 | 天天拍夜夜添久久精品 | 人妻少妇精品无码专区二区 | 久久亚洲精品成人无码 | 十八禁视频网站在线观看 | 色综合久久久无码中文字幕 | 亚洲人成无码网www | 国产精品久久久久久久9999 | 亚洲の无码国产の无码影院 | 无码一区二区三区在线观看 | 亚洲中文字幕久久无码 | 日韩av无码一区二区三区不卡 | 亚洲国产日韩a在线播放 | 欧美人与牲动交xxxx | 无码国内精品人妻少妇 | 久久精品视频在线看15 | 女高中生第一次破苞av | 亚洲成色www久久网站 | 中国女人内谢69xxxxxa片 | 综合激情五月综合激情五月激情1 | 牲欲强的熟妇农村老妇女 | 99久久精品无码一区二区毛片 | 午夜福利一区二区三区在线观看 | 欧美第一黄网免费网站 | 日本一区二区三区免费播放 | 亚洲精品午夜无码电影网 | 妺妺窝人体色www婷婷 | 蜜桃无码一区二区三区 | 精品久久久无码中文字幕 | aⅴ亚洲 日韩 色 图网站 播放 | 国产真实伦对白全集 | 无码成人精品区在线观看 | 国内精品人妻无码久久久影院 | 美女黄网站人色视频免费国产 | 久久久无码中文字幕久... | 国产精品免费大片 | 一区二区三区乱码在线 | 欧洲 | 中文字幕无码乱人伦 | 国产亚洲精品久久久久久 | 老熟妇仑乱视频一区二区 | 国产精品无码一区二区桃花视频 | 国产乱码精品一品二品 | 国产农村乱对白刺激视频 | 又紧又大又爽精品一区二区 | 麻花豆传媒剧国产免费mv在线 | 亚洲成在人网站无码天堂 | 波多野42部无码喷潮在线 | 国产精品a成v人在线播放 | 精品人妻中文字幕有码在线 | 秋霞成人午夜鲁丝一区二区三区 | 在线精品亚洲一区二区 | 2019nv天堂香蕉在线观看 | 激情五月综合色婷婷一区二区 | 夫妻免费无码v看片 | 国产精品人人爽人人做我的可爱 | 老熟女重囗味hdxx69 | 久久无码中文字幕免费影院蜜桃 | 麻豆国产丝袜白领秘书在线观看 | 天天摸天天透天天添 | 国产免费久久精品国产传媒 | 在线观看国产午夜福利片 | 欧美 日韩 亚洲 在线 | 97夜夜澡人人爽人人喊中国片 | 国产真人无遮挡作爱免费视频 | 久久婷婷五月综合色国产香蕉 | 天堂无码人妻精品一区二区三区 | 98国产精品综合一区二区三区 | 国产精品亚洲五月天高清 | 欧美性生交xxxxx久久久 | 男人扒开女人内裤强吻桶进去 | 少妇性荡欲午夜性开放视频剧场 | 少妇性l交大片 | 成人无码视频免费播放 | 特黄特色大片免费播放器图片 | 男女作爱免费网站 | 日本熟妇乱子伦xxxx | 人人超人人超碰超国产 | 熟妇人妻中文av无码 | 人妻中文无码久热丝袜 | 大乳丰满人妻中文字幕日本 | 亚洲 另类 在线 欧美 制服 | 精品国精品国产自在久国产87 | 亚洲自偷自拍另类第1页 | 成 人影片 免费观看 | 免费观看又污又黄的网站 | 成人无码视频免费播放 | 无码一区二区三区在线 | 亚洲 欧美 激情 小说 另类 | 玩弄少妇高潮ⅹxxxyw | 亚洲午夜无码久久 | 国精产品一区二区三区 | 奇米影视7777久久精品人人爽 | 日日躁夜夜躁狠狠躁 | 精品无码一区二区三区爱欲 | 丰满妇女强制高潮18xxxx | 人人妻人人澡人人爽欧美一区九九 | 日本www一道久久久免费榴莲 | 欧美高清在线精品一区 | 日韩精品无码一本二本三本色 | 精品国产一区二区三区四区 | 日日摸天天摸爽爽狠狠97 | 波多野结衣一区二区三区av免费 | 小泽玛莉亚一区二区视频在线 | 精品久久久无码人妻字幂 | 99久久久无码国产精品免费 | 亚洲欧美精品伊人久久 | 成在人线av无码免费 | 日日噜噜噜噜夜夜爽亚洲精品 | 日本一区二区更新不卡 | 色婷婷欧美在线播放内射 | 最新国产乱人伦偷精品免费网站 | 露脸叫床粗话东北少妇 | 在教室伦流澡到高潮hnp视频 | 无码帝国www无码专区色综合 | 理论片87福利理论电影 | 国产两女互慰高潮视频在线观看 | 婷婷五月综合缴情在线视频 | 日本大乳高潮视频在线观看 | 亚洲精品国产a久久久久久 | 特大黑人娇小亚洲女 | 亚洲精品综合一区二区三区在线 | 色一情一乱一伦一区二区三欧美 | 国产精品久久精品三级 | 国语精品一区二区三区 | 精品 日韩 国产 欧美 视频 | av香港经典三级级 在线 | 久久精品国产日本波多野结衣 | 久久国产精品萌白酱免费 | 国产av无码专区亚洲awww | 久久久精品国产sm最大网站 | 夜精品a片一区二区三区无码白浆 | 乱码午夜-极国产极内射 | 精品久久久无码人妻字幂 | 波多野结衣av在线观看 | 精品国产一区二区三区四区在线看 | 国产无套内射久久久国产 | 无套内谢老熟女 | 精品少妇爆乳无码av无码专区 | 中文字幕无码人妻少妇免费 | 免费国产成人高清在线观看网站 | 全球成人中文在线 | 亚洲色欲久久久综合网东京热 | 久久国内精品自在自线 | 国产午夜手机精彩视频 | 国产情侣作爱视频免费观看 | 狠狠色丁香久久婷婷综合五月 | 久久久婷婷五月亚洲97号色 | 国产色xx群视频射精 | 漂亮人妻洗澡被公强 日日躁 | 欧美一区二区三区 | 成人女人看片免费视频放人 | 熟妇人妻无乱码中文字幕 | 国产suv精品一区二区五 | 亚洲人成无码网www | 成 人 网 站国产免费观看 | 久久99精品国产麻豆 | 中文字幕av无码一区二区三区电影 | 亚洲精品www久久久 | 漂亮人妻洗澡被公强 日日躁 | 一本无码人妻在中文字幕免费 | 在线视频网站www色 | 性色av无码免费一区二区三区 | 熟妇人妻中文av无码 | 97夜夜澡人人爽人人喊中国片 | 无人区乱码一区二区三区 | 色五月五月丁香亚洲综合网 | 日韩人妻无码中文字幕视频 | 国产精品高潮呻吟av久久 | 国产做国产爱免费视频 | 久久99精品国产麻豆蜜芽 | 极品尤物被啪到呻吟喷水 | 亚洲日韩av片在线观看 | 精品国产一区二区三区四区 | www国产亚洲精品久久久日本 | 蜜臀av无码人妻精品 | 国产在线精品一区二区高清不卡 | 水蜜桃色314在线观看 | 装睡被陌生人摸出水好爽 | 狂野欧美性猛xxxx乱大交 | 青青青手机频在线观看 | 欧美日韩一区二区免费视频 | 久久精品国产日本波多野结衣 | 国产成人午夜福利在线播放 | 动漫av网站免费观看 | 日产精品99久久久久久 | 亚洲一区二区三区无码久久 | 亚洲人成网站免费播放 | 国产色精品久久人妻 | 欧美成人高清在线播放 | 亚无码乱人伦一区二区 | 国产高潮视频在线观看 | 无遮无挡爽爽免费视频 | 正在播放东北夫妻内射 | 人人超人人超碰超国产 | 日本护士毛茸茸高潮 | 牲欲强的熟妇农村老妇女视频 | 亚洲中文字幕乱码av波多ji | 久久人妻内射无码一区三区 | 精品一区二区三区波多野结衣 | 永久免费观看国产裸体美女 |