”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > FP和BF有什么区别这里给你很好的解释

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

发布于2024-08-17
浏览:772

What is the difference between FPand BF Here a good explanation for you

浮点表示:

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 能够用特殊格式表示它。

原始值:100000.00001
FP16:inf(二进制:0|11111|0000000000,十六进制:7C00)
BF16:99840.00000000000000(二进制:0|10001111 |1000011,十六进制: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))
版本声明 本文转载于:https://dev.to/furkangozukara/what-is-the-difference-between-fp16-and-bf16-here-a-good-explanation-for-you-gag?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • ## 您可以在不使用 JavaScript 的情况下使用 CSS 创建饼图分段吗?
    ## 您可以在不使用 JavaScript 的情况下使用 CSS 创建饼图分段吗?
    使用 CSS 在圆中分段使用 border-radius 在 CSS 中创建圆是一种常见的做法。但是,我们可以通过分段(类似于饼图)实现类似的效果吗?本文深入研究了仅通过 HTML 和 CSS 实现此目的的方法,不包括使用 JavaScript。生成相等大小的段相等大小段的一种方法涉及生成以下内容的...
    编程 发布于2024-11-06
  • 从头开始构建一个小型矢量存储
    从头开始构建一个小型矢量存储
    With the evolving landscape of generative AI, vector databases are playing crucial role in powering generative AI applications. There are so many vect...
    编程 发布于2024-11-06
  • 如何在Chrome中使用AI实验API
    如何在Chrome中使用AI实验API
    要在 Chrome 中使用实验性 AI API,请按照以下步骤操作: 硬件要求 4GB 内存 GPU可用 至少 22GB 空间 Windows 10.11 或 macOS Ventura 或更新版本(无 Linux 规范) 尚不支持: Chrome操作系统 Chrome iOS Ch...
    编程 发布于2024-11-06
  • 评论:Adam Johnson 的《Boost Your Django DX》
    评论:Adam Johnson 的《Boost Your Django DX》
    书评很微妙。您不想破坏它,但您也想让潜在读者体验一下所期待的内容。这是提供背景和保持兴趣之间的巧妙平衡。我试图在这篇评论中达到这种平衡,为您提供足够的内容来吸引您,而不透露太多。 一个小背景故事:我第一次从 Djangonaut Space 的好朋友 Tim 那里听说这本书,并将其添加到我的阅读列表...
    编程 发布于2024-11-06
  • 如何对数组元素进行分组并组合多维数组中另一列的值?
    如何对数组元素进行分组并组合多维数组中另一列的值?
    按列对数组元素进行分组并组合另一列中的值给定一个包含两列嵌套数组的数组,任务是将基于特定列的子数组,并将每个组中另一列的值连接起来,生成一个以逗号分隔的列表。考虑以下示例数组:$array = [ ["444", "0081"], ["...
    编程 发布于2024-11-06
  • 三个新添加的例外功能
    三个新添加的例外功能
    从 JDK 7 开始,异常处理已扩展为三个新功能:自动资源管理、多重捕获和更准确的重新抛出。 多重catch允许您使用同一个catch子句捕获多个异常,避免代码重复。 要使用多重捕获,请指定由 | 分隔的异常列表。在 catch 子句中。每个参数都是隐式最终参数。 用法示例:catch(final...
    编程 发布于2024-11-06
  • 如何修复运行 ES6 代码时出现“意外的令牌导出”错误?
    如何修复运行 ES6 代码时出现“意外的令牌导出”错误?
    “排除意外的令牌导出错误”尝试在项目中执行 ES6 代码时,可能会出现“意外的令牌导出”错误。此错误表明所使用的环境不支持 ES6 模块中使用的导出关键字语法。错误详细信息以下代码片段举例说明了错误的来源: export class MyClass { constructor() { c...
    编程 发布于2024-11-06
  • 即使卸载后,VSCode 扩展也不会从文件系统中删除,我创建了一个解决方案!
    即使卸载后,VSCode 扩展也不会从文件系统中删除,我创建了一个解决方案!
    所以这是基于 vscode 的编辑器的问题。即使您卸载了扩展程序,它也会保留在文件系统中,并随着时间的推移堵塞您的系统。我创建了一个简单的解决方案。运行此 python 脚本将删除 vscode 上未安装的扩展。 它适用于 VS Code、VS Code Insiders,也适用于 VSCodiu...
    编程 发布于2024-11-06
  • 通过 GitHub Actions 按计划更新网站内容
    通过 GitHub Actions 按计划更新网站内容
    我想分享我构建一个自我可持续的内容管理系统的旅程,该系统不需要传统意义上的内容数据库。 问题 该网站的内容(博客文章和书签)存储在 Notion 数据库中: 带书签的数据库 –  Notion UI 我试图解决的问题是不必在添加每个书签后手动部署网站。最重要的是 - 保持托管尽可能便...
    编程 发布于2024-11-06
  • 如何在 Laravel 5 应用程序的共享托管环境中清除缓存?
    如何在 Laravel 5 应用程序的共享托管环境中清除缓存?
    如何从 Laravel 5 中的共享托管服务器清除缓存清除缓存对于维护 Laravel 应用程序的性能和效率至关重要。但是,在您可能无法访问 CLI 的共享托管环境中,清除缓存可能是一个挑战。清除视图缓存的解决方法在这种情况下,您可以通过在 CLI 之外调用 Artisan 命令来解决此问题。要清除...
    编程 发布于2024-11-06
  • 如何加速 Matplotlib 绘图以提高性能?
    如何加速 Matplotlib 绘图以提高性能?
    为什么 Matplotlib 这么慢?在评估 Python 绘图库时,考虑性能很重要。 Matplotlib 是一个广泛使用的库,它看起来可能很缓慢,引发了关于加快速度或探索替代选项的问题。让我们深入研究这个问题并探索可能的解决方案。提供的示例展示了具有多个子图和数据更新的图。使用 Matplotl...
    编程 发布于2024-11-06
  • 使用画布调整图像大小时如何克服锯齿状边缘和模糊结果?
    使用画布调整图像大小时如何克服锯齿状边缘和模糊结果?
    解决在 JavaScript 中使用 Canvas 调整图像大小时的平滑问题在 JavaScript 中使用 Canvas 调整图像大小有时会导致明显的锯齿状边缘或模糊。为了实现平滑的调整大小,可以采用一种称为向下步进的技术。在大多数浏览器中,默认情况下使用线性插值来调整大小。双三次插值可产生更平滑...
    编程 发布于2024-11-06
  • 如何解决 MySQL C# 中的文本编码问题?
    如何解决 MySQL C# 中的文本编码问题?
    修复 MySQL C# 中的文本编码问题使用实体框架在 C# 中处理 MySQL 数据库时,用户可能会遇到文本编码问题,特别是带有特殊字符,例如“ë”,渲染不正确。本文探讨了解决此常见问题的最合适的解决方案。要纠正编码问题,必须执行以下操作:验证排序规则设置: 确保所涉及的数据库或表的排序规则与 U...
    编程 发布于2024-11-06
  • 如何将美丽搜索与 Node.js 集成
    如何将美丽搜索与 Node.js 集成
    作为 Node.js 开发人员,构建能够提供快速且准确的搜索结果的应用程序非常重要。用户期望立即得到相关的响应,但实现起来可能具有挑战性,特别是在处理大型数据集时。 这就是美丽搜索的用武之地——一个为轻松满足这些需求而构建的搜索引擎。 什么是美丽搜索? Meilisearch 是一个...
    编程 发布于2024-11-06
  • 并行 JavaScript 机
    并行 JavaScript 机
    作者:Vladas Saulis,PE Prodata,克莱佩达,立陶宛 2024 年 5 月 18 日 抽象的 本文提出了一种新的编程模型,可以以简单且自动平衡的方式利用多核 CPU 系统。该模型还提出了一种更简单的编程范例,用于在大多数大规模并行计算领域(例如天气预报、核物理、搜索引擎等)开发并...
    编程 发布于2024-11-06

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3