从零预训练一个tiny-llama#Datawhale组队学习Task2
完整的教程请参考:datawhalechina/tiny-universe: 《大模型白盒子构建指南》:一个全手搓的Tiny-Universe (github.com)
这是Task2的学习任务
目录
Qwen-blog
Tokenizer(分词器)
Embedding(嵌入)
RMS Norm(RMS Layer Normalization)
enumerate函数
Flash Attention介绍
GQA
RoPE(旋转位置编码嵌入)
Tiny-llama
Qwen-blog
因为llama和Qwen的架构类似,所以这里按照Qwen的架构来学习。
Tokenizer(分词器)
Q:什么是Tokenizer?
A:Tokenizer的主要功能是将一段文本分割成更小的有意义的部分,这些部分被称为“tokens”(标记)。
Embedding(嵌入)
Q:什么是Embedding?
A:Embedding是一种将离散的符号(如单词或标记)映射到连续向量空间的技术。这些向量捕捉了词语之间的语义关系,并且可以用来表示词语在向量空间中的位置。
- Tokenizer 是用来将原始文本转换成分词后的序列,它是文本预处理的一部分。
- Embedding 则是将分词后的序列进一步转换为数值化的向量表示,以便于机器学习模型理解和处理。
通常先使用Tokenizer对文本进行分词,然后再将得到的tokens通过Embedding转换成向量,最终用于训练模型。
Q:关于Tokenizer好用的库推荐。
A:1)NLTK (Natural Language Toolkit)。NLTK 是一个强大的自然语言处理库,提供了多种分词器和其他NLP工具。2)Transformers (Hugging Face)。Transformers 库提供了多种预训练的Transformer模型,包括分词器。
RMS Norm(RMS Layer Normalization)
Q:什么是RMSNorm?
A:RMS Layer Normalization是对Batch Normalization(BN)和Layer Normalization(LN)的一种改进。RMSNorm针对每一批次中的每一个样本进行归一化处理,计算特征的均方根值,Layer Normalization计算的是每个特征的均值和方差。
enumerate函数
enumerate()
函数是 Python 中的一个内置函数,用于遍历可迭代对象(如列表、元组、字符串等)时同时获取元素及其对应的索引。这对于需要在循环中同时使用元素及其索引的情况非常有用。enumerate()
函数使得在遍历时获取元素的索引变得非常方便,适用于需要索引信息的各种场景。
Flash Attention介绍
Q:什么是Flash Attention?
A:Flash Attention 是一种用于加速Transformer模型中自注意力(self-attention)机制的优化技术。传统自注意力机制的时间复杂度和内存消耗均为 O(N2),其中 N是序列长度。Flash Attention 通过优化注意力计算的方式,能够在保持计算精度的同时显著降低计算成本,特别是内存消耗。
Q:Flash Attention的机制是什么?如何实现这种优化的?
A:Flash Attention 的核心思想在于利用稀疏矩阵运算和近似计算来减少自注意力机制的计算量。Flash Attention 通过稀疏化注意力矩阵,仅保留最重要的注意力权重,从而减少了计算和内存开销。Flash Attention 在计算注意力权重时采用近似方法,允许在一定程度上牺牲精确度以换取更高的计算效率。
Q:对比传统的自注意力机制,Flash Attention的改进体现在哪里?
A:传统的自注意力机制,包括步骤1)查询、键、值计算;2)注意力得分计算;3)Softmax规范化;4)加权求和。laFlash Attention的改进主要体现在第2步:注意力得分计算:不是直接计算所有查询和键之间的点积,而是通过稀疏化和近似计算来估计注意力得分。
GQA
Q:什么是GQA?
A:Grouped-query attention(GQA,分组查询注意力)是一种改进的多头注意力机制,旨在提高Transformer模型的效率和效果。这种方法通过减少键和值向量的数量来降低计算复杂度,同时保持模型性能。
Q:计算过程中,对Q,K,V分别进行了transpose操作,解释一下。
A:这里对Q,K,V进行transpose操作是为了转置操作是为了让数据更适合进行多头注意力计算。将输入的query,key,value形状从(B,L,D)(其中 B是批量大小,L是序列长度,D是向量的维度)转换成 (B,H,L,Dh)的格式,计算注意力得分的时候再对key进行transpose,将 key的形状从 (B,H,L,Dh)转换成 (B,H,Dh,L),计算点积。
缩放点积注意力的计算公式如下:
Q:这段代码中,为什么要用expand之后再reshape而不能直接用tensor自带的repeat?
A:在PyTorch中,expand()
和 repeat()
都可以用来复制张量中的元素以改变其形状。expand()
方法不会复制内存中的数据,而是创建一个视图(view),这个视图指向原始张量的存储空间。使用 expand()
不会增加内存负担;repeat()
方法则会真正地复制数据。使用 repeat()
会导致内存使用增加。
RoPE(旋转位置编码嵌入)
Q:什么是位置编码?
A:在自然语言处理任务中,模型需要理解文本中单词的顺序。位置编码(Positional Encoding, PE)是一种在序列模型(如Transformer)中加入位置信息的方法。
Q:Transformer 中的位置编码设计方式?
A:在Transformer的原始论文中,位置编码是通过一个确定性的函数来计算的,该函数根据位置和维度来生成位置编码向量。具体来说,位置编码向量是通过正弦和余弦函数生成的。
Q:这种编码方式的局限性?
A:Transformer 原始位置编码的局限性主要体现在:
1)固定长度限制:最大长度限制:原始的位置编码是基于一个预定义的最大序列长度计算的,这限制了模型处理更长序列的能力。非灵活长度:当处理不同长度的序列时,原始的位置编码需要根据序列的实际长度进行截断或填充;
2)计算复杂度:额外计算:在实际应用中,需要将位置编码向量加到词嵌入上,这增加了额外的计算量。参数开销:它们仍然占据了额外的内存空间,尤其是当序列长度较长时。
3)绝对位置信息:
- 缺乏相对位置信息:原始的位置编码提供了绝对位置信息,但缺乏相对位置信息。相对位置信息对于捕捉序列中的局部模式非常重要,特别是在长距离依赖关系中。
- 位置信息稀疏:在长序列中,位置编码可能不足以提供足够的位置信息来区分远距离的标记。
Q:旋转位置编码(RoPE)做了哪些改进?
A:旋转位置编码(RoPE)的改进主要体现在:
1)灵活处理任意长度的序列:
- 动态适应:RoPE 可以动态地适应任意长度的序列,不需要预先设定一个最大长度,因此可以更好地处理不同长度的输入序列。
- 无需重新计算:即使序列长度发生变化,也不需要重新计算位置编码,因为旋转矩阵是根据实际位置动态生成的。
2)减少计算和内存开销:
- 无额外参数:RoPE 不需要额外的位置编码参数,减少了模型的参数量。
- 高效计算:旋转操作相对简单,计算速度快,不会显著增加模型的计算负担。
3)增强相对位置信息:
- 相对位置编码:RoPE 通过旋转查询和键向量来模拟相对位置信息,这有助于模型更好地捕捉序列中的局部模式。
- 增强长距离依赖:RoPE 可以更好地保留长序列中的位置信息,从而增强模型处理长距离依赖关系的能力。
Q:旋转位置编码(RoPE)通过旋转操作巧妙地结合了绝对位置信息和相对位置信息。如何理解?
A:绝对位置信息:每个位置 i通过旋转矩阵 Ri 被编码进向量中。这意味着每个位置 i 都有一个唯一的旋转矩阵,从而赋予了每个位置的向量一个独特的表示。
相对位置信息:假设我们有两个位置 i 和 j,对应的旋转矩阵分别为 Ri 和 Rj。当 i≠j 时,Ri 和 Rj 之间的差异反映了位置 i 和位置 j 之间的相对位置关系。
Q:代码是如何实现的?
A:代码定义了一个用于生成旋转位置编码(RoPE)的类。它通过预先计算 cos
和 sin
缓存来加速旋转操作,并且能够在需要时动态更新缓存以支持更长的序列长度。具体步骤如下:
- 初始化:设置必要的参数,并计算逆频率。
- 生成缓存:生成
cos
和sin
缓存数据。 - 前向传播:返回旋转矩阵,并在必要时更新缓存
class Qwen2RotaryEmbedding(nn.Module):def __init__(self, dim, max_position_embeddings=2048, base=10000, device=None):super().__init__()# 定义初始值self.dim = dimself.max_position_embeddings = max_position_embeddingsself.base = base# 定义旋转角inv_freq = 1.0 / (self.base ** (torch.arange(0, self.dim, 2, dtype=torch.int64).float().to(device) / self.dim))self.register_buffer("inv_freq", inv_freq, persistent=False)# Build here to make `torch.jit.trace` work.self._set_cos_sin_cache(seq_len=max_position_embeddings, device=self.inv_freq.device, dtype=torch.get_default_dtype())# 为seq里面的每个token形成独一无二的旋转角嵌入(外积)def _set_cos_sin_cache(self, seq_len, device, dtype):self.max_seq_len_cached = seq_lent = torch.arange(self.max_seq_len_cached, device=device, dtype=torch.int64).type_as(self.inv_freq)freqs = torch.outer(t, self.inv_freq)# 生成角度信息(利用注册机制生成self.cos_cached与sin_cachedemb = torch.cat((freqs, freqs), dim=-1)self.register_buffer("cos_cached", emb.cos().to(dtype), persistent=False)self.register_buffer("sin_cached", emb.sin().to(dtype), persistent=False)def forward(self, x, seq_len=None):# x: [bs, num_attention_heads, seq_len, head_size]if seq_len > self.max_seq_len_cached:self._set_cos_sin_cache(seq_len=seq_len, device=x.device, dtype=x.dtype)return (self.cos_cached[:seq_len].to(dtype=x.dtype),self.sin_cached[:seq_len].to(dtype=x.dtype),)
Tiny-llama
这块的详细教程可以参考:KMnO4-zx/tiny-llm (github.com)。
按照以下步骤,开跑:
- 训练Tokenizer:
python train_vocab.py --download True --vocab_size 4096
- 数据预处理:
python preprocess.py
- 训练模型:
python train.py
- 使用模型生成文本:
python sample.py --prompt "One day, Lily met a Shoggoth"
贴一张运行中的图
开跑,等结果,预计要一天吧。
最终结果,可以看到损失还是比较大的,可能是初始的学习率过高了,导致loss缓慢上升。
我们测试一下效果吧。prompt "One day, Lily met a Shoggoth",然后我们看看模型的输出效果吧:
Sample 1:
One day, Lily met a Shoggoth leaves. She was so a friends with dark and playedro must and as help. She looked, starteded old way food on hungry.
F brave scared in running together all moral outside outside.
The be yummy people. "Tom, looked soon want to the too. both can f them red tail fell. He took other played. She looked they laughed played.
Tom and if having others again gardenate toys and that hurt what over thatw.
The pond made ask all he it!" M put the sky happily we friend. They. They and scared and put ask off himself. They into a water againat. You the be then anymorear if too. He didn't this. They more people and proudd feelr some feel dog.
A listen him feel park, Max when you the that of the mommying friends not out and they not go to go look now. He lots to real pictures, with the little smile. The friends knows. They not funb on for clean. Theyed outing can doing lost.
P, be are know and you she food smile. They became be st. Once upon a time, there was broken hat is truck. Tim was surprised and became good friends. The small
--------------------Sample 2:
One day, Lily met a Shoggoth was any strange said, "S bed important overr here looking again and delicious as dad that she only.
The soft bird so two?" Sheers hurt high. "OK, hurt feel scary and what was happy and as know proud that in softar over no. Jack ate know dress your truck after fix and hurt and by for like stay. Once upon a time always at know, them should p because need to play bed and askaes. One day, both nodded and playing upch clean and right.
The big headf got need so then asked others backl they said dog. Tim when my all used his man to explore friends you to it toy, inside. She continued going playing who smiled up hurt from this careful than came yummy.
The tree stopped and flew good. The so and he hard into fun.
S wanted to think know just open as the dog p car. He found bright if though do out toys or set before.
Tim nodded around or singc we he was go for the happened. She and go to the over run and anything tree work could show room. Do going to understand sound and worry into feel do mom no. The fast magic if its w dog their house?"
A pond grabbed her
--------------------Sample 3:
One day, Lily met a Shoggoth by being rockhil. The foresters was go. He was tired, warm feel put red away by how home. But one day green yummy warm up always?" this grandma thought look sh for their box where.
When something house, two always isly carefulot. Lily anything into it from a eyes. Her it have. She became they still thely and called the small nice. They if things don't sing again games family in the never.
Wheno, they didn't their cat in pictures. F about all around listen to the things and blue. It if hurt idea happily b unexpected as some yard always find what oring p she still.
S until feeling up. He lost his at the story, even toys when and a hat to set look. He is us around they and dad away. That he became ball." He always will comest something thing. Max with youes of best back. He with the park and and toys near going park?"
"Lilyar, moral. Maybe be by her dress. You more tree backit fell with should his sh. Why unexpected for funny he as making highit playinges. He room made toy. The dog idea on my.
Max here running rock people
那么本次笔记就记到这里了,喜欢的小伙伴收藏点赞关注吧。
相关文章:

