- 博客(14)
- 收藏
- 关注
原创 【LLM笔记】 LoRA
在训练过程中,求模型梯度是主要的计算量,如果全量更新,那么所用的梯度是。因此,一部分初始为 0,一部分正常初始化是为了在训练开始时维持网络的原有输出(初始偏移为 0),但同时也保证在真正开始学习后能够更好的收敛。:比如 LoRA 原论文就选择只更新 Self Attention 的参数,实际使用时我们还可以选择只更新部分层的参数;:由于更新的参数量变少了,所以(尤其是多卡训练时)要传输的数据量也变少了,从而减少了传输时间;基础上的,所以理论上 LoRA 的计算量比全量更新还大。,在对这些模型进行微调时,
2024-08-14 15:28:16 954
原创 【LLM笔记】 ZeRO
但对 ZeRO 来说,它做 forward 和 backward 的时候,是需要把各 GPU 上维护的 W 聚合起来的,即本质上还是用完整的 W 进行计算。
2024-08-14 15:09:22 900
原创 【论文笔记】 A Study on the Impact of Format Restrictions on Performance of Large Language Models
令Claude-3-Haiku为 Claude 3 Haiku和 LLama-3-8B(解析错误百分比最高的两个模型)重新格式化存在解析错误的输出,观察到 JSON和YAML格式上得分有所提高。比较 JSON , XML 和 YAML三种语言,这三种语言有着不同的语法规则和限制,且每个模型的表现各异,未见到任何一种语言格式能在所有模型中始终表现出色。在下游处理中结构化输出可能是有益的,但是过于严格的模式可能会阻碍LLM的表现,特别是在推理密集型的任务中。这一发现表明,不同格式间的性能差距。
2024-08-13 09:43:30 894
原创 FlashAttention
总容量大概有192 KB * 108 (streaming multiproecssors) 左右,虽然大小少很多,但是他的bandwidth 可以达到19TB/s,因此当有运算需要从HBM 当中不断读写资料的时候,这样的速度差就容易导致HBM 的读取变成整体效能的bottleneck。的意思为运算的主要时间都耗费在operation 的计算上,HBM 的存取只占了其中一点点的时间,例如多维度的矩阵相乘或是高channel 数的convolution都属于这类。的各个分块完成一整行的计算。
2024-07-10 11:33:11 1589
原创 python 并发 并行
死锁产生的前三个条件是死锁产生的必要条件,也就是说要产生死锁必须具备的条件,而不是存在这3个条件就一定产生死锁,那么只要在逻辑上回避了第四个条件就可以避免死锁。避免死锁采用的是允许前三个条件存在,但通过合理的资源分配算法来确保永远不会形成环形等待的封闭进程链,从而避免死锁。该方法支持多个进程的并行执行,为了避免死锁,系统动态的确定是否分配一个资源给请求的进程。如果会死锁,则不分配,否则就分配。要求每个进程必须先知道资源的最大需求量,且在系统运行过程中,考察每个进程对各类资源的申请需要花费较多的时间。
2024-07-02 11:36:15 783
原创 python copy
相当于多贴了一个标签(引用),指向同一个对象,引用计数 +1。不可变对象被重新赋值,重新分配了一块内存,ID就变了。:会开辟新的内存地址存储被拷贝对象的外层对象,同时。列表直接赋值给列表不属于拷贝, 只是内存地址的引用。浅拷贝, 只会拷贝第一层, 第二层的内容不会拷贝。指向的是一个可变对象(list),所以我们用。的三个元素都是指向的同一个对象。做重复的时候,实际上得到的。,不能算一个完整的拷贝副本。,即是一个完整的拷贝副本。:会开辟新的内存地址存储。
2024-06-25 10:15:15 517
原创 python 异常捕获
如果异常的类型和 except 之后的名称相符,那么对应的 except 子句将被执行。一个 try 语句可能包含多个except子句,分别来处理不同的特定的异常。子句比把所有的语句都放在 try 子句里面要好,这样可以避免一些意想不到,而 except 又无法捕获的异常。如果一个异常没有与任何的 except 匹配,那么这个异常将会传递给上层的 try 中。如果没有异常发生,忽略 except 子句,try 子句执行后结束。子句,如果使用这个子句,那么必须放在所有的。子句没有发生任何异常的时候执行。
2024-06-20 11:43:47 252
原创 python 迭代对象 迭代器 生成器
是一个关键字,用于定义生成器函数,生成器函数是一种特殊的函数,可以在迭代过程中逐步产生值,而不是一次性返回所有结果。生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。恰当的例子就是斐波那契数列,可以用生成器实现一个斐波那契数列,但因为该数列的元素是无限多个,所以说其是迭代器实现的就没有说由生成器实现的说法恰当。这样,生成器函数可以逐步产生值,而不需要一次性计算并返回所有结果。循环进行迭代时,函数会从上次暂停的地方继续执行,直到再次遇到。语句时,函数的执行将会暂停,并将。
2024-06-19 20:48:20 291
原创 分布式训练
将 mini-batch 进一步划分成更小的 micro-batch,同时利用 pipipline 方案,每次处理一个 micro-batch 的数据,得到结果后,将该 micro-batch 的结果发送给下游设备,同时开始处理后一个 micro-batch 的数据,通过这套方案减小设备中的 Bubble(把网络分成 4 块,每一块放在一个 GPU 上,不同的颜色表示不同的 GPU),于是就有了 F0、F1、F2、F3 这 4 个管级的前向路径,然后是 B3、B2、B1、B0 的逆序后向路径。
2024-06-17 09:47:47 330
原创 混合精度
但是实际上,在训练过程中,内存中占据大部分的基本都是 activations 的值。因此,只要 activation 的值基本都是使用 fp16 来进行存储的话,则最终模型与 fp32 相比起来, 内存占用也基本能够减半。在某些模型中,fp16 矩阵乘法的过程中,需要利用 fp32 来进行矩阵乘法中间的累加(accumulated),然后再将 fp32 的值转化为 fp16 进行存储。,由于链式法则的存在,loss 上的 scale 也会作用在梯度上。通用的模型 fp16 占用的内存只需原来的一半。
2024-06-15 15:50:10 774
原创 显存计算
128 时,中间激活占用显存为, $ (34bsd+5bs^2h)∗l=35253091565568 \text{bytes}\approx 35.3 \text{TB}$ 大约是模型参数显存的 101 倍。BF16 的表示范围大,但精度低,因此更容易下溢,为了避免溢出问题,提出了混合精度方案。在训练过程中,模型的每个参数会记录梯度用于更新,此外优化器也会额外记录一些数据,称为。【注】:有的参考资料中,没有考虑 fp32 的梯度,计算得到总显存为。的增大,中间激活占用的显存远远超过了模型参数显存。
2024-06-15 15:33:10 1788
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人