新智元报道

  编辑:alan 好困

  Stability AI 在大佬出走后似乎并未受到影响,最近又官宣了新的代码模型 Stable Code Instruct 3B,在之前的基础上更进一步,干掉了所有同级竞品,甚至能和 7B、15B 的模型掰手腕。

  大佬出走后,第一个模型来了!

  就在今天,Stability AI 官宣了新的代码模型 Stable Code Instruct 3B。

  要说 Stability 也是真的很神奇,首席执行官辞职了,Stable Diffusion 其中几位作者也离开了,投资公司出了点故障,自己的工资也可能要发不起了,

  ——但是,楼外风雨飘摇,实验室里岿然不动,研究该做做,论文该发发,模型该调调,大模型各领域的战争是一个没落下。

  而且不仅仅是铺开摊子搞全面战争,每项研究也都在不断前进,比如今天的 Stable Code Instruct 3B 就是在之前的 Stable Code 3B 的基础上做了指令调优:

  论文地址:

  通过自然语言提示,Stable Code Instruct 3B 可以处理各种任务,例如代码生成、数学和其他与软件开发相关的查询。

  同阶无敌,越级强杀

  Stable Code Instruct 3B 在同等参数量的模型中,做到了当前的 SOTA,甚至优于比自己大两倍多的 CodeLlama 7B Instruct 等模型,并且在软件工程相关任务中的表现与 StarChat 15B 相当。

  从上图可以看出,与 Codellama 7B Instruct 和 DeepSeek-Coder Instruct 1.3B 等领先模型相比,Stable Code Instruct 3B 在一系列编码任务中性能优异。

  测试表明,Stable Code Instruct 3B 在代码完成准确性、对自然语言指令的理解、以及跨不同编程语言的多功能性方面,都能够打平甚至超越竞争对手。

  Stable Code Instruct 3B 根据 Stack Overflow 2023 开发者调查的结果,将训练专注于 Python、Javascript、Java、C、C++和 Go 等编程语言。

  上图使用 Multi-PL 基准测试,比较了三个模型以各种编程语言生成输出的强度。可以发现 Stable Code Instruct 3B 在所有语言中都明显优于 CodeLlama,并且参数量还少了一半多。

  除了上述的热门编程语言,Stable Code Instruct 3B 还包括对其他语言(如 SQL、PHP 和 Rust)的训练,并且即使在没有经过训练的的语言(如 Lua)中,也能提供强大的测试性能。

  Stable Code Instruct 3B 不仅精通代码生成,还精通 FIM(代码中间填充)任务、数据库查询、代码翻译、解释和创建。

  通过指令调优,模型能够理解细微的指令并采取行动,促进了除了简单代码完成之外的广泛编码任务,比如数学理解、逻辑推理和处理软件开发的复杂技术。

  模型下载:https://huggingface.co/stabilityai/stable-code-instruct-3b

  Stable Code Instruct 3B 现在可以通过 Stability AI 会员资格,用于商业目的。对于非商业用途,可以在 Hugging Face 上下载模型重量和代码。

  技术细节

  模型架构

  Stable Code 建立在 Stable LM 3B 之上,是一个 decoder-only Transformer 结构,设计类似于 LLaMA。下表是一些关键的结构信息:

  与 LLaMA 的主要区别包括:

