欢迎关注我的公众号 [极智视界],获取我的更多经验分享
大家好,我是极智视界,本文来介绍一下 算法部署中需要注意的Lazy Loading。
邀您加入我的知识星球「极智视界」,星球内有超多好玩的项目实战源码下载,链接:t.zsxq.com/0aiNxERDq
Lazy Loading 也即 "懒加载",做前端 web 的同学可能会对这个概念熟悉一些,前端中的一些懒加载比如在长网页中延迟加载图像 或 其他资源,可以减少服务器的负载,而是在当要用到的时候再加载,可以减少无效资源的加载,可以明显降低服务器的压力和流量。
同样的道理放到算法部署或者说算力芯片场景,可能也会涉及 Lazy Loading 的策略优化,比如 CUDA 编程中就会涉及 Lazy Loading 的概念。既然 CUDA 有,那么这样的策略也会直接辐射到英伟达系列的 GPU 硬件部署上,体现的现象就是,比如用 TensorRT 进行模型推理的时候,第一次推理耗时明显过长,后续马上平稳,这不是一个渐变的过程,而是一个突变的过程。口说无凭,下面是我在英伟达平台上用 TensorRT 推理一个 bs=32 的模型的耗时数据,可以看到第一次推理是 584.812ms,后面马上突变到 174ms 的样子。可以很好的想象,可以在初始化的时候 "懒",所以在第一次推理的 584ms 中很大一部分时间都是在做 kernels 的 loading。
需要明确的是虽然上面在用 TensorRT 做推理,但是 Lazy Loading 并不是 TensorRT 层面的概念,也不是 GPU 硬件层面的概念,它是 CUDA 层面的概念。在 CUDA 编程中有关于 Lazy Loading 的介绍,如下:
Lazy Loading delays loading of CUDA modules and kernels from program initalization closer to kernels execution. If a program does not use every single kernel it has included, then some kernels will be loaded unneccesarily. This is very common, especially if you include any libraries. Most of the time, programs only use a small amount of kernels from libraries they include.
Thanks to Lazy Loading, programs are able to only load kernels they are actually going to use, saving time on initialization. This reduces memory overhead, both on GPU memory and host memory
大致的意思是不要认为在 Modules 初始化的时候,所有需要用到的 kernels 都也预加载了,实际不是这样的,而是要用到它们的时候再去加载。所以等到第一次推理的时候,该用到的 kernels 才都会加载进去,这个时候很大的时间开销都会在 kernels 的加载上,而到了第二次,一切都已就绪。
之因为 Lazy Loading 是 CUDA 层面的概念,所以在我们的以对标 CUDA 生态构建的国产 AI 芯片,也会存在同样的特性,比如天数智芯、比如登临。在这些 CUDA 生态的卡上做算法性能验证,最好在前面做一个 CUDA Warm-up,或者直接点,忽略第一次推理的性能,看第二次后稳定的推理性能,后面的是靠谱的。
抱着好奇的心态,我也在昇腾的 Atlas300 推理卡和算能的 SC7 推理卡上进行了 Lazy Loading 的测试,为什么要把这两张卡单独拎出来呢?主要还是因为它们都不是 CUDA 生态的,昇腾是自家 NPU,算能是自家 TPU。
先来看昇腾的,我测试了循环 1 次和循环 20 取平均的推理性能数据,如下,(请忽略不同卡之间的推理性能对比,因为我可能跑的是不同模型~),可以看到两者几乎一致,所以基本可以说明昇腾的第一次推理就是实际推理耗时,并没有 Lazy Loading 策略。
接着来看算能的,测试迭代条件和昇腾的一致,数据如下,算能的结论基本是和昇腾的一样的。
其实需要提一句的是,昇腾和算能我只是从测试数据现象反推,结论不一定准确,这一块如果有比较专业的同学看到,也可以指正。
好了,以上分享了 算法部署中需要注意的Lazy Loading,希望我的分享能对你的学习有一点帮助。
【公众号传送】
畅享人工智能的科技魅力,让好玩的AI项目不难玩。邀请您加入我的知识星球, 星球内我精心整备了大量好玩的AI项目,皆以工程源码形式开放使用,涵盖人脸、检测、分割、多模态、AIGC、自动驾驶、工业等。不敢说会对你学习有所帮助,但一定非常好玩,并持续更新更加有趣的项目。 t.zsxq.com/0aiNxERDq