主頁 >  其他 > 大模型微調技術LoRA與QLoRA

大模型微調技術LoRA與QLoRA

2023-06-27 08:11:54 其他

LoRA: Low-Rank Adaptation of Large Language Models

動機

大模型的引數量都在100B級別,由于算力的吃緊,在這個基礎上進行所有引數的微調變得不可能,LoRA正是在這個背景下提出的解決方案,

原理

雖然模型的引數眾多,但其實模型主要依賴低秩維度的內容(low intrinsic dimension),由此引出低秩自適應方法lora,通過低秩分解來模擬引數的改變數,從而以極小的引數量來實作大模型的間接訓練,

LoRA的思想也很簡單,在原始PLM旁邊增加一個旁路,做一個降維再升維的操作,來模擬所謂的 intrinsic rank ,

訓練的時候固定PLM的引數,只訓練降維矩陣A與升維矩陣B,而模型的輸入輸出維度不變,輸出時將BA與PLM的引數疊加,

用隨機高斯分布初始化A,用0矩陣初始化B,保證訓練的開始此旁路矩陣依然是0矩陣,

這種思想有點類似于殘差連接,同時使用這個旁路的更新來模擬full finetuning的程序,并且,full finetuning可以被看做是LoRA的特例(當r等于k時)

 LoRA詳細程序

  • 在原模型旁邊增加一個旁路,通過低秩分解(先降維再升維)來模擬引數的更新量;
  • 訓練時,原模型固定,只訓練降維矩陣A和升維矩陣B;
  • 推理時,可將BA加到原引數上,不引入額外的推理延遲;
  • 初始化,A采用高斯分布初始化,B初始化為全0,保證訓練開始時旁路為0矩陣;
  • 可插拔式的切換任務,當前任務W0+B1A1,將lora部分減掉,換成B2A2,即可實作任務切換;
  • 秩的選取:對于一般的任務,rank=1,2,4,8足矣,而對于一些領域差距比較大的任務可能需要更大的rank,

總的來說,lora就是凍結預先訓練的模型權重,并將可訓練的秩分解矩陣注入Transformer架構的每一層,

目前對于大多數實驗只在 Wq 和 Wv使用LoRA,可訓練引數的數量由秩r和原始權值的形狀決定,

 代碼

原始碼:https://github.com/microsoft/LoRA

LoRALayer層

class LoRALayer():
    def __init__(
        self, 
        r: int, 
        lora_alpha: int, 
        lora_dropout: float,
        merge_weights: bool,
    ):
        self.r = r
        self.lora_alpha = lora_alpha
        # Optional dropout
        if lora_dropout > 0.:
            self.lora_dropout = nn.Dropout(p=lora_dropout)
        else:
            self.lora_dropout = lambda x: x
        # Mark the weight as unmerged
        self.merged = False
        self.merge_weights = merge_weights

Linear層

class Linear(nn.Linear, LoRALayer):
    # LoRA implemented in a dense layer
    def __init__(
        self, 
        in_features: int, 
        out_features: int, 
        r: int = 0, 
        lora_alpha: int = 1, 
        lora_dropout: float = 0.,
        fan_in_fan_out: bool = False, # Set this to True if the layer to replace stores weight like (fan_in, fan_out)
        merge_weights: bool = True,
        **kwargs
    ):
        nn.Linear.__init__(self, in_features, out_features, **kwargs)
        LoRALayer.__init__(self, r=r, lora_alpha=lora_alpha, lora_dropout=lora_dropout,
                           merge_weights=merge_weights)

        self.fan_in_fan_out = fan_in_fan_out
        # Actual trainable parameters
        if r > 0:
            self.lora_A = nn.Parameter(self.weight.new_zeros((r, in_features)))
            self.lora_B = nn.Parameter(self.weight.new_zeros((out_features, r)))
            self.scaling = self.lora_alpha / self.r
            # Freezing the pre-trained weight matrix
            self.weight.requires_grad = False
        self.reset_parameters()
        if fan_in_fan_out:
            self.weight.data = self.weight.data.transpose(0, 1)

    def reset_parameters(self):
        nn.Linear.reset_parameters(self)
        if hasattr(self, 'lora_A'):
            # initialize A the same way as the default for nn.Linear and B to zero
            nn.init.kaiming_uniform_(self.lora_A, a=math.sqrt(5))
            nn.init.zeros_(self.lora_B)

    def train(self, mode: bool = True):
        def T(w):
            return w.transpose(0, 1) if self.fan_in_fan_out else w
        nn.Linear.train(self, mode)
        if mode:
            if self.merge_weights and self.merged:
                # Make sure that the weights are not merged
                if self.r > 0:
                    self.weight.data -= T(self.lora_B @ self.lora_A) * self.scaling
                self.merged = False
        else:
            if self.merge_weights and not self.merged:
                # Merge the weights and mark it
                if self.r > 0:
                    self.weight.data += T(self.lora_B @ self.lora_A) * self.scaling
                self.merged = True       

    def forward(self, x: torch.Tensor):
        def T(w):
            return w.transpose(0, 1) if self.fan_in_fan_out else w
        if self.r > 0 and not self.merged:
            result = F.linear(x, T(self.weight), bias=self.bias)
            if self.r > 0:
                result += (self.lora_dropout(x) @ self.lora_A.transpose(0, 1) @ self.lora_B.transpose(0, 1)) * self.scaling
            return result
        else:
            return F.linear(x, T(self.weight), bias=self.bias)

