NVIDIA-docker容器内部调用GPU加速

docker本身不支持GPU加速,但是在AIPlanner运行环境下需要GPU加速支持运行。
这时候就出现了 NVIDIA-docker ,docker一般都是使用基于CPU的应用,而如果是GPU的话,就需要安装特有的硬件环境,比如需要安装nvidia driver。所以docker容器并不直接支持Nvidia GPU。为了解决这个问题,最早的处理办法是在容器内部,全部重新安装nvidia driver,然后通过设置相应的设备参数来启动container,然而这种办法是很脆弱的。因为宿主机的driver的版本必须完全匹配容器内的driver版本,这样导致docker image无法共享,很可能本地机器的不一致导致每台机器都需要去重复操作,这很大的违背了docker的设计之初。
为了使docker image能很便利的使用Nvidia GPU,从而产生了nvidia-docker,由它来制作nvidia driver的image,这就要求在目标机器上启动container时,确保字符设备以及驱动文件已经被挂载。
nvidia-docker-plugin是一个docker plugin,被用来帮助我们轻松部署container到GPU混合的环境下。类似一个守护进程,发现宿主机驱动文件以及GPU 设备,并且将这些挂载到来自docker守护进程的请求中。以此来支持docker GPU的使用。

必要环境:

docker
由于nvidia docker是基于docker基础之上运行的,因此需要安装原生的docker。

nvidia显卡驱动(见底部)
毫无疑问,要想使用GPU,必须要安装显卡驱动,这样nvidia docker才能正常运行。

安装步骤:

# If you have nvidia-docker 1.0 installed: we need to remove it and all existing GPU containers  
docker volume ls -q -f driver=nvidia-docker | xargs -r -I{} -n1 docker ps -q -a -f volume={} | xargs -r docker rm -f  
sudo apt-get purge -y nvidia-docker  
  
# Add the package repositories  
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | \  
  sudo apt-key add -  
curl -s -L https://nvidia.github.io/nvidia-docker/ubuntu16.04/amd64/nvidia-docker.list | \  
  sudo tee /etc/apt/sources.list.d/nvidia-docker.list  
sudo apt-get update  
  
# Install nvidia-docker2 and reload the Docker daemon configuration  
sudo apt-get install -y nvidia-docker2  
sudo pkill -SIGHUP dockerd  
  
# Test nvidia-smi with the latest official CUDA image  
docker run --runtime=nvidia --rm nvidia/cuda nvidia-smi 

但是nvdia-docker的安装依赖于docker-ce或者docker-ee,所以必须先满足依赖条件,而且对docker-ce和docker-ee也有版本的要求。

# If you have nvidia-docker 1.0 installed: we need to remove it and all existing GPU containers  
docker volume ls -q -f driver=nvidia-docker | xargs -r -I{} -n1 docker ps -q -a -f volume={} | xargs -r docker rm -f  
sudo apt-get purge -y nvidia-docker  
  
# Add the package repositories  
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | \  
  sudo apt-key add -  
curl -s -L https://nvidia.github.io/nvidia-docker/ubuntu16.04/amd64/nvidia-docker.list | \  
  sudo tee /etc/apt/sources.list.d/nvidia-docker.list  
sudo apt-get update  
  
# Install nvidia-docker2 and reload the Docker daemon configuration  
sudo apt-get install -y nvidia-docker2  
sudo pkill -SIGHUP dockerd  
  
# Test nvidia-smi with the latest official CUDA image  
docker run --runtime=nvidia --rm nvidia/cuda nvidia-smi  

当我们执行nvidia-docker create或者nvidia-docker run 时,它会默认加上--runtime=nvidia参数。将运行时指定为nvidia。
当然,为了方便使用,可以直接修改Docker daemon的启动参数,修改默认的运行时为nvidia-container-runtime
docker的daemon文件中加入---运行时---

cat /etc/docker/daemon.json
{     "default-runtime": "nvidia",     "runtimes": {         "nvidia": {             "path": "/usr/bin/nvidia-container-runtime",             "runtimeArgs": []         }     } }

通过以下方式启动容器

docker run --rm -it -e NVIDIA_VISIBLE_DEVICES=all ubuntu:18.04
FHGLNZJEyCc4XfAO__thumbnail.png

然后要安装cuda、cudnn加速。

附NVIDIA驱动及cuda、cudnn安装教程

安装nvidia驱动(optinal)
1) cd Downloads/

2) ls
#(NVIDIA-Linux-x86_64–410.57.run #output of ls)

3) chmod +x NVIDIA-Linux-x86_64–410.57.run
#(to get permission to execute the run file)

4) sudo ./NVIDIA-Linux-x86_64–410.57.run --no-x-check

安装cuda
1 chmod +x cuda_10.0.130_410.48_linux.run
2 ./cuda_10.0.130_410.48_linux.run

是否同意条款,必须同意才能继续安装)
accept/decline/quit: accept

(这里不要安装驱动,因为已经安装最新的驱动了,否则可能会安装旧版本的显卡驱动,导致重复登录的情况)
Install NVIDIA Accelerated Graphics Driver for Linux-x86_64 410.48?
(y)es/(n)o/(q)uit: n

Install the CUDA 10.0 Toolkit?(是否安装CUDA 10 ,这里必须要安装)
(y)es/(n)o/(q)uit: y

Enter Toolkit Location(安装路径,使用默认,直接回车就行)
 [ default is /usr/local/cuda-10.0 ]:  

Do you want to install a symbolic link at /usr/local/cuda?(同意创建软链接)
(y)es/(n)o/(q)uit: y

Install the CUDA 10.0 Samples?(不用安装测试,本身就有了)
(y)es/(n)o/(q)uit: n

Installing the CUDA Toolkit in /usr/local/cuda-10.0 ...(开始安装)

安装完成之后,可以配置他们的环境变量,在vim ~/.bashrc的最后加上以下配置信息:

export CUDA_HOME=/usr/local/cuda-10.0
export LD_LIBRARY_PATH=${CUDA_HOME}/lib64
export PATH=${CUDA_HOME}/bin:${PATH}
1
2
3
最后使用命令source ~/.bashrc使它生效。

可以使用命令nvcc -V查看安装的版本信息:

test@test:~$ nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2018 NVIDIA Corporation
Built on Sat_Aug_25_21:08:01_CDT_2018
Cuda compilation tools, release 10.0, V10.0.130

安装cudnn

tar -zxvf cudnn-10.0-linux-x64-v7.4.2.24.tgz 

解压之后可以得到以下文件:

cuda/include/cudnn.h
cuda/NVIDIA_SLA_cuDNN_Support.txt
cuda/lib64/libcudnn.so
cuda/lib64/libcudnn.so.7
cuda/lib64/libcudnn.so.7.4.2
cuda/lib64/libcudnn_static.a

使用以下两条命令复制这些文件到CUDA目录下:

sudo cp cuda/lib64/* /usr/local/cuda-10.0/lib64/
sudo cp cuda/include/* /usr/local/cuda-10.0/include/

拷贝完成之后,可以使用以下命令查看CUDNN的版本信息:

cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2

你可能感兴趣的:(NVIDIA-docker容器内部调用GPU加速)