运行实验
在SpeechBrain中,你可以像这样在配方中训练大多数模型:
> cd recipes/<dataset>/<task>/<model>
> python train.py hparams/hyperparams.yaml
按照每个配方的README中的步骤获取更多详细信息。
结果将保存在yaml文件中指定的output_folder中。
该文件夹是通过在train.py中调用sb.core.create_experiment_directory()创建的。详细的日志和实验输出都保存在那里。此外,较少的详细日志会输出到stdout。
YAML 基础
SpeechBrain 使用了一种名为 HyperPyYAML 的 YAML 扩展变体。它提供了一种优雅的方式来指定配方的超参数。
在SpeechBrain中,YAML文件不是简单的参数列表,而是为每个参数指定使用它的函数(或类)。
这不仅使参数的规范更加透明,还允许我们通过简单地调用load_hyperpyyaml(来自HyperPyYAML)来正确初始化所有条目。
安全警告
加载HyperPyYAML允许任意代码执行。 这是一个特性:HyperPyYAML允许你在实验中构建任何和所有你需要的东西。 然而,请务必验证任何不受信任的配方的YAML文件,就像你会验证Python代码一样。
功能
现在让我们通过一个例子快速浏览一下扩展的YAML功能:
seed: !PLACEHOLDER
output_dir: !ref results/vgg_blstm/<seed>
save_dir: !ref <output_dir>/save
data_folder: !PLACEHOLDER # e.g. /path/to/TIMIT
model: !new:speechbrain.lobes.models.CRDNN.CRDNN
output_size: 40 # 39 phonemes + 1 blank symbol
cnn_blocks: 2
dnn_blocks: 2
!new:speechbrain.lobes.models.CRDNN.CRDNN从模块speechbrain.lobes.models.CRDNN创建一个CRDNN实例缩进的关键字(
output_size等)作为关键字参数传递。!ref评估尖括号中的部分,引用YAML本身。/save !PLACEHOLDER在加载时直接出错;每个用户都应该通过使用命令行(它会传递一个覆盖到load_hyperpyyaml),或者在必要时手动编辑.yaml来替换它。
运行参数
SpeechBrain 定义了一组可以从命令行参数(或在 YAML 文件中)设置的运行参数,例如:
device: 设置用于计算的设备。debug: 一个启用调试模式的标志,仅运行几次迭代以验证程序不会崩溃。额外的运行时参数在 Brain 类中有详细说明。
如果你想使用多个GPU进行训练,请遵循多GPU训练指南。
你也可以通过这种方式覆盖YAML中的参数:
> python experiment.py params.yaml --seed 1234 --data_folder /path/to/folder --num_layers 5
此调用将覆盖超参数 seed 和 data_folder 以及 num_layers。
重要:
命令行参数将始终覆盖hparams文件中的参数。
张量格式
SpeechBrain 中的张量遵循批量-时间-通道的约定:
批次维度始终是第一个维度(即使它是
1)。时间步长维度始终是第二个。
剩下的可选维度是通道(无论你需要多少维度)。
换句话说,张量将看起来像以下任何一种:
(batch_size, time_steps)
(batch_size, time_steps, channel0)
(batch_size, time_steps, channel0, channel1, ...)
为所有类和函数拥有一个共享的格式至关重要。这使得模型组合更加容易。 许多格式都是可能的。对于SpeechBrain,我们选择了这种格式,因为它在循环神经网络中常用。
对于波形,我们通常选择压缩最后一个维度(即对于单声道音频,没有通道维度)。
简单的波形示例:
一个3秒钟的波形,以16kHz单声道采样:
(1, 3*16000)一个3秒钟的波形,以16kHz立体声采样:
(1, 3*16000, 2)
除了波形之外,这种格式还用于计算管道中的任何张量。例如…
短时傅里叶变换 (STFT) 对于单声道音频将遵循这种形状,其中
2对应于 STFT 的实部和虚部(复数):
(batch_size, time_steps, n_fft, 2)
如果我们处理多声道音频(例如立体声)的STFT,它看起来会像这样:
(batch_size, time_steps, n_fft, 2, n_audio_channels)
对于滤波器组(FBanks),形状将是:
(batch_size, time_steps, n_filters)
修改后的PyTorch全局变量和GPU特性
出于各种原因,SpeechBrain 修改了一些 PyTorch 的全局配置,以解决问题或提高执行速度,有时还取决于 GPU 配置。当我们认为某些修改后的默认值在我们的使用场景中比 PyTorch 的默认值更有意义时,我们会这样做。例如,我们经常遇到动态张量形状,这与某些自动调优方法相冲突。
这些更改应用在一个标准化的位置,quirks.py。它们在启动实验时被记录。
SB_DISABLE_QUIRKS 环境变量可以让你轻松禁用一些特殊行为。例如,要禁用 TensorFloat32 并重新启用 JIT 分析,你可以使用 SB_DISABLE_QUIRKS=allow_tf32,disable_jit_profiling。
可重复性
为了提高实验的可重复性,SpeechBrain 支持其自己的种子函数,位于 speechbrain.utils.seed.seed_everything。此函数根据 PyTorch 推荐 为各种生成器(如 NumPy、PyTorch 和 Python)设置种子。
然而,由于GPU和CPU执行方式的差异,即使使用相同的种子,结果也可能无法完全重现,尤其是在训练模型时。这个问题主要影响训练实验。
另一方面,当使用数据准备脚本准备数据时,这些脚本的输出与全局种子无关。这确保了即使使用不同的种子,您在不同的设置上也会得到相同的输出。
在分布式实验中,由于不同的种子(根据排名偏移)将在不同的机器或进程上设置,可重复性变得更加复杂。这主要影响依赖于随机性的操作,例如数据增强。由于分布式设置中的每个进程都被分配了自己的种子,即使全局种子在机器之间是相同的,应用于数据的随机性(例如,增强)在进程之间也可能不同。
需要注意的是,这种种子设置的差异不会影响实验的某些元素。例如,在分布式训练中,初始模型参数会从主进程广播到所有进程。同样,像数据加载器这样会打乱数据的组件会受到每个进程种子的影响,但底层的数据管道在进程之间保持同步。