从零预训练一个tiny-llama#Datawhale组队学习Task2
完整的教程请参考:datawhalechina/tiny-universe: 《大模型白盒子构建指南》:一个全手搓的Tiny-Universe (github.com) 这是Task2的学习任务 目录 Qwen-blog Tokenizer(分词器) Embedding(嵌入) RMS …...

【Linux探索学习】第二弹——Linux的基础指令(中)——夯实基础第二篇
Linux基础指令(上):【Linux探索学习】第一弹——Linux的基本指令(上)——开启Linux学习第一篇-CSDN博客 前言: 在前面我们已经讲解了一些常用的Linux的基础指令,那些当然是远远不够的ÿ…...
Python和QT哪个更适合嵌入式方向的上位机开发?
最近因为工作需要,需要做一个上位机用来处理收集到的数据,然后进行分析,最好有图标输出,当然还要考虑开发便捷,毕竟平时主要是嵌入式方向开发,核心技术栈主要是Linux和C语言,对于开始上位机并不…...

Unity实战案例全解析:RTS游戏的框选和阵型功能(5)阵型功能 优化
前篇:Unity实战案例全解析:RTS游戏的框选和阵型功能(4)阵型功能-CSDN博客 本案例来源于unity唐老狮,有兴趣的小伙伴可以去泰克在线观看该课程 我只是对重要功能进行分析和做出笔记分享,并未无师自通&#x…...

