huggingface筆記:LLama 2

1 前提tip

1.1 使用什么數據類型訓練模型?

  • Llama2模型是使用bfloat16訓練的
    • 上傳到Hub的檢查點使用torch_dtype = 'float16',這將通過AutoModel API將檢查點從torch.float32轉換為torch.float16。
    • 在線權重的數據類型通常無關緊要,這是因為模型將首先下載(使用在線檢查點的數據類型),然后轉換為torch的默認數據類型(變為torch.float32),最后,如果配置中提供了torch_dtype,則會使用它。
  • 不建議在float16中訓練模型,因為已知會產生nan;因此,應該在bfloat16中訓練模型

1.2 Llama2 的tokenizer

  • LlaMA的tokenizer是基于sentencepiece的BPE模型。
  • sentencepiece的一個特點是,在解碼序列時,如果第一個令牌是詞的開頭(例如“Banana”),令牌器不會在字符串前添加前綴空格。?

2? transformers.LlamaConfig

根據指定的參數實例化LLaMA模型,定義模型架構。使用默認值實例化配置將產生與LLaMA-7B相似的配置

2.1 參數介紹

vocab_size

(int, 可選,默認為32000) — LLaMA模型的詞匯量大小。

定義 通過調用LlamaModel時傳遞的inputs_ids表示的不同令牌的數量。

hidden_size(int, 可選,默認為4096) — 隱藏表示的維度
intermediate_size(int, 可選,默認為11008) — MLP表示的維度
num_hidden_layers?(int, 可選,默認為32) — 解碼器中的隱藏層數量
num_attention_heads(int, 可選,默認為32) — 解碼器中每個注意力層的注意力頭數。
hidden_act(str或函數, 可選,默認為"silu") — 解碼器中的非線性激活函數
max_position_embeddings

(int, 可選,默認為2048) — 該模型可能使用的最大序列長度。

Llama 1支持最多2048個令牌,Llama 2支持最多4096個,CodeLlama支持最多16384個。

initializer_range(float, 可選,默認為0.02) — 用于初始化所有權重矩陣的截斷正態初始化器的標準差
rms_norm_eps(float, 可選,默認為1e-06) — rms歸一化層使用的epsilon
use_cache(bool, 可選,默認為True) — 模型是否應返回最后的鍵/值注意力
pad_token_id(int, 可選) — 填充令牌id
bos_token_id(int, 可選,默認為1) — 開始流令牌id
eos_token_idint, 可選,默認為2) — 結束流令牌id
attention_bias(bool, 可選,默認為False) — 在自注意力過程中的查詢、鍵、值和輸出投影層中是否使用偏置
attention_dropout(float, 可選,默認為0.0) — 注意力概率的丟棄率
mlp_bias(bool, 可選,默認為False) — 在MLP層中的up_proj、down_proj和gate_proj層中是否使用偏置

2.2 舉例

from transformers import LlamaModel, LlamaConfigconfiguration = LlamaConfig()
# 默認是Llama-7B的配置
configuration
'''
LlamaConfig {"attention_bias": false,"attention_dropout": 0.0,"bos_token_id": 1,"eos_token_id": 2,"hidden_act": "silu","hidden_size": 4096,"initializer_range": 0.02,"intermediate_size": 11008,"max_position_embeddings": 2048,"mlp_bias": false,"model_type": "llama","num_attention_heads": 32,"num_hidden_layers": 32,"num_key_value_heads": 32,"pretraining_tp": 1,"rms_norm_eps": 1e-06,"rope_scaling": null,"rope_theta": 10000.0,"tie_word_embeddings": false,"transformers_version": "4.41.0","use_cache": true,"vocab_size": 32000
}
'''

3 transformers.LlamaTokenizer?

構建一個Llama令牌器。基于字節級Byte-Pair-Encoding。

默認的填充令牌未設置,因為原始模型中沒有填充令牌。

3.1 參數介紹

vocab_file(str) — 詞匯文件的路徑
unk_token

