尽管自动语音识别(Auto Speech Recognition,ASR)已经有很多的解决方案,但是能够媲美人类水平的ASR模型屈指可数。与大语言模型不同的是,ASR领域可用的预训练模型很少,基于预训练模型在特定数据集上微调更是困难。而德国的一位博士生开源了一个使用LoRA(Low Rank Adaptation)技术和PEFT(Parameter Efficient Fine Tuning)方法对Whisper模型进行高效微调的项目。可以让大家在消费级显卡(显存8GB)上对OpenAI开源的WhisperV2模型进行微调!本文来自DataLearner博客:在消费级显卡上微调OpenAI开源的自动语言识别模型Whisper:8GB显存即可针对你自己的数据建立ASR模型 | 数据学习者官方网站(Datalearner)

语音识别预训练模型Whisper简介

OpenAI在2022年9月21日开源的Whisper模型声称在英语的语音识别方面接近人类(Whisper模型卡信息:https://www.datalearner.com/ai-models/pretrained-models/Whisper )。并在同年的12月9日发布了Whisper V2版本。该模型参数规模15.5亿,表现十分优秀。由于Whisper是在一个大型和多样化的数据集上训练的,并没有针对任何特定的数据集进行微调,它并没有击败专门从事LibriSpeech性能的模型(这是一个著名的语音识别竞争基准)。然而,当在许多不同的数据集上测量Whisper的零散性能时,它比那些模型要稳健得多,犯的错误要少50%。

尽管如此,对于很多语言来说,Whisper识别准确率不够。而它本身已经是在80000多小时的数据上训练的,参数规模15.5亿,运行需要10GB显存起步,要求不低。进一步的,如果想要对Whisper-large-v2进行微调,则至少需要24GB显存,并且对训练过程中的每一个checkpoint需要7GB存储。对于个人来说,这样的硬件要求略高。


德国一个学生Vaibhav Srivastav发布了一个使用LoRA(Low Rank Adaptation)技术和PEFT(Parameter Efficient Fine Tuning)方法对Whisper模型进行高效微调的项目,只需要8GB显存即可对Whisper-large-v2进行微调,十分值得搞ASR的童鞋关注。

Faster Whisper Finetuning项目简介

Parameter Efficient Fine Tuning (PEFT)和Low Rank Adaptation (LoRA)是2种非常重要的模型微调方法。这两种方法只微调模型的一小部分(额外的)参数,同时冻结预训练模型的大部分参数,从而大大降低了计算和存储成本。尤其是LoRA,它在Transformer架构的每一层中注入可训练的秩分解矩阵,从而大大减少了下游任务的可训练参数数量。而且,LoRA的表现与完全微调的模型质量相当或更好,尽管它的可训练参数更少,训练吞吐量更高,并且与适配器不同,它没有额外的推理延迟。

在这个项目中,Vaibhav Srivastav提供了一份详细的步骤指南,指导大家如何使用Transformers和PEFT在Google Colab中微调Whisper模型。

在这个Colab中,开发人员详细描述了利用PEFT和bitsandbytes无缝地训练一个whisper-large-v2的checkpoint,使用的是一块免费的T4 GPU(16 GB VRAM)。

此外,该项目还进行了一些基准测试,比较了使用LoRA进行Whisper微调和传统的Whisper微调。结果显示,即使在使用低于8GB VRAM的消费级GPU的情况下,使用LoRA进行微调的Whisper模型的性能与全面微调的性能相当,但是训练速度提高了5倍。

项目提供了一个对比:

经过上述微调得到的最终的模型仅仅只有60MB大小,还不到原有模型的1%(OpenAI开源的模型大小约6.17GB)

Faster Whisper Finetuning项目主要步骤

这个项目其实最大的优点我认为是提供了一个非常详细的基于PEFT微调ASR预训练模型的教程。它提供的Google Colab教程十分详细,而且是一个基于Common Voice 13.0数据集微调的真实案例。使用该模型微调印地语的数据。

这里列举一下该项目中微调Whisper模型的主要步骤:

  1. 安装环境:本项目依赖了多个开源库,包括datasets、transformers等。
  2. 加载数据集:本项目针对Common Voice 13.0的数据进行微调。这是由mozilla提供的一个开源语音数据集,包括2.7万小时各种语言的音频和文本数据集。
  3. 特征抽取、tokenizer等:ASR的主要步骤包括数据抽取和音频数据预处理、seq-to-seq的映射、将模型的输出变成文本
  4. 训练与验证:为模型准备输入数据,设置评估方法,加载预训练模型并配置LoRA,然后训练。

这里我们只展示其中加载预训练模型并设置LoRA的核心的代码:

from transformers import WhisperForConditionalGeneration
from peft import prepare_model_for_int8_training, LoraConfig, PeftModel, LoraModel, LoraConfig, get_peft_model
# 加载预训练模型
model = WhisperForConditionalGeneration.from_pretrained(model_name_or_path, load_in_8bit=True, device_map="auto")
# 在8bit模型上做后处理
model = prepare_model_for_int8_training(model, output_embedding_layer_name="proj_out")
# 由于Whisper模型在编码器中使用了卷积层,checkpointing会禁用梯度计算,因此我们需要将输入设为可训练。
def make_inputs_require_grad(module, input, output):
    output.requires_grad_(True)
model.model.encoder.conv1.register_forward_hook(make_inputs_require_grad)
# 对模型应用LoRA
config = LoraConfig(r=32, lora_alpha=64, target_modules=["q_proj", "v_proj"], lora_dropout=0.05, bias="none")
model = get_peft_model(model, config)
model.print_trainable_parameters()

基于上述核心代码进行微调即可,正常情况,低配置的硬件需要6-8个小时完成微调。

完整项目地址:https://github.com/Vaibhavs10/fast-whisper-finetuning