分类 二、深度学习 下的文章

一、SentencePiece 简介

SentencePiece 在大模型领域主要用于文本的 分词 和 编码。

1、分词

是将文本分割成一个个独立的词语或符号。传统的中文分词方法,例如 BMM 分词、隐马尔可夫(H M M ) 分词,都是基于规则的,需要人工制定分词规则。而 SentencePiece 则是基于 无监督学习 的,它可以自动学习文本的语义和结构,并根据学习结果进行分词。

2、编码

是将分词后的词语或符号转换为数字形式,以便计算机能够处理。SentencePiece 使用了一种称为 字节对编码 的方法,它可以将每个词语或符号编码成一个或多个字节。字节对编码的优点是能够有效地利用空间,并且可以将词语或符号之间的关系编码到编码中。

3、优势:SentencePiece 在大模型领域具有以下优势:

分词效果好,能够准确地识别词语和符号的边界。
编码效率高,能够节省空间。
能够将词语或符号之间的关系编码到编码中,有利于模型学习。
因此,SentencePiece 已经被广泛应用于各大模型,例如 Google 的 BERT、GPT-3,以及阿里巴巴的 M6 等。

简单来说,SentencePiece 就是大模型领域的一个 分词和编码工具。它可以帮助大模型更好地理解和处理文本。

4、自监督训练原理

SentencePiece 的自监督训练模型原理是通过 无监督学习 的方式,学习文本的语义和结构,并根据学习结果进行分词和编码。

具体来说,SentencePiece 的训练过程可以分为以下几个步骤:

数据准备:首先需要准备一个文本语料库,语料库中的文本可以是任何类型,例如新闻文章、书籍、代码等。
模型训练:使用无监督学习算法训练 SentencePiece 模型,模型的输入是文本语料库,输出是分词后的文本。
模型评估:使用评估指标评估模型的性能,例如分词准确率、召回率等。
SentencePiece 使用的无监督学习算法是一种称为 Masked Language Modeling (MLM) 的算法。MLM 的基本思想是:将文本中的部分词语或符号进行遮蔽,然后让模型预测被遮蔽的词语或符号。通过这种方式,模型可以学习文本的语义和结构。

在 SentencePiece 中,MLM 的具体实现如下:

随机选择文本中的部分词语或符号进行遮蔽。
将被遮蔽的词语或符号替换为一个特殊符号,例如 [MASK]。
将处理后的文本输入模型,让模型预测被遮蔽的词语或符号。
通过这种方式,模型可以学习到被遮蔽词语或符号与周围词语或符号之间的关系,从而提高分词和编码的准确性。

SentencePiece 的自监督训练模型具有以下优势:

不需要人工制定分词规则,能够自动学习文本的语义和结构。
分词效果好,能够准确地识别词语和符号的边界。
编码效率高,能够节省空间。
SentencePiece 的自监督训练模型已经被广泛应用于各大模型,例如 Google 的 BERT、GPT-3,以及阿里巴巴的 M6 等。

二、TikToken 简介

Tiktoken 的功能与 SentencePiece 类似,都是用于文本的 分词 和 编码。

Tiktoken 是一个基于 BPE 算法的 快速分词器,它专门针对 GPT-4 和 ChatGPT 等大模型进行了优化。Tiktoken 的主要特点如下:

速度快:Tiktoken 的分词速度比 SentencePiece 快很多,可以满足大模型训练和推理的需求。
效果好:Tiktoken 的分词效果与 SentencePiece 相当,能够准确地识别词语和符号的边界。
易用性:Tiktoken 提供了简单的 API 接口,方便使用。
Tiktoken 与 SentencePiece 的主要区别 如下:

分词算法:Tiktoken 使用 BPE 算法进行分词,而 SentencePiece 使用的是无监督学习算法。
速度:Tiktoken 的分词速度比 SentencePiece 快很多。
模型:Tiktoken 专门针对 GPT-4 和 ChatGPT 等大模型进行了优化,而 SentencePiece 则是通用的。

速度探究
所以大家一定对为什么这么快很好奇,查阅tictoken的源码得知,tictoken对CoreBPE类进行了基于RUST的重写,包括真·多线程,regex,缓存caching,哈希各个方面的优化,具体的下面逐一解释:

3.1 regex优化
正则是耗时的大头,解决办法是用一些不那么花哨的方法,比如用 regex crate可解析的形式的regex要比寻常方法快3倍以上。

