Docker镜像中CUDA失效需宿主机执行sudo apt upgrade修复的原因咨询
这个问题其实和Docker容器与宿主机的GPU依赖关系密切,我来拆解几个最可能的原因:
宿主机NVIDIA驱动与容器CUDA版本的兼容性修复
Docker容器里的CUDA runtime是依赖宿主机的NVIDIA驱动工作的,两者需要保持一定的版本兼容范围。你用的是CUDA 11.7,宿主机旧版本的驱动可能存在和这个版本CUDA兼容的小bug,sudo apt upgrade会把NVIDIA驱动更新到适配的版本,修复了容器内CUDA调用的故障。而直接在宿主机用CUDA时,旧驱动可能勉强能运行,但容器的隔离环境会放大这种兼容性问题,只有重新构建镜像时才会触发。Docker或GPU容器运行时组件的更新
apt upgrade不仅会更新系统组件,还可能更新Docker本身或者nvidia-docker2这类负责GPU容器调度的工具。旧版本的这些工具可能存在bug,比如重新创建镜像后无法正确挂载GPU设备、或者无法传递CUDA相关的环境变量/库路径,升级后这些bug被修复,容器就能正常调用CUDA了。宿主机内核或系统依赖库的修复
Ubuntu的系统升级会更新内核以及和GPU通信相关的内核模块、系统库。旧的内核模块可能在容器访问GPU时存在权限或通信问题,升级后这些内核级的兼容性问题被解决,容器内的CUDA才能正常工作。镜像构建时的依赖缓存变化
重新创建镜像时,Docker可能会拉取nvidia/cuda:11.7.1-devel-ubuntu22.04基础镜像的最新层,这些新层可能依赖宿主机更新后的系统组件才能正常运行。宿主机未升级时,无法满足这些隐藏的依赖,导致CUDA失效;升级后依赖满足,问题就解决了。
备注:内容来源于stack exchange,提问作者mon

