1. 什么是 DevOps-Model
DevOps-Model 是蚂蚁集团联合北京大学发布面向中文 DevOps 领域的大语言模型,通过收集 DevOps 领域相关的专业数据,再针对模型进行语言模型的加训和对齐训练,产出可以帮助工程师在整个开发运维生命周期提效的大模型。弥补当前大模型在 DevOps 领域的缺失,旨在做到有问题,问 DevOps-Model !
当前我们已经开源了 7B 和 14B 两种规格的经过加训得 Base 模型和经过对齐后的 Chat 模型,同时还开源了对应的训练代码,欢迎大家一起合作建设!
2. 项目地址
Github 地址:github.com/codefuse-ai...
ModelScope 地址:
- DevOps-Model-7B-Base:modelscope.cn/models/code...
- DevOps-Model-7B-Chat:modelscope.cn/models/code...
- DevOps-Model-14B-Base:modelscope.cn/models/code...
- DevOps-Model-14B-Chat:modelscope.cn/models/code...
3. 评测结果
我们的 7B 模型和 14B 模型在 DevOps 相关的测试题中,都处于业界领先的水平。 具体的测评数据集和结果如下:
针对模型评测,最初并没有这样的一个 benchmark 用来 DevOps 领域进行测试,所以我们首先选用了一些通用开源测试中和 DevOps 领域相关的选择题进行测试,具体测试数据如下:
数据集 | 考试科目 | 题目总数 |
---|---|---|
CMMLU | Computer science | 204 |
Computer security | 171 | |
Machine learning | 122 | |
CEval | college programming | 37 |
computer_architecture | 21 | |
computer_network | 19 | |
总计 | 总计题目数 | 574 |
我们分别测试了 Zero-shot 和 Five-shot 的结果,还纳入了一些通用模型进行测试,测试后的结果图如下:
具体的得分如下表所示:
参数量级 | 模型 | 模型大小 | Zero-shot 得分 | Five-shot 得分 |
---|---|---|---|---|
10+ B | DevOps-Model-14B-Base | 14B | 70.73 | 73.00 |
Qwen-14B-Base | 14B | 69.16 | 71.25 | |
Baichuan2-13B-Base | 13B | 55.75 | 61.15 | |
DevOps-Model-14B-Chat | 14B | 74.04 | 75.96 | |
Qwen-14B-Chat | 14B | 69.16 | 70.03 | |
Baichuan2-13B-Chat | 13B | 52.79 | 55.23 | |
7B | DevOps-Model-7B-Base | 7B | 62.72 | 62.02 |
Qwen-7B-Base | 7B | 55.75 | 56.0 | |
Baichuan2-7B-Base | 7B | 49.30 | 55.4 | |
Internlm-7B-Base | 7B | 47.56 | 52.6 | |
DevOps-Model-7B-Chat | 7B | 62.20 | 64.11 | |
Qwen-7B-Chat | 7B | 46.00 | 52.44 | |
Baichuan2-7B-Chat | 7B | 52.26 | 54.46 | |
Internlm-7B-Chat | 7B | 52.61 | 55.75 |
然而这样的测试量级还是过小,由于现在业界缺少针对 DevOps 大模型的 benchmark,所以我们也在自己搭建这样的一个评测数据集,Github 地址: github.com/codefuse-ai...,也期待大家可以一同合作建设。如果想了解更多评测细节,可以参考 mp.weixin.qq.com/s/eIZRl7Gr5...
4. 模型使用
如果想要使用模型的话,可以参考以下的方式使用。
- 首先 github.com/codefuse-ai... 找到自己想要下载的 Chat 模型版本,当前提供了 7B 和 14B 的模型
- 根据以下代码来和模型进行交互,如果遇到缺少包的情况,可以 pip 安装一下 github 中的 requirements.txt
ini
from transformers import AutoModelForCausalLM, AutoTokenizer
from transformers.generation import GenerationConfig
tokenizer = AutoTokenizer.from_pretrained("path_to_DevOps-Model-Chat", trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained("path_to_DevOps-Model-Chat", device_map="auto", trust_remote_code=True, bf16=True).eval()
# 指定 generation_config
model.generation_config = GenerationConfig.from_pretrained("path_to_DevOps-Model-Chat", trust_remote_code=True)
# 第一轮对话
resp, hist = model.chat(query='你是谁', tokenizer=tokenizer, history=None)
print(resp)
# 我是 DevOps-Model,一个由蚂蚁集团平台技术事业群风险智能团队和北京大学联合研发的人工智能机器人,可以与用户进行自然语言交互,并协助解答 DevOps 全生命周期中的各种问题。如果您有任何需要协助的问题或者想要进行闲聊,都可以和我交流哦。
# 第二轮对话
resp2, hist2 = model.chat(query='Java 中 HashMap 和 Hashtable 有什么区别', tokenizer=tokenizer, history=hist)
print(resp2)
# HashMap 和 Hashtable 都是 Java 中常用的哈希表实现,它们的主要区别在于:
# 1. Hashtable 是线程安全的,而 HashMap 不是线程安全的,因此在多线程环境下,Hashtable 的性能更稳定。
# 2. Hashtable 中的方法都是同步的,而 HashMap 的方法不是同步的,因此在多线程环境下,Hashtable 的性能更好。
# 3. Hashtable 中的 key 和 value 都必须实现 Serializable 接口,而 HashMap 中的 key 和 value 可以是任何对象,包括基本数据类型。
# 4. Hashtable 的初始容量是 11,而 HashMap 的初始容量是 16。
# 总之,如果需要在多线程环境下使用哈希表,并且需要保证线程安全,那么应该使用 Hashtable;如果不需要考虑线程安全,或者需要快速地进行哈希表操作,那么应该使用 HashMap。
# 第三轮对话
resp3, hist3 = model.chat(query='线程安全代表什么', tokenizer=tokenizer, history=hist2)
print(resp3)
# 线程安全是指在多线程环境下,程序能够正确地处理并发访问,并且不会出现数据竞争、死锁、饥饿等异常情况。线程安全的程序可以保证在不同的线程之间共享同一个数据结构时,数据的正确性和一致性。线程安全的实现通常需要使用同步机制,如锁、原子操作等,来保证对共享数据的访问是线程安全的。在 Java 中,可以通过 synchronized 关键字、Lock 接口等机制来实现线程安全。
Github 中的代码也提供了微调的方式,有兴趣的可以在 DevOps-Model 的基础上来微调自己的模型。
5. 模型信息
5.1.1. 基座模型
在基础通用模型选择上,我们考量了模型训练数据大小、模型能力、模型参数量级后,最终选择的是 Qwen-7B 和 Qwen-14B 作为通用模型。因为在公开的一些评测榜单上,Qwen 系列模型基本属于同参数量级下效果最好的模型。同时预训练的语料有达到 3T token 数这样的量级,可以给基座模型带来更为全面的知识。
5.1.2. 训练框架
训练框架上,我们采用的是基于开源训练库 LLaMA-Factory 加以改造来进行训练,训练时通过 flash-attention、ZeRO、混合精度等技术来保障高效训练。整体的 Qwen 模型架构是在 LLaMA 的结构上做了一些调整,其中包含采用了 RoPE 作为位置编码的方式来提高模型的外推能力,采用了RMSNorm 来提高训练稳定性,采用SwiGLU激活函数来提高模型的表现。
6. 模型训练
6.1. 训练流程
根据查阅文献可知,大部分领域模型都是在对话模型的基础上,通过SFT微调来进行知识注入。而SFT微调所需要QA预料基本都来自于ChatGPT生成。然而,该方案可能存在QA语料无法完全覆盖领域知识的情况。
因此,DevOps-Model采用的是预训练加训 + SFT微调的方案,如图2.1所示。我们认为针对领域大模型,预训练的加训是必要的,因为其可以将领域内的一些知识在预训练阶段注入到大模型,如果这些知识在通用大模型预训练时没有出现过,那会让大模型学习到新的知识;如果出现过,就可以让大模型进一步加深印象。第二步则是大模型对齐,目的是让大模型可以根据问题来回答最合适的内容。
图2.1 DevOps-Model训练流程
6.2. 训练数据
6.2.1. 数据收集
模型的定位是中文 DevOps 领域大模型,因此收集与中文DevOps相关的预训练数据和QA数据。
- 预训练数据主要来自互联网技术博客、技术文档、技术书籍等,最终收集到了 50G+ 的预训练语料数据;
- 针对 QA 数据,我们的目的是想让模型不但对齐到通用的问答能力,而且针对 DevOps 领域也可以学会如何更好的回答问题,因此不但收集了通用领域的单轮和多轮对话数据,还针对 DevOps 领域,通过爬取和 ChatGPT 生成的方式产出了属于 DevOps 领域的问答数据。最终我们精心筛选了约 200K 的 QA 数据进行 SFT微调训练,具体数据量如下表所示。
数据类型 | 数据量级 |
---|---|
通用单轮 QA | 50K |
通用多轮 QA | 20K |
DevOps 领域 QA | 130K |
6.2.2. 数据筛选
由于预训练数据大部分是从互联网上收集的数据,质量会参差不齐,而大模型训练中数据是最重要的一环,我们建立了如上图所示的清洗 Pipeline,来针对收集到的数据进行质量的全面过滤。
- 首先,由专家经验和人工筛选,总结出来了一批文档级别的 Heuristic 过滤规则,这一步主要用来过滤掉那些质量非常差的文档;
- 然后,即便是一篇质量稍差的文章中,也有可能还是含有一些有价值的领域知识,我们也需要尽可能的进行收集。此处,我们对文章进行段落拆分,将文章拆分成一个个段落;
- 然后,我们将拆分后的段落会再次通过步骤1进行过滤,便得到了一批经过规则过滤后的段落;
- 然后,我们摘取了其中 1000 个段落,由经验丰富的专业开发人员来进行打标,获得高质量的打标数据;
- 最后,我们根据打标后的结果来训练了一个打分模型来针对段落进行质量的打分,段落的向量模型选用了预训练好的中文版本的 Sentence-Bert,打分算法选用了逻辑回归,为了避免打分模型的误差,会再通过帕累托分布来根据段落的质量打分进行采样来决定要不要过滤这个段落。
经过这个 Pipeline 后,我们最终沉淀下 15G 左右的数据来进行大模型的预训练加训。
7. 未来展望
当前我们发布的模型还只是我们的 1.0 版本,后续还有很大的提升空间,比如构造更加大的,更多样的 DevOps 数据集,采用 DevOps 领域的专有词汇来扩充模型的词表等方式。当前的模型只是一个引子,希望引出大家可以合作一起为 DevOps-Model 添砖加瓦,能够打造成工程师最值得信赖的大模型。
8. 关于DevOpsGPT
DevOpsGPT是我们发起的一个针对DevOps领域大模型相关的开源项目,主要分为三个模块。本文介绍的DevOps-Model是其中的大模型模块,其目标是构建DevOps 领域LLM行业标准评测。此外,还有DevOps-Eval、DevOps-ChatBot两个模块,分别为DevOps领域专属评测榜单和DevOps领域智能助手。我们的目标是在DevOps领域,包含开发、测试、运维、监控等场景,真正地结合大模型来提升效率、成本节约。我们期望相关从业者一起贡献自己的才智,来让"天下没有难做的coder",我们也会定期分享对于 LLM4DevOps 领域的经验&尝试。
欢迎使用&讨论&共建
(1)CodeFuse官网:codefuse.alipay.com/
(2)ChatBot - 开箱即用的 DevOps 智能助手:github.com/codefuse-ai...
(3)Eval - DevOps 领域 LLM 行业标准评测:github.com/codefuse-ai...
(4)Model - DevOps 领域专属大模型:github.com/codefuse-ai...