机器学习和高性能计算中常用的几种浮点数精度

浮点数 (Floating-Point Number) 是一种在计算机中表示带有小数部分的数字的方式。它通过科学记数法类似的方式(尾数 × 基数 ^ 指数)来近似表示实数。浮点数的精度决定了它可以表示的数值范围以及数值之间的精细程度。

常见的浮点数精度包括:

  1. FP32 (Single-Precision Floating-Point)

    • 也称为单精度浮点数
    • 使用 32 位(4 字节)来存储数字。
    • 这 32 位通常分配给:1 位符号位,8 位指数位,23 位尾数/有效数字位。
    • 特点:具有相对较好的数值范围和精度。在传统的科学计算、图形渲染以及较早期的深度学习模型中广泛使用。
    • 缺点:相对于低精度格式占用更多内存,计算速度也可能较慢(因为硬件通常针对更小的数据类型进行优化)。
  2. FP16 (Half-Precision Floating-Point)

    • 也称为半精度浮点数
    • 使用 16 位(2 字节)来存储数字。
    • 这 16 位通常分配给:1 位符号位,5 位指数位10 位尾数/有效数字位
    • 特点:
      • 优势: 相比 FP32 占用内存减半,可以存储更大的模型或处理更大的批量数据。在支持 FP16 计算的硬件上(如 NVIDIA 的 Tensor Cores),计算速度可以显著加快(理论上可达 FP32 的两倍甚至更高)。这对于深度学习的训练和推理非常重要。
      • 劣势: 由于指数位和尾数位都减少了,FP16 的数值范围更小精度也较低。这可能导致在训练过程中出现数值下溢(Underflow,数字太小无法表示)或上溢(Overflow,数字太大无法表示),以及梯度消失等问题,使得模型训练不稳定或难以收敛。
  3. BF16 (Bfloat16 - Brain Floating Point)

    • 由 Google Brain 提出的一种 16 位浮点格式。
    • 使用 16 位(2 字节)来存储数字。
    • 这 16 位通常分配给:1 位符号位,8 位指数位7 位尾数/有效数字位
    • 特点:
      • 优势: 与 FP32 具有相同的指数位数量(8 位),因此拥有与 FP32 几乎相同的数值范围。这大大减少了训练过程中出现上溢或下溢的风险,使得从 FP32 切换到 BF16 训练时通常比切换到 FP16 更稳定、更容易收敛。同样拥有 16 位格式带来的内存和计算效率优势。
      • 劣势: 尾数位只有 7 位,比 FP16 的 10 位少,这意味着 BF16 的表示精度比 FP16 要低

FP16 和 BF16 的对比总结:

  • 位数相同: 都是 16 位。
  • 内存/速度: 都比 FP32 节省内存并可能在支持硬件上加速计算。
  • 主要区别:
    • FP16: 范围小,但精度相对 BF16 高。
    • BF16: 范围大(与 FP32 相似),但精度相对 FP16 低。
  • 应用: FP16 广泛应用于各种支持的硬件,尤其在对精度要求不极致或通过混合精度训练可以缓解精度问题的场景。BF16 在 TPU 和较新的 GPU 上得到很好的支持,因其大范围带来的训练稳定性而在很多大型模型训练中受到青睐。

在现代深度学习中,FP16 和 BF16 通常被称为“标准精度”,相对于传统的 FP32(全精度)以及更低的 INT8、INT4 等量化(整数)精度而言。许多现代模型和训练技术都默认或推荐使用 FP16 或 BF16 来提高训练和推理效率。

llama.cpp 转换脚本要求输入标准精度模型时,它就是指期望模型的权重是 FP16 或 BF16 格式,而不是经过 4 位或 8 位等其他库的量化处理后的格式(这些格式通常会添加一些 llama.cpp 不认识的元数据张量)。

