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