openchat

openchat

采用混合质量数据训练的高性能开源语言模型

OpenChat是一个创新的开源语言模型库,采用C-RLFT策略从混合质量数据中学习。该模型在7B规模下实现了与ChatGPT相当的性能,无需偏好标签。项目致力于开发高性能、商用级的开源大语言模型,并持续进步。OpenChat支持多GPU部署,提供兼容OpenAI的API服务,适用于编码、聊天等多种任务。

OpenChat语言模型人工智能开源LlamaGithub开源项目

OpenChat: 利用混合质量数据推进开源语言模型

<div align="center"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/db161c0c-e3f8-4838-bd4e-a8c19ae09875.png" style="width: 65%"> </div> <p align="center"> <a href="https://openchat.team">💻在线演示</a> | <a href="https://huggingface.co/openchat">🤗Huggingface</a> | <a href="https://arxiv.org/pdf/2309.11235.pdf">📃论文</a> | <a href="https://discord.gg/pQjnXvNKHY">💭Discord</a> </p>
  • OpenChat 是一个创新的开源语言模型库,使用C-RLFT进行微调 - 这是一种受离线强化学习启发的策略。
  • 我们的模型从混合质量数据中学习,无需偏好标签,即使是7B模型也能在**消费级GPU(如RTX 3090)**上运行,达到与ChatGPT相当的卓越性能。
  • 尽管我们采用简单的方法,但我们致力于开发高性能、具有商业可行性的开源大型语言模型,并持续朝着这一愿景取得重大进展。

DOI

✨ 新闻

<details> <summary>阅读更多</summary> </details>

🏷️ 基准测试 - OpenChat 3.6

<div align="center"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/aebe912b-dffa-4dc8-96f0-5ecc6a3cadb7.svg" style="width: 95%;"> </div> <details> <summary>复现基准测试</summary>

注意:请在此仓库的根目录运行以下命令。

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仓库运行。

</details>

🏷️ 基准测试 - OpenChat 3.5

模型参数量平均分MT-BenchHumanEvalBBH MCAGIEvalTruthfulQAMMLUGSM8KBBH CoT
OpenChat-3.5-01067B64.57.871.351.549.161.065.877.462.2
ChatGPT (3月)*???B61.57.9448.147.647.157.767.374.970.1
OpenHermes 2.57B59.37.5448.249.446.557.563.873.559.9
OpenOrca Mistral7B52.76.8638.449.442.945.959.359.158.1
Zephyr-β^7B34.67.3422.040.639.040.839.85.116.0
Mistral7B-6.8430.539.038.0-60.152.2-
开源SOTA**13B-70B61.47.7173.249.741.762.363.782.341.4
WizardLM 70BWizardCoder 34BOrca 13BOrca 13BPlatypus2 70BWizardLM 70BMetaMath 70BFlan-T5 11B

🔥 OpenChat-3.5-0106 (7B)现在在所有4个基准测试上都超过了Grok-0 (33B),并在平均分和3/4的基准测试上超过了Grok-1 (314B)。

许可证参数量平均分MMLUHumanEvalMATHGSM8k
OpenChat-3.5-0106Apache-2.07B61.065.871.329.377.4
Grok-0专有33B44.565.739.715.756.8
Grok-1专有314B55.87363.223.962.9
<details> <summary>评估详情</summary> *: ChatGPT (3月)的结果来自GPT-4技术报告、Chain-of-Thought Hub和我们的评估。

^: Zephyr-β经常无法遵循少样本CoT指令,可能是因为它只用聊天数据对齐,而没有在少样本数据上训练。

**: Mistral和开源SOTA的结果取自指令微调模型论文和官方仓库报告的结果。

所有模型都在聊天模式下评估(即应用相应的对话模板)。所有零样本基准测试遵循AGIEval论文和Orca论文中的相同设置。CoT任务使用与Chain-of-Thought Hub相同的配置,HumanEval使用EvalPlus评估,MT-bench使用FastChat运行。要复现我们的结果,请按照以下说明操作。

</details> <details> <summary>复现基准测试</summary>

推理和编码:

注意:请在此仓库的根目录运行以下命令。

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
</details>

⬇️ 安装

[!注意] 需要安装pytorchCUDA来运行OpenChat

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

从源代码安装

<details> <summary>克隆此仓库并以可编辑模式从源代码安装openchat</summary>
git clone https://github.com/imoneoi/openchat cd openchat pip3 install --upgrade pip # 启用PEP 660支持 pip3 install -e . # 可编辑模式,你可以在这个克隆的仓库中进行修改
</details>

🚀 部署API服务器

⚡ 我们的API服务器已经可以用于生产环境,并且兼容OpenAI API协议。它经过高度优化,使用vLLM可以动态批处理请求。

📎 注意:对于20系列或更老的不支持bfloat16的GPU,在服务器参数中添加--dtype float16

当前支持的模型列表

模型类型模型仓库许可证
openchat_3.6openchat/openchat-3.6-8b-20240522Llama 3
openchat_3.5openchat/openchat-3.5-0106Apache 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
<details> <summary>部署为在线服务</summary>