Android compose 的基本环境搭建
1.创建项目 导入版本 1.gradle/libs.versions.toml [versions] accompanistPermissions "0.36.0" agp "8.5.0-beta01" coilCompose "2.7.0" constraintlayoutComposeVersion "1.0.1" hiltAndroid "2.51.1" hiltNavi…...
git | 合并 commit 的两种方法
比如你最近的 3 次提交分别为 A B C,你想将它们合并成 X。 方案一 使用 git rebase -i HEAD~3 进入编辑: pick 0148079 A pick 29cae72 B pick bf8572a C修改: r 0148079 A f 29cae72 B f bf8572a C:wq 保存进入 commit 编辑页面,输入 X …...

Grafana链接iframe嵌入Web前端一直跳登录页面的问题记录
概述 公司有个项目使用到Grafana作为监控界面,因为项目方的环境极其复杂,仅物理隔离的环境就有三四个,而且每个都得部署项目,今天在某个环境测试,查看界面遇到一个比较奇怪的Grafana问题,后面针对该问题进行跟踪分析并解决,故而博文记录,用于备忘。 问题 登录项目We…...

后端Java-SpringBoot整合MyBatisPlus步骤(超详细)
1.新建项目。 2.点击完上一步的next之后,选择pom.xml文件中的依赖。 3.点击pom文件进行项目初始化。 按照下面的俩步骤刷新一下maven ,让文件生效 4.新建一个application.yml文件 5. 新建一个数据库mp,在数据库中新建一张user表 6.连接数据…...

