s3prl

Self-Supervised Speech Pre-training and Representation Learning.自监督语音预训练模型

3种使用方法

1.pretrain

预训练上游模型:Mockingjay, Audio ALBERT and TERA.

1.1 Readme文件

预训练新的上游模型,需要很高的GPU

第一步:准备数据

(1)下载LibriSpeech数据集,解压成下面的形式

 (2)生成meta data 目录,加速训练

python3 preprocess/generate_len_for_bucket.py -i PATH_TO_YOUR/LibriSpeech/

第二步:修改config

(1)打开 S3PRL/pretrain/tera/config_runner.yaml 文件

这是tera的默认runner配置,如果没有另外指定,它将被默认采用。
要分配默认配置之外的其他配置,可以使用-c参数,例如:-u tera  -c other _ new _ config _ runner . YAML

(2)改变config_runner.yaml的路径

libri_root: '/media/andi611/1TBSSD/LibriSpeech/'
file_path: 'data/len_for_bucket' 

(3)其他设置

n_epochs: 100
total_steps: -1
gradient_accumulate_steps: 8
train_batch_size: 32
sets: ['train-clean-100', 'train-clean-360', 'train-other-500']

如果给定了n_epochs,total步数将被忽略。
如果您想使用total_steps,请将n _ epochs设置为-1
实际batch size =gradient_accumulate_steps * train_batch_size
修改set以选择预处理子集。

第三步:开始训练

(1)Mockingjay

python run_pretrain.py -u mockingjay -g pretrain/mockingjay/config_model.yaml -n YourModelName

这采用默认的runner conifg:prerain/mocking Jay/config _ runner.YAML
使用-c 修改默认的runner conifg。
在多个gpu上,添加-- multi_gpu
检查控制台上的日志,确保一切正常,并且符合预期:

 (2)TERA

python run_pretrain.py -u tera -g pretrain/tera/config_model.yaml -n YourModelName

其他事项和Mockingjay一致

(3)Audio ALBERT

python run_pretrain.py -u audio_albert -g pretrain/audio_albert/config_model.yaml -n YourModelName

其他事项和Mockingjay一致

(4)Distiller

python run_pretrain.py -u distiller -g pretrain/distiller/config_model.yaml -n YourModelName

其他事项和Mockingjay一致

第四步:导入预训练的checkpoint 给下游任务

(1)Mockingjay

使用mockingjay_local和-k来指定checkpoint的路径。

python run_downstream.py -m train -u mockingjay_local -k example_checkpoint/states-1000000.ckpt -d phone_linear -n ExpName

(2)TERA

使用tera_local和-k来指定checkpoint的路径。

python run_downstream.py -m train -u tera_local -k example_checkpoint/states-1000000.ckpt -d phone_linear -n ExpName

(3)AUDIO ALBERT

使用audio_albert_local和-k来指定checkpoint的路径。

python run_downstream.py -m train -u audio_albert_local -k example_checkpoint/states-1000000.ckpt -d phone_linear -n ExpName

2.upstream

在一个统一的输入/输出接口中轻松加载大多数带有预训练权重的现有上游模型。
预训练模型通过torch.hub注册,这意味着您可以通过一行即插即用在自己的项目中使用这些模型,而不依赖于这个工具包的编码风格。

2.1 Readme文件

我们在super benchmark框架中组织了大多数现有的SSL预处理模型。

一对多接口

我们为众多语音预处理模型提供了一体化的统一接口。所有上游模型采用相同格式的输入/输出:

输入:未添加的wav列表[wav1,wav2,...],每个wav都在torch.FloatTensor中。
输出:一个字典或者一个列表。每个填充序列的形状为(批处理大小,最大序列长度,隐藏大小)。hidden_states是一个列表。
对于上游模型处理的是特征,不是wav时(例如:log Mel、fbank等),wav ->feature的预处理是在模型前进过程中动态完成的。请放心,这不会增加您的运行时间。

如何使用

不同的上游用其名称的确切字符串来标识。包含了预训练的权重。

