大模型高效训练基础知识:fp16与混合精度训练
在计算激活值和梯度的时候以fp16精度存储,执行优化算法的时候还原为fp32(缺失位补0),这样最终的效果是模型在GPU上以fp16和fp32两种方式加载,这被称为混合精度训练(mixed precision training)
·
计算机表示浮点数有多种精度,其中Float16和Float32最为常见,即
- fp32: Sign(1bit) + Range(8 bits) + Precision(23 bits)
- fp16: Sign(1bit) + Range(5 bits) + Precision(10 bits)
GPU是一种专精浮点数运算的硬件设备,显然处理32位浮点数是处理16位浮点数计算量的2倍还多,在愿意损失一些精度的条件下使用fp16可以加速计算,而且也不会对模型最终的效果产生可感知影响。于是就有人提出了采用fp16来进行训练,具体而言在计算激活值和梯度的时候以fp16精度存储,执行优化算法的时候还原为fp32(缺失位补0),这样最终的效果是模型在GPU上以fp16和fp32两种方式加载,这被称为混合精度训练(mixed precision training),这种方式占用了更少的显存(全精度需要保存2份原始模型,混合精度保存1份原始模型,1份半精度模型,是原始模型的1.5倍),也加速了训练过程,即精度损失换时间。
Transformer框架内开启fp16非常简单,仅需在TrainingArguments种设置fp16标志位为True:
training_args = TrainingArguments(per_device_train_batch_size=4, fp16=True, **default_args)
trainer = Trainer(model=model, args=training_args, train_dataset=ds)
result = trainer.train()
参考文献
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)