在 Docker 容器之间共享原始内核缓存

问题描述

我正在创建一个使用 cupy.RawKernal 的 Python 应用程序。该应用程序使用 NVIDIA Container Toolkit 在 docker 容器中运行。我想避免每次创建新容器时都重新编译 cupy.RawKernal(在开发中经常发生)。

我已经像这样设置了卷安装:

docker run --runtime=nvidia -v ${HOME}/.cupy/kernel_cache:/home/app/.cupy/kernel_cache -d docker_image

运行应用程序后,我在容器和主机上的各自位置看到 .cubin 文件。但是,当我重新创建容器时,它在第一次运行时仍然需要更长的时间才能启动。 .cubin 文件也不会在主机或容器上更新。

我的第一个想法是权限问题,我已经对主机文件夹授予了完整的 R/W 权限,但没有任何效果

有什么想法吗?谢谢!

解决方法

原来还有第二个缓存文件夹需要共享:

~/.nv/ComputeCache

有关更多信息,请参阅此链接: https://developer.nvidia.com/blog/cuda-pro-tip-understand-fat-binaries-jit-caching/

JIT 缓存

第二种减轻 JIT 开销的方法是缓存 JIT 编译生成的二进制文件。当设备驱动程序为应用程序实时编译 PTX 代码时,它会自动缓存生成的二进制代码的副本,以避免在以后的应用程序调用中重复编译。缓存(称为计算缓存)会在设备驱动程序升级时自动失效,因此应用程序可以从设备驱动程序中内置的即时编译器的改进中受益。 >

环境变量可用于控制实时编译。

  • CUDA_CACHE_DISABLE 设置为 1 会禁用缓存(不会向缓存中添加或检索二进制代码)。
  • CUDA_CACHE_MAXSIZE 指定计算缓存的大小(以字节为单位);默认大小为 256 MiB(自 NVIDIA 驱动程序发布 334 以来,之前为 32 MiB),最大大小为 4 GiB;超过缓存大小的二进制代码不缓存;如果需要,旧的二进制代码将从缓存中逐出,以便为新的二进制代码腾出空间。
  • CUDA_CACHE_PATH 指定计算缓存文件的目录位置;默认值为:
  • CUDA_CACHE_PATH 指定计算缓存文件的目录位置;默认值为:
  • 在 Windows 上,%APPDATA\%NVIDIA\ComputeCache
  • 在 MacOS 上,$HOME/Library/Application Support/NVIDIA/ComputeCache
  • 在 Linux 上,~/.nv/ComputeCache
  • CUDA_FORCE_PTX_JIT 设置为 1 会强制设备驱动程序忽略应用程序中嵌入的任何二进制代码(请参阅应用程序兼容性)并改为即时编译嵌入的 PTX 代码。如果内核没有嵌入 PTX 代码,它将无法加载。您可以使用此环境变量来确认应用二进制文件是否包含 PTX 代码,以及即时编译是否按预期工作以保证与未来架构的向前兼容性。