docker︱在nvidia-docker中使用tensorflow-gpu/jupyter

docker小白…
搭建基础:宿主机已经有CUDA8.0

进出快捷键:

  • ctrl+d 退出容器且关闭, docker ps 查看无
  • ctrl+p+q 退出容器但不关闭, docker ps 查看有
  • 使用docker restart命令重启容器
  • 使用docker attach命令进入容器


一、安装

参考:Docker Compose + GPU + TensorFlow = ❤️

Docker版本分为CE(community edution)和EE(enterprise edition)。
所以不能盲目安装

yum install docker

安装docker

curl -sSL https://get.docker.com/ | sh

阿里云的公网:

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

当然,一般来说,这么curl会比较慢,也可以参考:docs.docker
阿里云服务器上安装和测试docker 版本比较旧了)

# 安装版本库
sudo yum install -y yum-utils
  
sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo


sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

开启docker

sudo systemctl start docker

NVIDIA Container Toolkit安装
参考: container-toolkit

在进行这一步之前,确保Nvidia驱动已经安装成功,docker也已经安装成功。注意:宿主机上并不需要安装CUDA!

Nvidia docker的名字先后经历了如下三个时代:

  • Nvidia docker 1.0
  • Nvidia docker 2.0
  • NVIDIA Container Toolkit

所以有时候你在看文档时会感觉到混淆,1.0已经不用考虑了,NVIDIA Container Toolkit和Nvidia docker 2.0在文档的某些上下文中是等价的。按照https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html#docker 文档,nvidia docker 安装步骤如下:

distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
   && curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.repo | sudo tee /etc/yum.repos.d/nvidia-container-toolkit.repo

sudo yum clean expire-cache
sudo yum install -y nvidia-container-toolkit
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker

通过以下命令来检验是否成功:

sudo docker run --rm --runtime=nvidia --gpus all nvidia/cuda:11.6.2-base-ubuntu20.04 nvidia-smi

就会出现:

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 450.51.06    Driver Version: 450.51.06    CUDA Version: 11.0     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  Tesla T4            On   | 00000000:00:1E.0 Off |                    0 |
| N/A   34C    P8     9W /  70W |      0MiB / 15109MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+
  • 执行的时候可能会报错:
no package nvidia-container-toolkit available

如果没有成功加载distribution,就会出现这个报错

Error: unsupported CUDA version: driver 8.0 < image 9.0.176 

所以需要指定一下版本:

nvidia-docker run --rm nvidia/cuda:8.0-devel nvidia-smi
  • 可能报错二:
docker: Error response from daemon: create nvidia_driver_367.48: create nvidia_driver_367.48: Error looking up volume plugin nvidia-docker: legacy plugin: plugin not found.
See 'docker run --help'.

使用下面命令查看nvidia-docker 是否启动

systemctl status nvidia-docker

可能报错三:

docker: Error response from daemon: create nvidia_driver_390.30: create nvidia_driver_390.30: Error looking up volume plugin nvidia-docker: legacy plugin: plugin not found.

或者:

docker: Error response from daemon: create nvidia_driver_390.30: found reference to volume 'nvidia_driver_390.30' in driver 'nvidia-docker', but got an error while checking the driver: error while checking if volume "nvidia_driver_390.30" exists in driver "nvidia-docker": Post http://%2Fvar%2Flib%2Fnvidia-docker%2Fnvidia-docker.sock/VolumeDriver.Get: dial unix /var/lib/nvidia-docker/nvidia-docker.sock: connect: connection refused: volume name must be unique.
See 'docker run --help'.

需要重启nvidia-docker服务:

systemctl start nvidia-docker 
systemctl status nvidia-docker

网上说的:start nvidia-docker 是错误的!

如果服务器在阿里云,可以参考:Docker CE 镜像源站

Ubuntu 14.04 16.04 (使用apt-get进行安装)

# step 1: 安装必要的一些系统工具
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
# step 2: 安装GPG证书
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# Step 3: 写入软件源信息
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# Step 4: 更新并安装 Docker-CE
sudo apt-get -y update
sudo apt-get -y install docker-ce

注意:其他注意事项在下面的注释中
# 安装指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# apt-cache madison docker-ce
#   docker-ce | 17.03.1~ce-0~ubuntu-xenial | http://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages
#   docker-ce | 17.03.0~ce-0~ubuntu-xenial | http://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages
# Step 2: 安装指定版本的Docker-CE: (VERSION 例如上面的 17.03.1~ce-0~ubuntu-xenial)
# sudo apt-get -y install docker-ce=[VERSION]

