前面总体学习了《ChipNeMo: Domain-Adapted LLMs for Chip Design》,然后又继续仔细看了论文中的领域适配分词和领域数据微调的预训练检索模型,对于数据集的处理,也需要仔细看一下。
提炼重点:1)对于数据集,除了领域数据,依然需要公共数据,避免由于微调带来模型原有能力的灾难性遗忘。2)需要有领域评估基准,同样的,评估基准需要包含公共的LLM学术基准。3)数据重采样,这个方面,比如文章提到“对代码数据进行了下采样,同时对自然语言数据,特别是设计文档进行了上采样”等,但是,具体的采样比例如何获得,文章并没有说。参考其他来源,数据重采样的合适比例,应该是通过尝试获得,训练后如果评估效果不好,相应调整数据采样比例,反复试验获得的良好的评估结果。
数据集处理
对于数据集处理,包括四个方面。
1、训练数据
在领域适配预训练(DAPT)期间,文章从专有的芯片设计特定数据源和公开可用的数据集中构建了数据集。
芯片设计数据集:文章的内部数据集包含与芯片设计相关的各种文本来源,涵盖了设计、验证、基础设施和内部文档。表3提供了使用LLaMA2分词器收集后过滤的数据的细分,以及相应的token数量。文章通过收集所有相关内部数据,然后根据文件名扩展进行过滤,区分机器生成和人工编写的内容来构建数据集。尽管文章在三个特定用例上进行了评估,但文章并没有特别将数据集限制为已知与这些用例相关的来源,因为文章相信纳入额外的领域知识将提高性能。收集、清理和过滤后,内部数据训练语料库拥有231亿个token。
公共数据集:文章使用来自各种来源的公开数据样本来增强芯片设计特定的数据。这是开发基础大型语言模型的常见做法。文章的方法是从其他语言模型中重用公共训练数据,条件是它必须是公开可访问的,并且与开源兼容。这些数据集与LLaMA2(Touvron等人,2023年)中使用的预训练数据高度相关,旨在DAPT过程中保留一般知识和自然语言能力。ChipNeMo使用的公共数据集可以分为两组,自然语言和代码。对于自然语言部分,文章从Wikipedia数据(Gao等人,2020年)中提取,因为它被广泛认为数据质量高。对于代码,文章利用GitHub数据(Kocetkov等人,2022年),重点关注也出现在文章内部数据芯片设计数据集中的编程语言,如C++、Python和Verilog。为了确保整体数据集代表预训练分布,文章执行了下采样操作,结果大约有9.2%的总训练token从这些公共数据集中采样,保持自然语言和代码的代表性平衡。训练用途的数据分布详情显示在表3中。
数据混合:文章收集的领域数据中有很大一部分是由来自不同来源的未标记代码组成的。为了增强模型对特定领域知识的理解,文章在2到4个训练时期内对代码数据进行了下采样,同时对自然语言数据,特别是设计文档进行了上采样。文章还增加了文章认为与下游应用程序更相关的数据的表示,例如人工编写的EDA工具脚本。此外,文章合并了1个训练周期的公开可用域数据。训练的Token分布细节如表3所示。
2、对齐数据
在进行监督式微调(SFT)时,文章采用了一个广泛可用的通用聊天SFT指令数据集。该数据集主要由公开可用的指令遵循数据集组成,包括OASST(Köpf等人,2023年)、FLAN(Wei等人,2022年)、P3(Sanh等人,2022年)以及一小组包含各种主题的广泛领域专有数据集,如头脑风暴、开放式问答、重写、总结等。值得注意的是,这里讨论的SFT指令数据主要关注一般自然语言任务,不包含与芯片设计下游用例相关的任何信息或任务。总的来说,该数据集包含128,000个训练样本。
对于SteerLM(Dong等人,2023年),文章严格遵循了(Wang等人,2023年)中的实现。属性训练数据仅包含来自HelpSteer(Wang等人,2023年)和OASST(Köpf等人,2023年)的公开可用数据。对于模型的属性条件微调,文章仅使用了包含56,000个训练样本的OASST数据。
此外,文章还精心组装了一个领域特定的指令数据集,用于将模型与下游用例对齐。这些示例由主题专家精心制作,并格式化为单轮问答。表4展示了文章的领域特定指令数据集的数量。值得注意的是,与大量的生成式聊天指令数据相比,领域特定指令数据集中的总训练样本数量相当少。
3、领域评估基准
为了快速且定量地评估各种模型的准确性,文章建立了以多项选择题和答案格式为结构的评估标准,每个用例都设计有至少一个复杂答案选项,以挑战领域专业知识有限的个体。在制定这些多项选择题的过程中,与领域专家的合作至关重要。文章的目标是确保每个问题都至少包含一个复杂的答案选项,从而对那些领域专业知识有限的人构成挑战。文章还特别注意防止问题中不经意地掺杂来自文章领域特定对齐数据的信息。除了每个用例的基准之外,文章还创建了另一个涵盖模拟和数字设计主题的通用电路设计知识基准。评估基准的多项选择题数量如表5所示。
当文章在上述基准上报告结果时,文章采用五次不同运行的平均结果,以减轻测试过程中的变异和噪声的影响。每次迭代使用一组5个样本的例子,在每次单独运行中引入变化。
除了这些领域特定的评估基准之外,文章还包括了常用的公开可用的LLM学术基准。此外,文章还通过评估Python的HumanEval(Chen等人,2021年)和Verilog的VerilogEval(Liu等人,2023年)来衡量模型的代码生成能力。
4、数据收集过程
芯片设计数据集的数据收集,是用一组shell和Python脚本实现的,旨在识别相关的设计数据和文档,在适用的情况下将其转换为纯文本,使用基本质量指标对其进行筛选,计算精确的文件重复数据消除的校验和,并压缩它们以供存储。收集流程没有使用现成的LLM特定的抓取和收集脚本,因为文章的目标是通过内部数据源(网络文件系统和内部web应用程序)的原位数据收集来最大限度地减少空间需求。对于基于文件系统的收集,在对数据进行质量过滤的同时,数据被保留在适当的位置,而不是在本地存储额外的原始数据集。
设计和验证数据收集包括各种源文件,包括Verilog和VHDL(RTL和网表)、C++、Spice、Tcl、各种脚本语言以及与构建相关的配置文件。来自内部web服务的数据是通过REST API调用和传统抓取收集的,在这两种情况下,都使用开源BeautifulSoup(Richardson,2007)Python库删除HTML格式,以最大限度地减少无意中删除编码示例,代价是引入更多的样板导航栏和其他HTML页面元素。文章的数据收集流支持传统的文档格式,包括.docx、.pptx和.pdf,使用现成的Python转换库和开源工具。
由于大多数内部数据被认为是高质量的,因此应用了最小限度的过滤:行数过滤用于确保排除过大或过小的文件,并将文件分为手动编写和工具生成的大类。
数据用例举例如下图
数据重采的比例变化,如下图
领域评估基准如下图
训练消融研究
对于文章的消融研究,文章进行了多轮领域适配预训练。
使用增强型分词器与原始分词器进行训练的差异似乎可以忽略不计。因此,文章将开放领域学术基准上的准确性降低主要归因于领域数据。此外,去除公共数据集仅在大多数任务上略微退步,包括学术基准。
在文章的探索中,文章尝试采用更大的学习率,如CodeLLaMA(Rozier等人,2023年)中所采用的。文章观察到在初始训练步骤中训练损失有大幅波动。尽管这种方法最终导致了训练和验证损失的改善,但文章注意到在所有领域特定和学术基准上都出现了大幅下降,编码除外。文章假设较小的学习率发挥了双重作用,既促进了通过DAPT领域知识的蒸馏,又保持了不会偏离基础模型太远的平衡,从而在显著提高领域特定任务性能的同时,保持了通用自然语言能力。
文章还探索了在领域适配预训练(DAPT)的背景下应用参数高效微调(PEFT)。为此,文章进行了两项实验,涉及引入LoRA适配器(Hu等人,2021年),引入了额外的2640万个(小型)和2.112亿个(大型)参数。在这两种情况下,文章的发现揭示了与全参数DAPT方法相比,在领域特定任务上的准确性存在显著差距。此外,当比较小型和大型PEFT模型的结果时,文章观察到在领域任务准确性上有边际提升,大型适配器表现出轻微的改进。