## File: README.md [**🇨🇳中文**](https://github.com/shibing624/MedicalGPT/blob/main/README.md) | [**🌐English**](https://github.com/shibing624/MedicalGPT/blob/main/README_EN.md) | [**📖文档/Docs**](https://github.com/shibing624/MedicalGPT/wiki) | [**🤖模型/Models**](https://huggingface.co/shibing624) ----------------- # MedicalGPT: Training Medical GPT Model [](https://huggingface.co/shibing624) [](https://star-history.com/#shibing624/MedicalGPT&Timeline) [](CONTRIBUTING.md) [](LICENSE) [](requirements.txt) [](https://github.com/shibing624/MedicalGPT/issues) [](#Contact) ## 📖 Introduction **MedicalGPT** training medical GPT model with ChatGPT training pipeline, implemantation of Pretraining, Supervised Finetuning, RLHF(Reward Modeling and Reinforcement Learning), DPO(Direct Preference Optimization) and standalone OPD(On-Policy Distillation). **MedicalGPT** 训练医疗大模型,实现了包括增量预训练、有监督微调、RLHF(奖励建模、强化学习训练)、DPO(直接偏好优化) 和独立OPD(On-Policy Distillation)。 - RLHF training pipeline来自Andrej Karpathy的演讲PDF [State of GPT](https://karpathy.ai/stateofgpt.pdf),视频 [Video](https://build.microsoft.com/en-US/sessions/db3f4859-cd30-4445-a0cd-553c3304f8e2) - DPO方法来自论文[Direct Preference Optimization:Your Language Model is Secretly a Reward Model](https://arxiv.org/pdf/2305.18290.pdf) - ORPO方法来自论文[ORPO: Monolithic Preference Optimization without Reference Model](https://arxiv.org/abs/2403.07691) ## 🔥 News [2026/04/20] v2.7版本:支持了 **OPD(On-Policy Distillation)** 蒸馏训练,新增独立 `training/opd_training.py` 训练入口、`scripts/run_opd.sh` 启动脚本,并补充了OPD参数与使用文档,详见[Release-v2.7](https://github.com/shibing624/MedicalGPT/releases/tag/2.7.0) [2026/04/09] v2.6版本:支持了 **[Agent工具调用/Function Call]** 模型微调训练,新增了支持不同模型的工具数据格式转换和解析代码。并在 `data` 目录下补充了 `toolcall` 数据样例。详见[Release-v2.6](https://github.com/shibing624/MedicalGPT/releases/tag/2.6.0) [2026/04/07] v2.5版本:支持了 **[Qwen3.5](https://huggingface.co/collections/Qwen/qwen35)** 系列模型(包括Base、Instruct和MoE变体),PT/SFT/DPO/ORPO/GRPO全流程适配,新增`qwen3`、`qwen3_5`、`qwen3_nothink`、`qwen3_5_nothink`对话模板,支持DeepSpeed ZeRO-3 MoE训练,详见[Release-v2.5](https://github.com/shibing624/MedicalGPT/releases/tag/2.5.0) [2025/04/18] v2.4版本:支持了LoRA和全参的 **[GRPO](https://arxiv.org/pdf/2402.03300)** 训练方法,GRPO通过纯RL方法可以体验`aha moment`,详见[Release-v2.4](https://github.com/shibing624/MedicalGPT/releases/tag/2.4.0) [2024/09/21] v2.3版本:支持了 **[Qwen-2.5](https://qwenlm.github.io/zh/blog/qwen2.5/)** 系列模型,详见[Release-v2.3](https://github.com/shibing624/MedicalGPT/releases/tag/2.3.0) [2024/08/02] v2.2版本:支持了角色扮演模型训练,新增了医患对话SFT数据生成脚本[role_play_data](https://github.com/shibing624/MedicalGPT/blob/main/role_play_data/README.md),支持OpenAI、豆包、[MiniMax](https://platform.minimaxi.com/)等多种LLM Provider,详见[Release-v2.2](https://github.com/shibing624/MedicalGPT/releases/tag/2.2.0) 展开日志 [2024/06/11] v2.1版本:支持了 **[Qwen-2](https://qwenlm.github.io/blog/qwen2/)** 系列模型,详见[Release-v2.1](https://github.com/shibing624/MedicalGPT/releases/tag/2.1.0) [2024/04/24] v2.0版本:支持了 **[Llama-3](https://huggingface.co/meta-llama)** 系列模型,详见[Release-v2.0](https://github.com/shibing624/MedicalGPT/releases/tag/2.0.0) [2024/04/17] v1.9版本:支持了 **[ORPO](https://arxiv.org/abs/2403.07691)**,详细用法请参照 `scripts/run_orpo.sh`。详见[Release-v1.9](https://github.com/shibing624/MedicalGPT/releases/tag/1.9.0) [2024/01/26] v1.8版本:支持微调Mixtral混合专家MoE模型 **[Mixtral 8x7B](https://huggingface.co/mistralai/Mixtral-8x7B-v0.1)**。详见[Release-v1.8](https://github.com/shibing624/MedicalGPT/releases/tag/1.8.0) [2024/01/14] v1.7版本:新增检索增强生成(RAG)的基于文件问答[ChatPDF](https://github.com/shibing624/ChatPDF)功能,代码`demo/chatpdf.py`,可以基于微调后的LLM结合知识库文件问答提升行业问答准确率。详见[Release-v1.7](https://github.com/shibing624/MedicalGPT/releases/tag/1.7.0) [2023/10/23] v1.6版本:新增RoPE插值来扩展GPT模型的上下文长度;针对LLaMA模型支持了[FlashAttention-2](https://github.com/Dao-AILab/flash-attention)和[LongLoRA](https://github.com/dvlab-research/LongLoRA) 提出的 **$S^2$-Attn**;支持了[NEFTune](https://github.com/neelsjain/NEFTune)给embedding加噪训练方法。详见[Release-v1.6](https://github.com/shibing624/MedicalGPT/releases/tag/1.6.0) [2023/08/28] v1.5版本: 新增[DPO(直接偏好优化)](https://arxiv.org/pdf/2305.18290.pdf)方法,DPO通过直接优化语言模型来实现对其行为的精确控制,可以有效学习到人类偏好。详见[Release-v1.5](https://github.com/shibing624/MedicalGPT/releases/tag/1.5.0) [2023/08/08] v1.4版本: 发布基于ShareGPT4数据集微调的中英文Vicuna-13B模型[shibing624/vicuna-baichuan-13b-chat](https://huggingface.co/shibing624/vicuna-baichuan-13b-chat),和对应的LoRA模型[shibing624/vicuna-baichuan-13b-chat-lora](https://huggingface.co/shibing624/vicuna-baichuan-13b-chat-lora),详见[Release-v1.4](https://github.com/shibing624/MedicalGPT/releases/tag/1.4.0) [2023/08/02] v1.3版本: 新增LLaMA, LLaMA2, Bloom, ChatGLM, ChatGLM2, Baichuan模型的多轮对话微调训练;新增领域词表扩充功能;新增中文预训练数据集和中文ShareGPT微调训练集,详见[Release-v1.3](https://github.com/shibing624/MedicalGPT/releases/tag/1.3.0) [2023/07/13] v1.1版本: 发布中文医疗LLaMA-13B模型[shibing624/ziya-llama-13b-medical-merged](https://huggingface.co/shibing624/ziya-llama-13b-medical-merged),基于Ziya-LLaMA-13B-v1模型,SFT微调了一版医疗模型,医疗问答效果有提升,发布微调后的完整模型权重,详见[Release-v1.1](https://github.com/shibing624/MedicalGPT/releases/tag/1.1) [2023/06/15] v1.0版本: 发布中文医疗LoRA模型[shibing624/ziya-llama-13b-medical-lora](https://huggingface.co/shibing624/ziya-llama-13b-medical-lora),基于Ziya-LLaMA-13B-v1模型,SFT微调了一版医疗模型,医疗问答效果有提升,发布微调后的LoRA权重,详见[Release-v1.0](https://github.com/shibing624/MedicalGPT/releases/tag/1.0.0) [2023/06/05] v0.2版本: 以医疗为例,训练领域大模型,实现了四阶段训练:包括二次预训练、有监督微调、奖励建模、强化学习训练。详见[Release-v0.2](https://github.com/shibing624/MedicalGPT/releases/tag/0.2.0) ## 😊 Features 基于ChatGPT Training Pipeline,本项目实现了领域模型--医疗行业语言大模型的训练: - 第一阶段:PT(Continue PreTraining)增量预训练,在海量领域文档数据上二次预训练GPT模型,以适应领域数据分布(可选) - 第二阶段:SFT(Supervised Fine-tuning)有监督微调,构造指令微调数据集,在预训练模型基础上做指令精调,以对齐指令意图,并注入领域知识 - 第三阶段 - RLHF(Reinforcement Learning from Human Feedback)基于人类反馈对语言模型进行强化学习,分为两步: - RM(Reward Model)奖励模型建模,构造人类偏好排序数据集,训练奖励模型,用来建模人类偏好,主要是"HHH"原则,具体是"helpful, honest, harmless" - RL(Reinforcement Learning)强化学习,用奖励模型来训练SFT模型,生成模型使用奖励或惩罚来更新其策略,以便生成更高质量、更符合人类偏好的文本 - [DPO(Direct Preference Optimization)](https://arxiv.org/pdf/2305.18290.pdf)直接偏好优化方法,DPO通过直接优化语言模型来实现对其行为的精确控制,而无需使用复杂的强化学习,也可以有效学习到人类偏好,DPO相较于RLHF更容易实现且易于训练,效果更好 - [ORPO](https://arxiv.org/abs/2403.07691)比值比偏好优化,不需要参考模型(ref_model)的优化方法,通过ORPO,LLM可以同时学习SFT和对齐,将两个过程整合为单一步骤,缓解模型灾难性遗忘问题 - OPD(On-Policy Distillation)独立蒸馏训练,使用更强的teacher模型对student在自身rollout轨迹上的输出分布进行监督,首版不和PPO/GRPO联训,训练产物可以像SFT一样独立部署 ### Release Models | Model | Base Model | Introduction | |:------------------------------------------------------------------------------------------------------------------|:----------------------------------------------------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | [shibing624/ziya-llama-13b-medical-lora](https://huggingface.co/shibing624/ziya-llama-13b-medical-lora) | [IDEA-CCNL/Ziya-LLaMA-13B-v1](https://huggingface.co/IDEA-CCNL/Ziya-LLaMA-13B-v1) | 在240万条中英文医疗数据集[shibing624/medical](https://huggingface.co/datasets/shibing624/medical)上SFT微调了一版Ziya-LLaMA-13B模型,医疗问答效果有提升,发布微调后的LoRA权重(单轮对话) | | [shibing624/ziya-llama-13b-medical-merged](https://huggingface.co/shibing624/ziya-llama-13b-medical-merged) | [IDEA-CCNL/Ziya-LLaMA-13B-v1](https://huggingface.co/IDEA-CCNL/Ziya-LLaMA-13B-v1) | 在240万条中英文医疗数据集[shibing624/medical](https://huggingface.co/datasets/shibing624/medical)上SFT微调了一版Ziya-LLaMA-13B模型,医疗问答效果有提升,发布微调后的完整模型权重(单轮对话) | | [shibing624/vicuna-baichuan-13b-chat-lora](https://huggingface.co/shibing624/vicuna-baichuan-13b-chat-lora) | [baichuan-inc/Baichuan-13B-Chat](https://huggingface.co/baichuan-inc/Baichuan-13B-Chat) | 在10万条多语言ShareGPT GPT4多轮对话数据集[shibing624/sharegpt_gpt4](https://huggingface.co/datasets/shibing624/sharegpt_gpt4) 和 医疗数据集[shibing624/medical](https://huggingface.co/datasets/shibing624/medical) 上SFT微调了一版baichuan-13b-chat多轮问答模型,日常问答和医疗问答效果有提升,发布微调后的LoRA权重 | | [shibing624/vicuna-baichuan-13b-chat](https://huggingface.co/shibing624/vicuna-baichuan-13b-chat) | [baichuan-inc/Baichuan-13B-Chat](https://huggingface.co/baichuan-inc/Baichuan-13B-Chat) | 在10万条多语言ShareGPT GPT4多轮对话数据集[shibing624/sharegpt_gpt4](https://huggingface.co/datasets/shibing624/sharegpt_gpt4) 和 医疗数据集[shibing624/medical](https://huggingface.co/datasets/shibing624/medical) 上SFT微调了一版baichuan-13b-chat多轮问答模型,日常问答和医疗问答效果有提升,发布微调后的完整模型权重 | | [shibing624/llama-3-8b-instruct-262k-chinese](https://huggingface.co/shibing624/llama-3-8b-instruct-262k-chinese) | [Llama-3-8B-Instruct-262k](https://huggingface.co/gradientai/Llama-3-8B-Instruct-262k) | 在2万条中英文偏好数据集[shibing624/DPO-En-Zh-20k-Preference](https://huggingface.co/datasets/shibing624/DPO-En-Zh-20k-Preference)上使用ORPO方法微调得到的超长文本多轮对话模型,适用于RAG、多轮对话 | 演示[shibing624/vicuna-baichuan-13b-chat](https://huggingface.co/shibing624/vicuna-baichuan-13b-chat)模型效果: 具体case见[Inference Examples](#inference-examples) ## ▶️ Demo 我们提供了一个简洁的基于gradio的交互式web界面,启动服务后,可通过浏览器访问,输入问题,模型会返回答案。 启动服务,命令如下: ```shell CUDA_VISIBLE_DEVICES=0 python demo/gradio_demo.py --base_model path_to_llama_hf_dir --lora_model path_to_lora_dir ``` 参数说明: - `--base_model {base_model}`:存放HF格式的LLaMA模型权重和配置文件的目录,也可使用HF Model Hub模型调用名称 - `--lora_model {lora_model}`:LoRA文件所在目录,也可使用HF Model Hub模型调用名称。若lora权重已经合并到预训练模型,则删除--lora_model参数 - `--tokenizer_path {tokenizer_path}`:存放对应tokenizer的目录。若不提供此参数,则其默认值与--base_model相同 - `--template_name`:模板名称,如`vicuna`、`alpaca`等。若不提供此参数,则其默认值是vicuna - `--only_cpu`: 仅使用CPU进行推理 - `--resize_emb`:是否调整embedding大小,若不调整,则使用预训练模型的embedding大小,默认不调整 ## 💾 Install #### Updating the requirements `requirements.txt`会不时更新以适配最新功能,使用以下命令更新依赖: ```markdown git clone https://github.com/shibing624/MedicalGPT cd MedicalGPT pip install -r requirements.txt --upgrade ``` #### Hardware Requirement (显存/VRAM) \* *估算值* | 训练方法 | 精度 | 7B | 13B | 30B | 70B | 110B | 8x7B | 8x22B | |-------|-------------| ----- | ----- | ----- | ------ | ------ | ----- | ------ | | 全参数 | AMP(自动混合精度) | 120GB | 240GB | 600GB | 1200GB | 2000GB | 900GB | 2400GB | | 全参数 | 16 | 60GB | 120GB | 300GB | 600GB | 900GB | 400GB | 1200GB | | LoRA | 16 | 16GB | 32GB | 64GB | 160GB | 240GB | 120GB | 320GB | | QLoRA | 8 | 10GB | 20GB | 40GB | 80GB | 140GB | 60GB | 160GB | | QLoRA | 4 | 6GB | 12GB | 24GB | 48GB | 72GB | 30GB | 96GB | | QLoRA | 2 | 4GB | 8GB | 16GB | 24GB | 48GB | 18GB | 48GB | ## 📁 Project Structure ``` MedicalGPT/ ├── training/ # 核心训练脚本(训练主线) │ ├── template.py # 对话模板定义 │ ├── tool_utils.py # Agent工具调用格式化工具 │ ├── pretraining.py # Stage 1: 增量预训练(PT) │ ├── supervised_finetuning.py # Stage 2: 有监督微调(SFT, 支持Agent) │ ├── opd_training.py # Stage 2.5: 独立OPD蒸馏 │ ├── reward_modeling.py # Stage 3: 奖励模型(RM) │ ├── ppo_training.py # Stage 3: 强化学习(PPO/RLOO) │ ├── dpo_training.py # Stage 3: 直接偏好优化(DPO, 支持Agent) │ ├── orpo_training.py # Stage 3: ORPO │ └── grpo_training.py # Stage 3: GRPO │ ├── scripts/ # 一键运行脚本 + DeepSpeed配置 │ ├── run_pt.sh / run_sft.sh / run_dpo.sh / ... │ └── zero1.json / zero2.json / zero3.json │ ├── demo/ # 推理、部署、应用示例 │ ├── inference.py / gradio_demo.py / fastapi_server_demo.py │ ├── openai_api.py / chatpdf.py │ └── inference_multigpu_demo.py │ ├── tools/ # 模型合并、量化、数据处理工具 │ ├── merge_peft_adapter.py / merge_tokenizers.py │ ├── model_quant.py / eval_quantize.py │ └── convert_dataset.py / validate_jsonl.py │ ├── notebooks/ # Colab 教程 Notebook │ ├── run_training_dpo_pipeline.ipynb │ └── run_training_ppo_pipeline.ipynb │ ├── data/ # 训练数据 │ ├── sft/ # SFT数据(含普通问答和Tool Call) │ └── reward/ # DPO/RM偏好数据(含普通偏好和Tool Call偏好) ├── docs/ # 文档 └── tests/ # 测试 ``` | 目录 | 说明 | 适用人群 | |------|------|---------| | `training/` | 核心训练代码,覆盖PT→SFT→RM→PPO/DPO/ORPO/GRPO全流程 | 训练模型 | | `scripts/` | 一键运行脚本和DeepSpeed配置,复制即用 | 快速上手训练 | | `demo/` | 推理、Gradio UI、FastAPI服务、RAG问答等示例 | 想部署和体验模型 | | `tools/` | LoRA合并、量化、词表扩充、数据格式转换等工具 | 需要模型后处理 | | `notebooks/` | Colab一键运行的端到端教程 | 零基础快速体验 | > 所有脚本均从**项目根目录**运行,例如:`bash scripts/run_sft.sh` ## 🚀 Training Pipeline Training Stage: | Stage | Introduction | Python script | Shell script | |:-------------------------------|:-------------|:-----------------------------------------------------------------------------------------------------------------|:---------------------------------------------------------------------------------------| | Continue Pretraining | 增量预训练 | [pretraining.py](https://github.com/shibing624/MedicalGPT/blob/main/training/pretraining.py) | [run_pt.sh](https://github.com/shibing624/MedicalGPT/blob/main/scripts/run_pt.sh) | | Supervised Fine-tuning | 有监督微调 | [supervised_finetuning.py](https://github.com/shibing624/MedicalGPT/blob/main/training/supervised_finetuning.py) | [run_sft.sh](https://github.com/shibing624/MedicalGPT/blob/main/scripts/run_sft.sh) | | On-Policy Distillation | 独立OPD蒸馏 | [opd_training.py](https://github.com/shibing624/MedicalGPT/blob/main/training/opd_training.py) | [run_opd.sh](https://github.com/shibing624/MedicalGPT/blob/main/scripts/run_opd.sh) | | Direct Preference Optimization | 直接偏好优化 | [dpo_training.py](https://github.com/shibing624/MedicalGPT/blob/main/training/dpo_training.py) | [run_dpo.sh](https://github.com/shibing624/MedicalGPT/blob/main/scripts/run_dpo.sh) | | Reward Modeling | 奖励模型建模 | [reward_modeling.py](https://github.com/shibing624/MedicalGPT/blob/main/training/reward_modeling.py) | [run_rm.sh](https://github.com/shibing624/MedicalGPT/blob/main/scripts/run_rm.sh) | | Reinforcement Learning | 强化学习 | [ppo_training.py](https://github.com/shibing624/MedicalGPT/blob/main/training/ppo_training.py) | [run_ppo.sh](https://github.com/shibing624/MedicalGPT/blob/main/scripts/run_ppo.sh) | | ORPO | 概率偏好优化 | [orpo_training.py](https://github.com/shibing624/MedicalGPT/blob/main/training/orpo_training.py) | [run_orpo.sh](https://github.com/shibing624/MedicalGPT/blob/main/scripts/run_orpo.sh) | - 提供完整PT+SFT+DPO全阶段串起来训练的pipeline:[run_training_dpo_pipeline.ipynb](https://github.com/shibing624/MedicalGPT/blob/main/notebooks/run_training_dpo_pipeline.ipynb) ,其对应的colab: [](https://colab.research.google.com/github/shibing624/MedicalGPT/blob/main/notebooks/run_training_dpo_pipeline.ipynb),运行完大概需要15分钟 - 提供完整PT+SFT+RLHF全阶段串起来训练的pipeline:[run_training_ppo_pipeline.ipynb](https://github.com/shibing624/MedicalGPT/blob/main/notebooks/run_training_ppo_pipeline.ipynb) ,其对应的colab: [](https://colab.research.google.com/github/shibing624/MedicalGPT/blob/main/notebooks/run_training_ppo_pipeline.ipynb) ,运行完大概需要20分钟 - 支持Agent工具调用微调训练(Agent Finetuning),SFT和DPO阶段均支持。详见下方 [Agent 训练](#agent-训练agent-finetuning) 章节 - 支持独立 OPD 训练,复用 `data/sft` 的 ShareGPT 多轮数据格式,训练输出与 SFT/LoRA 一样可直接部署;如果是LoRA训练,可继续使用 `tools/merge_peft_adapter.py` 合并权重 - 提供基于知识库文件的LLM问答功能(RAG):[chatpdf.py](https://github.com/shibing624/MedicalGPT/blob/main/demo/chatpdf.py) - [训练参数说明](https://github.com/shibing624/MedicalGPT/blob/main/docs/training_params.md) | [训练参数说明wiki](https://github.com/shibing624/MedicalGPT/wiki/%E8%AE%AD%E7%BB%83%E5%8F%82%E6%95%B0%E8%AF%B4%E6%98%8E) - [数据集](https://github.com/shibing624/MedicalGPT/blob/main/docs/datasets.md) | [数据集wiki](https://github.com/shibing624/MedicalGPT/wiki/%E6%95%B0%E6%8D%AE%E9%9B%86) - [扩充词表](https://github.com/shibing624/MedicalGPT/blob/main/docs/extend_vocab.md) | [扩充词表wiki](https://github.com/shibing624/MedicalGPT/wiki/%E6%89%A9%E5%85%85%E4%B8%AD%E6%96%87%E8%AF%8D%E8%A1%A8) - [FAQ](https://github.com/shibing624/MedicalGPT/blob/main/docs/FAQ.md) | [FAQ_wiki](https://github.com/shibing624/MedicalGPT/wiki/FAQ) #### Agent 训练(Agent Finetuning) 本项目支持通过 SFT 和 DPO 两种方式训练具有工具调用(Function Call / Tool Use)能力的 Agent 模型。 **核心原理:** Tool Call 本质上是特殊的多轮对话,在标准的 `human`/`gpt` 角色之外新增了 `function_call`(模型决定调用工具)和 `observation`(工具返回结果)两种角色。Template 系统统一处理所有角色,有工具描述就拼接到 system message,没有就跳过,对 loss 计算和训练过程完全透明。 **数据格式:** 统一使用 jsonl(一行一条),ShareGPT 格式。 SFT 数据(`data/sft/glaive_toolcall_zh_demo.jsonl`): ``` {"conversations": [{"from": "human", "value": "帮我查一下北京天气"}, {"from": "function_call", "value": "{\"name\": \"get_weather\", \"arguments\": {\"city\": \"北京\"}}"}, {"from": "observation", "value": "{\"temperature\": \"28°C\", \"weather\": \"晴\"}"}, {"from": "gpt", "value": "北京今天天气晴朗,气温28°C。"}], "tools": "[...]"} ``` DPO 数据(`data/reward/toolcall_dpo_zh_demo.jsonl`): ``` {"conversations": [{"from": "human", "value": "帮我查一下北京天气"}], "tools": "[...]", "chosen": "Action: get_weather\nAction Input: {\"city\": \"北京\"}", "rejected": "北京今天天气晴朗,气温25度。"} ``` > **注意:** 所有训练数据统一为 `.jsonl` 格式。`chosen`/`rejected` 为纯字符串。如有 `.json` 文件(JSON 数组),可用 `python tools/convert_dataset.py --in_file data.json --out_file data.jsonl --data_type json2jsonl` 转换。 **支持的 tool_format:** | tool_format | 适用模型 | 说明 | |-------------|---------|------| | `default` | 通用 | Action/Action Input 格式 | | `qwen` | Qwen2.5/Qwen3/Qwen3.5 | `` XML格式 | | `qwen3` | Qwen3 | 同 `qwen`,别名 | | `qwen3.5` | Qwen3.5 | 同 `qwen`,别名 | | `glm4` | GLM-4 | ChatGLM 工具格式 | | `llama3` | LLaMA-3.x | JSON function call 格式 | | `mistral` | Mistral | `[AVAILABLE_TOOLS]` 格式 | **混合训练:** 普通问答SFT数据和Tool Call数据可以一起训练,只需将两类数据文件放在同一个 `--train_file_dir` 目录下即可。没有 `tools` 字段的数据会按照普通SFT/DPO流程处理。 **训练命令:** Tool Call 数据与普通数据混合在同一目录下,直接使用标准训练脚本,加 `--tool_format` 参数即可: ```shell # SFT(data/sft/ 目录下同时包含普通问答和 tool call 数据) bash scripts/run_sft.sh # DPO(data/reward/ 目录下同时包含普通偏好和 tool call 偏好数据) bash scripts/run_dpo.sh ``` 关键参数说明: - `--tool_format default`:指定工具调用的文本格式(可选 `default, glm4, llama3, mistral, qwen`) - 无需单独的 agent 训练脚本,普通数据和 tool call 数据自动混合训练 #### Supported Models | Model Name | Model Size | Target Modules | Template | |----------------------------------------------------------------------|-------------------------------|-----------------|-----------| | [Baichuan](https://github.com/baichuan-inc/baichuan-13B) | 7B/13B | W_pack | baichuan | | [Baichuan2](https://github.com/baichuan-inc/Baichuan2) | 7B/13B | W_pack | baichuan2 | | [BLOOMZ](https://huggingface.co/bigscience/bloomz) | 560M/1.1B/1.7B/3B/7.1B/176B | query_key_value | vicuna | | [ChatGLM](https://github.com/THUDM/ChatGLM-6B) | 6B | query_key_value | chatglm | | [ChatGLM2](https://github.com/THUDM/ChatGLM2-6B) | 6B | query_key_value | chatglm2 | | [ChatGLM3](https://github.com/THUDM/ChatGLM3) | 6B | query_key_value | chatglm3 | | [Cohere](https://huggingface.co/CohereForAI/c4ai-command-r-plus) | 104B | q_proj,v_proj | cohere | | [DeepSeek](https://github.com/deepseek-ai/DeepSeek-LLM) | 7B/16B/67B | q_proj,v_proj | deepseek | | [DeepSeek3](https://github.com/deepseek-ai/DeepSeek-V3) | 671B | q_proj,v_proj | deepseek3 | | [InternLM2](https://github.com/InternLM/InternLM) | 7B/20B | wqkv | intern2 | | [LLaMA](https://github.com/facebookresearch/llama) | 7B/13B/33B/65B | q_proj,v_proj | alpaca | | [LLaMA2](https://huggingface.co/meta-llama) | 7B/13B/70B | q_proj,v_proj | llama2 | | [LLaMA3](https://huggingface.co/meta-llama) | 8B/70B | q_proj,v_proj | llama3 | | [Mistral](https://huggingface.co/mistralai/Mistral-7B-Instruct-v0.1) | 7B/8x7B | q_proj,v_proj | mistral | | [Orion](https://github.com/OrionStarAI/Orion) | 14B | q_proj,v_proj | orion | | [Qwen](https://github.com/QwenLM/Qwen) | 1.8B/7B/14B/72B | c_attn | qwen | | [Qwen1.5](https://huggingface.co/Qwen/Qwen1.5-72B) | 0.5B/1.8B/4B/14B/32B/72B/110B | q_proj,v_proj | qwen | | [Qwen2](https://github.com/QwenLM/Qwen2) | 0.5B/1.5B/7B/72B | q_proj,v_proj | qwen | | [Qwen2.5](https://github.com/QwenLM/Qwen2.5) | 0.5B/1.8B/4B/14B/72B | q_proj,v_proj | qwen | | [Qwen3](https://huggingface.co/Qwen) | 0.6B/1.7B/4B/8B/14B/32B/235B | q_proj,v_proj | qwen3 | | [Qwen3.5](https://huggingface.co/collections/Qwen/qwen35) | 0.8B/2B/4B/9B/27B/35B/122B | q_proj,v_proj | qwen3_5 | | [XVERSE](https://github.com/xverse-ai/XVERSE-13B) | 13B | query_key_value | xverse | | [Yi](https://github.com/01-ai/Yi) | 6B/34B | q_proj,v_proj | yi | ## 💻 Inference 训练完成后,现在我们加载训练好的模型,验证模型生成文本的效果。 ```shell CUDA_VISIBLE_DEVICES=0 python demo/inference.py \ --base_model path_to_model_hf_dir \ --lora_model path_to_lora \ --interactive ``` 参数说明: - `--base_model {base_model}`:存放HF格式的LLaMA模型权重和配置文件的目录 - `--tokenizer_path {base_model}`:存放HF格式的LLaMA模型权重和配置文件的目录 - `--lora_model {lora_model}`:LoRA解压后文件所在目录,也可使用HF Model Hub模型调用名称。如果已经合并了LoRA权重到预训练模型,则可以不提供此参数 - `--tokenizer_path {tokenizer_path}`:存放对应tokenizer的目录。若不提供此参数,则其默认值与--base_model相同 - `--template_name`:模板名称,如`vicuna`、`alpaca`等。若不提供此参数,则其默认值是vicuna - `--interactive`:以交互方式启动多轮问答,使用流式推理 - `--data_file {file_name}`:非交互方式启动下,读取file_name中的的内容进行batch预测 - `--output_file {file_name}`:非交互式方式下,将预测的结果以jsonl格式写入file_name - `--resize_emb`:是否调整embedding大小,若不调整,则使用预训练模型的embedding大小,默认不调整 - `--only_cpu`:仅使用CPU进行推理 - `--gpus {gpu_ids}`:指定使用的GPU设备编号,默认为0。如使用多张GPU,以逗号分隔,如0,1,2 #### 多卡推理 多卡数据并行,batch推理 ```shell CUDA_VISIBLE_DEVICES=0,1 torchrun --nproc_per_node 2 demo/inference_multigpu_demo.py --base_model shibing624/vicuna-baichuan-13b-chat ``` #### vllm多卡部署 ```shell bash scripts/vllm_deployment.sh ``` #### Inference Examples [shibing624/vicuna-baichuan-13b-chat](https://huggingface.co/shibing624/vicuna-baichuan-13b-chat) inference examples: Model output case | Human | Assitant | |------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | 小孩发烧怎么办 | 发烧是身体对感染或其他疾病的自然反应。以下是一些可以帮助缓解发烧症状的建议:1. 保持身体水分充足:发烧时,身体会失去水分,因此需要保持水分充足。2. 使用冰袋:将冰袋放在额头或颈部可以帮助降低体温。3. 使用退烧药:退烧药可以帮助降低体温。4. 保持身体温度:保持身体温度可以帮助降低体温。5. 使用冷水或温水擦拭身体:使用冷水或温水擦拭身体可以帮助降低体温。6. 使用退烧药:退烧药可以帮助降低体温。7. 保持身体温度:保持身体温度可以帮助降低体温。8. 使用冷水或温水擦拭身体:使用冷水或温水擦拭身体可以帮助降低体温。9. 使用退烧药:退烧药可以帮助降低体温。10. 保持身体温度:保持身体温度可以帮助降低体温。 | | 一岁宝宝发烧能吃啥药? | 1岁宝宝发烧时,可以考虑以下几种药物:1. 退烧药:如布洛芬(Ibuprofen)或对乙酰氨基酚(Paracetamol)。这些药物可以帮助降低体温,缓解发烧症状。2. 抗生素:如果发烧是由细菌感染引起的,可以考虑使用抗生素。但请务必在医生的建议下使用。3. 抗病毒药物:如果发烧是由病毒感染引起的,可以考虑使用抗病毒药物。但请务必在医生的建议下使用。4. 解热镇痛药:如阿司匹林(Aspirin)或对乙酰氨基酚(Paracetamol)。这些药物可以帮助缓解发烧症状。5. 抗组胺药:如苯海拉明(Diphenhydramine)或非索非那定(Naproxen)。这些药物可以帮助缓解发烧症状。请务必在医生的建议下使用这些药物,并遵循药物说明书上的用量和用法。同时,保持宝宝充足的水分摄入,并确保宝宝有足够的休息。 | | 肛门病变可能是什么疾病的症状 | 肛门病变可能由多种原因引起,包括感染、炎症、肿瘤或其他疾病。一些常见的肛门病变包括:1. 肛裂:这是一种肛门皮肤撕裂,通常由便秘或其他压力因素引起。2. 肛瘘:这是一种肛门感染,导致肛门皮肤和直肠之间形成瘘管。3. 肛门疣:这是一种肛门皮肤上形成的疣状病变,通常由人类乳头状瘤病毒(HPV)引起。4. 肛门脓肿:这是一种肛门感染,导致肛门皮肤下形成脓肿。5. 肛门肿瘤:这是一种肛门皮肤或直肠内形成的肿瘤。6. 肛门溃疡:这是一种肛门皮肤上形成的溃疡,通常由感染或炎症引起。7. 肛门瘙痒:这是一种肛门皮肤瘙痒的症状,可能由感染、炎症或其他疾病引起。如果您有肛门病变的症状,请咨询医疗保健专业人员以获得适当的诊断和治疗。 | | 医生,您好白带增多泛黄怎么回事? | 您好,白带增多和发黄可能是由多种原因引起的,包括感染、荷尔蒙变化、阴道干燥或其他妇科问题。以下是一些可能的原因:1. 感染:白带增多和发黄可能是由阴道或尿道感染引起的。感染可能由细菌、病毒或真菌引起。2. 荷尔蒙变化:荷尔蒙变化,如月经周期或更年期,可能会导致白带增多和发黄。3. 阴道干燥:阴道干燥可能会导致白带增多和发黄。4. 其他妇科问题:其他妇科问题,如子宫颈炎、子宫内膜炎或子宫内膜异位症,也可能导致白带增多和发黄。如果您担心自己的白带,建议您咨询妇科医生进行检查和诊断。医生可以根据您的症状和检查结果确定原因并提供适当的治疗。 | | 药流后有巧克力白带是没流干净吗 | 药流后出现巧克力白带并不一定意味着没有流干净。巧克力白带是由于子宫内膜脱落和出血引起的,通常在药流后的一段时间内会出现。药流后出现巧克力白带的原因可能包括:1. 子宫内膜脱落:药流后,子宫内膜会脱落,导致出血。这种出血可能表现为巧克力白带。2. 感染:药流后,子宫内膜和宫颈口可能存在创伤,容易受到细菌感染。感染可能导致巧克力白带。3. 激素水平变化:药流后,激素水平可能发生变化,导致巧克力白带。如果巧克力白带持续时间较长,或者伴有其他症状,如腹痛、发热、分泌物异味等,建议及时就诊,进行相关检查,如妇科检查、B超等,以确定是否存在感染或其他问题。在医生的指导下进行相应的治疗。 | | 维胺酯维E乳膏能治理什么疾病 | 维胺酯维E乳膏是一种外用药物,主要用于治疗痤疮、脂溢性皮炎等皮肤病。它可以帮助减少皮肤油脂分泌,减轻炎症,促进皮肤修复。需要注意的是,维胺酯维E乳膏并非万能药,对于某些皮肤病可能并不适用。在使用前,建议咨询医生或药师,了解药物的适应症、禁忌症、用法用量等信息。同时,使用药物时应遵循医嘱,避免自行滥用。 | | 痤疮是什么原因导致的? | 痤疮,也称为粉刺,是由皮肤毛孔堵塞引起的。堵塞毛孔的原因有很多,包括:1. 皮脂腺过度活跃:皮脂腺产生过多油脂,导致毛孔堵塞。2. 毛孔堵塞:皮肤表面的死皮细胞、油脂和细菌堵塞毛孔。3. 炎症:痤疮通常伴随着炎症,这可能是由于皮肤感染或免疫系统对痤疮的反应引起的。4. 遗传因素:某些人可能更容易患痤疮,这可能是由于遗传因素引起的。5. 荷尔蒙变化:痤疮在青春期和月经期间更为常见,这可能是由于荷尔蒙变化引起的。6. 生活方式因素:某些生活方式因素,如压力、不良饮食和缺乏运动,也可能导致痤疮。7. 化妆品和护肤品:某些化妆品和护肤品可能导致痤疮,特别是那些含有刺激性成分的产品。8. 药物:某些药物,如口服避孕药,也可能导致痤疮。要预防痤疮,可以采取一些措施,如保持皮肤清洁、使用温和的护肤品、避免过度使用化妆品和护肤品、保持健康的生活方式和饮食习惯、避免压力和荷尔蒙变化。如果痤疮严重,可能需要寻求皮肤科医生的帮助。 | | 脸上长青春痘怎么办,能吃啥药,需要注意啥 | 青春痘,又称痤疮,是一种常见的皮肤病。青春痘的治疗需要综合考虑饮食、生活习惯、药物等多个方面。以下是一些建议:1. 饮食:* 避免高糖、高脂、高油的食物,如快餐、甜点、油炸食品等。* 多吃新鲜蔬菜、水果、全谷类食物,以增加纤维摄入,促进肠道蠕动。* 避免摄入过多的咖啡因、酒精、辛辣食物等刺激性食物。2. 生活习惯:* 保持良好的作息时间,保证充足的睡眠。* 避免长时间使用电脑、手机等电子产品,以免辐射对皮肤造成刺激。* 保持皮肤清洁,每天早晚使用温和的洁面产品清洁皮肤。* 避免挤压青春痘,以免感染和留下疤痕。3. 药物:* 外用药物:可以使用含有水杨酸、苯甲酸、壬二酸等成分的护肤品,帮助去除皮肤表面的角质,减少痘痘的形成。* 口服药物:如果青春痘严重,可以考虑口服抗生素、维生素B族、锌等药物,但需在医生指导下使用。4. 注意:* 不要随意使用化妆品、护肤品,以免刺激皮肤。* 不要过度清洁皮肤,以免破坏皮肤屏障。* 保持心情舒畅,避免焦虑、抑郁等负面情绪。总之,青春痘的治疗需要综合考虑饮食、生活习惯、药物等多个方面。在治疗过程中,要保持耐心和信心,遵循医生的建议,逐步改善皮肤状况。 | | 由于输精管堵塞会不会导致男性不育?,医生您好,我同事这几天不开心,我问她怎么了,她说她老公输精管堵塞,所以一直没孩子,不是不想要,请问输精管堵塞会不会导致男性不育? | 输精管堵塞可能会导致男性不育。输精管是连接睾丸和尿道的一条管道,负责将精子从睾丸输送到尿道。如果输精管堵塞,精子就无法通过输精管到达尿道,从而导致不育。输精管堵塞的原因有很多,包括先天性发育异常、炎症、肿瘤、外伤等。输精管堵塞的治疗方法包括手术疏通、药物治疗等。如果输精管堵塞严重,可能需要进行手术疏通。需要注意的是,输精管堵塞并不一定导致不育,因为还有其他途径可以将精子输送到女性体内。例如,精子可以通过附睾、前列腺等组织到达女性体内。因此,如果输精管堵塞,建议及时就医,寻求专业医生的帮助。 | | 心肌梗塞能治疗吗? | 心肌梗死是一种严重的疾病,如果及时治疗,可以挽救生命并防止长期残疾。治疗心肌梗死的关键是尽早识别和治疗。心肌梗死的治疗通常包括以下步骤:1. 立即就医:如果出现胸痛、呼吸急促或晕厥等症状,立即就医。2. 药物治疗:医生可能会开处方药物,如硝酸甘油或阿司匹林,以帮助缓解症状并防止进一步的损伤。3. 溶栓治疗:如果患者在到达医院前出现心肌梗死,医生可能会进行溶栓治疗,通过注射溶解血栓的药物来帮助恢复血流。4. 手术治疗:如果药物治疗或溶栓治疗无效,医生可能会建议进行手术,如冠状动脉搭桥手术或心脏支架植入术。5. 康复和预防:心肌梗死的治疗通常包括康复计划,以帮助患者恢复身体功能并预防未来的心脏事件。此外,患者还应遵循医生的建议,以降低患心脏病的风险。需要注意的是,心肌梗死的治疗取决于患者的具体情况和症状。因此,如果您或您认识的人出现心肌梗死症状,请立即就医。 | | 怎么让自己精力充沛,列5点建议 | 1. 保持充足的睡眠:睡眠对于保持精力充沛至关重要。确保每晚获得7-9小时的高质量睡眠。2. 均衡饮食:均衡饮食对于保持能量水平至关重要。确保摄入足够的蛋白质、碳水化合物和健康脂肪。3. 定期锻炼:定期锻炼可以帮助提高能量水平。尝试每天进行至少30分钟的有氧运动,如散步、跑步或骑自行车。4. 管理压力:压力会消耗能量,因此管理压力对于保持精力充沛至关重要。尝试找到放松和减压的方法,如冥想、瑜伽或深呼吸练习。5. 保持水分:脱水会降低能量水平。确保每天喝足够的水,并根据需要补充水分。 | | 写个春天的诗 | 春天,是大地苏醒的季节,是万物复苏的季节,是生命绽放的季节。春天,是阳光明媚的季节,是鸟语花香的季节,是绿意盎然的季节,是希望无限的季节。春天,是人们欢笑的季节,是孩子们嬉戏的季节,是恋人们相拥的季节,是人们追求梦想的季节。 | | 南极洲为啥没有北极熊? | 南极洲没有北极熊,因为北极熊生活在北极地区,而南极洲位于南半球,气候和环境与北极地区有很大不同。南极洲的气候非常寒冷,常年被冰雪覆盖,而北极熊则生活在北极地区,那里有丰富的海洋生物和陆地哺乳动物。此外,南极洲的生态系统也与北极地区不同,没有北极熊所需的生存条件。 | ## 📚 Dataset ### 医疗数据集 - 240万条中文医疗数据集(包括预训练、指令微调和奖励数据集):[shibing624/medical](https://huggingface.co/datasets/shibing624/medical) - 22万条中文医疗对话数据集(华佗项目):[shibing624/huatuo_medical_qa_sharegpt](https://huggingface.co/datasets/shibing624/huatuo_medical_qa_sharegpt) 【本项目支持格式】 ### 通用数据集 #### Pretraining datasets(预训练数据集) - 16GB中英文无监督、平行语料[Linly-AI/Chinese-pretraining-dataset](https://huggingface.co/datasets/Linly-AI/Chinese-pretraining-dataset) - 524MB中文维基百科语料[wikipedia-cn-20230720-filtered](https://huggingface.co/datasets/pleisto/wikipedia-cn-20230720-filtered) #### Supervised fine-tuning datasets(指令微调数据集) - 10万条多语言ShareGPT GPT4多轮对话数据集:[shibing624/sharegpt_gpt4](https://huggingface.co/datasets/shibing624/sharegpt_gpt4) 【本项目支持格式】 - 9万条英文ShareGPT多轮对话数集:[anon8231489123/ShareGPT_Vicuna_unfiltered](https://huggingface.co/datasets/anon8231489123/ShareGPT_Vicuna_unfiltered) 【本项目支持格式】 - 50万条中文ChatGPT指令Belle数据集:[BelleGroup/train_0.5M_CN](https://huggingface.co/datasets/BelleGroup/train_0.5M_CN) - 100万条中文ChatGPT指令Belle数据集:[BelleGroup/train_1M_CN](https://huggingface.co/datasets/BelleGroup/train_1M_CN) - 5万条英文ChatGPT指令Alpaca数据集:[50k English Stanford Alpaca dataset](https://github.com/tatsu-lab/stanford_alpaca#data-release) - 2万条中文ChatGPT指令Alpaca数据集:[shibing624/alpaca-zh](https://huggingface.co/datasets/shibing624/alpaca-zh) - 69万条中文指令Guanaco数据集(Belle50万条+Guanaco19万条):[Chinese-Vicuna/guanaco_belle_merge_v1.0](https://huggingface.co/datasets/Chinese-Vicuna/guanaco_belle_merge_v1.0) - 5万条英文ChatGPT多轮对话数据集:[RyokoAI/ShareGPT52K](https://huggingface.co/datasets/RyokoAI/ShareGPT52K) - 80万条中文ChatGPT多轮对话数据集:[BelleGroup/multiturn_chat_0.8M](https://huggingface.co/datasets/BelleGroup/multiturn_chat_0.8M) - 116万条中文ChatGPT多轮对话数据集:[fnlp/moss-002-sft-data](https://huggingface.co/datasets/fnlp/moss-002-sft-data) - 3.8万条中文ShareGPT多轮对话数据集:[FreedomIntelligence/ShareGPT-CN](https://huggingface.co/datasets/FreedomIntelligence/ShareGPT-CN) - 130万条中文微调数据集(汇总):[zhuangxialie/Llama3-Chinese-Dataset](https://modelscope.cn/datasets/zhuangxialie/Llama3-Chinese-Dataset/dataPeview) 【本项目支持格式】 - 7千条中文角色扮演多轮对话数据集:[shibing624/roleplay-zh-sharegpt-gpt4-data](https://huggingface.co/datasets/shibing624/roleplay-zh-sharegpt-gpt4-data) 【本项目支持格式】 #### Preference datasets(偏好数据集) - 2万条中英文偏好数据集:[shibing624/DPO-En-Zh-20k-Preference](https://huggingface.co/datasets/shibing624/DPO-En-Zh-20k-Preference) 【本项目支持格式】 - 原版的oasst1数据集:[OpenAssistant/oasst1](https://huggingface.co/datasets/OpenAssistant/oasst1) - 2万条多语言oasst1的reward数据集:[tasksource/oasst1_pairwise_rlhf_reward](https://huggingface.co/datasets/tasksource/oasst1_pairwise_rlhf_reward) - 11万条英文hh-rlhf的reward数据集:[Dahoas/full-hh-rlhf](https://huggingface.co/datasets/Dahoas/full-hh-rlhf) - 9万条英文reward数据集(来自Anthropic's Helpful Harmless dataset):[Dahoas/static-hh](https://huggingface.co/datasets/Dahoas/static-hh) - 7万条英文reward数据集(来源同上):[Dahoas/rm-static](https://huggingface.co/datasets/Dahoas/rm-static) - 7万条繁体中文的reward数据集(翻译自rm-static)[liswei/rm-static-m2m100-zh](https://huggingface.co/datasets/liswei/rm-static-m2m100-zh) - 7万条英文Reward数据集:[yitingxie/rlhf-reward-datasets](https://huggingface.co/datasets/yitingxie/rlhf-reward-datasets) - 3千条中文知乎问答偏好数据集:[liyucheng/zhihu_rlhf_3k](https://huggingface.co/datasets/liyucheng/zhihu_rlhf_3k) ## ☎️ Contact - Issue(建议) :[](https://github.com/shibing624/MedicalGPT/issues) - 邮件我:xuming: xuming624@qq.com - 微信我: 加我*微信号:xuming624, 备注:姓名-公司名-NLP* 进NLP交流群(加我拉你进群)。 ## ⚠️ LICENSE 本项目仅可应用于研究目的,项目开发者不承担任何因使用本项目(包含但不限于数据、模型、代码等)导致的危害或损失。详细请参考[免责声明](https://github.com/shibing624/MedicalGPT/blob/main/DISCLAIMER)。 MedicalGPT项目代码的授权协议为 [The Apache License 2.0](/LICENSE),代码可免费用做商业用途,模型权重和数据只能用于研究目的。请在产品说明中附加MedicalGPT的链接和授权协议。 ## 😇 Citation 如果你在研究中使用了MedicalGPT,请按如下格式引用: ```latex @misc{MedicalGPT, title={MedicalGPT: Training Medical GPT Model}, author={Ming Xu}, year={2023}, howpublished={\url{https://github.com/shibing624/MedicalGPT}}, } ``` ## 😍 Contribute 项目代码还很粗糙,如果大家对代码有所改进,欢迎提交回本项目,在提交之前,注意以下两点: - 在`tests`添加相应的单元测试 - 使用`python -m pytest`来运行所有单元测试,确保所有单测都是通过的 之后即可提交PR。 ## 💕 Acknowledgements - [Direct Preference Optimization:Your Language Model is Secretly a Reward Model](https://arxiv.org/pdf/2305.18290.pdf) - [tloen/alpaca-lora](https://github.com/tloen/alpaca-lora/blob/main/finetune.py) - [ymcui/Chinese-LLaMA-Alpaca](https://github.com/ymcui/Chinese-LLaMA-Alpaca) Thanks for their great work! #### 关联项目推荐 - [shibing624/agentica](https://github.com/shibing624/agentica):基于 LLM 构建 Agent 框架,支持多种 Agent 类型,包括 RAG、在线搜索、Code interpreter、Vibe Coding、Claude Code、Copilot Agent 等 --- ## File: docs/datasets.md # 数据集 ### 医疗数据集 - 240万条中文医疗数据集(包括预训练、指令微调和奖励数据集):[shibing624/medical](https://huggingface.co/datasets/shibing624/medical) - 22万条中文医疗对话数据集(华佗项目):[FreedomIntelligence/HuatuoGPT-sft-data-v1](https://huggingface.co/datasets/FreedomIntelligence/HuatuoGPT-sft-data-v1) ### 通用数据集 #### Pretraining datasets - 16GB中英文无监督、平行语料[Linly-AI/Chinese-pretraining-dataset](https://huggingface.co/datasets/Linly-AI/Chinese-pretraining-dataset) - 524MB中文维基百科语料[wikipedia-cn-20230720-filtered](https://huggingface.co/datasets/pleisto/wikipedia-cn-20230720-filtered) #### SFT datasets - 6千条多语言ShareGPT GPT4多轮对话数据集:[shibing624/sharegpt_gpt4](https://huggingface.co/datasets/shibing624/sharegpt_gpt4) [本项目支持格式] - 9万条英文ShareGPT多轮对话数集:[anon8231489123/ShareGPT_Vicuna_unfiltered](https://huggingface.co/datasets/anon8231489123/ShareGPT_Vicuna_unfiltered) [本项目支持格式] - 50万条中文ChatGPT指令Belle数据集:[BelleGroup/train_0.5M_CN](https://huggingface.co/datasets/BelleGroup/train_0.5M_CN) - 100万条中文ChatGPT指令Belle数据集:[BelleGroup/train_1M_CN](https://huggingface.co/datasets/BelleGroup/train_1M_CN) - 5万条英文ChatGPT指令Alpaca数据集:[50k English Stanford Alpaca dataset](https://github.com/tatsu-lab/stanford_alpaca#data-release) - 2万条中文ChatGPT指令Alpaca数据集:[shibing624/alpaca-zh](https://huggingface.co/datasets/shibing624/alpaca-zh) - 69万条中文指令Guanaco数据集(Belle50万条+Guanaco19万条):[Chinese-Vicuna/guanaco_belle_merge_v1.0](https://huggingface.co/datasets/Chinese-Vicuna/guanaco_belle_merge_v1.0) - 5万条英文ChatGPT多轮对话数据集:[RyokoAI/ShareGPT52K](https://huggingface.co/datasets/RyokoAI/ShareGPT52K) - 80万条中文ChatGPT多轮对话数据集:[BelleGroup/multiturn_chat_0.8M](https://huggingface.co/datasets/BelleGroup/multiturn_chat_0.8M) - 116万条中文ChatGPT多轮对话数据集:[fnlp/moss-002-sft-data](https://huggingface.co/datasets/fnlp/moss-002-sft-data) - 3.8万条中文ShareGPT多轮对话数据集:[FreedomIntelligence/ShareGPT-CN](https://huggingface.co/datasets/FreedomIntelligence/ShareGPT-CN) #### Reward Model datasets - 原版的oasst1数据集:[OpenAssistant/oasst1](https://huggingface.co/datasets/OpenAssistant/oasst1) - 2万条多语言oasst1的reward数据集:[tasksource/oasst1_pairwise_rlhf_reward](https://huggingface.co/datasets/tasksource/oasst1_pairwise_rlhf_reward) - 11万条英文hh-rlhf的reward数据集:[Dahoas/full-hh-rlhf](https://huggingface.co/datasets/Dahoas/full-hh-rlhf) - 9万条英文reward数据集(来自Anthropic's Helpful Harmless dataset):[Dahoas/static-hh](https://huggingface.co/datasets/Dahoas/static-hh) - 7万条英文reward数据集(来源同上):[Dahoas/rm-static](https://huggingface.co/datasets/Dahoas/rm-static) - 7万条繁体中文的reward数据集(翻译自rm-static)[liswei/rm-static-m2m100-zh](https://huggingface.co/datasets/liswei/rm-static-m2m100-zh) - 7万条英文Reward数据集:[yitingxie/rlhf-reward-datasets](https://huggingface.co/datasets/yitingxie/rlhf-reward-datasets) - 3千条中文知乎问答偏好数据集:[liyucheng/zhihu_rlhf_3k](https://huggingface.co/datasets/liyucheng/zhihu_rlhf_3k) ## 预训练数据集详情 第一阶段预训练,16GB中英文无监督、平行语料,数据集由Linly-AI已经上传到Huggingface datasets:https://huggingface.co/datasets/Linly-AI/Chinese-pretraining-dataset 数据包括:[CLUECorpusSmall、中英文翻译数据、News Commentary v13](https://github.com/dbiir/UER-py/wiki/%E9%A2%84%E8%AE%AD%E7%BB%83%E6%95%B0%E6%8D%AE) 和[中文科学文献数据 CSL](https://github.com/ydli-ai/CSL) #### 中文数据集 数据集 | Disk Size | Link -- | -- | -- ClueCorpusSmall | 13G | https://github.com/CLUEbenchmark/CLUECorpus2020 中文维基百科 2023 | 2.5G | https://download.wikipedia.com/zhwiki/ CSL | 1.5G | https://github.com/ydli-ai/CSL news-crawl | 2.3G | https://data.statmt.org/news-crawl/zh/ #### 平行语料 数据集 | Disk Size | Link -- | -- | -- UNCorpus | 4.3G | https://conferences.unite.un.org/UNCorpus translation2019zh | 1.3G | https://github.com/brightmart/nlp_chinese_corpus WikiMatri | 0.6G | http://data.statmt.org/wmt21/translation-task/WikiMatrix/ news-commentry | 67M | http://data.statmt.org/wmt20/translation-task/back-translation/ ParaCrawl v9 | 2.6G | https://paracrawl.eu/ #### 英文数据集 数据集 | Disk Size | Link -- | -- | -- 英文维基百科 2023 | 20G | https://download.wikipedia.com/enwiki/ arxiv | 10G | https://github.com/togethercomputer/RedPajama-Data GitHub | 10G | 同上 Book | 18G | 同上 stackexchange | 13G | 同上 ### 格式 下载语料后,合并到一个 .txt 文件并按行随机打乱,语料格式如下: ``` doc1 doc2 doc3 ``` #### jsonl 预训练语料 为了支持代码等包含换行符的数据,预训练数据也可以整理成jsonl格式,格式如下: ``` {"text": "doc1"} {"text": "doc2"} {"text": "doc3"} ``` # 数据集格式 #### Pre-training dataset format Dataset formats used `--train_file_dir` and `--validation_file_dir` The format of the PT (pre-training) data set is as follows: text file, one sample per line ``` txt file ``` #### SFT dataset format The format of the SFT (supervised fine-tuning) dataset is as follows. All data files use `.jsonl` format (one JSON object per line). ShareGPT format: ``` head -n 1 sharegpt_gpt4.jsonl {"conversations":[ {'from': 'human', 'value': '採用優雅現代中文,用中文繁體字型,回答以下問題。為所有標題或專用字詞提供對應的英語翻譯:Using scholarly style, summarize in detail James Barr\'s book "Semantics of Biblical Language". Provide examples supplied in the book and give corresponding page numbers wherever applicable.'}, {'from': 'gpt', 'value': '《聖經語言的語義學》(Semantics of Biblical Language)是詹姆斯·巴爾(James Barr)於1961年出版的一本研究聖經語言的專著。在這部作品中,巴爾對聖經希伯來語和希臘語的語言學特徵進行了深入的探討,他批判了當時盛行的聖經研究方法,主張應該將語言學原理應用於聖經文本的詮釋,以便更準確地理解聖經的意思。\n\n巴爾在《聖經語言的語義學》中提出了幾個重要的觀點。首先,他主張語言學和語言學家在聖經研究中的角色應該受到重視。他認為,應該避免將聖經語言學和其他古典語言學區分開來,因為聖經語言和其他古代語言一樣,都有其固有的語法、語義和詞彙特點(第18-23頁)。\n\n其次,巴爾批評了當時流行的"字根意義論"(root-meaning fallacy),即過分強調單詞的字根在詮釋聖經含義時的作用。他指出,詞義是由語境決定的,而非僅僅由字根決定。巴爾舉了希伯來語單詞 "כפר"(kāpar)為例,它在不同的語境下可以表示"遮蓋"、"贖回"或"和解",而不是僅僅依賴其字根意義(第183-184頁)。\n\n第三,巴爾強調了詞彙意義在詮釋聖經時的重要性。他認為,了解單詞的意義和用法對於恰當理解聖經文本至關重要。巴爾引用了希伯來語單詞 "ברית"(berîṯ,英文:covenant)和希臘語單詞 "διαθήκη"(diathēkē,英文:testament)為例,解釋了這兩個詞在聖經中的不'}, {'from': 'human', 'value': '繼續'}, {'from': 'gpt', 'value': '同含義和用法。巴爾認為,了解這些詞語在不同語境下的意義對於理解聖經中的盟約和遺囑概念至關重要(第50-53頁)。\n\n第四,巴爾強調語境在詮釋聖經時的重要性。他認為,要理解聖經的含義,就必須考慮到文本的歷史背景、文化環境和語言風格。此外,巴爾提倡從語言學的角度研究聖經,以便更好地理解聖經的結構和風格。他以希伯來詩篇的平行主義(Parallelism)為例,闡述了語言學原理如何有助於揭示詩篇中的意象和修辭結構(第250-252頁)。\n\n總之,《聖經語言的語義學》一書對聖經研究領域產生了深遠的影響。詹姆斯·巴爾通過對聖經語言學的深入研究,提出了許多富有洞察力的觀點,尤其是關於語言學在聖經詮釋中的重要性。這些觀點對後來的聖經研究者產生了很大的啟示,使他們在研究聖經時更加重視語言學原理,從而更加準確地理解聖經的含義。'} ] } ``` #### Reward model / DPO dataset format ShareGPT format with chosen/rejected string fields, `.jsonl` file: ``` {"conversations": [{"from": "human", "value": "text1"}], "chosen": "text2", "rejected": "text3"} ``` With tool calls (optional `tools` field): ``` {"conversations": [{"from": "human", "value": "text1"}], "tools": "[...]", "chosen": "text2", "rejected": "text3"} ``` #### Reinforcement Learning dataset format SFT datasets can be reused. #### Data format conversion Convert JSON array to jsonl: ```bash python tools/convert_dataset.py --in_file data.json --out_file data.jsonl --data_type json2jsonl ``` Use `--dataset_name` to load HF datasets, format refer to [shibing624/medical](https://huggingface.co/datasets/shibing624/medical) --- ## File: docs/extend_vocab.md # 扩充中文词表 使用的数据包含中、英文无监督数据和平行语料,在语料上重新训练 spm tokenizer,在中文上获得字词结合的分词效果。 ## 构建 tokenizer 1. 首先在大规模中英文领域语料上训练 SPM,词表大小依据训练集指定,一般大于2000,使tokenizer可以完整切分`病毒`、`感染`、`慕容复`等领域词 - 训练脚本:https://github.com/shibing624/MedicalGPT/blob/main/build_domain_tokenizer.py - sentencepiece训练参考:https://github.com/google/sentencepiece/blob/master/python/sentencepiece_python_module_example.ipynb 2. 扩充百川中文词表,该词表中文识字率较高,用于提高简繁体汉字的识字率;根据[结巴分词](https://github.com/fxsjy/jieba)词频前20000的词表扩充中文词,提高专名切分效果 - 合并词表脚本:https://github.com/shibing624/MedicalGPT/blob/main/merge_tokenizers.py 效果示例: 原文: ```this is a test, hello world. thisisatesthelloworld, 慕容复来到河边,姑苏慕容氏在外面丢了人。 1号店一周岁了,我们一古脑儿买了10斤零食。 巴塞罗那足球俱乐部简称巴萨(Barça),是一家位于西班牙加泰罗尼亚巴塞罗那的足球俱乐部,于1899年由瑞士企业家胡安·甘伯所创立,世界球坛顶级足球俱乐部之一。俱乐部主场可容纳接近十万名观众,是全欧洲最大及世界第二大的足球场。 白日依山尽,黄河入海流。欲穷千里目,更上一层楼。``` Medical LLaMA tokenizer: ```['▁this', '▁is', '▁a', '▁test', ',', '▁hello', '▁world', '.', '▁this', 'isat', 'est', 'h', 'ellow', 'orld', ',', '▁', '<0x0A>', '慕容复', '来到', '河边', ',', '姑', '苏', '慕容', '氏', '在外', '面', '丢', '了', '人', '。', '<0x0A>', '1', '号', '店', '一周', '岁', '了', ',', '我们', '一', '古', '脑', '儿', '买了', '1', '0', '斤', '零食', '。', '<0x0A>', '巴', '塞', '罗', '那', '足球', '俱乐部', '简称', '巴', '萨', '(', 'Bar', 'ça', ')', ',', '是一家', '位于', '西班牙', '加', '泰', '罗', '尼亚', '巴', '塞', '罗', '那', '的', '足球', '俱乐部', ',', '于', '1', '8', '9', '9', '年', '由', '瑞士', '企业家', '胡', '安', '·', '甘', '伯', '所', '创立', ',', '世界', '球', '坛', '顶级', '足球', '俱乐部', '之一', '。', '俱乐部', '主场', '可', '容纳', '接近', '十万', '名', '观众', ',', '是', '全', '欧洲', '最大', '及', '世界', '第二', '大的', '足球', '场', '。', '<0x0A>', '白', '日', '依', '山', '尽', ',', '黄河', '入', '海', '流', '。', '欲', '穷', '千里', '目', ',', '更', '上一', '层', '楼', '。']``` LLaMA 原始 tokenizer: ``` /* Detailed source-code truncated for AI context efficiency. */ ``` ## 扩词表后的增量预训练 - 扩词表后的增量预训练,PT阶段加上`--modules_to_save embed_tokens,lm_head`参数,后续SFT等阶段不用加 - 其他训练参数见 https://github.com/shibing624/MedicalGPT/blob/main/docs/training_params.md --- ## File: docs/FAQ.md #### 问:报错"NotImplementedError: Cannot copy out of meta tensor; no data!" 答:单卡显存不足,device_map='auto'在gpu占满下,会自动利用cpu加载模型,导致`_move_model_to_device`错误。 解决方法:指定多卡训练,参考`CUDA_VISIBLE_DEVICES=0,1,2,3 python supervised_finetuning.py ...`,把batch size调大,显存打满,跟数据并行一样能最大化利用显卡加速训练。参考[issues 4](https://github.com/shibing624/MedicalGPT/issues/4) #### 问:chatglm,baichuan模型用LoRA(peft)训练,合并时报错 答:chatglm,baichuan模型的代码跟权重文件放一起了,代码没有合入transformers官方库,merge lora时,需要把原始权重路径下的python文件全部拷贝到merged文件夹下使用,参考[issue 68](https://github.com/shibing624/MedicalGPT/issues/68) #### 问:chatglm,baichuan无法做RM和RL训练? 答:chatglm不是标准CausalLM,RM阶段需要AutoModelForSequenceClassification,chatglm没有实现;PPO训练需要AutoModelForCausalLMWithValueHead,chatglm也不支持,同样的原因百川模型也无法做RM和RL训练。官方transformers兼容chatglm和baichuan模型后才支持。参考[issue 107](https://github.com/shibing624/MedicalGPT/issues/107) --- ## File: docs/training_details.md # Training Detail ### Stage 1: PT(Continue PreTraining) 第一阶段:PT(Continue PreTraining)增量预训练 使用百科类文档类数据集,用来在领域数据集上增量预训练或二次预训练,期望能把领域知识注入给模型,以医疗领域为例,希望增量预训练,能让模型理解感冒的症状、病因、治疗药品、治疗方法、药品疗效等知识,便于后续的SFT监督微调能激活这些内在知识。 这里说明一点,像GPT3、LLaMA这样的大模型理论上是可以从增量预训练中获益,但增量预训练需要满足两个要求:1)高质量的预训练样本;2)较大的计算资源,显存要求高,即使是用LoRA技术,也要满足block_size=1024或2048长度的文本加载到显存中。 其次,如果你的项目用到的数据是模型预训练中已经使用了的,如维基百科、ArXiv等LLaMA模型预训练用了的,则这些数据是没有必要再喂给LLaMA增量预训练,而且预训练样本的质量如果不够高,也可能会损害原模型的生成能力。 tips:PT阶段是可选项,请慎重处理。 基于llama-7b模型,使用医疗百科类数据继续预训练,期望注入医疗知识到预训练模型,得到llama-7b-pt模型 Continue pretraining of the base llama-7b model to create llama-7b-pt: ```shell cd scripts sh run_pt.sh ``` [训练参数说明](https://github.com/shibing624/MedicalGPT/blob/main/docs/training_params.md) - 如果你的显存不足,可以改小batch_size=1, block_size=512(影响训练的上下文最大长度); - 如果你的显存更大,可以改大block_size=2048, 此为llama原始预训练长度,不能更大啦;调大batch_size。 ### Stage 2: SFT(Supervised Fine-tuning) 第二阶段:SFT(Supervised Fine-tuning)有监督微调 基于llama-7b-pt模型,使用医疗问答类数据进行有监督微调,得到llama-7b-sft模型 Supervised fine-tuning of the base llama-7b-pt model to create llama-7b-sft ```shell cd scripts sh run_sft.sh ``` [训练参数说明](https://github.com/shibing624/MedicalGPT/blob/main/docs/training_params.md) ### Stage 3: RLHF(Reinforcement Learning from Human Feedback) #### Reward Modeling RM(Reward Model)奖励模型建模 RM(Reward Model)奖励模型,原则上,我们可以直接用人类标注来对模型做 RLHF 微调。 然而,这将需要我们给人类发送一些样本,在每轮优化后计分。这是贵且慢的,因为收敛需要的训练样本量大,而人类阅读和标注的速度有限。 一个比直接反馈更好的策略是,在进入 RL 循环之前用人类标注集来训练一个奖励模型RM。奖励模型的目的是模拟人类对文本的打分。 构建奖励模型的最佳实践是预测结果的排序,即对每个 prompt (输入文本) 对应的两个结果 (yk, yj),模型预测人类标注的比分哪个更高。 RM模型是通过人工标注SFT模型的打分结果来训练的,目的是取代人工打分,本质是个回归模型,用来对齐人类偏好,主要是"HHH"原则,具体是"helpful, honest, harmless"。 基于llama-7b-sft模型,使用医疗问答偏好数据训练奖励偏好模型,训练得到llama-7b-reward模型 Reward modeling using dialog pairs from the reward dataset using the llama-7b-sft to create llama-7b-reward: ```shell cd scripts sh run_rm.sh ``` [训练参数说明](https://github.com/shibing624/MedicalGPT/blob/main/docs/training_params.md) #### Reinforcement Learning RL(Reinforcement Learning)强化学习 RL(Reinforcement Learning)模型的目的是最大化奖励模型的输出,基于上面步骤,我们有了微调的语言模型(llama-7b-sft)和奖励模型(llama-7b-reward), 可以开始执行 RL 循环了。 这个过程大致分为三步: 1. 输入prompt,模型生成答复 2. 用奖励模型来对答复评分 3. 基于评分,进行一轮策略优化的强化学习(PPO) 基于llama-7b-reward模型 RL 微调训练llama-7b-sft模型,得到llama-7b-rl模型 Reinforcement Learning fine-tuning of llama-7b-sft with the llama-7b-reward reward model to create llama-7b-rl ```shell pip install git+https://github.com/lvwerra/trl cd scripts sh run_ppo.sh ``` ### Stage 3: DPO(Direct Preference Optimization) DPO(Direct Preference Optimization)直接偏好优化 DPO方法可以通过直接优化语言模型来实现对其行为的精确控制,而无需使用复杂的强化学习。 DPO 将奖励函数和最优策略之间的映射联系起来,从而把约束奖励最大化问题转化为一个单阶段的策略训练问题。 这种算法不仅不用拟合奖励模型,还避免了在微调过程中从语言模型中采样或调整超参数的需要。 实验结果表明,DPO 算法可以与现有RLHF方法一样有效地从人类偏好中学习,甚至在某些任务中表现更好,比如情感调节、摘要和单轮对话。 PS: 使用DPO训练LLaMA2-7B在fp16,batch_size为2时,需要70GB显存。 ```shell sh run_dpo.sh ``` --- ## File: docs/training_params.md ## 训练脚本 - 第一阶段:PT(Continue PreTraining)增量预训练 `run_pt.sh` - 第二阶段:SFT(Supervised Fine-tuning)有监督微调 `run_sft.sh` - 第三阶段 - RLHF(Reinforcement Learning from Human Feedback)分为两步: - RM(Reward Model)奖励模型建模 `run_rm.sh` - RL(Reinforcement Learning)基于人类反馈的强化学习 `run_ppo.sh` - DPO(Direct Preference Optimization)直接偏好优化 `run_dpo.sh` - OPD(On-Policy Distillation)独立蒸馏 `run_opd.sh` ## 训练参数说明 1. 如果想要单卡训练,仅需将nproc_per_node设置为1即可,或者去掉torchrun命令,直接运行python脚本,如`python supervised_finetuning.py` 2. 指定训练的base模型(默认llama),训练代码也兼容ChatGLM/BLOOM/BaiChuan等GPT模型,以baichuan模型为例,调整`--model_name_or_path baichuan-inc/Baichuan-13B-Chat`,特别的,如果未训练只推理,base model是类似`baichuan-inc/Baichuan-13B-Chat`已经对齐的模型,则需要指定`--template_name baichuan`;如果在base model基础上训练,默认采用`vicuna`模板,后续用训练好的模型推理时,也指定相同的`--template_name vicuna`即可 3. 指定训练集,`--train_file_dir`指定训练数据目录,`--validation_file_dir`指定验证数据目录,如果不指定,默认使用`--dataset_name`指定的HF datasets数据集,训练集字段格式见[数据集格式](https://github.com/shibing624/MedicalGPT/wiki/%E6%95%B0%E6%8D%AE%E9%9B%86),建议领域训练集中加入一些通用对话数据,数据集链接见[📚 Dataset](https://github.com/shibing624/MedicalGPT#-dataset),当前默认多轮对话格式,兼容单轮对话,微调训练集如果是alpaca格式,可以用[convert_dataset.py](https://github.com/shibing624/MedicalGPT/blob/main/convert_dataset.py)转为shareGPT格式,即可传入训练 4. 如果运行环境支持deepspeed,加上`--deepspeed zero2.json`参数启动zero2模式;显存不足,加上`--deepspeed zero3.json --fp16`参数启动zero3混合精度模式 5. 如果gpu支持int8/int4量化,加上`--load_in_4bit True`代表采用4bit量化训练,或者`--load_in_8bit True`代表采用8bit量化训练,均可显著减少显存占用 6. 训练集条数控制,`--max_train_samples`和`--max_eval_samples`指定训练和验证数据集的最大样本数,用于快速验证代码是否可用,训练时建议设置为`--max_train_samples -1`表示用全部训练集,`--max_eval_samples 50`表示用50条验证数据 7. 训练方式,指定`--use_peft False`为全参训练(要移除`--fp16`),`--use_peft True`是LoRA训练;注意:全参训练LLaMA-7B模型需要120GB显存,LoRA训练需要13GB显存 8. 支持恢复训练,LoRA训练时指定`--peft_path`为旧的adapter_model.bin所在文件夹路径;全参训练时指定`--resume_from_checkpoint`为旧模型权重的文件夹路径 9. PT和SFT支持qlora训练,如果使用的是 RTX4090、A100 或 H100 GPU,支持nf4,使用`--qlora True --load_in_4bit True`参数启用qlora训练,开启qlora训练,会减少显存占用,训练加速,同时建议设置`--torch_dtype bfloat16 --optim paged_adamw_32bit`保证训练精度 10. 扩词表后的增量预训练,PT阶段加上`--modules_to_save embed_tokens,lm_head`参数,后续SFT等阶段不用加 11. 新增了RoPE插值来扩展GPT模型的上下文长度,通过[位置插值方法](https://arxiv.org/abs/2306.15595),在增量数据上进行训练,使模型获得长文本处理能力,使用 `--rope_scaling linear` 参数训练模型,使用`--rope_scaling dynamic` 参数预测模型 12. 针对LLaMA模型支持了[FlashAttention-2](https://github.com/Dao-AILab/flash-attention),如果您使用的是 RTX3090、RTX4090、A100 或 H100 GPU,SFT中请使用 `--flash_attn` 参数以启用 FlashAttention-2 13. 新增了[LongLoRA](https://github.com/dvlab-research/LongLoRA) 提出的 **$S^2$-Attn**,使模型获得长文本处理能力,SFT中使用 `--shift_attn` 参数以启用该功能 14. 支持了[NEFTune](https://github.com/neelsjain/NEFTune)给embedding加噪SFT训练方法,[NEFTune paper](https://arxiv.org/abs/2310.05914), SFT中使用 `--neft_alpha` 参数启用 NEFTune,例如 `--neft_alpha 5` 15. 支持微调Mixtral混合专家MoE模型 **[Mixtral 8x7B](https://huggingface.co/mistralai/Mixtral-8x7B-v0.1)**,SFT中如果用lora微调模型,可以开启4bit量化和QLoRA`--load_in_4bit True --qlora True`以节省显存,建议设置`--target_modules q_proj,k_proj,v_proj,o_proj`,这样可以避免对MoE专家网络的MLP层量化,因为它们很稀疏且量化后会导致性能效果下降。 16. 独立OPD训练依赖 `trl>=0.29.0` 的 `trl.experimental.gkd.GKDTrainer`,更新依赖后可直接运行 `bash scripts/run_opd.sh` 17. OPD第一版复用 `data/sft` 的 ShareGPT 多轮对话数据格式,每条样本会拆成若干个以 assistant turn 结尾的 `messages` 训练样本,不需要 `chosen/rejected` 偏好数据 18. OPD常用参数:`--teacher_model_name_or_path` 指定更强的teacher,`--max_prompt_length` 控制提示词长度,`--max_new_tokens` 控制on-policy rollout长度,`--opd_lambda` 对应 on-policy rollout 比例,`--opd_beta` 对应 GKD/JSD 的KL插值,`--temperature` 和 `--seq_kd` 直接映射到 `GKDConfig` 19. OPD建议默认只训练student,teacher保持冻结;显存紧张时可给teacher加 `--teacher_load_in_4bit True` 或 `--teacher_load_in_8bit True` 20. OPD最好让student和teacher共用同一tokenizer family / chat template;如果底模tokenizer没有内置 `chat_template`,请显式传 `--template_name` **关于LoRA Training** 默认使用LoRA训练,每个stage的LoRA模型权重都需要合并到base model中,使用以下命令合并,下一个stage的`model_name_or_path`指定为合并后的模型文件夹。 LoRA layers were using at all stages to reduce memory requirements. At each stage the peft adapter layers were merged with the base model, using: ```shell python merge_peft_adapter.py \ --base_model base_model_dir \ --tokenizer_path base_model_dir \ --lora_model lora_model_dir \ --output_dir outputs-merged ``` - this script requires `peft>=0.4.0` - 合并后的权重保存在output_dir目录下,后续可通过from_pretrained直接加载 - OPD的LoRA输出与SFT/DPO相同,也可以用同样的方式合并和部署 **关于模型结果** 训练日志和模型保存在output_dir目录下,目录下的文件结构如下: ```shell output_dir/ |-- adapter_config.json |-- adapter_model.bin |-- checkpoint-24000 | |-- adapter_config.json | |-- adapter_model.bin | |-- trainer_state.json | `-- training_args.bin |-- train_results.txt |-- eval_results.txt |-- special_tokens_map.json |-- tokenizer_config.json |-- training_args.bin |-- logs | |-- 1685436851.18595 | | `-- events.out.tfevents.1685436851.ts-89f5028ad154472e99e7bcf2c9bf2343-launcher.82684.1 └── config.json ``` - `trainer_state.json`记录了loss、learning_rate的变化 - logs目录下的文件可用于tensorboard可视化,启动tensorboard命令如下: ```shell tensorboard --logdir output_dir/logs --host 0.0.0.0 --port 8008 ``` **关于deepspeed** deepspeed 的参数配置`deepspeed_config.json`可参考: 1. https://www.deepspeed.ai/docs/config-json/ 2. https://huggingface.co/docs/accelerate/usage_guides/deepspeed 3. https://github.com/huggingface/transformers/blob/main/tests/deepspeed 如果显存充足,可优先考虑stage 2,对应的配置文件是`deepspeed_zero_stage2_config.json`。如果显存不足,可采用stage 3,对应的配置文件是`deepspeed_zero_stage3_config.json`,该模式采用模型参数并行,可显著减小显存占用,但是训练速度会变慢很多。 **关于多机多卡训练** 以两台机器为例,每台机器上有8张卡 ```shell node_rank=$1 echo ${node_rank} master_addr="10.111.112.223" torchrun --nproc_per_node 8 --nnodes 2 --master_addr ${master_addr} --master_port 14545 --node_rank ${node_rank} run_supervised_finetuning.py ... ``` - node_rank 代表节点的rank,第一台机器(主机器)的node_rank设置为0,第二台机器的node_rank设置为1 - nnodes 代表节点机器的数量 - master_addr 代表主机器的ip地址 - master_port 代表与主机器通信的端口号 以上命令在两台机器各执行一次,两台机器的node_rank设置不同。 --- ## File: role_play_data/README.md ## 造训练数据 ### 数据生成框架 本数据集使用LLM API接口生成,支持多种LLM提供商(OpenAI、豆包、[MiniMax](https://platform.minimaxi.com/)等),流程: - **种子特征集和基础设定**: - 手工编写的种子集包含基本角色特征。 - LLM从这个种子集生成角色的基础设定。 - **角色设定的进化**: - 第二个种子集包含指导角色设定进化的指令Prompt。 - 这些进化角色的指令Prompt被放到一个指令池中。基于这些进化Prompt,LLM对基础设定实施进化。 - **反馈循环**: - 由人类评估者和GPT-4组成的混合评价系统。此系统对进化后的设定给出反馈。 - 反馈用于迭代更新种子集。如此迭代,我们最终得到一个细致的角色设定数据集。 - **角色扮演和对话生成**: - 使用self-instruction框架基于角色设定生成角色的对话数据。 1. 生成角色设定,分别生成护士角色和患者角色 ```bash cd role_play_data python role_generate.py ``` 2. 生成医患之间的多轮对话 LLM选择:支持gpt-4o、豆包doubao-character-pro-32k、MiniMax-M3等多种LLM生成对话 ```bash # 使用OpenAI GPT-4o python roleplay_data_generate_gpt4.py # 使用豆包 python roleplay_data_generate_doubao.py # 使用MiniMax(需要设置 MINIMAX_API_KEY 环境变量) export MINIMAX_API_KEY="your_api_key" python roleplay_data_generate_minimax.py # MiniMax支持自定义参数 python roleplay_data_generate_minimax.py --model MiniMax-M2.7 --total 500 --rounds 8 ``` ### 多Provider支持 `llm_client.py` 提供了统一的LLM客户端接口,支持通过环境变量自动检测或手动指定Provider: | Provider | 环境变量 | 默认模型 | API地址 | |----------|---------|---------|---------| | OpenAI | `OPENAI_API_KEY` | gpt-4o | https://api.openai.com/v1 | | 豆包 | `DOUBAO_API_KEY` | doubao-character-pro-32k | https://ark.cn-beijing.volces.com/api/v3 | | MiniMax | `MINIMAX_API_KEY` | MiniMax-M3 | https://api.minimax.io/v1 | ```python from llm_client import create_llm_client # 自动检测(根据环境变量) client, model = create_llm_client() # 指定Provider client, model = create_llm_client(provider="minimax") ```