/wenet_trt8

Primary LanguagePythonApache License 2.0Apache-2.0

总述

请简练地概括项目的主要贡献,使读者可以快速理解并复现你的工作,包括:

  • 原始模型的名称及链接
  • 优化效果(精度和加速比),简单给出关键的数字即可,在这里不必详细展开
  • 在Docker里面代码编译、运行步骤的完整说明
    • 请做到只要逐行运行你给的命令,就能把代码跑起来,比如从docker pull开始

本项目使用TRT8部署开源语音识别工具包WeNet。为语音识别模型在TRT8上部署提供参考方案。 原始模型来自[WeNet预训练模型](https://wenet.org.cn/wenet/pretrained_models.html)。

优化效果:TODO

Docker运行方法:TODO

原始模型

模型简介

WeNet 是一款面向工业落地应用的语音识别工具包,提供了从语音识别模型的训练到部署的一条龙服务,其主要特点如下:

  • 使用 conformer 网络结构和 CTC/attention loss 联合优化方法,统一的流式/非流式语音识别方案,具有业界一流的识别效果。
  • 提供云上和端上直接部署的方案,最小化模型训练和产品落地之间的工程工作。
  • 框架简洁,模型训练部分完全基于 pytorch 生态,不依赖于 kaldi 等复杂的工具。
  • 详细的注释和文档,非常适合用于学习端到端语音识别的基础知识和实现细节。
  • 支持时间戳,对齐,端点检测,语言模型等相关功能。

本项目的模型使用预训练模型导出onnx,然后进行TRT部署。预训练模型方法导出参考WeNet手册

训练等相关信息请参考官方:https://github.com/wenet-e2e/wenet。

模型优化的难点

WeNet模型分为encoder和decoder两个部分。其中,encoder主要使用了conv和self-attention结构,而decoder使用了self-attention和cross-attention结构。在模型转换和使用过程中存在以下问题:

  • 由于是pytorch导出onnx模型,因此onnx模型中使用了大量小算子拼凑出attention功能。
  • 在使用trtexec直接解析decoder模型时,在RTX 3080Ti 12G显卡上会出现显存不足的错误。
  • 使用Half数据类型进行推理,encoder和decoder的精度损失严重。

针对以上问题,本项目采用以下方法进行模型优化。

  • 合并onnx模型中的小算子,使用MultiHeadAttn、LayerNorm等大算子替代原始小算子。
  • 使用trtexec解析替换大算子的模型。
  • 分析各个节点输出,定位误差大的节点,并使用高精度进行计算。
  • 尝试模型量化,使用INT8进行推理,保证精度的情况下,进一步加快速度。

优化过程

这一部分是报告的主体。请把自己假定为老师,为TensorRT的初学者讲述如何从原始模型出发,经过一系列开发步骤,得到优化后的TensorRT模型。

建议:

  • 分步骤讲清楚开发过程
  • 最好能介绍为什么需要某个特别步骤,通过这个特别步骤解决了什么问题
    • 比如,通过Nsight Systems绘制timeline做了性能分析,发现attention时间占比高且有优化空间(贴图展示分析过程),所以决定要写plugin。然后介绍plugin的设计与实现,并在timeline上显示attention这一部分的性能改进。

精度与加速效果

这一部分介绍优化模型在云主机上的运行效果,需要分两部分说明:

  • 精度:报告与原始模型进行精度对比测试的结果,验证精度达标。
    • 这里的精度测试指的是针对“原始模型”和“TensorRT优化模型”分别输出的数据(tensor)进行数值比较。请给出绝对误差和相对误差的统计结果(至少包括最大值、平均值与中位数)。
    • 使用训练好的权重和有意义的输入数据更有说服力。如果选手使用了随机权重和输入数据,请在这里注明。
    • 在精度损失较大的情况下,鼓励选手用训练好的权重和测试数据集对模型优化前与优化后的准确度指标做全面比较,以增强说服力
  • 性能:最好用图表展示不同batch size或sequence length下性能加速效果。
    • 一般用原始模型作为参考标准;若额外使用ONNX Runtime作为参考标准则更好。
    • 一般提供模型推理时间的加速比即可;若能提供压力测试下的吞吐提升则更好。

请注意:

  • 相关测试代码也需要包含在代码仓库中,可被复现。
  • 请写明云主机的软件硬件环境,方便他人参考。

Bug报告(可选)

提交bug是对TensorRT的另一种贡献。发现的TensorRT、或cookbook、或文档和教程相关bug,请提交到github issues,并请在这里给出链接。

对于每个bug,请标记上hackathon2022标签,并写好正文:

  • 对于cookbook或文档和教程相关bug,说清楚问题即可,不必很详细。
  • 对于TensorRT bug,首先确认在云主机上使用NGC docker + TensorRT 8.4 GA仍可复现,然后填写如下模板,并请导师复核确认(前面“评分标准”已经提到,确认有效可得附加分):
    • Environment
      • TensorRT 8.4 GA
      • Versions of CUDA, CUBLAS, CuDNN used
      • Container used
      • NVIDIA driver version
    • Reproduction Steps
      • Provide detailed reproduction steps for the issue here, including any commands run on the command line.
    • Expected Behavior
      • Provide a brief summary of the expected behavior of the software. Provide output files or examples if possible.
    • Actual Behavior
      • Describe the actual behavior of the software and how it deviates from the expected behavior. Provide output files or examples if possible.
    • Additional Notes
      • Provide any additional context here you think might be useful for the TensorRT team to help debug this issue (such as experiments done, potential things to investigate).

经验与体会(可选)

欢迎在这里总结经验,抒发感慨。