PEFT 文件

量化

Hugging Face's logo
加入 Hugging Face 社群

並獲得增強的文件體驗

開始使用

量化

量化是用更少的位元位表示資料,它是一種減少記憶體佔用和加速推理的有效技術,尤其是在處理大語言模型(LLM)時。有幾種量化模型的方法,包括:

  • 使用 AWQ 演算法最佳化要量化的模型權重
  • 使用 GPTQ 演算法獨立量化權重矩陣的每一行
  • 使用 bitsandbytes 庫量化到 8 位和 4 位精度
  • 使用 AQLM 演算法量化到低至 2 位精度

然而,模型量化後通常不會再為下游任務進行進一步訓練,因為較低精度的權重和啟用值可能導致訓練不穩定。但是,由於 PEFT 方法只增加了*額外*的可訓練引數,這使得您可以在量化模型之上使用 PEFT 介面卡進行訓練!將量化與 PEFT 相結合是單 GPU 上訓練即使是最大型模型的一個好策略。例如,QLoRA 是一種將模型量化到 4 位,然後用 LoRA 進行訓練的方法。這種方法允許您在單個 48GB GPU 上微調一個 65B 引數的模型!

在本指南中,您將瞭解如何將模型量化到 4 位並使用 LoRA 進行訓練。

量化模型

bitsandbytes 是一個與 Transformers 整合的量化庫。透過此整合,您可以將模型量化到 8 位或 4 位,並透過配置 BitsAndBytesConfig 類啟用許多其他選項。例如,您可以:

  • 設定 load_in_4bit=True 在載入模型時將其量化到 4 位
  • 設定 bnb_4bit_quant_type="nf4" 對從正態分佈初始化的權重使用特殊的 4 位資料型別
  • 設定 bnb_4bit_use_double_quant=True 使用巢狀量化方案對已量化的權重再次量化
  • 設定 bnb_4bit_compute_dtype=torch.bfloat16 使用 bfloat16 進行更快的計算
import torch
from transformers import BitsAndBytesConfig

config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_use_double_quant=True,
    bnb_4bit_compute_dtype=torch.bfloat16,
)

config 傳遞給 from_pretrained 方法。

from transformers import AutoModelForCausalLM

model = AutoModelForCausalLM.from_pretrained("mistralai/Mistral-7B-v0.1", quantization_config=config)

接下來,您應該呼叫 prepare_model_for_kbit_training() 函式來對量化模型進行預處理以進行訓練。

from peft import prepare_model_for_kbit_training

model = prepare_model_for_kbit_training(model)

既然量化模型已經準備就緒,讓我們來設定一個配置。

LoraConfig

使用以下引數(或選擇您自己的引數)建立一個 LoraConfig

from peft import LoraConfig

config = LoraConfig(
    r=16,
    lora_alpha=8,
    target_modules=["q_proj", "k_proj", "v_proj", "o_proj"],
    lora_dropout=0.05,
    bias="none",
    task_type="CAUSAL_LM"
)

然後使用 get_peft_model() 函式從量化模型和配置中建立一個 PeftModel

from peft import get_peft_model

model = get_peft_model(model, config)

您現在已經準備好使用任何您喜歡的訓練方法進行訓練了!

LoftQ 初始化

LoftQ 初始化 LoRA 權重以最小化量化誤差,並且可以在訓練量化模型時提高效能。要開始使用,請遵循這些說明

通常,為了讓 LoftQ 發揮最佳效果,建議用 LoRA 作用於儘可能多的層,因為那些未被作用的層無法應用 LoftQ。這意味著傳遞 `LoraConfig(..., target_modules="all-linear")` 最有可能獲得最佳結果。此外,當使用 4 位量化時,您應該在量化配置中使用 `nf4` 作為量化型別,即 `BitsAndBytesConfig(load_in_4bit=True, bnb_4bit_quant_type="nf4")`。

QLoRA 風格訓練

