LoRA、QLoRA是什么

一:
LoRA(Low-Rank Adaptation,低秩適應)是一種高效的大模型參數微調技術,由Meta在2021年提出。它通過凍結預訓練模型參數,僅訓練少量新增的低秩矩陣,大幅減少了需要訓練的參數量,同時保持接近全參數微調的效果。

為什么需要LoRA?

傳統的全參數微調(Fine-tuning)需要更新大型語言模型的所有參數(如GPT-3有1750億參數),這帶來兩個核心問題:

  1. 計算資源需求極高:需要大量GPU內存和長時間訓練。
  2. 容易過擬合:對于小數據集,全參數微調可能導致模型忘記預訓練知識(災難性遺忘)。

而LoRA通過只訓練少量新增參數,解決了這些問題。

LoRA的核心原理

LoRA的核心思想是:用兩個低秩矩陣的乘積代替傳統的權重更新矩陣

對于預訓練模型中的權重矩陣 W 0 W_0 W0?(通常維度很高,如768×768),LoRA不直接更新它,而是添加一個可訓練的分解矩陣:
W = W 0 + Δ W = W 0 + B ? A W = W_0 + \Delta W = W_0 + B \cdot A W=W0?+ΔW=W0?+B?A
其中:

  • B B B A A A 是兩個低秩矩陣,秩為 r r r(通常 r ? 維度 r \ll \text{維度} r?維度,如 r = 8 r=8 r=8 r = 16 r=16 r=16)。
  • A A A 是隨機初始化的矩陣, B B B 初始化為零矩陣。
  • 只有 B B B A A A 需要訓練, W 0 W_0 W0? 保持凍結。

LoRA的優勢

  1. 參數量顯著減少

    • 對于13B參數的CodeLlama模型,全參數微調需要訓練130億參數;
    • 而LoRA只需要訓練約0.5%的參數(例如 r = 8 r=8 r=8 時,僅需約650萬參數)。
  2. 內存和計算效率提升

    • 訓練時GPU內存需求降低,可使用更小的GPU訓練大模型。
    • 推理時不需要額外內存,因為LoRA權重可以與原始權重合并。
  3. 訓練速度加快

    • 由于需要計算梯度的參數大幅減少,訓練速度顯著提升。
  4. 可并行訓練多個任務

    • 可以為不同任務保存不同的LoRA權重,共享同一個預訓練模型。

在你的代碼中的應用

在你提供的代碼中,LoRA的配置如下:

train_args = {"finetuning_type": "lora",  # 使用LoRA微調"lora_target": "q_proj,v_proj",  # 只對Attention層的query和value投影矩陣應用LoRA"lora_rank": 64,  # 低秩矩陣的秩r"lora_alpha": 32,  # 縮放因子,用于調整LoRA權重的大小
}

這意味著代碼只會微調模型中Attention層的query和value投影矩陣,使用秩為64的低秩分解,從而大幅降低訓練成本。

LoRA vs 全參數微調

對比項全參數微調LoRA微調
訓練參數量所有參數(如13B)僅LoRA參數(如650K)
GPU內存需求高(需保存所有梯度)低(僅保存LoRA梯度)
訓練時間
模型效果可能更好(數據充足時)接近全參數微調
多任務支持需要為每個任務保存完整模型共享預訓練模型,僅保存LoRA權重

總結

LoRA是一種輕量級微調技術,特別適合在資源有限的情況下微調大型語言模型。通過凍結預訓練權重并引入低秩適應矩陣,LoRA在大幅減少訓練成本的同時,保持了接近全參數微調的效果。這使得即使是個人開發者也能在消費級GPU上微調13B甚至更大的模型。

QLoRA(Quantized Low-Rank Adaptation)是LoRA的升級版,由Meta在2023年提出。它通過量化預訓練模型權重(如將權重壓縮至4位或更少)并結合LoRA微調,進一步降低了大模型微調的資源門檻,讓普通人也能在消費級GPU上微調百億級參數模型。


二:

QLoRA的核心創新

1. 4位量化預訓練模型
  • 傳統LoRA:雖然只訓練少量LoRA參數,但預訓練模型權重仍需以FP16(16位浮點)或BF16(Brain Floating Point)格式存儲,占用大量內存。例如,13B參數模型需約26GB顯存。
  • QLoRA:將預訓練模型權重壓縮至4位(僅需約3.25GB),同時引入雙量化技術進一步減少量化誤差,幾乎不損失模型性能。
2. Paged Optimizers
  • 設計了特殊的優化器,解決量化模型訓練時的內存碎片問題,大幅減少內存峰值。
3. 高秩適應
  • 支持更高的LoRA秩(如 r = 64 r=64 r=64 r = 128 r=128 r=128),在低精度下仍能保持良好的表達能力。

QLoRA的優勢

  1. 顯存需求極低

    • 13B模型只需約7GB顯存即可微調(相比傳統LoRA的26GB)。
    • 70B模型可在單張48GB GPU上微調(傳統方法需多張A100)。
  2. 接近全參數微調的效果

    • 在多個基準測試中,QLoRA微調的模型性能接近甚至超過全參數微調的結果。
  3. 訓練效率提升

    • 由于權重存儲量減少,內存帶寬壓力降低,訓練速度略有提升。