(str或tokenizers.AddedToken, 可選, 默認為"<unk>") — 未知令牌。

不在詞匯表中的令牌將被設置為此令牌。

bos_token

(str或tokenizers.AddedToken, 可選, 默認為"<s>") — 預訓練期間使用的序列開始令牌。

可以用作序列分類器令牌

eos_token

(str或tokenizers.AddedToken, 可選, 默認為"</s>") — 序列結束令牌

pad_token

(str或tokenizers.AddedToken, 可選) — 用于使令牌數組大小相同以便批處理的特殊令牌。

在注意力機制或損失計算中將其忽略。

add_bos_token(bool, 可選, 默認為True) — 是否在序列開始處添加bos_token。
add_eos_token(bool, 可選, 默認為False) — 是否在序列結束處添加eos_token。
use_default_system_prompt(bool, 可選, 默認為False) — 是否使用Llama的默認系統提示。

4??transformers.LlamaTokenizerFast

4.1 參數介紹

vocab_file(str) —SentencePiece文件(通常具有.model擴展名),包含實例化分詞器所需的詞匯表。
tokenizer_file(str, 可選) — 分詞器文件(通常具有.json擴展名),包含加載分詞器所需的所有內容。
clean_up_tokenization_spaces(bool, 可選, 默認為False) — 解碼后是否清理空格,清理包括移除潛在的如額外空格等人工痕跡。
unk_token

(str或tokenizers.AddedToken, 可選, 默認為"<unk>") — 未知令牌。

不在詞匯表中的令牌將被設置為此令牌。

bos_token

(str或tokenizers.AddedToken, 可選, 默認為"<s>") — 預訓練期間使用的序列開始令牌。

可以用作序列分類器令牌

eos_token

(str或tokenizers.AddedToken, 可選, 默認為"</s>") — 序列結束令牌

pad_token

(str或tokenizers.AddedToken, 可選) — 用于使令牌數組大小相同以便批處理的特殊令牌。

在注意力機制或損失計算中將其忽略。

add_bos_token(bool, 可選, 默認為True) — 是否在序列開始處添加bos_token。
add_eos_token(bool, 可選, 默認為False) — 是否在序列結束處添加eos_token。
use_default_system_prompt(bool, 可選, 默認為False) — 是否使用Llama的默認系統提示。

?4.2 和 LlamaTokenizer的對比

調用from_pretrained從huggingface獲取已有的tokenizer時,可以使用AutoTokenizer和LlamaTokenizerFast,不能使用LlamaTokenizer

from transformers import AutoTokenizertokenizer1=AutoTokenizer.from_pretrained('meta-llama/Meta-Llama-3-8B')
tokenizer1.encode('Hello world! This is a test file for Llama tokenizer')
#[128000, 9906, 1917, 0, 1115, 374, 264, 1296, 1052, 369, 445, 81101, 47058]from transformers import LlamaTokenizerFasttokenizer2=LlamaTokenizerFast.from_pretrained('meta-llama/Meta-Llama-3-8B')
tokenizer2.encode('Hello world! This is a test file for Llama tokenizer')
#[128000, 9906, 1917, 0, 1115, 374, 264, 1296, 1052, 369, 445, 81101, 47058]
from transformers import LlamaTokenizertokenizer3=LlamaTokenizer.from_pretrained('meta-llama/Meta-Llama-3-8B')
tokenizer3.encode('Hello world! This is a test file for Llama tokenizer')

5?LlamaModel

5.1 參數介紹

  • config
    • 模型配置類,包含模型的所有參數
    • 使用配置文件初始化不會加載與模型相關的權重,只加載配置
    • 使用from_pretrained() 方法以加載模型權重

5.2 介紹

  • LLaMA 模型的基本形式,輸出原始隱藏狀態,頂部沒有任何特定的頭部。
    • 這個模型繼承自 PreTrainedModel
    • 此模型也是 PyTorch torch.nn.Module 的子類
  • 解碼器包括 config.num_hidden_layers 層。每層是一個 LlamaDecoderLayer

