GRACE框架:基于图动态核心集选择,高效训练大语言模型
1. 项目概述:当大模型训练遇上“数据过载”,如何用更少的数据练出更强的模型?
在大型语言模型(LLM)如火如荼发展的今天,一个核心的痛点日益凸显:训练数据量呈指数级增长,但计算资源(尤其是GPU显存和算力)的增长却相对线性。动辄数TB的文本数据,意味着一次完整的训练周期可能需要数周甚至数月,耗费数百万美元的计算成本。对于大多数研究团队和企业来说,这无疑是一道难以逾越的门槛。于是,一个朴素但极具挑战性的问题摆在我们面前:我们真的需要遍历所有数据才能训练出一个好模型吗?
答案很可能是否定的。这就是“核心集选择”技术试图解决的问题。它的目标是从海量的训练数据中,智能地筛选出一个规模小得多、但“信息密度”极高的子集(即核心集),用这个子集来训练模型,以期达到与使用全量数据相近甚至更好的性能,同时大幅削减计算开销。你可以把它想象成一位经验丰富的编辑,从一本百万字的巨著中,精准提炼出最精华的章节,让读者用最短的时间掌握全书的核心思想。
然而,传统的核心集选择方法在应对LLM训练时遇到了瓶颈。它们大多是“静态”的:在训练开始前,基于初始的模型状态(如随机初始化的模型)计算一次样本重要性,然后固定使用这个子集进行后续所有轮次的训练。但LLM的训练是一个动态演变的过程。随着模型参数的更新,数据点的“难度”(即模型预测的损失)和“代表性”(在特征空间中的位置)都在不断变化。一个在训练初期被认为“简单”的样本,到了后期可能变得“困难”且富含信息;反之亦然。用静态的眼光去选择数据,无异于刻舟求剑,很可能在训练中后期引入大量噪声或遗漏关键样本,导致模型性能下降或收敛缓慢。
正是在这样的背景下,GRACE框架应运而生。它不再满足于“一选定终身”,而是引入了一套基于k-近邻图与自适应更新的动态核心集选择机制。其核心思想非常直观:将整个训练数据集构建成一个相互连接的图网络,图中的节点是数据样本,边代表样本间的语义相似性。训练过程中,系统像一位敏锐的“哨兵”,持续监控模型状态的变化。一旦检测到数据的重要性分布发生了显著偏移,它不会笨拙地重新计算所有样本,而是像“涟漪扩散”一样,只对图中变化最剧烈的“震中”区域(少量关键样本)进行精确重算,然后将更新后的信息通过图结构传播给其邻居,从而高效、近似地更新全图节点的状态,并据此动态调整核心集的构成。
我曾在多个LLM微调项目中尝试过不同的数据选择策略,从简单的随机采样、基于损失的中位数采样,到更复杂的梯度匹配方法。实践下来,静态方法在预算极低(如1%-5%数据)时往往表现不稳定,而一些动态方法又因为频繁的全量重计算而得不偿失,计算开销甚至可能超过训练本身。GRACE所代表的这种“图传播+选择性更新”的思路,在我看来,是在“选择质量”和“更新成本”之间找到了一个非常巧妙的平衡点。接下来,我将深入拆解GRACE框架的每一个技术环节,并结合实际调参经验,分享如何将这套理论落地,真正提升你的LLM训练效率。
2. GRACE框架核心设计思路拆解:为什么是“图”与“动态”?
在深入代码和公式之前,我们首先要理解GRACE框架设计背后的根本逻辑。它主要回答了核心集选择中的两个关键问题:“依据什么标准选?” 和 “何时以及如何更新这个选择?”。
2.1 双引擎驱动:信息量与多样性的权衡
一个理想的核心集应该同时具备两个特性:高信息量和高多样性。信息量高的样本(例如,模型当前难以正确预测的样本)能更有效地驱动模型参数更新;多样性高的样本(覆盖特征空间的不同区域)则能保证模型学到广泛的知识,避免过拟合到某一特定模式。
GRACE巧妙地用一个综合评分函数将二者统一起来。对于数据集 ( \mathcal{D} ) 中的一个候选子集 ( S ),其评分 ( R(S) ) 定义为:
[ R(S) = \underbrace{\lambda \cdot \sum_{x_i \in S} \hat{I}(x_i)}{\text{信息量部分}} + \underbrace{(1-\lambda) \cdot \text{Coverage}(S)}{\text{多样性部分}} ]
其中:
- ( \hat{I}(x_i) ) 是样本 ( x_i ) 的重要性分数。GRACE采用了一种基于梯度的度量方式(具体是EL2N分数或其变体),其核心思想是:一个样本的梯度范数越大,通常意味着当前模型在该样本上的预测不确定性越高,因此包含它进行训练带来的潜在收益(即边际增益)也越大。这比单纯使用训练损失更稳定,因为损失值可能饱和,而梯度更能反映参数空间的优化方向。
- ( \text{Coverage}(S) ) 是子集 ( S ) 的覆盖分数,用于衡量其多样性。GRACE没有采用复杂的聚类中心计算,而是利用k-NN图的结构,定义覆盖分数为 ( S ) 中节点与其邻居的相似度加权和。直观上,如果一个子集包含了那些能够“代表”其周围一片相似样本的节点,那么它的覆盖分数就高。
- ( \lambda \in [0, 1] ) 是一个平衡超参数,用于控制信息量与多样性之间的权重。
实操心得:λ的选择 这个λ参数非常关键。在我们的实验中(使用Phi-2和Llama2-7B),发现将其设置在0.4到0.6之间通常能取得最佳效果。当λ接近1时,选择会过于偏向“难题”,可能导致训练不稳定(梯度爆炸或震荡);当λ接近0时,选择会过于偏向“覆盖”,可能选入太多简单或重复的样本,导致学习效率低下。建议从一个中间值(如0.5)开始,根据验证集性能进行微调。
这个评分函数是单调递增且子模的。子模性是一个非常重要的性质,它直观地理解为“边际收益递减”:随着已选集合的扩大,新增一个样本所带来的收益增量会越来越小。这个性质使得我们可以使用经典的贪心算法来近似求解这个NP-hard的组合优化问题,并且理论上有 ( (1 - 1/e) ) 的近似比保证。也就是说,贪心算法选出的核心集,其评分至少能达到最优解的63%以上。这为算法的有效性提供了理论基石。
2.2 k-NN互图:将数据关系“网络化”
静态方法通常独立地看待每个样本,而GRACE的核心创新在于引入了k-NN互图来建模样本间复杂的、动态的相似性关系。
图的定义:构建一个无向图 ( G = (\mathcal{D}_{train}, E) )。每个节点对应一个训练样本 ( X_i ),节点上存储着该样本当前的重要性分数 ( I(X_i) ) 和隐藏层表征 ( \bar{H}i )。一条边 ( e{ij} ) 存在于节点 ( X_i ) 和 ( X_j ) 之间,当且仅当 ( X_j ) 是 ( X_i ) 的k个最近邻之一,并且 ( X_i ) 也是 ( X_j ) 的k个最近邻之一。这就是“互”k-NN,它比单向k-NN图更稳定,能过滤掉一些非对称的噪声关系。
边的权重:定义为 ( w_{ij} = \exp(-|\bar{H}_i - \bar{H}_j|^2 / 100) )。这是一个高斯核函数,表征空间距离越近,权重越接近1;距离越远,权重越接近0。分母的100是一个缩放因子,用于调节相似度的敏感度。
注意事项:k值的选择与计算效率 k值决定了图的连通密度。k太小(如3或5),图可能过于稀疏,导致信息传播不畅;k太大(如50或100),则图过于稠密,不仅计算边权开销大,也可能让局部传播失去意义(因为“邻居”的概念变得模糊)。论文中使用了k=10,这是一个经验上的平衡点。在实际构建时,对于超大规模数据集(>100万样本),精确计算全量k-NN的复杂度是 ( O(N^2 d) ),不可行。必须使用近似最近邻算法,如FAISS(Facebook AI Similarity Search)库中的IVF(倒排文件)或HNSW(分层可导航小世界)索引。这能将复杂度降至 ( O(N \log N) ) 级别,是工程落地的关键。
这个图结构成为了GRACE动态更新的“基础设施”。它使得“局部变化影响全局”这一过程可以通过高效的图传播算法来实现,避免了全量重算。
3. 动态更新机制详解:如何实现低成本、高精度的状态跟踪?
这是GRACE框架中最精妙的部分。静态图很快会过时,而频繁重建全图成本又太高。GRACE的解决方案是一个三步循环:自适应检查 -> 选择性重计算 -> 近似图更新。
3.1 自适应更新检查:何时该“动”?
GRACE不会在每个训练步或每个epoch都盲目地更新图。它设置了一个检查间隔 ( t_c )(例如,每训练1000步检查一次)。当到达检查点时,它会从当前核心集中随机采样一小批样本 ( S_t ),计算它们历史重要性分数与当前模型下重新计算的重要性分数之间的平均差异度 ( \Delta I )(公式18)。
这个差异度计算并非简单的平均绝对误差,而是引入了指数衰减加权,更关注最近几次检查的变化。如果 ( \Delta I ) 超过一个预设阈值 ( \delta ),则认为模型对数据的“认知”发生了显著漂移,触发更新流程;否则,继续使用当前的核心集进行训练。
踩坑记录:阈值δ的设定 阈值δ是控制更新频率的“阀门”。设得太低(如0.05),会导致更新过于频繁,浪费计算资源;设得太高(如0.3),则更新滞后,核心集质量下降。我们的经验是,在训练初期,模型变化剧烈,δ可以设得稍低一些(如0.1),让更新更灵敏;在训练中后期,模型趋于稳定,δ可以适当调高(如0.15-0.2),减少不必要的更新。论文中的实验也表明,在中等阈值(0.1-0.2)下性能最好。
3.2 选择性重计算:更新哪些“关键点”?
一旦决定更新,下一个问题就是:全量数据中,哪些样本最值得重新计算其分数和表征?GRACE提出了一个精巧的“更新必要性”分数 ( s_{update}(X_i) )(公式19),由两个因子相乘构成:
- 陈旧度:( sta(X_i) = t - t_{history} )。即该样本自上次更新以来经过的训练步数。越久未更新,其状态可能越不准确。
- 独特性:( uni(X_i) = |I(X_i) - \text{邻居加权平均分数}| )。这衡量了该样本与其邻居的差异。如果一个样本的分数与其周围邻居的平均分数相差很大,说明它可能处于决策边界或是一个“异常点”,更新它的价值很高,因为其变化可能会影响对一片区域的理解。
( s_{update}(X_i) ) 越高的样本,越优先被选入重计算集合 ( D_{recal} )。为了避免选出一堆空间上扎堆的相似样本,算法在贪心选择时还加入了一个约束:新选的样本不能是已选样本的邻居。这保证了重计算样本在特征空间中的多样性。
最终,只对 ( D_{recal} ) 这个规模远小于全量数据集(例如,预算 ( k_{recal} ) 设为核心集大小的5%-10%)的子集进行前向传播和梯度计算,得到精确的新分数和新表征。
3.3 近似图更新:如何让“涟漪”扩散?
对于未被选中重计算的绝大多数样本 ( X_j \notin D_{recal} ),GRACE采用了一种基于图的近似更新策略,而不是置之不理。
其核心思想是:一个样本的新分数,应该由其旧分数和其已更新的、高相似度邻居的新分数共同决定。具体通过求解一个优化问题(公式20)来实现,其闭式解是一个漂亮的加权平均(公式21):
[ I_{new}(X_j) = \frac{1}{2} I_{old}(X_j) + \frac{1}{2} \sum_{k \in \mathcal{N}^*j} \alpha{jk} I_{new}(X_k) ]
其中,( \mathcal{N}^*j ) 是 ( X_j ) 的邻居中,那些已经被重计算(( X_k \in D{recal} ))且与 ( X_j ) 亲和度(affinity,结合了表征相似度和历史分数一致性)超过阈值 ( \beta ) 的邻居集合。( \alpha_{jk} ) 是归一化的边权重。
这个公式的直观解释是:样本的新分数,一半相信自己的历史(惯性),另一半相信其可靠邻居的最新情报(传播)。通过这种迭代传播,一次小规模的重计算可以高效地更新图中大量节点的分数。
对于表征(嵌入)的更新,逻辑类似,但GRACE增加了一层检查:只有当重计算样本的表征变化平均值 ( \Delta H ) 超过另一个阈值 ( \delta_h ) 时,才触发对图中其他节点表征的近似更新(公式23)。这是因为表征相比分数更为稳定,变化通常更缓慢。
最后,由于部分节点的表征发生了变化,k-NN图的结构可能需要局部调整。GRACE采用了一种局部图修复策略:对于每个更新了表征的节点,使用LSH(局部敏感哈希)索引快速检索一个候选近邻集合,然后仅在这个小集合内进行精确距离计算,更新该节点的边连接。这避免了重建全局 ( O(N^2) ) 复杂度的k-NN图。
4. 从理论到实践:GRACE框架的完整实现与调参指南
理解了原理,我们来看如何具体实现和运用GRACE。以下是一个简化的、概念性的算法流程,以及每个环节的工程化注意事项。
4.1 整体算法流程与模块划分
GRACE的运行可以划分为几个相对独立的模块,方便工程实现:
-
初始化模块:
- 使用预训练模型对全量训练数据做一次前向传播,提取所有样本的初始隐藏层表征(例如,取最后一层Transformer所有token表征的平均值)。
- 基于初始表征,使用FAISS等库构建互k-NN图(k=10)。存储每个节点的ID、表征和初始重要性分数。
- 初始化一个空的核心集 ( D_{core} )。
-
核心集选择模块(Algorithm 2):
- 输入:当前k-NN图 ( G ), 选择预算 ( b )(即核心集大小)。
- 过程:采用贪心算法。遍历所有候选样本,计算将其加入当前核心集 ( D_{core} ) 所带来的边际增益 ( \Delta R(S \cup {x_i}) - R(S) )。这个增益的计算依赖于图中节点的当前分数。
- 输出:选择边际增益最大的样本加入 ( D_{core} ),重复此过程直到选满 ( b ) 个样本。
-
训练与动态更新循环模块(Algorithm 3):
- 步骤A(训练):使用当前核心集 ( D_{core} ) 进行一个检查间隔 ( t_c ) 步的训练。
- 步骤B(检查):到达检查点,执行自适应更新检查(计算 ( \Delta I ))。
- 步骤C(更新):若 ( \Delta I > \delta ),则执行:
- 选择性重计算:根据 ( s_{update} ) 分数选出 ( D_{recal} ),用当前模型计算其精确分数和表征。
- 近似传播:利用公式(21)和(23)更新图中其他节点的分数和(若需要)表征。
- 局部图修复:更新受影响节点的k-NN边。
- 重新选择:基于更新后的图,重新运行核心集选择模块,得到新的 ( D_{core} )。
- 回到步骤A,继续训练。
4.2 关键参数调优实录
GRACE的性能对几个超参数比较敏感,以下是基于论文实验和笔者经验的调参指南:
| 参数 | 含义 | 影响与调优建议 | 典型值/范围 |
|---|---|---|---|
| 选择预算 ( b ) | 核心集大小占全量数据的比例 | 决定了效率与效果的平衡。预算越低,GRACE相对于随机采样的优势越明显。在资源极度受限时(如2%-5%),GRACE的稳健性尤为突出。建议从10%开始尝试。 | 2%, 5%, 10%, 20%, 30% |
| 平衡系数 ( \lambda ) | 综合评分中信息量与多样性的权重 | 核心参数。过低(<0.3)可能导致模型欠拟合,过高(>0.7)可能导致训练不稳定。建议在0.4-0.6网格搜索,观察验证集损失曲线。Phi-2和Llama2上最佳点通常在0.4-0.5之间。 | 0.0, 0.2, 0.4, 0.6, 0.8, 1.0 |
| 检查阈值 ( \delta ) | 触发图更新的分数差异阈值 | 控制更新频率。训练初期可设低(如0.1),中后期调高(如0.15-0.2)。可设计一个线性或余弦退火策略,随训练步数增加而增大。 | 0.1 - 0.2 |
| 检查间隔 ( t_c ) | 进行更新检查的训练步数间隔 | 通常与epoch长度 ( T_e ) 相关。论文探索了 ( t_c / T_e ) 的比例。比例在0.25到0.5之间(即每0.25到0.5个epoch检查一次)效果较好。太频繁(如0.125)增加开销,太稀疏(如1.0)则失去动态性。 | ( t_c = 0.25 \times T_e ) |
| 重计算预算 ( k_{recal} ) | 每次更新时精确重计算的样本数 | 一般设为核心集大小 ( b ) 的一个固定比例(如5%-10%)。比例太小,更新不充分;比例太大,失去效率优势。 | ( 0.05 \times b \times |\mathcal{D}_{train}| ) |
| 亲和度阈值 ( \beta ) | 判断邻居是否“可靠”用于传播的阈值 | 用于公式(20)中筛选 ( \mathcal{N}^* )。设置较高(如0.8)则传播条件严格,更新保守;设置较低(如0.5)则传播积极。建议设为边权重分布的中位数附近。 | 0.6 - 0.8 |
| k (NN数) | 构建k-NN图时每个节点的邻居数 | 影响图的连通性和传播效率。10是一个稳健的默认值。对于表征维度特别高或数据分布特别稀疏的任务,可以适当增加到15或20。 | 10 |
实操心得:分阶段调参 不要试图一次性调好所有参数。建议的调参顺序是:1) 固定一个合理的 ( b )(如10%)和 ( t_c )(如0.25 epoch),先调最重要的 ( \lambda );2) 固定调好的 ( \lambda ),调整 ( \delta ) 和 ( t_c ),观察更新频率是否合理(训练日志中可打印触发更新的次数);3) 最后微调 ( k_{recal} ) 和 ( \beta )。使用一个小的验证集(或从训练集中划出1%)来监控性能变化。
4.3 工程实现要点与效率优化
- 图存储与更新:对于百万级数据,存储全量的 ( N \times k ) 邻接矩阵是可行的。但表征矩阵 ( H \in \mathbb{R}^{N \times d} ) 可能很大(例如,d=4096)。需要使用内存映射文件或分块加载。FAISS索引需要持久化到磁盘,并在每次局部更新后增量修改。
- 分数缓存:历史重要性分数需要缓存。可以维护一个环形缓冲区或按检查点存储,用于计算差异度 ( \Delta I )。
- 选择性重计算的加速:计算 ( s_{update} ) 需要每个样本的陈旧度和独特性。陈旧度可以常数时间查询。独特性计算需要访问其k个邻居的分数,可以通过图邻接表快速获取。整个 ( s_{update} ) 的计算可以向量化进行,复杂度为 ( O(Nk) )。
- 传播的并行化:公式(21)的近似更新对于图中不同节点是独立的,可以很容易地进行并行计算(例如,使用多进程或GPU加速)。
- 与训练循环的集成:将GRACE的更新检查嵌入到训练循环中。可以在每个
on_train_batch_end回调中检查步数,触发更新流程。更新过程最好在CPU上进行,与GPU上的模型训练异步执行,以隐藏其计算开销。
5. 实验结果分析与常见问题排查
论文在MathInstruct、BioInstruct和DialogSum三个数据集上进行了全面实验,对比了多种静态和动态基线方法。这里我们不再复述表格数据,而是提炼其核心结论,并分享在实际复现中可能遇到的问题。
5.1 GRACE优势的核心体现
- 效果全面领先:在10%的训练预算下,GRACE在Phi-2、Llama2-7B、Qwen2.5-7B三个模型上,于数学推理(In-domain和Out-domain)、生物医学QA、对话摘要等多个任务中, consistently取得了最佳或接近最佳的平均性能。这证明了其泛化能力。
- 效率与效果的平衡:虽然GRACE引入了图更新开销,但其总训练时间仍远低于需要每轮全量重算特征的动态基线(如DynamicFL),与静态方法的时间差距在可接受范围内。图更新带来的性能提升收益,远大于其时间成本。
- 低预算下的稳健性:当选择预算极低(如2%、5%)时,许多基线方法性能暴跌,而GRACE的性能下降曲线最为平缓。这说明其选择机制在数据极度稀缺时更能抓住“关键”样本。
5.2 消融实验的启示
论文的消融实验清晰地揭示了各组件的作用:
- GRACE\R(去掉多样性分数):模型在分布外任务上的泛化能力明显下降。这说明仅关注“难题”会让模型视野变窄,难以应对新情况。
- GRACE\I(去掉重要性分数):性能下降最严重。这印证了样本信息量是驱动学习的根本动力,缺乏它,选择就失去了方向。
- GRACE\Update(无更新):性能大幅退化,尤其是在训练后期。这直接证明了动态更新的必要性,静态图无法捕捉训练动态。
- GRACE\AdaUpdate(固定间隔更新,无自适应):性能不如完整的GRACE。说明盲目频繁更新不如在关键时刻精准更新,自适应检查机制是有效的。
5.3 实战中常见问题与解决方案
在实际部署GRACE时,你可能会遇到以下问题:
| 问题现象 | 可能原因 | 排查步骤与解决方案 |
|---|---|---|
| 训练损失震荡剧烈 | 1. 平衡系数 ( \lambda ) 过高(>0.7),核心集过于偏向高损失样本。 2. 更新阈值 ( \delta ) 过低,更新太频繁,核心集变化过大。 3. 重计算预算 ( k_{recal} ) 过大,每次更新引入过多“新”样本。 |
1. 降低 ( \lambda ) 至0.5以下,观察损失曲线是否平滑。 2. 适当提高 ( \delta ),或增大检查间隔 ( t_c )。 3. 减小 ( k_{recal} ) 比例(如从10%降至5%)。 |
| 模型性能提升不明显,甚至低于随机采样 | 1. 初始图构建质量差(表征提取或k-NN搜索不准)。 2. 亲和度阈值 ( \beta ) 过低,导致不可靠的邻居参与了分数传播,污染了分数。 3. 选择预算 ( b ) 过小,而任务本身复杂,任何选择方法都难以奏效。 |
1. 检查初始表征提取是否正确(如是否用了正确的模型层)。确保FAISS索引的搜索参数(如nprobe)设置合理,召回率足够高。 2. 提高 ( \beta ) 值,确保只有高相似度的邻居参与传播。 3. 尝试增大预算 ( b ) 至20%或30%,观察性能是否随预算增加而单调提升。如果不是,则可能是前两点原因。 |
| 图更新阶段耗时过长 | 1. 重计算样本 ( D_{recal} ) 过多。 2. 近似传播计算未并行化。 3. FAISS索引的增量更新操作效率低。 |
1. 严格控制 ( k_{recal} ) 大小。 2. 将分数传播计算(公式21)改为批量矩阵运算,利用NumPy或PyTorch的并行能力。 3. 考虑不每次更新都重构LSH索引,而是积累一定数量的节点变化后批量更新。 |
| 显存溢出(OOM) | 1. 在GPU上存储了全量的表征矩阵 ( H )。 2. 构建k-NN图时,一次性计算了全量数据的距离矩阵。 |
1. 将表征矩阵、图结构等大数据存储在CPU内存或硬盘,仅将当前小批量数据和模型放在GPU。 2. 使用FAISS的GPU版进行k-NN搜索时,注意分块处理数据,避免一次性加载所有数据到GPU显存。 |
| 后期训练更新几乎不再触发 | 1. 阈值 ( \delta ) 设置过高。 2. 模型已接近收敛,分数分布趋于稳定。 |
1. 这是正常现象,说明模型已稳定。可以监控 ( \Delta I ) 的值,确认其确实低于阈值。 2. 如果担心错过重要变化,可以在训练最后阶段强制进行一次更新检查。 |
5.4 对后续研究与应用的展望
GRACE框架为我们打开了一扇门,但其本身仍有优化和扩展的空间:
- 图的层次化与多粒度:当前使用单一的k-NN图。对于异构性很强的数据,是否可以构建层次化图(如先粗聚类,再在簇内建细粒度图)?或者引入多尺度相似性?
- 传播模型的改进:当前使用简单的线性加权平均进行传播。能否引入更复杂的传播模型,如图神经网络(GNN)的消息传递机制,来更精确地建模节点间的影响?
- 与参数高效微调(PEFT)的深度结合:实验中使用的是LoRA。GRACE的动态选择思想是否可以与LoRA的权重更新、Adapter的插入位置等产生更细粒度的协同?例如,为核心集样本分配更高的LoRA rank?
- 面向持续学习/增量学习:GRACE的动态更新机制天然适合持续学习场景。当新领域数据到来时,可以基于已有的图快速评估新数据与旧数据的关系,并高效更新核心集,从而缓解灾难性遗忘。
在我个人的使用体验中,GRACE最大的价值在于它提供了一种系统性的、数据驱动的训练视角。它迫使我们去思考数据之间的关系,而不仅仅是把数据看作独立的个体。将这种图结构的、动态的思维应用到其他机器学习任务的数据管理中去,或许能带来意想不到的收获。最后一个小建议:在首次应用时,不妨从一个中等规模的数据集和一个7B左右的模型开始,完整地走通流程并可视化一下图的结构和核心集的演变过程,这会对理解整个框架的运作有极大的帮助。