极智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


相关文章
|
1月前
|
人工智能 并行计算 安全
从零到一,打造专属AI王国!大模型私有化部署全攻略,手把手教你搭建、优化与安全设置
【10月更文挑战第24天】本文详细介绍从零开始的大模型私有化部署流程,涵盖需求分析、环境搭建、模型准备、模型部署、性能优化和安全设置六个关键步骤,并提供相应的示例代码,确保企业能够高效、安全地将大型AI模型部署在本地或私有云上。
515 7
|
13天前
|
人工智能 Java Serverless
阿里云函数计算助力AI大模型快速部署
随着人工智能技术的快速发展,AI大模型已经成为企业数字化转型的重要工具。然而,对于许多业务人员、开发者以及企业来说,探索和利用AI大模型仍然面临诸多挑战。业务人员可能缺乏编程技能,难以快速上手AI模型;开发者可能受限于GPU资源,无法高效构建和部署AI应用;企业则希望简化技术门槛,以更低的成本和更高的效率利用AI大模型。
68 12
|
11天前
|
人工智能 缓存 异构计算
云原生AI加速生成式人工智能应用的部署构建
本文探讨了云原生技术背景下,尤其是Kubernetes和容器技术的发展,对模型推理服务带来的挑战与优化策略。文中详细介绍了Knative的弹性扩展机制,包括HPA和CronHPA,以及针对传统弹性扩展“滞后”问题提出的AHPA(高级弹性预测)。此外,文章重点介绍了Fluid项目,它通过分布式缓存优化了模型加载的I/O操作,显著缩短了推理服务的冷启动时间,特别是在处理大规模并发请求时表现出色。通过实际案例,展示了Fluid在vLLM和Qwen模型推理中的应用效果,证明了其在提高模型推理效率和响应速度方面的优势。
云原生AI加速生成式人工智能应用的部署构建
|
14天前
|
机器学习/深度学习 存储 人工智能
【AI系统】训练后量化与部署
本文详细介绍了训练后量化技术,涵盖动态和静态量化方法,旨在将模型权重和激活从浮点数转换为整数,以优化模型大小和推理速度。通过KL散度等校准方法和量化粒度控制,文章探讨了如何平衡模型精度与性能,同时提供了端侧量化推理部署的具体实现步骤和技术技巧。
40 1
【AI系统】训练后量化与部署
|
19天前
|
人工智能 监控 Serverless
《主动式智能导购AI助手构建》解决方案部署测评
在数字化时代,智能导购AI助手已成为提升客户体验和销售效率的重要工具。本文将基于个人体验,对《主动式智能导购AI助手构建》解决方案的部署过程进行详细评测。
38 3
|
5天前
|
人工智能 API Windows
免费部署本地AI大语言模型聊天系统:Chatbox AI + 马斯克grok2.0大模型(简单5步实现,免费且比GPT4.0更好用)
本文介绍了如何部署本地AI大语言模型聊天系统,使用Chatbox AI客户端应用和Grok-beta大模型。通过获取API密钥、下载并安装Chatbox AI、配置模型,最终实现高效、智能的聊天体验。Grok 2大模型由马斯克X-AI发布,支持超长文本上下文理解,免费且易于使用。
33 0
|
1月前
|
人工智能 安全 网络安全
揭秘!大模型私有化部署的全方位安全攻略与优化秘籍,让你的AI项目稳如磐石,数据安全无忧!
【10月更文挑战第24天】本文探讨了大模型私有化部署的安全性考量与优化策略,涵盖数据安全、防火墙配置、性能优化、容器化部署、模型更新和数据备份等方面,提供了实用的示例代码,旨在为企业提供全面的技术参考。
99 6
|
2月前
|
人工智能 数据安全/隐私保护 UED
RAG让AI大模型更懂业务解决方案部署使用体验
根据指导文档,部署过程得到了详细步骤说明的支持,包括环境配置、依赖安装及代码示例,确保了部署顺利进行。建议优化知识库问题汇总,增加部署失败案例参考,以提升用户体验。整体解决方案阅读与部署体验良好,有助于大型语言模型在特定业务场景的应用,未来可加强行业适应性和用户隐私保护。
73 5
|
1月前
|
人工智能 分布式计算 数据可视化
大模型私有化部署全攻略:硬件需求、数据隐私、可解释性与维护成本挑战及解决方案详解,附示例代码助你轻松实现企业内部AI应用
【10月更文挑战第23天】随着人工智能技术的发展,企业越来越关注大模型的私有化部署。本文详细探讨了硬件资源需求、数据隐私保护、模型可解释性、模型更新和维护等方面的挑战及解决方案,并提供了示例代码,帮助企业高效、安全地实现大模型的内部部署。
121 1
|
1月前
|
人工智能 分布式计算 数据可视化
大模型私有化部署全攻略:硬件需求、数据隐私、可解释性与维护成本挑战及解决方案详解,附示例代码助你轻松实现企业内部AI应用
【10月更文挑战第23天】随着人工智能技术的发展,大模型在各领域的应用日益广泛。然而,将其私有化部署到企业内部面临诸多挑战,如硬件资源需求高、数据隐私保护、模型可解释性差、更新维护成本高等。本文探讨了这些挑战,并提出了优化硬件配置、数据加密、可视化工具、自动化更新机制等解决方案,帮助企业顺利实现大模型的私有化部署。
109 1

热门文章

最新文章

下一篇
DataWorks