国科网

2025-06-07 23:13:31  星期六
立足国科融媒,服务先进科技
让天下没有难做的开发和运维,DevOps终于有了专属大模型,蚂蚁和北大联合发布

点赞

0
发布时间:2023年11月16日 浏览量:282次 所属栏目:人工智能 发布者:田佳恬

大语言模型在各类 NLP 下游任务上都取得了显著进展,各种垂直领域大模型更是如雨后春笋般层出不穷。然而在 DevOps 领域,却迟迟没有相关大模型问世。为填补这方面的空白,蚂蚁集团联合北京大学发布了面向中文 DevOps 领域的首个开源大语言模型,即 DevOps-Model 。

该大模型旨在帮助开发人员在软件开发和运维的整个生命周期中提高效率,最终目标是实现在 DevOps 流程中面临任何问题时,都可以通过向 DevOps-Model 提问来获取解决方案!

当前已经开源了 7B 和 14B 两种规格的 Base 和 Chat 模型,同时还开源了对应的训练代码。

此外,为了有效评估 DevOps 领域大模型的性能,我们同时发布了首个面向 DevOps 领域的大模型评测基准 DevOps-Eval。该评测基准根据 DevOps 全流程进行划分,包含计划、编码、构建、测试、发布、部署、运维和监控这 8 个类别,包含 4850 道选择题。

此外,DevOps-Eval 还特别对运维 / 监控类别做了细分,添加日志解析、时序异常检测、时序分类和根因分析等常见的 AIOps 任务。由于 DevOps-Eval 根据场景对评测样本做了详尽的细分,因此除了 DevOps 领域大模型,也方便对特定领域大模型进行评测,如 AIOps 领域等。

目前,第一期 DevOps 领域模型的评测榜单已发布,除 DevOps-Model 外,还包含 Qwen、Baichuan、Internlm 等开源大语言模型;同时,DevOps-Model 和 DevOps-Eval 相关论文也在撰写中。欢迎相关从业者一起来进行共建、优化 DevOps 领域大模型和评测题目,我们也会定期更新模型、题库和评测榜单。

DevOps-Model

  • Github 地址:https://github.com/codefuse-ai/CodeFuse-DevOps-Model/tree/main
  • 模型地址:
  • 7B 版本
    https://modelscope.cn/models/codefuse-ai/CodeFuse-DevOps-Model-7B-Base/summary
    https://modelscope.cn/models/codefuse-ai/CodeFuse-DevOps-Model-7B-Chat/summary
  • 14B 版本
  • https://modelscope.cn/models/codefuse-ai/CodeFuse-DevOps-Model-14B-Base/summaryhttps://modelscope.cn/models/codefuse-ai/CodeFuse-DevOps-Model-14B-Chat/summary

DevOps-Eval

  • GitHub 地址:https://github.com/codefuse-ai/codefuse-devops-eval
  • HuggingFace 地址:https://huggingface.co/datasets/codefuse-admin/devopseval-exam

DevOps-Model 的构建过程

基座模型

在基础通用模型选择上,我们考量了模型训练数据大小、模型能力、模型参数量级后,最终选择的是 Qwen-7B 和 Qwen-14B 作为通用模型。因为在公开的一些评测榜单上,Qwen 系列模型基本属于同参数量级下效果最好的模型。

同时预训练的语料有达到 3T token 的量级,可以给基座模型带来更为全面的知识。

训练框架

训练框架上,我们采用的是基于开源训练库 LLaMA-Factory 加以改造来进行训练,训练时通过 flash-attention、ZeRO、混合精度等技术来保障高效训练。

整体的 Qwen 模型架构是在 LLaMA 的结构上做了一些优化,其中包含采用了 RoPE 作为位置编码的方式来提高模型的外推能力,采用了 RMSNorm 来提高训练稳定性,采用 SwiGLU 激活函数来提高模型的表现。

训练流程