如果你想将服务器部署为在线服务,可以使用 --api-keys sk-KEY1 sk-KEY2 ... 指定允许的API密钥,并使用 --disable-log-requests --disable-log-stats --log-file openchat.log 只将日志记录到文件中。出于安全考虑,我们建议在服务器前面使用HTTPS网关

</details>

请求示例

启动后,服务器在 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 = "}] }'

<a id="web-ui"></a> 🌐 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使用,可以用来替代手动指定模板。

<a id="training"></a> 🛠️ 训练

OpenChat训练系统使用无填充训练和Multipack Sampler,相比传统的填充训练达到了3~10倍的加速。

选择基础模型

OpenChat支持Llama 3和Mistral模型。请先选择一个适合你需求的基础模型。每个基础模型都有对应的权重仓库、模型类型和推荐的批量大小,如下所示,它们应该填入后面说明中的BASE_REPOMODEL_TYPEBATCH_SIZE

基础模型大小权重 (带EOT标记)模型类型每GPU推荐批量大小 (8xA100 80GB)
Llama 38Bimone/Llama-3-8B-fixed-special-embeddingopenchat_3.640960
Mistral7Bimone/Mistral_7B_with_EOT_tokenopenchat_v3.2_mistral77824

注意:OpenChat对话模板需要<|eot_id|>, <|start_header_id|>, <|end_header_id|> (Llama 3) <|end_of_turn|> (Mistral)特殊标记。指定的基础模型必须包含这些已初始化嵌入的标记。我们提供的权重是原始基础权重加上这些初始化嵌入的标记。如果你想手动添加它们,请使用scripts目录中的init_special_embedding_llama3.pymistral_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应设置为对话所属的类(例如GPT3GPT4)。weight为人类消息设为0,助手回复设为w,其中w是该类的权重(例如,根据我们的C-RLFT论文,GPT30.1,GPT41)。

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的倍数。 其他超参数已经被仔细选择为默认值。此外,学习率是根据反平方根规则自动确定的。

<details> <summary>训练命令(点击展开)</summary>
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
</details>

您可以在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)

赞助商:

特别感谢:

编辑推荐精选

Trae

Trae

字节跳动发布的AI编程神器IDE

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

热门AI工具生产力协作转型TraeAI IDE
问小白

问小白

全能AI智能助手,随时解答生活与工作的多样问题

问小白,由元石科技研发的AI智能助手,快速准确地解答各种生活和工作问题,包括但不限于搜索、规划和社交互动,帮助用户在日常生活中提高效率,轻松管理个人事务。

聊天机器人AI助手热门AI工具AI对话
Transly

Transly

实时语音翻译/同声传译工具

Transly是一个多场景的AI大语言模型驱动的同声传译、专业翻译助手,它拥有超精准的音频识别翻译能力,几乎零延迟的使用体验和支持多国语言可以让你带它走遍全球,无论你是留学生、商务人士、韩剧美剧爱好者,还是出国游玩、多国会议、跨国追星等等,都可以满足你所有需要同传的场景需求,线上线下通用,扫除语言障碍,让全世界的语言交流不再有国界。

讯飞智文

讯飞智文

一键生成PPT和Word,让学习生活更轻松

讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。

热门AI工具AI办公办公工具讯飞智文AI在线生成PPTAI撰写助手多语种文档生成AI自动配图
讯飞星火

讯飞星火

深度推理能力全新升级,全面对标OpenAI o1

科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。

模型训练热门AI工具内容创作智能问答AI开发讯飞星火大模型多语种支持智慧生活
Spark-TTS

Spark-TTS

一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型

Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。

咔片PPT

咔片PPT

AI助力,做PPT更简单!

咔片是一款轻量化在线演示设计工具,借助 AI 技术,实现从内容生成到智能设计的一站式 PPT 制作服务。支持多种文档格式导入生成 PPT,提供海量模板、智能美化、素材替换等功能,适用于销售、教师、学生等各类人群,能高效制作出高品质 PPT,满足不同场景演示需求。

讯飞绘文

讯飞绘文

选题、配图、成文,一站式创作,让内容运营更高效

讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。

AI助手热门AI工具AI创作AI辅助写作讯飞绘文内容运营个性化文章多平台分发
材料星

材料星

专业的AI公文写作平台,公文写作神器

AI 材料星,专业的 AI 公文写作辅助平台,为体制内工作人员提供高效的公文写作解决方案。拥有海量公文文库、9 大核心 AI 功能,支持 30 + 文稿类型生成,助力快速完成领导讲话、工作总结、述职报告等材料,提升办公效率,是体制打工人的得力写作神器。

openai-agents-python

openai-agents-python

OpenAI Agents SDK,助力开发者便捷使用 OpenAI 相关功能。

openai-agents-python 是 OpenAI 推出的一款强大 Python SDK,它为开发者提供了与 OpenAI 模型交互的高效工具,支持工具调用、结果处理、追踪等功能,涵盖多种应用场景,如研究助手、财务研究等,能显著提升开发效率,让开发者更轻松地利用 OpenAI 的技术优势。

下拉加载更多