dynamicgen_dataset.py — 实现了动态数据生成数据集——支持在训练迭代之间动态生成新的训练数据¶
文件路径: verl/experimental/dynamic_dataset/dynamicgen_dataset.py
文件概述¶
实现了动态数据生成数据集——支持在训练迭代之间动态生成新的训练数据。这在"Proposer 模型根据 rollout 数据生成新任务"等自我进化训练场景中特别有用。
关键代码讲解¶
1. AbstractDataGenerator - 数据生成器基类¶
class AbstractDataGenerator(ABC):
def __init__(self, config: DictConfig):
self.config = config
@abstractmethod
def generate(self, dataset: Dataset) -> datasets.Dataset:
"""
根据当前数据集生成新的数据。
Args:
dataset: 当前的训练数据集
Returns:
新生成的 HuggingFace Dataset
"""
pass
用户需要继承此类并实现 generate() 方法,定义如何根据现有数据生成新样本。
2. MockDataGenerator - 测试用的空实现¶
class MockDataGenerator(AbstractDataGenerator):
def generate(self, dataset: Dataset) -> datasets.Dataset:
print("MockDataGenerator: No operation performed on the dataset.")
return dataset.dataframe.select([0]) # 仅返回第一条数据
用于占位和测试,实际不生成新数据。
3. DynamicGenDataset - 动态生成数据集¶
class DynamicGenDataset(RLHFDataset):
def __init__(self, data_files, tokenizer, config, processor=None):
super().__init__(data_files, tokenizer, config, processor)
# 动态加载自定义数据生成器类
datagen_cls = load_extern_object(config.datagen.path, config.datagen.name)
# 验证必须继承 AbstractDataGenerator
if not issubclass(datagen_cls, AbstractDataGenerator):
raise TypeError(...)
self.data_generator = datagen_cls(config.datagen)
self.on_batch_end() # 初始化时先生成一次数据
def append_dataframe(self, new_dataframe):
"""将新生成的数据追加到现有数据集"""
new_dataframe = self.maybe_filter_out_long_prompts(new_dataframe)
self.dataframe = datasets.concatenate_datasets([self.dataframe, new_dataframe])
def on_batch_end(self, batch: DataProto) -> None:
"""每个训练 batch 结束后触发数据生成"""
new_data = self.data_generator.generate(self)
self.append_dataframe(new_data)
数据生成流程图¶
训练循环开始
│
├── Batch 1 训练完成
│ ├── on_batch_end() 被调用
│ ├── data_generator.generate(当前数据集) → 新数据
│ └── append_dataframe(新数据) → 数据集增大
│
├── Batch 2 训练完成
│ ├── on_batch_end() 被调用
│ ├── data_generator.generate(扩大后的数据集) → 更多新数据
│ └── append_dataframe(更多新数据) → 数据集进一步增大
│
└── ...(循环继续)
配置示例¶
在 config 中指定自定义数据生成器:
data:
datagen:
path: "my_project/data_generators.py" # 文件路径
name: "MyCustomDataGenerator" # 类名
# ... 其他配置
核心类/函数列表¶
| 名称 | 类型 | 说明 |
|---|---|---|
AbstractDataGenerator |
抽象基类 | 数据生成器接口 |
MockDataGenerator |
类 | 测试用空数据生成器 |
DynamicGenDataset |
类 | 支持动态数据生成的数据集 |
与其他模块的关系¶
- 继承自
verl.utils.dataset.RLHFDataset(标准 RLHF 数据集) - 使用
verl.utils.import_utils.load_extern_object动态加载用户自定义的生成器类 - 在训练循环中,
on_batch_end()会被自动调用
小结¶
DynamicGenDataset 实现了"训练-生成"循环:训练一批数据后,根据当前模型能力/数据情况生成新的训练样本并追加到数据集中。这种机制支持自我进化(Self-Play)、课程学习、数据增强等高级训练策略。通过 load_extern_object 机制,用户只需实现一个 AbstractDataGenerator 子类即可,无需修改 verl 框架代码。