# IDPruner (核心自研算法)

**IDPruner (Importance and Diversity Pruner)** 是 AngelSlim 的核心视觉 Token 剪枝算法。它通过引入信息检索领域的重排序机制，解决了 MLLM 在极高压缩比下精度大幅退化的问题。

## 1. 算法动机
MLLM 推理中的视觉 Token 存在显著冗余。现有的剪枝方案往往陷入局部最优：
- **仅关注重要性 (Importance)**：导致 Token 极度向前景目标（如人脸、主体）聚集，丢失对全局推理至关重要的背景上下文。
- **仅关注多样性 (Diversity)**：倾向于均匀采样，虽保证了覆盖度，但容易保留任务无关的噪声且丢失关键细节。

我们的方法兼顾了多样性维度和重要性维度，并且超过了其他的两者兼顾的方法，将两个维度的结合推向帕累托最优。

## 2. 技术核心
IDPruner 的决策逻辑由三个要素驱动：

1.  **重要性度量 (Importance Source)**：采用经过端到端训练的轻量化 **Scorer（评分器）**，预测每个 Token 对最终语义生成的贡献度。
2.  **相似性度量 (Similarity Source)**：利用模型自身的**视觉隐藏层特征向量**，在特征空间计算 Token 间的**余弦相似度**以识别冗余。
3.  **MMR 选择机制 (Maximal Marginal Relevance)**：采用贪心策略迭代选择 Token，目标是最大化以下函数：
    $$v^* = \arg \max_{v_i \in V \setminus S} [\lambda \cdot \text{Imp}(v_i) - (1 - \lambda) \cdot \max_{v_j \in S} \text{Sim}(v_i, v_j)]$$
    通过动态惩罚与已选集合高度相似的候选 Token，确保最终集合在保留高价值信息的同时，具备最优的语义覆盖面。

## 3. 实验结果 (Qwen-2.5-7B-Instruct)
在 Qwen-2.5-7B 上的大规模评测表明，IDPruner 在 75% 甚至 90% 的极端压缩率下，性能均显著优于现有主流方法。

