613. AI Mathematical Olympiad - Progress Prize 1 | ai-mathematical-olympiad-prize
我们最终选定的解决方案是对 AbdurRafae 的 notebook 的改编。我们使用了 DeepSeek-Math-7B-RL 且未进行任何微调,并结合我们制定的评分规则进行多数投票。
由于与 Huggingface Transformers 相比速度更快,我们决定使用 vLLM。
我们使用迭代在一个批次中生成解决方案。每次迭代对应每一段需要运行的代码。
关于评分规则,我们发现在至少我们的验证集上,模型最终结果通常有两种类型的错误:
因此,我们根据这些结果占我们尝试生成总数的百分比对其进行惩罚。我们观察到,通过惩罚来自问题陈述的数字,分数有了显著提高。
对于最终提交,由于最终排行榜可能出现并列情况,我们选择了这个旧版本。
我们也创建了许多不同的版本。
我们观察到以 BF16 运行模型可以提高性能,因此我们尝试使我们的解决方案支持 BF16。问题在于 vLLM 默认不支持在 T4 上进行此操作。然而,可以在 FP32 中进行计算然后转换回 BF16。
因此,我们稍微修改了 vLLM 库代码,移除了对 BF16 支持的检查,并包装了注意力模块,以便我们在 fp32 和 bf16 之间来回转换。
因此我们有两个版本的库:
我们发现让 MLP 使用 bf16 会使模型非常慢,因此我们也创建了一个版本,除了 MLP 外都保持 bf16。
使用这些库的模型表现良好,但稳定性不够符合我们的要求。它们在验证集上给了我们最高的分数,但在公开榜上没有超过 25 分。
我们观察到多次调用 vllm 花费了大量时间,此外,无法可靠地根据解决方案的中间结果提前退出。因此,我们制作了一个新版本的 notebook,我们最初用它获得了 26-27 分,它将代码生成的结果直接反馈给模型,而不需要两次 vllm 生成调用。
我们通过使用 logit 处理器并强制模型输出代码输出的 token 来实现这一点。我们还在 logit 处理器函数中直接执行所有提前中断和剪枝规则。
代码可以在这里找到
我们个人更喜欢这个提交而不是最终版本,但由于时间限制,我们无法使其得分像旧版本那样高