自学内容网 自学内容网

加快训练LLM速度的技巧笔记

加快训练LLM速度的技巧笔记

1.使用bfloat.16

解释:
如下图,相比fp32,bf16的表示范围不变(还是e8),但精度从m23降到了m7,但在大模型训练时,这种精度损失是可接受的。
需要注意,有些老的gpu不支持这个操作。一些新一点的4090,A100,H100等均支持。
在这里插入图片描述
使用方式如下:

with torch.autocast(device_type=device, dtype=torch.bfloat16):
logits, loss = model(x,y)

2.使用torch.compile

解释:
python的gcc编译优化(优化代码底层执行指令,主要优化了代码中对gpu的读写操作,不影响任何性能),在训练前会花费时间进行编译,但大大加快训练时速度。
需要注意,windows用不了。
使用方式如下:

model = GPT(GPTConfig())
model.to(device)
model = torch.compile(model)#after load model, before training

3.使用torch.set_float32_matmul_precision

解释:
即使使用了bfloat,有些操作仍然在float32精度下进行,例如softmax等,我们考虑使用torch.set_float32_matmul_precision(‘high’)进一步加快
使用方式如下:

torch.set_float32_matmul_precision('high')#before load model commonly

model = GPT(GPTConfig())
model.to(device)
model = torch.compile(model)

4.使用flash attention

解释:
思路是在attention计算时,保证attent矩阵(qk然后softmax的那个矩阵)一直在GPU的高速SRAM中。使用online softmax实现。
需要注意,在某些gpu上,模型下,效果不明显,但速度至少不会变慢。
在这里插入图片描述
使用方式如下,把计算attention地方换成F.scaled_dot_product_attention(q,k,v,is_causal=True),pytorch会使用flash attention计算注意力部分:

from torch.nn import functional as F

# att = (q @ k.transpose(-2, -1))*(1.0/ math.sqrt(k.size(-1)))
# att = att.masked_fill(self.bias[:,:,:T,:T] == 0, float('-inf'))
# att = F.softmax(att, dim=-1)
# y = att@v

y = F.scaled_dot_product_attention(q,k,v,is_causal=True)

5.使用good的数字

解释:
model参数,tokenizer参数,训练参数最好是4的倍数,8的倍数,等等,会发现速度就上去了。最起码是2的倍数!
使用方式,一些例子如下:

#注意力头25换掉
#n_head=25———>24———>32———>16

#词汇表大小vocab_size50257换掉,50304能整除64!
vocab_size=50257———>50304

#batchsize17换掉
batchsize=17———>16

原文地址:https://blog.csdn.net/a1920993165/article/details/144003862

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!