一旦明确了使用crate可解析的regex,可以选择用regex crate 或者 fancy_regex crate

regex crate 和 fancy_regex crate也有相互关系,fancy_regex使用的re.find_it会竞争re的可变缓存空间,造成性能下降,而regex的find_iter有不同的代码路径,不会造成这个问题。为此,通过给绝大部分的regex线程做一个克隆线程来避免。

3.2 threading
rayon并没有比python自带的threads和释放GIL的情况下快,所以直接用python线程计数等来完成threads

这里我多说一下,python自带的GIL是指如果没有额外操作,只是使用了类似:

3.3 caching
tokenizer中使用LRU cache是很有必要的,可以加速查找速度,作者使用了RWLock来保护cache安全,对于RWLock,全称是"reader-writer spin lock",和普通的spinlock不同,它对"read"和"write"的操作进行了区分。如果当前没有writer,那么多个reader可以同时获取这个rwlock。如果当前没有任何的reader,那么一个writer可以获取这个rwlock。

3.4 hash
作者使用了FxHashMap替代传统的HashMap达到了一定的性能提升,简单说明一下,FxHashMap的散列算法质量不高,但速度非常快,特别是对整数键而言,并且发现它的性能优于rustc内的所有其他散列算法。

以上就是tictoken进行的性能优化。

一、什么是优化器

用于优化模型的参数。当前向计算完成后,根据loss获得参数的梯度后,优化器就是如何利用梯度来更新和计算模型的网络参数,使得在后期计算中能够让模型的损失最小化。优化器通过不断更新模型参数来拟合训练数据,从而使得在新数据上表现良好。

优化器不计算梯度,它只是梯度的更新者,它决定了以什么样的形式更新参数。

二、优化器算法

1、梯度下降法

https://zhuanlan.zhihu.com/p/687987540

1、DataParallel

如果当前有4个GPU,batch_size=16,那么模型将被复制到每一个GPU上,在前向传播时,每一个gpu将分到4个batch,每个gpu独立计算依据分到的batch计算出结果的梯度,然后将梯度返回到第一个GPU上,第一个GPU再进行梯度融合、模型更新。在下一次前向传播的时候,将更新后的模型再复制给每一个GPU。

1、DP在每个训练批次(batch)中,因为模型的权重都是在 一个进程上先算出来 然后再把他们分发到每个GPU上,所以网络通信就成为了一个瓶颈,而GPU使用率也通常很低。

2、因为它在每一次的前向传播的时候把模型也复制了(即每次更新都复制一遍模型),并且单进程多线程会造成GIL contention(全局解释器锁争用) 这里进程计算权重使通信成为瓶颈造成了大量的时间浪费,因此引入了DDP。

2、DistributedDataParallel

DDP采用多进程控制多GPU,共同训练模型,一份代码会被pytorch自动分配到n个进程并在n个GPU上运行。 DDP运用Ring-Reduce通信算法在每个GPU间对梯度进行通讯,交换彼此的梯度,从而获得所有GPU的梯度。对比DP,不需要在进行模型本体的通信,因此可以加速训练。

参考https://zhuanlan.zhihu.com/p/489011749

在所有节点上运行命令来初始化上面创建的 DDP 作业:

torchrun --nnodes=2 --nproc_per_node=8 --rdzv_id=100 --rdzv_backend=c10d --rdzv_endpoint=$MASTER_ADDR:29400 elastic_ddp.py

这里torchrun将启动8个进程并调用elastic_ddp.py 其启动的节点上的每个进程,但用户还需要应用slurm等集群管理工具才能在2个节点上实际运行此命令。

srun --nodes=2 ./torchrun_script.sh

启动脚本
无论 DDP 应用程序如何启动,每个进程都需要一种机制来了解其rank等,使用torch提供的分布式脚本可以通过环境变量将世界大小、全局等级、主地址和主端口以及本地等级作为命令行参数传递给每个实例,初始化的时候选择环境变量初始化就很方便 (就不应该使用启动子进程torch.multiprocessing.spawn 了)。

torch.distributed.launch
python -m torch.distributed.launch --nproc_per_node 8 test.py
————————————————
版权声明:本文为CSDN博主「www_z_dd」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/www_z_dd/article/details/132020726

参考:
PyTorch 分布式训练和启动脚本torch.distributed.launch torchrun slurm