当前位置: 首页 > news >正文

哪家做外贸网站好沈阳高端网页

哪家做外贸网站好,沈阳高端网页,wordpress主题配置文件,长沙优化官网服务文章目录 注意 模型及Colab 从零实现 Llama3 模型 tokenizer 读取模型文件 使用这些配置推理模型的细节 将文本转换为 token 将 token 转换为 embedding 接下来使用 RMS 归一化嵌入 构建第一个 Transformer 层 归一化 从头实现注意力机制 展开 query 实现第一层的第一个头 现在…

文章目录

  • 注意
  • 模型及Colab
  • 从零实现 Llama3 模型
  • tokenizer
  • 读取模型文件
  • 使用这些配置推理模型的细节
  • 将文本转换为 token
  • 将 token 转换为 embedding
  • 接下来使用 RMS 归一化嵌入
  • 构建第一个 Transformer 层
    • 归一化
    • 从头实现注意力机制
    • 展开 query
    • 实现第一层的第一个头
    • 现在将 query 权重与 token 嵌入相乘,以获得每个 token 的 query
  • 位置编码
    • RoPE
  • 使用复数点积计算旋转向量
    • 现在每个 token 的 query 元素都有一个复数(角度变化向量)
    • 得到旋转向量后
  • keys(几乎与 query 一模一样)
  • 现在,已经有了每个 token 的旋转后的 query 和 key
  • 接下来,将 query 和 key 的矩阵相乘
  • 现在必须屏蔽 QK 分数
  • values (注意力机制的最后部分)
    • value 向量
    • 注意力(attention)
  • 多头注意力 (multi head attention)
  • 权重矩阵,最后几步之一
    • 这是一个简单的线性层,所以只需要进行乘法运算
  • 将其归一化,然后运行一个前馈神经网络
    • 加载 FFN 权重并实现前馈网络
  • 在第一层之后,终于为每个 token 编辑了新的 EMBEDDINGS
  • 整合
  • 得到最终 Embedding,对下一个 token 做预测
  • 最后,将 embedding 解码为 token value
  • 使用最后一个 token 的 embedding 来预测下一个值
    • 模型预测的 token 编号是 2983,这是否代表 42 的 token 编号?
  • 解码


完整代码:下载链接

注意

  1. 本文翻译自大佬的 llama3-from-scratch 仓库,本人只是将英文翻译为中文,并无任何改动,略微改动模型权重文件,方便加载。原版英文:README_en.md。
  2. 原版模型已上传至ModelScope,大小约 15G,Meta-Llama-3-8B-Instruct;
  3. 因原版 Llama3 8B 模型32层 Transformers,且大佬仓库使用CPU加载,如果加载全部的参数,16G内存机器加载失败,故选取原版 Llama3 8B 模型权重的前2层,重新保存,大小约为2.7G,此文档也可以直接加载,实际测试内存占用约4~5G,唯一缺点是后续推理结果不对,但不影响学习矩阵变换等其他知识,链接为 Meta-Llama-3-8B-Instruct-2layers.
  4. 如果对你有用麻烦点一下star,谢谢!

模型及Colab

模型链接

  • Haggingface link: https://huggingface.co/wdndev/Meta-Llama-3-8B-Instruct-2layers
  • ModeScope link: https://www.modelscope.cn/models/wdndev/Meta-Llama-3-8B-Instruct-2layers

colab链接

  • llama3-from-scratch-en: https://colab.research.google.com/drive/1X9yEa4hAZzgrwTuxHValBoVt1qfx6AXv?usp=sharing
  • llama3-from-scratch-zh: https://colab.research.google.com/drive/11MQb8Bn4Ck707VEcqqGVdytqOk3OrQQK?usp=sharing

从零实现 Llama3 模型

在这个文件中,从头实现了 Llama3,其中包含张量和矩阵乘法。

此外,直接从 Meta 提供的 Llama3 模型文件中加载张量,在运行此文件之前,需要下载权重。
这是官方链接: https://llama.meta.com/llama-downloads/