# 通过经典网络、VPC网络内网安装时,用以下命令替换Step 2、Step 3中的命令
# 经典网络:
# curl -fsSL http://mirrors.aliyuncs.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyuncs.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# VPC网络:
# curl -fsSL http://mirrors.cloud.aliyuncs.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# sudo add-apt-repository "deb [arch=amd64] http://mirrors.cloud.aliyuncs.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"

CentOS 7 (使用yum进行安装)

# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3: 更新并安装 Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce
# Step 4: 开启Docker服务
sudo service docker start

注意:其他注意事项在下面的注释中
# 官方软件源默认启用了最新的软件,您可以通过编辑软件源的方式获取各个版本的软件包。例如官方并没有将测试版本的软件源置为可用,你可以通过以下方式开启。同理可以开启各种测试版本等。
# vim /etc/yum.repos.d/docker-ce.repo
#   将 [docker-ce-test] 下方的 enabled=0 修改为 enabled=1
#
# 安装指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# yum list docker-ce.x86_64 --showduplicates | sort -r
#   Loading mirror speeds from cached hostfile
#   Loaded plugins: branch, fastestmirror, langpacks
#   docker-ce.x86_64            17.03.1.ce-1.el7.centos            docker-ce-stable
#   docker-ce.x86_64            17.03.1.ce-1.el7.centos            @docker-ce-stable
#   docker-ce.x86_64            17.03.0.ce-1.el7.centos            docker-ce-stable
#   Available Packages
# Step2 : 安装指定版本的Docker-CE: (VERSION 例如上面的 17.03.0.ce.1-1.el7.centos)
# sudo yum -y install docker-ce-[VERSION]
# 注意:在某些版本之后,docker-ce安装出现了其他依赖包,如果安装失败的话请关注错误信息。例如 docker-ce 17.03 之后,需要先安装 docker-ce-selinux。
# yum list docker-ce-selinux- --showduplicates | sort -r
# sudo yum -y install docker-ce-selinux-[VERSION]

# 通过经典网络、VPC网络内网安装时,用以下命令替换Step 2中的命令
# 经典网络:
# sudo yum-config-manager --add-repo http://mirrors.aliyuncs.com/docker-ce/linux/centos/docker-ce.repo
# VPC网络:
# sudo yum-config-manager --add-repo http://mirrors.could.aliyuncs.com/docker-ce/linux/centos/docker-ce.repo

安装校验

root@iZbp12adskpuoxodbkqzjfZ:$ docker version
Client:
 Version:      17.03.0-ce
 API version:  1.26
 Go version:   go1.7.5
 Git commit:   3a232c8
 Built:        Tue Feb 28 07:52:04 2017
 OS/Arch:      linux/amd64

Server:
 Version:      17.03.0-ce
 API version:  1.26 (minimum version 1.12)
 Go version:   go1.7.5
 Git commit:   3a232c8
 Built:        Tue Feb 28 07:52:04 2017
 OS/Arch:      linux/amd64
 Experimental: false

.


二、nvidia-smi的使用

1、拉取镜像、开启容器

当一台机器有很多个GPU可以通过NV_GPU来指定,
通过-v将宿主机下的/data1/matt/docker文件夹与docker之中的/mnt共享文件
matt/docker是容器名称

NV_GPU=1 nvidia-docker run -v /matt/docker:/mnt $container --rm -ti matt/docker bash

tensorflow官网有个镜像拉取方式:

sudo docker run -it --rm $DEVICES -v /usr/lib64/nvidia/:/usr/local/nvidia/lib64 tensorflow/tensorflow:latest-gpu bash

有一个nvidia关于CUDA8的镜像:

sudo nvidia-docker run --rm -ti nvidia/cuda:8.0 bash

从docker hub上拉取镜像:

docker pull mattzheng/docker_gpu

最简单的启动:

nvidia-docker run --rm -ti <镜像名字>
docker attach <容器名字>  # 已打开的容器

.

2.上传容器与创建镜像

创建镜像,容器名字叫device-query

nvidia-docker build -t device-query

上传容器到docker hub之上,
(1)先得在网站注册:https://hub.docker.com/
(2)在terminal,中键入docker login输入账号与密码,就与Hub联通了

