Beaver是由北京大學PKU-Alignment團隊開發的高度模組化的開源RLHF框架。它旨在為對齊研究提供訓練資料和可重複的程式碼管道,特別是透過安全 RLHF 方法進行約束對齊 LLM 研究。
Beaver 的主要特點是:
2024/06/13
:我們很高興地宣布 PKU-SafeRLHF 資料集 1.0 版開源。該版本在最初的測試版基礎上進行了改進,納入了人類-人工智慧聯合註釋、擴大了危害類別的範圍,並引入了詳細的嚴重性等級標籤。有關更多詳細資訊和存取權限,請造訪我們的資料集頁面?擁抱臉部:PKU-Alignment/PKU-SafeRLHF。2024/01/16
:我們的方法Safe RLHF已被 ICLR 2024 Spotlight 接受。2023/10/19
:我們在 arXiv 上發布了Safe RLHF 論文,詳細介紹了我們新的安全對齊演算法及其實現。2023/07/10
:我們很高興地宣布Beaver-7B v1 / v2 / v3 模型的開源,作為 Safe RLHF 訓練系列的第一個里程碑,並輔以相應的獎勵模型v1 / v2 / v3 / 統一和成本模型v1/v2/v3/統一檢查點?擁抱臉。2023/07/10
:我們擴展了開源安全偏好資料集PKU-Alignment/PKU-SafeRLHF ,它現在包含超過 30 萬個範例。 (另請參閱 PKU-SafeRLHF-資料集部分)2023/07/05
:我們增強了對中文預訓練模型的支持,並納入了額外的開源中文資料集。 (另請參閱中文支援 (中文支援) 和自訂資料集 (自訂資料集) 部分)2023/05/15
:首次發佈 Safe RLHF 管線、評估結果和訓練程式碼。來自人類回饋的強化學習:透過偏好學習實現獎勵最大化
來自人類回饋的安全強化學習:透過偏好學習限制獎勵最大化
在哪裡
最終目標是找到一個模型
與其他支援 RLHF 的框架相比, safe-rlhf
是第一個支援從 SFT 到 RLHF 以及評估所有階段的框架。此外, safe-rlhf
是第一個在RLHF階段考慮安全偏好的架構。它為策略空間中的約束參數搜尋提供了更多的理論保證。
快速傅立葉變換 | 偏好模型1培訓 | RLHF | 安全RLHF | PTX 損失 | 評估 | 後端 | |
---|---|---|---|---|---|---|---|
海狸 (安全-RLHF) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | 深速 |
trlX | ✔️ | 2 | ✔️ | 加速/尼莫 | |||
深度快速聊天 | ✔️ | ✔️ | ✔️ | ✔️ | 深速 | ||
巨大的人工智慧 | ✔️ | ✔️ | ✔️ | ✔️ | 巨型人工智慧 | ||
羊駝農場 | 3 | ✔️ | ✔️ | ✔️ | 加速 |
PKU-SafeRLHF
資料集是一個人工標記的資料集,包含效能和安全偏好。它包括侮辱、不道德、犯罪、情緒傷害、隱私等十多個維度的約束。這些約束是為 RLHF 技術中的細粒度值調整而設計的。
為了方便多輪微調,我們將發布每輪的初始參數權重、所需資料集和訓練參數。這確保了科學和學術研究的可重複性。數據集將透過滾動更新逐步發布。
此資料集可在 Hugging Face 上找到:PKU-Alignment/PKU-SafeRLHF。
PKU-SafeRLHF-10K
是PKU-SafeRLHF
的子集,包含具有 10K 實例的第一輪 Safe RLHF 訓練數據,包括安全偏好。您可以在 Hugging Face 上找到它:PKU-Alignment/PKU-SafeRLHF-10K。
我們將逐步發布完整的 Safe-RLHF 資料集,其中包括100 萬對人類標記的有益和無害的偏好。
Beaver 是一個基於 LLaMA 的大型語言模型,使用safe-rlhf
進行訓練。它是在羊駝模型的基礎上發展起來的,透過收集人類關於有益和無害的偏好數據,並採用Safe RLHF技術進行訓練。在保持羊駝的有益性能的同時,海狸顯著提高了其無害性。
海狸被稱為“天然大壩工程師”,它們善於利用樹枝、灌木、岩石和土壤建造水壩和小木屋,創造適合其他生物棲息的濕地環境,使其成為生態系統中不可或缺的一部分。為了確保大型語言模型(LLM)的安全性和可靠性,同時容納不同人群的廣泛價值觀,北京大學團隊將他們的開源模型命名為“Beaver”,旨在通過約束價值為LLM築起一座堤壩。準(CVA)技術。該技術能夠對資訊進行細粒度標記,並與安全的強化學習方法相結合,顯著減少模型偏差和歧視,從而增強模型的安全性。類似於海狸在生態系統中的作用,Beaver模型將為大型語言模型的發展提供至關重要的支持,並為人工智慧技術的可持續發展做出積極貢獻。
遵循Vicuna模型的評估方法,我們利用GPT-4來評估Beaver。結果表明,與羊駝毛相比,海狸在與安全性相關的多個維度上都表現出顯著的改進。
在 Alpaca-7B 模型上使用 Safe RLHF 管道後,安全偏好的分佈發生了顯著變化。
從 GitHub 複製原始碼:
git clone https://github.com/PKU-Alignment/safe-rlhf.git
cd safe-rlhf
Native Runner:使用conda
/ mamba
設定 conda 環境:
conda env create --file conda-recipe.yaml # or `mamba env create --file conda-recipe.yaml`
這將自動設定所有依賴項。
Containerized Runner:除了使用有conda隔離的本機之外,您還可以使用docker映像來設定環境。
首先,請依照 NVIDIA Container Toolkit:安裝指南和 NVIDIA Docker:安裝指南來設定nvidia-docker
。然後你可以運行:
make docker-run
此命令將建置並啟動一個安裝有適當相依性的 docker 容器。主機路徑/
將對應到/host
,目前工作目錄將對應到容器內的/workspace
。
safe-rlhf
支援從監督微調 (SFT) 到偏好模型訓練再到 RLHF 對齊訓練的完整流程。
conda activate safe-rlhf
export WANDB_API_KEY= " ... " # your W&B API key here
或者
make docker-run
export WANDB_API_KEY= " ... " # your W&B API key here
bash scripts/sft.sh
--model_name_or_path < your-model-name-or-checkpoint-path >
--output_dir output/sft
注意:您可能需要根據您的機器設定更新腳本中的一些參數,例如用於訓練的 GPU 數量、訓練批次大小等。
bash scripts/reward-model.sh
--model_name_or_path output/sft
--output_dir output/rm
bash scripts/cost-model.sh
--model_name_or_path output/sft
--output_dir output/cm
bash scripts/ppo.sh
--actor_model_name_or_path output/sft
--reward_model_name_or_path output/rm
--output_dir output/ppo
bash scripts/ppo-lag.sh
--actor_model_name_or_path output/sft
--reward_model_name_or_path output/rm
--cost_model_name_or_path output/cm
--output_dir output/ppo-lag
使用 LLaMA-7B 運行整個管道的命令範例:
conda activate safe-rlhf
bash scripts/sft.sh --model_name_or_path ~ /models/llama-7b --output_dir output/sft
bash scripts/reward-model.sh --model_name_or_path output/sft --output_dir output/rm
bash scripts/cost-model.sh --model_name_or_path output/sft --output_dir output/cm
bash scripts/ppo-lag.sh
--actor_model_name_or_path output/sft
--reward_model_name_or_path output/rm
--cost_model_name_or_path output/cm
--output_dir output/ppo-lag
以上列出的所有訓練過程均在具有 8 個 NVIDIA A800-80GB GPU 的雲端伺服器上使用 LLaMA-7B 進行測試。
沒有足夠 GPU 記憶體資源的使用者可以啟用 DeepSpeed ZeRO-Offload 來緩解 GPU 記憶體使用峰值。
所有訓練腳本都可以透過額外的選項--offload
(預設為none
,即停用 ZeRO-Offload)來將張量(參數和/或最佳化器狀態)卸載到 CPU。例如:
bash scripts/sft.sh
--model_name_or_path ~ /models/llama-7b
--output_dir output/sft
--offload all # or `parameter` or `optimizer`
對於多節點設置,使用者可以參考 DeepSpeed:資源配置(多節點)文件以了解更多詳細資訊。以下是在 4 個節點(每個節點有 8 個 GPU)上開始訓練過程的範例:
# myhostfile
worker-1 slots=8
worker-2 slots=8
worker-3 slots=8
worker-4 slots=8
然後使用以下命令啟動訓練腳本:
bash scripts/sft.sh
--hostfile myhostfile
--model_name_or_path ~ /models/llama-7b
--output_dir output/sft
safe-rlhf
提供了一個抽象化來為所有監督微調、偏好模型訓練和 RL 訓練階段建立資料集。
class RawSample ( TypedDict , total = False ):
"""Raw sample type.
For SupervisedDataset, should provide (input, answer) or (dialogue).
For PreferenceDataset, should provide (input, answer, other_answer, better).
For SafetyPreferenceDataset, should provide (input, answer, other_answer, safer, is_safe, is_other_safe).
For PromptOnlyDataset, should provide (input).
"""
# Texts
input : NotRequired [ str ] # either `input` or `dialogue` should be provided
"""User input text."""
answer : NotRequired [ str ]
"""Assistant answer text."""
other_answer : NotRequired [ str ]
"""Other assistant answer text via resampling."""
dialogue : NotRequired [ list [ str ]] # either `input` or `dialogue` should be provided
"""Dialogue history."""
# Flags
better : NotRequired [ bool ]
"""Whether ``answer`` is better than ``other_answer``."""
safer : NotRequired [ bool ]
"""Whether ``answer`` is safer than ``other_answer``."""
is_safe : NotRequired [ bool ]
"""Whether ``answer`` is safe."""
is_other_safe : NotRequired [ bool ]
"""Whether ``other_answer`` is safe."""
以下是實作自訂資料集的範例(有關更多範例,請參閱 safe_rlhf/datasets/raw):
import argparse
from datasets import load_dataset
from safe_rlhf . datasets import RawDataset , RawSample , parse_dataset
class MyRawDataset ( RawDataset ):
NAME = 'my-dataset-name'
def __init__ ( self , path = None ) -> None :
# Load a dataset from Hugging Face
self . data = load_dataset ( path or 'my-organization/my-dataset' )[ 'train' ]
def __getitem__ ( self , index : int ) -> RawSample :
data = self . data [ index ]
# Construct a `RawSample` dictionary from your custom dataset item
return RawSample (
input = data [ 'col1' ],
answer = data [ 'col2' ],
other_answer = data [ 'col3' ],
better = float ( data [ 'col4' ]) > float ( data [ 'col5' ]),
...
)
def __len__ ( self ) -> int :
return len ( self . data ) # dataset size
def parse_arguments ():
parser = argparse . ArgumentParser (...)
parser . add_argument (
'--datasets' ,
type = parse_dataset ,
nargs = '+' ,
metavar = 'DATASET[:PROPORTION[:PATH]]' ,
)
...
return parser . parse_args ()
def main ():
args = parse_arguments ()
...
if __name__ == '__main__' :
main ()
然後您可以將此資料集傳遞給訓練腳本,如下所示:
python3 train.py --datasets my-dataset-name
您也可以傳遞具有可選附加資料集比例的多個資料集(以冒號:
分隔)。例如:
python3 train.py --datasets alpaca:0.75 my-dataset-name:0.5
這將使用隨機分割的 75% 的史丹佛羊駝資料集和 50% 的自訂資料集。
此外,如果您已經從 Hugging Face 複製了資料集儲存庫,則資料集參數後面還可以跟著本機路徑(用冒號:
分隔)。
git lfs install
git clone https://huggingface.co/datasets/my-organization/my-dataset ~ /path/to/my-dataset/repository
python3 train.py --datasets alpaca:0.75 my-dataset-name:0.5: ~ /path/to/my-dataset/repository
注意:必須在訓練腳本開始解析命令列參數之前匯入資料集類別。
python3 -m safe_rlhf.serve.cli --model_name_or_path output/sft # or output/ppo-lag
python3 -m safe_rlhf.serve.arena --red_corner_model_name_or_path output/sft --blue_corner_model_name_or_path output/ppo-lag
Safe-RLHF 管道不僅支援 LLaMA 模型系列,還支援其他預訓練模型,如 Baichuan、InternLM 等,為中文提供更好的支援。您只需在訓練和推理程式碼中更新預訓練模型的路徑即可。
Safe-RLHF 管道復健支援 LLaMA 系列模型,它也支援其他一些對中文支援更好的預訓練模型,例如 Baichuan 和 InternLM 等。
# SFT training
bash scripts/sft.sh --model_name_or_path baichuan-inc/Baichuan-7B --output_dir output/baichuan-sft
# Inference
python3 -m safe_rlhf.serve.cli --model_name_or_path output/baichuan-sft
同時,我們在原始資料集中新增了對中國資料集(例如 Firefly 和 MOSS 系列)的支援。只需要更改訓練程式碼中的資料集路徑,即可使用對應的資料集對中文預訓練模型進行微調:
同時,我們也在raw-datasets中增加了支援一些中文資料集,例如Firefly和MOSS系列等。
# scripts/sft.sh
- --train_datasets alpaca
+ --train_datasets firefly
有關如何新增自訂資料集的說明,請參閱自訂資料集部分。
關於如何新增自訂資料集的方法,請參閱章節自訂資料集(自訂資料集)。
scripts/arena-evaluation.sh
--red_corner_model_name_or_path output/sft
--blue_corner_model_name_or_path output/ppo-lag
--reward_model_name_or_path output/rm
--cost_model_name_or_path output/cm
--output_dir output/arena-evaluation
# Install BIG-bench
git clone https://github.com/google/BIG-bench.git
(
cd BIG-bench
python3 setup.py sdist
python3 -m pip install -e .
)
# BIG-bench evaluation
python3 -m safe_rlhf.evaluate.bigbench
--model_name_or_path output/ppo-lag
--task_name < BIG-bench-task-name >
# Install OpenAI Python API
pip3 install openai
export OPENAI_API_KEY= " ... " # your OpenAI API key here
# GPT-4 evaluation
python3 -m safe_rlhf.evaluate.gpt4
--red_corner_model_name_or_path output/sft
--blue_corner_model_name_or_path output/ppo-lag
如果您發現 Safe-RLHF 有用或在您的研究中使用 Safe-RLHF(模型、程式碼、資料集等),請考慮在您的出版物中引用以下工作。
@inproceedings { safe-rlhf ,
title = { Safe RLHF: Safe Reinforcement Learning from Human Feedback } ,
author = { Josef Dai and Xuehai Pan and Ruiyang Sun and Jiaming Ji and Xinbo Xu and Mickel Liu and Yizhou Wang and Yaodong Yang } ,
booktitle = { The Twelfth International Conference on Learning Representations } ,
year = { 2024 } ,
url = { https://openreview.net/forum?id=TyFrPOKYXw }
}
@inproceedings { beavertails ,
title = { BeaverTails: Towards Improved Safety Alignment of {LLM} via a Human-Preference Dataset } ,
author = { Jiaming Ji and Mickel Liu and Juntao Dai and Xuehai Pan and Chi Zhang and Ce Bian and Boyuan Chen and Ruiyang Sun and Yizhou Wang and Yaodong Yang } ,
booktitle = { Thirty-seventh Conference on Neural Information Processing Systems Datasets and Benchmarks Track } ,
year = { 2023 } ,
url = { https://openreview.net/forum?id=g0QovXbFw3 }
}
以下所有學生的貢獻均等,順序以字母順序決定:
全部由王一洲和楊耀東提供建議。致謝:感謝曲毅小姐設計的Beaver標誌。
該存儲庫受益於 LLaMA、Stanford Alpaca、DeepSpeed 和 DeepSpeed-Chat。感謝他們的精彩工作以及他們為實現法學碩士研究民主化所做的努力。 Safe-RLHF 及其相關資產是用愛來建構和開源的?
這項工作得到了北京大學的支持和資助。
Safe-RLHF 在 Apache License 2.0 下發布。