服务器搭建远程docker深度学习环境

本文大部分内容参考知乎文章

Docker+PyCharm快速搭建机器学习开发环境

搭建过程中出现ssh连接问题可以查看最后的注意事项

Docker

Docker是一种容器技术,类似于虚拟机,但比虚拟机更轻便。Docker容器内的应用程序直接运行于宿主的内核,而没有自己的内核,而且也没有硬件虚拟。更多Docker的相关知识可以看《Docker-从入门到实践》。

Deepo

Deepo是一个包含一系列Docker镜像的项目,这些镜像中包含了TensorFlow、Caffe和Torch等多种深度学习框架。也就是说,在这些镜像中已经包含了大部分流行的机器学习框架,只需要将镜像下载到本地,运行容器即可直接使用这些框架。

  Deepo提供了GPU和CPU版本的框架,这里使用的mac以CPU的镜像为例子,对于GPU版本的镜像需要先安装Nvidia官方的nividia-docker和相应版本的NVIDIA驱动。

  在github页面可以看到Deepo拥有众多的不同的镜像,以tag来区分,可以根据需要下载对应的镜像。这里以docker pull ufoym/deepo为例,这样会默认下载包含GPU版本的深度学习框架的镜像。

如果只想要使用CPU的环境的话可以在后面加上CPU,即docker pull ufoym/deepo:cpu

Deepo-ssh镜像

在有了Deepo镜像之后,为了方便使用,可以在Deepo镜像基础上配置ssh服务,以便于mac通过ssh连接登录到容器,以及PyCharm调用远程的python的interpreter。

  登录到现有的Deepo容器,以docker run -it ufoym/deepo:cpu bash交互式的进入deepo容器中。

配置容器ssh连接 这一步可以使用mac通过ssh连接ubuntu容器。首先通过apt-get install openssh-server用于开启ssh服务的外部连接。

如果出现以下错误:

E: Could not get lock /var/lib/dpkg/lock-frontend - open (11: Resource temporarily unavailable)
E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), is another process using it?

可以查看这篇文章解决:

Could not get lock /var/lib/dpkg/lock - open 解决方法

配置sshd 修改sshd的默认配置,编辑文件/etc/ssh/sshd_config,修改文件中的以下三行:

PermitRootLogin yes # 可以登录 root 用户
PubkeyAuthentication yes # 可以使用 ssh 公钥许可
AuthorizedKeysFile .ssh/authorized_keys # 公钥信息保存到该文件中

​ 我的配置文件AuthorizedKeysFile .ssh/authorized_keys这一行有点不同,是这样的

AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2

重启sshd /etc/init.d/ssh restart使得这些配置生效。

添加你的机器的公钥到容器 这一步是为了能免密码ssh登录到容器中。

  1. 在容器中mkdir ~/.ssh
  2. touch ~/.ssh/authorized_keys
  3. 在你自己的机器上新开一个终端窗口,ssh-keygen -t rsa -C "youremail@example.com"(替换为你自己的邮箱),会在~/.ssh目录下生成三个文件id_rsaid_rsa.pubknown_hosts。复制id_rsa.pub文件中的内容。
  4. 将复制的内容粘贴到容器~/.ssh/authorized_keys文件中。

提交修改到镜像 以上对容器的修改并不会改变镜像文件,需要提交修改生成一个新的镜像。

  1. docker ps -a查看刚刚使用deepo容器,记录下该容器的CONTAINER ID,例如8b5a86d18e58
  2. docker commit -m 'add ssh' -a 'your-name' 8b5a86d18e58 deepo-ssh这样会将刚刚在deepo容器中配置的ssh服务保存,并生成新的deepo-ssh镜像。在后续使用docker images命令可以查看到新的镜像已经被保存。

运行最终的容器

docker run -it -p 12622:22 -v ~/data:/data -v ~/config:/config deepo-ssh:1.0 /bin/bash && /usr/sbin/sshd -D

如果想要运行GPU环境的话,那么必须在启动容器时加上--runtime=nvidia,那么此时的命令为:

docker run --runtime=nvidia -it -p 12622:22 -v ~/data:/data -v ~/config:/config deepo-ssh:1.0 /bin/bash && /usr/sbin/sshd -D

  • -d | 后台运行
  • -p 12622:22 | 绑定当前mac的12622端口到deepo-ssh容器的22端口(ssh服务默认为22端口)
  • -v ~/data:/data | 将本机上的~/data目录挂载到容器/data目录
  • /usr/sbin/sshd -D | 容器运行的命令和参数,开启ssh服务

这样就可以通过ssh -p 12622 root@localhost连接到容器,可以进入python解释程序,执行import torch等命令查看机器学习框架是否能正常使用。在exit退出ssh连接后,容器仍运行在后台。

