Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ch08 add input filtering #406

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 19 additions & 1 deletion chapter_model_deployment/model_inference.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,24 @@

- 手动拉宽预测范围:回归模型往往预测不出很大或很小的值,结果都集中在中部区域。例如医院的化验数据,通常是要根据异常值诊断疾病。手动拉宽预测范围,将偏离正常范围的值乘一个系数,可以放大两侧的数据,得到更准确的预测结果。

### 输入过滤
:label:`ch08-sec-input-filtering`

在实际系统里的模型推理过程中,尤其是数据流上的推理,往往存在大量的「冗余」输入。这里的冗余性通常包含两种情况:

- 推理结果无意义。例如相册分类应用可能会在一张宠物狗的照片上运行人脸识别模型,这一推理计算不会产生有意义的结果,因此视为冗余的输入;
- 推理结果有意义但可重用。例如在摄像头拍摄的视频流上运行车辆计数模型,则当没有车辆驶入/出拍摄范围时,相邻帧之间的计数结果不会发生变化,即后续帧可以重用之前的推理结果。我们将这种可重用之前的推理结果的输入也视为冗余。

下图给出了两种冗余输入的例子:

![两类冗余输入示例](../img/ch08/redundancy.png)
:width:`500px`
:label:`ch08-fig-parallel`

针对第一类冗余,现在较为通用的做法是训练轻量化的神经网络作为过滤器,以原始数据为输入,输出为该数据为冗余的置信度。在样本数据上运行后端推理模型,通过预定的规则(例如检测结果为空或分类置信度小于 0.6)为样本标注是否冗余,基于二元分类器的有监督训练方法对过滤器进行训练。完成训练后,在推理阶段先使用过滤器预测输入的冗余分数,通过设定的阈值决定是否将该输入传给后端推理模型,提高推理效率。

针对第二类冗余,通常做法是对输入数据进行特征嵌入(例如图片低级特征或深度特征),并维护一个「特征嵌入-推理结果」的表作为缓存。新的输入到达时,先计算其特征嵌入,再基于聚类算法(例如 K 近邻)从缓存中得到可重用的推理结果。需要注意的是,传统的缓存通过精确匹配能够很自然地判断是否命中,而基于聚类算法的近似匹配则需要额外的设计,现在较为通用的方法是计算聚类结果的同质性分数,以预先设定的阈值判断缓存是否命中。

### 并行计算
:label:`ch08-sec-parallel_inference`

Expand Down Expand Up @@ -169,4 +187,4 @@ Winograd算法的整个计算过程在逻辑上可以分为4步,如 :numref:`c

针对任意的输出大小,要使用F(2x2,3x3)的Winograd算法,需要将输出切分成2x2的块,找到对应的输入,按照上述的四个步骤,就可以求出对应的输出值。当然,Winograd算法并不局限于求解F(2x2,3x3),针对任意的F(m\*m,r\*r),都可以找到适当的常量矩阵A、B、G,通过间接计算的方式减少乘法次数。但是随着m、r的增大,输入、输出涉及的加法以及常量权重的乘法次数都在增加,那么乘法次数带来的计算量下降会被加法和常量乘法所抵消。因此,在实际使用场景中,还需要根据Winograd的实际收益来选择。

本小节主要介绍了模型推理时的数据处理和性能优化手段。选择合适的数据处理方法,可以更好地提取输入特征,处理输出结果。并行计算以及算子级别的硬件指令与算法优化可以最大限度的发挥硬件的算力。除此之后,内存的占用及访问速率也是影响推理性能的重要因素,因此推理时需要设计合理的内存复用策略,关于内存复用的策略我们在编译器后端章节已经做了阐述。
本小节主要介绍了模型推理时的数据处理和性能优化手段。选择合适的数据处理方法,可以更好地提取输入特征,处理输出结果。跳过部分输入和重用缓存的推理结果,能够提高推理的资源使用效率。并行计算以及算子级别的硬件指令与算法优化可以最大限度的发挥硬件的算力。除此之后,内存的占用及访问速率也是影响推理性能的重要因素,因此推理时需要设计合理的内存复用策略,关于内存复用的策略我们在编译器后端章节已经做了阐述。
Binary file added img/ch08/redundancy.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.