在Docker容器之间共享原始内核缓存
我正在创建一个使用在Docker容器之间共享原始内核缓存,docker,cupy,Docker,Cupy,我正在创建一个使用cupy.RawKernal的python应用程序。应用程序使用NVIDIA容器工具包在docker容器中运行。我希望避免在每次创建新容器时(在开发过程中经常发生)重新编译cupy.RawKernal 我已按如下方式设置了卷装载: docker run--runtime=nvidia-v${HOME}/.cupy/kernel\u cache:/HOME/app/.cupy/kernel\u cache-d docker\u image 运行应用程序后,我看到.cubin文件位
cupy.RawKernal
的python应用程序。应用程序使用NVIDIA容器工具包在docker容器中运行。我希望避免在每次创建新容器时(在开发过程中经常发生)重新编译cupy.RawKernal
我已按如下方式设置了卷装载:
docker run--runtime=nvidia-v${HOME}/.cupy/kernel\u cache:/HOME/app/.cupy/kernel\u cache-d docker\u image
运行应用程序后,我看到.cubin
文件位于容器和主机上各自的位置。但是,当我重新创建容器时,它在第一次运行时启动仍然需要更长的时间。.cubin
文件也不会在主机或容器上更新
我的第一个想法是权限问题,我对主机文件夹授予了完全的R/W权限,但没有任何效果
有什么想法吗?谢谢 第二个缓存文件夹需要共享:
~/.nv/ComputeCache
有关更多信息,请参阅此链接:
JIT缓存
第二种减轻JIT开销的方法是缓存JIT编译生成的二进制文件。当设备驱动程序及时为应用程序编译PTXcode时,它会自动缓存生成的二进制代码的副本,以避免在以后调用应用程序时重复编译。当设备驱动程序升级时,称为计算缓存的缓存会自动失效,因此应用程序可以从设备驱动程序内置的即时编译器的改进中获益
环境变量可用于控制即时编译
- 将
设置为1将禁用缓存(不会向缓存中添加或检索二进制代码)。CUDA\u CACHE\u DISABLE
CUDA\u CACHE\u MAXSIZE
指定计算缓存的大小(以字节为单位);默认大小为256MiB(因为NVIDIA驱动程序之前发布了334、32mib),最大大小为4gib;不缓存大小超过缓存大小的二进制代码;旧的二进制代码将从缓存中逐出,以便在需要时为新的二进制代码腾出空间
CUDA\u CACHE\u PATH
指定计算缓存文件的目录位置;默认值为:
CUDA\u CACHE\u PATH
指定计算缓存文件的目录位置;默认值为:
%APPDATA\%NVIDIA\ComputeCache
$HOME/Library/Application Support/NVIDIA/ComputeCache
~/.nv/ComputeCache
CUDA\u FORCE\u PTX\u JIT
设置为1会强制设备驱动程序忽略应用程序中嵌入的任何二进制代码(请参见应用程序兼容性),而只是及时编译embeddedPTXcode。如果内核没有embeddedPTX代码,它将无法加载。您可以使用此环境变量来确认应用程序二进制文件是否包含PTXcode,以及实时编译是否按照预期工作,以保证与未来体系结构的前向兼容性在docker中运行时,
$HOME
在Python运行时是否等于/HOME/app
?如果没有,您可以尝试设置CUPY\u CACHE\u DIR=/home/app/.CUPY/kernel\u CACHE
,看看它是如何运行的。可能还有其他原因影响第一次运行的速度,所以我不能肯定这是由于内核缓存没有适当的时间。感谢您的建议,我已经跟踪到了第一次调用cupy库时的速度减慢<代码>cp.arange。第一次运行时,它会在容器和主机的缓存目录中生成一个cubin文件。当在一个新容器中运行时,这个调用需要相同的运行时间,这使我相信缓存没有被使用