ssh远程连接

首先明确的是容器中的22端口已经绑定到主机上的12622端口,那么此时如果想要远程连接的话那么应该采用如下命令:

ssh -p 12622 root@<你的主机的ip地址>

这里有个坑注意。如果你的服务器主机是内网的,要想正确访问的话,那么必须首先搭建隧道。可以参考我之前的博客文章,反向代理搭建隧道

  1. 其中这里的坑就是我用autossh搭建隧道不起作用,无法远程登录进行容器里面,但是使用ssh搭建的就可以正确访问

其中ssh的命令为:ssh -fCNR 2064:localhost:12622 <公网机器上用来做转发的账户>@<你的公网机器的ip地址>

具体的参数含义可以参考上面给出的文章链接。

这样就将公网机器上的2064端口给绑定到你的内网机器的12622端口上了(假定你的服务器是在内网的,这样通过反向代理就可以通过外网进行访问了),即通过ssh就可以进行远程登录容器了:

ssh -p 2064 root@<你的公网主机的ip地址>
  1. 第二个坑就是ssh连接时的root的账户密码你是不知道的,因为如果像上面启动容器后你没有修改设置密码,你是不知道root的密码的,所以你需要在启动容器后再重新设置一下密码,这样ssh连接的时候才能正确登录。

基于之前的镜像重新编写Dockerfile,设置容器启动时的密码

  1. 首先编写Dockerfile,由于之前已经提交过一次镜像,我们可以基于之前的镜像进行重新的构建一个新的镜像,这样设置里面的root的账户密码为自定义密码。在一个空目录下,创建Dockerfile文件,然后添加如下内容:

    FROM deepo-ssh:1.0
    RUN echo "root:123456" | chpasswd
    • deepo-ssh:1.0 是之前生成的镜像
    • echo “root:123456” | chpasswd 是将root的账户密码默认设置为123456了(这里密码你可以自行设置)
  2. 然后再次构建镜像,在Dockerfile文件所在的目录执行如下命令:

    docker build -t deepo-ssh:2.0 .

    这样就创建了deepo-ssh:2.0的镜像,然后基于这个镜像启动容器root账户默认的密码既是你自己设置的了。

  3. 启动容器

    docker run -it -p 12622:22 -v ~/data:/data -v ~/config:/config deepo-ssh:2.0 /bin/bash && /usr/sbin/sshd -D

    注意这里是deepo-ssh:2.0

    如果ssh连接不上容器 ,那么在容器中 重启一下ssh服务

    /etc/init.d/ssh restart

PyCharm连接Docker

经过以上的操作,可以理解成本地12622端口开启了ssh服务,运行一个独立的ubuntu服务器。接下来介绍如何使用PyCharm调用Docker容器中的解释器。(注意需要PyCharm专业版)

在Pycharm中file–>settings–>Project Interpreter,如下图所示:

​ 然后点击Add进行添加python解释器

然后选择你已经配置好的ssh连接,进行配置python解释器:

接下里选择解释器,这里一定注意interpreter的地方,要选择正确;然后配置同步目录(即你的本地项目会同步到容器中的哪个目录)

点击finish就配置完成了,接下来就可以进行本地开发,远程运行在容器里了。

注意这里的同步目录最好是之前设置的启动容器时挂载的目录,即最好在/data下,这样容器销毁了数据也不会丢失

在服务器上创建docker容器并运行在后台,映射到服务器的一个端口。在Pycharm中调用远程服务器的解释器,并创建本地目录和服务器目录的映射(在Deployment配置),就可以实现在本地写代码和调试。

注意事项

如果发现ssh连接不上,那么可以在容器内进行重启下ssh服务

/etc/init.d/ssh restart

