ASR 文档
1. 环境搭建 (conda)
1)创建指定Python版本的conda虚拟环境:conda create -n 环境名称 python=3.6.2
2)安装Pytorch及对应版本的cuda-toolkit:conda install pytorch torchvision torchaudio cudatoolkit=11.1 -c pytorch -c conda-forge
3)安装C-Python解释器:pip install Cython
4)更新conda仓库列表:conda config --add channels conda-forge
5)安装Python代数库依赖:conda install pyamg
6)安装Nemo工具包:pip install nemo_toolkit['all'] -i https://pypi.doubanio.com/simple/
补充说明:
1)文档cuda 版本: 11.1.114
2)Nemo工具包中已包含Pytorch-lightning框架在内的所有相关包,无需重复下载
2. 数据准备
1)数据路径:/aidate/home/ASR-data/King-ASR-059/
2)格式转换:Nemo框架采用映射的方式来生成训练集和测试集。具体来说,我们需要生成按照以下格式的Json文件:
{"audio_filepath": "绝对路径", "duration": 音频时长, "text": "文本"}
eg. {"audio_filepath": "/aihome/ASR-data/King-ASR-059/001.WAV", "duration": 1.2, "text": "今天天气真好"}
补充说明:
1)键的名称不允许更改,顺序可变
2)音频时长由librosa.core.get_duration()方法获取
3)text文本一般不含空格和特殊标点符号,因此需要对原始文本进行二次处理,主要是分词合并。这样可以减少模型待学习的信息,即词间隔(空格)和其他标点符号所包含的语义信息。
3. 参考模型
1)论文链接:./aidate/home/share_yy/Quarznet.pdf 或 arXiv地址
2)模型特点:一维全卷积网络,层与层之间存在残差级联结构,从而使模型可以更深。
4. 模型训练
1)Nemo中的模型描述保存在.yaml文件中,包括语音增强,模型声明,训练超参数设定等
2)Nemo支持Pytorch-lightning语法进行调参和测试,同时支持从断点恢复训练
3)分布式训练及GPU的指定通过Pytorch-lightning中的Trainer容器来进行配置
4)Nemo支持Tensorboard可视化,每次训练会在lightning_logs目录下生成相应的文件夹保存模型信息:
在命令行查看:tensorboard --logdir=项目路径/lightning_logs/version_x/
5. 性能测试
1)Nemo实例化后的模型继承了transcribe方法,输入参数包括"paths2audio_files"和"batch_size":
paths2audio_files: List列表,元素为每个音频的绝对路径,通过os方法遍历访问目标文件夹得到
batch_size:整型变量,指定了每次输出的样本量,默认为None
2)transcribe方法不包含字错误率(WER/CER),需要由._wer方法实现。同时,可以调用time包计算实时率:
import time; starttime = time.time(); 程序块; endtime = time.time();
3)Pytorch框架默认模型处于train模式,对于含BN层和dropout层的模型测试,需要手动设置为测试模式:
model.train() -> model.eval()
补充说明:stream流式测试及online实时测试可参考链接1和链接2
6. 模型量化
1)静态等间隔量化(伪)
delta = (x_max - x_min) / (量化位数 - 1)
x_quant = x_min + floor( (x - x_min) / delta ) * delta
问题:处理后的x_series仍然为全精度表示,需考虑恒等值域变换或等比缩放以减小物理存储
恒等值域变换:
目标:处理后的x_series为整型变量集合,值域在区间内连续分布
eg. 正则表达式表示
a)1bit量化:x = (0,1)*
b)2bit量化:x = (0,1,2,3)* 或 x = (-1, 0, 1)*
注释:目标为有符号数时候量化表示范围 = 量化位数 - 1
等比缩放(fake quant):
在恒等值域变换的基础上增加缩放因子alpha(通常为全精度表示)
a)1bit量化:x = (0,1)* -> x = (0,alpha)*
b)2bit量化:x = (0,1,2,3)* 或 x = (-1, 0, 1)* -> x= (0,alpha, 2*alpha, 3*alpha)* 或 x = (-alpha, 0, alpha)*
补充说明:常用零点的选择通常是x_min(即量化到非负区间)或者数值中点(即(x_max + x_min) / 2)
2)Tenary动态三值量化(受限alpha版本)
a)属于等比缩放,即x = (- alpha , 0, alpha )*的形式,论文地址:/aidate/home/share_yy/1605.04711.pdf
b)alpha可以是按层(滤波器组)求得,也可以按kernel(神经元)计算
c)"受限"是指alpha的计算过程中存在人为设定的超参数(参数分布)
3)可变比特动态量化(可学习alpha版本)
a)同属于等比缩放,参考论文地址:/aidate/home/share_yy/1606.06160.pdf
b)可以实现任意比特的量化,直接作用于torch.conv1D层的forward部分,基于预训练权重进行量化变换
4)Pytorch原生量化函数
a)1.7版本以后自带量化库,由第三方学者贡献,目前已整合至官方文档说明
b)仅支持16位量化,量化后的模型只能预测不能继续训练(梯度传播错误)
c)目前Pytorch支持将只包含二维卷积和BN层的模块,通过fusion后合并为SimpleModule,节省存储
7. 项目结构
-- 地址 /aidate/home/share_yy/asr 或 /aidate/home/aiyy/asr
-- 文件夹
a)config 模型描述文件, yaml格式
b)data_preparation 生成数据集的Json脚本映射
c)lightning_logs 保存训练过程信息,支持tensorboard可视化
d)models 保存训练的模型权重
-- 文件
a)king_train.json 训练集语料,包含80%的King-ASR数据
b)king_test.json 测试集语料,包含20%的King-ASR数据
c)online_asr_zn.ipynb 实时ASR测试
d)train.py 模型训练
e)test_asr.py 模型测试
补充说明:
-- ASR数据集 /aidate/home/ASR-data/King-ASR-059
-- 服务器环境 /aidate/home/aiyy_env