sudo docker push mattzheng/device-query

.

3.容器与镜像删减

镜像操作

docker images #查看有哪些镜像
docker rmi image_id #删除镜像ID或者名称都可以

容器操作

docker ps -a  # 容器参考
docker container ls # 参考容器
docker rm container_id #删除容器 

容器停止:

docker ps -a | grep <container-id>
docker stop <container-id>

有时候很难删除镜像:

# 第一种
Error response from daemon: conflict: unable to delete e4b9e4f71238 (must be forced) - image is being used by stopped container 1e359ad4363d
# 第二种
Error response from daemon: conflict: unable to delete 1dc4f730b414 (cannot be forced) - image has dependent child images

第一种代表有依赖的容器,需要根据容器名称,docker rm进行删除。
第二种,因为有child,需要删除依赖的image,可以根据tag来进行删除,

docker rm REPOSITORY:TAG    # 根据TAG删除容器

.
4.容器改名

sudo nvidia-docker tag tensorflow/tensorflow:latest-gpu matt/nvidia-docker

把这个容器tensorflow/tensorflow:latest-gpu,改成名字matt/nvidia-docker
.

5.容器的保存

如何对容器进行保存防止退出后全部修改消失

  • (1)预先获取docker ps -l的容器ID
  • (2)然后从新复制一个新的容器:
docker commit 1610c46c28bd matt/test

docker commit -m="has update" -a="matt" fc4bd61a4af2 matt/docker:5.2

冒号之后是tag名称,可以继续更新,需要注意,关闭之前,需要apt-get update

.
6.在tensorflow容器中打开Jupyter notebook

官方:https://hub.docker.com/r/tensorflow/tensorflow/

nvidia-docker run -it -p 8888:8888 tensorflow/tensorflow:latest-gpu

然后就可以用http://localhost:8888/ 打开该jupyter。
但是如果是,宿主机是远程Linux服务器,你想在远程调用服务器中docker的Jupyter notebook。因为会跟宿主机的IP起冲突,所以需要指定以下IP,在重启的时候:

sudo nvidia-docker run -it -p 7777:8888 mattzheng/docker_gpu_1

也就是把docker中的8888端口,赋值到宿主机的7777端口,这样不会与其他冲突。
其中,第一次打开输入的密码,是toke之后的内容,本图中的为:
0375ddd82c0417e55dddf4d3bf7f9dcba9530e89391a6163

这里写图片描述

打开容器之后就可以启动了:

jupyter notebook --allow-root

或者要在Jupyter中同时使用Py2 py3的话,可以参考

pip2 install ipython notebook
pip3 install ipython notebook
ipython2 kernelspec install-self
ipython3 kernelspec install-self 

就可以使用了,重启后,会出现pip3/pip2