除了我们之前讨论的 FP32 (单精度)、FP16 (半精度) 和 BF16 (Bfloat16) 这些浮点数精度之外,在 AI 特别是深度学习领域,还有一些非常主流的精度格式,主要用于追求更高的效率和更低的内存占用:

  1. INT8 (8-bit Integer)

    • 描述: 使用 8 位整数来表示数值。由于整数没有小数部分,为了表示浮点数,通常需要结合一个缩放因子(scalar)和零点(zero point)来实现(这叫做量化)。
    • 特点: 相比 FP32/FP16/BF16 占用内存显著减少(权重大小变为原来的 1/4 到 1/2),计算量也大大降低。现代 AI 硬件(GPU, TPU, 专用推理芯片)通常都有专门的 INT8 计算单元,可以提供极高的吞吐量。
    • 主要用途: 推理 (Inference)。INT8 是目前最普遍的模型量化格式,广泛应用于各种边缘设备和数据中心推理场景,以加速计算和降低部署成本。
    • 挑战: 将模型从浮点数转换为 INT8 需要进行量化过程,可能需要校准数据集(Calibration)或进行量化感知训练(Quantization-Aware Training, QAT)来最小化精度损失。
  2. INT4 (4-bit Integer)

    • 描述: 使用 4 位整数来表示数值。这是比 INT8 更低的精度。
    • 特点: 相比 INT8 进一步减少模型大小(再次减半)和计算量。对于在资源极度受限的设备上部署超大型模型,或者在有限的显存中运行更大模型非常有用(比如 L4 + 22GB 显存,INT4 是进一步压缩模型的手段)。
    • 主要用途: 极限推理场景,尤其是在内存或带宽是主要瓶颈时。
    • 挑战: 精度极低,量化到 INT4 对模型的精度影响更大,更容易导致性能下降。需要更先进的量化技术和算法来保持可用精度。4 位加载 (load_in_4bit=True) 就属于这一范畴。
  3. FP8 (8-bit Floating-Point)

    • 描述: 一种新兴的 8 位浮点格式。与 INT8 不同,它保留了浮点数的指数和尾数结构,因此具有一定的数值范围。目前主要有两个主流变体:E5M2 (5 位指数,2 位尾数) 和 E4M3 (4 位指数,3 位尾数)。
    • 特点: 旨在结合 INT8 的效率和 FP16/BF16 的数值鲁棒性。E5M2 强调范围(与 FP16 范围相似),E4M3 强调精度。在支持的硬件上提供 8 位计算的高吞吐量。
    • 主要用途: 正在成为大型模型训练的一种重要精度格式(尤其在最新的硬件如 NVIDIA Hopper/Blackwell 和 Google Trillium 上),以及高性能推理。它可以减少训练时的内存和计算需求,同时提供比 INT8 更好的训练稳定性。

此外,还有一个重要的概念是:

  • 混合精度 (Mixed Precision)
    • 描述: 这不是一种单一的精度格式,而是一种训练技术。它在训练过程中同时使用多种精度,通常是将模型权重和激活值存储在低精度(如 FP16 或 BF16)以节省内存和加速计算,但在执行对数值精度要求较高的操作(如梯度累加、更新模型权重)时使用高精度(如 FP32)来保持数值稳定性。
    • 特点: 是目前训练大型深度学习模型的主流方法,可以在不牺牲太多精度的情况下大幅提高训练速度和显存利用率。需要硬件支持低精度浮点计算以及在不同精度之间高效转换的能力。

除了 FP32, FP16, BF16 之外,目前深度学习领域主流的精度还包括用于量化推理的 INT8INT4,以及用于高性能训练和推理的新兴 FP8。同时,混合精度是结合不同精度进行训练的普遍技术。选择哪种精度取决于具体的任务(训练还是推理)、硬件平台的能力、对性能和内存的严格要求,以及对模型精度损失的容忍度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/95334.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/95334.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开源大语言模型(Qwen3)

Qwen3是阿里巴巴达摩院于2025年4月29日发布的新一代开源大语言模型,属于通义千问系列的最新成员。其核心突破在于首创混合推理架构,将人类认知科学中的“快思考”与“慢思考”机制融入模型设计,实现了复杂任务处理与高效响应的平衡。 一、技术…

懒人精灵本地离线卡密验证系统教程(不联网、安全稳定、省钱、永久免费、无任何限制)

1.合集懒人精灵本地离线卡密验证系统教程(不联网、安全稳定、省钱、永久免费、无任何限制):https://www.bilibili.com/video/BV1B5PjeGETQ/ 备注: 1.本地离线卡密采用最安全的非对称加解密技术,设备id采用最安全多重混合加密不可逆技术生成,验证阶段需要网络时间,内置防抓…

【三维渲染技术讨论】Blender输出的三维文件里的透明贴图在Isaac Sim里会丢失, 是什么原因?