Peft實作

from peft import LoraConfig, get_peft_model, prepare_model_for_int8_training, TaskType

# Define LoRA Config
lora_config = LoraConfig(
 r=16,
 lora_alpha=32,
 target_modules=["q", "v"],
 lora_dropout=0.05,
 bias="none",
 task_type=TaskType.SEQ_2_SEQ_LM
)
# prepare int-8 model for training
model = prepare_model_for_int8_training(model)

# add LoRA adaptor
model = get_peft_model(model, lora_config)
model.print_trainable_parameters()

# trainable params: 18874368 || all params: 11154206720 || trainable%: 0.16921300163961817

 參考鏈接:

https://zhuanlan.zhihu.com/p/631077870

https://zhuanlan.zhihu.com/p/636759194

https://zhuanlan.zhihu.com/p/514033873

QLoRA:Efficient Finetuning of Quantized LLMs

動機

微調非常大的模型的成本過高;對650億引數的LLaMA模型進行進行16位微調需要超過780GB的GPU記憶體,QLORA使用一種新的高精度技術將預訓練模型量化為int4,然后添加一小組可學習的低秩配接器權重,它是通過量化權重反向傳播梯度來調整的,QLORA將65B引數模型進行微調的平均記憶體需求從 >780GB 的 GPU 記憶體減少到 <48GB,而不會降低運行時間或預測性能,這標志著LLM微調可訪問性的顯著轉變:現在最大的公開可用的模型,迄今為止在單個GPU上進行微調,

創新

首先分析下LoRA微調中的痛點

  1. 引數空間小:LoRA中參與訓練的引數量較少,解空間較小,效果相比全量微調有一定的差距,

  2. 微調大模型成本高:對于上百億引數量的模型,LoRA微調的成本還是很高,

  3. 精度損失:針對第二點,可以采用int8或int4量化,進一步對模型基座的引數進行壓縮,但是又會引發精度損失的問題,降低模型性能,

今天的主角QLoRA優點

  1. 4-bit NormalFloat:提出一種理論最優的4-bit的量化資料型別,優于當前普遍使用的FP4與Int4,對于正態分布權重而言,一種資訊理論上最優的新資料型別,該資料型別對正態分布資料產生比 4 bit整數和 4bit 浮點數更好的實證結果,QLORA包含一種低精度存盤資料型別(通常為4-bit)和一種計算資料型別(通常為BFloat16),在實踐中,QLORA權重張量使用時,需要將將張量去量化為BFloat16,然后在16位計算精度下進行矩陣乘法運算,模型本身用4bit加載,訓練時把數值反量化到bf16后進行訓練,

  2. Double Quantization:對第一次量化后的那些常量再進行一次量化,減少存盤空間,相比于當前的模型量化方法,更加節省顯存空間,每個引數平均節省0.37bit,對于65B的LLaMA模型,大約能節省3GB顯存空間,

  3. Paged Optimizers:使用NVIDIA統一記憶體特性,該特性可以在在GPU偶爾OOM的情況下,進行CPU和GPU之間自動分頁到分頁的傳輸,以實作無錯誤的 GPU 處理,該功能的作業方式類似于 CPU 記憶體和磁盤之間的常規記憶體分頁,使用此功能為優化器狀態(Optimizer)分配分頁記憶體,然后在 GPU 記憶體不足時將其自動卸載到 CPU 記憶體,并在優化器更新步驟需要時將其加載回 GPU 記憶體,

  4. 增加Adapter:4-bit的NormalFloat與Double Quantization,節省了很多空間,但帶來了性能損失,作者通過插入更多adapter來彌補這種性能損失,在LoRA中,一般會選擇在query和value的全連接層處插入adapter,而QLoRA則在所有全連接層處都插入了adapter,增加了訓練引數,彌補精度帶來的性能損失,

 

參考:

https://zhuanlan.zhihu.com/p/632164305

https://zhuanlan.zhihu.com/p/636215898

https://zhuanlan.zhihu.com/p/634256206

https://zhuanlan.zhihu.com/p/632229856

https://blog.csdn.net/qq_39970492/article/details/131048994

總結

 QLORA 可以使用 4 位基礎模型和低秩配接器 (LoRA) 復制 16 位完全微調性能,QLORA將微調65B引數模型的平均記憶體需求從>780GB的GPU記憶體降低到<48GB,與完全微調的16位基準相比,既不降低運行時間也不降低預測性能,這意味著可以在單個GPU上微調迄今為止最大的公開可用模型,

 

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/556037.html

標籤:其他

上一篇:人人都能生成火爆全網的最不像二維碼的二維碼

下一篇:返回列表

