重要提示
您正在查看 NeMo 2.0 文档。此版本引入了 API 的重大更改和一个新的库,NeMo Run。我们目前正在将 NeMo 1.0 中的所有功能移植到 2.0。有关先前版本或 2.0 中尚不可用的功能的文档,请参阅 NeMo 24.07 文档。
SpechLLM 数据集#
数据集类可以在 NeMo GitHub 上找到。
输入 Manifest 格式#
您需要以 NeMo manifest 格式准备数据,其中每行都是一个 python 字典,包含一些键,例如
{
"audio_filepath": "path/to/audio.wav",
"offset": 0.0, # offset of the audio in seconds, this is an optional field
"duration": 10.0 , # duration of the audio in seconds, can set to `None` to load the whole audio
"context": "what is the transcription of the audio?", # text prompt for the audio, see below for more details
"answer": "the transcription of the audio", # optional for inference, default to "na" in dataloader
}
manifest 文件中的 context 字段是可选的,您可以将上下文列表放在一个上下文文件中(每行一个上下文),然后设置 ++model.data.train_ds.context_file=<path to to context file>,以要求数据加载器为每个音频样本从文件中随机选择一个上下文。这对于使用同一任务的多个提示进行训练非常有用。如果未提供 context 字段和 context_file,则数据加载器将对所有音频使用默认上下文 音频是什么意思?。在推理期间,建议在 manifest 文件中包含 context 字段。
自定义要使用的字段#
您也可以在 manifest 文件中使用其他字段来替换 context 和 answer 字段,但是您还需要更改 prompt_template 以使用新的字段名称。例如,如果您希望使用新字段 input_text 和 output_text,则需要设置
++model.data.train_ds.context_key=input_text \
++model.data.train_ds.answer_key=output_text \
++model.data.train_ds.prompt_template="'Q: {input_text}\nA: {output_text}'"
请注意,提示模板周围有单引号(以避免 hydra 错误),并且字段名称用花括号括起来。
自定义输入格式#
如果您想使用多个音频,可以将 audio_filepath 设置为音频文件路径列表,并在上下文中通过使用特殊的 audio_locator 字符串来指定每个音频的位置。audio_locator 的选择也应传递到配置中。例如,如果您有一个如下所示的 manifest 项
{
"audio_filepath": ["path/to/audio1.wav", "path/to/audio2.wav"],
"context": "what is the transcription of the [audio] and [audio]?", # text prompt for the audio, see below for more details
"answer": "the transcription of the audio1 and audio2", # optional for inference, default to "na" in dataloader
}
您可以在配置中将 audio_locator 设置为 [audio]
++model.data.train_ds.audio_locator='[audio]'
通过使用 audio_locator,数据加载器会将上下文中的 audio_locator 替换为为每个音频提取的相应音频特征。您需要确保上下文中音频定位器的数量与 audio_filepath 字段中音频文件的数量相匹配。
多任务训练#
为了使用上下文文件,您可以在命令行中设置 ++model.data.train_ds.context_file=<path to to context file>,或者使用多个上下文文件 ++model.data.train_ds.context_file=[<path to to context file1>,<path to context file2>,...]。如果上下文文件的数量等于提供的数据集的数量,则数据加载器会将每个上下文文件分配给一个数据集。否则,数据加载器将为每个音频样本从所有提供的上下文文件中随机选择一个上下文文件。使用多个上下文文件对于使用多个任务进行训练非常有用,其中每个任务都有自己的一组提示。同时,您可以通过使用串联的 tarred 数据集来控制不同任务/数据集的权重,您可以通过以下方式为数据集分配权重:
++model.data.train_ds.is_tarred=True \
++model.data.train_ds.is_concat=True \
++model.data.train_ds.manifest_filepath=[/path/to/data1/tarred_audio_manifest.json,/path/to/data2/tarred_audio_manifest.json] \
++model.data.train_ds.tarred_audio_filepaths=[/path/to/data1/audio__OP_0..1023_CL_.tar,/path/to/data2/audio__OP_0..1023_CL_.tar] \
++model.data.train_ds.concat_sampling_technique='random' \
++model.data.train_ds.concat_sampling_probabilities=[0.4,0.6] \
使用 Lhotse Dataloader#
Speech-LLM 支持 NeMo dataloader 和 Lhotse dataloader。大多数 Lhotse 特定的标志可以参考 Lhotse Dataloader <http://docs.nvda.net.cn/nemo-framework/user-guide/latest/nemotoolkit/asr/datasets.html#lhotse-dataloading>。示例配置可以参考 Lhotse Speech-LLM 示例。
Lhotse Dataloader 还支持使用独立的 YAML 文件来设置 manifest 信息
++model.data.train_ds.input_cfg=$INPUT_CFG_FILE \
它指向一个类似以下的 $INPUT_CFG_FILE 文件
- input_cfg:
- manifest_filepath: manifest1.json
type: nemo
weight: 2.0
tags:
default_context: "please transcribe the audio"
- manifest_filepath: manifest2.json
type: nemo
weight: 1.0
tags:
default_context: "please translate English audio to German"
type: group
weight: 0.4