Blender导出的三维文件在Isaac Sim中丢失透明贴图,通常与文件格式兼容性、材质属性映射、导出设置或Isaac Sim材质解析逻辑有关。以下是具体原因分析和解决方法: 一、可能的原因文件格式对透明信息的支持差异 Blender常用的导出格式(如FBX、G…

Java线程池深度解析:从原理到实战的完整指南

Java线程池深度解析:从原理到实战的完整指南 🌟 你好,我是 励志成为糕手 ! 🌌 在代码的宇宙中,我是那个追逐优雅与性能的星际旅人。 ✨ 每一行代码都是我种下的星光,在逻辑的土壤里生长成璀璨的…

机器学习——模型架构

有监督学习 线性模型 多元线性回归:预测连续的数值(如房价、销量)。 逻辑回归:解决二分类问题(如判断邮件是否是垃圾邮件),输出概率。 非线性模型 决策树:通过一系列if-then规则进行…

深入理解Kafka事务

一 kafka事务介绍1.1 Kafka事务的作用Exactly-Once Semantics (EOS):在“消费 → 处理 → 生产”的流式链路里避免重复写与重复读带来的副作用,确保“处理一次且仅一次”的可见效果。跨分区 / 跨 Topic 原子性:将一次处理内写入的多分区多主题…

RabbitMinQ(模拟实现消息队列项目)

目录 一.消息队列背景 二.需求分析 核心概念: BrokerServer: BrokerServer的核心API: 交换机Exchange: 持久化: 网络通信: 消息应答: 三、模块划分 四、创建项目 五、创建核心类 Exchange: MSGQueue: Binding: Message: 六.…

如何构建StarRocks官方文档

不知道是网络问题还是官网问题,StarRocks文档经常出现卡顿的情况,曾经构建过Flink文档, 所以也想尝试自己构建一个StarRocks的本地官方文档 断断续续折腾了好几天,就不废话了,直接上实际步骤 1. 环境 1.1 Linux环境 …

堡垒机(跳板机)入门指南:构建更安全的多服务器运维架构

随着你的业务不断扩张,你云上服务器的数量,是不是也从一台,变成了三台、五台、甚至一个由几十台机器组成的庞大集群?你像一个尽职的“国王”,为你王国的每一座“城池”(每一台服务器)&#xff0…

(链表)Leetcode206链表反转+Leetcode6删除链表的倒数第N个结点+虚拟头节点使用

虚拟头结点的作用是:简化插入/删除逻辑方便返回头节点减少边界错误 Leetcode206链表反转 206. 反转链表 - 力扣(LeetCode) 头插法 # Definition for singly-linked list. # class ListNode(object): # def __init__(self, val0, nextN…

自然语言处理NLP:嵌入层Embedding中input_dim的计算——Tokenizer文本分词和编码

1. 词汇表大小(input_dim)计算方法 嵌入层Embedding中的input_dim是根据数据中所有唯一词(或字)的总数来决定的。可以通过Tokenizer文本分词和编码得到。 简单说,Tokenizer 是一个文本分词和编码器,它主要做…

python中的分代垃圾回收机制的原理【python进阶二、2】

1. 分代设计思想Python 将对象按存活时间分为三代(Generation 0, 1, 2):0代(年轻代):新创建的对象。1代(中年代):经历一次GC扫描后存活的对象。2代(老年代&am…

【后端】云服务器用nginx配置域名访问前后端分离项目

云服务器有多个服务(前端 3000 端口、后端 8288 端口,甚至还有别的服务)。希望用户只输入 域名(比如 https://example.com),而不是 example.com:3000、example.com:8288。本质上是要做 端口隐藏 域名统一入…

软考中级数据库系统工程师学习专篇(67、数据库恢复)

67、数据库恢复数据库故障恢复中基于检查点的事务分类与处理策略在数据库系统发生故障后的恢复过程中,​检查点(Checkpoint)​​ 技术是关键机制,它能有效缩小恢复范围,减少需要扫描的日志量,从而加速恢复进…

SpringBoot 分库分表 - 实现、配置与优化

分库分表(Database Sharding)是一种数据库架构优化技术,通过将数据分散到多个数据库或表中,以应对高并发、大数据量场景,提升系统性能和扩展性。 在 Spring Boot 中,分库分表可以通过框架支持(如…

爬虫代理实操:选择可靠的HTTP(S)代理的方法

在爬虫工作里,选对代理协议(HTTP/HTTPS)只是第一步,更关键的是找到 “可靠” 的代理 —— 哪怕是 HTTPS 代理,若节点不稳定、IP 纯净度低,照样会频繁被封,反而耽误采集进度。这几年踩过不少坑&a…

数据库常见故障类型

数据库常见故障类型数据库系统运行过程中可能发生的故障主要分为以下三类,其破坏性由小到大:故障类型别名根本原因影响范围典型例子​1. 事务故障​逻辑故障事务内部的程序逻辑错误或输入异常。​单个或少量事务。- 输入数据不合法(如除零错误…

【Android】Span富文本简介

一,概述android.text包下span体系类,主要指Spanned、Spannable、ParagraphStyle、CharacterStyle实现类。Android通过Span体系,搭建了富文本API,其中Spanned、Spannable实现了CharSequence接口,旨在映射段落start~end之…

【HTML】draggable 属性:解锁网页交互新维度

一、简介 在Web开发中,用户与内容的交互方式直接影响用户体验的深度。在 HTML 中,draggable 是一个全局属性,通过简单配置即可让任意元素实现拖拽功能。也可通过结合 draggable 属性和 JavaScript 事件,可以实现丰富的拖放交互功能…

如何在Github中创建仓库?如何将本地项目上传到GitHub中?

1.1 点击New repository(这个是创建代码仓库的意思)初次完成后只有一个文件最后:在本地git clone 项目地址然后把项目文件复制到git的文件夹内再提交到远程仓库git add . git commit -m "修改https"git push origin mainmain为分支…