(1)在我们的基准脚本中使用上游模型

为了使用super benchmark评估上游,我们为所有上游提供了一个统一的脚本:run _ download . py。有关详细用法,请参考downlstream/readme.MD。

指定上游
在这个脚本中,我们可以使用-u和Name来切换不同的上游以进行基准测试。以wav2vec 2.0 Base为例:

python3 run_downstream.py -m train -u fbank -d example -n ExpName
python3 run_downstream.py -m train -u wav2vec2 -d example -n ExpName

检测所有可用的上游模型

python3 run_downstream.py -h

(2)在你的项目中,使用上游模型

安装s3prl后,可以在自己的代码库中使用上游。

指定上游

import s3prl.hub as hub

model_0 = getattr(hub, 'fbank')()  # use classic FBANK
model_1 = getattr(hub, 'modified_cpc')()  # build the CPC model with pre-trained weights
model_2 = getattr(hub, 'tera')()  # build the TERA model with pre-trained weights
model_3 = getattr(hub, 'wav2vec2')()  # build the Wav2Vec 2.0 model with pre-trained weights

device = 'cuda'  # or cpu
model_3 = model_3.to(device)
wavs = [torch.randn(160000, dtype=torch.float).to(device) for _ in range(16)]
with torch.no_grad():
    reps = model_3(wavs)["hidden_states"]

检测所有可用的上游模型

import s3prl.hub as hub

print(dir(hub))

上游模型信息

SSL上游模型

我们支持大多数现有的SSL预处理模型。你可以参考super的论文,了解他们的训练前损失风格。

声学特征上游模型

我们还提供经典声学特性作为基线。对于每个带有名称的上游,您可以在s3prl/upstream/baseline/Name.yaml中配置它们的选项(由其后端提供)

上游模型设置

上游可以有两个选项ckpt和model_config,它们的类型都是str。您可以参考每个upstream的hubconf.py和expert.py,了解它们支持的选项。

每个上游文件夹下的Hubconf.py包含名称,可以用来初始化上游的条目,该条目遵循torch.hub.load. SSL中记录的协议。

带有预训练的上游通常在其hubconf.py中有预注册的ckpt,用于指定预训练checkpoint的位置。

另一方面,声学特征上游通常接受model_config作为特征提取的配置文件。下面是一个如何将操作传递到上游以获取不同上游实例的示例。

import torch
import s3prl.hub as hub

device = 'cuda' # or cpu
config_path = 's3prl/upstream/baseline/mfcc.yaml'
extracter = getattr(hub, 'baseline_local', model_config=config_path).to(device)

wavs = [torch.zeros(160000, dtype=torch.float).to(device) for _ in range(16)]
with torch.no_grad():
    mfcc = extracter(wavs)["hidden_states"]

3.downstream

在许多下游任务中利用上游模型
用super benchmark对上游模型进行基准测试

3.1 Readme文件

自监督(SSL)预训练模型不能通过预训练损失来证明其有效性。人们总是需要评估他们在下游任务中的表现。因此,收集大量下游任务并尽可能简化评估流程以加快开发周期至关重要。

我们开发了几个评估SSL模型的下游任务,每个任务都由这个下游文件夹下的一个子文件夹定义。我们进一步选择有代表性的来形成以下基准。

如何使用

(1)一般需求
克隆存储库并安装依赖项
查看一般用法,了解概念用法

(2)运行开发的任务
(a)可选:注册您定制的预训练模型  您也可以从评估该工具包中可用的预训练模型开始。
(b)遵循特定于任务的用法    super benchmark和挑战、在mockingjay和TERA中使用的任务、更多任务

(3)开发新任务 

选中添加新的下游任务。非常欢迎拉取请求。谢谢!

一般用法

所有下游任务都遵循以下命令模式,并有一些特定于任务的调整,这些调整将在后续特定于任务的部分中详细说明。

(1)开始新的下游训练实验

cd s3prl/

# 一般模式
python3 run_downstream.py -m train -n ExpName -u UpstreamName -d DownstreamName

