# MathVista 实现方案总结

## 1. 本地现有实现分析

### 1.1 MMBench 评估实现（参考）

**位置**: `chengyue_script/dvlm/`

**关键文件**:
- `eval_vlmeval.sh` - 评估启动脚本
- `run_vlmeval.py` - VLMEvalKit启动器
- `generate_vlmeval_config.py` - 配置生成器
- `vlmeval_qwen_vl_mdm.py` - MDM模型的VLMEvalKit包装器
- `qwen_vl_mdm_model.py` - 核心模型类

**实现架构**:
```
eval_vlmeval.sh
  ↓
generate_vlmeval_config.py (生成JSON配置)
  ↓
run_vlmeval.py (导入模型包装器)
  ↓
vlmeval_qwen_vl_mdm.py (Qwen2VLChatMDM类)
  ↓
qwen_vl_mdm_model.py (QwenVLMDMModel核心实现)
```

**关键特点**:
1. **使用VLMEvalKit框架**: 通过VLMEvalKit统一评估接口
2. **模型包装器**: `Qwen2VLChatMDM`类实现`generate()`方法
3. **消息格式处理**: 支持`[{'type': 'image', 'value': ...}, {'type': 'text', 'value': ...}]`格式
4. **配置驱动**: 通过环境变量和JSON配置控制评估

### 1.2 评估脚本示例 (MMBench)

```bash
# eval_vlmeval.sh 关键部分
DATASETS=${1:-MMBench_DEV_EN_V11}
MODEL_PATH=${MODEL_PATH:-output_models/sharegpt4v_6760306/checkpoint-500}
VLM_DIR=${VLM_DIR:-/home/chengyuew/chengyuew/workspace/VLMEvalKit}
DATASET_CLASS=${DATASET_CLASS:-ImageMCQDataset}

# 生成配置
${PYTHON_BIN} "${SCRIPT_DIR}/generate_vlmeval_config.py"

# 运行评估
torchrun --nproc-per-node="${TORCHRUN_NPROC}" "${SCRIPT_DIR}/run_vlmeval.py" \
  --config "${CFG_PATH}" \
  --work-dir "${WORK_DIR}" \
  --mode "${RUN_MODE}"
```

### 1.3 模型包装器实现

**`vlmeval_qwen_vl_mdm.py`** 关键代码:
```python
class Qwen2VLChatMDM:
    def generate(self, message=None, dataset=None, prompt=None, image=None, **kwargs):
        # 处理VLMEvalKit的消息格式
        if message is not None:
            if isinstance(message, list):
                for item in message:
                    if item.get("type") == "image":
                        image_path = item["value"]
                    elif item.get("type") == "text":
                        prompt_parts.append(item["value"])
        
        # 调用底层模型生成
        return self.model.generate(prompt=prompt, image=image)
```

## 2. MathVista 数据集特点

### 2.1 数据集信息
- **类型**: 视觉数学推理数据集
- **任务**: 结合图像和文本进行数学问题求解
- **格式**: 通常包含图像路径、问题文本、选项（如果是多选题）、答案

### 2.2 网上常见实现方式

**VLMEvalKit支持**:
- MathVista通常作为VLMEvalKit的一个内置数据集
- 数据集类: `MathVistaDataset` 或 `ImageMCQDataset`
- 评估指标: Accuracy (准确率)

**典型实现流程**:
1. 下载MathVista数据集（通常从HuggingFace或官方仓库）
2. 配置VLMEvalKit的config文件
3. 使用模型包装器运行评估
4. 解析结果文件

## 3. 实现方案

### 3.1 方案概述

**复用MMBench的实现框架，添加MathVista支持**

### 3.2 需要修改/添加的文件

#### 3.2.1 创建 `eval_mathvista.sh`

```bash
#!/bin/bash
set -eo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
mkdir -p workdir

PYTHON_BIN=/lustre/fsw/portfolios/nvr/users/chengyuew/anaconda3/envs/shiyi-lmflow/bin/python

# MathVista specific configuration
DATASETS=${1:-${DATASETS:-MathVista}}
MODEL_PATH=${MODEL_PATH:-output_models/sharegpt4v_6760306/checkpoint-500}
VLM_DIR=${VLM_DIR:-/home/chengyuew/chengyuew/workspace/VLMEvalKit}
WORK_DIR=${WORK_DIR:-$(pwd)/eval_outputs/vlmeval}
DATASET_CLASS=${DATASET_CLASS:-MathVistaDataset}  # 或 ImageMCQDataset
MODEL_KEY=${MODEL_KEY:-Qwen2.5-VL-MDM}
RUN_MODE=${RUN_MODE:-all}
USE_MDM=${USE_MDM:-1}

mkdir -p "${WORK_DIR}"

MODEL_PATH_ABS=$(${PYTHON_BIN} -c 'import os,sys; print(os.path.abspath(sys.argv[1]))' "${MODEL_PATH}")
CFG_PATH="${WORK_DIR}/$(date +%Y%m%d_%H%M%S)_mathvista_config.json"

export PYTHONPATH="${SCRIPT_DIR}:${PYTHONPATH:-}"
export CFG_PATH MODEL_PATH_ABS DATASETS DATASET_CLASS MODEL_KEY PROCESSOR_PATH \
       USE_MDM MODEL_CLASS BLOCK_SIZE MAX_TOKENS MASK_TOKEN DEVICE

echo "Preparing VLMEvalKit config for MathVista at: ${CFG_PATH}"
${PYTHON_BIN} "${SCRIPT_DIR}/generate_vlmeval_config.py"

echo "Running VLMEvalKit for MathVista..."
cd "${VLM_DIR}"

TORCHRUN_NPROC=$(nvidia-smi --list-gpus | wc -l | tr -d '[:space:]')
torchrun --nproc-per-node="${TORCHRUN_NPROC}" "${SCRIPT_DIR}/run_vlmeval.py" \
  --config "${CFG_PATH}" \
  --work-dir "${WORK_DIR}" \
  --mode "${RUN_MODE}" \
  --verbose

echo "Done. Results are under: ${WORK_DIR}/${MODEL_KEY}"
```

