最近在做一些工程部署和传统算法的工作,遇到写坑,写些解决办法记录一下:
很多时候我们会面临在一台机器上进行编译和打包,在另外一台机器或者集群上进行部署,而机器与机器之间的gpu设备是不同型号的情况,这个时候做深度学习推理的时候会出现初始化加载很慢的情况,或者有二次加载的情况,这篇小博文就是讲如何解决的.
由于CUDA的JIT Compile(即时编译)机制,是为了应对未来没发布的gpu硬件时也能顺滑的让程序在新的gpu上优化.因为任何在运行时的被cuda加载的PTX代码都被显卡的驱动程序进一步编译成设备相关的二进制可执行代码,这一过程被叫做即时编译just in time compile.这种即时编译导致应用程序在启动时产生一定的时间开销.
所以你会看到,在启动你的深度学习模型服务的时候,会先加载一次cuda库,然后模型在推理的时候,会二次加载一次cuda库,而这个二次加载导致初始化耗时长,也就是jit带来的问题啦
详细介绍和解决办法可以参考cuda jit处理办法
有两种办法解决,fat binary和jit缓存
本人用的是jit缓存方法,因为很方便...
实测,1080ti的显卡编译的程序在tesla t4上运行,加载时间能达到5分钟以上...
经过jit缓存后降低到8s初始化加载时间,当然第一次加载之后有了缓存后面多次请求推理的时间都是正常的.
具体怎么做呢,只要在你启动脚本上设置几个环境变量就好了
export CUDA_CACHE_MAXSIZE=2147483648 #最大可以设置为4294967296
export CUDA_CACHE_DISABLE=0
这些表示什么意思具体可以自己去查查
对了,记得编译tensorflow的时候在./configure的时候要对相对应的显卡的算力进行编译噢,比如1080ti算力是6.1, 而tesla T4 是7.5
这些是我在tensorflow1.14版本上的C++ API操作的,不知道2.x版本是否有过优化