[通俗易懂]float32、float16、bfloat16之间的差异

一、 首先声明

qlora一般用bfloat16的精度类型进行训练,然而支持bfloat16精度往往需要V100以上的卡(不包括V100)。可惜本人服务器上只有V100类型的卡,想要使用qlora进行训练需要把精度改为float16。(关于不同精度类型的区别在下面会介绍)
使用float16进行训练时可能会出现数值溢出,训练loss不稳定等。使用V100的话利用int8类型进行lora训练可能更方便。

二、 float32、float16、bfloat16之间的差异

不同的浮点数据类型:float32、float16、bfloat16等,可以称之为精度,而模型大小 = 模型参数量x精度。以下是不同精度之间的区别:

  1. Float32 :又称FP32(float point 32),是具有32位的浮点数,其中有1个符号位,8位表示指数,23位表示尾数。是标准的数据类型。
  2. Float16:又称FP16,其位数只有FP32的一半,指数保留5位,尾数保留10位。FP16所能表示的最大的数字是64k,存在上溢和下溢的风险。
  3. Bfloat16:又称BF16,其指数位数与FP32相同,都是8位,因此表示的数据范围更广,但是精度比FP16要差。
    在这里插入图片描述
    在这里插入图片描述
    因为1字节(Byte)=8比特(bit),因此32位=4字节。
    FP32称为全精度(4字节),FP16和BF16可以称为半精度(2字节)。
    如果是一个7B的模型,使用全精度的FP32版本,大小就为7X4 = 28GB
    使用半精度(FP16/BF16),大小就为14GB。

混合精度训练指的是使用FP32作为主权重,而在进行前向和后向传播时使用FP16/BF16来提升训练速度,最后在梯度更新阶段再使用FP16/BF16梯度更新FP32主权重。

参考

https://huggingface.co/blog/zh/hf-bitsandbytes-integration

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值