LLM 微调实战,做自己的 chatgpt ( 一)

本贴最后更新于 570 天前,其中的信息可能已经沧海桑田

最近在做开源 LLM 在医疗垂直领域的 finetune 实验,通过开源项目华佗来总结一下具体的一个 finetune 技术路线。

该项目开源了经过中文医学指令精调/指令微调(Instruct-tuning) 的 LLaMA-7B 模型。通过医学知识图谱和 GPT3.5 API 构建了中文医学指令数据集,并在此基础上对 LLaMA 进行了指令微调,提高了 LLaMA 在医疗领域的问答效果。

1. 环境搭建

下载华佗开源代码

安装依赖包,python 环境建议 3.9+

# 在conda下创建虚拟环境
conda create -n huatuo python==3.9
# 激活环境
conda activate huatuo
# 安装依赖
pip install -r requirements.txt
# 安装的时候会出现git+依赖包安装不上的情况
# 手动下载github zip包,然后上传到服务器,也可以clone GitHub包
# 克隆项目
git clone https://github.com/xxx/xxx.git
# 切换目录
cd xxx
# 从源项目有构建
python setup.py install


2. 权重下载

官方提供了训练好的 LoRA 权重下载,可以通过百度网盘或 Huggingface 下载:

  1. 对 LLaMA 进行指令微调的 LoRA 权重文件
  1. 对 Alpaca 进行指令微调的 LoRA 权重文件

下载 LoRA 权重并解压,解压后的格式如下:

#1.对LLaMA进行指令微调的LoRA权重文件
#基于医学知识库
lora-llama-med/
  - adapter_config.json   # LoRA权重配置文件
  - adapter_model.bin   # LoRA权重文件

#基于医学文献
lora-llama-med-literature/
  - adapter_config.json   # LoRA权重配置文件
  - adapter_model.bin   # LoRA权重文件


#2. 对Alpaca进行指令微调的LoRA权重文件
#基于医学知识库
lora-alpaca-med-alpaca/
  - adapter_config.json   # LoRA权重配置文件
  - adapter_model.bin   # LoRA权重文件

#基于医学知识库和医学文献
lora-alpaca-med-alpaca-alldata/
  - adapter_config.json   # LoRA权重配置文件
  - adapter_model.bin   # LoRA权重文件

3.模型推理实验

./data/infer.json 中提供了一些测试用例,可以替换成其它的数据集,请注意保持格式一致

运行 infer 脚本

#基于医学知识库
bash ./scripts/infer.sh

#基于医学文献
#单轮
bash ./scripts/infer-literature-single.sh

#多轮
bash ./scripts/infer-literature-multi.sh

也可参考 ./scripts/test.sh

4.Finetune

如果想用自己的数据集微调 LLaMA,按照 ./data/llama_data.json 的格式构建自己的数据集

运行 finetune 脚本


bash ./scripts/finetune.sh

5.训练细节

计算资源需求

官方在一张 A100-SXM-80GB 显卡上进行了训练,训练总轮次 10 轮,耗时约 2h17m。batch_size=128 的情况下显存占用在 40G 左右。预计 3090/4090 显卡(24GB 显存)以上显卡可以较好支持,根据显存大小来调整 batch_size。

我使用的是 48G 的 A40,batch_size=64,显存占用 43g,训练 10 轮花了 8 个小时左右。深度时代,拼的就是机器呀。。。

实验过程

超参设置和实验过程可以参考 wandb 的链接:

6.模型效果对比

测试输入 Llama 输出 Alpaca 输出 华佗输出
小张最近感觉身体不适,出现心悸、气促等症状。体检发现心脏扩大、搏动减弱。 问题:小张最近感觉身体不适,出现心悸、气促等症状。体检发现心脏扩大、搏动减弱。 最近,小张一直感觉身体不舒服,有心烦意乱、呼吸急促等症状。体格检查显示心脏增大,肌肉无力。 小张可能患有心肌炎,建议尽快到医院进行检查和治疗。治疗方案包括药物治疗和手术治疗。
麻风病和儿童哮喘的病因是否一致? 儿童哮喘和麻风病的病因是一致,但是儿童哮喘和麻风病的病因不一致 是的,哮喘和儿童喘息有相似的原因。 不一致,麻风病的病因是麻风杆菌感染,而儿童哮喘的病因是喂养不良、吸烟等因素。
一位患者出现了持续性的胀痛和黄疸,经影像学检查后确诊为肝胆管结石病,应该采取哪些治疗方案? 肝胆管结石病患者应该采取哪些治疗方案? 患者应接受手术和化疗相结合的治疗。 针对肝胆管结石病,治疗方案包括手术治疗、药物治疗和辅助治疗等。具体治疗方案需要根据患者的具体情况而定。

7. 问题记录

  1. 环境问题,git+ 依赖安装不上,配置科学上网了也是不行,解决办法在 中已经说明
  2. finetune 的时候重载 checkpoints 会报错模型为空,代码里面调用 peft 的 set_peft_model_state_dict 方法有 bug,最新版的 peft 该方法没有返回值,官方代码也不知道那里 copy 来的。。。
  3. 最后保存模型的时候调用 trainer.train(resume_from_checkpoint=resume_from_checkpoint) 报错,降低 transformer 版本解决,但是保存的权重值和官方有出入,可能官方也没有给全部的训练数据
  4. 体验下来会有重复说话的情况,而且鉴于数据质量,答案也比较差,还需要投喂更多的优质数据
  5. 强依赖训练数据集,几乎是复读机了

参考:

SCIR-HI/Huatuo-Llama-Med-Chinese: Repo for BenTsao [original name: HuaTuo (华驼)], Llama-7B tuned with Chinese medical knowledge. 本草(原名:华驼)模型仓库,基于中文医学知识的 LLaMA 模型指令微调 (github.com)

  • LLAMA
    1 引用
  • ChatGPT
    20 引用 • 26 回帖 • 1 关注
  • 华佗
    1 引用
  • 开源

    Open Source, Open Mind, Open Sight, Open Future!

    407 引用 • 3578 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...