根据查阅文献可知,大部分领域模型都是在对话模型的基础上,通过 SFT 微调来进行知识注入。而 SFT 微调所需要 QA 语料基本都来自于 ChatGPT 生成。然而,该方案可能存在 QA 语料无法完全覆盖领域知识的情况。

因此,DevOps-Model 采用的是预训练加训 + SFT 微调的方案,如下图所示。我们认为针对领域大模型,预训练的加训是必要的,因为其可以将领域内的一些知识在预训练阶段注入到大模型。

如果这些知识在通用大模型预训练时没有出现过,那会让大模型学习到新的知识;如果出现过,就可以让大模型进一步加深印象。第二步则是大模型对齐,目的是让大模型可以根据问题来回答最合适的内容。

图1. DevOps-Model 训练流程

训练数据

  • 数据收集

模型的定位是中文 DevOps 领域大模型,因此需要收集与中文 DevOps 相关的预训练数据和 QA 数据。

预训练数据主要来自互联网技术博客、技术文档、技术书籍等,最终收集到了 50G+ 的预训练语料数据;

针对 QA 数据,我们的目标是想让模型不仅能够对齐到通用的问答能力,针对 DevOps 领域也可以学会如何更好的回答问题,因此不但收集了通用领域的单轮和多轮对话数据,还针对 DevOps 领域,通过爬取和 ChatGPT 生成的方式产出了属于 DevOps 领域的问答数据。最终我们精心筛选了约 200K 的 QA 数据进行 SFT 微调训练,具体数据量如下表所示。

图片


  • 数据筛选

由于预训练数据大部分是从互联网上收集的数据,质量参差不齐,而大模型训练中数据是最重要的一环,我们建立了如下图所示的清洗 Pipeline,全面过滤收集到的数据。

图片

图2. DevOps-Model 预训练数据清洗 Pipeline

1) 首先,由专家经验和人工筛选,总结出来了一批文档级别的 Heuristic 过滤规则,这一步主要用来过滤掉那些质量非常差的文档;

2) 其次,即便是一篇质量稍差的文章,也有可能含有有价值的领域知识,也需要尽可能的进行收集。此处,我们对文章进行段落拆分,将文章拆分成一个个段落;

3) 然后,我们将拆分后的段落会再次通过步骤 1 进行过滤,便得到了一批经过规则过滤后的段落;

4) 再摘取其中 1000 个段落,由经验丰富的专业开发人员打标,获得高质量的打标数据;

5) 最后,根据打标后的结果来训练了一个打分模型来针对段落进行质量的打分,段落的向量模型选用了预训练好的中文版本的 Sentence-Bert,打分算法选用了逻辑回归,为了避免打分模型的误差,会再通过帕累托分布来根据段落的质量打分进行采样来决定是否过滤这个段落。

经过这个 Pipeline 后,最终沉淀下 15G 左右的数据来进行大模型的预训练加训。

模型使用

DevOps-Model 的使用可以参考如下流程使用,更详细的信息请参考 Github。

  • 模型下载:

从 https://github.com/codefuse-ai/CodeFuse-DevOps-Model/tree/main ;找到自己想要下载的 Chat 模型版本,当前提供了 7B 和 14B 的模型;

  • 模型交互:
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 接口等机制来实现线程安全。

分享说明:转发分享请注明出处。

    相关图讯
    网站简介  |   联系我们  |   广告服务  |   监督电话
    本网站由国科网运营维护 国科网讯(北京)技术有限公司版权所有  咨询电话:010-88516927
    地址:北京市海淀区阜石路甲69号院1号楼1层一单元114
    ICP备案号:京ICP备15066964号-8   违法和不良信息举报电话:010-67196565
    12300电信用户申诉受理中心   网络违法犯罪举报网站   中国互联网举报中心   12321网络不良与垃圾信息举报中心   12318全国文化市场举报网站
    代理域名注册服务机构:阿里巴巴云计算(北京)有限公司