DataFlex基于梯度的动态数据选择实战:用LESS与NICE快速锁定最有价值的训练样本
【免费下载链接】DataFlex可用于大模型训练时动态进行训练动态训练数据选择、领域比例调整及动态加权,提升训练速度和性能,与 LLaMA-Factory 无缝集成,提供灵活强大的训练控制能力。项目地址: https://gitcode.com/OpenDCAI/DataFlex
DataFlex 是一个构建在 LLaMA-Factory 之上的大模型训练数据控制系统,支持训练过程中的动态数据选择、领域比例调整与动态加权。本文聚焦它的两大基于梯度的动态数据选择算法——LESS 与 NICE:它们会计算每条训练样本的梯度,并与验证集的梯度方向做"相似度匹配",从而自动锁定对目标任务最有价值的训练样本,帮你用更少的数据、更短的步数训出更好的模型 🎯
为什么要做基于梯度的数据选择?
大模型 SFT/PT 阶段最常见的浪费是:数据集里混着大量冗余、低质甚至噪声样本,模型对它们一视同仁地训练。而 LESS 与 NICE 的思路是——样本的价值 = 它的梯度方向与目标任务(验证集)梯度方向的相似度。相似度越高,这条样本训练得越"对路"。
训练集中的一条样本长这样,比如一道需要结合图形推理的几何题:
DataFlex 会在训练每隔若干步暂停一次,给剩余样本逐条打分、挑出 top-k,重建 dataloader 后继续训练,整个过程由动态选择训练器 select_trainer.py 自动调度,无需改动你的训练代码。
LESS 原理:逐样本投影梯度 × 验证集相似度
LESS 的实现位于 less_selector.py,流程只有四步:
- 逐样本求梯度:对每个训练样本做一次 forward + backward,得到整条参数梯度向量(支持
adam/sgd两种类型,Adam 会借用优化器的一阶、二阶矩做归一化,兼容 DeepSpeed ZeRO-3 分区参数)。 - 随机投影降维:用 TRAK 的 Rademacher 投影把超大规模梯度压缩到
proj_dim维(默认 4096),既省内存又几乎不损失相似度信息。 - 计算相似度:每条训练样本的投影梯度与验证集投影梯度的均值点积,得到一个"价值分数"。
- Top-K 选中:分数最高的
update_step个样本进入下一轮训练,结果写入cache_dir/step_{step_id}.json供复现与断点续传。
验证集样本则是一类开放问题,例如一张相图分析题:
LESS 依赖 TRAK,安装时需加装扩展:
pip install -e ".[less]"。
LESS 一键配置:只需改一个 component_name
LESS 的示例配置在 less.yaml,它就是一个标准 LlamaFactory YAML,只多了dynamic_train一段:
train_type: dynamic_select # 动态选择训练器 components_cfg_file: src/dataflex/configs/components.yaml component_name: less # 切换算法只需改这里 warmup_step: 10 # 前 10 步随机热身 update_step: 10 # 每 10 步重新选一次样本 update_times: 2 # 每个 Flex epoch 内选择 2 次 eval_dataset: alpaca_zh_demo # 验证集:LESS 用它计算目标梯度组件参数(梯度类型、投影维度、缓存目录等)统一在 components.yaml 的selectors.less段维护,例如gradient_type: adam、proj_dim: 4096、save_interval: 16。
启动训练只需一条命令:
dataflex-cli train examples/train_lora/selectors/less.yaml多卡时加上环境变量即可:
FORCE_TORCHRUN=1 dataflex-cli train examples/train_lora/selectors/less.yaml📌 注意:warmup_step、update_step抽出的样本数不能超过数据集大小,eval_dataset必须配置,否则没有"目标梯度"可比。
NICE 原理:让"奖励模型"替你判断样本好不好
NICE(nice_selector.py)把梯度选择升级成了"RL 风格"的信号,训练侧与 LESS 相同(逐样本投影梯度),验证侧则换成了强化学习梯度:
- 策略模型采样:对验证集样本用策略模型做
mc_samples(默认 4)次蒙特卡洛生成; - 奖励模型打分:奖励模型对每次生成给出 0~1 分(支持有/无参考答案两种提示模板,也可配置本地 vLLM 或 API 后端);
- 策略梯度:以"奖励 × 序列对数似然"回传,得到反映"该样本对模型能力提升有多重要"的梯度向量;
- 同样投影 + Top-K:与训练侧投影梯度算相似度,选出最高分样本。
配置见 nice.yaml,除component_name: nice外,还需要在 components.yaml 中指定策略模型与奖励模型路径、mc_samples、max_new_tokens等生成参数。NICE 信号更"任务导向",适合有高质量奖励模型的 SFT 场景,但计算开销也更高。
LESS vs NICE:怎么选?
| 维度 | LESS | NICE |
|---|---|---|
| 验证侧信号 | 直接算验证集 SGD 梯度 | 策略模型生成 + 奖励模型打分 |
| 额外依赖 | TRAK(pip install -e ".[less]") | 本地策略模型 + 奖励模型 |
| 单轮开销 | 较低 | 较高(含多次生成) |
| 适用场景 | 通用快速筛选、大规模数据集 | 有奖励模型、追求任务对齐质量 |
两者共用同一套调度与缓存机制:投影梯度按train/、eval/分目录落盘为all_projected_grads.pt,支持断点续传(中途挂掉会自动从上次保存的位置继续),已完成的步骤还会通过step_*.json直接复用,避免重复计算。
上手清单与最佳实践
- 环境:Python 3.11+,clone 仓库后
pip install -e .(LESS 再装.[less]扩展):
git clone https://gitcode.com/OpenDCAI/DataFlex cd DataFlex pip install -e ".[less]"- 小数据集先试跑:用
alpaca_en_demo+alpaca_zh_demo这套 demo 数据跑通 LESS,确认dataflex_saves/less_output下能看到all_projected_grads.pt与step_*.json。 - 调选择节奏:
update_step越小越"勤快"但越耗时;update_times控制每个 Flex epoch 内的选择次数。 - 多卡并行:
FORCE_TORCHRUN=1启动,梯度计算自动分 rank 并行并合并归一化。 - 组合玩法:LESS 选出的分数还可以被数据重排序组件复用(
score_source: cached_selection),与 Lego 流水线搭配实现"选择 + 排序"联合调度,详见 components.yaml 中的pipelines段。
用 LESS 或 NICE 做基于梯度的动态数据选择,本质上就是让"每一分训练算力都花在刀刃上"。改一行component_name,你就能在 DataFlex 中体验从"全量硬训"到"精准选样"的升级,把训练速度与最终性能一起拉起来 ✨
【免费下载链接】DataFlex可用于大模型训练时动态进行训练动态训练数据选择、领域比例调整及动态加权,提升训练速度和性能,与 LLaMA-Factory 无缝集成,提供灵活强大的训练控制能力。项目地址: https://gitcode.com/OpenDCAI/DataFlex
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考