跳转至

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 框架代码。