Beaver は、北京大学の PKU-Alignment チームによって開発された高度にモジュール化されたオープンソース RLHF フレームワークです。アライメント研究、特に安全な RLHF メソッドによる制約付きアライメント LLM 研究にトレーニング データと再現可能なコード パイプラインを提供することを目的としています。
Beaver の主な機能は次のとおりです。
2024/06/13
: PKU-SafeRLHF データセット バージョン 1.0 のオープンソース化を発表できることを嬉しく思います。このリリースは、人間と AI の共同注釈を組み込み、危害カテゴリの範囲を拡大し、詳細な重大度レベルのラベルを導入することにより、最初のベータ バージョンよりも進歩しています。詳細とアクセスについては、? のデータセット ページをご覧ください。ハグフェイス: PKU-Alignment/PKU-SafeRLHF。2024/01/16
:私たちの手法Safe RLHFが ICLR 2024 Spotlight に採択されました。2023/10/19
:新しいセーフ アライメント アルゴリズムとその実装について詳しく説明したSafe RLHF ペーパーをarXiv でリリースしました。2023/07/10
: Safe RLHF トレーニング シリーズの最初のマイルストーンとして、対応する報酬モデルv1 / v2 / v3 / 統合されたBeaver-7B v1 / v2 / v3 モデルのオープンソース化を発表できることを嬉しく思います。およびコスト モデルv1 / v2 / v3 / 統合チェックポイント?抱き合う顔。2023/07/10
:オープンソースの安全性優先データセットPKU-Alignment/PKU-SafeRLHFを拡張し、300,000 を超える例が含まれるようになりました。 (セクション「PKU-SafeRLHF-Dataset」も参照)2023/07/05
:中国語の事前トレーニング モデルのサポートを強化し、追加のオープンソースの中国語データセットを組み込みました。 (中国語サポート (中文サポート) およびカスタム データセット (自定义データセット) のセクションも参照してください)2023/05/15
: Safe RLHF パイプライン、評価結果、トレーニング コードの初リリース。人間のフィードバックからの強化学習: 嗜好学習による報酬の最大化
人間のフィードバックからの安全な強化学習: 嗜好学習による制約付き報酬の最大化
どこ
最終的な目標はモデルを見つけることです
RLHF をサポートする他のフレームワークと比較すると、 safe-rlhf
は SFT から RLHF、評価までのすべての段階をサポートする最初のフレームワークです。さらに、 safe-rlhf
RLHF 段階で安全性の優先順位を考慮した最初のフレームワークです。これは、ポリシー空間での制約付きパラメータ検索に対するより理論的な保証を保持します。
SFT | 優先モデル1 のトレーニング | RLHF | 安全なRLHF | PTX 損失 | 評価 | バックエンド | |
---|---|---|---|---|---|---|---|
ビーバー (セーフ-RLHF) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ディープスピード |
trlX | ✔️ | 2 | ✔️ | アクセラレート / ニモ | |||
ディープスピードチャット | ✔️ | ✔️ | ✔️ | ✔️ | ディープスピード | ||
巨大AI | ✔️ | ✔️ | ✔️ | ✔️ | 巨大AI | ||
アルパカファーム | 3 | ✔️ | ✔️ | ✔️ | 加速する |
PKU-SafeRLHF
データセットは、パフォーマンスと安全性の両方の好みを含む人間がラベル付けしたデータセットです。これには、侮辱、不道徳、犯罪、精神的危害、プライバシーなど、10 を超える側面の制約が含まれます。これらの制約は、RLHF テクノロジーにおけるきめ細かい値の調整のために設計されています。
マルチラウンドの微調整を容易にするために、各ラウンドの初期パラメーターの重み、必要なデータセット、トレーニング パラメーターをリリースします。これにより、科学的および学術的研究における再現性が保証されます。データセットはローリング アップデートを通じて段階的にリリースされます。
データセットは、Hugging Face: PKU-Alignment/PKU-SafeRLHF で入手できます。
PKU-SafeRLHF-10K
はPKU-SafeRLHF
のサブセットで、安全性設定を含む 10K インスタンスを含む Safe RLHF トレーニング データの第 1 ラウンドが含まれています。ハグフェイス: PKU-Alignment/PKU-SafeRLHF-10K で見つけることができます。
私たちは、完全な Safe-RLHF データセットを段階的にリリースする予定です。これには、役立つ好みと無害な好みの両方について人間がラベル付けした100 万個のペアが含まれます。
Beaver は LLaMA に基づく大規模な言語モデルであり、 safe-rlhf
使用してトレーニングされます。これは、有用性と無害性に関する人間の嗜好データを収集し、トレーニングに Safe RLHF 技術を採用することにより、Alpaca モデルの基礎に基づいて開発されています。アルパカの有益な性能を維持しながら、ビーバーはその無害性を大幅に向上させます。
ビーバーは「天然のダム技師」として知られており、枝、低木、岩、土を上手に使ってダムや小さな木造家屋を建設し、他の生き物が生息するのに適した湿地環境を作り出し、生態系に欠かせない存在となっています。 。大規模言語モデル (LLM) の安全性と信頼性を確保しながら、さまざまな集団にわたる幅広い価値観に対応するために、北京大学チームはオープンソース モデルを「Beaver」と名付け、制約された値を通じて LLM のダムを構築することを目指しています。アライメント(CVA)テクノロジー。このテクノロジーにより、情報のきめ細かいラベル付けが可能になり、安全な強化学習手法と組み合わせることで、モデルのバイアスと識別が大幅に低減され、それによってモデルの安全性が向上します。生態系におけるビーバーの役割と同様に、ビーバー モデルは大規模な言語モデルの開発に重要なサポートを提供し、人工知能技術の持続可能な発展に積極的に貢献します。
Vicuna モデルの評価方法に従って、GPT-4 を利用して Beaver を評価しました。結果は、アルパカと比較して、ビーバーが安全性に関する複数の側面で大幅な改善を示していることを示しています。
Alpaca-7B モデルで Safe RLHF パイプラインを利用した後、安全性優先のための大幅な分布の変更。
GitHub からソース コードのクローンを作成します。
git clone https://github.com/PKU-Alignment/safe-rlhf.git
cd safe-rlhf
ネイティブランナー: conda
/ mamba
を使用して conda 環境をセットアップします。
conda env create --file conda-recipe.yaml # or `mamba env create --file conda-recipe.yaml`
これにより、すべての依存関係が自動的にセットアップされます。
コンテナー化ランナー: 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
上記のすべてのトレーニング プロセスは、NVIDIA A800-80GB GPU を 8 基搭載したクラウド サーバー上の 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
これにより、Stanford Alpaca データセットの 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 シリーズなどの中国のデータセットのサポートを生データセットに追加しました。中国語の事前トレーニング モデルを微調整するために対応するデータセットを使用するには、トレーニング コード内のデータセット パスを変更するだけです。
同時に、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 }
}
以下のすべての生徒が平等に貢献し、順序はアルファベット順に決定されます。
すべては Yizhou Wang と Yaodong Yang によってアドバイスされました。謝辞: Beaver のロゴをデザインしてくれた Yi Qu さんに感謝します。
このリポジトリは、LLaMA、Stanford Alpaca、DeepSpeed、および DeepSpeed-Chat の恩恵を受けています。彼らの素晴らしい作品と、LLM 研究の民主化に向けた努力に感謝します。 Safe-RLHF とその関連資産は愛を持って構築され、オープンソース化されています ?❤️。
この研究は北京大学によって支援され、資金提供されています。
Safe-RLHF は、Apache License 2.0 に基づいてリリースされています。