0. 简介
最近快到1024程序员节了,再给大家上点干活。Whisper是openai开源的一个语音转文字模型。也是现在识别效果最好的离线数据模型,但是我们发现我们在完成一些中英文或者专业术语对话的时候。这时候表现的效果就比较差了。而这一步就得用微调的方式来完成对这些特定词语进行修正了。这里最近受到优刻得的使用邀请,正好解决了我在大模型和自动驾驶行业对GPU的使用需求。UCloud云计算旗下的Compshare的GPU算力云平台。他们提供高性价比的4090 GPU,按时收费每卡2.08元,月卡只需要1.36元每小时,并附带200G的免费磁盘空间。暂时已经满足我的使用需求了,同时支持访问加速,独立IP等功能,能够更快的完成项目搭建。同时我们也开源了我们的代码:https://github.com/lovelyyoshino/Whisper_finetuning
在1024程序员节,优刻得发了专属的算力金,注册点击上方的链接即可获得,可以说填写一个问卷就可以白嫖了
1. Whisper在Windows中安装----这里有人写过了,我们就不再重复;可以参考OpenAI开源语音识别模型Whisper在Windows系统的安装详细过程这个文章
1.1 安装Python
Python的安装很简单,点击这里进行下载。
安装完成之后,输入python -V可以看到版本信息,说明已经安装成功了。
如果输入python -V命令没有看到上面的这样的信息,要么是安装失败,要么是安装好之后没有自动配置环境变量,如何配置环境变量可以从网上搜索。
Python的具体安装过程可以参考这篇文章。
1.2 安装FFmpeg
ffmpeg是专门做音视频处理用的软件,并且是开源的,点击这里进行下载
安装过程也是十分的简单,具体安装过程可以到网上搜索,因为我这里已经安装过了,所以没办法重新演示安装过程。
这里需要注意,我们安装完成之后还需要配置环境变量。
1.3 配置环境变量
如何配置环境变量,这里以Windows 11为例。
首先右击桌面上的"此电脑",然后点击"属性",然后点击"高级系统设置",然后点击"环境变量",然后点击"系统变量"中的"Path",然后双击"Path"进入到设置"Path"窗口,然后点击"新建",然后把你安装FFmpeg的位置写上,注意写到bin目录,最后记得点击"确定"。
1.4 安装显卡驱动
如过你没有独立显卡,那么可以跳过这步。如果你使用的是AMD显卡,那你也可以跳过这步了。
这里我以NVIDIA显卡为例。
我自己电脑上的显卡是NVIDIA MX150 2GB显卡,所以我们安装驱动的时候也要选择与自己显卡类型一致的驱动。
选择完成之后,点击"搜索"按钮,就可以看到有哪些可以下载的显卡驱动了,最后点击下载。
下载到本地之后,运行安装程序即可。
1.5 安装CUDA
安装完显卡驱动之后,我们打开显卡控制面板,找到显卡的信息,查看你显卡支持的CUDA版本。
可以看到我这里是12.1版本。
然后我们可以去官网下载对应版本的CUDA了,点击这里去下载
你要根据自己使用的系统来选择。
下载完成之后,直接双击运行即可。
这里比较大,为了下载更快,我使用了多线程下载器IDM。
这里再提一句,我们一定要下载对应版本的CUDA。
运行之后,可以选择自己安装的位置。
选择自定义安装,然后把前面两个勾选上。
然后是选择安装的位置。
然后你可能会安装失败。
我在安装过程中就有一个没有安装成功,我们可以不管它。
我们打开cmd命令行窗口,然后输入nvcc --version回车之后看到下面这些信息,说明安装成功了。
如果你们不懂,可以看参考文章。
如果有需要的话,最好还要安装一下cuDNN。这里我就不安装了。具体可以参考这篇文章。
1.6 安装PyTorch
简介:PyTorch是一个开源的Python机器学习库,其前身是著名的机器学习库Torch。2017年1月,由Facebook人工智能研究院(FAIR)基于Torch推出了PyTorch,它是一个面向Python语言的深度学习框架,不仅能够实现强大的GPU加速,同时还支持动态神经网络,这是很多主流深度学习框架比如Tensorflow等都不支持的。PyTorch既可以看作加入了GPU支持的numpy,同时也可以看成一个拥有自动求导功能的强大的深度神经网络。除了Facebook外,它已经被Twitter、CMU和Salesforce等机构采用。作为经典机器学习库Torch的端口,PyTorch 为 Python 语言使用者提供了舒适的深度学习开发选择。
这里说明一下,下载的PyTorch要与CUDA的版本一致,我这里使用的CUDA版本是12.1,但是我在官方PyTorch中没有找到该版本的下载命令。然后我是从网上找到一个命令安装了PyTorch。
bash
pip --trusted-host pypi.tuna.tsinghua.edu.cn install torch==1.10.1+cu102 torchvision==0.11.2+cu102 torchaudio==0.10.1 -f https://download.pytorch.org/whl/torch_stable.html
安装完成之后可以进入python环境,如果输入import torch没有报错,说明就可以了。
python
import torch
print(torch.__version__)
print(torch.cuda.is_available())
不过这里还是推荐大家下载与自己CUDA对应的版本。
1.7 安装whisper
安装whisper很简单,直接用一条命令即可。
bash
pip install -U openai-whisper
不过使用这条命令安装会很慢,我们可以使用清华镜像。
bash
pip install -U openai-whisper -i https://pypi.tuna.tsinghua.edu.cn/simple
1.8 whisper的使用
安装好后,我们使用下面的命令可以查看whisper如何使用。
bash
whisper -h
我们现在就可以使用whisper来语音识别了。
bash
whisper test.mp3 --model small --language Chinese
这里我们使用small模型,语言是中文,这样我们就可以把test.mp3音频文件转为文本并输出了。
我们可以指定输出的格式,默认是输出所有格式文件。
bash
--output_format {txt,vtt,srt,tsv,json,all}
我们也可以直接传入视频来识别音频生成文件。
bash
whisper test.mp4 --model small --output_format srt --language Chinese
如果你的显存不过用会报下面的错误。
bash
RuntimeError: CUDA out of memory. Tried to allocate 226.00 MiB (GPU 0; 2.00 GiB total capacity;
1.34 GiB already allocated; 0 bytes free; 1.60 GiB reserved in total by PyTorch) If reserved
memory is >> allocated memory try setting max_split_size_mb to avoid fragmentation.
See documentation for Memory Management and PYTORCH_CUDA_ALLOC_CONF
这个时候我们不要慌,我们还可以使用CPU,默认是使用GPU的,我们可以通过参数--device
来指定使用CPU进行运算。
bash
whisper test.mp4 --model small --output_format srt --device cpu --language Chinese
我们可以省略--language Chinese
,这个时候可以自动识别出你音频的语言。
当我们使用CPU运算时,我们还可以指定使用的线程数量。
bash
whisper test.mp4 --model small --output_format srt --device cpu --language Chinese --threads 8
2. 训练自己的数据
首先我们原始的数据模型在huggingface中,这就需要使用git将大文件都下载下来,这里就需要安装lfs
bash
apt install git-lfs
然后按照下面的流程执行
2.1 安装
- 克隆此代码
bash
git clone https://github.com/lovelyyoshino/Whisper_finetuning.git
- 安装Conda请参考 https://docs.conda.io/en/latest/miniconda.html
- 创建Conda环境
bash
conda create -n whisper python=3.8
conda activate whisper
- 配置环境 - 有一个命令会运行很久,中途可能会断掉,请多尝试
bash
bash set_env.sh
- 下载Whisper_large_v2模型(大概需要一晚上)
bash
git clone https://huggingface.co/openai/whisper-large-v2
cd whisper-large-v2
git lfs fetch
git lfs checkout
PS
- 也可以用Whisper_Tiny模型做尝试
bash
git clone https://huggingface.co/openai/whisper-tiny
cd whisper-base
git lfs fetch
git lfs checkout
2.2 案例1:在Whisper上同时微调转录与翻译任务
bash
cp -r whisper example/aishell-sample/
cd example/aishell-sample
2.2.1 数据准备
- 转录数据,参考data/transcribe/{wav.scp,text}
- 翻译数据,参考data/translate/{wav.scp,text} wav.scp
id | language | task -> /absolute/path/to/wav
text
id | language | task -> label
id | 语种 | 任务类型 |
---|---|---|
BAC009S0150W0001 | chinese | translate |
BAC009S0150W0001 | chinese | transcribe |
bash
# 模型总共训练数据 - 将翻译和转录的数据合并为一个整体
cat data/transcribe/wav.scp data/translate/wav.scp > data/wav.scp
cat data/transcribe/text data/translate/text > data/text
2.2.2 更改配置
修改 config/whisper_multitask.yaml
yaml
data:
train:
wav_scp: "训练数据wav.scp的绝对路径"
text: "训练数据text的绝对路径"
test:
wav_scp: "测试数据wav.scp的绝对路径"
text: 测试数据text的绝对路径"
predict:
model_path: "自己微调之后的模型位置"
result_file: "结果保存的绝对路径"
eval:
wav_scp: "验证数据wav.scp的绝对路径"
text: "验证数据text的绝对路径"
dev_env:
ori_model_path: "原始模型路径"
ctranslate_model_path: "ctranslate转后的模型"
conf:
device: "cpu"
compute_type: "float32"
result_file: "结果保存的绝对路径"
dev:
wav_scp: "测试数据wav.scp的绝对路径"
text: "测试数据text的绝对路径"
model:
model_path: "自己的whisper_large_v2或者base模型路径"
is_large_model: "如果是whisper_large_v2模型则设置为True否则为False"
data_collator:
forward_attention_mask: False
model_train_argv:
out_model_path: "模型保存的路径"
resume_from_checkpoint : ""
per_device_train_batch_size: 1
per_device_eval_batch_size: 1
gradient_accumulation_steps: 1
num_train_epochs: 1
learning_rate: 0.0001
logging_steps: 2
fp16: False
warmup_steps: 50
evaluation_strategy: "epoch"
generation_max_length: 128
remove_unused_columns: False
label_names:
- labels
2.3 训练模型
更改代码中配置文件路径
bash
python3 train.py
2.4 测试模型
更改代码中配置文件路径
bash
python3 predict.py
2.5 使用CTranslate2进行模型加速
python
from whisper.utils.common_utils import convert_finetuning_peft_model_into_whisper
log_info("Lora参数融入Whsiper")
convert_finetuning_peft_model_into_whisper(
# 微调后的peft模型路径
peft_model_path=config['predict']['model_path'],
# 原始whisper模型路径
whisper_model_path=config['dev_env']['ori_model_path'],
# 可以使用ctranslate加速后的模型位置
out_ctranslate_path = config['dev_env']['ctranslate_model_path']
)
2.6 Whipser使用
读取对应的pt文件,与原来的文件进行对比
bash
python whipser_demo.py