#### 3.2.2 修改 `generate_vlmeval_config.py`

**当前实现已经支持动态数据集配置**，只需要在环境变量中指定：
```python
# 第49行已经支持多个数据集
datasets = os.environ.get("DATASETS", "MMBench_DEV_EN_V11").split()
dataset_class = os.environ.get("DATASET_CLASS", "ImageMCQDataset")
```

**无需修改**，直接使用即可。

#### 3.2.3 验证VLMEvalKit是否支持MathVista

需要检查VLMEvalKit中是否有MathVista数据集类：
- 如果有 `MathVistaDataset`，使用 `DATASET_CLASS=MathVistaDataset`
- 如果没有，可能需要使用 `ImageMCQDataset` 或 `ImageDataset`

### 3.3 实现步骤

#### Step 1: 检查VLMEvalKit支持
```bash
cd /home/chengyuew/chengyuew/workspace/VLMEvalKit
# 查看支持的数据集
grep -r "MathVista" . --include="*.py"
# 或查看数据集注册
grep -r "register_dataset\|Dataset.*Math" . --include="*.py"
```

#### Step 2: 创建评估脚本
```bash
# 复制MMBench的脚本作为模板
cp chengyue_script/dvlm/eval_vlmeval.sh chengyue_script/dvlm/eval_mathvista.sh

# 修改关键参数
# DATASETS=MathVista
# DATASET_CLASS=MathVistaDataset  # 根据VLMEvalKit实际类名调整
```

#### Step 3: 运行评估
```bash
bash chengyue_script/dvlm/eval_mathvista.sh MathVista
```

## 4. 关键差异对比

| 项目 | MMBench | MathVista |
|------|---------|-----------|
| **数据集类** | `ImageMCQDataset` | `MathVistaDataset` (可能) |
| **任务类型** | 视觉多选题 | 视觉数学推理 |
| **答案格式** | 选项A/B/C/D | 可能不同（需确认） |
| **评估指标** | Accuracy | Accuracy |
| **实现方式** | ✅ 已有 | ⏳ 待添加 |

## 5. 潜在问题和解决方案

### 问题1: VLMEvalKit可能没有MathVista支持
**解决方案**:
- 检查VLMEvalKit版本和文档
- 如果没有，可能需要：
  1. 手动添加MathVista数据集类
  2. 或使用通用的`ImageDataset`类
  3. 或参考网上实现添加支持

### 问题2: 数据集格式不匹配
**解决方案**:
- 查看MathVista官方数据格式
- 可能需要数据预处理脚本
- 参考MMBench的数据加载方式

### 问题3: 评估指标计算
**解决方案**:
- MathVista通常使用准确率
- VLMEvalKit应该自动处理
- 可能需要自定义metric函数

## 6. 参考资源

### 6.1 本地参考
- **MMBench实现**: `chengyue_script/dvlm/eval_vlmeval.sh`
- **模型包装器**: `chengyue_script/dvlm/vlmeval_qwen_vl_mdm.py`
- **配置生成**: `chengyue_script/dvlm/generate_vlmeval_config.py`

### 6.2 网上参考
- **VLMEvalKit官方**: 查看支持的数据集列表
- **MathVista论文/仓库**: 了解数据集格式和评估方式
- **其他实现**: 搜索 "MathVista VLMEvalKit evaluation"

## 7. 实施建议

### 优先级1: 快速验证
1. ✅ 检查VLMEvalKit是否已有MathVista支持
2. ✅ 如果有，直接复用MMBench框架
3. ✅ 创建`eval_mathvista.sh`脚本

### 优先级2: 完整实现
1. 如果没有支持，添加MathVista数据集类
2. 实现数据加载逻辑
3. 实现评估指标计算
4. 测试和验证

### 优先级3: 优化
1. 支持批量评估
2. 添加结果可视化
3. 集成到统一的评估流程

## 8. 总结

**当前状态**:
- ✅ 有完整的MMBench评估框架可复用
- ✅ 有VLMEvalKit集成经验
- ✅ 有模型包装器实现
- ⏳ 需要确认MathVista数据集支持情况
- ⏳ 需要创建MathVista专用评估脚本

**推荐方案**:
1. **直接复用MMBench框架** - 修改数据集名称和类名
2. **最小改动** - 只修改`eval_mathvista.sh`中的配置
3. **快速验证** - 先测试是否能运行，再优化

**预计工作量**:
- 如果VLMEvalKit已支持: **1-2小时** (创建脚本+测试)
- 如果需要添加支持: **1-2天** (实现数据集类+测试)