使用前面的LlamaConfig:

from transformers import LlamaModel, LlamaConfigconfiguration = LlamaConfig()
# 默認是Llama-7B的配置model=LlamaModel(configuration)
model
'''
LlamaModel((embed_tokens): Embedding(32000, 4096)(layers): ModuleList((0-31): 32 x LlamaDecoderLayer((self_attn): LlamaSdpaAttention((q_proj): Linear(in_features=4096, out_features=4096, bias=False)(k_proj): Linear(in_features=4096, out_features=4096, bias=False)(v_proj): Linear(in_features=4096, out_features=4096, bias=False)(o_proj): Linear(in_features=4096, out_features=4096, bias=False)(rotary_emb): LlamaRotaryEmbedding())(mlp): LlamaMLP((gate_proj): Linear(in_features=4096, out_features=11008, bias=False)(up_proj): Linear(in_features=4096, out_features=11008, bias=False)(down_proj): Linear(in_features=11008, out_features=4096, bias=False)(act_fn): SiLU())(input_layernorm): LlamaRMSNorm()(post_attention_layernorm): LlamaRMSNorm()))(norm): LlamaRMSNorm()
)
'''
model.from_pretrained('meta-llama/Meta-Llama-3-8B')
model
'''
LlamaModel((embed_tokens): Embedding(32000, 4096)(layers): ModuleList((0-31): 32 x LlamaDecoderLayer((self_attn): LlamaSdpaAttention((q_proj): Linear(in_features=4096, out_features=4096, bias=False)(k_proj): Linear(in_features=4096, out_features=4096, bias=False)(v_proj): Linear(in_features=4096, out_features=4096, bias=False)(o_proj): Linear(in_features=4096, out_features=4096, bias=False)(rotary_emb): LlamaRotaryEmbedding())(mlp): LlamaMLP((gate_proj): Linear(in_features=4096, out_features=11008, bias=False)(up_proj): Linear(in_features=4096, out_features=11008, bias=False)(down_proj): Linear(in_features=11008, out_features=4096, bias=False)(act_fn): SiLU())(input_layernorm): LlamaRMSNorm()(post_attention_layernorm): LlamaRMSNorm()))(norm): LlamaRMSNorm()
)
'''

5.3 forward方法

參數:

input_ids

torch.LongTensor,形狀為 (batch_size, sequence_length))

輸入序列token在詞匯表中的索引

索引可以通過 AutoTokenizer 獲取【PreTrainedTokenizer.encode()】

attention_mask

torch.Tensor,形狀為 (batch_size, sequence_length),可選)

避免對填充標記索引執行注意力操作的掩碼。

掩碼值在 [0, 1] 中選擇:

  • 1 表示未被掩蓋的標記,
  • 0 表示被掩蓋的標記。
inputs_embeds

(torch.FloatTensor,形狀為 (batch_size, sequence_length, hidden_size)

選擇性地,可以直接傳遞嵌入表示,而不是傳遞 input_ids

output_attentions(布爾值,可選)— 是否返回所有注意力層的注意力張量。
output_hidden_states(布爾值,可選)— 是否返回所有層的隱藏狀態

5.3.1 舉例

prompt = "Hey, are you conscious? Can you talk to me?"
inputs = tokenizer(prompt, return_tensors="pt")a=m.forward(inputs.input_ids)a.keys()
#odict_keys(['last_hidden_state', 'past_key_values'])a.last_hidden_state
'''
tensor([[[ 4.0064, -0.4994, -1.9927,  ..., -3.7454,  0.8413,  2.6989],[-1.5624,  0.5211,  0.1731,  ..., -1.5174, -2.2977, -0.3990],[-0.7521, -0.4335,  1.0871,  ..., -0.7031, -1.8011,  2.0173],...,[-3.5611, -0.2674,  1.7693,  ..., -1.3848, -0.4413, -1.6342],[-1.2451,  1.5639,  1.5049,  ...,  0.5092, -1.2059, -2.3104],[-3.2812, -2.2462,  1.8884,  ...,  3.7066,  1.2010,  0.2117]]],grad_fn=<MulBackward0>)
'''a.last_hidden_state.shape
#torch.Size([1, 13, 4096])len(a.past_key_values)
#32a.past_key_values[1][0].shape
#torch.Size([1, 8, 13, 128])

6?LlamaForCausalLM?

用于對話系統

6.1 forward方法

參數:

input_ids

torch.LongTensor,形狀為 (batch_size, sequence_length))