QLoRA 向 Transformer 架構中的所有線性層新增可訓練的權重。由於這些線性層的屬性名稱可能因架構而異,請將 `target_modules` 設定為 `"all-linear"` 以將 LoRA 新增到所有線性層。

config = LoraConfig(target_modules="all-linear", ...)

GPTQ 量化

您可以在 GPTQModel 和 Transformers 的 GPTQ 文件中瞭解更多關於基於 GPTQ 的 `[2, 3, 4, 8]` 位量化的資訊。量化後訓練,PEFT 可以同時使用 GPTQModelAutoGPTQ 庫,但我們推薦使用 GPTQModel,因為 AutoGPTQ 將在未來的版本中被棄用。

# gptqmodel install
pip install gptqmodel --no-build-isolation
from transformers import AutoModelForCausalLM, AutoTokenizer, GPTQConfig

model_id = "facebook/opt-125m"
tokenizer = AutoTokenizer.from_pretrained(model_id)

gptq_config = GPTQConfig(bits=4, group_size=128, dataset="wikitext2", tokenizer=tokenizer)

quantized_model = AutoModelForCausalLM.from_pretrained(model_id, device_map="auto", quantization_config=gptq_config)

# save quantized model
quantized_model.save_pretrained("./opt-125m-gptq")
tokenizer.save_pretrained("./opt-125m-gptq")

一旦量化完成,您就可以使用 PEFT API 對 GPTQ 模型進行後訓練。

AQLM 量化

語言模型加性量化(AQLM)是一種大語言模型壓縮方法。它將多個權重一起量化,並利用它們之間的相互依賴關係。AQLM 將 8-16 個權重組成的組表示為多個向量碼的和。這使得它能夠將模型壓縮到低至 2 位,同時精度損失相當低。

由於 AQLM 量化過程計算成本高昂,建議使用預量化模型。官方 aqlm 倉庫中可以找到部分可用模型的列表。

這些模型支援 LoRA 介面卡調優。要調優量化模型,您需要安裝 `aqlm` 推理庫:`pip install aqlm>=1.0.2`。微調後的 LoRA 介面卡應單獨儲存,因為無法將它們與 AQLM 量化的權重合並。

quantized_model = AutoModelForCausalLM.from_pretrained(
    "BlackSamorez/Mixtral-8x7b-AQLM-2Bit-1x16-hf-test-dispatch",
    torch_dtype="auto", device_map="auto", low_cpu_mem_usage=True,
)

peft_config = LoraConfig(...)

quantized_model = get_peft_model(quantized_model, peft_config)

您可以參考 Google Colab 示例,瞭解 AQLM+LoRA 微調的概覽。

EETQ 量化

您也可以在 EETQ 量化模型上執行 LoRA 微調。EETQ 包提供了一種簡單高效的方式來執行 8 位量化,據稱其速度比 `LLM.int8()` 演算法更快。首先,請確保您擁有與 EETQ 相容的 transformers 版本(例如,透過從最新的 pypi 或從原始碼安裝)。

import torch
from transformers import EetqConfig

config = EetqConfig("int8")

config 傳遞給 from_pretrained 方法。

from transformers import AutoModelForCausalLM

model = AutoModelForCausalLM.from_pretrained("mistralai/Mistral-7B-v0.1", quantization_config=config)

並建立一個 `LoraConfig` 並將其傳遞給 `get_peft_model`

from peft import LoraConfig, get_peft_model

config = LoraConfig(
    r=16,
    lora_alpha=8,
    target_modules=["q_proj", "k_proj", "v_proj", "o_proj"],
    lora_dropout=0.05,
    bias="none",
    task_type="CAUSAL_LM"
)

model = get_peft_model(model, config)

HQQ 量化

使用大型機器學習模型半二次量化(HQQ)量化的模型支援 LoRA 介面卡調優。要調優量化模型,您需要安裝 `hqq` 庫:`pip install hqq`。

from hqq.engine.hf import HQQModelForCausalLM

