XrayGLM: 首个会看胸部X光片的中文多模态医学大模型 | The first Chinese Medical Multimodal Model that Chest Radiographs Summarization.
基于VisualGLM-6B 微调
MiniGPT-4 [1] 在500万全英文数据集(LAION+CC3M+CC12M+SBU)上预训练,并在3200多张高质量图像数 据描述上进行微调。
希望有一个原生支持中文预训练的多 模态模型来支持我们的一些工作
通用领域的多模态大模型风声水起,如MiniGPT-4,然而,此类多模态大模型却很少出现在医学领域的研 究中,阻碍了相关研究发展。
MedCLIP 提出了 X-ray 和配对报告的公开数据集。XrayGPT 基于 MiniGPT-4 的思路训练了一个X-ray的医学多模态模型。
OpenI 一份是来自印第安纳大学医院的胸部 X 光图 像数据集,包含 6,459 张图像和 3,955 份报告。
VisualGLM-6B [1] 是一个开源的,支持图像、中文和英文的多模态对话语言模型,语言模型基 于 ChatGLM-6B,具有 62 亿参数;
图像部分通 过训练 BLIP2-Qformer 构建起视觉模型与语言 模型的桥梁,整体模型共78亿参数。
VisualGLM-6B 依靠来自于 CogView 数据集的 30M高质量中文图文对,与300M经过筛选的 英文图文对进行预训练,中英文权重相同。该 训练方式较好地将视觉信息对齐到ChatGLM的 语义空间;之后的微调阶段,模型在长视觉问 答数据上训练,以生成符合人类偏好的答案。
XrayGLM基于VisualGLM-6B进行微调训练而来。借助ChatGPT构建了一个可用于支持中文训练的X-ray影像- 诊疗报告对。
XrayGLM微调实践
1、克隆XrayGLM repo:
git clone https://github.com/WangRongsheng/XrayGLM.git
2、 安装依赖:
pip install -r requirements.txt
# 国内换源安装依赖
pip install -i https://mirrors.aliyun.com/pypi/simple/ -r requirements.txt
3、准备数据集:
./data/Xray/
├── 1000_1.png
├── 1000_2.png
├── ...
└── openi-zh.json
4、配置训练文件finetune_XrayGLM.sh
5、开启微调训练:
# 报错:CUDA out of memory. Tried to allocate 20.00 MiB (GPU 4; 3.82 GiB total capacity; 2.94 GiB already allocated; 6.62 MiB free; 3.06 GiB reserved in total by PyTorch) If reserved memory is >> allocated memory try setting max_split_size_mb to avoid fragmentation. See documentation for Memory Management and PYTORCH_CUDA_ALLOC_CONF
# 设置CUDA变量,解决直接训练而出现无法正确加载到显卡问题 export CUDA_VISIBLE_DEVICES=0,1,2,3
# 开始训练
bash finetune_XrayGLM.sh
# 训练过程很快,四卡A100训练2-3个小时就可以完成!
6、CLI测试:
python cli_demo.py \
--from_pretrained checkpoints/$fintune_weights$ \ --prompt_zh '详细描述这张胸部X光片的诊断结果'
7、WebUI测试:
python web_demo.py \
--from_pretrained checkpoints/$fintune_weights$
1、不同的prompt构建对于整个模型的回答是否有影响?
{"img": "fewshot-data/pig.png", "prompt": "这张图片的背景里有什么内容?", "label": "这张图片的背景是是虚化的。"},
{"img": "fewshot-data/meme.png", "prompt": "这张图片的背景里有什么内容?", "label": "这张图片的背景是蓝色的木质地板。"},
{"img": "./data/Xray/162_1.png", "prompt": "通过这张胸部光照片,可以诊断出什么?", "label": "根据X射线图像,心脏大小正常,胃部看起来很清晰。已经排除了胃炎、积液、水肿、气胸、腰病、结节或胃块的存在。该发现表明一切正常。
2、大模型训练中,训练的精度(int4,int8,float16…)不是特别重要,模型的参数(6B、13B…) 很影响模型的性能。
3、如果数据多的话可以考虑增加训练的参数,目前的训练脚本只训练了2层lora:
https://github.com/THUDM/VisualGLM-6B/issues/61#issuecomment-1562856845
未来展望
2023-10-03