AI部署之路 | 模型选型、本地部署、服务器部署、模型转换全栈打通!( 六 )


之后会总结一些常用的优化技巧在这里,先埋坑 。
合并、替换op算子
很多框架在导出的时候就会自动合并一些操作,比如torch.onnx在导出conv+bn的时候会将bn吸到前面的conv中,比较常见了 。
但也有一些可以合并的操作,假如框架代码还没有实现该则不会合并,不过我们也可以自己合并,这里需要经验了,需要我们熟知各种op的合并方式 。
可以自己合并一些操作,比如下图中的+Add+BN,是不常见的的,如果自己愿意的话,可以直接在ONNX中进行合并,把权重关系搞对就行 。
列举一些合并的例子,总之就是将多个op合成大op,节省计算量以及数据搬运的时间:
多路合并
既可以融合一些算子,当然也可以替换一些算子:
蒸馏、剪枝
剪枝和蒸馏都是模型层面的优化,如果是稀疏化剪枝则会涉及到硬件层面 。
剪枝的目的就是将在精度不变的前提下减少模型的一些层或者通道或者权重数量等等,甚至可以剪枝 。可以节省计算量并且减少模型的体积,对于大模型来说是很有用的,一般来说剪枝后的模型比未剪枝的同等size大小精度更高 。
具体的可以参考这篇:to prune or not to prunetheoffor model。
剪枝的方法可以看zomi总结的ppt(来自 ):
蒸馏可以使同结构的小模型精度提升接近大模型的精度 。
总结
剪枝类似于模型搜索,如果直接NAS的话,就没有必要剪枝了 。
参考量化
量化目前比较成熟,也有很好的教程(PPQ),很成熟的库(PPQ),新手入门建议直接看PPQ,跟着教程来大概就知道量化的很多细节了 。
要学习的知识点有:
但是需要注意,不是所有模型、所有op都适合量化:
注意点:
参考算子op优化
算子优化就是无底洞,没有尽头,要学习的东西也很多,之前我也简单深入地探索过这个领域,只不过也只是浅尝辄止,优化完就立马干其他活了 。这里也不班门弄斧了,涉及高性能计算的一些入门问题,可以看下这个的回答:
大部分优化op的场景,很多原因是原生op的实现可能不是最优的,有很大的优化空间 。
比如这个操作,原生的实现比较慢,于是就有了优化空间:
同理,很多CUDA实现的OP可能不是最优的,只有你有精力,就可以进行优化 。也要考虑是这个优化值不值,在整个模型中的占比大不大,投入产出比怎么样 。
对于CUDA还好些,资料很多,很多op网上都有开源的不错的实现(尤其是gemm),抄抄改改就可以了 。
不过对于一些没有CUDA那么火的平台或者语言,比如arm平台的neon或者npu,这些开源的算子实现少一些,大部分需要自己手写 。分析模型哪些op慢之后,手动优化一下 。
知乎上也有很多优化系列的教程,跟着一步一步来吧:
有几种可以自动生成op的框架:
调优可视化工具
可视化工具很重要,无论是可视化模型还是可视化模型的推理时间线 。可以省我们的很多时间,提升效率:
还要了解很多推理框架/AI编译器
本来这节的小标题是“还要会很多推理框架/AI编译器”,但感觉很不现实,人的精力有限,不可能都精通,选择自己喜欢的、对实际平台有相应提升的推理框架即可 。
这里总结了一些AI编译器:
ONNX
ONNX不多说了,搞部署避免不了的中间格式,重要性可想而知 。
Open(ONNX) is an openthatAItothe right tools as their. ONNXan openfor AI , both deepandML. Itangraph model, as well asof built-inanddata types.we focus on thefor().
需要了解ONNX模型机构组成,和的一些细节;能够根据要求修改ONNX模型;能够转换ONNX模型;同时也需要知道、了解ONNX的一些坑 。