昇思MindSpore Lite 1.5版本我们主要在异构推理、混合精度推理、端侧训练和混合比特权重量化等特性进行了重点优化,在推理性能、模型小型化和端侧训练易用性与性能等方面带来新的体验。下面就带大家快速浏览这些关键特性。
01
多硬件异构推理
如何在有限的端侧硬件资源上获得最优推理性能是端侧AI推理框架的主要目标之一。而异构设备混合计算就能够充分利用CPU、GPU、NPU等异构硬件资源,充分利用资源的算力与内存,从而达到端侧推理的极致性能。
本次我们在1.5版本中支持了多硬件异构推理的能力。用户可以设置对外开放的mindspore::Context使能不同后端异构硬件,包括CPU、GPU、NPU。并且用户可以根据需要设置各个硬件的优先级。实现了Mindspore Lite在多种异构硬件上的灵活部署,和高性能推理。
根据用户选择进行算子异构部署
早期版本Mindspore Lite只支持CPU+的模式,只能支持CPU与NPU或者CPU与GPU的异构执行,并且无法选择异构硬件的优先级。当前最新版本的多硬件异构推理特性,给了用户更多的异构硬件选择,增加了易用性,对异构硬件上的推理更加友好。
多硬件异构推理特性使用的资料请参考:
/lite/docs/zh-CN/r1.5/use/runtime_cpp.html#id3
02
混合精度推理
我们经常发现用户在使用float16对模型进行推理的时候出现精度误差过大的问题,其原因可能是部分数据较小,使用float16能表达的精度较低导致误差过大,也可能是因为部分数据过大超出了float16的表达范围。
针对这类问题,我们在最新版本中提供了混合精度推理特性支持。用户可以指定模型中具体算子的推理精度,目前可选的精度有float32、float16两种。该特性可以解决部分模型无法整网使用float16进行推理的问题,用户可以将模型中因为数据原因导致的使用float16推理精度误差的部分算子,转为使用float32进行推理,从而确保整网推理精度。这样可以在使用高性能float16算子的基础上,保证了模型的推理精度提高。
混合精度推理特性使用的资料请参考:
/lite/docs/zh-CN/r1.5/use/runtime_cpp.html#id13
03
端侧混合精度训练
为了在确保训练精度的前提下尽可能地提升端侧训练性能,我们在1.5版本中支持了端侧混合精度训练特性,实现了包括1)支持将fp32模型在线转成fp16混合精度模型,以及2)直接无缝运行MindSpore导出混合精度模型两种方案。
第一种方案,可以根据传入的traincfg实现自动混合精度,并提供了不同优化级别(O0不改变算子类型,O2将算子转成fp16模型,batchnorm和loss保持fp32,O3在O2基础上将batchnorm和loss转成fp16),也支持配置fp16算子自定义配置手动混合精度方案,提供了性能和精度之间的选择,更具灵活性。其计算流程如下:
可参考相关API:
/lite/api/zh-CN/r1.5/api_cpp/mindspore.html#traincfg
第二种方案,支持将MindSpore导出的混合精度模型导出后在端侧直接进行增量训练,相比fp32训练内存、耗时均有明显提升,平均提升20-40%。
04
端侧训练支持resize
由于端侧内存限制原因,训练的模型batch不能过大,因此需要对输入模型的batch进行可配置,因此我们在这个版本中支持了将训练模型resize的能力。我们为训练算子增加了resize接口,同时在框架增加支持了训练内存的动态分配。使用resize接口只需要传入resize input shape。
可参考相关API:
/lite/api/zh-CN/r1.5/api_cpp/mindspore.html#resize
05
端侧训练支持在线和离线融合
端侧训练大部分是finetune模型,其中大部分层都会被冻结,权重参数不会在训练过程中改变,因此可以通过在离线阶段对这些冻结层进行相关的融合优化来提升训练性能。我们通过分析模型节点的连接关系,实现了对冻结层进行动态识别融合优化点的方案,从而使训练性能得到提升显著。我们通过对Effnet网络训练进行试验,从结果看耗时可以节省约40%,训练内存开销降低30%。
同时我们支持在训练结束后,在端侧训练结束导出推理模型时进行在线融合,无需额外进行离线优化,用户可以直接使用此模型进行在线推理,由于复用了离线融合pass,动态库仅增加76k,保证了端侧训练库的轻量性。
06
混合比特权重量化
针对模型大小有严格要求的场景,权重量化(weight quantization)无需数据集,即可直接将权重数据从浮点型映射到低比特的定点数据,方便模型的传输和存储。而传统的权重模型量化方法都是将整个模型的权重值都固定量化到某个特定的比特位,例如8比特量化是将Float32的浮点数映射到Int8的定点数,理论上模型可达到4倍压缩,但是这种方法存在一个问题:高比特的量化能保证高精度,但需要更大的存储空间占用;而低比特的存储空间占用更小,但会存在更大的精度损失。
MindSpore Lite在1.5版本中支持了混合比特权重量化,根据神经网络的数据分布情况,自动搜索出最适合当前层的量化比特位,能够有效在压缩率和精度之间达到细粒度的trade-off,实现对模型的高效压缩。
由于神经网络不同层对量化损失的敏感度不同,可以将损失敏感度较低的层用更低的比特位表示,而对损失敏感度较高的层用更高的比特位表示。MindSpore Lite的混合比特量化采用均方误差作为优化目标,自动搜索出最适合当前层的scale值。
针对量化后的模型,同时采用有限状态熵(Finite State Entropy, FSE)对量化后的权重数据进行熵编码,可以进一步获得更大倍率的压缩,最高可达50+倍。
具体功能使用请参考:
/lite/docs/zh-CN/r1.5/use/post_training_quantization.html#id9
MindSpore官方资料
GitHub :/mindspore-ai/mindspore
Gitee :https : ///mindspore/mindspore
官方QQ群 :871543426
如果觉得《技术干货|昇思MindSpore Lite1.5 特性发布 带来全新端侧AI体验》对你有帮助,请点赞、收藏,并留下你的观点哦!