標籤雲
其他(161658) Python(38254) JavaScript(25514) Java(18265) C(15238) 區塊鏈(8273) C#(7972) AI(7469) 爪哇(7425) MySQL(7269) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5875) 数组(5741) R(5409) Linux(5347) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4606) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2437) ASP.NET(2404) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1985) HtmlCss(1972) 功能(1967) Web開發(1951) C++(1942) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1881) .NETCore(1863) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 大模型微調技術LoRA與QLoRA

    LoRA: Low-Rank Adaptation of Large Language Models 動機 大模型的引數量都在100B級別,由于算力的吃緊,在這個基礎上進行所有引數的微調變得不可能。LoRA正是在這個背景下提出的解決方案。 原理 雖然模型的引數眾多,但其實模型主要依賴低秩維度的內容( ......

    uj5u.com 2023-06-27 08:11:54 more
  • 人人都能生成火爆全網的最不像二維碼的二維碼

    最近有人展示了使用 Stable Diffusion 創建的藝術二維碼。這些二維碼是使用定制訓練的 ControlNet模型生成的。 但是操作門檻有點高。 你需要 GPU,還需要學習如何使用 Stable Diffusion。 現在有一款非常無腦的產品,使用這個產品來創建藝術二維碼,**最大的門檻就 ......

    uj5u.com 2023-06-27 08:11:18 more
  • 如何創建Windows 10 虛擬機

    一 ,新建Windows 10 虛擬機 1.1 創建新的虛擬機 1,點擊創建新的虛擬機 2,選擇典型,點擊下一步 3,選擇稍后安裝作業系統,點擊下一步。 4,作業系統選擇windwos,版本選著Windows10 x64,點擊下一步 5,可以選擇想要給虛擬機的命名,位置選擇想要放置的盤符位置,點擊下 ......

    uj5u.com 2023-06-27 08:10:03 more
  • 云原生周刊:HashiCorp Vault 1.14 發布 | 2023.6.26

    ## 開源專案推薦 ### [Helmfile](https://github.com/helmfile/helmfile) Helmfile 是一個開源工具,使用 Helm charts 簡化復雜應用程式的部署。它提供了一種宣告性的方式來定義 Kubernetes 資源的期望狀態,并管理 Helm ......

    uj5u.com 2023-06-27 08:09:29 more
  • 什么是算力網路

    什么是算力網路?

    是一種根據業務需求,在云、網、邊之間按需分配和靈活調度計算資源、存盤資源以及網路資源的新型資訊基礎設施。“算力網路“是“以網路為中心”的多種融合資源供給網路計算模型,將“新計算”(云計算、邊緣計算、泛在計算)的算力,通過“新聯接”(無處不在的網路)整合起來,實作算力的靈活按需使用... ......

    uj5u.com 2023-06-27 08:09:22 more
  • 新建虛擬機

    # 虛擬機環境配置 ## 一、安裝作業系統win10 ### 1、新建虛擬機。 ![image-20230626100550022](https://img2023.cnblogs.com/blog/3227164/202306/3227164-20230626154945307-196757279 ......

    uj5u.com 2023-06-27 08:07:27 more
  • 磐舟磐基平臺:基于KubeEdge的落地實踐

    摘要:實作統一管理、簡化多集群的運維系統、減少運營成本;同時也成功將前面提到的500臺鯤鵬服務器以及它上面的BC Linux for Euler集群納入磐基PaaS平臺的大家庭之中,運維效率大幅增加。 本文分享自華為云社區《中國移動:磐舟磐基平臺 基于KubeEdge的落地實踐》,作者:中國移動磐舟 ......

    uj5u.com 2023-06-27 08:01:03 more
  • Serverless函式計算介紹

    隨著互聯網和移動互聯網的快速發展,越來越多的應用程式需要具備高可用性、高擴展性和高性能等特點。而云計算作為一種新興的計算模型,可以幫助開發者更快速、更高效地開發和部署應用程式。Serverless函式計算作為云計算的一種重要形式,正在逐漸成為云計算的主流模型。 ......

    uj5u.com 2023-06-27 08:00:24 more
  • 量化投資中的擇時研究

    在進行量化投資策略的研究時,我們通常會基于不同的原則來進行分類,其中包括:根據均線進行擇時、根據估值進行擇時、以及根據策略回撤進行擇時。

    這三種策略各有特點,也各自適用于不同的市場環境和投資風格。例如,根據均線擇時的策略主要關注價格趨勢,以確定最佳的買入和賣出時機;根據估值擇時則主要基于公司的基本... ......

    uj5u.com 2023-06-27 07:58:53 more
  • 如何成為10x倍工程師

    10倍效率 +10x 的工程師很難找,但是 -10x 工程師是存在的。 所謂 -10x 工程師,就是每周要浪費團隊 400 個小時的工程師。 他有以下特征: 1. 創造無效的繁忙作業,比如演示文稿、圖表、工單管理,以及毫無意義的流程。 2. 鼓勵工程師追求優雅而不是實用主義。確保沒有人有權做出任何決 ......

    uj5u.com 2023-06-27 07:57:45 more