聊聊ChatGLM-6B医疗数据微调
参考了多个医疗大模型,如扁鹊、灵心等,重新思考了下微调的方案以及数据集的格式;基于ChatGLM/其它LLM整合多种微调方法的非官方实现的框架,审视其数据集格式,以及调试效果,进行微调。
最终基于liucongg/ChatGLM-Finetuning开源框架成功的微调出来我想要的结果。
服务器环境
阿里云PAI平台
开源库下载
在服务器上通过git一键下载即可:


ChatGLM-6B下载
直接在服务器上,通过魔塔社区的sdk下载代码一键下载即可:

我加了一句代码打印出下载地址,然后通过mv命令拷贝到指定路径下。
#模型下载
from modelscope import snapshot_download
model_dir = snapshot_download('ZhipuAI/ChatGLM-6B')
print(model_dir)
指令数据集准备
数据集的格式严格参考开源库的格式,这里的格式直接参考/data/xxx.json数据格式即可。
{"instruction": "一名年龄在70岁的女性,出现了晕厥、不自主颤抖、情绪不稳等症状,请详细说明其手术治疗和术前准备。", "input": "", "output": "该病需要进行电极导线、脉冲发生器和永久心脏起搏器置入术,并需要使用镇静药物和局麻对病人进行手术治疗。术前准备包括1-3天的时间进行术前检查和生活方式的调整。"}
{"instruction": "一个患者的卵巢小细胞癌转移至其它部位,是否有必要进行手术治疗?", "input": "", "output": "当卵巢小细胞癌转移至其它部位时,手术治疗的效果可能不理想,因此一般不推荐进行手术治疗。针对转移病灶,可以采用化疗、放疗等治疗手段进行综合治疗。"}
{"instruction": "一位60岁男性患者由于肝动脉瘤出现肝功能异常,具体表现为黄疸,该如何诊治?", "input": "", "output": "该患者可能出现了肝动脉瘤并发症之一的梗阻性黄疸,需要进行腹部平片、彩色多普勒超声、CTA、动脉造影等检查后确定诊断,治疗方面应按照病因治疗,如若为肝动脉炎、动脉粥样硬化等病因,应该采取手术治疗,而若是单纯的肝动脉瘤,可以进行介入治疗或手术治疗。"}
{"instruction": "患者男,28岁,关节部位红肿疼痛,排尿困难,近期有过微生物感染史。请问可能患的是什么疾病?如何治疗?", "input": "", "output": "可能患有反应性关节炎。治疗方案可以采用沙利度胺、泼尼松等药物。同时还要注意休息和饮食。"}
{"instruction": "一名患者因腹胀、纳差等症状就诊,检查发现肝大、腹水及肝功能损害,诊断为肝淀粉样变性,请问该患者应该接受哪些治疗方案?", "input": "", "output": "该患者应该接受弥漫性系膜硬化、苯丙氨酸氮芥等治疗方案。"}
{"instruction": "治疗方法上有何不同", "input": "", "output": "急性非ST段抬高型心肌梗死的治疗主要是通过改善生活方式和控制危险因素来预防,紧急情况下可能需要静脉注射血栓溶解药物;而自身免疫性肝炎的治疗则包括药物治疗和手术治疗,如激素、免疫抑制剂、肝移植等"}
{"instruction": "一位中年男性感染了军团杆菌,导致出现了弥漫性血管内凝血、充血性心力衰竭等并发症,应该怎样进行辅助检查和诊断?", "input": "", "output": "首先应该做特殊实验室检查和血常规和生化检查,进一步的辅助诊断可考虑X线检查,X线胸片检查、化验检查、血清学检查以及实验室检查等方法。"}
{"instruction": "胆管癌和偏头痛的主要症状有何区别?", "input": "", "output": "胆管癌的主要症状包括黄疸、肝肿大等消化系统症状,而偏头痛的主要症状是头部疼痛。"}
{"instruction": "胡女士出现了黄疸、恶心、呕吐等症状,可能患了什么疾病?", "input": "", "output": "胡女士可能患有胆道张力低下综合征。建议尽快到内科进行检查,并进行西医和中医治疗。"}
{"instruction": "一位妊娠31周孕妇在家中自行服用草药,随后出现呕吐、腹痛、恶心、疲劳、皮肤瘙痒、黄疸等症状,血液检查显示血清转氨酶升高,交叉免疫电泳检测显示未见明显异常。 ", "input": "", "output": "可能是由于在未咨询医生的情况下自行服用草药导致的急性妊娠期肝内胆汁淤积症。建议及时就医,如需紧急治疗可在医生指导下使用胆酸螯合剂、皮质激素等药物,并密切监测胎儿状态与身体其他部位不适情况。"}
开始训练,按文档准备好脚本 run.sh;根据自己的服务器卡数选择即可,修改模型路径,数据集参数即可。

