极智AI | 从部署的角度看bn和in算子

本文涉及的产品
视觉智能开放平台,分割抠图1万点
视觉智能开放平台,图像资源包5000点
视觉智能开放平台,视频资源包5000点
简介: 本文介绍一下从部署角度来看 bn 和 in 的实现与对比。

本文介绍一下从部署角度来看 bn 和 in 的实现与对比。

做深度学习的同学应该都接触过残差网络 (Resnet) 这个经典且实用的网络,一般有 resnet18、resnet34、resnet50、resnet101、resnet152,其主要区别是 ResidualBlock 的多少。resnet 创新的提出了残差块结构,里面的恒等映射既不会引入额外的计算参数又有利于信息的传导,它最开始证明了网络能够向更深的方向发展,能够解决网络退化问题。resnet 的残差块结构如下:

对于检测、识别任务来说,resnet 是一个非常不错的 backbone,能够十分有效的帮你提取到特征,后面再接 neck、head 就能组成完整的网络。介绍 resnet 是因为这里要说的 bn、in 的实现是嵌在 resnet 里的,接下来回到主题,来说一下 bn 和 in。


1、谈谈 bn

bn 全称是 batch normalization,是通过标准化让数据分布在线性区间,加大了梯度,让模型更大胆的进行梯度下降,可以解决因网络深度加深而导致梯度弥散问题,并且由于破坏了原来的数据分布,可以一定程度上解决过拟合问题。

batch normalization 的原理是这样的,如下图,bn 是整个 batch 每一张图的同一个通道一起做 normalization 操作,通俗点就是把每个通道 C 的 NHW 单独拿出来做归一化处理。

整个 bn 算子的计算过程数学表达如下:

前面提到的 resnet 里面有许多的 conv + bn + activation 的结构,这个结构对于做算法加速的人来说应该十分敏感了,一看到就想把它们揉在一块做算子融合。以最经典的 conv + bn 融合为例,数学原理上是这样的:

conv 层:

bn 层:

进行融合,把 conv 代入 bn:

融合后成了一个大卷积,相当于:

到这里其实比较关键了,有想过为什么要做算子融合吗,直观上考虑,算子融合能减少算子数量、减少算子间通信与中间存储,从而达到算法加速的目的。这当然没问题,不过对于 conv + bn 的融合来说,最实质的提升在于:由于 bn 的 mean 和 var 是离线计算好的,所以 conv + bn 融合后的大卷积里的 w_new 和 b_new 完全可以提前计算好,这相当于什么呢,就是原先我需要做一次卷积 (矩阵乘,tensorcore / cube 等矩阵运算单元) 和 一次 bn (点乘,vector 矢量计算单元),融合后我就把 矢量计算单元的运算 咔擦掉了,同时将两次计算降为1次,你想想是不是性能提升会非常多。


2、谈谈 in

in 全称是 instance normalization,适用于图像风格迁移,因为图像生成的结果主要依赖于单个图像,所以像 bn 那样对整个 batch 归一化并不适合,在风格迁移中使用 in 来做归一化不仅能够加速模型收敛,还可以保持每个图像实例之间的独立性。

instance normalization 的原理是这样的,如下图,in 是单张图片的单个通道单独做 normalization 操作,通俗点就是把每个 HW 单独拿出来做归一化处理,不受 通道 和 batchsize 的影响。

整个 in 算子的计算过程数学表达如下:

其中,

  • t:表示图片的 index;
  • i:表示 feature map 的 index;

既然 in 主要用于风格迁移领域,那么跟我们的检测 / 识别或其他领域有毛线关系呢?让我们来看一下下面的网络结构和一组数据你就清楚了。如下是 IBN 结构 和 前面提到的 resnet 中残差结构的对比图,可以看到 IBN-a 的做法是将 feature map 对半切,一半走 in,一半走 bn,形成 bn 和 in 并联结构;而 IBN-b 是在残差后 relu 激活前加入一个 in,形成 bn 和 in 串联结构。

来看一组实验数据:

对于分类问题来说,如下,IBN-a 和 IBN-b 相比 resnet50 具有更好的效果。

对于分割来说,训练集和测试集来自同一个数据的时候,IBN-a 模型的 mIoU 是能够比原模型 resnet50 高 4 个点。而训练集和测试集不同的时候,IBN-b 模型更占优势,说明 IBN-b 能够在跨域的问题上表现更好。

