在图像生成和编辑模型的评测中,如何高效地同时评测多个模型与多个 benchmark 一直是一个难点。传统做法往往需要为每个模型与每个 benchmark 单独编写脚本,流程分散、维护成本高。
为了解决这一问题,我们开发了 GenEditEvalKit —— 一个通用的图像生成和编辑模型评测工具包。它提供统一的评测入口与配置方式,支持多模型、多 benchmark 的并行评测,并提供简单易扩展的接口,方便你添加新的模型和 benchmark。该工具包也可用于评测理解生成一体化模型(UMMs)。
-
多模型 × 多 benchmark 统一评测
- 相比传统脚本通常只能评测「单模型 × 单 benchmark」的组合,GenEditEvalKit 支持在一次运行中同时评测多个模型在多个 benchmark 上的表现;
- 无需为每个组合单独写脚本,在不改代码的前提下即可灵活切换和组合模型 / benchmark,大幅降低评测脚本的维护成本、提升整体评测效率。
-
并行评测与资源利用
- 支持并行运行多个评测任务,充分利用 GPU / CPU 等计算资源,显著缩短整体评测时间;
- 并行度可以按硬件条件灵活配置,以在「吞吐量」与「单次评测显存占用」之间做权衡。
-
易扩展的模块化与注册式框架
- 模型与 benchmark 均采用模块化 + 注册式管理,方便在现有框架上快速扩展;
- 集成新模型时,只需按照统一接口实现模型调用逻辑,并在指定位置完成注册,即可纳入统一推理流程;
- 集成新 benchmark 时,只需实现对应的数据集类和评测脚本并完成注册,无需改动核心调度逻辑,即可接入完整的「推理 + 评测」流水线。
-
统一的结果输出与日志管理
- 对不同 benchmark 的模型评测结果和日志采用统一的目录结构组织;
- 支持按「模型 × benchmark」快速定位推理输出与评测指标,方便后续对比分析、可视化和问题排查。
-
已集成多个生成和编辑的 Benchmark
- 目前已集成 12 个生成 benchmark 和 4 个编辑 benchmark,下载仓库后可直接使用
- 编辑 benchmark 通常包含输入图片,导致体积较大。为控制仓库大小,仅保留体积较小的 imgedit 作为参考实现。用户可基于此自行部署其他编辑 benchmark
- 后续我们将持续补充新 benchmark,也欢迎社区贡献(PR)
| T2I Benchmark | Original Repository |
|---|---|
dpgbench | TencentQQGYLab/ELLA |
genai | BaiqiL/GenAI-Bench |
geneval | djghosh13/geneval |
geneval2 | facebookresearch/GenEval2 |
genexam | OpenGVLab/GenExam |
hpsv2 | tgxs002/HPSv2 |
longtext | X-Omni-Team/X-Omni |
oneig | OneIG-Bench/OneIG-Benchmark |
t2ireasonbench | KaiyueSun98/T2I-ReasonBench |
tiff | A113N-W3I/TIIF-Bench |
unigenbench | CodeGoat24/UniGenBench |
wise | PKU-YuanGroup/WISE |
| Editing Benchmark | Original Repository |
|---|---|
imgedit | PKU-YuanGroup/ImgEdit |
krisbench | mercurystraw/Kris_Bench |
risebench | PhoenixZ810/RISEBench |
wiseedit | beepkh/WiseEdit |
下面给出一个可直接运行的示例:通过 OpenAI API 兼容接口直接评测 GPT-Image-1.5 在 Imgedit 上的表现
在执行命令前,请确保在 config.sh 中完成以下配置:
- API 配置:填写
API_KEY(如使用自定义网关,还需填写BASE_URL)。 - 路径配置:填写
CONDA_BASE为你的 conda 安装路径。 - 环境映射:在
INFER_ENV_MAP中为gpt-image-1.5指定环境(需安装openai库和Pillow库),在EVAL_ENV_MAP中为imgedit指定环境(需通过pip install -r requirements/benchmark/edit/imgedit.txt配置)。
bash eval.sh --model_names "gpt-image-1.5" --ds_names "imgedit" --use_api true --num_workers 4 --infer true --eval true请根据你计划评测的模型和 benchmark,在 requirements/ 目录下找到对应的环境依赖文件,并创建相应的环境。例如,假设你需要评测的模型是 Bagel,benchmark 是 GenEval,则可以执行:
pip install -r requirements/model/bagel.txt
pip install -r requirements/benchmark/t2i/geneval.txt注:上述 requirements.txt 我们已尽量与原始模型或 benchmark 仓库中的依赖文件保持一致,但原始文件本身可能存在问题。若出现安装或运行报错,请根据具体情况灵活调整依赖或版本。
在运行主评测脚本 eval.sh 前,推荐先在 config.sh 中完成参数配置。
此外,部分参数除了在 config.sh 中配置外,也还可以通过命令行参数临时覆盖。具体可以参照下文的说明。
下表为 config.sh 中的主要参数及其含义,并标明是否支持被命令行覆盖:
| 参数名 | 是否支持命令行覆盖 | 说明 | 示例 |
|---|---|---|---|
DS_NAMES |
✅ 支持 | 需要评测的 benchmark 名称列表。多个 benchmark 使用空格分隔。若通过命令行传入 --ds_names,则命令行配置会覆盖此处设置。 |
DS_NAMES=('genai' 'wiseedit') |
MODEL_NAMES |
✅ 支持 | 需要评测的模型名称列表。多个模型使用空格分隔。若通过命令行传入 --model_names,则命令行配置会覆盖此处设置。 |
MODEL_NAMES=('bagel' 'qwen-image') |
CUSTOM_MODEL_KWARGSES |
✅ 支持 | 为每个模型传递自定义参数,用分号分隔。 | --custom_model_kwargses "p1=v1;p2=v2" |
USE_API |
✅ 支持 | 推理阶段是否使用 API。 | --use_api true |
NUM_WORKERS |
✅ 支持 | API 推理的并发数,当且仅当 USE_API=true 时生效。 |
--num_workers 4 |
PARALLEL |
✅ 支持 | 是否开启多模型 × 多 benchmark 组合的并行评测。true 可提升整体吞吐,但要求显存较为充足。可被命令行参数 --parallel 覆盖。 |
--parallel true |
ENABLE_INFER |
✅ 支持 | 是否执行推理阶段(生成图片)。若输出目录下已存在推理结果,可设为 false,仅执行评测阶段。可被命令行参数 --infer 覆盖。 |
ENABLE_INFER=true |
ENABLE_EVAL |
✅ 支持 | 是否执行评测阶段(计算指标)。可被命令行参数 --eval 覆盖。 |
ENABLE_EVAL=true |
API_KEY |
❌ 不支持 | 评测时调用部分需要 API 的 benchmark 所用的密钥。当前只能在 config.sh 中设置,不支持命令行覆盖。 |
API_KEY="your_api_key_here" |
BASE_URL |
❌ 不支持 | 调用评测所依赖 API 的 base url,同样只能在 config.sh 中进行配置。 |
BASE_URL="https://api.openai.com/v1" |
CONDA_BASE |
❌ 不支持 | conda 安装路径,用于在各评测脚本中定位到对应环境的 python。 |
CONDA_BASE="/path/to/miniconda3" |
CUDA_BASE |
❌ 不支持 | CUDA 安装根路径,用于部分脚本中手动指定 CUDA 版本。 | CUDA_BASE="/path/to/cuda" |
TORCH_HOME |
❌ 不支持 | PyTorch 模型缓存目录。 | TORCH_HOME="/path/to/.cache/torch" |
HF_HOME |
❌ 不支持 | HuggingFace 总缓存目录,评测相关模型会缓存到此处。 | HF_HOME="/path/to/GenEditEvalKit/.cache/huggingface" |
TRANSFORMERS_CACHE |
❌ 不支持 | Transformers 缓存目录,通常设为 ${HF_HOME}/hub。 |
TRANSFORMERS_CACHE="$HF_HOME/hub" |
HF_HUB_OFFLINE |
❌ 不支持 | 是否启用 HuggingFace 离线模式。1 表示完全离线(不再联网下载),0 表示允许联网下载。 |
HF_HUB_OFFLINE=1 |
TRANSFORMERS_OFFLINE |
❌ 不支持 | 是否启用 Transformers 离线模式,语义同 HF_HUB_OFFLINE。 |
TRANSFORMERS_OFFLINE=1 |
INFER_ENV_MAP |
❌ 不支持 | 推理阶段模型名到 conda 环境名的映射。key 为模型名称,value 为该模型使用的推理环境名。目前只能在 config.sh 中配置。 |
INFER_ENV_MAP=(['bagel']='bagel-env' ['qwen-image']='qwen-image-env') |
EVAL_ENV_MAP |
❌ 不支持 | 评测阶段 benchmark 名称到 conda 环境名的映射。部分 benchmark 需要设置多个环境,此时建议以空格分隔。 | EVAL_ENV_MAP=(['genai']='yph-genai' ['wiseedit']='yph-risebench') |
EVAL_GPU_MAP |
❌ 不支持 | 各 benchmark 在 评测阶段 需要使用的 GPU 数量。key 为 benchmark 名称,value 为 GPU 数;0 表示不占用 GPU(如纯 API 评测)。主要用于提前告知调度系统(如 srun 等)所需的 GPU 数。 |
EVAL_GPU_MAP=(['genai']=1 ['gedit']=0 ['cvtg']=1) |
GENERATE_BLANK_IMAGE_ON_ERROR |
❌ 不支持 | 推理阶段若出现异常,是否自动生成空白图片占位,以避免单条数据失败导致整轮评测中断。仅在 config.sh 中配置。 |
GENERATE_BLANK_IMAGE_ON_ERROR=false |
说明:
- 「支持命令行覆盖」表示:若在命令行中传入相应参数(如
--ds_names genexam/--model_names intenvl-u等),则优先使用命令行配置,忽略config.sh中对应项;- 其余参数均需通过直接修改
config.sh的方式来修改。
整体配置优先级如下:
-
config.sh:- 提供默认配置,适合相对固定、日常使用的评测场景;
- 建议将常用的模型 / benchmark / 环境映射等长期设置放在这里。
-
命令行参数:
- 用于临时修改评测范围(如只想跑某几个模型或某几个 benchmark);
- 仅对支持覆盖的参数生效:
ds_names、model_names、infer、eval。
当同一个参数在两处都设置时,命令行参数优先级更高,会覆盖 config.sh 中对应项。
示例:
config.sh中:DS_NAMES=('genai' 'wiseedit')
- 命令行中:
--ds_names "wiseedit;gedit"
则本次运行实际评测的 benchmark 为:wiseedit 与 gedit。
在完成 config.sh 的基础配置后,可以直接运行主评测脚本:
bash eval.sh此时:
- 实际评测的模型列表由
MODEL_NAMES决定; - 实际评测的 benchmark 列表 由
DS_NAMES决定; - 是否执行推理 / 评测分别由
ENABLE_INFER与ENABLE_EVAL控制; - 推理 / 评测使用的具体环境与 GPU 数量则由
INFER_ENV_MAP、EVAL_ENV_MAP、EVAL_GPU_MAP等配置决定。
适用于日常固定评测场景,减少频繁敲命令行参数的成本。
如果你不想修改 config.sh,而只是在当前一次运行中临时改变评测范围或开关,可以在命令行中传入参数进行覆盖:
bash eval.sh \
--ds_names "wiseedit;gedit" \
--model_names "bagel;qwen-image" \
--custom_model_kwargses ";" \
--infer true \
--eval true \上述命令的含义:
- 本次只评测
bagel与qwen-image两个模型; - 评测的 benchmark 为
wiseedit与gedit; - 无论
config.sh中默认如何配置,本次运行都会同时执行推理(infer=true)和评测(eval=true)。
本节介绍如何在 GenEditEvalKit 中接入新模型与接入新 benchmark。
建议将模型权重统一下载到:
infer/custom_models/checkpoints/
这样可以方便模型的调用。当然,你也可以将模型权重放在其他路径,但需要在后续注册模型加载逻辑时,正确指定权重路径。
在 infer/custom_models/model_utils 目录下,为你的模型新建一个接口文件,并实现一个模型类。
该类需要满足以下要求:
-
必须包含属性:
self.model_name:字符串,用于标识模型名称(需与配置中的MODEL_NAMES一致或可映射)。
-
必须实现方法:
self.generate():模型的核心推理函数。
根据模型任务类型不同,generate 接口定义如下:
-
文本生成图像模型(Text-to-Image, t2i)
def generate(self, prompt, seed=42): """ prompt: 文生图prompt seed: inference的随机数种子 """ ...
-
图像编辑模型(Image Editing, edit)
def generate(self, input_list, seed=42): """ input_list: 图片编辑所需的输入列表,通常为 (str, PIL.Image) 的 list, 包含编辑说明及待编辑的图片等信息。 seed: inference的随机数种子 """ ...
完成模型类定义后,需要在
GenEditEvalKit/infer/custom_models/load_model.py
中的 MODEL_SETTINGS 变量下注册该模型,以便评测主流程能够根据模型名自动加载。
常用配置字段说明如下:
| 字段名 | 说明 |
|---|---|
model_path |
模型权重存放路径(通常位于 infer/custom_models/checkpoints/ 下) |
module |
模型调用接口所在的模块路径(Python import 路径) |
class |
模型类名(即你在 model_utils 下相应.py脚本中定义的类名) |
model_kwargs |
初始化模型时需要额外传入的参数(dict)。若后续在 config.sh 或命令行中提供了同名自定义参数,将覆盖这里的默认值。 |
完成上述步骤后,即可在 config.sh 的 MODEL_NAMES 或命令行的 --model_names 中使用该模型名称参与评测。
在下面的目录中,根据任务类型(t2i / edit)创建数据集类:
infer/custom_datasets/dataset_cls/edit/
infer/custom_datasets/dataset_cls/t2i/
实现数据集类时,需要满足以下要求:
- 必须包含属性:
self.dataset_name:用于标识 benchmark 名称;self.dataset_task:用于标识该 benchmark 的任务类型(如"t2i"或"edit"等);self.data:benchmark 评测样本的列表。
其中,self.data 是一个由 dict 组成的 list,每个元素表示一条评测指令,结构要求如下:
-
t2i 任务:
{ "prompt": ... , # 文生图指令 "seed": ... , # 随机种子。若模型评测需要基于同一 prompt 生成多张图片,可通过设置不同 seed 来实现图片生成的多样性 "image_save_path": ... , # 输出图片的保存路径 } -
edit 任务:
{ "input_list": ... , # 编辑图片 + 编辑指令的组合列表,一般为 list(str, PIL.Image) "seed": ... , # 随机种子。若模型评测需要基于同一输入生成多张图片,可通过设置不同 seed 来实现图片编辑的多样性 "image_save_path": ... , # 输出图片的保存路径 }
数据集类准备好之后,请在:
GenEditEvalKit/infer/custom_datasets/load_dataset.py
中完成该 benchmark 的注册,使主流程可以通过 benchmark 名称自动加载对应数据集。
根据对应 benchmark 官方给出的标准评测命令,编写一个评测脚本,并将其放在:
GenEditEvalKit/eval/
目录下。
评测脚本的输入参数应至少包括:
MODEL_NAME:当前需要评测的模型名称;EVAL_ENV:运行该 benchmark 评测所需的 conda 环境名称(通常由EVAL_ENV_MAP映射得到)。
在 config.sh 中的 EVAL_ENV_MAP 变量下,为该 benchmark 设置对应的 conda 环境名称。
在 config.sh 中的 EVAL_GPU_MAP 变量下,为该 benchmark 设置评测时所需的 GPU 数量。
重要:
- 在训练模型时,工作目录通常为仓库根目录(例如
GenEditEvalKit);- 在评测时,工作目录会切换到对应的 benchmark 仓库目录。
在编写评测脚本时,请务必注意路径的使用。
项目的主要目录结构及功能说明如下:
├── benchmarks/ # 各个 benchmark 的评测仓库
├── eval/ # 评测脚本入口(按 benchmark 划分)
├── eval_models/ # 各 benchmark 评测阶段所需的模型权重(例如clip模型)
├── infer/ # inference 相关代码(统一的推理接口层)
│ ├── custom_datasets/ # benchmark 数据调用接口
│ └── custom_models/
│ ├── checkpoints/ # 各模型权重文件
│ └── model_utils/ # 模型调用接口
├── log/ # 推理与评测阶段的日志(可用于排错与结果回溯)
├── output/ # 保存推理输出的图片与评测结果(按模型和 benchmark 组织)
├── requirements/ # 各模型推理和各 benchmark 评测所需的环境依赖
└── utils/ # 通用辅助工具脚本
├── check_empty_image.py # 检查生成图片是否为空白图片,可用于排除图像生成或编辑的异常
├── download_model_hf_home.sh # 手动下载 HuggingFace 模型到 HF_HOME
└── use_cuda.sh # 切换 CUDA 版本
部分 benchmark 在评测时会先从 HuggingFace 下载模型,然后才在本地 GPU 上完成部署和推理。如果GPU 节点无法直接访问公网,则需要提前在可联网环境中下载所需权重,再拷贝到评测环境中使用。
在本项目中,你可以通过以下方式,将模型手动下载到 ${HF_HOME}/hub 中(HF_HOME 在 eval.sh 中配置):
- 使用脚本:
utils/download_model_hf_home.sh- 在可联网环境中执行该脚本,将需要的模型下载到指定
HF_HOME; - 将缓存目录同步到无法联网的 GPU 环境中;
- 在可联网环境中执行该脚本,将需要的模型下载到指定
- 对于非 HuggingFace 模型:
- 请参考各模型官方提供的下载方式,利用可联网环境,手动下载到
eval_models目录下或是$HOME/.cache的相应位置下,再同步到评测环境中;
- 请参考各模型官方提供的下载方式,利用可联网环境,手动下载到
- 在下载完整之后,请在 config.sh 中设置
HOME、HF_HOME、TRANSFORMERS_CACHE以及HF_HUB_OFFLINE=1/TRANSFORMERS_OFFLINE=1,即可在离线模式下完成评测。
如果您在研究中使用了 GenEditEvalKit,或希望参考已发布的开源评估结果,请使用以下 BibTeX 条目以及与您使用的特定模型 / 基准测试相对应的 BibTex 条目。
此外,我们也将持续支持更多模型和 benchmark ,并不断完善本工具包。同时也欢迎社区贡献 PR 🎉
我们欢迎以下类型的 PR:
- 支持 新模型 和 新 benchmark 的接入,
- 修复 bug 和改进 文档,
- 提升 运行效率、稳定性 和 资源利用率,
- 以及增强工具包的 模块化、可扩展性 与整体 易用性。