8609 哈夫曼树
### 思路 1. **选择最小权值节点**:在哈夫曼树构建过程中,选择两个权值最小且父节点为0的节点。 2. **构建哈夫曼树**:根据权值构建哈夫曼树,确保左子树权值小于右子树权值。 3. **生成哈夫曼编码**:从叶子节点到根节点…...

docker的harbor仓库登录问题
目录 一、问题描述 二、证书信任问题 三、DNS解析问题 四、解决 参考链接:Docker login Harbor报错解决:Error response from daemon: Get https:..-阿里云开发者社区 一、问题描述 问题: 挂机或者挂机重启之后harbor登录不上 查看日…...
ENV | docker 安装使用(简单实操版)
1. 详细步骤 1.1 安装 sudo apt update sudo apt install docker.io1.2 验证(可跳过) docker -v1.3 使用 1.3.1 拉取镜像 # 镜像源,如使用腾讯云服务器,可使用 https://mirror.ccs.tencentyun.com docker pull xxx1.3.2 运行…...

【Golang】深入解读Go语言中的错误(error)与异常(panic)
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…...
DMDSC更换DCR和VOTE磁盘
DMDSC更换DCR和VOTE磁盘 为了提高DMDSC集群运行速度和节点之间通信协调的效率,需要将运行在机械盘上的dcr和vote磁盘替换到SSD高效磁盘上。将原来200M的dcr和vote机械磁盘,换成500M的SSD高效磁盘。 磁盘替换规划信息如下所示: 信息说明 替…...