关于 IBN,做一些小结:

(1)IBN-a 适用于 当前域 和 目标域 一致的问题,比如说需提升 resnet50 的分类能力时,可以用 IBN-a;

(2)IBN-b 适合使用在 当前域 和 目标域 不一致的问题,比如说在行人重识别中,经常涉及跨域场景,这也是为何 IBN-Net 在行人重识别领域用的非常多的原因;

以上,现在有一些网络针对不同的应用场景,开始使用带 IBN 结构的 backbone,来提高 backbone 在特定场景的特征提取能力,所以我们对 in 算子的部署也需要有所研究。


3、谈谈部署中的 bn 和 in

从部署的角度来看 bn 和 in,其实前面 bn 那一块对 bn 的部署已经进行了一些介绍了,包括 conv + bn 的融合,以及为什么融合能加速。这里再谈谈 in 相对于 bn 在部署的时候有啥区别。

in 最开始用于图像风格迁移,对于风格生成来说,单图独立性和动态性就比较重要,这导致 in 的 均值 mean 和 方差 var 往往是在推理时在线计算的,其实在 pytorch 的 nn.InstanceNorm2d() 算子中有参数可以在训练时把 均值 和 方差 进行离线保存。这个时候我们先来看一下,对于部署来说 bn 需要四个权重,分别是 mean、var、scale 和 bias,相应的 in 也是需要这四个权重,当然两者计算过程不一样。回到前面说的,如果训练时我把 in 的 mean 和 var 进行离线保存,然后我像 bn 一样做一波融合操作,有了离线的四个权重我就可以提前算好融合后大卷积的 new_scale 和 new_bias,然后进 tensorcore 或 cube 矩阵运算单元 计算一下,岂不是完美,加速妥妥的,这样看 in 和 bn 在部署上也没啥区别...

问题来了,我们实验验证,在我们的场景中,in 采用 均值 和 方差 离线存储模式得到的模型精度相比 推理在线计算降了老多...这样的话,我们就必须在线计算 in 的 均值 和 方差了,这样即使你能做算子融合,融合后的 new_scale 和 new_bias 里的 mean 和 var 也是需要动态计算的,这个时候其实是将原来 conv + in 需要四次计算 (conv 1次 + mean 1次 + var 1次 + in 1 次) 减少到了三次计算 (mean 1次 + var 1次 + conv 1 次),是会有性能提升,但是相比于 conv + bn 融合后的 一次计算来说还差很多。

我之前有用 tvm 的 te 模块实现过 bn 和 in 算子,我把我写的计算部分拿出来给大家看一看。

bn_compute 部分如下,可以看到关键部分其实只有一个 out = te.compute...

in_compute 部分如下,我这里是把 mean 和 var 的计算过程拆开来写的,其实也可以把 in_compute... 里面的注释打开,这样相当于把 mean 、 var 和 in 的计算写到了一起,但是不管怎么样,整体的 in 计算过程都是有三个 te.compute... 的。

以上给出了 tvm compute 部分,其实 op schedule 也是一样,in 相比 bn 会多出对 mean 和 var 计算调度的过程。

小结一下,从部署的角度来看 bn 和 in 算子,如果 in 算子的 mean 和 var 是训练时离线存储的,那么 in 和 bn 在部署和推理效率上是差不多的;如果 in 算子的 mean 和 var 是推理时在线计算的,那么 in 会比 bn 效率低,这样的 in 其实对于部署不是很友好。


好了,收工~ 欢迎讨论~


logo_show.gif


