重要提示

您正在查看 NeMo 2.0 文档。此版本对 API 和新库 NeMo Run 进行了重大更改。我们目前正在将 NeMo 1.0 的所有功能移植到 2.0。有关先前版本或 2.0 中尚不可用的功能的文档,请参阅 NeMo 24.07 文档

将数据配置从 NeMo 1.0 迁移到 NeMo 2.0#

数据在 NeMo 2.0 中使用 DataModule 类进行配置。 LLM 集合具有专门用于语言建模用例的预训练微调数据模块。

NeMo 1.0(先前版本)#

在 NeMo 1.0 中,数据配置通过 YAML 配置文件进行控制。 浓缩的示例如下所示

data:
    train_ds:
      file_names: "my/traindata1,my/traindata2"
      global_batch_size: 4
      micro_batch_size: 2
      shuffle: True
      num_workers: 8
      memmap_workers: 2
      pin_memory: True
      max_seq_length: 2048
      min_seq_length: 1
      concat_sampling_probabilities:
        - 0.75
        - 0.25
      ...
    validation_ds:
      file_names: "/my/validdata1"
      ...
      metric:
        name: "loss"
        average: null
        num_classes: null
    test_ds:
      file_names: "/my/testdata1"
      ...
      metric:
        name: "loss"
        average: null
        num_classes: null

NeMo 2.0(新版本)#

在 2.0 中,数据通过相关的 DataModule 进行配置。 例如,为预训练设置 DataModule 可能如下所示

from nemo.collections.llm.gpt.data import PreTrainingDataModule
from nemo.collections.nlp.modules.common.tokenizer_utils import get_nmt_tokenizer


tokenizer = get_nmt_tokenizer("megatron", "GPT2BPETokenizer")

data =  PreTrainingDataModule(
    paths={
        "train": [0.75, '/my/traindata1', 0.25, '/my/traindata2'],
        "validation": '/my/validdata1',
        "test": '/my/testdata`',
    },
    global_batch_size=4,
    micro_batch_size=2,
    num_workers=8,
    pin_memory=True,
    seq_length=2048,
    tokenizer=tokenizer
)

有关预训练和微调支持的完整参数列表,请参阅 PreTrainingDataModuleFineTuningDataModule 文档。

重要提示

如果您已经为 NeMo 1.0 处理了数据集,则可以在 NeMo 2.0 中使用相同的数据路径。 离线数据准备步骤没有进行任何更改。

迁移步骤#

  1. 从 YAML 配置文件中删除 data 部分。

  2. 在您的 Python 脚本中导入必要的模块

from nemo.collections.llm.gpt.data import PreTrainingDataModule
from nemo.collections.nlp.modules.common.tokenizer_utils import get_nmt_tokenizer
  1. 创建 PreTrainingDataModuleFineTuningDataModule 的实例,并将 YAML 文件中的参数映射到数据模块。

  1. 如果使用 PreTrainingDataModule,请将 YAML 文件中的数据集路径和权重映射到 paths。 以以下 NeMo 1.0 YAML 配置为例。

    train_ds:
      file_names: "my/traindata1,my/traindata2"
      concat_sampling_probabilities:
          - 0.75
          - 0.25
      ...
    validation_ds:
      file_names: "/my/validdata1"
      ...
    test_ds:
      file_names: "/my/testdata1"
      ...
    

此 NeMo 1.0 YAML 配置变为一个字典,将每个拆分映射到 NeMo 2.0 中的路径列表。 如果 YAML 文件中提供了 concat_sampling_probabilities,则概率将与路径压缩在一起以创建平面列表

paths={
  "train": [0.75, "my/traindata1", 0.25, "my/traindata2"]
  "validation": ["/my/validdata1"]
  "test": ["/my/testdata1"]
}
  1. 如果使用 FineTuningDataModule,则 dataset_root 应指向包含 training.jsonl、validation.jsonl 和 test.jsonl 的目录,这些文件处理为与 NeMo 1 中相同的格式。这些文件名可通过 train_pathvalidation_pathtest_path 属性进行配置。 或者,NeMo 2.0 提供了数据集特定的类,这些类将自动处理数据集的下载、预处理和拆分。 支持的数据集可以在此处找到。

  1. data 对象传递给 llm.train 函数。

关于迁移的一些注意事项#

  • 根据当前设计,用户需要指定单个数据加载配置,以便在训练、验证和测试数据之间共享。 换句话说,传递给 DataModule 构造函数的参数将用于所有三个数据加载器。 这与 NeMo 1.0 不同,在 NeMo 1.0 中,用户可以为每个拆分指定不同的配置。

  • NeMo 1.0 中向用户公开的一些参数目前在 NeMo 2.0 中不可配置。 它们是

  • min_seq_length(在 2.0 中默认为 1

  • label_key(在 2.0 中默认为 output

  • add_eos(默认为 True

  • add_bos(默认为 False

  • add_sep(默认为 False

  • truncation_field(默认为 input

  • prompt_template(默认为 '{input} {output}'

  • drop_last(默认为 True

  • tokens_to_generate(不支持)

  • metric(不支持)

  • write_predictions_to_file(不支持)