# 无需数据准备即可直接运行的示例
python3 run_downstream.py -m train -n ExpName -u fbank -d example

#微调上游。
#请使用最后一个隐藏状态。见第192期
python3 run_downstream.py -m train -n ExpName -u fbank -d example -f -l -1

#通过Hugging Face Hub下载/上传模型的示例。
#使用与您在huggingface.co的帐户相关联的凭据
HF_USERNAME=username HF_PASSWORD=password python3 run_downstream.py -m train -n ExpName -u UpstreamName -d DownstreamName --hub huggingface --push_to_hf_hub True

-m或--model 指定训练/评估模式

-u或--upstream 指定上游预处理模型。

        可用的上游可以通过-h检查
        一些例子:-u fbank,-u tera,-u wav2vec2,-u hubert
-d或--downstream 指定下游任务。

        可用的下游可以通过-h检查
        例如:-d asr,-d meotion,-d speech_commands
        每个可用的下游任务在downstream/下都有相应的文件夹。例如-d asr表示我们正在使用downstream/asr/
        example是一个伪下游任务,对于测试上游模型或作为开发新下游任务的初始模板非常有用

来自上游的特征选择:上游的输出是一个字典,其中每个键的对应值是一个张量的列表(batch_size,max_sequence_length_of_batch,hidden_size)。为下游训练选择的最终特征依赖于-s和-l。如果它是张量的列表,我们在它们上面训练一个可学习的加权和(WS)。

        -s或-upstream _ feature _ selection(str,默认值:“hidden_states”):从上游输出dict中选择一个键。至少支持一个键:hidden_states。它的值是按层顺序排列的张量列表,其中值[0]靠近上游输入,值[-1]靠近上游输出。
        -l或- upstream_layer_selection (int,默认值:None)如果未指定,则由-s选择的dict值是最终选择。如果指定,则从-s选择的dict值中选择特定的索引
示例:
        选择隐藏状态(WS)的所有层:-s hidden_states
        选择第一层:-s hidden_states -l 0
        选择最后一层:-s hidden_states -l -1
        选择一个中间层:-s hidden_states -l 2
-f或-upstream _ traineable允许对下游任务的上游模型进行微调。默认值:false

-n或- name指定实验名称,与此运行相关的所有文件都将保存到expdir=result/downstream/{args.name}中。(也可以使用-p或- expdir直接指定expdir的路径。)

        命令
        配置文件
        张量文件
        checkpoints,每个包含参数、配置、最新优化步骤、最新优化时期、模型、优化器、调度器的状态
-c或- config指定配置文件路径。如果未指定,默认情况下将在每个下游文件夹下使用config.yaml。例如,result/asr/config.yaml

-o或- override可以用命令行覆盖任何参数或配置字段,这是最高优先级。请参考覆盖函数进行定义。下面是一个覆盖配置文件中定义的3个字段的示例:

-o "config.optimizer.lr=1.0e-3,,config.optimizer.name='AdamW',,config.runner.eval_dataloaders=['dev', 'test']"

- hub指定从哪里检索上游模型的模型Hub (PyTorch或Hugging Face)。默认:torch

从checkpoint恢复训练

# [ckpt] 可以是 checkpoint 或其驻留目录的路径。
python3 run_downstream.py -m train -e [ckpt]

-e或-pass _ exp选项被设计为使用与前面的训练实验完全相同的参数和配置,除了训练/评估模式。(每个检查点将保存参数和配置。)
-o可用于进一步覆盖从检查点加载的参数和配置,因为-o的优先级最高。

容错训练

for i in $(seq 1 100); do
    python3 run_downstream.py -m train -n ExpName -u fbank -d example -a
done

-a选项代表自动恢复,当expdir目录中有最新的检查点时将恢复检查点,或者当没有检查点时开始新的训练实验。

repo根目录下的run_while.sh是一个很好的包装器。对于您希望在一个while循环中运行的任何命令,您可以:

./run_while.sh COMMAND
./run_while.sh python3 run_downstream.py -a -m train -n ExpName -u fbank -d example

