首页 > 其他分享 >LLM场景下常用浮点数介绍

LLM场景下常用浮点数介绍

时间:2024-08-03 18:42:00浏览次数:14  
标签:偏置 场景 指数 尾数 浮点数 符号 LLM float32

在计算机中,浮点数的表示基于IEEE 754标准,这是最广泛使用的浮点数表示标准。对于一个具体的数值,如 10.2345434,它会被分解为符号位、指数位和尾数位。

这里以最常见的 float32(单精度浮点数)为例来解释这个过程:

符号位

如果数值是正的,符号位为0;如果数值是负的,符号位为1。

对于10.2345434,因为它是正数,所以符号位为0

指数位 (Exponent)

IEEE 754标准采用偏置(或称为偏移)指数来表示。对于float32,指数宽度为8位,偏置值为127。指数的计算方法是将实际的指数值加上偏置值。实际的指数值是将数值标准化为1.xxxxx的形式后的指数。

例如,将10.2345434转化为二进制,约等于1010.00111100001110101(省略无限重复的部分),标准化为1.01000111100001110101 * 2^3。因此,实际的指数是3,偏置后的指数为3 + 127 = 130,二进制表示为10000010

为啥要有偏置值?

支持负指数:浮点数需要能表示小于1的数,这就要求指数可以是负的。通过引入偏置值,实际的指数(可能为负)被转化为一个非负整数,这样就可以用标准的无符号二进制形式存储。

简化硬件设计:使用偏置指数允许浮点数的比较和排序可以像整数一样处理,不需要特别处理指数的正负,这简化了硬件的实现。

偏置值是否一样?

不同的浮点数格式根据其指数的位数有不同的偏置值:

  • float32(单精度):指数位为8位,偏置值为127。
  • float16:指数位为5位,偏置值为15。
  • bfloat16:指数位为8位,偏置值为127。

从上面可以看出,float32bfloat16使用相同的偏置值(127),因为它们的指数部分都是8位。

float16的指数部分只有5位,所以它的偏置值是15。

这种设计反映了不同格式在精度和表达范围之间的平衡。

尾数位 (Mantissa or Fraction)

在将数值标准化后,尾数部分就是除去整数部分的1之后的小数部分。对于float32,尾数有23位。

对于10.2345434,标准化后的尾数是.01000111100001110101。在存储时,省略开头的1(因为在标准化的二进制形式中1总是存在,除非数值是0),直接存储后面的部分,并根据需要截断或舍入到23位。

组合所有部分

将这些部分组合起来,得到float32格式的二进制表示:

符号位:0
指数:10000010
尾数:01000111100001110101000 (这里是截断后的结果)

这个组合的完整二进制串可以直接用于计算机内的存储和计算。

实际的存储和计算可能会涉及舍入和一些优化,这取决于具体的硬件和编译器实现。浮点数的表示并不总能完全精确,小数部分可能会因为二进制表示的限制而有轻微的误差。这是在使用浮点数时需要注意的精度问题。

LLM 场景的浮点数

在大型语言模型(LLM)中,通常使用不同的数值精度来平衡性能和资源消耗。主要包括以下几种精度格式:bfloat16float16float32

float32:

精度:32位,其中1位用于符号,8位用于指数,23位用于尾数。

对于 float32 格式,位布局可以这样表示:

  • 最高位(第32位)是符号位。
  • 接下来的8位(第31至第24位)是指数位。
  • 最后的23位(第23至第1位)是尾数位。
S|EEEEEEEE|MMMMMMMMMMMMMMMMMMMMMMM

其中 S 是符号位,E 是指数位,M 是尾数位。

精确度:提供较高的数值精确度,适用于需要高精度计算的场景。

资源消耗:相比于float16bfloat16,使用float32会消耗更多的内存和计算资源,这可能导致速度较慢。

使用场景:在模型训练的初期或者在对精度要求极高的应用中使用。

float16:

精度:16位,其中1位用于符号,5位用于指数,10位用于尾数。

对于 float16 格式,位布局可以这样表示:

  • 最高位(第16位)是符号位。
  • 接下来的5位(第15至第11位)是指数位。
  • 最后的10位(第10至第1位)是尾数位。
S|EEEEE|MMMMMMMMMM

其中 S 是符号位,E 是指数位,M 是尾数位。

精确度:低于float32,但通常足够用于许多深度学习任务。

资源消耗:内存和计算资源的消耗低于float32,使得模型可以更快地运行。

使用场景:在对计算速度有较高要求的场景中使用,例如在模型推理阶段或者资源有限的设备上。

bfloat16:

bfloat16 中的 “b” 代表 “brain”,这是因为这种数据格式最初是由谷歌大脑(Google Brain)团队为 TensorFlow 和后来的 TPU(Tensor Processing Unit)开发的。

bfloat16 是为了优化深度学习训练和推理在硬件上的执行效率而设计的,特别是在处理需要大量浮点运算的应用时,它通过提供与 float32 相同宽度的指数部分来增强数值的稳定性,同时减少尾数位以节省内存和加速计算。

这种格式现在广泛用于多种深度学习硬件和软件框架中。

精度:16位,其中1位用于符号,8位用于指数,7位用于尾数。

