機器學習和高性能計算中常用的幾種浮點數精度

浮點數 (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
英文地址,請注明出處:http://en.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為分支…