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

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

一、安装

参考:Docker Compose + GPU + TensorFlow = ❤️ 安装docker

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

安装Nvidia Docker

wget -P /tmp https://github.com/NVIDIA/nvidia-docker/releases/download/v1.0.1/nvidia-docker_1.0.1-1_amd64.deb
sudo dpkg -i /tmp/nvidia-docker*.deb

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

nvidia-docker run --rm nvidia/cuda nvidia-smi

执行的时候可能会报错:

Error: unsupported CUDA version: driver 8.0 < image 9.0.176 

所以需要指定一下版本:

nvidia-docker run --rm nvidia/cuda:8.0-devel nvidia-smi

.

二、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

.

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_weightsrequires 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

参考:

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大数据

使用Go构建一个Data Thrashing CLI工具

以下所撰就是这个快速上手的项目。最后,我将在容器中搭建服务,并将其放入Kubernetes(k8s)集群中,不过下面操作都是在CLI环境下进行的。

1950
来自专栏FreeBuf

linux下利用一次性口令实现安全管理

作者 黑狐 [译自vpsboard] Linux服务器一直就是以稳定、高效、安全而著称。安全是比较重要的一个环节,这关系到商业机密,更关系到企业的存亡。本文...

1947
来自专栏张戈的专栏

升级CentOS6.5内核,开启Nginx的fastopen和reuseport特性

前面,张戈博客在折腾 Nginx 的 SSL 优化时,注意到前人在 Nginx 的 listen 配置中,添加了 fastopen=3 reuseport 这 ...

4399
来自专栏张戈的专栏

Nginx网站使用CDN之后禁止用户真实IP访问的方法

做过面向公网 WEB 运维的苦逼们肯定见识过各种恶意扫描、拉取、注入等图谋不轨行为吧?对于直接对外的 WEB 服务器,我们可以直接通过 iptables 、 N...

87512
来自专栏互扯程序

Linux常用Shell脚本,值得学习及收藏

在运维中,尤其是linux运维,都知道脚本的重要性,脚本会让我们的 运维事半功倍,所以学会写脚本是我们每个linux运维必须学会的一门功课,这里收藏linux运...

551
来自专栏lhyt前端之路

pwa+webpack,初探与踩坑0.前言1.webpack2.pwa3.基于webpack的pwa

我们都知道pwa是一个新技术.,依靠缓存,离线了还能正常跑,而且秒开。我把以前原生写的小游戏迁移到react,再迁移到webpack+react,最后再升级到p...

732
来自专栏JadePeng的技术博客

jenkins X实践系列(1) —— 背景知识

Jenkins X 是一个高度集成化的CI/CD平台,基于Jenkins和Kubernetes实现,旨在解决微服务体系架构下的云原生应用的持续交付的问题,简化整...

1292
来自专栏同步博客

掀开断点续传那一层面纱(下载篇)

  这一篇文章主要介绍的是http协议下载时的断点续传,详细到各个步骤。主要步骤有:DNS查找、TCP三次握手、http请求发送、TCP协议数据传输、暂停后的状...

994
来自专栏java工会

推荐几个自己写的Java后端相关的范例项目

2125
来自专栏前端儿

前端代码乱糟糟?是时候引入代码质量检查工具了

为了统一团队的代码规范,除了一纸规范说明之外,还需要引入工具进行限制。虽说工具并不能完全实现规范中的规则,但至少能够在一定程度上缓解代码不统一的局面。

1411

扫码关注云+社区