Docker深度学习环境配置

Author:郭必扬
Time:2019-05-02

Why Docker?

导师提供了一台高性能GPU机器,但是装系统的老师对深度学习不大了解,所以环境需要我自己安装。在折腾了一两周后若干次失败后,我是在忍不住发了一条朋友圈:



评论也是十分热烈,激起了大家的共鸣:



但是,在茫茫评论中,一位大佬留言:

“docker了解一下”

顿时给我一线希望。docker这个玩意儿之前也听说过,但是一直没去一探究竟,因为一直没有痛点。这一次装环境可让我深深体会到这个痛点。

我们为什么学编程的时候,一提到配置环境就头疼?因为没有一个确定的安装流程可以保证你的环境安装不出错。每一个人的电脑都不同,软硬件环境都不一样,所以可能同样的步骤在我这里可以顺利安装好,但是到你那里就各种bug满天飞。
Docker这个玩意儿,就是专门解决这个痛点的。大家把自己配置好的环境打包成镜像,我们可以直接使用别人的镜像,进入镜像之后,就进入了别人搭建好的环境,我们只需要提供硬件支持即可。这个就相当于一个虚拟机,我们可以在Windows系统里安装一个linux的虚拟机,但是docker相比虚拟机来说占用内存更小,转移起来更加方便。


写下上面这些话时,我使用docker也有几周了,刚开始对docker的各种操作很懵逼,所以决定记录下来经常使用的各种操作和对应的说明,方便日后的使用。后来发现记录的还挺不错,所以决定整理成体系分享给大家。

注:
本文的安装、使用,均在Linux-Ubuntu系统下进行。不同系统安装过程会有不同,但是安装好后的操作基本相同。

一、Docker、深度学习镜像、Nvidia-docker的安装

安装这种事儿,真不想详细写。因为这里确实没有很多坑。

1. Docker的安装

链接:https://docs.docker.com/install/linux/docker-ce/ubuntu/
跟着教程一路复制粘贴回车即可。
唯一的难点就是看懂英文的安装教程,看清楚段落层次结构。

反正,最后如果你运行sudo docker run hello-world,可以跑通,看到:


就说明Docker已经被你成功安装了!

2. Nvidia-docker的安装

为何又蹦出来一个nvidia-docker?因为原本的docker不支持GPU加速,所以NVIDIA单独做了一个docker,来让docker镜像可以使用NVIDIA的gpu。
链接: https://github.com/NVIDIA/nvidia-docker
也是直接找对应的操作系统的命令,一行行复制粘贴回车就搞定了。

反正,最后当你运行docker run --runtime=nvidia --rm nvidia/cuda:9.0-base nvidia-smi时,如果看到:


恭喜,安装成功了!

3. 深度学习镜像的安装

我这里使用镜像是deepo一款咱们中国人做出来的深度学习镜像,包含了现在多数流行的深度学习框架,而且版本也很新,所以我这个小白第一次就选择了这个。
链接:https://hub.docker.com/r/ufoym/deepo
只有安装好了前面的docker和nvidia-docker,这里就很方便了。
直接通过命令docker pull ufoym/deepo就可以把各种框架都下载下来。但是这样比较大,费时较长,所以教程里面也提供了值安装某一种框架的方式:

另外,还提供了jupyter notebook版的镜像,我这里就是安装的这个,因为我日常基本都是使用jupyter notebook,这里贴一下我的命令:

sudo docker pull ufoym/deepo:all-jupyter-py36-cu100

这里的all-jupyter-py36-cu100也是deepo提供的jupyter notebook镜像的tag。
安装好之后,通过docker images命令,可以查看已经下载好的镜像:

好了,该装的东西都装好了,下面进入操作部分了!


二、Docker最常用操作

(一)基本概念

image,镜像,是一个个配置好的环境。
container,容器,是image的具体实例。
image和container的关系,相当于面向对象中类与对象的关系。

如何查询命令参数:
docker可以看docker客户端有那些基本命令;
对应每一条命令,想看看具体是做什么的,可以在后面加一个--help查看具体用法,例如对于run命令:
docker run --help

(二)容器的相关操作

1.容器的创建、查看、删除

docker run [-it] some-image 创建某个镜像的容器。注意,同一个镜像可以通过这种方式创建任意多个container.
加上-it之后,可以创建之后,马上进入交互模式。

docker ps列出当前运行的容器

docker ps -a列出所有的容器,包括运行的和不运行的

docker rm container-id删除某个容器

2.容器的启动、进入、退出:

docker start [-i] container-id启动某个容器,必须是已经创建的。
加上-i 参数之后,可以直接进入交互模式:

注意到,交互模式下前缀会变化

除了通过-i进入交互模式,还有一种方法,那就是通过attach:
docker attach container-id

进入交互模式之后,怎么退出呢:

  • 想退出但是保持容器运行,按CTRL+Q+P三个键
  • 退出,并关闭停止容器,按CTRL+D或者输入exit再回车

