无需训练!新框架PERFCODEGEN提升LLM代码性能
https://arxiv.org/abs/2412.03578v1
📖阅读时长:19分钟
🕙发布时间:2025-02-12
近日热文:全网最全的神经网络数学原理(代码和公式)直观解释
欢迎关注知乎和公众号的专栏内容
LLM架构专栏
知乎LLM专栏
知乎【柏企】
公众号【柏企科技说】【柏企阅文】
在本文中[1],作者提出了PERFCODEGEN,这是一个免训练框架,通过在测试用例执行期间将基于运行时的反馈合并到自优化迭代中,从而提高大语言模型(LLM)生成代码的性能。与使用带有复杂提示技术的基本大语言模型相比,使用PERFCODEGEN,作者可以显著提高解决问题的比例。
工作流程图
如下图所示,对于一个给定的问题:
(1) 我们促使大语言模型生成一个候选解决方案;
(2) 该候选方案被传递到一个执行环境中,以收集关于正确性的反馈;
(3) 然后,在规划阶段促使大语言模型基于该反馈进行自我反思,并利用此上下文生成一个优化版本;
(4) 此过程不断迭代(4、2、3步骤),直到得到正确代码。从这个阶段获得的正确代码会为了运行时效率进行自我优化(7),然后传递到环境中执行;
(5) 识别出最耗时的单元测试,并将其作为性能反馈传递给大语言模型;
(6) 大语言模型基于此反馈生成自我优化版本,使正确的解决方案效率更高;
(7) 对这个优化版本进行正确性测试(2、3步骤),如果正确,则作为问题的最终代码解决方案输出;
(8) 如果不正确,若存在(3)步骤中的正确程序,则返回使用该程序。
PERFCODEGEN详细方法
生成正确代码
使用一组与问题 $x$ 对应的JUnit测试 $U(x) = \{u_{j}x\}_{j = 1}^{J}$ 来评估大语言模型生成程序的正确性。
在评估所有候选方案的正确性之后,我们基于单元测试的执行反馈,迭代优化不正确的方案。
对于任何属于集合 $C$ 且未通过任何单元测试的 $y_{i}x$,我们再次向大语言模型发出提示,这次将正确性相关的环境反馈(作为提示的一部分进行描述)、失败的解决方案以及一个失败的单元测试一起提供。
我们指示大语言模型进行反思和规划,然后基于反思和规划结果生成一个优化后的正确解决方案。使用的提示如下:
反思与测试用例反馈
第一轮:
你的问题生成的解决方案不正确,无法通过以下测试用例:
{测试用例}
错误信息如下:
“{错误信息}”
你能否分析失败原因,并提出修改解决方案的策略,使其能够通过上述测试用例?
第二轮:
你能否修改你的解决方案,使其满足问题中的要求并通过测试用例?
请按以下格式给出你的解决方案,用“‘python“‘ 包裹代码。
测试用例反馈
你的问题生成的解决方案不正确,无法通过以下测试用例:
{测试用例}
错误信息如下:
“{错误信息}”
你能否修改你的解决方案,使其满足问题中的要求并且没有任何语法错误?
请按以下格式给出你的解决方案,用“‘python“‘ 包裹代码。
大语言模型生成的 $y_{i}x$ 的最终优化版本随后会进行正确性测试,如果它通过了所有单元测试,则进入性能优化阶段。否则,对于给定的大语言模型,问题 $x$ 被视为正确性未解决。
随后,通过从集合 $C$ 中移除不正确的样本,并纳入其优化版本(如果有任何样本达到了正确性要求),构建一个集合 $C_{correct}$。
我们可以继续这种迭代方法,进一步提高给定大语言模型的正确率,但为了最小化计算成本,我们在这一次迭代后暂停。
使用执行反馈优化正确代码
对于所有使用上述部分描述的样本和优化构建的正确解决方案 $y_{i}x$ ∈ $C_{correct}$,我们促使模型优化其解决方案,在保持功能等效的同时提高性能。
如果这个优化破坏了正确性,我们停止并从 $C_{correct}$ 中返回最快的程序。否则,我们测量这个初始优化版本(为简单起见,仍记为 $y_{i}x$ )通过与给定问题 $x$ 对应的每个可用单元测试 $u_{j}x$ 所消耗的执行时间。
这涉及在相同的计算环境中,对每个解决方案 - 测试用例对进行 $E$ 次独立执行。
对这组 $E$ 次观测结果进行排序后,令 $t(y_{i}x, u_{j}x)[e]$ 为 $y_{i}x$ 在第 $j$ 个单元测试 $u_{j}x$ 上消耗的第 $e$ 小的执行时间。
然后,我们计算一个解决方案在单元测试上的预期执行时间的经验估计值,排除两个异常值(最小和最大执行时间),以最小化潜在测量噪声的影响,如下所示:
我们使用模型最新生成的 $y_{i}x$、最耗时的单元测试 $u_{f}x$ 以及一条根据此反馈优化性能的指令,重新向模型发出提示,如下所示为PERFCODEGEN测试用例反馈提示:
第一轮:干得好!你为这个问题生成了正确的解决方案!现在让我们更进一步,优化该解决方案的时间性能。
基于正确生成的解决方案,你能否对其进行优化,使其在执行时消耗更少的时间?
请确保你优化后的解决方案与原始解决方案功能等效,并且不要更改输入 - 输出格式和主要组件的名称。
请按以下格式给出你的解决方案,用“‘python“‘ 包裹代码。
第二轮:
我们测试了你优化后的程序,发现以下测试用例在执行时耗时最长。
{测试用例}
你能否根据下面的测试用例优化你的优化程序?
请确保你优化后的解决方案与原始解决方案功能等效,并且不要更改输入 - 输出格式和名称。
在性能优化阶段,我们采用贪婪解码算法(采样温度设置为0),因为我们希望每个正确代码片段仅收集一个优化版本,以最小化大语言模型的推理成本。
如果没有任何优化版本 $\widetilde{y_{i}x}$ 通过正确性测试,我们返回 $C_{correct}$ 中最快的正确基础解决方案,其中 $C_{correct}$ 中的最快方案也是通过对所有单元测试进行 $E$ 次执行找到的。
实验
使用的指标
使用大语言模型生成的 $k$ 个样本中最快的(Best@k)正确程序,计算并报告以下指标:
- 优化百分比(%Opt):测试集中,大语言模型生成的最快正确程序 $y_{x}$ 在运行时效率上比基准事实 $g_{x}$ 更高(至少快10%)的问题比例。其中 $N$ 是测试集问题的总数。
- 正确率(%Correct):测试集中,大语言模型从 $k$ 个候选方案中至少生成一个正确解决方案的问题比例。
- 加速比:对于我们至少获得一个大语言模型生成的正确程序 $y_{x}$ 的问题,我们将加速比计算为基准事实 $g_{x}$ 所需的执行时间与最快正确程序 $y_{x}$ 所需执行时间的绝对比值。
结果
下表报告了不同大语言模型在HumanEval和MBPP基准测试问题上的性能,使用我们的PERFCODEGEN框架和上述指标,采样预算为 $k = 1$ 和 $k = 8$ 个样本。
结果表明,该框架在所有基础大语言模型上,都显著提高了优化百分比(%Opt)和正确率(%Correct),尤其是在 $k = 8$ 时。
使用PERFCODEGEN,我们显著提高了像Phi-3-mini($k = 8$ 时,优化百分比为40.85)和Llama 3 70B(39.02)等开源模型生成程序的运行时效率,使其在基础设置下与GPT-4相当,GPT-4在基础设置下达到了最高的优化百分比39.26($k = 8$)。
同样,使用PERFCODEGEN,Mixtral(27.67)、Command R(32.52)和Llama 3 8B(31.10)等开源模型可以达到与GPT-3.5(29.63)相当的优化百分比。
在MBPP基准测试上,在大多数情况下,当采样8个候选方案时,使用PERFCODEGEN仍然可以显著提高优化百分比。一个例外是Llama 3 70B,当 $k = 1$ 时,使用我们的方法在MBPP上其性能略有下降,这可能是由于单个样本估计优化百分比时方差较大。
下表显示了在APPS数据集上的结果。
上述结果表明,与HumanEval和MBPP相比,所有大语言模型在APPS上的正确率明显更低,考虑到APPS的难度较高,这是预期的。
评估PERFCODEGEN执行反馈的替代方案
下表显示了使用GPT-3.5在性能优化阶段($k = 1$)PERFCODEGEN替代方案的比较。优化百分比的增益在相应单元格中用 +δ 或 -δ 表示。
上述结果表明,PERFCODEGEN在HumanEval(优化百分比提高6.17%)和MBPP(优化百分比提高3.06%)问题上的优化率有显著提高,验证了PERFCODEGEN以最耗时单元测试形式的执行反馈在性能提升方面的更高有效性。
规划在正确性优化中的作用
下表显示了使用GPT-3.5和Llama 3 70B在HumanEval和MBPP数据集上这两种方法的结果。
PERFCODEGEN在两个基准测试中都实现了最高的正确率,强调了其额外规划步骤的效用,这表明如果有额外的令牌预算,也应该在性能阶段包含该步骤。
结论
本文介绍了PERFCODEGEN,这是一个新颖的框架,在大语言模型的迭代自优化阶段利用代码执行反馈,以提高生成代码的运行时效率。
研究表明,使用PERFCODEGEN方法,像Phi-3-mini这样的开源大语言模型可以实现与GPT-4等闭源大语言模型相当的代码质量。
我们使用不同规模的开源和闭源语言模型,在三个广泛使用的Python编程基准测试上对PERFCODEGEN进行评估,结果表明在正确性和运行时效率方面都有持续且显著的提升。
论文链接:https://arxiv.org/abs/2412.03578v1
## 推荐阅读
1. DeepSeek-R1的顿悟时刻是如何出现的? 背后的数学原理
2. 微调 DeepSeek LLM:使用监督微调(SFT)与 Hugging Face 数据
3. 使用 DeepSeek-R1 等推理模型将 RAG 转换为 RAT
4. DeepSeek R1:了解GRPO和多阶段训练
5. 深度探索:DeepSeek-R1 如何从零开始训练
6. DeepSeek 发布 Janus Pro 7B 多模态模型,免费又强大!
本文由mdnice多平台发布
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。