服务器搭建远程docker深度学习环境的更多相关文章

  1. 教你如何用Docker快速搭建深度学习环境

    本教程搭建集 Tensorflow.Keras.Coffe.PyTorch 等深度学习框架于一身的环境,及jupyter. 本教程使用nvidia-docker启动实例,通过本教程可以从一个全新的Ub ...

  2. 在服务器的docker里 装anacond3深度学习环境的全流程超基础

    ​ 背景: 实验室给我分配了一个服务器 已经装好了docker 和nvidi docker . 现在我的目标是创建我自己的docker 然后在我自己的docker里装上anaconda环境. 我以前从 ...

  3. 保姆级教程——Ubuntu16.04 Server下深度学习环境搭建:安装CUDA8.0,cuDNN6.0,Bazel0.5.4,源码编译安装TensorFlow1.4.0(GPU版)

    写在前面 本文叙述了在Ubuntu16.04 Server下安装CUDA8.0,cuDNN6.0以及源码编译安装TensorFlow1.4.0(GPU版)的亲身经历,包括遇到的问题及解决办法,也有一些 ...

  4. 基于Ubuntu+Python+Tensorflow+Jupyter notebook搭建深度学习环境

    基于Ubuntu+Python+Tensorflow+Jupyter notebook搭建深度学习环境 前言一.环境准备环境介绍软件下载VMware下安装UbuntuUbuntu下Anaconda的安 ...

  5. linux系统下深度学习环境搭建和使用

    作为一个AI工程师,对Linux的一些技能的掌握也能从一定层面反应工程师的资深水平. 要求1:基于SSH的远程访问(本篇文章) 能用一台笔记本电脑,远程登陆一台linux服务器 能随时使用笔记本电脑启 ...

  6. 深度学习菜鸟的信仰地︱Supervessel超能云服务器、深度学习环境全配置

    并非广告~实在是太良心了,所以费时间给他们点赞一下~ SuperVessel云平台是IBM中国研究院和中国系统与技术中心基于POWER架构和OpenStack技术共同构建的, 支持开发者远程开发的免费 ...

  7. [AI开发]centOS7.5上基于keras/tensorflow深度学习环境搭建

    这篇文章详细介绍在centOS7.5上搭建基于keras/tensorflow的深度学习环境,该环境可用于实际生产.本人现在非常熟练linux(Ubuntu/centOS/openSUSE).wind ...

  8. 深度学习环境搭建:Tensorflow1.4.0+Ubuntu16.04+Python3.5+Cuda8.0+Cudnn6.0

    目录 深度学习环境搭建:Tensorflow1.4.0+Ubuntu16.04+Python3.5+Cuda8.0+Cudnn6.0 Reference 硬件说明: 软件准备: 1. 安装Ubuntu ...

  9. 我的AI之路 —— 从裸机搭建GPU版本的深度学习环境

    之前一直在CPU上跑深度学习,由于做的是NLP方向所以也能勉强忍受.最近在做图像的时候,实在是扛不住了...还好领导们的支持买个虚拟机先体验下.由于刚买的机器,环境都得自己摸索,瞎搞过很多次,也走过很 ...

随机推荐

  1. 栈及其简单应用(二)(python代码)

    一.括号判定 前一篇文章我们介绍了栈的简单应用中,关于括号的判定,但那只是一种括号的判定,下面我们来介绍多种括号混合使用时,如何判断括号左右一一对应. 比如“{}{(}(][”这种情况,需要对一种括号 ...

  2. C#设计模式之3-建造者模式

    建造者模式(Builder Pattern) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/393 访问. 建造者模式属 ...

  3. 漏洞重温之XSS(上)

    漏洞简介 跨站脚本攻击(XSS)是指恶意攻击者往Web页面里插入恶意Script代码,当用户浏览页面之时,嵌入web网页中的script代码会被执行,从而达到恶意攻击用户的目的. XSS漏洞通常是通过 ...

  4. 《MySQL必知必会》过滤数据,数据过滤(where ,in ,null ,not)

    <MySQL必知必会>过滤数据,数据过滤 1.过滤数据 1.1 使用 where 子句 在SEL ECT语句中,数据根据WHERE子句中指定的搜索条件进行过滤. WHERE子句在表名(FR ...

  5. 浏览器自动化的一些体会7 selenium webdriver的一些问题

    1. 下载图片 这个链接说得最好,差不多所有可能的方法都列举了,除了没有提到用URLDownloadToFile,不过这和用WebClient差不多. https://stackoverflow.co ...

  6. WSGI 配置禁止反向DNS查找

    原文链接:https://opendev.org/starlingx/ha/src/commit/045a37c672a92f1412629a176f51183c88882e61/service-mg ...

  7. IDEA的主题配置

    搞了半天的主题配色,从一些现有的主题网站上想找按照sublime中monokai进行复刻的主题,都没有找到一样的,部分的颜色还会让人看不清楚,这里分享一下自定义主题的方法,和自己配置好的一个主题吧. ...

  8. Mac上如果看不到.git目录的解决方法

    Mac OS X上,如果需要查看.git目录下的隐藏文件,操作很简单: 做法是:打开一个Terminal终端窗口,输入: defaults write com.apple.finder AppleSh ...

  9. 查询Linux CPU架构

    一.背景 Ubuntu上需要安装测试个软件wkhtmltopdf,但是下载时,需要知道系统架构,故做记录 二.查看linux架构 dpkg 命令 dpkg 的命令可用于查看 Debian/ Ubunt ...

  10. DVWA之文件包含(一)

    文件包含又可以是本地文件包含或远程文件包含. 本地文件包含:文件存在本地目录 远程文件包含:文件共享或存在网络上,需要访问 <?php // The page we wish to displa ...