国产化框架PaddleYOLO结合Swanlab进行作物检测
1. 项目介绍 粮食安全,作为人类生存与发展的基石,始终是全球关注的焦点。它不仅仅关乎粮食的充足供应,更涉及粮食的质量安全、营养健康以及可持续生产等多个维度。在全球化、气候变化和资源环境约束日益加剧的背景下,如何确保粮食…...
Linux编译部署PHP环境
1.准备工作 安装前我们需要设置防护墙,开放端口,更新yum源 # 1.防火墙 systemctl status firewalld 看到active(running)就意味着防火墙打开了 systemctl stop firewalld 看到inactive(dead)就意味着防火墙关闭了 systemctl start fire…...
Win11禁止搜索栏查找互联网内容
禁止任务栏和开始菜单的搜索栏查找互联网内容的方法如下: 使用组策略:WinR键,或菜单框,输入gpedit.msc回车,启动本地组策略编辑器。使用左侧的边栏导航到“计算机配置”>“管理模板”>“Windows组件”>“搜索…...
dig和nmap的区别
dig和nmap是两种在网络管理和安全领域广泛使用的工具,它们在功能、用途和原理上存在显著差异。 dig 定义与功能: dig(Domain Information Groper)是一个用于查询DNS(域名系统)信息的命令行工具。它允许用…...

无人机飞手入伍当兵技术优势分析
随着现代战争形态的不断演变,无人机技术在军事领域的应用日益广泛,成为提升军队作战能力的重要手段。对于无人机飞手而言,其专业技能和实战经验在入伍当兵后能够转化为显著的技术优势,为国防事业贡献重要力量。以下是从专业技能优…...

[Everything] 文件搜索工具的下载及详细安装使用过程(附有下载文件)
快速搜索文件名及其所在路径 下载链接在文末 下载压缩包后解压 !!安装路径不要有中文 解压后得到文件 双击exe文件得到 选择简体中文,点击OK 点击“我接受” 更改安装目录,最好不要放在C盘,点击下一步 点击下一步 点…...

HIRI-ViT:使用高分辨率输入的视觉Transformer扩展
摘要 https://arxiv.org/pdf/2403.11999 视觉Transformer( V i T \mathrm{ViT} ViT)与卷积神经网络(CNN)的混合深度模型已成为视觉任务中一类强大的骨干网络。自然地,提高此类混合骨干网络的输入分辨率会增强模型容量…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...

接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...
安卓基础(Java 和 Gradle 版本)
1. 设置项目的 JDK 版本 方法1:通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分,设置 Gradle JDK 方法2:通过 Settings File → Settings... (或 CtrlAltS)…...