返回列表

3rd place solution

613. AI Mathematical Olympiad - Progress Prize 1 | ai-mathematical-olympiad-prize

开始: 2024-04-01 结束: 2024-06-27 数学与计算 AI大模型赛
第三名解决方案

第三名解决方案

作者: David Dinucu-Jianu (及团队成员)
发布日期: 2024-07-05
竞赛排名: 第 3 名

使用 vLLM 的一些技巧

我们最终解决方案的代码可以在这里找到。

我们最终选定的解决方案是对 AbdurRafae 的 notebook 的改编。我们使用了 DeepSeek-Math-7B-RL 且未进行任何微调,并结合我们制定的评分规则进行多数投票。

vLLM

由于与 Huggingface Transformers 相比速度更快,我们决定使用 vLLM。

  • 我们生成大量候选解决方案(通常在 120 到 160 个之间)。
  • 我们发现将 KV 缓存设置为 FP16 可以提高我们的分数。

生成

我们使用迭代在一个批次中生成解决方案。每次迭代对应每一段需要运行的代码。

  • 我们发现大量的迭代次数(>6)有助于提高分数。
  • 为了确保模型一致地以 \boxed{} 格式输出答案,我们使用了以下方法。当生成完成但没有答案时,我们会在输出末尾附加诸如 "The final answer is \boxed{" 之类的字符串,并再生成几个 token。这个提示迫使模型正确输出答案。
  • 对于每次迭代,我们将所有需要执行的代码收集起来,分批并行执行。这显著减少了我们在代码执行上花费的时间。

评分规则

关于评分规则,我们发现在至少我们的验证集上,模型最终结果通常有两种类型的错误:

  1. 较小的数字(<10),这通常是因为代码错误造成的。
  2. 属于问题陈述部分的数字。我们发现这种情况尤为明显,且发生的次数超过了问题陈述实际包含答案的可能性。

因此,我们根据这些结果占我们尝试生成总数的百分比对其进行惩罚。我们观察到,通过惩罚来自问题陈述的数字,分数有了显著提高。

我们还尝试了什么

对于最终提交,由于最终排行榜可能出现并列情况,我们选择了这个旧版本。
我们也创建了许多不同的版本。

BF16

我们观察到以 BF16 运行模型可以提高性能,因此我们尝试使我们的解决方案支持 BF16。问题在于 vLLM 默认不支持在 T4 上进行此操作。然而,可以在 FP32 中进行计算然后转换回 BF16。

因此,我们稍微修改了 vLLM 库代码,移除了对 BF16 支持的检查,并包装了注意力模块,以便我们在 fp32 和 bf16 之间来回转换。

因此我们有两个版本的库:

我们发现让 MLP 使用 bf16 会使模型非常慢,因此我们也创建了一个版本,除了 MLP 外都保持 bf16。
使用这些库的模型表现良好,但稳定性不够符合我们的要求。它们在验证集上给了我们最高的分数,但在公开榜上没有超过 25 分。

生成期间执行代码

我们观察到多次调用 vllm 花费了大量时间,此外,无法可靠地根据解决方案的中间结果提前退出。因此,我们制作了一个新版本的 notebook,我们最初用它获得了 26-27 分,它将代码生成的结果直接反馈给模型,而不需要两次 vllm 生成调用。

我们通过使用 logit 处理器并强制模型输出代码输出的 token 来实现这一点。我们还在 logit 处理器函数中直接执行所有提前中断和剪枝规则。
代码可以在这里找到
我们个人更喜欢这个提交而不是最终版本,但由于时间限制,我们无法使其得分像旧版本那样高

同比赛其他方案