【新智元导读】Stability AI 在大佬出走后似乎并未受到影响,最近又官宣了新的代码模型 Stable Code Instruct 3B,在之前的基础上更进一步,干掉了所有同级竞品,甚至能和 7B、15B 的模型掰手腕。
大佬出走后,第一个模型来了!
就在今天,Stability AI 官宣了新的代码模型 Stable Code Instruct 3B。
要说 Stability 也是真的很神奇,首席执行官辞职了,Stable Diffusion 其中几位作者也离开了,投资公司出了点故障,自己的工资也可能要发不起了,
—— 但是,楼外风雨飘摇,实验室里岿然不动,研究该做做,论文该发发,模型该调调,大模型各领域的战争是一个没落下。
而且不仅仅是铺开摊子搞全面战争,每项研究也都在不断前进,比如今天的 Stable Code Instruct 3B 就是在之前的 Stable Code 3B 的基础上做了指令调优:
论文地址:https://static1.squarespace.com/static/6213c340453c3f502425776e/t/6601c5713150412edcd56f8e/1711392114564/Stable_Code_TechReport_release.pdf
通过自然说话提示,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
本文来自微信公众号:新智元 (ID:AI_era)