大模型微調方法之QLoRA 原創
?本文介紹大模型微調方法中的QLoRA。
QLoRA由華盛頓大學UW NLP小組的成員于2023年提出發,旨在進一步降低微調大模型的微調成本,因為對于上百億參數量的模型,LoRA微調的成本還是很高。
感興趣的小伙伴可以去閱讀一下原文:https://arxiv.org/pdf/2305.14314
模型介紹

上圖為QLoRA的訓練過程圖,QLoRA更多的是在工程上進行了量化和優化,從圖中可知,主要有4個部分的改進:
- QLORA:是一種優化的4-bit量化數據類型,專為正態分布權重設計,通過結合低精度存儲和中等精度計算來提升模型性能。它使用4-bit存儲權重以減少內存使用,并在計算時將權重轉換為16-bit的BFloat16格式以保持準確性。這種方法適用于模型加載和訓練過程,旨在平衡存儲效率和計算精度。
- Double Quantization:是一種模型量化技術,它通過對已經量化過的常量進行二次量化,進一步減少存儲空間的需求。這種方法比傳統的模型量化方法更能節省顯存空間,每個參數平均可以節省0.37bit。例如,在65B的LLaMA模型中,這種雙量化技術能夠節省大約3GB的顯存空間。
- Paged Optimizers:是一種利用NVIDIA統一內存特性的優化技術,旨在解決GPU在處理過程中偶爾出現內存溢出(OOM)的問題。該技術通過自動在CPU和GPU之間進行分頁到分頁的數據傳輸,確保GPU處理過程無錯誤進行。其工作原理類似于CPU內存與磁盤之間的常規內存分頁機制。具體來說,Paged Optimizers為優化器狀態分配分頁內存,當GPU內存不足時,自動將優化器狀態卸載到CPU內存中;而在需要更新優化器狀態時,再將其加載回GPU內存。
- Adapter:為了彌補4-bit NormalFloat和Double Quantization帶來的性能損失,作者采用了插入更多adapter的方法。在LoRA中,通常只在query和value的全連接層處插入adapter。而在QLoRA中,作者在所有全連接層處都插入了adapter,以增加訓練參數并彌補由于精度降低而導致的性能損失。
Adapter實現
QLoRA的一個重要的改進和核心工作則是將量化的思想和LoRA的低秩適配器的思想結合到一起拿來對大模型進行微調,因此單獨拎出來說,實現的代碼如下:
if checkpoint_dir is not None:
print("Loading adapters from checkpoint.")
model = PeftModel.from_pretrained(model, join(checkpoint_dir, 'adapter_model'), is_trainable=True)
else:
print(f'adding LoRA modules...')
modules = find_all_linear_names(args, model)
config = LoraConfig(
r=args.lora_r,
lora_alpha=args.lora_alpha,
target_modules=modules,
lora_dropout=args.lora_dropout,
bias="none",
task_type="CAUSAL_LM",
)
model = get_peft_model(model, config)- ?
??find_all_linear_names???:找到所有的全連接層 - ?
??get_peft_model???:在所有全連接層中插入LoRA模塊
?
本文轉載自公眾號瓦力算法學研所,作者:喜歡瓦力的卷卷
?著作權歸作者所有,如需轉載,請注明出處,否則將追究法律責任
贊
收藏
回復
分享
微博
QQ
微信
舉報
回復
相關推薦

















