这个目录包含基于 vLLM / OpenAI API 格式的 DART GUI grounding 评测脚本,目前主要用于:
- ScreenSpot-v2
- ScreenSpot-Pro
先准备 Python 环境,然后安装基础依赖:
pip install openai pillow tqdm如果你要打开可视化,也就是把脚本里的 DISPLAY_IMAGES = True,还需要额外安装:
pip install matplotlib numpy默认 DISPLAY_IMAGES = False,所以正常评测不需要 matplotlib 和 numpy。
建议从 dart_eval 目录下运行脚本:
cd /path/to/dart_eval当前脚本默认读取相对路径 dataset,因此数据需要放成下面的结构:
dart_eval/
eval/
run_screenspot_2_vllm_dart.py
run_screenspot_pro_vllm_dart.py
dataset/
ScreenSpot-v2/
*.json
screenspotv2_image/
...
ScreenSpot-Pro/
annotations/
*.json
images/
...
标注字段要求:
- ScreenSpot-v2:每条样本需要包含
img_filename、instruction、bbox,可选data_type。 - ScreenSpot-Pro:每条样本需要包含
img_filename、instruction、bbox,可选group/ui_type。
脚本会把模型预测点映射回原图坐标,然后和 bbox 做命中判断。
模型输出需要包含下面这种 DART action 格式:
Action: click(point='<point>x y</point>')
其中 x y 是模型处理后的 resized image 坐标。脚本会根据图片原始尺寸和 smart_resize() 规则,把它还原到原图坐标后再计算准确率。
需要先启动一个兼容 OpenAI API 的 vLLM 服务。例如:
vllm serve /path/to/your/model \
--served-model-name dart-7b \
--host 0.0.0.0 \
--port 8000然后在要运行的脚本里修改:
MODEL = "dart-7b"
ENDPOINT = "http://your-host:8000/v1"注意:MODEL 必须和 vLLM 暴露出来的模型名一致,通常就是 --served-model-name 的值。
ScreenSpot-v2:
cd /path/to/dart_eval
python eval/run_screenspot_2_vllm_dart.pyScreenSpot-Pro:
cd /path/to/dart_eval
python eval/run_screenspot_pro_vllm_dart.py运行结束后,结果 JSON 会保存在当前工作目录:
results_dart-7b_screenspot_2.json
results_dart-7b_screenspot_pro.json
同时脚本也会在终端打印按 split / data type 分组的准确率。
脚本默认会并发请求 vLLM,默认并发数是 8。
可以通过环境变量调整并发数,不需要改代码:
SCREENSPOT_MAX_WORKERS=4 python eval/run_screenspot_2_vllm_dart.py
SCREENSPOT_MAX_WORKERS=8 python eval/run_screenspot_2_vllm_dart.py
SCREENSPOT_MAX_WORKERS=16 python eval/run_screenspot_2_vllm_dart.py并发数不是越大越快。如果 vLLM 已经打满、显存压力变大或者请求开始超时,就把 SCREENSPOT_MAX_WORKERS 调小。
每个脚本的 main() 里都有这些配置:
DISPLAY_IMAGES = False
LIMIT = -1
MODEL = "dart-7b"
ENDPOINT = "http://..."
FILTER_BY_SPLIT = None含义:
DISPLAY_IMAGES:是否保存预测点可视化图片。默认关闭。LIMIT:限制评测样本数。-1表示全量评测;调试时可以设成5或10。MODEL:请求 vLLM 时使用的模型名。ENDPOINT:OpenAI-compatible vLLM 服务地址。FILTER_BY_SPLIT:当前脚本里基本未启用,可以先保持None。
第一次跑建议先把脚本里的:
LIMIT = -1改成:
LIMIT = 5然后运行一个脚本,确认:
- 能正常读取标注和图片。
- vLLM endpoint 能返回结果。
- 模型输出里有
Action: click(point='<point>x y</point>')。 - 终端能打印
Predicted point和准确率统计。
确认没问题后,再把 LIMIT 改回 -1 跑完整评测。
仓库里还提供了一个 Hugging Face safetensors 权重线性合并工具:
tools/merge_hf_safetensors.py
额外依赖:
pip install torch safetensors示例:
python tools/merge_hf_safetensors.py \
--model-a models/dart-gui-7b \
--model-b models/UI-TARS-1.5-7B \
--output models/dart-gui-uitars-0.5-0.5 \
--weight-a 0.5 \
--weight-b 0.5这个脚本会逐 shard 合并 model.safetensors.index.json 对应的权重,不会一次性把完整模型加载到内存。非权重文件,例如 tokenizer、config 等,会从 --copy-from 指定的模型目录复制,默认从 model-a 复制。
常用参数:
--weight-a/--weight-b:两个模型的线性合并权重。--copy-from a|b:非权重文件从哪个模型目录复制。--compute-dtype:合并时临时计算 dtype,可选float32、bfloat16、float16。--output-dtype:输出权重 dtype,默认source,即保持model-a的原始 dtype。--dry-run:只检查模型结构和 shard 是否兼容,不实际写输出。--force:输出目录已存在时强制覆盖。
仓库里也包含 DART 版本的 Mind2Web vLLM 评测脚本:
python eval/run_mind2web_vllm_dart.pyMind2Web 需要额外依赖:
pip install numpy openai pillow torch transformers qwen-vl-utils可选依赖:
pip install ray- 没有
ray时,脚本会顺序评测task、website、domain三个 split。
数据默认也从相对路径 dataset 读取,目录结构如下:
dart_eval/
dataset/
Mind2Web/
metadata/
hf_test_task_with_thoughts.json
hf_test_website_with_thoughts.json
hf_test_domain_with_thoughts.json
ming2web_images/
...
推荐通过环境变量配置模型、服务地址、数据路径和 processor:
MODEL=dart-7b \
ENDPOINT=http://localhost:8000/v1 \
MIND2WEB_DATASET_DIR=dataset \
MIND2WEB_PROCESSOR=/path/to/processor_or_model \
LIMIT=100 \
python eval/run_mind2web_vllm_dart.py配置项说明:
MODEL:vLLM 暴露出来的模型名。ENDPOINT:OpenAI-compatible vLLM 服务地址。MIND2WEB_DATASET_DIR:数据根目录,默认dataset。MIND2WEB_PROCESSOR:必填,用于构造 Mind2Web prompt 和图片输入的 Hugging Face processor。可以填本地模型目录,也可以填 Hugging Face repo id。LIMIT:每个 split 评测多少条,默认100;设为-1表示全量。N_SAMPLING:每条样本采样次数,默认1。TOP_K:采样参数,默认50。
输出结果会保存为:
results_dart-7b_mind2web.json
仓库里提供了一个 vLLM / OpenAI API 风格的 AITW DART 评测脚本:
python eval/run_aitw_vllm_dart.py依赖:
pip install numpy openai pillow tqdm数据默认从相对路径 dataset 读取,目录结构如下:
dart_eval/
dataset/
AITW/
metadata/
hf_test.json
hf_test_with_thoughts.json
aitw_images/
...
默认使用 AITW_VERSION=v2,会读取:
dataset/AITW/metadata/hf_test_with_thoughts.json
如果设置 AITW_VERSION=v1,会读取:
dataset/AITW/metadata/hf_test.json
运行示例:
MODEL=dart-7b \
ENDPOINT=http://localhost:8000/v1 \
AITW_DATASET_DIR=dataset \
AITW_VERSION=v2 \
LIMIT=100 \
NUM_HISTORY=2 \
AITW_MAX_WORKERS=8 \
python eval/run_aitw_vllm_dart.py配置项说明:
MODEL:vLLM 暴露出来的模型名,默认dart-7b。ENDPOINT:OpenAI-compatible vLLM 服务地址,默认http://localhost:8000/v1。AITW_DATASET_DIR:数据根目录,默认dataset。AITW_VERSION:v1或v2,默认v2。LIMIT:评测样本数,默认-1表示全量。NUM_HISTORY:使用多少步历史,默认2。AITW_MAX_WORKERS:并发请求数,默认8。TEMPERATURE:采样温度,默认1e-6。TOP_K:采样参数,默认50。
模型输出支持下面的 DART action 格式:
Action: click(point='<point>x y</point>')
Action: type(content='...')
Action: scroll(direction='down')
Action: press_back()
Action: press_home()
Action: press_enter()
Action: status_task_complete()
Action: status_task_impossible()
其中 click 的 x y 是 resized current screenshot 坐标系。脚本会把它转换成 AITW 评测需要的归一化坐标后计算指标。
输出结果会保存为:
results_dart-7b_aitw.json