🇨🇳中文 | 🌐English | 📖文档/Docs | 🤖模型/Models
MedicalGPT training medical GPT model with ChatGPT training pipeline, implemantation of Pretraining, Supervised Finetuning, RLHF(Reward Modeling and Reinforcement Learning) and DPO(Direct Preference Optimization).
MedicalGPT 训练医疗大模型,实现了包括增量预训练、有监督微调、RLHF(奖励建模、强化学习训练)和DPO(直接偏好优化)。
[2024/06/11] v2.1版本:支持了 Qwen-2 系列模型,详见Release-v2.1
[2024/04/24] v2.0版本:支持了 Llama-3 系列模型,详见Release-v2.0
[2024/04/17] v1.9版本:支持了 ORPO,详细用法请参照 run_orpo.sh
。详见Release-v1.9
[2024/01/26] v1.8版本:支持微调Mixtral混合专家MoE模型 Mixtral 8x7B。详见Release-v1.8
[2024/01/14] v1.7版本:新增检索增强生成(RAG)的基于文件问答ChatPDF功能,代码chatpdf.py
,可以基于微调后的LLM结合知识库文件问答提升行业问答准确率。详见Release-v1.7
[2023/10/23] v1.6版本:新增RoPE插值来扩展GPT模型的上下文长度;针对LLaMA模型支持了FlashAttention-2和LongLoRA 提出的 $S^2$-Attn;支持了NEFTune给embedding加噪训练方法。详见Release-v1.6
[2023/08/28] v1.5版本: 新增DPO(直接偏好优化)方法,DPO通过直接优化语言模型来实现对其行为的精确控制,可以有效学习到人类偏好。详见Release-v1.5
[2023/08/08] v1.4版本: 发布基于ShareGPT4数据集微调的中英文Vicuna-13B模型shibing624/vicuna-baichuan-13b-chat,和对应的LoRA模型shibing624/vicuna-baichuan-13b-chat-lora,详见Release-v1.4
[2023/08/02] v1.3版本: 新增LLaMA, LLaMA2, Bloom, ChatGLM, ChatGLM2, Baichuan模型的多轮对话微调训练;新增领域词表扩充功能;新增中文预训练数据集和中文ShareGPT微调训练集,详见Release-v1.3
[2023/07/13] v1.1版本: 发布中文医疗LLaMA-13B模型shibing624/ziya-llama-13b-medical-merged,基于Ziya-LLaMA-13B-v1模型,SFT微调了一版医疗模型,医疗问答效果有提升,发布微调后的完整模型权重,详见Release-v1.1
[2023/06/15] v1.0版本: 发布中文医疗LoRA模型shibing624/ziya-llama-13b-medical-lora,基于Ziya-LLaMA-13B-v1模型,SFT微调了一版医疗模型,医疗问答效果有提升,发布微调后的LoRA权重,详见Release-v1.0
[2023/06/05] v0.2版本: 以医疗为例,训练领域大模型,实现了四阶段训练:包括二次预训练、有监督微调、奖励建模、强化学习训练。详见Release-v0.2
基于ChatGPT Training Pipeline,本项目实现了领域模型--医疗行业语言大模型的训练:
Model | Base Model | Introduction |
---|---|---|
shibing624/ziya-llama-13b-medical-lora | IDEA-CCNL/Ziya-LLaMA-13B-v1 | 在240万条中英文医疗数据集shibing624/medical上SFT微调了一版Ziya-LLaMA-13B模型,医疗问答效果有提升,发布微调后的LoRA权重(单轮对话) |
shibing624/ziya-llama-13b-medical-merged | IDEA-CCNL/Ziya-LLaMA-13B-v1 | 在240万条中英文医疗数据集shibing624/medical上SFT微调了一版Ziya-LLaMA-13B模型,医疗问答效果有提升,发布微调后的完整模型权重(单轮对话) |
shibing624/vicuna-baichuan-13b-chat-lora | baichuan-inc/Baichuan-13B-Chat | 在10万条多语言ShareGPT GPT4多轮对话数据集shibing624/sharegpt_gpt4上SFT微调了一版baichuan-13b-chat多轮问答模型,日常问答和医疗问答效果有提升,发布微调后的LoRA权重 |
shibing624/vicuna-baichuan-13b-chat | baichuan-inc/Baichuan-13B-Chat | 在10万条多语言ShareGPT GPT4多轮对话数据集shibing624/sharegpt_gpt4上SFT微调了一版baichuan-13b-chat多轮问答模型,日常问答和医疗问答效果有提升,发布微调后的完整模型权重 |
shibing624/llama-3-8b-instruct-262k-chinese | Llama-3-8B-Instruct-262k | 在2万条中英文偏好数据集shibing624/DPO-En-Zh-20k-Preference上使用ORPO方法微调得到的超长文本多轮对话模型,适用于RAG、多轮对话 |
演示shibing624/vicuna-baichuan-13b-chat模型效果:
具体case见Inference Examples
我们提供了一个简洁的基于gradio的交互式web界面,启动服务后,可通过浏览器访问,输入问题,模型会返回答案。
启动服务,命令如下:
CUDA_VISIBLE_DEVICES=0 python gradio_demo.py --model_type base_model_type --base_model path_to_llama_hf_dir --lora_model path_to_lora_dir
参数说明:
--model_type {base_model_type}
:预训练模型类型,如llama、bloom、chatglm等--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大小,默认不调整requirements.txt
会不时更新以适配最新功能,使用以下命令更新依赖:
git clone https://github.com/shibing624/MedicalGPT
cd MedicalGPT
pip install -r requirements.txt --upgrade
* 估算值
训练方法 | 精度 | 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 |
Training Stage:
Stage | Introduction | Python script | Shell script |
---|---|---|---|
Continue Pretraining | 增量预训练 | pretraining.py | run_pt.sh |
Supervised Fine-tuning | 有监督微调 | supervised_finetuning.py | run_sft.sh |
Direct Preference Optimization | 直接偏好优化 | dpo_training.py | run_dpo.sh |
Reward Modeling | 奖励模型建模 | reward_modeling.py | run_rm.sh |
Reinforcement Learning | 强化学习 | ppo_training.py | run_ppo.sh |
ORPO | 概率偏好优化 | orpo_training.py | run_orpo.sh |
Model Name | Model Size | Target Modules | Template |
---|---|---|---|
Baichuan | 7B/13B | W_pack | baichuan |
Baichuan2 | 7B/13B | W_pack | baichuan2 |
BLOOMZ | 560M/1.1B/1.7B/3B/7.1B/176B | query_key_value | vicuna |
ChatGLM | 6B | query_key_value | chatglm |
ChatGLM2 | 6B | query_key_value | chatglm2 |
ChatGLM3 | 6B | query_key_value | chatglm3 |
Cohere | 104B | q_proj,v_proj | cohere |
DeepSeek | 7B/16B/67B | q_proj,v_proj | deepseek |
InternLM2 | 7B/20B | wqkv | intern2 |
LLaMA | 7B/13B/33B/65B | q_proj,v_proj | alpaca |
LLaMA2 | 7B/13B/70B | q_proj,v_proj | llama2 |
LLaMA3 | 8B/70B | q_proj,v_proj | llama3 |
Mistral | 7B/8x7B | q_proj,v_proj | mistral |
Orion | 14B | q_proj,v_proj | orion |
Qwen | 1.8B/7B/14B/72B | c_attn | qwen |
Qwen1.5 | 0.5B/1.8B/4B/14B/32B/72B/110B | q_proj,v_proj | qwen |
Qwen2 | 0.5B/1.5B/7B/72B | q_proj,v_proj | qwen |
XVERSE | 13B | query_key_value | xverse |
Yi | 6B/34B | q_proj,v_proj | yi |
训练完成后,现在我们加载训练好的模型,验证模型生成文本的效果。
CUDA_VISIBLE_DEVICES=0 python inference.py \
--model_type base_model_type \
--base_model path_to_model_hf_dir \
--tokenizer_path path_to_model_hf_dir \
--lora_model path_to_lora \
--interactive
参数说明:
--model_type {base_model_type}
:预训练模型类型,如llama、bloom、chatglm等--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推理
CUDA_VISIBLE_DEVICES=0,1 torchrun --nproc_per_node 2 inference_multigpu_demo.py --model_type baichuan --base_model shibing624/vicuna-baichuan-13b-chat
shibing624/vicuna-baichuan-13b-chat inference examples:
本项目仅可应用于研究目的,项目开发者不承担任何因使用本项目(包含但不限于数据、模型、代码等)导致的危害或损失。详细请参考免责声明。
MedicalGPT项目代码的授权协议为 The Apache License 2.0,代码可免费用做商业用途,模型权重和数据只能用于研究目的。请在产品说明中附加MedicalGPT的链接和授权协议。
如果你在研究中使用了MedicalGPT,请按如下格式引用:
@misc{MedicalGPT,
title={MedicalGPT: Training Medical GPT Model},
author={Ming Xu},
year={2023},
howpublished={\url{https://github.com/shibing624/MedicalGPT}},
}
项目代码还很粗糙,如果大家对代码有所改进,欢迎提交回本项目,在提交之前,注意以下两点:
tests
添加相应的单元测试python -m pytest
来运行所有单元测试,确保所有单测都是通过的之后即可提交PR。
Thanks for their great work!