nvidia-docker
最古老的容器内nvidia gpu
的调用是需要在镜像(或容器)中安装与宿主机nvidia显卡驱动兼容的驱动版本,但是这一要求比较难以满足,因为如果宿主机的nvidia驱动略低于docker容器下nvidia驱动版本就很容易出现forward compatibility错误,而比较可行的就是容器内的nvidia驱动版本略低于宿主机版本。
正是因为最早的nvidia-docker
这个难以保证宿主机和容器的nvidia驱动版本匹配,因此现在的nvidia-docker使用的方案是在制作docker镜像时不安装nvidia driver和cuda,而是在nvidia-docker容器启动时自动把宿主机中的nvidia driver
和cuda
映射给容器,对应的nvidia-docker
启动容器时附加参数为--runtime=nvidia --gpus all
。
但是有一些人对这个原理并不是很了解,因此在制作镜像的时候依旧会把nvidia driver
和cuda
打包进去。由于wsl下对物理机的nvidia显卡是使用模拟的方式,这时的wsl中使用的nvidia驱动其实是wsl-nvidia-driver
,也正是由于该驱动的一些特性导致在wsl
中如果使用nvidia-docker
启动自身带有nvidia driver
和cuda
的容器就会在启动时报错。
其报错的故障具体点为wsl
使用nvidia-docker
启动容器时在自动创建/usr/lib/x86_64-linux-gnu/libnvidia-ml.so.1
文件和/usr/lib/x86_64-linux-gnu/libcuda.so.1
文件时会判断镜像中是否有相同的文件,如果有则报错,也就是本文开头说提的报错信息,而在ubuntu物理机上使用nvidia-docker
首次启动容器时即使镜像中存在/usr/lib/x86_64-linux-gnu/libnvidia-ml.so.1
文件和/usr/lib/x86_64-linux-gnu/libcuda.so.1
文件也会对其进行强制覆盖(强制映射)(该种覆盖并不会影响容器的保存,比如在使用docker commit时对应的文件依旧是原镜像中的文件,而不是nvidia-docker
映射给的宿主机中对应的文件)。
发表评论