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.mzph.cn/web/14630.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习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…

【排名公布】绵阳男科医院排名发布,绵阳高水男科医院究竟咋样啊?

【排名公布】绵阳男科医院排名发布&#xff0c;绵阳高水男科医院究竟咋样啊&#xff1f; 绵阳高水医院&#xff0c;是一家医保定点单位&#xff0c;地址位于绵阳市涪城区长虹大道北段113号。一所与国际接轨的现代化男子医院&#xff0c;有良好地就医环境,拥有多名有经验的专家…

基于Tensorflow实现了三个模型对MNIST数据集的识别

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 MNIST手写数字数据集是计算机视觉和机器学习领域的一个经典数据集&#xff0c;常用于评估图像…

攻防世界-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;怎么解决雪崩问题&…

Oracle体系结构初探:数据库启动与停止

往期内容 参数管理 控制文件添加 启动 在启动Oracle数据库时&#xff0c;我们一般会使用如下命令&#xff1a; startup 虽然命令只有一个&#xff0c;但其中却是经历了3个阶段&#xff0c;从下面执行 startup 命令返回也可以看出来。 总结为3个阶段&#xff1a; nomount&…

ubuntu下python导入.so库

ubuntu下python导入.so库 文章目录 ubuntu下python导入.so库1. 什么是.so文件&#xff1f;2. 使用python脚本编译.so库文件Reference 最近遇到了python导入c编译的 .so库的问题&#xff0c;发觉挺有意思&#xff0c;于是写下这篇blog以作记录。 1. 什么是.so文件&#xff1f; …

【简单介绍下深度神经网络】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

句柄降权绕过CallBacks检查

看到前辈们相关的文章&#xff0c;不太明白什么是句柄降权&#xff0c;于是专门去学习一下&#xff0c;过程有一点波折。 句柄降权 什么是句柄 当一个进程利用名称来创建或打开一个对象时&#xff0c;将获得一个句柄&#xff0c;该句柄指向所创建或打开的对象。以后&#xf…

什么是DNS缓存投毒攻击,有什么防护措施

随着企业组织数字化步伐的加快&#xff0c;域名系统&#xff08;DNS&#xff09;作为互联网基础设施的关键组成部分&#xff0c;其安全性愈发受到重视。然而&#xff0c;近年来频繁发生的针对DNS的攻击事件&#xff0c;已经成为企业组织数字化发展中的一个严重问题。而在目前各…