TRL 文件

使用 peft 和 trl 透過低秩自適應(LoRA)微調 8 位模型的示例

Hugging Face's logo
加入 Hugging Face 社群

並獲得增強的文件體驗

開始使用

使用 peft 和 trl 透過低秩自適應(LoRA)微調 8 位模型的示例

此示例中的 notebook 和指令碼展示瞭如何使用低秩自適應(LoRA)以記憶體高效的方式微調模型。peft 庫支援大多數 PEFT 方法,但請注意,某些 PEFT 方法(如 Prompt tuning)不受支援。有關 LoRA 的更多資訊,請參閱原始論文

以下是 trl 倉庫中啟用了 peft 的 notebook 和指令碼的概述

檔案 任務 描述
stack_llama/rl_training.py RLHF 使用學習的獎勵模型和 peft 對 70 億引數的 LLaMA 模型進行分散式微調。
stack_llama/reward_modeling.py 獎勵模型 使用 peft 對 70 億引數的 LLaMA 獎勵模型進行分散式訓練。
stack_llama/supervised_finetuning.py SFT 使用 peft 對 70 億引數的 LLaMA 模型進行分散式指令/監督微調。

安裝

注意:peft 正在積極開發中,因此我們直接從它們的 Github 頁面安裝。Peft 還依賴於最新版本的 transformers。

pip install trl[peft]
pip install bitsandbytes loralib
pip install git+https://github.com/huggingface/transformers.git@main
#optional: wandb
pip install wandb

注意:如果你不想使用 wandb 記錄日誌,請在指令碼/notebook 中移除 log_with="wandb"。你也可以將其替換為accelerate 支援的你喜歡的實驗追蹤器。

如何使用?

只需在你的指令碼中宣告一個 PeftConfig 物件,並將其傳遞給 .from_pretrained 來載入 TRL+PEFT 模型。

from peft import LoraConfig
from trl import AutoModelForCausalLMWithValueHead

model_id = "edbeeching/gpt-neo-125M-imdb"
lora_config = LoraConfig(
    r=16,
    lora_alpha=32,
    lora_dropout=0.05,
    bias="none",
    task_type="CAUSAL_LM",
)

model = AutoModelForCausalLMWithValueHead.from_pretrained(
    model_id, 
    peft_config=lora_config,
)

如果你想以 8 位精度載入模型

pretrained_model = AutoModelForCausalLMWithValueHead.from_pretrained(
    config.model_name, 
    load_in_8bit=True,
    peft_config=lora_config,
)

… 或以 4 位精度

pretrained_model = AutoModelForCausalLMWithValueHead.from_pretrained(
    config.model_name, 
    peft_config=lora_config,
    load_in_4bit=True,
)

啟動指令碼

trl 庫由 accelerate 提供支援。因此,最好使用以下命令來配置和啟動訓練

accelerate config # will prompt you to define the training configuration
accelerate launch examples/scripts/ppo.py --use_peft # launch`es training

使用 trl + peft 和資料並行

只要你能將訓練過程放入單個裝置中,就可以擴充套件到任意數量的 GPU。唯一需要應用的調整是按如下方式載入模型

from peft import LoraConfig
...

lora_config = LoraConfig(
    r=16,
    lora_alpha=32,
    lora_dropout=0.05,
    bias="none",
    task_type="CAUSAL_LM",
)

pretrained_model = AutoModelForCausalLMWithValueHead.from_pretrained(
    config.model_name, 
    peft_config=lora_config,
)

如果你想以 8 位精度載入模型

pretrained_model = AutoModelForCausalLMWithValueHead.from_pretrained(
    config.model_name, 
    peft_config=lora_config,
    load_in_8bit=True,
)

… 或以 4 位精度

pretrained_model = AutoModelForCausalLMWithValueHead.from_pretrained(
    config.model_name, 
    peft_config=lora_config,
    load_in_4bit=True,
)

最後,確保獎勵也在正確的裝置上計算,為此你可以使用 ppo_trainer.model.current_device

針對大型模型(>60B 引數)的樸素流水線並行(NPP)

trl 庫也支援針對大型模型(>60B 引數)的樸素流水線並行(NPP)。這是一種在多個 GPU 之間並行化模型的簡單方法。這種被稱為“樸素流水線並行”(NPP)的正規化是一種在多個 GPU 上並行化模型的簡單方法。我們在多個 GPU 上載入模型和介面卡,啟用和梯度將會在 GPU 之間進行簡單的通訊。這也支援 int8 模型以及其他 dtype 模型。

如何使用 NPP?

只需在 from_pretrained 中使用自定義的 device_map 引數載入模型,即可將模型分佈在多個裝置上。請檢視這篇很棒的教程,瞭解如何為你的模型正確建立 device_map

另外,請確保 lm_head 模組在第一個 GPU 裝置上,否則可能會丟擲錯誤。在撰寫本文時,你需要安裝 acceleratemain 分支:pip install git+https://github.com/huggingface/accelerate.git@mainpeftpip install git+https://github.com/huggingface/peft.git@main

啟動指令碼

雖然 trl 庫由 accelerate 提供支援,但你應該在單個程序中執行你的訓練指令碼。請注意,我們目前還不支援資料並行與 NPP 同時使用。

python PATH_TO_SCRIPT

微調 Llama-2 模型

你可以使用 SFTTrainer 和官方指令碼輕鬆微調 Llama2 模型!例如,要在 Guanaco 資料集上微調 llama2-7b,請執行(在單個 NVIDIA T4-16GB 上測試過)

python trl/scripts/sft.py --output_dir sft_openassistant-guanaco  --model_name meta-llama/Llama-2-7b-hf --dataset_name timdettmers/openassistant-guanaco --load_in_4bit --use_peft --per_device_train_batch_size 4 --gradient_accumulation_steps 2
< > 在 GitHub 上更新

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