初次接触nvidia-docker相关的内容,记录部署的步骤和尝试过程。

一、安装nvidia-docker并测试

1、首先安装docker和nvidia-doker;
2、vim /etc/docker/daemon.json,添加代红框中的字段,这是为了在执行docker命令时默认使用nvidia-docker;修改好之后启动docker和nvidia-docker服务。
使用nvidia-docker创建gpu支持深度学习环境的容器

3、nvcc -V查看cuda版本,使用docker pull拉取对应cuda版本的镜像;
使用nvidia-docker创建gpu支持深度学习环境的容器
我这里是:docker pull nvidia/cuda:10.0-base
使用nvidia-docker创建gpu支持深度学习环境的容器
4、创建一个基于cuda镜像的容器,测试nvidia-smi
docker run --runtime=nvidia --rm nvidia/cuda:10.0-base nvidia-smi
使用nvidia-docker创建gpu支持深度学习环境的容器

二、拉取镜像,创建容器

2.1 使用conda基础镜像的尝试(供参考,可无需尝试此步骤)

我的初始想法是如果可以基于conda的基础镜像创建容器,我就可以使用docker cp命令将服务器上现成的环境拷贝过去了。以后每次要发布服务时,只需要把代码和环境一起拷贝过去,就不用在安装其他的东西。
经过实践发现拉取、镜像创建容器确实没有问题,容器内也确实可以访问gpu显卡。然而,python使用tensorflow和pytorch的时候无法使用gpu。最后,查明原因是conda的基本镜像内没有cuda相关的库,还是需要自己去安装cuda+cudnn。这样太麻烦了,失去了使用nvidia-docker的初衷了。

以下是我基于anaconda创建容器的过程:
(1)docker pull continuumio/anaconda3 拉取anaconda3的基本镜像
使用nvidia-docker创建gpu支持深度学习环境的容器
(2)基于anconda基本镜像创建一个容器,通过这个步骤了解用命令创建一个容器的方法;
docker run -it --runtime=nvidia --name=tensorflow_gpu -p 8888:8888 --gpus all continuumio/anaconda3

其中,–runtime指定nvidia,理论上在daemon配置里面指定了docker的runtime后,命令里面可以不加,我这里还是加上了;-p 8888:8888是主机端口到容器端口的映射;tensorflow_gpu是我创建的容器的名称;–gpus参数控制可以用那些gpu,注意一定要指定该参数,否则创建的容器没法使用gpu,这里创建的容器可使用全部gpu,你也可以通过ID指定;continuumio/anaconda3是容器依赖的基本镜像。

(3)创建好之后,会自动进入容器的bash交互界面,你可以输入nvidia-smi查看gpu信息。使用按键Ctrl+D可以退出交互界面;

Tips.
在容器外面: 若要停止容器运行,使用 docker stop 命令。 若你想删除创建的容器,使用docker rm 命令。
使用如下命令,重新启动容器并进入容器的交互界面:
docker start tensorflow_gpu
docker attach tensorflow_gpu

(5)新建一个session或者退出容器的bash交互界面后,使用docker cp命令可以将文件(当然也可以是项目、conda的虚拟环境)拷贝到容器中

这里我将conda中一个安装有TensorFlow+keras+gpu的环境移植到容器中:
docker cp /root/anaconda3/envs/cyc_work tensorflow_gpu:/opt/conda/envs

其中,/root/anaconda3/envs/cyc_work是主机中虚拟环境路径,可以再**待移植环境后使用whereis conda查询;tensorflow_gpu是我创建的容器名称,/opt/conda/envs是容器中conda环境的路径。
完成拷贝后,可以重新进入容器的bash交互界面,使用conda env list查看,你会发现主机中的虚拟环境已经成功移植过来:
使用nvidia-docker创建gpu支持深度学习环境的容器

Tips. 因为是拷贝的虚拟环境,每次进入容器后手动source activate 很麻烦,可以修改~/.bashrc文件中的最后一行配置,修改conda默认启动环境。

至此,已经成功实现将conda的虚拟环境移植到docker容器中,使用这个方法可以轻松地将不同的环境移植到不同的容器。然而,在docker环境中无法使用cuda。如果你愿意的话,可以在容器中自行安装cuda+cudnn+cublas等依赖库,然后将它发布成自己的镜像供以后使用。由于我的网络环境不好,所以没有这样做。

2.2 拉取cuda支持的深度学习镜像

主流深度学习框架维护了他们的镜像仓库,里面有很多版本通过tags标明,可以选择自己需要的版本拉取。基于这些镜像创建的容器可以省去很多安装依赖库的过程,特别是cuda+cudnn等安装起来很麻烦的库。
TnensorflowPyTorch都维护了他们的镜像仓库,可以去挑选和主机cuda版本兼容的镜像。

Tips: 选择镜像的镜像版本应该是要和宿主机的cuda+cudnn版本配套兼容的,tensorflow在网上可以找到版本对应关系,pytorch镜像的tag有cuda版本信息,可以利用filter搜索。

例如,我用如下命令拉取了一个 tf 镜像,并创建一个tensorflow_gpu的容器:
docker pull tensorflow/tensorflow:1.14.0-gpu-py3
docker run -it --runtime=nvidia --name=tensorflow_gpu --gpus all tensorflow/tensorflow:1.14.0-gpu-py3

进入容器后,测试tensorflow,成功加载cuda等依赖库,gpu支持:
使用nvidia-docker创建gpu支持深度学习环境的容器

2.1 踩坑收获

Nvidia-docker解决了能否使用gpu的问题,可以访问宿主机的显卡以及显卡驱动等,但是并不支持直接访问libcublas, libcudnn等库,这些需要在镜像里面安装。 所以,如果想要创建cuda的容器,有两个选择:(1)如果你想要干净的环境DIY,那么基于nvidia/cuda镜像创建容器,逐步安装你需要的东西,而后发布成镜像供以后自己使用; (2) 直接拉取现成的深度学习框架镜像创建的容器,这样后续基本只要pip安装一没有的东西就可以使用了。

三、镜像发布和保存

1、将容器发布成镜像,镜像名称设置成my_tf_keras_gpu
docker commit tensorflow_gpu my_tf_keras_gpu

2、将镜像保存成tar文件
docker save my_tf_keras_gpu -o my_tf_keras_gpu.tar

3、这个tar文件可以拷贝到其他服务器(或推理平台),然后使用下面的命令加载镜像:
docker load -i conda_tf_keras.tar

相关文章:

  • 2021-10-28
  • 2021-08-24
  • 2021-07-14
  • 2021-05-25
  • 2021-09-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-05-15
  • 2021-12-21
  • 2022-12-23
  • 2021-06-22
  • 2021-11-15
  • 2021-08-29
相关资源
相似解决方案