OpenChat: 利用混合质量数据推进开源语言模型
💻在线演示 | 🤗Huggingface | 📃论文 | 💭Discord
- OpenChat 是一个创新的开源语言模型库,使用C-RLFT进行微调 - 这是一种受离线强化学习启发的策略。
- 我们的模型从混合质量数据中学习,无需偏好标签,即使是
7B
模型也能在**消费级GPU(如RTX 3090)**上运行,达到与ChatGPT
相当的卓越性能。 - 尽管我们采用简单的方法,但我们致力于开发高性能、具有商业可行性的开源大型语言模型,并持续朝着这一愿景取得重大进展。
✨ 新闻
-
[2024/05/22] 我们发布了基于Llama-3的版本OpenChat 3.6 20240522,超越了官方Llama 3 8B Instruct和开源微调/合并版本。
-
[2024/01/06] 我们发布了第二次更新,OpenChat 3.5 0106,进一步提升了编码和整体性能 🏆。
-
[2023/12/10] 我们发布了第一次更新,OpenChat 3.5 1210,编码能力提升了15分 🚀。
-
[2023/11/01] 我们发布了OpenChat-3.5-7B模型,在多个基准测试上超越了ChatGPT 🔥。
-
[2023/09/21] 我们发布了论文OpenChat: 利用混合质量数据推进开源语言模型。
阅读更多
-
[2023/09/03] 我们发布了OpenChat V3.2 SUPER模型。
-
[2023/08/04] 我们推出了一个在线演示,展示最新版本OpenChat 3.2。
-
[2023/07/30] 我们很高兴推出OpenChat V3模型系列,基于Llama 2,现在可以免费用于商业用途!
-
[2023/07/07] 我们发布了OpenChat V2模型系列。
-
[2023/07/01] 我们发布了OpenChat V1模型系列。
🏷️ 基准测试 - OpenChat 3.6
复现基准测试
注意:请在此仓库的根目录运行以下命令。
python -m ochat.evaluation.run_eval --condition "GPT4 Correct" --model openchat/openchat-3.6-8b-20240522 --eval_sets fs_cothub/mmlu fs_cothub/gsm8k fs_cothub/math
python -m ochat.evaluation.run_eval --condition "GPT4" --model openchat/openchat-3.6-8b-20240522 --eval_sets zs/gpqa
HumanEval使用官方的EvalPlus仓库运行。
🏷️ 基准测试 - OpenChat 3.5
模型 | 参数量 | 平均分 | MT-Bench | HumanEval | BBH MC | AGIEval | TruthfulQA | MMLU | GSM8K | BBH CoT |
---|---|---|---|---|---|---|---|---|---|---|
OpenChat-3.5-0106 | 7B | 64.5 | 7.8 | 71.3 | 51.5 | 49.1 | 61.0 | 65.8 | 77.4 | 62.2 |
ChatGPT (3月)* | ???B | 61.5 | 7.94 | 48.1 | 47.6 | 47.1 | 57.7 | 67.3 | 74.9 | 70.1 |
OpenHermes 2.5 | 7B | 59.3 | 7.54 | 48.2 | 49.4 | 46.5 | 57.5 | 63.8 | 73.5 | 59.9 |
OpenOrca Mistral | 7B | 52.7 | 6.86 | 38.4 | 49.4 | 42.9 | 45.9 | 59.3 | 59.1 | 58.1 |
Zephyr-β^ | 7B | 34.6 | 7.34 | 22.0 | 40.6 | 39.0 | 40.8 | 39.8 | 5.1 | 16.0 |
Mistral | 7B | - | 6.84 | 30.5 | 39.0 | 38.0 | - | 60.1 | 52.2 | - |
开源SOTA** | 13B-70B | 61.4 | 7.71 | 73.2 | 49.7 | 41.7 | 62.3 | 63.7 | 82.3 | 41.4 |
WizardLM 70B | WizardCoder 34B | Orca 13B | Orca 13B | Platypus2 70B | WizardLM 70B | MetaMath 70B | Flan-T5 11B |
🔥 OpenChat-3.5-0106 (7B)现在在所有4个基准测试上都超过了Grok-0 (33B),并在平均分和3/4的基准测试上超过了Grok-1 (314B)。
许可证 | 参数量 | 平均分 | MMLU | HumanEval | MATH | GSM8k | |
---|---|---|---|---|---|---|---|
OpenChat-3.5-0106 | Apache-2.0 | 7B | 61.0 | 65.8 | 71.3 | 29.3 | 77.4 |
Grok-0 | 专有 | 33B | 44.5 | 65.7 | 39.7 | 15.7 | 56.8 |
Grok-1 | 专有 | 314B | 55.8 | 73 | 63.2 | 23.9 | 62.9 |
评估详情
*: ChatGPT (3月)的结果来自GPT-4技术报告、Chain-of-Thought Hub和我们的评估。^: Zephyr-β经常无法遵循少样本CoT指令,可能是因为它只用聊天数据对齐,而没有在少样本数据上训练。
**: Mistral和开源SOTA的结果取自指令微调模型论文和官方仓库报告的结果。
所有模型都在聊天模式下评估(即应用相应的对话模板)。所有零样本基准测试遵循AGIEval论文和Orca论文中的相同设置。CoT任务使用与Chain-of-Thought Hub相同的配置,HumanEval使用EvalPlus评估,MT-bench使用FastChat运行。要复现我们的结果,请按照以下说明操作。
复现基准测试
推理和编码:
注意:请在此仓库的根目录运行以下命令。
python -m ochat.evaluation.run_eval --condition "GPT4 Correct" --model openchat/openchat-3.5-0106 --eval_sets coding fs_cothub/bbh fs_cothub/mmlu zs/agieval zs/bbh_mc_orca zs/truthfulqa_orca
python ochat/evaluation/view_results.py
python ochat/evaluation/convert_to_evalplus.py
然后所有humaneval代码样本都放在ochat/evaluation/evalplus_codegen
中。使用以下命令,使用Docker作为沙箱来评估名为samples.jsonl
的单个代码样本。
docker run -v $(pwd):/app ganler/evalplus:latest --dataset humaneval --samples samples.jsonl
数学推理:
注意:请在此仓库的根目录运行以下命令。
python -m ochat.evaluation.run_eval --condition "Math Correct" --model openchat/openchat-3.5-0106 --eval_sets fs_cothub/gsm8k zs/math
python ochat/evaluation/view_results.py
MT-Bench:
请先启动本地API服务器,然后下载FastChat并运行以下命令。
注意:由于非零温度和GPT-4 API随时间的变化,结果可能会有所不同。
cd fastchat/llm_judge
python gen_api_answer.py --model openchat-3.5-0106 --max-tokens 4096 --parallel 128 --openai-api-base http://localhost:18888/v1
python gen_judgment.py --model-list openchat-3.5-0106 --parallel 8 --mode single
⬇️ 安装
pip
pip3 install ochat
[!重要] 如果你在使用pip时遇到包兼容性问题,可以尝试下面的conda方法或查看这个issue
conda
conda create -y --name openchat python=3.11
conda activate openchat
pip3 install ochat
Windows (WSL 1.x, Ubuntu-22.04)
sudo apt update
sudo apt install build-essential
sudo apt install -y curl
curl -o miniconda.sh https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
bash miniconda.sh
# 如果下面的conda命令不起作用,请重启WSL终端
conda create -y --name openchat python=3.11
conda activate openchat
pip3 install ochat
从源代码安装
克隆此仓库并以可编辑模式从源代码安装openchat
git clone https://github.com/imoneoi/openchat
cd openchat
pip3 install --upgrade pip # 启用PEP 660支持
pip3 install -e . # 可编辑模式,你可以在这个克隆的仓库中进行修改
🚀 部署API服务器
⚡ 我们的API服务器已经可以用于生产环境,并且兼容OpenAI API协议。它经过高度优化,使用vLLM可以动态批处理请求。
📎 注意:对于20系列或更老的不支持bfloat16
的GPU,在服务器参数中添加--dtype float16
。
当前支持的模型列表
模型类型 | 模型仓库 | 许可证 |
---|---|---|
openchat_3.6 | openchat/openchat-3.6-8b-20240522 | Llama 3 |
openchat_3.5 | openchat/openchat-3.5-0106 | Apache 2.0 |
单GPU (如RTX 3090, 4090)
python -m ochat.serving.openai_api_server --model MODEL_REPO
多GPU (张量并行)
# N是张量并行的GPU数量
python -m ochat.serving.openai_api_server --model MODEL_REPO --engine-use-ray --worker-use-ray --tensor-parallel-size N
使用 -h
查看更多设置
python -m ochat.serving.openai_api_server --model MODEL_REPO -h
部署为在线服务
如果你想将服务器部署为在线服务,可以使用 --api-keys sk-KEY1 sk-KEY2 ...
指定允许的API密钥,并使用 --disable-log-requests --disable-log-stats --log-file openchat.log
只将日志记录到文件中。出于安全考虑,我们建议在服务器前面使用HTTPS网关。
请求示例
启动后,服务器在 localhost:18888
监听请求,并兼容OpenAI ChatCompletion API规范。
💡 默认模式 (GPT4 Correct): 最适合编码、聊天和一般任务
curl http://localhost:18888/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "MODEL_TYPE",
"messages": [{"role": "user", "content": "你是一个名为OpenChat的大型语言模型。写一首诗来描述你自己"}]
}'
🧮 数学推理模式: 专为解决数学问题而设计
curl http://localhost:18888/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "MODEL_TYPE",
"condition": "Math Correct",
"messages": [{"role": "user", "content": "10.3 − 7988.8133 = "}]
}'
🌐 Web界面 - OpenChat-UI
启动API服务器后,OpenChat提供了一个易于交互的用户界面。点击此处查看Web界面
🤗 使用Transformers进行推理
[!警告] 建议使用我们优化过的API服务器进行部署。使用Transformers进行推理会更慢。
💡 默认模式 (GPT4 Correct): 最适合编码、聊天和一般任务
GPT4 Correct User: 你好<|end_of_turn|>GPT4 Correct Assistant: 你好<|end_of_turn|>GPT4 Correct User: 今天过得怎么样?<|end_of_turn|>GPT4 Correct Assistant:
🧮 数学推理模式: 专为解决数学问题而设计
Math Correct User: 10.3 − 7988.8133=<|end_of_turn|>Math Correct Assistant:
⚠️ 注意: 记得将<|end_of_turn|>
设置为生成结束标记。
默认(GPT4 Correct)模板也可以作为集成的tokenizer.chat_template
使用,可以用来替代手动指定模板。
🛠️ 训练
OpenChat训练系统使用无填充训练和Multipack Sampler,相比传统的填充训练达到了3~10倍的加速。
选择基础模型
OpenChat支持Llama 3和Mistral模型。请先选择一个适合你需求的基础模型。每个基础模型都有对应的权重仓库、模型类型和推荐的批量大小,如下所示,它们应该填入后面说明中的BASE_REPO
、MODEL_TYPE
和BATCH_SIZE
。
基础模型 | 大小 | 权重 (带EOT标记) | 模型类型 | 每GPU推荐批量大小 (8xA100 80GB) |
---|---|---|---|---|
Llama 3 | 8B | imone/Llama-3-8B-fixed-special-embedding | openchat_3.6 | 40960 |
Mistral | 7B | imone/Mistral_7B_with_EOT_token | openchat_v3.2_mistral | 77824 |
注意:OpenChat对话模板需要<|eot_id|>, <|start_header_id|>, <|end_header_id|>
(Llama 3) <|end_of_turn|>
(Mistral)特殊标记。指定的基础模型必须包含这些已初始化嵌入的标记。我们提供的权重是原始基础权重加上这些初始化嵌入的标记。如果你想手动添加它们,请使用scripts
目录中的init_special_embedding_llama3.py
或mistral_add_tokens.py
。
安装DeepSpeed和Flash Attention
首先,确保你的环境中可以使用CUDA nvcc
编译器。如果没有,请安装与PyTorch使用的版本匹配的CUDA工具包。
接下来,安装构建依赖:
pip install packaging ninja
最后,安装这些包:
pip install deepspeed flash-attn
准备你的数据
要使用OpenChat训练器,请将你的SFT数据准备成JSON Lines格式,其中每一行对应一个Conversation
对象:
class Message(BaseModel):
role: str # 必须是"user"或"assistant"
content: str # 消息内容
weight: Optional[float] = None # 此消息的损失权重。通常用户为0,助手为1,以仅监督助手的回复
class Conversation(BaseModel):
items: List[Message] # 对话中的所有消息
condition: str = "" # C-RLFT条件,可以是任何字符串或空
system: str = "" # 此对话的系统消息
对于基本的SFT,将人类消息的weight
设为0
,助手回复的设为1
。
SFT示例:
{"items":[{"role":"user","content":"你好","weight":0.0},{"role":"assistant","content":"你好","weight":1.0},{"role":"user","content":"今天过得怎么样?","weight":0.0},{"role":"assistant","content":"我很好。","weight":1.0}],"system":""}
{"items":[{"role":"user","content":"你是谁?","weight":0.0},{"role":"assistant","content":"我是OpenChat。","weight":1.0}],"system":"你是一个名为OpenChat的有帮助的助手。"}
对于C-RLFT,condition
应设置为对话所属的类(例如GPT3
或GPT4
)。weight
为人类消息设为0
,助手回复设为w
,其中w
是该类的权重(例如,根据我们的C-RLFT论文,GPT3
为0.1
,GPT4
为1
)。
C-RLFT示例:
{"items":[{"role":"user","content":"什么是C-RLFT?","weight":0.0},{"role":"assistant","content":"C-RLFT是一种使用混合质量数据改进开源LLM的方法。","weight":1.0}],"condition":"GPT4","system":""}
{"items":[{"role":"user","content":"什么是C-RLFT?","weight":0.0},{"role":"assistant","content":"我不知道。","weight":0.1}],"condition":"GPT3","system":""}
预先标记化数据集
然后你需要使用以下命令预先标记化数据集(请指定一个文件名作为PRETOKENIZED_DATA_OUTPUT_PATH
来存储预先标记化的数据集):
python -m ochat.data.generate_dataset --model-type MODEL_TYPE --model-path BASE_REPO --in-files data.jsonl --out-prefix PRETOKENIZED_DATA_OUTPUT_PATH
启动OpenChat训练器
现在您可以使用以下命令启动OpenChat训练器。
- 13B模型需要八张80GB显存的A/H100 GPU
- 7B模型可以用四张80GB显存的A/H100 GPU或八张40GB显存的A/H100 GPU进行训练。
对于超参数,我们建议首先将批量大小设置为推荐的批量大小。如果出现内存不足(OOM)的情况,请尝试将其设置为显存能容纳的最大值,并且是2048的倍数。 其他超参数已经被仔细选择为默认值。此外,学习率是根据反平方根规则自动确定的。
训练命令(点击展开)
NUM_GPUS=8
deepspeed --num_gpus=$NUM_GPUS --module ochat.training_deepspeed.train \
--model_path BASE_REPO \
--data_prefix PRETOKENIZED_DATA_OUTPUT_PATH \
--save_path PATH_TO_SAVE_MODEL \
--batch_max_len BATCH_SIZE \
--epochs 5 \
--save_every 1 \
--deepspeed \
--deepspeed_config ochat/training_deepspeed/deepspeed_config.json
您可以在PATH_TO_SAVE_MODEL中找到所有epoch的检查点。然后您可以评估每个epoch并选择最佳的一个。
局限性
基础模型的局限性:尽管OpenChat具有先进的功能,但它仍然受到其基础模型固有局限性的约束。这些局限性可能会影响模型在以下领域的表现:
- 复杂推理
- 数学和算术任务
- 编程和编码挑战
虚构不存在的信息:OpenChat有时可能会生成不存在或不准确的信息,也称为"幻觉"。用户应该意识到这种可能性,并验证从模型获得的任何关键信息。
安全性:OpenChat有时可能会生成有害、仇恨言论、带有偏见的回应,或回答不安全的问题。在需要安全和受监管回应的使用场景中,应用额外的AI安全措施至关重要。
许可证
代码以Apache License 2.0分发。
引用
@article{wang2023openchat,
title={OpenChat: Advancing Open-source Language Models with Mixed-Quality Data},
author={Wang, Guan and Cheng, Sijie and Zhan, Xianyuan and Li, Xiangang and Song, Sen and Liu, Yang},
journal={arXiv preprint arXiv:2309.11235},
year={2023}
}
💌联系方式
项目负责人:
- Guan Wang [imonenext at gmail dot com]
- Alpay Ariyak [aariyak at wpi dot edu]
主要贡献者:
- Xianyuan Zhan(清华大学)
- Qiying Yu(清华大学)
- Changling Liu(GPT Desk Pte. Ltd.)
- LDJ
- AutoMeta(Alignment Lab AI)
赞助商:
特别感谢: