0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

在X3派上玩转一亿参数量超大Transformer,DIY专属你的离线语音识别

地瓜机器人 2023-02-21 16:08 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

Transformer模型在自然语言领域被提出后,目前已经扩展到了计算机视觉、语音等诸多领域。然而,虽然Transformer模型在语音识别领域有着更好的准确率,但还面临着一个问题,计算复杂度和内存储存开销会随着语音时长的增加而变大。

技术普及在于产品价格亲民,而价格亲民在于技术易落地易实现,离线语音识别应运而生,运用深度学习等技术且只需在本地进行运算就可实现人机语音交互,而且具备实时的响应速度、无需联网的特点,能更好的应用在大小家电、照明、车载、健康仪器、教育设备等行业。

本次内容由社区优秀开发者、首百第四批新品体验官——宋星辰将带领大家DIY个人专属离线语音识别,在X3派上玩转一亿参数量的超大Transformer。欢迎感兴趣的旭友们点击注册地平线开发者社区交流讨论,相关文档详见地平线开发者社区。

技术详解

Step-1:模型转换的环境准备

环境准备本身没有什么奇技淫巧,这里想重点描述的是:pytorch版本的升级对精度瓶颈和速度瓶颈分析所带来的跨越式的体验提升。

在地平线开发者社区官方提供的安装包中,为了兼容训练算法包海图(HAT),安装的 pytorch版本为1.10.0。pytorch版本本身对模型转换的精度不会有什么影响,但是不同版本的pytorch所导出的onnx,在节点(node, 或称op)命名上有很大的区别。

就一般情况而言,当torch版本为1.10.0时,Node的命名采用了“optype+数字”的形式,这种形式的缺点是:当模型 Layer/SubLayer数量非常多(比如本文一亿参数量的Transformer,包含的 OP 有上千个),我们很难一眼定位 Conv_xx 到底是第几层的第几个卷积

1.png


torch 1.10.0版本结果

通常一个量化明显掉点的模型,会从中间某一个OP开始有鲜明的Cosine Similarity损失,在当前的命名格式下,为了找到这个OP在原始模型中的位置(第x Layer的第y SubLayer),我们需要从头开始一个一个数,这无疑是效率低下的。当然,随着对模型细节的熟悉,定位的速度会越来越快,但这不能从根本上解决效率问题。

相反,当torch版本升级到1.13.0时Node的命名采用了“Layer+SubLayer+Attribute+OP”的形式,一眼定位,一眼丁真,大大节省了开发人员定位精度问题(哪层的OP相似度下降严重)or 速度问题(哪层的OP跑在CPU)的时间。

2.png


torch 1.13.0版本结果

Step-2:C++ Demo 的编译

由于X3派板端内存有限,编译C++ Demo时笔者采用了交叉编译的形式,在开发机上sudo安装aarch gcc即可。至于使用C++实现BPU模型的板上推理,实现推理的逻辑本身是一件很容易的事情,无论是使用python实现亦或是C++实现,其流程都是固定的,也即:

3.png

关于这四个步骤的API调用范例,官方 C++ 文档中都给出了比较详细的 know-how 示例,但是大多数都是单模型 + 单输入的简单case,在语音识别模型中,会涉及到 多模型(多个bin串联)+ 多输入(一个bin有多个输入)的情况,这里给出本文的针对性示例:

// BPUAsrModel 类定义 using hobot::easy_dnn::Model; using hobot::easy_dnn::DNNTensor; using hobot::easy_dnn::TaskManager; using hobot::easy_dnn::ModelManager; class BPUAsrModel : public AsrModel { public: BPUAsrModel() = default; ~BPUAsrModel(); BPUAsrModel(const BPUAsrModel& other); void Read(const std::string& model_dir); void PrepareEncoderInput(const std::vector>& chunk_feats); // 其他成员函数... protected: void ForwardEncoderFunc(const std::vector>& chunk_feats, std::vector>* ctc_prob) override; private: // models std::shared_ptr encoder_model_ = nullptr; std::shared_ptr ctc_model_ = nullptr; // input/output tensors, 使用vector方便应对单模型多输入的情况 std::vector> encoder_input_, encoder_output_; std::vector> ctc_input_, ctc_output_; // 其他成员变量... };

Step-3:正式开始模型转换

(一)一行代码 改写Transformer模型

使用工具链去转换NLP领域的原生Transformer模型,体验可能会是非常糟糕的(甚至会在转换过程中直接报错)。这是因为NLP中的Transformer,输入tensor的维度通常是二维或三维,类型既包含float也包含long 。而XJ3芯片在设计时只着重考虑了视觉任务,通常都是浮点的四维图像输入,工具链也只对这类视觉模型有比较极致的体验优化。

那么,为了转换NLP类的Transformer,我们是否需要重头训练一个四维数据流的模型呢?答案显然是否定的,本文通过等价替换和抽象封装,实现了一行代码将原生Transformer等价改写为BPU友好的Transformer:

# 一键完成 3D数据流 Transformer 等价转换 4D数据流 Transformer Encoder4D = wenet.bin.export_onnx_bpu.BPUTransformerEncoder(Encoder3D)

这里的BPU TransformerEncoder就像是科幻电影中的“外骨骼机甲”一样,其内核没变(权重参数值没变),但是功能上实现了针对性升级。具体而言,在 BPUTransformerEncoder 的构造过程中,会逐OP遍历原生的 Encoder3D,并对其中的 BPU 不友好的 OP 实施等价改写。

(二) 一句命令 走完转换全流程

一个完整pytorch模型到bpu模型的转换流程,一般要经过如下四步:

①pytorch 模型 转 onnx 模型;

②构造 Calibration 数据;

③构造 config.yaml;

④调用 hb_mapper 执行 onnx 转 bpu bin。

在WeNet开源的代码中,我们用人民群众喜闻乐见的python把这四个步骤 “粘” 到了一起,使用如下命令,就可走完全流程。

python3 $WENET_DIR/tools/onnx2horizonbin.py \ --config ./model_subsample8_parameter110M/train.yaml \ --checkpoint ./model_subsample8_parameter110M/final.pt \ --output_dir ./model_subsample8_parameter110M/sample50_chunk8_leftchunk16 \ --chunk_size 8 \ --num_decoding_left_chunks 16 \ --max_samples 50 \ --dict ./model_subsample8_parameter110M/units.txt \ --cali_datalist ./model_subsample8_parameter110M/calibration_data/data.list

其中:

config(描述了模型配置,几层layer等);

checkpoint(pytorch 浮点模型);

output_dir(.bin 文件输出目录);

chunk_size(跟识别有关的解码参数);

num_decoding_left_chunks(跟识别有关的解码参数);

max_samples(使用多少句数据制作calibration data);

dict(字典);

cali_datalist(描述了标定数据的位置)。

综上,我们对如下这四个步骤实现了完完全全的 python化封装 和 一体化串联 ,真正实现了一句命令(python3 $WENET_DIR/tools/onnx2horizonbin.py ...)走完全部转换流程。

Demo展示

硬件配置:

4.png

模型配置:

5.png

解码速度对比(单核单线程,量化后的模型):

6.png

本文转自地平线开发者社区
原作者:xcsong

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5186

    文章

    20146

    浏览量

    328816
  • 语音识别
    +关注

    关注

    39

    文章

    1803

    浏览量

    115560
  • 人工智能
    +关注

    关注

    1813

    文章

    49734

    浏览量

    261514
  • Transformer
    +关注

    关注

    0

    文章

    154

    浏览量

    6814
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    低成本AI边缘计算盒子DIY:基于迅为RK3568和开源模型,轻松玩转智能识别

    低成本AI边缘计算盒子DIY:基于迅为RK3568和开源模型,轻松玩转智能识别
    的头像 发表于 11-12 13:42 1295次阅读
    低成本AI边缘计算盒子<b class='flag-5'>DIY</b>:基于迅为RK3568和开源模型,轻松<b class='flag-5'>玩转</b>智能<b class='flag-5'>识别</b>

    什么是离线语音识别芯片(离线语音识别芯片有哪些优点)

    离线语音识别芯片,是一种集成了语音信号采集、前端处理和本地识别功能的专用集成电路,无须联网也可以进行语音
    的头像 发表于 10-31 15:27 267次阅读

    奇瑞风云X3系列双车上市

    8月16日,奇瑞汽车旗下风云品牌全新方盒子产品序列——风云X3与风云X3 PLUS正式宣告上市。风云X3系列基于iCAR 03系列焕新升级而来,造型设计、动力性能、智能科技、功能配置
    的头像 发表于 08-19 11:48 835次阅读

    哪些离线语音芯片适用于家电设备

    ​哪些离线语音芯片适用于家电设备?选择适用于家电设备的离线语音芯片时,需综合考量家电的使用环境、功能需求、成本预算等多方面因素。以下为您推荐几款性能出色的
    的头像 发表于 08-06 17:27 645次阅读
    哪些<b class='flag-5'>离线</b><b class='flag-5'>语音</b>芯片适用于家电设备

    树莓5开启YOLO姿态估计识别之旅!

    大家好,接下来会为大家开一个树莓5和YOLO的连载文章。内容包括四个部分:树莓5使用YOLO进行物体和动物识别-入门指南
    的头像 发表于 07-18 15:31 1989次阅读
    <b class='flag-5'>在</b>树莓<b class='flag-5'>派</b>5<b class='flag-5'>上</b>开启YOLO姿态估计<b class='flag-5'>识别</b>之旅!

    树莓5使用YOLO进行物体和动物识别-入门指南

    大家好,接下来会为大家开一个树莓5和YOLO的专题。内容包括四个部分:树莓5使用YOLO进行物体和动物识别-入门指南
    的头像 发表于 07-17 17:16 1565次阅读
    <b class='flag-5'>在</b>树莓<b class='flag-5'>派</b>5<b class='flag-5'>上</b>使用YOLO进行物体和动物<b class='flag-5'>识别</b>-入门指南

    AT6802-超低功耗离线智能语音识别芯片

    AT6802超低功耗离线语音识别芯片以1mA工作电流实现98%识别率,支持方言和连续指令,数据本地加密处理,为智能家居、工业控制带来安全流畅的交互革命
    的头像 发表于 07-03 19:04 1119次阅读

    人脸识别指南:如何在树莓派上安装和设置 Dlib

    学习如何在树莓派上安装Dlib并配置人脸识别功能,为您的AI项目奠定基础。树莓派上安装Dlib的详细步骤要为树莓安装Dlib并确保人脸
    的头像 发表于 03-24 17:31 1250次阅读
    人脸<b class='flag-5'>识别</b>指南:如何在树莓<b class='flag-5'>派上</b>安装和设置 Dlib

    NRK3301离线语音识别模块七彩灯的应用方案

    的NRK3301语音识别模块。广州九芯电子推出的这款芯片,如何让七彩灯摆脱“手动时代”?本文将拆解技术真相!   NRK3301是广州九芯电子专为智能家居场景打造的离线语音
    的头像 发表于 03-10 14:04 783次阅读
    NRK3301<b class='flag-5'>离线</b><b class='flag-5'>语音</b><b class='flag-5'>识别</b>模块<b class='flag-5'>在</b>七彩灯<b class='flag-5'>上</b>的应用方案

    离线语音识别芯片方案商:茶吧机语音控制模块NRK3502

    离线语音技术NRK3502凭无网、高隐私、快响应成家电新趋势,适配茶吧机等设备,支持多语言识别,高性价比,助力家电智能化升级。
    的头像 发表于 03-06 13:44 879次阅读
    <b class='flag-5'>离线</b><b class='flag-5'>语音</b><b class='flag-5'>识别</b>芯片方案商:茶吧机<b class='flag-5'>语音</b>控制模块NRK3502

    离线语音模组VC系列出厂固件使用教程——SDK开源?

    安信可VC系列离线语音模组,采用云知声方案,语音识别技术不断优化和创新算法,
    的头像 发表于 02-26 14:14 835次阅读
    <b class='flag-5'>离线</b><b class='flag-5'>语音</b>模组VC系列出厂固件使用教程——SDK开源?

    的钱来了”:财神1号,RDK X3驱动,自动捡钱不手软!

    采用 RDK X3 打造无情的捡钱机器,每天8亿纸币掉在路面上,财神1号帮你捡个够!
    的头像 发表于 02-18 11:15 936次阅读
    “<b class='flag-5'>你</b>的钱来了”:财神1号,RDK <b class='flag-5'>X3</b>驱动,自动捡钱不手软!

    新品| Unit ASR,一体化离线语音识别单元

    UnitASR是一款AI语音识别单元,内置AI智能离线语音模块CI-03T。它具有语音识别、声纹
    的头像 发表于 02-14 18:34 750次阅读
    新品| Unit ASR,一体化<b class='flag-5'>离线</b><b class='flag-5'>语音</b><b class='flag-5'>识别</b>单元

    【「嵌入式系统设计与实现」阅读体验】+ 基于语音识别的智能杯垫

    项目二维码下图 该作品通过采集饮水数据,多种交互方式,数据分析处理,提醒用户定期饮水,达到保持健康的作用。 主要功能是语音识别。 ASR-PRO语音模块是一款高度集成的智能语音
    发表于 01-02 18:15

    离线语音识别技术引领智能语音灯具市场——NRK3502

    智能语音灯具集高科技与人性化设计,内置NRK3502离线语音识别芯片,支持远场识别与自定义指令,提供便捷智能体验,推动智能家居行业发展。
    的头像 发表于 12-30 15:04 1213次阅读
    <b class='flag-5'>离线</b><b class='flag-5'>语音</b><b class='flag-5'>识别</b>技术引领智能<b class='flag-5'>语音</b>灯具市场——NRK3502