相关文章
|
20天前
|
人工智能 并行计算 安全
从零到一,打造专属AI王国!大模型私有化部署全攻略,手把手教你搭建、优化与安全设置
【10月更文挑战第24天】本文详细介绍从零开始的大模型私有化部署流程,涵盖需求分析、环境搭建、模型准备、模型部署、性能优化和安全设置六个关键步骤,并提供相应的示例代码,确保企业能够高效、安全地将大型AI模型部署在本地或私有云上。
176 7
|
20天前
|
人工智能 安全 网络安全
揭秘!大模型私有化部署的全方位安全攻略与优化秘籍,让你的AI项目稳如磐石,数据安全无忧!
【10月更文挑战第24天】本文探讨了大模型私有化部署的安全性考量与优化策略,涵盖数据安全、防火墙配置、性能优化、容器化部署、模型更新和数据备份等方面,提供了实用的示例代码,旨在为企业提供全面的技术参考。
58 6
|
1月前
|
人工智能 C语言 Windows
Ollama部署在线ai聊天
本文介绍了如何在Windows系统上安装和部署AI聊天模型Ollama,包括安装步骤、模型安装、运行模型项目,以及使用Ollama生成C语言平衡二叉树的完整代码。
74 2
Ollama部署在线ai聊天
|
24天前
|
人工智能 数据安全/隐私保护 UED
RAG让AI大模型更懂业务解决方案部署使用体验
根据指导文档,部署过程得到了详细步骤说明的支持,包括环境配置、依赖安装及代码示例,确保了部署顺利进行。建议优化知识库问题汇总,增加部署失败案例参考,以提升用户体验。整体解决方案阅读与部署体验良好,有助于大型语言模型在特定业务场景的应用,未来可加强行业适应性和用户隐私保护。
62 5
|
21天前
|
人工智能 分布式计算 数据可视化
大模型私有化部署全攻略:硬件需求、数据隐私、可解释性与维护成本挑战及解决方案详解,附示例代码助你轻松实现企业内部AI应用
【10月更文挑战第23天】随着人工智能技术的发展,企业越来越关注大模型的私有化部署。本文详细探讨了硬件资源需求、数据隐私保护、模型可解释性、模型更新和维护等方面的挑战及解决方案,并提供了示例代码,帮助企业高效、安全地实现大模型的内部部署。
47 1
|
21天前
|
人工智能 分布式计算 数据可视化
大模型私有化部署全攻略:硬件需求、数据隐私、可解释性与维护成本挑战及解决方案详解,附示例代码助你轻松实现企业内部AI应用
【10月更文挑战第23天】随着人工智能技术的发展,大模型在各领域的应用日益广泛。然而,将其私有化部署到企业内部面临诸多挑战,如硬件资源需求高、数据隐私保护、模型可解释性差、更新维护成本高等。本文探讨了这些挑战,并提出了优化硬件配置、数据加密、可视化工具、自动化更新机制等解决方案,帮助企业顺利实现大模型的私有化部署。
52 1
|
26天前
|
Serverless 数据安全/隐私保护 前端开发
大模型代码能力体验报告之贪吃蛇小游戏《一》:Claude.ai篇 - 生成、预览和快速部署的serverless一条龙
本文介绍了通过Claude.ai生成并优化Web版贪吃蛇游戏的过程,展示了其强大的代码生成功能及用户友好的界面设计。从初始版本的快速生成到根据用户反馈调整游戏速度,再到提供多种实用工具如文件管理、版本控制和一键部署,Claude.ai不仅是一个代码助手,更像是一个全面的serverless开发平台。文中还呼吁国内厂商关注此类技术的发展。
|
1月前
|
人工智能 弹性计算 自然语言处理
《触手可及,函数计算玩转 AI 大模型》解决方案体验与部署评测
在AI技术快速发展的背景下,大模型正推动各行业的智能化转型。企业为抓住机遇,纷纷寻求部署AI大模型以满足特定业务需求。阿里云函数计算凭借按量付费、卓越弹性和快速交付等优势,为企业提供了高效、安全的AI大模型部署方案。本文将详细介绍阿里云函数计算的技术解决方案及其在文生文、图像生成和语音生成等领域的应用实例,展示其在降低成本、提高效率和增强灵活性方面的显著优势。
|
1月前
|
人工智能 自然语言处理 搜索推荐
【通义】AI视界|微软Copilot Studio推出新功能,帮助企业更便捷地构建和部署AI代理
本文介绍了近期科技领域的五大重要动态:马斯克旗下xAI发布首个API,苹果内部研究显示ChatGPT比Siri准确率高25%,微软Copilot Studio推出新功能,霍尼韦尔与谷歌合作引入Gemini AI,浑水创始人建议买入科技七巨头股票。更多资讯请访问【通义】。
|
1月前
|
人工智能 Docker 容器
一、轻松部署的大模型开发平台dify.ai
一、轻松部署的大模型开发平台dify.ai
101 0

热门文章

最新文章