在 Cadence 音频数字信号处理器上加速 TensorFlow Lite Micro

在 Cadence 音频数字信号处理器上加速 TensorFlow Lite Micro
www.zeeklog.com  - 在 Cadence 音频数字信号处理器上加速 TensorFlow Lite Micro
www.zeeklog.com  - 在 Cadence 音频数字信号处理器上加速 TensorFlow Lite Micro

发布人:来自 Cadence 的 Raj Pawate 和 Google 的 Advait Jain

数字信号处理器 (DSPs) 是所有电池供电设备的重要组成部分,其提供了一种以极低功耗处理音频数据的方法。这些芯片负责运行信号处理算法,例如音频编解码器、噪声消除和波束形成等。

这些 DSPs 也越来越多地用于运行神经网络,例如唤醒词检测、语音识别和噪声抑制。启用此类应用的关键是,能够尽可能高效地执行这些神经网络。

www.zeeklog.com  - 在 Cadence 音频数字信号处理器上加速 TensorFlow Lite Micro

不过,在 DSPs 上运行机器学习的产品化路径往往是临时路径。相比之下,语音、音频和视频编解码器运行国际电联 (ITU) 和 3GPP 等全球标准机构创建的压缩和解压缩算法,可解决质量测量、定点算法注意事项和互操作性等多方面的问题。

TensorFlow Lite Micro (TFLM) 是一个通用的开源推理框架,可在嵌入式目标(包括 DSPs)上运行机器学习模型。同样,Cadence 也在 PPA 优化的软硬件平台上投入巨大,例如用于音频的 Cadence Tensilica HiFi DSP 系列和用于视觉的 Cadence Tensilica Vision DSP 系列。

Cadence

https://www.cadence.com/en_US/home.html

基于此,TFLM 团队与 Cadence 的音频 DSP 团队在 2019 年就此展开合作。TFLM 团队专注于利用广泛的 TensorFlow 框架,并通过解释器和参考内核开发从训练到嵌入式和 DSP 部署的平滑路径。Cadence 开发一个高度优化的软件库,称为 NeuralNet 库 (NNLIB),该库利用了其低功耗 HiFi DSPs 的 SIMD 和 VLIW 功能。起初,此合作仅包括一个 Xtensa DSP 的三个优化内核,而现已涵盖各种平台上的 50 多个内核,例如 HiFi 5、HiFi 4、HiFi 3z、Fusion F1 以及 P6 等 Vision DSPs,并包括卸载加速器(如有)的功能。

此外,我们还共同为所有针对 Cadence DSPs 进行过优化的代码添加了持续集成设置。其中包括的基础架构会对 TFLM 存储库的每个拉取请求进行测试,检测其是否通过 Tensilica 工具链的所有单元测试,该工具链具有各种 HiFix 和 Vision P6 内核。因此,我们会确保组合的 TFLM 和 NNLIB 开源软件不仅紧密集成,还具有良好的自动化测试覆盖率。

自动化测试覆盖率

https://github.com/tensorflow/tflite-micro/actions/workflows/xtensa.yml?query=event%3Aschedule

性能提升

最近,我们共同为使用 int16 激活函数量化的模型添加了优化设置。尤其是在音频领域,int16 激活函数对于量化生成式模型的质量至关重要。我们希望这些经过优化的内核能够支持一种新的 ML 驱动型的音频信号处理。下表所示为实现噪音抑制神经网络所需的几个算子。我们以噪音抑制神经网络 SEANet 为例,该网络中一个变体的循环计数提升了 267 倍。

使用 int16 激活函数量化

https://tensorflow.google.cn/lite/performance/post_training_integer_quant_16x8

SEANet

https://arxiv.org/abs/2008.02027

下表所示为经过优化的内核相比参考实现所取得的改进(使用 Xtensa 指令集模拟工具测量)。

算子

改进

Transpose Conv

458 倍

Conv2D

287 倍

Sub

39 倍

Add

24 倍

Leaky ReLU

18 倍

Srided_Slice

10 倍

Pad

6 倍

整个网络

267 倍

如何使用这些优化设置

所有代码均可通过 TFLite Micro GitHub 库来使用。

TFLite Micro

https://github.com/tensorflow/tflite-micro

要使用 HiFi 3z 定向 TFLM 优化设置,需满足以下条件:

已使用 int16 激活函数和 int8 权重对 TensorFlow Lite (TFLite) FlatBuffer 模型进行量化

该模型使用上表中列出的一个或多个算子

TFLM 使用 OPTIMIZED_KERNEL_DIR=xtensa 进行编译

例如,您可以使用参考 C++ 代码运行 Conv2D 内核集成测试:

make -f tensorflow/lite/micro/tools/make/Makefile TARGET=xtensa TARGET_ARCH=hifi4 XTENSA_CORE= test_integration_tests_seanet_conv

并通过添加 OPTIMIZED_KERNEL_DIR=xtensa,将其与经过优化的内核进行比较:

make -f tensorflow/lite/micro/tools/make/Makefile TARGET=xtensa TARGET_ARCH=hifi4 OPTIMIZED_KERNEL_DIR=xtensa XTENSA_CORE= test_integration_tests_seanet_conv

展望未来

虽然迄今为止的工作主要集中在卷积神经网络上,但 Google 和 Cadence 也在合作开发经过优化的 LSTM 算子,并已发布基于 LSTM 的关键字识别器的首个示例。我们希望在此基础上进行扩展,并继续为 Tensilica Xtensa DSPs 带来经过优化的生产级的 ML 领域最新实践。

首个示例

https://github.com/tensorflow/tflite-micro/tree/1c6b50ef8b9dac1bb31dfe79679aec781666a86b/third_party/xtensa/examples/micro_speech_lstm

致谢

