MedicalGPT:基于LLaMA-13B的中英医疗问答模型(LoRA)、实现包括二次预训练、有监督微调、奖励建模、强化学习训练[LLM:含Ziya-LLaMA]
** 训练医疗大模型,实现包括二次预训练、有监督微调、奖励建模、强化学习训练。
分四阶段训练GPT模型,来自Andrej Karpathy的演讲PDF State of GPT,视频 Video
版本迭代
- V1:发布中文医疗LoRA模型,基于Ziya-LLaMA-13B-v1模型,SFT微调了一版医疗模型,医疗问答效果有提升,发布微调后的LoRA权重,
- V0:以医疗为例,训练领域大模型,实现了四阶段训练:包括二次预训练、有监督微调、奖励建模、强化学习训练。
基于ChatGPT Training Pipeline,本项目实现了领域模型--医疗模型的四阶段训练:
- 第一阶段:PT(Continue PreTraining)增量预训练,在海量领域文档数据上二次预训练GPT模型,以注入领域知识
- 第二阶段:SFT(Supervised Fine-tuning)有监督微调,构造指令微调数据集,在预训练模型基础上做指令精调,以对齐指令意图
- 第三阶段:RM(Reward Model)奖励模型建模,构造人类偏好排序数据集,训练奖励模型,用来对齐人类偏好,主要是"HHH"原则,具体是"helpful, honest, harmless"
- 第四阶段:RL(Reinforcement Learning)基于人类反馈的强化学习(RLHF),用奖励模型来训练SFT模型,生成模型使用奖励或惩罚来更新其策略,以便生成更高质量、更符合人类偏好的文本
1.模型介绍
Model | Base Model | Introduction |
---|---|---|
shibing624/ziya-llama-13b-medical-lora | IDEA-CCNL/Ziya-LLaMA-13B-v1 | 在240万条中英文医疗数据集shibing624/medical上SFT微调了一版Ziya-LLaMA-13B模型,医疗问答效果有提升,发布微调后的LoRA权重 |
1.1 基于LLaMA-13B的中英医疗问答模型(LoRA)
| input_text |predict |
| -------- | -------- |
| 一岁宝宝发烧能吃啥药? | 孩子的身体是很脆弱的,如果不注意保护好自己就会出现各种疾病。有些家长在看到孩子生病后都非常着急,想要立刻给他们用药治疗,但其实并没有那么简单,因为每个人对于药物的敏感度和耐受性都是不同的,所以我们需要根据具体情况来选择合适的方法进行治疗才可以达到最佳效果。1、首先大多数小儿退热药中含有解热镇痛成分阿司匹林或布洛芬等,这类药品虽然副作用较少,但也存在过量使用引起胃肠道损伤甚至消化道溃疡出血的风险;2、还有部分小儿退热药中含有扑尔敏等抗组胺药,它们本身属于处方药,应该严格按照医嘱服用,切勿擅自加减剂量或者延长用药时间; 3、此外,某些小儿退热药中含有维生素 C 及葡萄糖酸钙等营养补充剂,只有当患儿伴随脱水症状(如口渴、尿色深)时才考虑添加,否则容易造成电解质紊乱。 |
在中文开放测试集中的表现优异,继承了两方面的优势:
- 微调训练的底座是 Ziya-LLaMA-13B 模型,是较强的中英文底座模型,
- 微调使用的是高质量 240 万条中英文医疗指令数据集,和多种通用指令数据集,微调后的模型在医疗行业答复能力达到领先水平,在通用问题上的答复能力不弱于 LLaMA-13B。
1.1.1 训练评估结果
training args:
{"per_device_train_batch_size": 8, "per_device_eval_batch_size": 8, "per_gpu_train_batch_size": null, "per_gpu_eval_batch_size": null, "gradient_accumulation_steps": 1, "eval_accumulation_steps": null, "eval_delay": 0, "learning_rate": 2e-05, "weight_decay": 0.0, "adam_beta1": 0.9, "adam_beta2": 0.999, "adam_epsilon": 1e-08, "max_grad_norm": 1.0, "num_train_epochs": 10.0, "max_steps": -1, "lr_scheduler_type": "linear", "warmup_ratio": 0.0, "warmup_steps": 50, "log_level": "passive", "log_level_replica": "warning", "log_on_each_node": true, "logging_dir": "outputs-ziya-llama-13b-sft-med-v2/logs", "logging_strategy": "steps", "logging_first_step": false, "logging_steps": 50, "logging_nan_inf_filter": true, "save_strategy": "steps", "save_steps": 50, "save_total_limit": 3, "save_safetensors": false, "save_on_each_node": false, "no_cuda": false, "use_mps_device": false, "seed": 42, "data_seed": null, "jit_mode_eval": false, "use_ipex": false, "bf16": false, "fp16": true, "fp16_opt_level": "O1", "half_precision_backend": "cuda_amp", "bf16_full_eval": false, "fp16_full_eval": false, "tf32": null, "local_rank": 0, "xpu_backend": null, "tpu_num_cores": null, "tpu_metrics_debug": false, "debug": [], "dataloader_drop_last": false, "eval_steps": 50, "dataloader_num_workers": 0, "past_index": -1, "run_name": "outputs-ziya-llama-13b-sft-med-v2", "disable_tqdm": false, "remove_unused_columns": false, "label_names": null, "load_best_model_at_end": true, "metric_for_best_model": "loss", "greater_is_better": false, "ignore_data_skip": false, "sharded_ddp": [], "fsdp": [], "fsdp_min_num_params": 0, "fsdp_config": { "fsdp_min_num_params": 0, "xla": false, "xla_fsdp_grad_ckpt": false }, "fsdp_transformer_layer_cls_to_wrap": null, "deepspeed": null, "label_smoothing_factor": 0.0, "optim": "adamw_torch", "optim_args": null, "adafactor": false, "group_by_length": false, "length_column_name": "length", "report_to": [ "tensorboard" ], "ddp_find_unused_parameters": false, "ddp_bucket_cap_mb": null, "dataloader_pin_memory": true, "skip_memory_metrics": true, "use_legacy_prediction_loop": false, "push_to_hub": false, "resume_from_checkpoint": null, "hub_model_id": null, "hub_strategy": "every_save", "hub_token": "<hub_token>", "hub_private_repo": false, "gradient_checkpointing": false, "include_inputs_for_metrics": false, "fp16_backend": "auto", "push_to_hub_model_id": null, "push_to_hub_organization": null, "push_to_hub_token": "<push_to_hub_token>", "mp_parameters": "", "auto_find_batch_size": false, "full_determinism": false, "torchdynamo": null, "ray_scope": "last", "ddp_timeout": 1800, "torch_compile": false, "torch_compile_backend": null, "torch_compile_mode": null }
train loss:
evaluate loss:
本项目开源在 github repo:
使用 textgen 库:textgen,可调用 LLaMA 模型:
Install package:
pip install -U textgen
from textgen import GptModel
def generate_prompt(instruction):
return f"""Below is an instruction that describes a task. Write a response that appropriately completes the request.\n\n### Instruction:{instruction}\n\n### Response: """
ziya_model_dir = ""
model = GptModel("llama", ziya_model_dir, peft_)
predict_sentence = generate_prompt("一岁宝宝发烧能吃啥药?")
r = model.predict([predict_sentence])
print(r)
1.1.2 HuggingFace Transformers
Without textgen, you can use the model like this:
First, you pass your input through the transformer model, then you get the generated sentence.
Install package:
pip install transformers
import sys
from peft import PeftModel
from transformers import LlamaForCausalLM, LlamaTokenizer
ziya_model_dir = ""
model = LlamaForCausalLM.from_pretrained(ziya_model_dir, device_map='auto')
tokenizer = LlamaTokenizer.from_pretrained(ziya_model_dir)
model = PeftModel.from_pretrained(model, "shibing624/ziya-llama-13b-medical-lora")
device = "cuda" if torch.cuda.is_available() else "cpu"
def generate_prompt(instruction):
return f"""Below is an instruction that describes a task. Write a response that appropriately completes the request.\n\n### Instruction:{instruction}\n\n### Response: """
sents = ['一岁宝宝发烧能吃啥药', "who are you?"]
for s in sents:
q = generate_prompt(s)
inputs = tokenizer(q, return_tensors="pt")
inputs = inputs.to(device=device)
generate_ids = ref_model.generate(
**inputs,
max_new_tokens=120,
do_sample=True,
top_p=0.85,
temperature=1.0,
repetition_penalty=1.0,
eos_token_id=tokenizer.eos_token_id,
bos_token_id=tokenizer.bos_token_id,
pad_token_id=tokenizer.pad_token_id,
)
output = tokenizer.batch_decode(generate_ids, skip_special_tokens=True)[0]
print(output)
print()
output:
一岁宝宝发烧能吃啥药
孩子的身体是很脆弱的,如果不注意保护好自己就会出现各种疾病。有些家长在看到孩子生病后都非常着急,想要立刻给他们用药治疗,但其实并没有那么简单,因为每个人对于药物的敏感度和耐受性都是不同的,所以我们需要根据具体情况来选择合适的方法进行治疗才可以达到最佳效果。1、首先大多数小儿退热药中含有解热镇痛成分阿司匹林或布洛芬等,这类药品虽然副作用较少,但也存在过量使用引起胃肠道损伤甚至消化道溃疡出血的风险;2、还有部分小儿退热药中含有扑尔敏等抗组胺药,它们本身属于处方药,应该严格按照医嘱服用,切勿擅自加减剂量或者延长用药时间;3、此外,某些小儿退热药中含有维生素C及葡萄糖酸钙等营养补充剂,只有当患儿伴随脱水症状(如口渴、尿色深)时才考虑添加,否则容易造成电解质紊乱。
模型文件组成:
ziya-llama-13b-medical-lora
├── adapter_config.json
└── adapter_model.bin
1.1.3 预测结果
| Human | Assitant|
| -------- | -------- |
| 痤疮是什么原因导致的? | 痤疮,又称青春痘、粉刺。它主要发生在面部和胸背部位,表现为黑头粉刺、白头粉刺、丘疹、脓疱、结节等多种形式。其中以黑头粉刺最常见,约占全身皮肤病患者的70%左右。那么,痤疮是什么原因引起的呢?下面就给大家介绍一些相关内容。1、雄性激素分泌过旺:男女都会长痘痘,但是女孩子比较喜欢用化妆品来掩盖脸上的问题,而且很多人不知道这样做反而加重了自己的毛囊炎症状,所以说平时应该少使用含有雌激素类的产品。2、饮食习惯差:经常吃辛辣油腻的东西或者甜食也可能造成体内毒素堆积,从而诱发痤疮。3、压力太大:如果你总是处于紧张焦虑的情绪之中,同时还没有及时调整好心态,那么很容易出现内分泌失调的情况,进而影响到肌肤健康。4、睡眠质量差:熬夜对我们的身体伤害非常严重,尤其是对于年轻人群更甚,他们需要保证充足的睡眠才行,否则很容易让肌肤变得暗沉无光泽。 |
| 怎么让自己精力充沛,列5点建议 | 1、保证睡眠质量:每天晚上7-8小时的高质量睡眠是提升身体和大脑活跃度最有效的方法。2、合理饮食:均衡营养摄入对于维持人体正常运转至关重要,多吃蔬菜水果,少油腻辛辣刺激性食物。3、适当锻炼:坚持一定强度的锻炼可以促进血液循环,增加肌肉耐力,改善心肺功能等。4、学习新知识:不断接触新事物,开拓视野,思考问题,都会使得我们更具创造力与灵感。5、放松心情:通过冥想或者瑜伽来缓解压力,也可以听音乐或看电影来调节情绪。 |
| 脸上长青春痘怎么办,能吃啥药,需要注意啥 | 你好,根据您的描述考虑是痤疮。建议外用维胺酯乳膏或者阿达帕林凝胶进行治疗看看,平时禁忌辛辣和刺激性食物,如海鲜、狗肉、羊肉等“发”动品,以及葱蒜韭姜等刺激性调料。多喝水,少吃油腻高热量食物。 |
|小孩发烧怎么办 | 宝宝的抵抗力是比较差的,所以很容易就会出现感冒或者其他疾病。如果宝宝在平时没有注意保暖,那么也可能导致身体受凉而引起了感冒等症状,这样不仅对于健康造成影响,还可能让宝宝出现高热的情况。因此当家长们发现自己的宝宝出现了高热的问题之后一定要及早进行治疗和护理才好。
1、首先我们应该给宝宝服用退烧药物来帮助降温,但是千万不要盲目使用退烧药物,否则只会加重宝宝的病情,最好带着宝宝到医院去检查清楚具体原因之后再针对性地采取措施处理。
2、另外大人们也需要做好预防工作,尤其是天气变化的时候更应该多关心下宝宝的身体状态,避免宝宝受寒受凉从而诱发各种疾病,同时也要尽量减少宝宝接触细菌病毒的机会,增强宝宝的免疫力。
3、除了上面两点之外,大人们还可以通过按摩推拿穴位的方式来缓解宝宝的病痛,促进血液循环,提升新陈代谢速度,达到快速消炎止疼的效果 |
1.1.4 训练数据集
- 50 万条中文 ChatGPT 指令 Belle 数据集:BelleGroup/train_0.5M_CN
- 100 万条中文 ChatGPT 指令 Belle 数据集:BelleGroup/train_1M_CN
- 5 万条英文 ChatGPT 指令 Alpaca 数据集:50k English Stanford Alpaca dataset
- 2 万条中文 ChatGPT 指令 Alpaca 数据集:shibing624/alpaca-zh
- 69 万条中文指令 Guanaco 数据集 (Belle50 万条 + Guanaco19 万条):Chinese-Vicuna/guanaco_belle_merge_v1.0
- 240 万条中文医疗数据集 (包括预训练数据和指令微调数据集):shibing624/medical
如果需要训练 ChatGLM/LLAMA/BLOOM 模型,请参考 https://github.com/shibing624/textgen
1.2 姜子牙系列模型
- Ziya-LLaMA-13B-v1.1
- Ziya-LLaMA-13B-v1
- Ziya-LLaMA-7B-Reward
- Ziya-LLaMA-13B-Pretrain-v1
- Ziya-BLIP2-14B-Visual-v1
1.2.1 简介
姜子牙通用大模型 V1 是基于 LLaMa 的 130 亿参数的大规模预训练模型,具备翻译,编程,文本分类,信息抽取,摘要,文案生成,常识问答和数学计算等能力。目前姜子牙通用大模型已完成大规模预训练、多任务有监督微调和人类反馈学习三阶段的训练过程。
The Ziya-LLaMA-13B-v1 is a large-scale pre-trained model based on LLaMA with 13 billion parameters. It has the ability to perform tasks such as translation, programming, text classification, information extraction, summarization, copywriting, common sense Q&A, and mathematical calculation. The Ziya-LLaMA-13B-v1 has undergone three stages of training: large-scale continual pre-training (PT), multi-task supervised fine-tuning (SFT), and human feedback learning (RM, PPO).
- 软件依赖
pip install torch==1.12.1 tokenizers==0.13.3 git+https://github.com/huggingface/transformers
1.2.2 模型信息 Model Information
- 继续预训练 Continual pretraining
原始数据包含英文和中文,其中英文数据来自 openwebtext、Books、Wikipedia 和 Code,中文数据来自清洗后的悟道数据集、自建的中文数据集。在对原始数据进行去重、模型打分、数据分桶、规则过滤、敏感主题过滤和数据评估后,最终得到 125B tokens 的有效数据。
为了解决 LLaMA 原生分词对中文编解码效率低下的问题,我们在 LLaMA 词表的基础上增加了 7k + 个常见中文字,通过和 LLaMA 原生的词表去重,最终得到一个 39410 大小的词表,并通过复用 Transformers 里 LlamaTokenizer 来实现了这一效果。
在增量训练过程中,我们使用了 160 张 40GB 的 A100,采用 2.6M tokens 的训练集样本数量和 FP 16 的混合精度,吞吐量达到 118 TFLOP per GPU per second。因此我们能够在 8 天的时间里在原生的 LLaMA-13B 模型基础上,增量训练 110B tokens 的数据。
训练期间,虽然遇到了机器宕机、底层框架 bug、loss spike 等各种问题,但我们通过快速调整,保证了增量训练的稳定性。我们也放出训练过程的 loss 曲线,让大家了解可能出现的问题。
1.2.3多任务有监督微调 Supervised finetuning
在多任务有监督微调阶段,采用了课程学习(curiculum learning)和增量训练(continual learning)的策略,用大模型辅助划分已有的数据难度,然后通过 “Easy To Hard” 的方式,分多个阶段进行 SFT 训练。
SFT 训练数据包含多个高质量的数据集,均经过人工筛选和校验:
- Self-Instruct 构造的数据(约 2M):BELLE、Alpaca、Alpaca-GPT4 等多个数据集
- 内部收集 Code 数据(300K):包含 leetcode、多种 Code 任务形式
- 内部收集推理 / 逻辑相关数据(500K):推理、申论、数学应用题、数值计算等
- 中英平行语料(2M):中英互译语料、COT 类型翻译语料、古文翻译语料等
- 多轮对话语料(500K):Self-Instruct 生成、任务型多轮对话、Role-Playing 型多轮对话等
在多任务学习的监督微调(SFT)阶段,我们使用了课程学习和增量训练策略。我们利用大模型辅助对现有数据进行难度划分,然后采用“由易到难”的方法分阶段进行SFT训练。
SFT训练数据由多个人工选择和验证的高质量数据集组成,包括BELLE、Alpaca和Alpaca- gpt4等数据集的约200万样本,包括LeetCode和各种代码任务在内的内部采集代码数据的30万样本,推理、议论文、数学应用问题和数值计算等内部采集推理/逻辑相关数据的50万样本。200万个汉英平行语料库样本,包括翻译、cot式翻译、文言文翻译;50万个多回合对话语料库样本,包括自主生成、任务导向多回合对话、角色扮演多回合对话。
1.2.4 人类反馈学习 Human-Feedback training
为了进一步提升模型的综合表现,使其能够充分理解人类意图、减少 “幻觉” 和不安全的输出,基于指令微调后的模型,进行了人类反馈训练(Human-Feedback Training,HFT)。在训练中,我们采用了以人类反馈强化学习(RM、PPO)为主,结合多种其他手段联合训练的方法,手段包括人类反馈微调(Human-Feedback Fine-tuning,HFFT)、后见链微调(Chain-of-Hindsight Fine-tuning,COHFT)、AI 反馈(AI Feedback)和基于规则的奖励系统(Rule-based Reward System,RBRS)等,用来弥补 PPO 方法的短板,加速训练。
我们在内部自研的框架上实现了 HFT 的训练流程,该框架可以利用最少 8 张 40G 的 A100 显卡完成 Ziya-LLaMA-13B-v1 的全参数训练。在 PPO 训练中,我们没有限制生成样本的长度,以确保长文本任务的奖励准确性。每次训练的总经验池尺寸超过 100k 样本,确保了训练的充分性。
1.2.5 效果评估 Performance
2.Demo展示
- Hugging Face Demo: doing
我们提供了一个简洁的基于gradio的交互式web界面,启动服务后,可通过浏览器访问,输入问题,模型会返回答案。
启动服务,命令如下:
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相同--use_cpu
: 仅使用CPU进行推理--gpus {gpu_ids}
: 指定使用的GPU设备编号,默认为0。如使用多张GPU,以逗号分隔,如0,1,2
2.1 环境安装
- Updating the requirements
From time to time, therequirements.txt
changes. To update, use this command:
git clone https://github.com/shibing624/MedicalGPT
conda activate gpt
cd MedicalGPT
pip install -r requirements.txt --upgrade
2.2 Pipeline训练
Training Stage:
Stage | Introduction | Python script | Shell script |
---|---|---|---|
Stage 1: Continue Pretraining | 增量预训练 | pretraining.py | run_pt.sh |
Stage 2: Supervised Fine-tuning | 有监督微调 | supervised_finetuning.py | run_sft.sh |
Stage 3: Reward Modeling | 奖励模型建模 | reward_modeling.py | run_rm.sh |
Stage 4: Reinforcement Learning | 强化学习 | rl_training.py | run_rl.sh |
- 提供完整四阶段串起来训练的pipeline:run_training_pipeline.ipynb ,其对应的colab: ,运行完大概需要15分钟,我运行成功后的副本colab:
- 训练细节说明wiki
2.3 模型支持
The following models are tested:
bloom:
llama:
- shibing624/chinese-alpaca-plus-7b-hf
- shibing624/chinese-alpaca-plus-13b-hf
- minlik/chinese-llama-plus-7b-merged
- shibing624/chinese-llama-plus-13b-hf
- decapoda-research/llama-7b-hf
- IDEA-CCNL/Ziya-LLaMA-13B-v1
chatglm:
baichuan:
2.4 模型训练
2.4.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:
cd scripts
sh run_pt.sh
- 如果你的显存不足,可以改小batch_size=1, block_size=512(影响训练的上下文最大长度);
- 如果你的显存更大,可以改大block_size=2048, 此为llama原始预训练长度,不能更大啦;调大batch_size。
2.4.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
cd scripts
sh run_sft.sh
2.4.3 RM(Reward Model)奖励模型建模
第三阶段: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:
cd scripts
sh run_rm.sh
2.4.4 基于人类反馈的强化学习(RLHF)
第四阶段:RL(Reinforcement Learning)基于人类反馈的强化学习(RLHF)
RL(Reinforcement Learning)模型的目的是最大化奖励模型的输出,基于上面步骤,我们有了微调的语言模型(llama-7b-sft)和奖励模型(llama-7b-reward),
可以开始执行 RL 循环了。
这个过程大致分为三步:
- 输入prompt,模型生成答复
- 用奖励模型来对答复评分
- 基于评分,进行一轮策略优化的强化学习(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
pip install git+https://github.com/lvwerra/trl
cd scripts
sh run_rl.sh
2.5 推理预测
训练完成后,现在我们加载训练好的模型,验证模型生成文本的效果。
python inference.py \
--model_type base_model_type \
--base_model path_to_llama_hf_dir \
--lora_model path_to_lora \
--with_prompt \
--interactive
参数说明:
--model_type {base_model_type}
:预训练模型类型,如llama、bloom、chatglm等--base_model {base_model}
:存放HF格式的LLaMA模型权重和配置文件的目录--lora_model {lora_model}
:LoRA解压后文件所在目录,也可使用HF Model Hub模型调用名称。如果已经合并了LoRA权重到预训练模型,则可以不提供此参数--tokenizer_path {tokenizer_path}
:存放对应tokenizer的目录。若不提供此参数,则其默认值与--base_model相同--with_prompt
:是否将输入与prompt模版进行合并。如果加载Alpaca模型,请务必启用此选项!--interactive
:以交互方式启动,以便进行多次单轮问答--data_file {file_name}
:非交互方式启动下,按行读取file_name中的的内容进行预测--predictions_file {file_name}
:非交互式方式下,将预测的结果以json格式写入file_name--use_cpu
: 仅使用CPU进行推理--gpus {gpu_ids}
: 指定使用的GPU设备编号,默认为0。如使用多张GPU,以逗号分隔,如0,1,2
2.5.1 推理样例
shibing624/ziya-llama-13b-medical-lora inference examples:
Human | Assitant |
---|---|
小孩发烧怎么办 | 宝宝的抵抗力是比较差的,所以很容易就会出现感冒或者其他疾病。如果宝宝在平时没有注意保暖,那么也可能导致身体受凉而引起了感冒等症状,这样不仅对于健康造成影响,还可能让宝宝出现高热的情况。因此当家长们发现自己的宝宝出现了高热的问题之后一定要及早进行治疗和护理才好。<br/>1、首先我们应该给宝宝服用退烧药物来帮助降温,但是千万不要盲目使用退烧药物,否则只会加重宝宝的病情,最好带着宝宝到医院去检查清楚具体原因之后再针对性地采取措施处理。<br/>2、另外大人们也需要做好预防工作,尤其是天气变化的时候更应该多关心下宝宝的身体状态,避免宝宝受寒受凉从而诱发各种疾病,同时也要尽量减少宝宝接触细菌病毒的机会,增强宝宝的免疫力。<br/>3、除了上面两点之外,大人们还可以通过按摩推拿穴位的方式来缓解宝宝的病痛,促进血液循环,提升新陈代谢速度,达到快速消炎止疼的效果 |
一岁宝宝发烧能吃啥药? | 孩子的身体是很脆弱的,如果不注意保护好自己就会出现各种疾病。有些家长在看到孩子生病后都非常着急,想要立刻给他们用药治疗,但其实并没有那么简单,因为每个人对于药物的敏感度和耐受性都是不同的,所以我们需要根据具体情况来选择合适的方法进行治疗才可以达到最佳效果。<br/>1、首先大多数小儿退热药中含有解热镇痛成分阿司匹林或布洛芬等,这类药品虽然副作用较少,但也存在过量使用引起胃肠道损伤甚至消化道溃疡出血的风险;<br/>2、还有部分小儿退热药中含有扑尔敏等抗组胺药,它们本身属于处方药,应该严格按照医嘱服用,切勿擅自加减剂量或者延长用药时间;<br/>3、此外,某些小儿退热药中含有维生素C及葡萄糖酸钙等营养补充剂,只有当患儿伴随脱水症状(如口渴、尿色深)时才考虑添加,否则容易造成电解质紊乱。 |
肛门病变可能是什么疾病的症状 | 痔疮、直肠息肉等。 |
医生,您好白带增多泛黄怎么回事? | 你这种情况考虑可能会是阴道炎症引起的建议平时留意卫生清洁,勤换洗衣物内裤,必要时去正规公立医院妇科复诊做分泌物常规等相关检查明确病因后对症治疗,不同原因所致的疾病在临床表现上也存在差异性,如果患者出现了类似于的症状应当及早到专业、权威的医院进行详细的检验和救治 |
药流后有巧克力白带是没流干净吗 | 在日常生活中,我们要或多或少了解一些常见疾病的相关知识,不仅能起到增加知识水平的作用,更能让自己更好地预防此类疾病的产生。很多女性都会出现月经紊乱、腹痛等症状,这时候就需要考虑妇科炎症可能,比如说宫颈糜烂和盆腔积液。那么下面小编来给大家介绍一种情况:药物流产后白带呈巧克力色怎么回事?<br/>1、首先,对于药物流产之后发现阴道分泌物异常,应该及时去医院做检查确诊具体原因,然后再根据结果进行治疗调理。<br/>2、其次,由于每个人身体素质以及患病程度存在差别,所以采取的措施也不尽相同,但无论选择哪种方式处理,都必须严格按照规定剂量服用,并且注意观察副作用反映情况,若出现明显不适感觉,则应立即停止使用。<br/>3、最后,建议你保持外阴清洁卫生,勤换内裤,避免吃辛辣刺激食品,而且还要禁忌房事,否则容易引起交叉感染影响恢复健康。 |
维胺酯维E乳膏能治理什么疾病 | 皮肤淀粉样变性;脂溢性角化症 |
痤疮是什么原因导致的? | 痤疮,又称青春痘、粉刺。它主要发生在面部和胸背部位,表现为黑头粉刺、白头粉刺、丘疹、脓疱、结节等多种形式。其中以黑头粉刺最常见,约占全身皮肤病患者的70%左右。那么,痤疮是什么原因引起的呢?下面就给大家介绍一些相关内容。<br/>1、雄性激素分泌过旺:男女都会长痘痘,但是女孩子比较喜欢用化妆品来掩盖脸上的问题,而且很多人不知道这样做反而加重了自己的毛囊炎症状,所以说平时应该少使用含有雌激素类的产品。<br/>2、饮食习惯差:经常吃辛辣油腻的东西或者甜食也可能造成体内毒素堆积,从而诱发痤疮。<br/>3、压力太大:如果你总是处于紧张焦虑的情绪之中,同时还没有及时调整好心态,那么很容易出现内分泌失调的情况,进而影响到肌肤健康。<br/>4、睡眠质量差:熬夜对我们的身体伤害非常严重,尤其是对于年轻人群更甚,他们需要保证充足的睡眠才行,否则很容易让肌肤变得暗沉无光泽。 |
脸上长青春痘怎么办,能吃啥药,需要注意啥 | 你好,根据您的描述考虑是痤疮。建议外用维胺酯乳膏或者阿达帕林凝胶进行治疗看看,平时禁忌辛辣和刺激性食物,如海鲜、狗肉、羊肉等“发”动品,以及葱蒜韭姜等刺激性调料。多喝水,少吃油腻高热量食物。 |
由于输精管堵塞会不会导致男性不育?,医生您好,我同事这几天不开心,我问她怎么了,她说她老公输精管堵塞,所以一直没孩子,不是不想要,请问输精管堵塞会不会导致男性不育? | 你好!根据你的叙述及症状推测:如果有输精管阻塞或者狭窄等情况都可能会引来无法排出来精液而影响怀上。建议到正规专业的快孕医院实施进行咨询和治疗为宜。对于输精管患者来说,及时救治是可以减低病发,如果不及时救治会影响到受孕情况。因此患者要及时药物救治,并且日常生活中要多看重自身护理 |
心肌梗塞能治疗吗? | 心脏病是一种危害性极大的疾病,我们要对它有足够多的了解。在生活中很多人都会患上这个疾病,而且还不知道怎么去预防和护理,所以就导致自己的身体越来越差,那么下面小编给你介绍几点关于心脏病的常识吧!<br/>1、冠状动脉粥样硬化性心脏病:又称为冠心病或缺血型心脏病(IHD),是世界各地最重要的死亡原因之一。<br/>2、风湿热:主要侵犯心脏瓣膜,可引起二尖瓣狭窄及其他类型的心脏瓣膜病变;<br/>3、先天性心脏病:包括房间隔缺损、室间隔缺损等;<br/>4、高脂蛋白血症:由于胆固醇与低密度脂蛋白升高,使得动脉壁增厚,管腔缩小,易形成斑块并脱落造成急性栓塞;<br/>5、肥胖:过量摄入食物,特别是含糖饮料,加速脂肪堆积,促进动脉粥样硬化发展;<br/>6、吸烟:尼古丁刺激交感神经兴奋,使外周阻力增强,收缩压升高,舒张期减短,从而降低左右心室射血分数,诱发心律失常;<br/>7、酗酒:长期嗜酒者,肝功受到影响,代谢紊乱,容易出现脂质代谢异常。 |
怎么让自己精力充沛,列5点建议 | 1、保证睡眠质量:每天晚上7-8小时的高质量睡眠是提升身体和大脑活跃度最有效的方法。<br/>2、合理饮食:均衡营养摄入对于维持人体正常运转至关重要,多吃蔬菜水果,少油腻辛辣刺激性食物。<br/>3、适当锻炼:坚持一定强度的锻炼可以促进血液循环,增加肌肉耐力,改善心肺功能等。<br/>4、学习新知识:不断接触新事物,开拓视野,思考问题,都会使得我们更具创造力与灵感。<br/>5、放松心情:通过冥想或者瑜伽来缓解压力,也可以听音乐或看电影来调节情绪。 |
写个春天的诗 | 春风吹拂,花儿绽放。<br/>阳光明媚,鸟语鸣叫。<br/>树木抽芽,草地变绿。<br/>万物复苏,生机勃发。 |
南极洲为啥没有北极熊? | 南极是世界上最大的冰盖,覆盖着98%以上的地球表面积。它位于南纬60度至74度之间,环绕在海洋中心周围。由于其独特的气候条件和生态系统,南极被称为“真正的荒野”。南极洲拥有丰富多样的动植物资源,但这里并不存在北极熊。 <br/>那么,为什么南极洲没有北极熊呢?<br/>首先,我们需要了解一下两者栖息地的差异。北极熊主要分布在北半球寒冷的高纬度地区,如加拿大、格陵兰岛等地。而南极洲则处于南半球,属于温带或寒带气候类型。虽然南极洲也有很低的平均气温(-25℃左右),但与北极相比还是太热了。因此,即使北极熊能够适应更严酷的气候条件,它们也无法在南极找到合适的栖息地。<br/>另外,南极洲缺乏陆地哺乳动物食物来源,包括鱼类、鲸鱼和企鹅等。尽管南极洲的水域中也有各种鱼类,但数量远少于北极圈内。<br/>同时,南极洲的土著居民——企鹅群体繁殖季节期间会消耗掉大部分可用的食物资源,导致当地的鱼类数量减少甚至枯竭。 |
3.数据集
3.1 医疗数据集
- 240万条中文医疗数据集(包括预训练、指令微调和奖励数据集):shibing624/medical
- 22万条中文医疗对话数据集(华佗项目):FreedomIntelligence/HuatuoGPT-sft-data-v1
3.2 通用数据集
3.2.1 SFT datasets
- 50万条中文ChatGPT指令Belle数据集:BelleGroup/train_0.5M_CN
- 100万条中文ChatGPT指令Belle数据集:BelleGroup/train_1M_CN
- 5万条英文ChatGPT指令Alpaca数据集:50k English Stanford Alpaca dataset
- 2万条中文ChatGPT指令Alpaca数据集:shibing624/alpaca-zh
- 69万条中文指令Guanaco数据集(Belle50万条+Guanaco19万条):Chinese-Vicuna/guanaco_belle_merge_v1.0
- 5万条英文ChatGPT多轮对话数据集:RyokoAI/ShareGPT52K
- 80万条中文ChatGPT多轮对话数据集:BelleGroup/multiturn_chat_0.8M
- 116万条中文ChatGPT多轮对话数据集:fnlp/moss-002-sft-data
3.2.2 Reward Model datasets
- 原版的oasst1数据集:OpenAssistant/oasst1
- 2万条多语言oasst1的reward数据集:tasksource/oasst1_pairwise_rlhf_reward
- 11万条英文hh-rlhf的reward数据集:Dahoas/full-hh-rlhf
- 9万条英文reward数据集(来自Anthropic's Helpful Harmless dataset):Dahoas/static-hh
- 7万条英文reward数据集(来源同上):Dahoas/rm-static
- 7万条繁体中文的reward数据集(翻译自rm-static)liswei/rm-static-m2m100-zh
- 7万条英文Reward数据集:yitingxie/rlhf-reward-datasets
- 3千条中文知乎问答偏好数据集:liyucheng/zhihu_rlhf_3k
更多优质内容请关注公号:汀丶人工智能;会提供一些相关的资源和优质文章,免费获取阅读。