輸入序列token在詞匯表中的索引

索引可以通過 AutoTokenizer 獲取【PreTrainedTokenizer.encode()】

attention_mask

torch.Tensor,形狀為 (batch_size, sequence_length),可選)

避免對填充標記索引執行注意力操作的掩碼。

掩碼值在 [0, 1] 中選擇:

  • 1 表示未被掩蓋的標記,
  • 0 表示被掩蓋的標記。
inputs_embeds

(torch.FloatTensor,形狀為 (batch_size, sequence_length, hidden_size)

選擇性地,可以直接傳遞嵌入表示,而不是傳遞 input_ids

output_attentions(布爾值,可選)— 是否返回所有注意力層的注意力張量。
output_hidden_states(布爾值,可選)— 是否返回所有層的隱藏狀態

6.2? 舉例

from transformers import LlamaForCausalLMm1=LlamaForCausalLM.from_pretrained('meta-llama/Meta-Llama-3-8B')
m1
'''
LlamaForCausalLM((model): LlamaModel((embed_tokens): Embedding(128256, 4096)(layers): ModuleList((0-31): 32 x LlamaDecoderLayer((self_attn): LlamaSdpaAttention((q_proj): Linear(in_features=4096, out_features=4096, bias=False)(k_proj): Linear(in_features=4096, out_features=1024, bias=False)(v_proj): Linear(in_features=4096, out_features=1024, bias=False)(o_proj): Linear(in_features=4096, out_features=4096, bias=False)(rotary_emb): LlamaRotaryEmbedding())(mlp): LlamaMLP((gate_proj): Linear(in_features=4096, out_features=14336, bias=False)(up_proj): Linear(in_features=4096, out_features=14336, bias=False)(down_proj): Linear(in_features=14336, out_features=4096, bias=False)(act_fn): SiLU())(input_layernorm): LlamaRMSNorm()(post_attention_layernorm): LlamaRMSNorm()))(norm): LlamaRMSNorm())(lm_head): Linear(in_features=4096, out_features=128256, bias=False)
)
'''

結構是一樣的

prompt = "Hey, are you conscious? Can you talk to me?"
inputs = tokenizer(prompt, return_tensors="pt")tokenizer.batch_decode(m1.generate(inputs.input_ids, max_length=30))
'''
['<|begin_of_text|>Hey, are you conscious? Can you talk to me? Can you hear me? Are you sure you can hear me? Can you understand what']
'''m1.generate(inputs.input_ids, max_length=30)
'''
tensor([[128000,  19182,     11,    527,    499,  17371,     30,   3053,    499,3137,    311,    757,     30,   3053,    499,   6865,    757,     30,8886,    499,   2103,  27027,     30,   3053,    499,   1518,    757,30,   3053,    499]])
'''

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/14630.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/14630.shtml
英文地址,請注明出處:http://en.pswp.cn/web/14630.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

QT 使用QZipWriter進行文件壓縮

目錄 1、QZipWriter 2、主要功能 3、示例 1、QZipWriter QZipWriter 是 Qt 提供的一個類&#xff0c;用于創建和管理 ZIP 文件。它屬于 Qt 的 QtGui 模塊&#xff0c;雖然在 Qt 6 中已經被移除&#xff0c;但在早期的 Qt 版本中&#xff0c;它被用作一種簡便的方式來創建 ZI…

CMMI模型的分析

CMMI模型的分析 CMMI(Capability Maturity Model Integration,能力成熟度模型集成)是由美國卡內基梅隆大學軟件工程研究所(SEI)開發的一個過程級改進訓練和評估程序。CMMI模型為組織提供了一套綜合的指南,用于改進其過程和提升性能。 CMMI 3.0是CMMI模型的最新版本,于…

AWS計算之AWS Elastic Beanstalk

AWS Elastic Beanstalk是一項用于簡化應用程序部署和管理的托管服務。它允許開發人員上傳他們的應用程序代碼&#xff0c;并自動處理底層的部署、擴展、負載均衡和監控任務&#xff0c;從而使開發人員能夠專注于應用程序的開發而不必擔心基礎架構的管理細節。 借助Elastic Bea…

機器學習300問】95、什么是KNN算法?它和K-means什么關系?

一、KNN算法的定義 KNN&#xff08;K-Nearest Neighbors&#xff09;算法&#xff0c;是一種簡單而有效的監督學習方法。它既可以用在分類任務&#xff0c;也可用在回歸任務中。KNN算法的核心思想&#xff1a;在特征空間中&#xff0c;如果有一個數據點周圍的大多數鄰居屬于某個…

5. JVM面試題匯總

Java全棧面試題匯總目錄-CSDN博客 1. 說一下JVM的主要組成部分及其作用? JVM包含兩個子系統和兩個組件&#xff0c;兩個子系統為Class loader(類裝載)、Execution engine(執行引擎)&#xff1b;兩個組件為Runtime data area(運行時數據區)、Native Interface(本地接口)。 Cl…

linux mail命令及其歷史

一、【問題描述】 最近隔壁組有人把crontab刪了&#xff0c;crontab這個命令有點反人類&#xff0c;它的參數特別容易誤操作&#xff1a; crontab - 是刪除計劃表 crontab -e 是編輯&#xff0c;總之就是特別容易輸入錯誤。 好在可以通過mail命令找回&#xff0c;但是mai…

【計算機網絡】初識Tcp協議

&#x1f4bb;文章目錄 &#x1f4c4;前言Tcp基礎概念Tcp 的報文格式三次握手四次揮手 Tcp的滑動窗口機制概念超時重傳機制高速重傳 TCP傳輸控制機制流量控制擁堵控制慢啟動 Tcp的性能優化機制延遲應答捎帶應答 &#x1f4d3;總結 &#x1f4c4;前言 TCP三次握手、四次揮手&…

Java刷題總結(面試)

1、String類 String不可變 java 中String是 immutable的&#xff0c;也就是不可變&#xff0c;一旦初始化&#xff0c;其引用指向的內容是不可變的。 也就是說&#xff0c;String str “aa”&#xff1b;str“bb”&#xff1b;第二句不是改變“aa”所存儲地址的內容&#xf…

Overleaf是什么?如何升級到標準版OR專業版?

1. Overleaf介紹 Overleaf是一個使用LaTeX進行多人協同編輯的平臺&#xff0c;可以免費注冊和使用&#xff0c;不用下載LaTeX軟件&#xff0c;是最為著名的LaTeX在線協作系統。 主要特色是有LaTeX插件&#xff0c;編輯功能十分完善&#xff0c;有實時預覽&#xff08;即編即看…

Java 使用繼承和重寫父類方法寫一個商品入庫案例

package 練習.商品入庫;import java.util.Scanner; // 抽象手機類 public abstract class Phone {//測試方法public static void main(String[] args){// 華為手機huawei h new huawei();h.setName("華為P40");h.setPrice(1999.99);h.setConfiguration("8128GB…

docker 安裝 私有云盤 nextcloud

拉取鏡像 # 拉取鏡像 sudo docker pull nextcloud運行nextcloud 容器 # 內存足夠可以不進行內存 --memory512m --memory-swap6g # 橋接網絡 --network suixinnet --network-alias nextcloud \ sudo docker run -itd --name nextcloud --restartalways \ -p 9999:80 \ -v /m…

【排名公布】綿陽男科醫院排名發布,綿陽高水男科醫院究竟咋樣啊?

【排名公布】綿陽男科醫院排名發布&#xff0c;綿陽高水男科醫院究竟咋樣啊&#xff1f; 綿陽高水醫院&#xff0c;是一家醫保定點單位&#xff0c;地址位于綿陽市涪城區長虹大道北段113號。一所與國際接軌的現代化男子醫院&#xff0c;有良好地就醫環境,擁有多名有經驗的專家…

基于Tensorflow實現了三個模型對MNIST數據集的識別

歡迎大家點贊、收藏、關注、評論啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代碼。 文章目錄 一項目簡介 二、功能三、系統四. 總結 一項目簡介 一、項目背景與意義 MNIST手寫數字數據集是計算機視覺和機器學習領域的一個經典數據集&#xff0c;常用于評估圖像…

ubuntu安裝文件

ubuntu如何安裝deb文件? ubuntu離線安裝deb文件的兩種方法_系統工具_軟件教程_腳本之家 1. 雙擊安裝 2.命令安裝 1.、我們打開終端窗口&#xff0c;然后先使用cd命令進入deb文件所在的目錄&#xff0c;例如&#xff1a; cd ~/Downloads 2、接著我們就可以使用dpkg命令來安裝這…

攻防世界-mobile-easy-app詳解

序言 這道題網上很多分析&#xff0c;但是分析的都是arm版本的&#xff0c;我選了arm64的來分析&#xff0c;arm64相比arm難度高一些&#xff0c;因為arm64編譯器搞了inline優化&#xff0c;看起來略抽象 分析 這道題邏輯很簡單&#xff0c;輸入flag然后一個check函數驗證&a…

改進rust代碼的35種具體方法-類型(十八)-不要驚慌

上一篇文章 它看起來非常復雜&#xff0c;這就是為什么它貼合的塑料蓋上用大號友好字母印上“不要恐慌”的原因之一。——道格拉斯亞當斯 此項目的標題將更準確地描述為更喜歡返回Result而不是使用panic!&#xff08;但不要驚慌更吸引人&#xff09;。 Rust的panic機制主要是為…

算法入門----小話算法(1)

下面就首先從一些數學問題入手。 Q1&#xff1a; 如何證明時間復雜度O(logN) < O(N) < O(NlogN) < O(N2) < O(2N) < O(N!) < O(NN)? A&#xff1a; 如果一個以整數為參數的不等式不能很容易看出不等的關系&#xff0c;那么最好用圖示或者數學歸納法。 很顯…

Python3 筆記:sort() 和 sorted() 的區別

1、sort() 可以對列表中的元素進行排序&#xff0c;會改變原列表&#xff0c;之前的順序不復存在。 list.sort&#xff08;key&#xff0c; reverse None&#xff09; key&#xff1a;默認值是None&#xff0c;可指定項目進行排序&#xff0c;此參數可省略。 reverse&#…

rmxprt轉換的3D模型只有一半?---模大獅模型網

在3D建模和渲染的工作流程中&#xff0c;我們經常需要用到各種轉換工具來兼容不同平臺或軟件之間的模型格式。rmxprt(或其他類似的模型轉換工具)就是其中的一種&#xff0c;它能夠將模型從一種格式轉換為另一種格式。然而&#xff0c;有時在轉換過程中可能會遇到一些問題&#…

微服務雪崩問題、Sentinel(請求限流、線程隔離、服務熔斷)、Seata分布式事務

文章目錄 前言一、微服務保護二、Sentinel2.1 微服務整合2.2 簇點鏈路2.3 請求限流2.4 線程隔離2.5 服務熔斷 三、分布式事務3.1 Seata3.1.1 Seata架構3.1.2 部署TC服務3.1.3 微服務集成Seata 3.2 XA模式3.3 AT模式 前言 微服務之間為什么會雪崩&#xff1f;怎么解決雪崩問題&…