大模型高效训练基础知识:fp16与混合精度训练

2023-10-12 09:38:26 浏览数 (1)

计算机表示浮点数有多种精度,其中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:

代码语言:javascript复制
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()
参考文献

1.FP16 Training

0 人点赞