位置嵌入:在头部嵌入的前 25% 使用旋转位置嵌入,以提高后续的吞吐量。 正则化:使用带学习偏差项的 LayerNorm,而非 RMSNorm。 偏置项:删除了前馈网络和多头自注意力层中所有的偏置项,除了 KQV 的。

  使用与 Stable LM 3B 模型相同的分词器(BPE),大小为 50,257;另外还参照了 StarCoder 的特殊标记,包括用于指示文件名称、存储库的星数、中间填充(FIM)等。

  对于长上下文训练,使用特殊标记来指示两个串联文件何时属于同一存储库。

  训练过程

  训练数据

  预训练数据集收集了各种可公开访问的大规模数据源,包括代码存储库、技术文档(如 readthedocs)、以数学为重点的文本,和大量 Web 数据集。

  初始预训练阶段的主要目标是学习丰富的内部表示,以显著提高模型在数学理解、逻辑推理、和处理软件开发相关复杂技术文本方面的能力。

  此外,训练数据还包含通用文本数据集,以便为模型提供更广泛的语言知识和上下文,最终使模型能够以对话方式处理更广泛的查询和任务。

  下表展示了预训练语料库的数据源、类别和采样权重等,其中代码和自然语言数据的比例为 80:20。

  另外,研究人员还引入了一个小型合成数据集,数据由 CodeAlpacadataset 的种子提示合成生成,包含 174,000 个提示。

  并且参照 WizardLM 的方式,逐步增加给定种子提示的复杂性,又额外获得了 100,000 个提示。

  作者认为,在预训练阶段早期引入这些合成数据有助于模型更好地响应自然语言文本。

  长上下文数据集

  由于存储库中多个文件通常相互依赖,因此上下文长度对于编码模型很重要。

  研究人员估计了软件存储库中 token 的中位数和平均数分别为 12k 和 18k,因此选择 16,384 作为上下文长度。

  接下来就是创建一个长上下文数据集,研究人员在存储库中获取了一些热门语言编写的文件并将它们组合在一起,在每个文件之间插入一个特殊的标记,以保持分离,同时保留内容流。

  为了规避因文件的固定顺序而可能产生的任何潜在偏差,作者采用了一种随机策略。对于每个存储库,生成两个不同的连接文件顺序。

  分阶段训练

  Stable Code 使用 32 个 Amazon P4d 实例进行训练,包含 256 个 NVIDIA A100(40GB HBM2)GPU,并使用 ZeRO 进行分布式优化。

  这里采用了一种分阶段的训练方法,如上图所示。

  训练按照标准的自回归序列建模预测下一个标记。使用 Stable LM 3B 的 checkpoint 初始化模型,第一阶段训练的上下文长度为 4096,然后进行持续的预训练。

  训练以 BFloat16 混合精度执行,all-reduce 时采用 FP32。AdamW 优化器设置为:β1=0.9,β2=0.95,ε=1e−6,λ(权重衰减)=0.1。从学习率=3.2e-4 开始,设置最小学习率为 3.2e-5,使用余弦衰减。

  自然语言模型训练的核心假设之一是从左到右的因果顺序,不过对于代码来说,这种假设并不总是成立(例如,函数调用和函数声明对于许多函数来说可以是任意顺序的)。

  为了解决这个问题,研究人员使用了 FIM(中间填充)。将文档随机拆分为三个段:前缀、中间段和后缀,然后将中间段移动到文档的末尾。重新排列后,遵循相同的自回归训练过程。

  指令微调

  在预训练之后,作者通过微调阶段进一步提高模型的对话技能,该阶段包括监督微调(SFT)和直接偏好优化(DPO)。

  首先使用在 Hugging Face 上公开可用的数据集进行 SFT 微调:包括 OpenHermes,Code Feedback,CodeAlpaca。

  在执行精确匹配重复数据删除后,三个数据集总共提供了大约 500000 个训练样本。

  使用余弦学习速率调度器控制训练过程,并将全局批处理大小设置为 512,将输入打包到长度不超过 4096 的序列中。

  在 SFT 之后,开始 DPO 阶段,利用来自 UltraFeedback 的数据,策划了一个包含大约7,000 个样本的数据集。此外,为了提高模型的安全性,作者还纳入了 Helpful and Harmless RLFH 数据集。

  研究人员采用 RMSProp 作为优化算法,DPO 训练的初始阶段将学习率提高到 5e-7 的峰值。

  性能测试

  下面比较模型在代码完成任务上的性能,使用 Multi-PL 基准来评估模型。

  Stable Code Base

  下表显示了在 Multi-PL 上,大小为 3B 参数及以下的不同代码模型的性能。

  尽管 Stable Code 的参数量分别不到 Code Llama 和 StarCoder 15B 的 40% 和 20%,但模型在各种编程语言中的平均性能与它们持平。

  Stable Code Instruct

  下表在 Multi-PL 基准测试中,评估了几个模型的 instruct 微调版本。

  SQL Performance

  代码语言模型的一个重要应用是数据库查询任务。在这个领域,将 Stable Code Instruct 的性能与其他流行的指令调优模型,和专门为 SQL 训练的模型进行比较。这里使用 Defog AI 创建的基准。

  推理性能

  下表给出了在消费级设备和相应的系统环境中运行 Stable Code 时的吞吐量和功耗。

  结果表明,当采用较低的精度时,吞吐量增加了近两倍。但需要注意的是,实施较低精度的量化可能会导致模型性能有所下降(可能很大)。

  参考资料:

  https://stability.ai/news/introducing-stable-code-instruct-3b