0

0

FP和BF有什么区别这里给你很好的解释

WBOY

WBOY

发布时间:2024-07-29 21:07:15

|

1730人浏览过

|

来源于dev.to

转载

fp和bf有什么区别这里给你很好的解释

浮点表示:

fp16(半精度):在 fp16 中,浮点数使用 16 位表示。它由 1 个符号位、5 位指数和 10 位分数(尾数)组成。这种格式为表示其范围内的小数值提供了更高的精度。

bf16 (bfloat16):bf16 也使用 16 位,但分布不同。它有 1 个符号位、8 位指数、7 位尾数。这种格式牺牲了小数部分的一些精度以适应更广泛的指数。

数值范围:

fp16 由于其 10 位尾数,其范围较小,但在该范围内精度较高。
bf16 由于其 8 位指数和 7 位尾数,其小数范围较宽,但精度较低。

示例:

我们用3个例子来说明fp16和bf16的区别。使用tensorflow来做测试和代码共享在底层:

原始值:0.0001 — 两种方法都可以表示
fp16: 0.00010001659393 (二进制:0|00001|1010001110,十六进制:068e) — 10 个尾数和 5 个指数
bf16: 0.00010013580322(二进制:0|01110001| 1010010,十六进制:38d2) — 7 个尾数和 8 个指数

如您所见,它们具有不同的指数和尾数,因此能够表示不同的值。 但是我们可以看到fp16表示得更准确,数值更接近。

原始值:1e-08(0.00000001)
fp16:0.00000000000000(二进制:0|00000|0000000000,十六进制:0000)
bf16:0.00000001001172(二进制:0|01100100|0101100,十六进制:322c)

这是一个非常有趣的案例。 fp16 失败 并使结果为 0,但 bf16 能够用特殊格式表示它。

Simplified
Simplified

AI写作、平面设计、编辑视频和发布内容。专为团队打造。

下载

原始值:100000.00001
fp16:inf(二进制:0|11111|0000000000,十六进制:7c00)
bf16:99840.00000000000000(二进制:0|10001111|100) 0011,十六进制:47c3)

在上面的情况下,fp16 失败,因为所有指数位都已满并且不足以表示该值。然而 bf16 有效

用例:

fp16 常用于深度学习训练和推理,特别是对于需要高精度表示有限范围内的小分数值的任务。

bf16 在为机器学习任务设计的硬件架构中变得越来越流行,这些任务受益于更广泛的可表示值,即使以小数部分的一些精度为代价。当处理大梯度或当大范围内的数值稳定性比小值的精度更重要时,它特别有用。

总结一下

fp16 为较小范围内的小数值提供了更高的精度,使其适合需要精确表示小数字的任务。另一方面,bf16 以牺牲一定精度为代价提供了更广泛的范围,这使得它有利于涉及更广泛值范围或在大范围内的数值稳定性至关重要的任务。 fp16 和 bf16 之间的选择取决于手头机器学习任务的具体要求。

最终结论

由于以上原因,在进行 stable diffusion xl (sdxl) 训练时,fp16 和 bf16 需要的学习率略有不同,我发现 bf16 效果更好。

用于生成上述示例的代码

import tensorflow as tf
import struct

def float_to_binary(f):
    return ''.join(f'{b:08b}' for b in struct.pack('>f', f))

def display_fp16(value):
    fp16 = tf.cast(tf.constant(value, dtype=tf.float32), tf.float16)
    fp32 = tf.cast(fp16, tf.float32)
    binary = format(int.from_bytes(fp16.numpy().tobytes(), 'big'), '016b')
    sign = binary[0]
    exponent = binary[1:6]
    fraction = binary[6:]
    return f"FP16: {fp32.numpy():14.14f} (Binary: {sign}|{exponent}|{fraction}, Hex: {fp16.numpy().view('uint16'):04X})"

def display_bf16(value):
    bf16 = tf.cast(tf.constant(value, dtype=tf.float32), tf.bfloat16)
    bf32 = tf.cast(bf16, tf.float32)
    binary = format(int.from_bytes(bf16.numpy().tobytes(), 'big'), '016b')
    sign = binary[0]
    exponent = binary[1:9]
    fraction = binary[9:]
    return f"BF16: {bf32.numpy():14.14f} (Binary: {sign}|{exponent}|{fraction}, Hex: {bf16.numpy().view('uint16'):04X})"

values = [0.0001, 0.00000001, 100000.00001]

for value in values:
    print(f"\nOriginal value: {value}")
    print(display_fp16(value))
    print(display_bf16(value))

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
Python AI机器学习PyTorch教程_Python怎么用PyTorch和TensorFlow做机器学习
Python AI机器学习PyTorch教程_Python怎么用PyTorch和TensorFlow做机器学习

PyTorch 是一种用于构建深度学习模型的功能完备框架,是一种通常用于图像识别和语言处理等应用程序的机器学习。 使用Python 编写,因此对于大多数机器学习开发者而言,学习和使用起来相对简单。 PyTorch 的独特之处在于,它完全支持GPU,并且使用反向模式自动微分技术,因此可以动态修改计算图形。

23

2025.12.22

Python 深度学习框架与TensorFlow入门
Python 深度学习框架与TensorFlow入门

本专题深入讲解 Python 在深度学习与人工智能领域的应用,包括使用 TensorFlow 搭建神经网络模型、卷积神经网络(CNN)、循环神经网络(RNN)、数据预处理、模型优化与训练技巧。通过实战项目(如图像识别与文本生成),帮助学习者掌握 如何使用 TensorFlow 开发高效的深度学习模型,并将其应用于实际的 AI 问题中。

20

2026.01.07

Java JVM 原理与性能调优实战
Java JVM 原理与性能调优实战

本专题系统讲解 Java 虚拟机(JVM)的核心工作原理与性能调优方法,包括 JVM 内存结构、对象创建与回收流程、垃圾回收器(Serial、CMS、G1、ZGC)对比分析、常见内存泄漏与性能瓶颈排查,以及 JVM 参数调优与监控工具(jstat、jmap、jvisualvm)的实战使用。通过真实案例,帮助学习者掌握 Java 应用在生产环境中的性能分析与优化能力。

11

2026.01.20

PS使用蒙版相关教程
PS使用蒙版相关教程

本专题整合了ps使用蒙版相关教程,阅读专题下面的文章了解更多详细内容。

59

2026.01.19

java用途介绍
java用途介绍

本专题整合了java用途功能相关介绍,阅读专题下面的文章了解更多详细内容。

84

2026.01.19

java输出数组相关教程
java输出数组相关教程

本专题整合了java输出数组相关教程,阅读专题下面的文章了解更多详细内容。

38

2026.01.19

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

10

2026.01.19

xml格式相关教程
xml格式相关教程

本专题整合了xml格式相关教程汇总,阅读专题下面的文章了解更多详细内容。

13

2026.01.19

PHP WebSocket 实时通信开发
PHP WebSocket 实时通信开发

本专题系统讲解 PHP 在实时通信与长连接场景中的应用实践,涵盖 WebSocket 协议原理、服务端连接管理、消息推送机制、心跳检测、断线重连以及与前端的实时交互实现。通过聊天系统、实时通知等案例,帮助开发者掌握 使用 PHP 构建实时通信与推送服务的完整开发流程,适用于即时消息与高互动性应用场景。

17

2026.01.19

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号