AutoCoder:性能超越GPT-4o的模型,居然只有33B,还是开源!
比GPT4还要厉害的开源模型
图片
今天这篇论文介绍了一个最新的大语言模型 AutoCoder,一个只有33B的大语言模型。AutoCoder-33B在HumanEval基准测试中Pass@1的达到90.9%,领先于当前所有顶级的代码生成大型语言模型。在HumanEval+上,它的Pass@1为78%,仅次于GPT-4 Turbo和CodeQwen1.5-Chat。
模型下载地址:https://huggingface.co/Bin12345/AutoCoder
图片
其中,尽管AutoCoder-S只有6.7B参数,它在HumanEval和HumanEval+上的Pass@1比率依然达到了78.7%和72%。在MBPP和MBPP+基准测试中,它的性能分别为79.4%和69.8%,在MBPP+的测试中,其表现在70B参数级别内仅次于DeepSeek-Coder-instruct (33B)。
为了测试AutoCoder在多种程序语言上的表现,作者采用MultiPL-E基准测试AutoCoder。实验结果显示,AutoCoder在Java、C++和Rust语言上的Pass@1成绩分别为61.4%、68.9%和60.8%,表现卓越。在其他三种语言上,它的表现也仅次于CodeQwen1.5-Chat等少数模型,彰显了AutoCoder在多语言代码生成上的强劲实力。
图片
为什么AutoCoder这么强?
AutoCoder之所以能强国GPT-4o的原因,是因为作者采用了 AIEV-INSTRUCT方法来构建高质量的代码指令集数据。
AIEV-INSTRUCT通过智能体(Agent)交互模拟程序员编码和执行单元测试的过程,并通过执行验证确保数据的准确性。AIEV-INSTRUCT包含教学阶段和自学阶段,减少了在数据注释过程中对成本高昂的闭源模型的依赖。
图片
上图展示了AIEV-INSTRUCT的整体架构,分为两个阶段:教学阶段和自我学习阶段。
- • 在教学阶段,模型主要通过吸收教师模型的知识来学习;
- • 而在自我学习阶段,它则独立进行学习。
在教学阶段,作者收集了开源代码片段,并引入GPT-4 Turbo作为教师模型,以补充和修正这些代码。整个流程包含四个关键步骤:
- • 在初始化阶段(I),配置了必要的组件,GPT-4 Turbo扮演着提问者和程序员的双重角色,确保生成的数据多样化,从而形成一个更加均衡的概率分布,避免对话模板的单一化。对话消息以空列表的形式初始化,用于在整个过程中存储数据。最终,这个列表将包含多轮对话,并将整个对话作为单一数据项加入到我们的最终数据集中。此外,还需要设置一个Docker容器,作为我们的代码解释器,负责安装必要的外部包并执行需要验证的代码。
- • 在提出问题阶段(II),首先利用GPT-4 Turbo执行OSS-Instruct ,构建问题描述和具体解决方案,包括基于开源代码片段的代码片段。不同的是,要求GPT-4 Turbo提供一些单元测试,以进一步确保数据集中代码的准确性。前一步骤中初始化的对话消息将依次添加问题描述(➀)、解决方案和单元测试(➁)。
- • 在执行反馈阶段(III),通过多轮执行反馈来检验生成的代码,提升数据集的质量。首先,将第二步生成的代码片段输入代码解释器。如果执行出错,对话消息将添加详细的错误输出(Stderr)(➂)。同时,这些错误信息将提供给提问者,他将基于错误输出生成自然语言描述,该描述也将添加到对话消息中(➃)。然后,自然语言描述和错误输出作为新问题提交给程序员,程序员将继续修改代码。对话消息将添加新生成的代码(➄),并重复这一过程。
- • 在终止阶段(IV),同样使用代码解释器运行程序员生成的代码。如果程序运行成功,输出结果(Stdout)将添加到对话消息中(➅),完成单个数据项的分析。每分析2000个数据项后,将新数据按1:9的比例划分为测试集和训练集。训练集用于训练学生模型(AutoCoder)。训练完成后,使用测试集来评估教师模型和学生模型。评估完成后,将比较两个模型的首次通过率(Pass@1)。如果教师模型表现更佳,我将继续教学阶段;如果学生模型表现更佳,将转向自我学习阶段。自我学习阶段与教学阶段的主要区别在于,自我学习阶段中,用学生模型取代了原始的教师模型,学生模型自己担任提问者和程序员的角色,独立完成整个执行反馈过程。
图片
作者将AutoCoder-AIEV-Instruct数据集与几个现有的大型代码指令数据集进行了对比,对比结果如上图。AutoCoder-AIEV-Instruct数据集包含169K个数据样本,累计达到241K轮对话。其中,150K轮对话数据来源于多轮对话样本。该数据集不仅包含主要功能,还涵盖了后续的包安装、代码执行错误或结果,以及多样化的错误分析。与Magicoder-Evol-Instruct和Magicoder-OSSInstruct原始数据集相比,新增的单元测试进一步提高了代码相关任务的准确性。此外,与Code-Feedback 相比,AutoCoder-AIEV-Instruct包含了更丰富的执行反馈结果,减少了代码块拼接所需的多轮对话,从而增强了上下文的连贯性。
训练过程
AutoCoder模型的基础模型是Deepseek-Coder的两个基础版本,即6.7B和33B,作者在这两个模型的基础上进行了细致的微调,借助AutoCoder-AIEV-Instruct数据集,成功打造出了AutoCoder 33B和AutoCoder-S 6.7B。
为了赋予AutoCoder代码解释器的能力,利用transformer库中的AutoTokenizer工具包,为模型引入了四个特殊标记。硬件配置上,使用了10个节点,配备了总计40块80GB的A100 GPU,这些GPU部署在一个基于SLURM的集群中。GPU间的通信由NVIDIA的集体通信库(NCCL)负责。在训练参数的设置上,使用了deepspeed库中的ZeRO-Stage 3特性,以实现模型参数的分割,每个GPU的批次大小设为8,梯度累积步数为4,学习率设为5e-5,参数类型选用了bf16。序列的最大长度被设定为5120,而训练的总周期则为2。整个训练过程中,采取了全面的参数调优策。
demo演示方法
git clone https://github.com/bin123apple/AutoCoder
conda create -n AutoCoder pythnotallow=3.11
conda activate AutoCoder
pip install -r requirements.txt
cd /Web_demo
pip install -r requirements.txt
python chatbot.py
本文转载自大语言模型论文跟踪,作者: HuggingAGI