将PaddleDevice.Mkldnn()
的ctor参数cacheCapacity
默认值从10降低到1
#46
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
如下图表所示,针对完全不同的图片(但每次执行时的顺序相同)依次
PaddleOCRAll.Run()
时如果在ctorPaddleOCRAll
时使用了PaddleDevice.Mkldnn()
的ctor并对其提供不同的cacheCapacity
(即对PaddleConfig.MkldnnCacheCapacity
的赋值,其又是在调用paddleinfer的PD_ConfigSetMkldnnCacheCapacity()
)ctor参数值(默认值10),那么持续运行下来的内存占用完全不同:并且值得注意的是在设为0时几乎必定会触发#44 中所述的
'dnnl:error' could not execute a primitive
导致无法长时间运行下去,而使用默认值10时或许可以继续让内存增长并在达峰后稳定下来,但我没有足够的内存和耐心去等待结果回顾paddle文档:
https://github.com/PaddlePaddle/docs/blob/63362b7443c77a324f58a045bcc8d03bb59637fa/docs/design/mkldnn/caching/caching.md?plain=1#L70
机翻:
机翻:
可得paddle的这一套仅用于mkldnn环境的缓存机制是为了缓解(在paddleocr的语境下)针对不同输入图片时需要对每图片创建mkldnn对象的耗时,这也解释了为什么如果一直输入完全相同的图片集,那不论
MkldnnCacheCapacity
是多少内存占用都是十分稳定的尽管缓存的本意是为了提升性能然而从上图表中可见
cap=10
时的耗时反而比cap=1
更久,这可能是由于运行环境系统内存不足导致页都被swap所以反而拖累了整体性能而
机翻:
进一步证明了paddleinfer中
PD_ConfigSetMkldnnCacheCapacity()
函数的文档错误描述了0值时的行为https://github.com/PaddlePaddle/Paddle/blob/040f8aa50191b81313237e39d510dfb7b531cda9/paddle/fluid/inference/capi_exp/pd_config.h#L553
(以及复制粘贴进本库中的)
PaddleSharp/src/Sdcb.PaddleInference/Native/PaddleNative.g.cs
Line 325 in 5687fb0
PaddleSharp/src/Sdcb.PaddleInference/PaddleConfig.cs
Line 194 in 5687fb0
实际上由于paddle没有提供有关api目前根本没有办法能完全关闭这个缓存机制,而将其设为0反而是完全阻止了对缓存的定期清理导致只要继续输入不同的图片内存就必然会无限增长下去
因此本pr将这其在
PaddleDevice.Mkldnn()
的ctor的默认值从10降低到1以尽可能缓解这种容易被用户视作内存溢出(#17 #27 #37 )的缓存行为(也就是使内存更快达峰然后稳定下来)并在
ocr.md
文档中指出这个保守的默认值并建议运行环境有足够内存的用户考虑增加此值