对于 bfloat16 格式,位布局可以这样表示:

  • 最高位(第16位)是符号位。
  • 接下来的8位(第15至第8位)是指数位。
  • 最后的7位(第7至第1位)是尾数位。
S|EEEEEEEE|MMMMMMM

其中 S 是符号位,E 是指数位,M 是尾数位。

精确度:指数的表示范围与float32相同,但尾数的精度低于float16

资源消耗:与float16相似,但由于指数范围的扩展,它在处理极大或极小的数值时更为稳定。

使用场景:特别适合用于深度学习训练,因为它能够处理广泛的数值范围,同时保持较好的计算性能。

总结

选择哪种格式取决于具体的应用需求、计算资源和对精度的需求。float32因其高精度而广泛用于需要精确计算的领域,float16适用于需要较低存储和计算资源的场景,而bfloat16在深度学习训练中特别有用,尤其是在需要广泛数值范围和数值稳定性的场合。

标签:偏置,场景,指数,尾数,浮点数,符号,LLM,float32
From: https://www.cnblogs.com/ghj1976/p/18340872/llm-chang-jing-xia-chang-yong-fu-dian-shu-jie-s

相关文章

  • LLM场景下常用浮点数介绍
    在计算机中,浮点数的表示基于IEEE754标准,这是最广泛使用的浮点数表示标准。对于一个具体的数值,如10.2345434,它会被分解为符号位、指数位和尾数位。这里以最常见的float32(单精度浮点数)为例来解释这个过程:符号位如果数值是正的,符号位为0;如果数值是负的,符号位为1。对于10.23454......
  • LLM场景下常用浮点数介绍
    在计算机中,浮点数的表示基于IEEE754标准,这是最广泛使用的浮点数表示标准。对于一个具体的数值,如10.2345434,它会被分解为符号位、指数位和尾数位。这里以最常见的float32(单精度浮点数)为例来解释这个过程:符号位如果数值是正的,符号位为0;如果数值是负的,符号位为1。对于10.23454......
  • LLM 大模型文档语义分块、微调数据集生成
    1、LLM大模型文档语义分块参考:https://blog.csdn.net/m0_59596990/article/details/140280541根据上下句的语义相关性,相关就组合成一个分块,不相关就当场两个快语义模型用的bert-base-chinese:https://huggingface.co/google-bert/bert-base-chinese代码:对水浒传的分......
  • LLM问答[1]-9.9和9.11哪个大?
    摘要使用各种LLM模型进行问答,不保证准确。关键信息模型:gemma2:2b后端:ollama前端:chatbox提示词:小红书的风格是:很吸引眼球的标题,每个段落都加emoji,最后加一些tag。请用小红书风格问答数学角度和版本号角度解释9.9和9.11哪个大?这真是个有趣的问题!......
  • An Introductory Guide to Fine-Tuning LLMs
    AnIntroductoryGuidetoFine-TuningLLMshttps://www.datacamp.com/tutorial/fine-tuning-large-language-modelsFine-tuningLargeLanguageModels(LLMs)hasrevolutionizedNaturalLanguageProcessing(NLP),offeringunprecedentedcapabilitiesintaskslike......
  • 直播源码,如何确保并发场景下的账户余额一致性?
    直播源码,如何确保并发场景下的账户余额一致性?1.扣款流程是什么样的? publicvoidpayout(longuid,varpayAmount){#查询账户总额varamount="SELECTamountFROMaccountWHEREuid=$uid";#计算账户余额varbalanceAmount=amount-payAmount;if(......
  • SmolLM: 一个超快速、超高性能的小模型集合
    简介本文将介绍SmolLM。它集合了一系列最尖端的135M、360M、1.7B参数量的小模型,这些模型均在一个全新的高质量数据集上训练。本文将介绍数据整理、模型评测、使用方法等相关过程。引言近期,人们对能在本地设备上运行的小语言模型的兴趣日渐增长。这一趋势不仅激发了相关业者......
  • 如何使用中转API访问大型语言模型(LLM)
    在现代人工智能领域,大型语言模型(LLM)如GPT-3、ChatGPT等,已经展示出了惊人的自然语言处理能力。然而,由于国内网络环境的限制,直接访问国外的API存在一定困难。因此,我们需要通过中转API来访问这些服务。本文将介绍如何使用中转API地址http://api.wlai.vip来调用OpenAI的GPT-3模......
  • 如何使用OpenAI的大模型(LLM)进行Twitter数据读取与分析
    在这篇文章中,我们将介绍如何使用大语言模型(LLM),特别是OpenAI的工具,来读取和分析Twitter上的数据。我们会结合一个具体的示例,展示如何使用中国中转API地址(http://api.wlai.vip)进行调用。1.什么是大语言模型(LLM)?大语言模型(LLM)是一种通过大量文本数据训练得到的强大自然语言处......
  • 大数据场景下的Zookeeper集群的搭建
    本篇文件将介绍如何搭建zookeeper集群,并集合大数据相关组件介绍zookeeper的功能一、Zookeeper是做什么的,我们搭建它有什么用处Zookeeper是一个分布式的服务管理框架,它负责存储和管理大家都关心的数据,基于观察者涉及模式,Zookeeper接受观察者的注册,一旦这些数据的状态发生了变......