原版模型已上传至ModelScope,大小约 15G,Meta-Llama-3-8B-Instruct

tokenizer

不会实现一个 BPE 分词器(但 Andrej Karpathy 也有一个非常简洁的实现)

这是他的项目地址: https://github.com/karpathy/minbpe

from pathlib import Path
import tiktoken
from tiktoken.load import load_tiktoken_bpe
import torch
import json
import matplotlib.pyplot as plt# 加载分词器模型路径
tokenizer_path = "Meta-Llama-3-8B-Instruct/tokenizer.model"
special_tokens = ["<|begin_of_text|>","<|end_of_text|>","<|reserved_special_token_0|>","<|reserved_special_token_1|>","<|reserved_special_token_2|>","<|reserved_special_token_3|>","<|start_header_id|>","<|end_header_id|>","<|reserved_special_token_4|>","<|eot_id|>",  # end of turn] + [f"<|reserved_special_token_{i}|>" for i in range(5, 256 - 5)]
mergeable_ranks = load_tiktoken_bpe(tokenizer_path)
tokenizer = tiktoken.Encoding(name=Path(tokenizer_path).name,pat_str=r"(?i:'s|'t|'re|'ve|'m|'ll|'d)|[^\r\n\p{L}\p{N}]?\p{L}+|\p{N}{1,3}| ?[^\s\p{L}\p{N}]+[\r\n]*|\s*[\r\n]+|\s+(?!\S)|\s+",mergeable_ranks=mergeable_ranks,special_tokens={token: len(mergeable_ranks) + i for i, token in enumerate(special_tokens)},
)# 测试分词器编码和解码功能
tokenizer.decode(tokenizer.encode("hello world!"))
hello world!

读取模型文件

通常,读取模型文件,往往取决于模型类的编写方式以及其中的变量名。

但由于要从零实现 Llama3,将一次性读取一个张量。

# 加载模型权重
model = torch.load("Meta-Llama-3-8B-Instruct/consolidated.00.pth")
print(json.dumps(list(model.keys())[:20], indent=4))
["tok_embeddings.weight","layers.0.attention.wq.weight","layers.0.attention.wk.weight","layers.0.attention.wv.weight","layers.0.attention.wo.weight","layers.0.feed_forward.w1.weight","layers.0.feed_forward.w3.weight","layers.0.feed_forward.w2.weight","layers.0.attention_norm.weight","layers.0.ffn_norm.weight","layers.1.attention.wq.weight","layers.1.attention.wk.weight","layers.1.attention.wv.weight","layers.1.attention.wo.weight","layers.1.feed_forward.w1.weight","layers.1.feed_forward.w3.weight","layers.1.feed_forward.w2.weight","layers.1.attention_norm.weight","layers.1.ffn_norm.weight","layers.2.attention.wq.weight"
]

# 获取模型配置参数
with open("Meta-Llama-3-8B-Instruct/params.json", "r") as f:config = json.load(f)
config
{"dim": 4096,"n_layers": 32,"n_heads": 32,"n_kv_heads": 8,"vocab_size": 128256,"multiple_of": 1024,"ffn_dim_multiplier": 1.3,"norm_eps": 1e-05,"rope_theta": 500000.0
}

使用这些配置推理模型的细节

  1. 模型有 32 个 Transformer 层
  2. 每个多头注意力块有 32 个头
  3. 词汇表大小等
# 从配置文件中提取模型参数
dim = config["dim"]
n_layers = config["n_layers"]
n_heads = config["n_heads"]
n_kv_heads = config["n_kv_heads"]
vocab_size = config["vocab_size"]
multiple_of = config["multiple_of"]
ffn_dim_multiplier = config["ffn_dim_multiplier"]
norm_eps = config["norm_eps"]
rope_theta = torch.tensor(config["rope_theta"])

将文本转换为 token

这里使用 tiktoken(OpenAI 的库)作为分词器

prompt = "the answer to the ultimate question of life, the universe, and everything is "# 编码为token
tokens = [128000] + tokenizer.encode(prompt)
print(tokens)
tokens = torch.tensor(tokens)# 将每个 token 解码为对应的文本
prompt_split_as_tokens = [tokenizer.decode([token.item()]) for token in tokens]
print(prompt_split_as_tokens)
    [128000, 1820, 4320, 311, 279, 17139, 3488, 315, 2324, 11, 279, 15861, 11, 323, 4395, 374, 220]['<|begin_of_text|>', 'the', ' answer', ' to', ' the', ' ultimate', ' question', ' of', ' life', ',', ' the', ' universe', ',', ' and', ' everything', ' is', ' ']

将 token 转换为 embedding

这里使用内置的神经网络模块

无论如何, [17x1] token 现在是 [17x4096],即每个 token 的长度为 4096 的 embeddings

注意:跟踪 shapes,这样一切将变得理解更容易


# 加载嵌入层并复制权重
embedding_layer = torch.nn.Embedding(vocab_size, dim)
embedding_layer.weight.data.copy_(model["tok_embeddings.weight"])# 获取未归一化的 token 嵌入
token_embeddings_unnormalized = embedding_layer(tokens).to(torch.bfloat16)
token_embeddings_unnormalized.shape
torch.Size([17, 4096])

接下来使用 RMS 归一化嵌入

请注意,经过此步骤后 shapes 不变, 只是值被归一化

需要注意的是,需要一个 norm_eps(来自配置)以避免不小心将 RMS 设置为 0 并导致除以 0 的情况

这是公式:

# rms 归一化函数# def rms_norm(tensor, norm_weights):
#     rms = (tensor.pow(2).mean(-1, keepdim=True) + norm_eps)**0.5
#     return tensor * (norm_weights / rms)def rms_norm(tensor, norm_weights):return (tensor * torch.rsqrt(tensor.pow(2).mean(-1, keepdim=True) + norm_eps)) * norm_weights

构建第一个 Transformer 层

归一化

从模型字典中访问 layer.0 (这是第一层)

归一化后 shapes 仍然是 [17x4096], 与嵌入相同但已归一化

# 归一化token嵌入
token_embeddings = rms_norm(token_embeddings_unnormalized, model["layers.0.attention_norm.weight"])
t
http://www.dtcms.com/a/490255.html

相关文章:

  • GPU服务器深度解析:H100/H200的“机头”与“模组”架构详解
  • javaWeb-html、css-常见标签样式
  • 开发组件漏洞
  • 每日学习内容简单汇总记录
  • vue3 封装图片上传预览组件支持docx、excel、pdf、图片、txt格式
  • (3)Bug篇
  • Monkey测试Bug排查全攻略
  • 做的网站如何发布会网站建设要求 优帮云
  • 海外建站平台开发个网站开票名称是什么意思
  • 【具身智能】MolmoAct深度解析:在空间中推理的开放式机器人动作模型
  • Linux:库制作与原理
  • SpringBoot集成测试
  • PDF Protector for mac PDF文档加密解密工具
  • 任务型与聊天型语音机器人有什么区别
  • 【具身智能】Gemini Robotics 1.5 深度解析:当机器人学会“思考”与“技能迁移”
  • 【机器人】激光雷达(LiDAR)核心原理:定位、测距与抗干扰
  • 机器人动作捕捉:光学 / 惯性 / 无标记点技术对比与工业 / RoboMaster / 高校场景适配
  • 有网站后台模板如何做数据库网站建设的方式有哪些内容
  • 在 Linux 平台上安装 64 位 JDK
  • Spring Boot配置属性:类型安全的最佳实践
  • prometheus暴露指标
  • RunnableParallel 操纵输入和输出
  • [双指针] 1. 力扣283.移动零
  • 【博客规划】关于我未来的研究方向……
  • python 列表浅拷贝 深拷贝
  • 网站如何做后台留言淘宝客网站一般用什么做的
  • 使用snmpsim与docker批量生成snmpd模拟服务
  • 燕之屋(1497.HK)燕窝肽260万单场售罄,科技重塑传统
  • 【动态规划】数位DP的原理、模板(封装类)
  • 神经网络中的批归一化(BatchNorm)