衷心感谢以下同事,感谢他们为此番成功合作做出的贡献。

Cadence:Manjunath CP、Bhanu Prakash Bandaru Venkata、Anirban Mandal

Google:Advait Jain、Deiqang Chen、Lawrence Chan、Marco Tagliasacchi、Nat Jeffries、Nick Kreeger、Pete Warden、Rocky Rhodes、Ting Yan、Yunpeng Li、Victor Ungureanu

www.zeeklog.com  - 在 Cadence 音频数字信号处理器上加速 TensorFlow Lite Micro
www.zeeklog.com  - 在 Cadence 音频数字信号处理器上加速 TensorFlow Lite Micro
www.zeeklog.com  - 在 Cadence 音频数字信号处理器上加速 TensorFlow Lite Micro

Read more

Java虚拟机学习总结(3)——JDK内置工具(jps、jstack、jmap、jstat)使用详解

Java虚拟机学习总结(3)——JDK内置工具(jps、jstack、jmap、jstat)使用详解

一、JDK内置工具 - javap 1、 介绍 java 反编译工具,主要用于根据Java字节码文件反汇编为Java源代码文件。 2、命令 javap <options> <classes> 3、命令集 -help --help -? 输出此用法消息 -version 版本信息,其实是当前javap所在jdk的版本信息,不是class在哪个jdk下生成的。 -v -verbose 输出附加信息(包括行号、本地变量表,反汇编等详细信息) -l 输出行号和本地变量表 -public 仅显示公共类和成员 -protected 显示受保护的/公共类和成员 -package 显示程序包/受保护的/公共类 和成员 (默认) -p -private 显示所有类和成员

By Ne0inhk
Spring学习总结(29)——Spring异步处理@Async的使用以及原理、源码分析(@EnableAsync)

Spring学习总结(29)——Spring异步处理@Async的使用以及原理、源码分析(@EnableAsync)

在开发过程中,我们会遇到很多使用线程池的业务场景,例如异步短信通知、异步记录操作日志。大多数使用线程池的场景,就是会将一些可以进行异步操作的业务放在线程池中去完成。例如在生成订单的时候给用户发送短信,生成订单的结果不应该被发送短信的成功与否所左右,也就是说生成订单这个主操作是不依赖于发送短信这个操作,所以我们就可以把发送短信这个操作置为异步操作。那么本文就是来看看Spring中提供的优雅的异步处理方案:在Spring3中,Spring中引入了一个新的注解@Async,这个注解让我们在使用Spring完成异步操作变得非常方便。需要注意的是这些功能都是Spring Framework提供的,而非SpringBoot。因此下文的讲解都是基于Spring Framework的工程。Spring中用@Async注解标记的方法,称为异步方法,它会在调用方的当前线程之外的独立的线程中执行,其实就相当于我们自己new Thread(()-> System.out.println("hello world !"))这样在另一个线程中去执行相应的业务逻辑。 Demo // @Async 若把注解放在类

By Ne0inhk
Spring Boot学习总结(19)——使用Redisson实现分布式锁

Spring Boot学习总结(19)——使用Redisson实现分布式锁

一、什么是分布式? 要想说什么是分布式,那么首先要知道分布式之前的系统是什么样的架构,之前的架构又存在什么样的问题? 单体架构 分布式之前就是单体架构,单体架构顾名思义就是将所有的业务功能打包在一个应用中,然后部署在服务器上。如果我们把单体架构比作一个汽车工厂,那么从汽车发动机到汽车上的一个螺丝钉都需要由它来负责完成,如果有一天这家工厂由于自然灾害的原因导致业务量急剧下滑,甚至停止生产,那么这个整个工厂无论是造发动机的,还是造螺丝钉的全部都得停工。落实到互联网就是单体架构开发成本高、出现故障影响的范围大,很难适应现在的互联网项目。 分布式 既然单体架构不足以解决现在存在的高并发、高性能、高可用的要求,那么分布式就来了,原来我们把一个汽车所有的零件都放在一家工厂进行生产,结果会出现上面停工的情况,那么分布式怎么解决的?所谓分布式就是把所有的零件分开生产,每个工厂根据自己的特长来生产相应的汽车配件,最后统一组装,即使因为一些其他原因,导致某个工厂停止了生产,但是依旧不影响其他工厂的生产进度,我们可以通过小的代价来寻找其他工厂来代替停工的工厂,确保我们的生产任务可以正常的运转。

By Ne0inhk
Java虚拟机学习总结(4)—— JVM 性能调优常用参数详解

Java虚拟机学习总结(4)—— JVM 性能调优常用参数详解

前言 在JVM性能调优时有三个组件: 1. 堆大小调整(内存最够大的话,尽量搞大点) 2. 垃圾收集器调整 3. JIT 编译器(比较深,需要掌握源码才能更好的优化更加底层) 大多数调优选项都与调整堆大小和为您的情况选择最合适的垃圾收集器有关。JIT编译器对性能也有很大影响,但很少需要使用较新版本的JVM进行调优。通常,在调优Java应用程序时,重要是以下两个主要目标之一: * 响应性:应用程序或系统对请求的数据进行相应的速度,对于专注于响应性的应用程序,长的暂停时间是不可接受的,重点是在短时间内做出回应。 * 吞吐量:(批处理任务,大数据量任务)侧重于在特定时间段内最大化应用程序的工作量,对于专注于吞吐量的应用程序,高暂停时间是可接受的。由于高吞吐量应用程序在较长时间内专注于基准测试,因此不需要考虑响应时间。 注意:系统瓶颈核心还是在应用代码,一般情况下无需过多调优,JVM本身在不断优化。 一、verbose:gc 表示,启动jvm的时候,输出jvm里面的gc信息。格式如下: [Full GC 178K->99K(1984K), 0.

By Ne0inhk