QLoRA vs LoRA

對比項LoRAQLoRA
預訓練模型精度FP16/BF16 (16位)4位量化
13B模型顯存需求~26GB~7GB
70B模型顯存需求~140GB~18GB
參數量僅LoRA參數僅LoRA參數(量化權重不占訓練內存)
硬件要求需要高端GPU(如A100)可在消費級GPU(如RTX 4090)上運行

在你的代碼中如何使用QLoRA?

如果要將你的代碼從LoRA切換到QLoRA,需要:

  1. 安裝額外依賴

    pip install bitsandbytes  # 用于權重量化
    
  2. 修改訓練參數

    from transformers import BitsAndBytesConfig# 配置4位量化
    quantization_config = BitsAndBytesConfig(load_in_4bit=True,  # 加載4位量化模型bnb_4bit_compute_dtype=torch.bfloat16,  # 計算精度bnb_4bit_use_double_quant=True,  # 雙量化bnb_4bit_quant_type="nf4",  # 量化類型
    )train_args = {"model_name_or_path": "codellama/CodeLlama-13b-Instruct-hf","quantization_config": quantization_config,  # 添加量化配置"do_train": True,"finetuning_type": "lora","lora_target": "q_proj,v_proj",# 其他參數保持不變...
    }
    

QLoRA的局限性

  1. 初始加載時間較長:量化模型需要額外時間加載和準備。
  2. 特定硬件依賴:需要GPU支持BF16或FP16計算(大多數現代GPU都支持)。
  3. 極端低精度可能影響性能:在某些任務上,4位量化可能略微降低模型表現,但通常影響較小。

總結

QLoRA是當前最先進的大模型微調技術之一,它通過量化預訓練權重+LoRA微調的組合,將百億級參數模型的微調門檻降低到消費級硬件水平。對于個人開發者或資源有限的團隊,QLoRA是實現低成本、高效率模型微調的理想選擇。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/84224.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/84224.shtml
英文地址,請注明出處:http://en.pswp.cn/web/84224.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【web應用】在 Vue 3 中實現餅圖:使用 Chart.js實現餅圖顯示數據分析結果

文章目錄 前言一、準備工作二、實現餅圖組件三、關鍵點解析四、實現效果總結 前言 在現代 Web 應用中,數據可視化是不可或缺的一部分。無論是展示統計信息還是監控關鍵指標,圖表都能幫助用戶更直觀地理解數據。在 Vue 3 項目中,我們可以使用…

分頁數據不準問題分析與解決