脚本内容:

生成的文件:


合并Lora参数文件
需要将Lora微调后的参数文件与原模型参数文件合并,执行脚本即可。
python merge_lora.py
当然要替换下里面的路径参数。最终生成的参数文件:

推理
执行脚本predict.py文件即可,但里面的代码有些问题,用修改后的即可,同样需要修改路径参数
# -*- coding:utf-8 -*-
# @project: ChatGLM-Finetuning
# @filename: predict
# @author: 刘聪NLP
# @zhihu: https://www.zhihu.com/people/LiuCongNLP
# @contact: logcongcong@gmail.com
# @time: 2023/12/6 20:41
"""
    文件说明:
"""
import argparse
import torch
from model import MODE
import os
# 启用CUDA
os.environ['CUDA_VISIBLE_DEVICES'] = '0'
def parse_args():
    parser = argparse.ArgumentParser()
    # Model
    parser.add_argument("--device", type=str, default="0", help="")
    parser.add_argument("--mode", type=str, default="glm", help="")
    parser.add_argument("--model_path", type=str, default="/mnt/workspace/demos/ChatGLM-Finetuning/output-glm/epoch-2-step-262", help="")
    parser.add_argument("--max_length", type=int, default=500, help="")
    parser.add_argument("--do_sample", type=bool, default=True, help="")
    parser.add_argument("--top_p", type=float, default=0.8, help="")
    parser.add_argument("--temperature", type=float, default=0.8, help="")
    return parser.parse_args()
def predict_one_sample(instruction, input, model, tokenizer, args):
    result, _ = model.chat(tokenizer, instruction + input, max_length=args.max_length, do_sample=args.do_sample,
                           top_p=args.top_p, temperature=args.temperature)
    return result
if __name__ == '__main__':
    args = parse_args()
    model = MODE[args.mode]["model"].from_pretrained(args.model_path, device_map="auto",
                                                     torch_dtype=torch.float16)
    tokenizer = MODE[args.mode]["tokenizer"].from_pretrained(args.model_path)
    instruction = "一位年轻女性患者出现了风团性斑块、丘疹等症状,请问此病可以由哪些科室进行治疗?"
    input = ""
    r = predict_one_sample(instruction, input, model, tokenizer, args)
    print(r)
返回结果:

总结
liucongg/ChatGLM-Finetuning开源库提供了Lora指令微调的方式,其逻辑主要还是编写了一套新的train代码,支持指令的微调。

聊聊ChatGLM-6B医疗数据微调的更多相关文章
- RapidMiner的基本使用(一个医疗数据的简单决策树算法分析)
		RapidMiner的基本使用(一个医疗数据的简单决策树算法分析) RapidMiner的基本使用(一个医疗数据的简单决策树算法分析) 需要分析的文件: 右键分别创建读取excel数据,选择属性,设置 ... 
- 聊聊、Highcharts 动态数据优化版
		好久没来博客园了,最近项目太紧.上一篇写了 <Highcharts 之[动态数据]>,不够完善,虽然横纵轴可以动态取数据,但是行业信息是固定的,不能随着大数据热点改变.废话不说,直接上代码 ... 
- 聊聊、Highcharts 动态数据
		最近项目中需要用到图表,找了几个开源框架,最后选择 Highcharts,原因是 Highcharts 功能强大,稳定,方便,而且开源,社区比较成熟. 首先下载 Highcharts,导入项目. 在 ... 
- Java裸写爬虫技术,运用多线程技术,高效爬取某个医疗机构网站数据
		最近喜欢上了数据的庞大的感觉,就爬取了一下某个医疗机构网站医疗数据,由于数据量庞大,只爬取了江西省的各个市的各个医院的各个科室的各个科室.中各种信息.其中用的持久层技术是hibernate框架,和用到 ... 
