问题

在学习大模型训练的过程中,我想到了这一点,因为我记得batch size的大小好像会影响训练结果,但是记不太清了,因此,展开了一系列的调研。

思考

我们定义batch size在1-32之间是小batch,大于512是大batch(比如说)。

问题1:Batch size对训练结果有什么影响?

首先,我猜测batch size越大,可能训练的效果越好,batch size越小,可能训练的效果越差。因为显然,我如果将一个小的batch给学习了,他可能有一些特别的东西学到了,下一个batch可能恰恰是相反的方向,我觉得会比较崎岖这个优化过程,但是大batch的话,因为把这些特点给一定程度上平均了,所以我觉得,他的下降会更平缓一些,至于最终的效果,可能差不太多。

经过搜索发现,大batch可能反而效果会差一些,小一点的batch反而可能效果好,这是因为大batch虽然走的稳,但是会掉入一个比较极限的最小点,缺乏泛化能力,而小batch这里走一下,那里走一下,可能反而会进入一个宽阔的最小点。

ps. batch如果不shuffle一下,那么可能会学习一些特别的特征,不会泛化,但是如果shuffle了,就有噪音了,这个泛化的性能就会更强一些。(感觉有道理)

问题2:Batch size对GPU利用率的影响

我的猜测是Batch size越大,自然利用率就越大,因为很显然嘛,越多利用率就越大hh,但是又带来了一个问题,batch size变大是否会爆显存?这个作为我们的下一个问题。

首先,batch size越大,我想的是就需要更加频繁的计算,才更新一次参数,更新参数我想,但是我觉得,也有可能GPU利用率是一样的,因为前向传播,反向传播和更新参数,都由GPU进行,那咋算不是算啊,他不得一直算吗。。。

实际上,原因在于,小batch的去显存读写次数更多,因为权重从显存读入到高速缓存后,由于小batch太小了(32)那么整个训练过程就需要不断地读写W,而大batch(512)则读取到高速缓存一次,相当于小batch的10次以上,因此,读取和写入的时间都远远比小batch要更加的省。那么计算资源的利用率自然就提高了。

问题2.1 Batch size增大是否会爆显存?

回到这个问题,batch size增大会爆显存嘛?我觉得没可能,因为比如batch size = 512,那么他就是中间训练时,这512个样本的误差平均一下,然后反向传播即可,跟batch size = 32没什么区别。

经过查阅资料发现,差别还不小。。这涉及到一个激活值的概念,当然了,前向传播,每个节点自然会和样本计算,产生一个结果。那么这个值具体有多大呢?

一个激活向量比如就是[batch_size, seq_length, hidden_dimension](这里hidden_dimension就是一个token变成了多少维的向量)也就是embedding,文本embedding的过程是,文本先变成token_id,然后再变成embedding成了[4096]维度的向量,我感觉这个向量就是用来捕捉词语自身的语义,不包含位置。而tokenizer只负责获取token id,而4096维向量是来自embedding层,是训练学出来的。而捕捉词与词之间的关系,是后面自注意力学出来的,这一点要加以区分。

一个参数2B(bf16)(ps:bf16 1符号 8指数 7尾数,范围大精度低,fp16 1符号 5指数 10尾数,大模型训练一般用bf16训练,fp16推理)

因此,batch_size = 32的情况下,这些激活值的存储要占:325124096*2B = 134MB,而中间还有QKV,注意力分数矩阵(以后会涉及到吧,现在暂且没有研究)总的来说,上面的值要再乘以10-14倍,然后加上乱七八糟的,一共这就确实是有很多了,batch翻倍,这个值也翻倍。另外,这个是一层,再乘以32层(比如,叫transformer block是一层说是)。总之,这些差不多就是几十个G了,如果batch_size大个几倍,hh,显存当然就爆了。

ps. 我觉得我还是很喜欢基础,希望能学基础,不丢下他,这个是我一直以来的爱好,我也不想因为说这是拖延或者怎么样,这个爱是真的。学基础让我快乐。读研了很多时候都以效率为主,不是那么关注内心的兴趣了,就是想着成果,但是万一以后成果不顶用了,也是一句话的事,那么我们又该何去何从呢?投资失败了相当于hhh,而追随自己的兴趣,则一定会收获快乐和满足,我觉得,这一块,一定不能丢。好好守护,好好成长,保持一颗赤子之心,没毛病~回想高中,大学,考研,都很快乐,读研也可以很快乐,工作也可以很快乐,只要不放弃希望,一切都没问题,跌倒了就再爬起来,躺一会儿也没事,越来越好。

https://jax-ml.github.io/scaling-book/gpus/
这个是关于GPU的教程,开个坑吧~

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