大綱 📖 1、場景 🪵2、原因 🔥3、解決方式:游標分頁 📏4、一點思考💡5、全表查詢的優化思路 🍅 記錄一個分頁不準的問題 1、場景 🪵 調用一個第三方List接口(帶分頁&am…

MyBatis原理剖析(三)--加載配置文件

下面我們正式進入mybatis的源碼學習,之前我們已經了解過mybatis中通過配置文件來保證與數據庫的交互。配置文件分為核心配置文件和映射配置文件,核心配置文件的主要作用就是加載數據庫的一些配置信息而映射配置文件則是執行對應的sql語句。同時核心配置文…

C++(運算符重載)

一.友元 C中使用關鍵字friend可以在類外訪問所有的成員,包括私有成員(之前提到過封裝的核心思想是隱藏內部實現細節,通過公共接口控制訪問),所以友元可以突破封裝的限制訪問數據,盲目使用會導致程序穩定性…

XR-RokidAR-UXR3.0-Draggable 腳本解析

using System.Collections.Generic; using Rokid.UXR.Utility; using UnityEngine; using UnityEngine.EventSystems;namespace Rokid.UXR.Interaction {/// <summary>/// Draggable 拖拽組件/// </summary>// [RequireComponent(typeof(RayInteractable))]public …

GitHub 趨勢日報 (2025年06月17日)

&#x1f4ca; 由 TrendForge 系統生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日報中的項目描述已自動翻譯為中文 &#x1f4c8; 今日獲星趨勢圖 今日獲星趨勢圖 1022 anthropic-cookbook 986 awesome-llm-apps 910 fluentui-system-icons 754 r…

NodeJS的中間件是什么

說簡單一點&#xff0c;中間件就是在你的請求和業務邏輯之間做一層攔截。 在 Node.js 中&#xff0c;中間件&#xff08;Middleware&#xff09; 是一種函數&#xff0c;它在 請求&#xff08;Request&#xff09;到達路由處理器之前&#xff0c;或在 響應&#xff08;Respons…

MCAL學習(6)——診斷、DCM

1.診斷概述 汽車診斷就是通過汽車總線&#xff08;CAN LIN Eth&#xff09;來進行診斷會話&#xff0c;大部分通過CAN總線通訊進行請求與響應。 1.診斷分層 DCM內部支持UDS服務和OBD服務&#xff08;排放&#xff0c;動力&#xff09;。 以統一診斷服務UDS為例&#xff0c;應…

kafka-生產者-(day-4)

day-3 BufferPool 產生原因&#xff1a;ByteBuffer的創建和釋放都是比較耗費資源的&#xff0c;為了實現內存的高效利用&#xff0c;產生了他。他會對特定大小的ByteBuffer進行管理 BufferPool的字段 free:是一個ArrayDeque隊列&#xff0c;緩存指定大小的ByteBuffer對象Re…

java 驗證ip是否可達

默認IP的設備已開放ping功能 代碼 public class PingTest {public static void main(String[] args) throws Exception {String ip "192.168.21.101";boolean reachable InetAddress.getByName(ip).isReachable(3000);System.out.println(ip (reachable ? &quo…

LeetCode 2187.完成旅途的最少時間

題目&#xff1a; 給你一個數組 time &#xff0c;其中 time[i] 表示第 i 輛公交車完成 一趟旅途 所需要花費的時間。 每輛公交車可以 連續 完成多趟旅途&#xff0c;也就是說&#xff0c;一輛公交車當前旅途完成后&#xff0c;可以 立馬開始 下一趟旅途。每輛公交車 獨立 運…

永磁同步電機無速度算法--基于正切函數鎖相環的滑模觀測器

最近在學習鎖相環&#xff0c;后續會記錄一下了解到的幾種PLL。 一、原理介紹 傳統鎖相環控制框圖如下所示 在電機正轉時&#xff0c;傳統鎖相環可以實現很好的轉速和轉子位置估計&#xff0c;但是當電機反轉&#xff0c;反電動勢符號發生變化&#xff0c;系統估計轉子位置最…

Vim-vimrc 快捷鍵映射

Vim-vimrc 快捷鍵映射 文章目錄 Vim-vimrc 快捷鍵映射Leader 鍵快捷鍵映射&#xff1a;插入特定字符插入 --插入 ##插入 解釋Leader鍵設置快速插入分隔線 Leader 鍵 我們還將 , 設置為 Leader 鍵&#xff0c;使得其他快捷鍵映射更加簡潔。 let mapleader ","快捷鍵…

SylixOS armv7 任務切換

SylixOS 操作系統下&#xff0c;任務切換可以分為兩種 中斷退出時&#xff0c;執行的任務切換&#xff08;_ScheduleInt&#xff09;內核退出時&#xff0c;執行的任務切換&#xff08;_Schedule&#xff09; 下面分別講講這兩種任務切換 1、中斷退出時任務切換 關于 ARM 架…

Java 自定義異常:如何優雅地處理程序中的“業務病”?

&#x1f525;「炎碼工坊」技術彈藥已裝填&#xff01; 點擊關注 → 解鎖工業級干貨【工具實測|項目避坑|源碼燃燒指南】 一、從一個真實場景開始&#xff1a;銀行轉賬系統的困境 假設你正在開發一個銀行轉賬系統&#xff0c;當用戶嘗試轉賬時可能出現以下問題&#xff1a; 轉…

【JAVA】【Stream流】

1. filter操作 filter()方法用于根據給定的條件過濾列表中的元素&#xff0c;僅保留滿足條件的項。 List<Integer> list Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8);List<Integer> res list.stream().filter(a -> a % 2 0).collect(Collectors.toList());for(I…

四、Redis實現限流

簡介&#xff1a; 限流算法在分布式領域是一個經常被提起的話題&#xff0c;當系統的處理能力有限時&#xff0c;如何阻止計劃外的請求繼續對系統施壓。 系統要限定用戶的某個行為在指定的時間里只能允許發生 N 次&#xff0c;如何使用 Redis 的數據結構來實現這個限流的功能&a…

基于Geotools的兩條道路相交并根據交點形成新路線實戰-以OSM數據為例

目錄 前言 一、需求場景及分解 1、需求場景 2、需求應用 二、需求實現 1、加載路網數據 2、獲取道路信息 3、相交點求解 4、生成新道路 5、結果可視化 三、總結 前言 在當今數字化迅速發展的時代&#xff0c;地理空間數據的處理與分析已成為眾多領域不可或缺的關鍵技…

goland有基礎速通(需要其它編程語言基礎)

tip: 無論是變量、方法還是struct的訪問權限控制都是通過命名控制的&#xff0c;命名的首字母是大寫就相當于java中的public&#xff0c;小寫的話就是private&#xff0c;&#xff08;private只有本包可以訪問&#xff09; 1 go的變量聲明 普通變量 特點&#xff1a; 變量類…

量化面試綠皮書:19. 相關系數

文中內容僅限技術學習與代碼實踐參考&#xff0c;市場存在不確定性&#xff0c;技術分析需謹慎驗證&#xff0c;不構成任何投資建議。 19. 相關系數 假設有三個隨機變量x、y和z。 x與y之間的相關系數為0.8&#xff0c;x與z之間的相關系數也是0.8。 Q: 那么y與z之間的最大相關…