主题换色(参考:https://github.com/dunovank/jupyter-themes):

安装主题包:

!pip install --upgrade jupyterthemes
# 用 solarized-light 主题,代码字体是 inputmono,字号 12 点,界面字体 sourcesans,输出字体 sourcesans,开启工具栏,开启标题栏
!jt -t solarized-light -f inputmono -fs 12 -nf sourcesans -tf sourcesans -T -N

执行后重新打开即可。参考模板型号:

Available Themes: 
   chesterish
   grade3
   gruvboxd
   gruvboxl
   monokai
   oceans16
   onedork
   solarizedd
   solarizedl
延伸一:如果修改Jupyter notebook密码

可以参考 :Running a notebook server在服务器上执行:jupyter notebook --generate-config
记录下生成的配置文件位置,例如:/home/.jupyter/jupyter_notebook_config.py
打开jupyter,新建一个notebook,生成密码的sha1秘钥,代码如下:

from notebook.auth import passwd
passwd()

在文本框中输入并确认一次密码后记录sha1秘钥值,如 'sha1:XXXXXXX'
将这段值按如下格式粘贴到配置文件jupyter_notebook_config.py末尾

c.NotebookApp.password = u'sha1:XXXXXXX'

重启jupyter,重新打开网页即可

延伸二:报错:OSError: [Errno 99] Cannot assign requested address

启动的时候需要:

jupyter notebook --ip=0.0.0.0 --no-browser --allow-root

.
7.在容器中打开nvidia/digits

nvidia-docker run --name digits -p 5000:5000 nvidia/digits

.


三、tensorflow安装

tensorflow/tensorflow:latest-gpu版本中,没有pip3

需要安装一下:

apt-get update
apt-get install python3-pip

然后利用pip3安装tensorflow以及keras(官网链接):

apt-get install libcupti-dev
apt-get install python3-pip python3-dev python-virtualenv
virtualenv --system-site-packages -p python3 targetDirectory
pip3 install tensorflow-gpu
pip3 install keras

之后想安装opencv,但是有一些依赖很容易导致报错:

apt-get install libsm6 libxrender1 libfontconfig1
apt-get install -y python-qt4
pip3 install opencv-python

不然有可能会报错:

ImportError: libSM.so.6: cannot open shared object file: No such file or directory
ImportError: libXext.so.6: cannot open shared object file: No such file or directory

如果也同时需要安装Keras,除了pip install keras,不然会报错:python ImportError: load_weights requires h5py.
还需要加载:

pip3 install h5py

.


延伸:

最长的开docker命令:

NV_GPU=1 nvidia-docker run -it -p 7777:8888 -v /data/matt/docker:/mnt $container --rm -ti matt/docker bash
延伸二:

出现Unable to locate package问题,则需要:

apt-get update

在使用会出现的UnicodeEncodeError: 'ascii' codec can't encode character '\uff08' in position 0: ordinal not in range(128)错误:
系统出现不能识别中文,需要加载中文字体:zh_CN.UTF-8(参考博客:docker 学习笔记——解决Ubuntu中文乱码问题

延伸三:上传至阿里云

参考:https://blog.csdn.net/qq_16605855/article/details/79961933
4 管理Docker Hub镜像站点:配置Docker加速器

链接:https://cr.console.aliyun.com/?spm=5176.1971733.0.2.duOGn4#/accelerator

5 创建镜像仓库的命名空间

例如:msj

链接:https://cr.console.aliyun.com/?spm=5176.1971733.0.2.duOGn4#/namespace/index

6 创建镜像仓库

例如:image-test

链接:https://cr.console.aliyun.com/?spm=5176.1971733.0.2.duOGn4#/imageList

然后通过这段code就可以上传自己的docker到自己的阿里云:

  $ sudo docker login --username= registry.cn-hangzhou.aliyuncs.com
  $ sudo docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/matt_docker/nvidia-docker:[镜像版本号]
  $ sudo docker push registry.cn-hangzhou.aliyuncs.com/matt_docker/nvidia-docker:[镜像版本号]

延伸三:docker 之中screen 与主机的环境不一样,py版本不一样

这样的情况需要在screen之中设置环境变量:

    export CONDA_DEFAULT_ENV=py36
    export CONDA_PREFIX=/miniconda/envs/$CONDA_DEFAULT_ENV
    export PATH=$CONDA_PREFIX/bin:$PATH
    export CONDA_AUTO_UPDATE_CONDA=false

这个是在某个conda环境下,进行的设置范例。


延伸四:nvidia docker 与 --gpus
sudo docker run --gpus all -it -p 7000:7000  -p 7005:7005 -v /etc/localtime:/etc/localtime:ro -v /data:/mnt $container --rm -ti registry.cn-hangzhou.aliyuncs.com:all-jupyter-py36 bash

nvidia-docker 和 --gpus all 功能是一样的
tensorflow-GPU代码测试:

import tensorflow as tf
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'  # 不显示等级2以下的提示信息
print('GPU', tf.test.is_gpu_available())
>>> GPU True
a = tf.constant(2.0)
b = tf.constant(4.0)
print(a + b)

pytorch-GPU代码测试:

import torch
print(torch.cuda.is_available())
>>>True

如果有报错:

docker: Error response from daemon: could not select device driver "" with capabilities: [[gpu]].

通过安装,就搞定了,参考教程:
https://github.com/NVIDIA/nvidia-docker#ubuntu-16041804-debian-jessiestretchbuster
https://blog.51cto.com/13447608/2437856
https://devtalk.nvidia.com/default/topic/1061452/docker-and-nvidia-docker/could-not-select-device-driver-quot-quot-with-capabilities-gpu-/

# Add the package repositories
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit
sudo systemctl restart docker

参考:

CentOS Linux 安裝與使用 NVIDIA Docker GPU 計算環境教學
Docker 中玩转 GPU
Using TensorFlow via Docker
Docker Compose + GPU + TensorFlow = ❤️
Docker基礎教程

我的博客即将同步至腾讯云+社区,邀请大家一同入驻。

  • 7
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值