| Method              |     AI2D     |   ChartQA    |    DocVQA    | MMB<sup>CN</sup> |     MMB      |     MME     |    MMStar    |     OCR      |     POPE     |     SQA      | VQA<sup>T</sup> |      Avg      |
| :------------------ | :----------: | :----------: | :----------: | :--------------: | :----------: | :---------: | :----------: | :----------: | :----------: | :----------: | :-------------: | :-----------: |
| **Baseline**        |    82.48     |    83.68     |    94.90     |      80.41       |    83.08     |    1702     |    61.88     |    85.30     |    87.80     |    88.45     |      82.74      |    100.0%     |
| **保留 25% Tokens** |              |              |              |                  |              |             |              |              |              |              |                 |               |
| FastV               |    75.68     |    68.20     |    81.20     |      73.20       |    76.12     |    1636     |    51.08     |    43.00     |    85.20     |    83.49     |      80.06      |    87.16%     |
| VisionZip           |    77.40     |    67.20     |    71.48     |      76.12       |    78.78     |    1637     |    54.86     |    46.50     |    85.76     |    83.99     |      76.21      |    87.55%     |
| HiPrune             |    77.49     |    68.60     |    73.52     |      76.03       |    78.09     |    1619     |    54.43     |    47.10     |    86.02     |    84.18     |      76.43      |    87.80%     |
| VisionSelector      | <u>79.60</u> | <u>72.00</u> |  **93.24**   |      75.86       |    78.78     | <u>1688</u> |    55.78     | <u>72.50</u> |    86.74     |    85.08     |  <u>80.39</u>   | <u>94.22%</u> |
| DivPrune            |    77.98     |    62.00     |    85.32     |      75.77       |    77.84     |    1650     |    52.97     |    58.40     |    85.88     |    83.94     |      75.88      |    89.26%     |
| DART                |    74.35     |    60.80     |    78.90     |      73.88       |    76.72     |    1625     |    52.90     |    46.00     |    84.34     |    84.33     |      71.68      |    85.74%     |
| VisPruner           |    77.62     |    68.04     |    77.39     |      75.69       |    78.87     |    1657     |    54.01     |    48.70     |    85.68     |    84.18     |      75.17      |    88.31%     |
| SCOPE               |    78.92     |    71.20     |    85.40     |    **77.75**     | <u>79.38</u> |    1684     |  **56.86**   |    61.70     | <u>86.78</u> | <u>85.23</u> |      79.66      |    92.51%     |
| **IDPruner**        |  **80.51**   |  **74.32**   | <u>93.16</u> |   <u>76.63</u>   |  **79.73**   |  **1695**   | <u>56.49</u> |  **74.00**   |  **87.06**   |  **85.52**   |    **80.83**    |  **95.18%**   |
| **保留 10% Tokens** |              |              |              |                  |              |             |              |              |              |              |                 |               |
| FastV               |    67.23     |    39.48     |    51.90     |      53.26       |    55.58     |    1332     |    38.02     |    24.10     |    76.31     |    79.28     |      72.59      |    68.07%     |
| VisionZip           |    70.60     |    41.56     |    37.94     |      66.67       |    71.05     |    1462     |    45.19     |    23.40     |    81.06     |  **83.24**   |      61.06      |    71.84%     |
| HiPrune             |    69.82     |    43.96     |    39.89     |      67.44       |    70.88     |    1438     |    45.04     |    23.70     |    80.70     |    82.65     |      62.51      |    72.22%     |
| VisionSelector      | <u>74.81</u> |  **62.68**   |  **87.00**   |      68.99       |    71.65     |    1569     |    46.93     |  **55.50**   |    82.69     |    81.95     |    **74.52**    | <u>85.39%</u> |
| DivPrune            |    70.11     |    41.36     |    66.20     |      69.42       |    72.16     |    1529     |    44.46     |    31.80     |    81.91     |    80.96     |      62.72      |    76.09%     |
| DART                |    67.88     |    34.84     |    49.86     |      63.92       |    67.35     |    1451     |    42.93     |    24.30     |    79.70     |    80.96     |      54.06      |    69.80%     |
| VisPruner           |    69.88     |    42.68     |    50.85     |      66.84       |    70.96     |    1442     |    44.14     |    24.40     |    81.03     |    81.11     |      59.66      |    72.60%     |
| SCOPE               |    71.63     |    50.04     |    56.45     |   <u>71.22</u>   |  **75.43**   | <u>1608</u> |  **48.74**   |    34.10     | <u>84.10</u> |    82.25     |      70.61      |    79.35%     |
| **IDPruner**        |  **75.16**   | <u>62.48</u> | <u>85.98</u> |    **71.65**     | <u>74.66</u> |  **1618**   | <u>47.48</u> | <u>53.90</u> |  **85.43**   |  **82.80**   |  <u>74.43</u>   |  **86.47%**   |

*(注：**粗体**为最优值，<u>下划线</u>为次优值。)*

## 4. 快速开始
通过以下命令启动 IDPruner 的基准评测：

```bash
python tools/run_token_pruning_evaluation.py \
    --model_path "Qwen/Qwen2.5-VL-7B-Instruct" \
    --configs "configs/qwen2_5_vl/pruning/idpruner_r0.75.yaml" \
    --tasks "textvqa" \
    --output_dir "./results/idpruner_test"
```

### 关键配置说明：selector_path
在 `idpruner_r0.75.yaml` 中，`selector_path` 是算法运行的核心参数，它指定了用于预测 Token 重要性的 Scorer 权重路径：

```yaml
params:
    ratio: 0.9
    mmr_lambda: 0.5
    parallel_k: 1
model_related_params:
    selector_path:
        "7b": "AngelSlim/Qwen2.5-VL-7B-Instruct-Selector"
        "3b": "AngelSlim/Qwen2.5-VL-3B-Instruct-Selector"
```