quantized_model = HQQModelForCausalLM.from_quantized(save_dir_or_hfhub, device='cuda')
peft_config = LoraConfig(...)
quantized_model = get_peft_model(quantized_model, peft_config)

或者使用與 HQQ 相容的 transformers 版本(例如,從最新的 pypi 或原始碼安裝)。

from transformers import HqqConfig, AutoModelForCausalLM

quant_config = HqqConfig(nbits=4, group_size=64)
quantized_model = AutoModelForCausalLM.from_pretrained(save_dir_or_hfhub, device_map=device_map, quantization_config=quant_config)
peft_config = LoraConfig(...)
quantized_model = get_peft_model(quantized_model, peft_config)

torchao (PyTorch 架構最佳化)

PEFT 支援使用 torchao(“ao”)進行 int8 量化的模型。

from peft import LoraConfig, get_peft_model
from transformers import AutoModelForCausalLM, TorchAoConfig

model_id = ...
quantization_config = TorchAoConfig(quant_type="int8_weight_only")
base_model = AutoModelForCausalLM.from_pretrained(model_id, quantization_config=quantization_config)
peft_config = LoraConfig(...)
model = get_peft_model(base_model, peft_config)

注意事項:

  • 請使用最新版本的 torchao(>= v0.4.0)和 transformers(> 4.42)。
  • 目前只支援線性層。
  • quant_type = "int4_weight_only" 目前不受支援。
  • NF4 尚未在 transformers 中實現,因此也不受支援。
  • DoRA 目前僅適用於 `quant_type = "int8_weight_only"`。
  • 當與 LoRA 一起使用時,torchao 獲得了明確的支援。然而,當 torchao 量化一個層時,它的類不會改變,只有底層張量的型別會改變。因此,除 LoRA 之外的 PEFT 方法通常也適用於 torchao,即使沒有明確支援。但請注意,**合併僅在 LoRA 和 `quant_type = "int8_weight_only"` 的情況下才能正確工作**。如果您使用不同的 PEFT 方法或 dtype,合併很可能會導致錯誤,即使沒有錯誤,結果仍然是不正確的。

INC 量化

英特爾神經壓縮器(INC)為各種裝置啟用模型量化,包括英特爾 Gaudi 加速器(也稱為 HPU 裝置)。您可以在使用 INC 量化的模型上執行 LoRA 微調。要在 PyTorch 模型中使用 INC,請安裝該庫:`pip install neural-compressor[pt]`。可以使用以下單步量化工作流將模型量化為 HPU 裝置的 FP8 精度。

import torch
from neural_compressor.torch.quantization import FP8Config, convert, finalize_calibration, prepare
quant_configs = {
    ...
}
config = FP8Config(**quant_configs)

將配置傳遞給 `prepare` 方法,執行推理以收集校準統計資訊,然後呼叫 `finalize_calibration` 和 `convert` 方法將模型量化到 FP8 精度。

model = prepare(model, config)
# Run inference to collect calibration statistics
...
# Finalize calibration and convert the model to FP8 precision
finalize_calibration(model)
model = convert(model)
# Load PEFT LoRA adapter as usual
...

一個展示瞭如何將 PEFT LoRA 介面卡載入到 INC 量化的 FLUX 文字到影像模型中以用於 HPU 裝置的示例已提供在此處

注意事項:

  • 目前 INC 量化模型不支援 `merge()` 和 `unmerge()` 方法。
  • 目前,在載入 PEFT 介面卡時僅支援 **線性(Linear)** INC 量化層。

其他支援的 PEFT 方法

除了 LoRA,以下 PEFT 方法也支援量化:

  • VeRA (支援 bitsandbytes 量化)
  • AdaLoRA (同時支援 bitsandbytes 和 GPTQ 量化)
  • (IA)³ (支援 bitsandbytes 量化)

後續步驟

如果您有興趣瞭解更多關於量化的資訊,以下內容可能會有幫助:

< > 在 GitHub 上更新

© . This site is unofficial and not affiliated with Hugging Face, Inc.