☰
如何在MedUniEval中快速新增自定义医学评测基准:注册模式与BaseDataset开发完整指南
2026/10/16 13:06:24 网站建设 项目流程

【免费下载链接】Hulu-Med

A Transparent Generalist Model towards Holistic Medical Vision-Language Understanding

项目地址:https://gitcode.com/gh_mirrors/hu/Hulu-Med
点击查看免费下载

本文介绍 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.pyprepare_benchmark按数据集名if/elif分发到对应基准类
基类base_dataset.pyBaseDataset提供批量推理、分片切分、结果合并、指标落盘
具体基准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 MyBench

2. 加入分发注册表:在 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

项目地址:https://gitcode.com/gh_mirrors/hu/Hulu-Med
点击查看免费下载

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询