请务必记住使用-a 和 run _ while . sh,否则您将为每个循环重新启动一个新的训练实验,这将是一场灾难,尤其是对于Tensorboard事件文件。

分布式训练

我们用分布式数据并行(DDP)包装模型。通过在python3和run _ download . py之间插入-m torch.distributed.launch --nproc_per_node {GPU_NUM},可以直接将上述训练命令转化为分布式训练。我们支持DDP的所有superb任务。

什么时候使用DDP

当你发现训练太慢并且config.runner.gradient_accumulate_steps>1时,你可以通过使用多个GPU来加快训练速度,并减少梯度累积的步骤。请注意,以下设置实际上是相同的:

  1. gradient_accumulate_steps=4, 1 GPU
  2. gradient_accumulate_steps=2, 2 GPUs
  3. gradient_accumulate_steps=1, 4 GPUs


当使用不同的图形处理器数量时,请记住通过调整gradient_accumulate_steps。eg -o config . runner . gradient _ aggregate _ steps = 2

如何使用DDP

说当gradient _ aggregate _ steps = 8时,单个GPU太慢,你希望用4个GPU来加速。

修改GPU数量

gpus=4;
distributed="-m torch.distributed.launch --nproc_per_node ${gpus}";

简单训练

python3 $distributed run_downstream.py -m train -n ExpName -u fbank -d example \
    -o config.runner.gradient_accumulate_steps=2

请注意,当前当此训练终止或崩溃时,PyTorch可能不会自动终止所有衍生的进程,如果您直接启动新的DDP训练,可能会导致“GPU内存不足”或“地址已被使用”错误。因为硬件资源在上一次运行中还没有正确释放。您可以使用pkill -f“您以前的命令”来终止所有相关的进程。

恢复训练

# The $distributed value should be same as the original training experiment.
# [ckpt] can be the path of a checkpoint or its residing directory.
python3 $distributed run_downstream.py -m train -e [ckpt]

容差训练

./run_while.sh python3 $distributed run_downstream.py -m train -n ExpName \
    -u fbank -d example -a -o config.runner.gradient_accumulate_steps=2

测试checkponit

以下test-clean是测试数据集名称的示例,支持的名称由每个下游专家的get_dataloader定义。通常,标准拆分的任务/数据集支持开发和测试。

# [ckpt] can be the path of a checkpoint or its residing directory.
python3 run_downstream.py -m evaluate -t "test-clean" -e [ckpt]

-e或-pass _ exp选项被设计为使用与前面的训练实验完全相同的参数和配置,除了训练/评估模式。(每个检查点将保存参数和配置。)
-o可用于进一步覆盖从检查点加载的参数和配置,因为-o的优先级最高。

添加新的下游任务

每个下游任务由该下游文件夹下的独立文件夹定义,就像任务ASR是在downstream/asr中定义的一样。一旦一个新的文件夹被放置在这个下游文件夹下,downstream/blabla/,你可以在run_downstream.py脚本中指定用-d bla选项运行这个新的下游任务。

我们所说的自包含是指在您的任务文件夹下应该有所有的下游特定材料,包括数据集、数据加载器、模型和损失的定义。如何定义这些材料是完全免费的,而唯一的要求是在您的下游文件夹的根目录下提供一个带有Downstream Expert nn.module的expert.py文件,其中实现了3个对象方法:get_dataloader、forward和log_records。

了解框架如何工作的最快方法是运行一个最小的示例,因此我们提供了一个伪任务download/example/

python3 run_downstream.py -u fbank -d example -n HelloWorld

因此,您可以参考 downstream/example/expert.py了解最低要求和实现规范。此外,您可以使用 downstream/example//作为开发新下游任务的初始模板。

附注1
请在您的下游文件夹中使用相对导入,以防我们将来想要重命名或移动下游文件夹的位置。

附注2
如果您想用分布式训练来训练您的下游任务,那么当在您的专家文件中提供训练数据加载器时,您应该注意使用分布式采样器。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值