【免费下载链接】Hulu-Med
A Transparent Generalist Model towards Holistic Medical Vision-Language Understanding
本文介绍 Hulu-Med 的医学视觉-语言评测框架MedUniEval,手把手带你新增一个自定义医学评测基准:只需继承BaseDataset、在 2 个位置完成注册,即可跑通从数据加载、批量推理到指标计算的完整评测流水线,并支持多卡分片加速。
MedUniEval 覆盖了医学文本、2D 图像、3D 体积、医学视频等多种模态,已内置 MedMCQA、MMMU-Medical、VQA_RAD、IU_XRAY 等 20+ 个基准。当你的数据集不在其中时,按本文 3 步即可扩展。
🗂️ 先看架构:MedUniEval 的注册模式长什么样?
MedUniEval 采用"目录 + 注册"模式,核心调用链只有 4 个环节:
| 环节 | 文件 | 职责 |
|---|---|---|
| 入口 | eval.py | 解析参数、初始化模型,循环调用prepare_benchmark |
| 分发注册表 | benchmarks.py | prepare_benchmark按数据集名if/elif分发到对应基准类 |
| 基类 | base_dataset.py | BaseDataset提供批量推理、分片切分、结果合并、指标落盘 |
| 具体基准 | utils/CMB/CMB.py | 每个基准一个子类,实现数据加载、消息构造、指标计算 |
模型侧同样是注册制:LLMs.py 中的LLMRegistry通过@LLMRegistry.register("Hulumed_qwen2")装饰器登记模型,用--model_name一键切换(详见 models/ 目录)。
💡 你要做的,就是照着
CMB/IU_XRAY这类现成基准,新增一个子类,并在两处"登记"它的名字。
🛠️ 第一步:创建你的基准类(继承 BaseDataset)
在 MedUniEval/utils/ 下新建目录(如MyBench/),放入MyBench.py,类名与目录名保持一致。每个基准类需要实现 4 个方法:
from ..base_dataset import BaseDataset from ..utils import save_json, extract, judge_multi_choice from ..question_formats import get_multiple_choice_prompt class MyBench(BaseDataset): def __init__(self, model, dataset_path, output_path): self.model = model self.dataset_path = dataset_path self.output_path = output_path self.samples = [] self.chunk_idx = int(os.environ.get("chunk_idx", 0)) self.num_chunks = int(os.environ.get("num_chunks", 1)) def load_data(self): # ① 加载数据,按分片过滤样本 def construct_messages(self): # ② 为每条样本构造 {"prompt":..., "images":[...]} def cal_metrics(self): # ③ 计算指标,返回 (metrics, out_samples)四个方法要写什么,可直接对照两个典型样例:
- 纯文本选择题(CMB):CMB.py 中
load_data用datasets.load_dataset拉数据,construct_messages调用 question_formats.py 的get_multiple_choice_prompt拼 prompt,cal_metrics用extract+judge_multi_choice判对; - 图像报告生成(IU_XRAY):IU_XRAY.py 中
construct_messages用 PIL 打开图片放进messages["images"],cal_metrics走报告类指标计算(Metrics_Compute/cal_report_metrics.py)。
分片切分小技巧:load_data中加一行if idx % self.num_chunks == self.chunk_idx即可让该基准自动支持多卡分片(见下文),样例写法参考 CMB.py。
📝 第二步:在两处完成注册
这是最容易漏掉的一步,两个文件都要改:
1. 导出类:在 utils/init.py 末尾加一行(仿照 第17行 CMB 的写法):
from .MyBench.MyBench import MyBench2. 加入分发注册表:在 benchmarks.py 的prepare_benchmark中补一个分支(仿照 IU_XRAY 分支),并同步把名字加进supported_dataset列表,避免误报 "unknown eval dataset":
from utils import MyBench # ... elif eval_dataset == "MyBench": dataset = MyBench(model, eval_dataset_path, eval_output_path)🚀 第三步:运行评测
在 MedUniEval/ 目录下执行(参数定义见 eval.py):
python eval.py \ --eval_datasets "MyBench" \ --datasets_path "hf" \ --output_path "./eval_results" \ --model_name "Hulumed_qwen2" \ --model_path "ZJU-AI4H/Hulu-Med-7B"--datasets_path传hf表示从 HuggingFace 下载;传目录名(默认benchmarks)则从本地读取,本地路径为benchmarks/<数据集名>;- 跑完会在输出目录生成
results.json(逐条回答)与metrics.json(指标汇总); - 也可直接改 eval.sh 里的
EVAL_DATASETS再执行。
🎯 进阶:多卡分片并行评测
数据量大时可用 eval_chunked.sh:它按 GPU 数量自动设置num_chunks,每张卡通过环境变量chunk_idx领取自己那份数据(eval.py 第96-97行 写入)。
BaseDataset.eval()(base_dataset.py)会自动处理合并:每个分片先落盘results_<idx>.json,当所有分片齐了再合并成results.json并统一计算metrics.json——你写的cal_metrics无需感知分片逻辑。
✅ 常见坑点清单
- 改了
benchmarks.py忘了utils/__init__.py:会报ImportError,两处注册缺一不可; construct_messages返回格式不对:必须写入sample["messages"]且包含prompt键(多模态再加images),否则run()批量推理(base_dataset.py)无法取到消息;- 指标方法名拼错:基类
eval()调用的是self.cal_metrics,注意是metrics而不是cal_matrics; - 忘记分片过滤:多卡模式下不加
idx % num_chunks == chunk_idx会导致各卡重复推理。
📌 总结
在 MedUniEval 中新增自定义医学评测基准只需记住三句话:继承BaseDataset实现 4 个方法 → 在__init__.py与benchmarks.py两处注册 → 用eval.py或eval_chunked.sh一键运行。整套模式与 CMB、IU_XRAY 等 20+ 内置基准完全一致,照葫芦画瓢即可快速扩展你自己的评测数据集。
【免费下载链接】Hulu-Med
A Transparent Generalist Model towards Holistic Medical Vision-Language Understanding
相关推荐
Ising-Decoder-SurfaceCode-1-Fast:量子纠错领域的革命性表面码解码器
Ising Decoder SurfaceCode 1 Fast:量子纠错领域的革命性表面码解码器 Ising Decoder SurfaceCode 1 Fa
Kube-Vip架构原理揭秘:理解虚拟IP和负载均衡的核心机制
Kube Vip架构原理揭秘:理解虚拟IP和负载均衡的核心机制 Kube Vip是一款为Kubernetes集群提供虚拟IP(VIP)和负载均衡功能的工具,专为
云原生网络与通信终极指南:如何用ESTabBarController快速打造惊艳的自定义TabBar组件库
终极指南:如何用ESTabBarController快速打造惊艳的自定义TabBar组件库 ESTabBarController是一款功能强大的Swift框架,
移动开发UI组件
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考