深度学习的从业者们有福了。
经过4个多个月的迭代完善,腾讯开源的新一代跨平台深度学习推理框架TNN最近推出了v0.3版本,将跨平台支持的优势进一步放大,是业界首个同时支持移动端、桌面端、服务端的深度学习推理框架。
深度学习推理框架是什么?我们以大家都很熟悉的图像识别为例,先来看下深度学习的过程。
如果我们想要让机器能够识别照片上的物体,比如说一只猫,我们通常需要将大量关于猫的照片转换成数据,输入到神经网络中,通过激活神经网络的方法,来让机器学习带有猫的照片的特征,比如颜色、毛发、形状等等。
然后我们会得到一个具备识别猫的能力的算法模型,接下来,我们如何在现实的情况中也能让计算机识别出猫呢,这就需要深度学习推理框架,来将训练好的模型应用到现实中,最终,开发出专门识别猫的软件或者将其直接部署到手机等硬件中。
深度学习框架就好像一个连接器,一边是算法模型,一边是硬件,它主要解决两个问题👇
其一,是深度学习模型越来越大并且直接在硬件上部署难度较大,所以需要将训练出的模型通过推理框架来进行部署。
其二,是深度学习模型对算力需求巨大,在性能受限条件下进行业务部署同样面临巨大挑战。
这次隆重介绍的TNN,是腾讯深度学习与加速Oteam云帆的开源协同成果,由腾讯优图实验室主导,腾讯光影研究室、腾讯云架构平台部、腾讯数据平台部等多团队协同开发。
我们来看TNN的更多应用。
其实,我们常见的图像识别、语音识别、推荐引擎等深度学习应用,都离不开深度学习推理框架。比如,使用了TNN的机器文字识别和阅读理解算法:
上面的示例展示的是腾讯的一个OCR文字识别技术和机器阅读理解技术。
技术层面,采用的chineseocr lite模型,通过文本框位置检测+文本框角度检测+文字识别3个模型串联来进行中文文字识别。
BERT 阅读理解示例采用BERT-Squad10模型,展示了如何通过预先输入上下文以及词汇表来实现一个简单的问答系统。
此前,腾讯光影和腾讯光流团队的支持下,头发染色和人体姿态两个TNN示例在TNN中间
迭代的小版本中已经发布,并展现出不错的算法效果。
本次新发布的TNN0.3版本,有三个特点,即在通用性、易用性、性能方面也进一步提升,变得更加强大。
以下内容是专业读者特供,请享用。
一、 通用性
在保证模型统一、接口统一的前提下,依托于硬件厂商提供的加速框架基础算子支持,以及手写kernel优化的方式,对移动端、桌面端和服务端提供了多种不同加速选择,实现了对常用CV、NLP模型的优化适配。
1.1 硬件平台支持
TNN通过集成OpenVINO和TensorRT的方式新增了对服务端X86和NVIDIA硬件的支持,既能快速获取硬件厂商的最新优化成果,又能基于业务模型结构特点添加自定义实现达到性能极致。同时考虑到桌面端应用对安装包大小的限制,TNN通过JIT和手工优化的方式实现了轻量级的X86后端,整体库大小仅为5MB左右。
1.2 模型算子支持
TNN新版本在CV类模型的支持上扩展了对3D-CNN、LSTM、BERT等模型结构的支持,总算子数从88个增加到107个,新增算子包括LSTM、GridSample、Histogram、OneHot、BitShift、Gather、ScatterND、LayerNorm、GroupNorm、GELU、SoftSign、Erf等。
二、易用性
2.1 动态维度和预处理支持
TNN之前版本主要支持CV类模型,网络输入基本都是NCHW4个维度且每个维度上的值基本不变。而NLP场景下同一个网络会有0维到6维的情况,且每个维度上的值根据输入而变化。为此TNN新增了输入维度配置接口,在模型算子、硬件、系统支持等层面做了大量补充和完善。
API接口对Mat相关接口做了一定扩充,包括拷贝填充功能(CopyMakeBorder),方便SDK开发者进行网络预处理后处理加速。目前TNN已支持裁剪(Crop)、缩放(Resize)、颜色空间转换(CvtColor)、仿射变换(WarpAffine)和拷贝填充(CopyMakeBorder)等常见的预处理后处理操作。
2.2 运行时常量折叠
onnx模型导出模型时会产生很多粘合剂类的算子用于计算常量和数据Shape的信息,TNN实现了ConstFolder常量折叠功能来简化模型结构提升模型运行性能。相比开源社区工具onnx-simplifier,ConstFolder增加了对以ATen形式输出的算子的支持,同时支持运行时常量折叠以支持模型变维的需求。TNN运行时将变维计算部分的算子单独抽取出来用NAIVE(纯C++)执行,以减轻各个硬件device(ARM、Metal、OpenCL)的算子实现压力。
三、性能优化
3.1 移动端性能优化
Arm性能优化:
(1)armv8.2优化:fp16向量指令优化,相比于fp32预期性能翻倍,除了和大多数开源框架一样支持arm64之外,针对arm32架构也实现了fp16指令优化,让64位和32位APP
都能发挥硬件fp16向量加速的能力。
(2)int8优化:针对常用的算子block组合采取了更激进一些的融合策略,如conv+add+activation,能有效的减少量化反量化的开销以及内存读写,并且经内部业务验证,在提高性能的同时并不会造成精度的下降。
OpenCL性能优化:
(1)核心卷积优化:a. 访存性能优化:Channel Blocking优化、以及局部内存(localmemory)优化提升访存性能,实现工作组内的数据共享。b. 计算性能优化:winograd算法优化3x3卷积,寻址计算优化,相邻计算网格偏移量共用向量寄存器,降低fp32计算单元压力。
(2)工作组尺寸优化:优化计算策略,并通过Auto-Tuning挑选最优工作组尺寸。
(3)预处理/后处理优化: 使用buffer做参数缓存,降低GPU拷贝开销。
3.2 桌面端/服务端性能优化
TNN服务端通过集成OpenVINO和TensorRT的方式新增了对服务端X86和NVIDIA硬件的支持,既能快速获取硬件厂商的最新优化成果,又能基于业务模型结构特点添加自定义实现达到性能极致。与业界服务端统一框架onnxruntime性能最好版本相比,TNN当前在CV类模型有一定优势,而onnxruntime在NLP类模型有一定优势。TNN刚开始支持NLP模型,后续会在这块持续优化。
TNN桌面端为了兼顾高性能和硬件兼容性,同时考虑应用App 对安装包大小的限制,通过JIT和手工优化的方式实现了轻量级的X86后端,支持SSE41、SSE42、AVX、AVX2、FMA等指令集。相比onnxruntime服务端库80MB,TNN桌面端整体库大小仅为5MB左右,而性能差距在20%以内。
TNN的目标是做一个全平台支持的AI推理框架,在与合作伙伴的协同下会持续输出对各硬件平台(ARM、X86、NVIDIA等)的适配与优化。
让我们一起期待!
关注“鹅厂技术派”,回复TNN,直达开源地址!
—END—