- 大数据项目实践:基于hadoop+spark+mongodb+mysql+c#开发医院临床知识库系统
		一.前言 从20世纪90年代数字化医院概念提出到至今的20多年时间,数字化医院(Digital Hospital)在国内各大医院飞速的普及推广发展,并取得骄人成绩.不但有数字化医院管理信息系统(HIS ... 
- Java在处理大数据的时候一些小技巧
		Java在处理大数据的时候一些小技巧 发布时间:2013-05-09 00:00:00 来源:中国IT实验室 作者:佚名 关键字:Java 众所周知,java在处理数据量比较大的时候,加载到内存必 ... 
- JVM运行时数据区域
		上面已经聊过JVM是什么东东,也谈过了JVM内存的垃圾回收机制.这一篇博客我们来聊聊JVM运行时数据区域. JVM运行时数据区域由5块部分组成,分别是堆,方法区,栈,本地方法栈,以及程序计数器组成. ... 
- Java爬网页数据,并存储到本地数据库中
		由于开发一个人工智能项目,需要强大的后台数据库加持,所以,没有办法,又是需要医疗数据,只能自己爬某医疗网站数据,进行分析,但是由于不同网站的结构不一样,所以这个程序只能爬该网站的,第一次爬网页数据,自 ... 
- java+Mysql大数据的一些优化技巧
		众所周知,java在处理数据量比较大的时候,加载到内存必然会导致内存溢出,而在一些数据处理中我们不得不去处理海量数据,在做数据处理中,我们常见的手段是分解,压缩,并行,临时文件等方法; 例如,我们要将 ... 
- 为什么医疗行业需要API市场?
		医疗健康行业无论在国内外都是采用先进技术的先驱者之一,原因在于业内的利益相关者会更加接近数据.重视数据的重要性,从而加快在决策上面的动作,以期更好的患者的预期寿命和增进社会人口的健康.更重要的是,数据 ... 
随机推荐
- java代码实现自动生成数据库表er图
			最近有同事看到字节跳动产品设计文档里有数据库表er图.就想问问又没有现成的工具也给直接生成一个er图,经查找验证发现并没有.因为现在表关系都是用的逻辑外键而非物理外键约束的,所以像navicat等工具 ... 
- 错误:基于tensorflow识别mnist数据集出现ResourceExhaustedError (see above for traceback): OOM when allocating tensor with shape[10000,32,28,28] and type float on
			错误:最近,在尝试运行我以前博客代码的时候出现了如下错误 2020-04-03 10:53:22.982491: W tensorflow/core/common_runtime/bfc_alloca ... 
- clickhouse-备份表结构
			clickhouse导出表结构 #!/bin/bash OUTDIR=/root/backup/ clickhouse-client -q "SHOW DATABASES" > ... 
- 沿SVG路径的颜色渐变
			原生的渐变方法 在SVG中提供的原生渐变方法有两种,分别为线性渐变linearGradient和径向渐变radialGradient.我们以一个稍微复杂的路径来作为模板,为其添加两种渐变效果: < ... 
- JS Leetcode 81. 搜索旋转排序数组 II 题解,补救二分法的可行性
			壹 ❀ 引 今日LeetCode题为153. 寻找旋转排序数组中的最小值,在10个月前,我已在JS leetcode 寻找旋转排序数组中的最小值 题解分析,你不得不了解的二分法一文中写了本题的题解,所 ... 
- mc命令
			mc命令 mc是一个基于字符的目录浏览器和文件管理器,其将熟悉的图形文件管理器和常见的命令行工具联系在一起,mc的设计基于文件管理器中双目录窗格的设计,其中同时显示两个目录的列表,可以执行所有常见的文 ... 
- maven源修改
			<?xml version="1.0" encoding="UTF-8"?> <settings xmlns="http://mav ... 
- Java并发编程实例--4.控制线程打断
			Java提供了InterruptedException异常,当我们检测到线程被打断时可以抛出并在run()方法中进行捕捉. 本例中,我们将开发一个程序以实现根据文件名称在指定文件夹(包括其子目录)中搜 ... 
- C++ std::move 的一些问题
			看 SO 上有一个比较奇怪的问题, When does an rvalue reference result in a move vs copy constructor and why? 问题代码: ... 
- java面向对象之封装-继承-抽象-多态-组合五种概念及用法一网打尽
			说明 曾经在学习java面向对象时,你是否会为面向对象的封装-继承-抽象-多态-组合等各种概念搞得稀里糊涂,乃至反复阅读,背诵其相关概念,结果一段时间过后又还给了时间... 这种经历简直令人发指,让人 ... 