注:Ctrl+P+Q按的时候有时候会不灵,多按几次!

容器的停止、重启:
docker stop container-id
docker restart container-id

(三)Docker jupyter notebook 服务 [力荐!]

深度学习jupyter notebook镜像已经创建:


1.如何创建自己的可以远程访问的容器:

sudo nvidia-docker run -it -p 7777:8888 --ipc=host -v /home/shcd/Documents/gby:/gby --name gby-notebook  90be7604e476

其中:

  • -it为直接进入交互式
  • -p 7777:8888是把主机的7777端口映射到容器的8888端口
  • -ipc=host可以让容器与主机共享内存
  • 还可以加一个--name xxxxx给容器定义一个个性化名字
  • -v /home/shcd/Documents/gby:/gby可以讲主机上的/home/shcd/Documents/gby地址挂载到容器里,并命名为/data文件夹,这样这个文件夹的内容可以在容器和主机之间共享了。因为容器一旦关闭,容器中的所有改动都会清除,所以这样挂载一个地址可以吧容器内的数据保存到本地。
  • 90be7604e476则是你安装的jupyter镜像的id,可以在刚刚docker images命令后面查看,当然你也可以直接写全名ufoym/deepo:all-py36-jupyter

经过上面的操作,你应该可以直接进入容器了,这时你用ls命令,应该可以看到一个新的文件夹gby产生了!

2.创建了容器之后,我们可以进而启动jupyter notebook:

jupyter notebook --no-browser --ip=0.0.0.0 --allow-root --NotebookApp.token= --notebook-dir='/gby'

其中:

  • --no-browser即不通过浏览器启动,--ip指定容器的ip,--allow-root允许root模型运行
  • --NotebookApp.token可以指定jupyter 登录密码,可以为空
  • --notebook-dir='/gby'指定jupyter的根目录

3.开启本地与服务器的端口映射,从而远程登录jupyter:

本地机器上,执行如下命令:

 ssh username@host-ip -L 1234:127.0.0.1:7777

这样,可以将本地的1234端口,映射到服务器的localhost的7777端口(即你前面创建jupyter容器时候的指定的服务器端口)
这样,你在本地电脑的浏览器里输入'localhost:1234',即可登录到服务器上的jupyter notebook了!

服务器的jupyter容器内我的文件夹

本地访问服务器jupyter

当我第一次看到这个画面的时候,简直激动地要跳起来!
既能远程访问高性能服务器,又可以像在本地一样便捷地操作,你说激动不激动你说激动不激动?

(四)容器的备份

之前好不容易配置好的环境,突然被学校服务器要重装!?怎么办?
你想到的一定是:能不能把配置好的环境备份一份,后面直接重新加载进来?

方法也很简单:
一般情况下,我们想备份的是容器,因为我们具体的配置都是在容器中进行的,而镜像一般都是直接在网上下载的,我们不做什么改动。

先通过docker ps或者docker ps -a来查看你想备份的容器的id,
然后通过:

docker commit -p [your-container-id] [your-backup-name]

来将id为your-container-id的容器创建成一个镜像快照。

接着,你通过docker images就可以查看到刚刚创建好的镜像快照了。
然后,通过:

docker save -o [path-you-want-to-save/your-backup-name.tar]] [your-backup-name]

把那个镜像打包成tar文件,保存到服务器上。
后面就可以把服务器上打包好的tar文件,下载到本地了。

恢复:
docker load -i your-backup-name.tar
docker run -d -p 80:80 your-backup-name


以上就是我目前使用到的最常用的用法了,至少对我目前的需求来说是够用了,随着我使用次数的变多,我也会不断更新。希望能够减少大家在环境搭建之路上的折磨吧!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,529评论 5 475
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,015评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,409评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,385评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,387评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,466评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,880评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,528评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,727评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,528评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,602评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,302评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,873评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,890评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,132评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,777评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,310评论 2 342

推荐阅读更多精彩内容

  • docker常用命令详解 - CSDN博客 本文只记录docker命令在大部分情境下的使用,如果想了解每一个选项的...
    Meathill大魔王阅读 782评论 1 2
  • 本文只记录docker命令在大部分情境下的使用,如果想了解每一个选项的细节,请参考官方文档,这里只作为自己以后的备...
    Joncc阅读 274评论 0 0
  • 本文只记录docker命令在大部分情境下的使用,如果想了解每一个选项的细节,请参考官方文档,这里只作为自己以后的备...
    BestbpF阅读 271评论 0 0
  • Docker常用命令使用 docker ps列出容器使用语法:docker ps [options]options...
    StrongZhao阅读 627评论 0 0
  • “人”字结构是相互支撑。每个人都是社会人。我们似乎总渴望着,和他人的距离近一点,再近一点。甚至对窥探他人的秘密感到...
    夏绿绿阅读 278评论 0 3