用PyCharm远程调试来编写PaddlePaddle代码

0、前言和相关知识

PaddlePaddle运行在Docker中,在这其中我有两个疑问:
1、怎么与Docker交互?
paddlepaddle的book项目就是教程,里面有paddle的项目环境,可以用jupyter botebook来写代码和学习,但是总是觉得有点变扭,毕竟浏览器没有IDE那种质感,其实官方是有如下说法

以交互容器方式运行开发镜像:
docker run -it --rm paddlepaddle/paddle:<version>-dev /bin/bash

或者,可以以后台进程方式运行容器:
docker run -d -p 2202:22 -p 8888:8888 paddledev/paddle:<version>-dev

然后用密码 root SSH进入容器:
ssh -p 2202 root@localhost

SSH方式的一个优点是我们可以从多个终端进入容器。比如,一个终端运行vi,另一个终端运行Python。另一个好处是我们可以把PaddlePaddle容器运行在远程服务器上,并在笔记本上通过SSH与其连接。

PaddlePaddle发布的Docker镜像使用说明 上面内容来自这个页面

  • 第一个命令就是直接用命令行进入docker容器,其中-t选项就是tty的意思,最后的一个是执行的命令(/bin/bash)

  • 第二、三个命令是一起用的额,先开启docker 的后台,再ssh远程过去

2、ssh怎么连上去?
官方教程不是写了做法了么?为什么还那样问!?因为实际操作的时候是一直拒绝连接的,从自己试验多次之后,发现有的镜像压根没有安装openssh-server,有的安装了,但是却没有开启,没开服务当然连不上啊。

而远程调试之前,肯定第一步是连上Docker,不然后面都不能继续。

第一次用docker,不太了解怎么操作docker,搞了几天。了解后,我们得知道几个docker命令:

  • docker stop 容器ID 这命令是停止容器
  • docker run [选项] 镜像名:tag [命令] [参数]
    选项: -i 没有参数 给容器开启一个不间断的输入,没有这个的话,执行完命令容器就会退出
    选项:-t 参数在命令处 给容器接入一个tty交互字符界面,参数一般是/bin/bash(个人理解,准确理解亲查阅相关资料
    选项:-d 没有参数 开启让容器在后台运行,并在完全开启容器后,打印容器ID
    选项:-p 本机端口:docker端口 作用是将docker端口映射到本地
  • docker exec [选项] 容器ID 命令 [参数]
  • docker images 列出所有镜像
  • docker ps 列出正在运行的镜像
  • docker ps -a 列出历史记录和情况,其中只有STATUS字段有UP×××字样才是运行中
  • docker pull 镜像名:tag 如果不加tag名称,默认为latest这个tag
  • docker commit 镜像名称 保存镜像状态,下次开启容器会重置,网上上最好用volume(卷)容器来存在内容(volume容器及相关雷凌不在本教程中),镜像名称格式,推荐是:用户名/项目名 或者 组织名/项目名

本教程暂时只管连上docker,内容保存的话,看看以后的有没空改一改。

下面会开始过程,在这之前,先说说简略过程:
开启Docker镜像->检测openssh-server是否存在->是>>跳过docker commit那一步||否>>安装openssh-server->docker commit保存镜像->docker run 开启镜像->docker exec 开启openssh-server->Pycharm远程调试

1、下载并启动Paddle的Docker镜像

1.1下载镜像(其实命令正常意思是运行这个镜像):

正常的方式是docker pull命令拉取镜像的,但是出于简便,采用如下做法:

docker run -d -p 8888:8888 docker.paddlepaddle.org/book:0.10.0

详细说法请参看:运行这本书

1.2启动book镜像

先列出镜像:

docker images

我们选最后一个镜像:

docker run -d -p 8888:8888 -p 2202:22 docker.paddlepaddle.org/book:0.10.0 

docker ps

命令解释:新建docker.paddlepaddle.org/book:0.10.0镜像的容器,把docker的8888、22端口分别映射到8888、2202,并且后台运行

因为这是book项目的镜像里面开启了,jupyter notebook,所以我们可以这么链接上
http://localhost:8888

2、检测openssh-server是否存在

我们直接向docker容器执行命令

docker exec d6f1c2309b7f whereis sshd 

docker exec d6f1c2309b7f apt-get install openssh-server -y 

这里说明一下,docker exec执行的命令其实就是普通Linux命令而已,首先是wheresi sshd,看输出没有路径信息,说明没有这个程序,接着使用apt-get命令安装openssh-server,这个docker exec命令是不能交互的,所以的使用-y代替本来要输入Y或者回车才能继续安装的确认。


继续添加一些配置文件:
打开如下链接:http://localhost:8888

mkdir /var/run/sshd
echo 'root:root' | chpasswd
sed -ri 's/^PermitRootLogin\s+.*/PermitRootLogin yes/' /etc/ssh/sshd_config
sed -ri 's/UsePAM yes/#UsePAM yes/g' /etc/ssh/sshd_config

PS:因为启动镜像的方式没有加选项-t所以只能用jupyter notebook来访问了
如果想用交互的方式来可以用如下来开启镜像:

docker run -d -i -t -p 8888:8888 -p 2202:22 docker.paddlepaddle.org/book:0.10.0 /bin/bash

docker attach 容器id  ----如果一直卡着,按ctrl+C就进了

进去执行上面的更改配置的命令

ctrl+p -> ctrl+q ----退出容器

3、docker commit保存镜像

其实docker是不推荐这样做的,因为这样子重现这个环境会变得很困难
具体可查看使用 Docker 容器应该避免的 10 个事情
但是考虑到,自己构建需要花费大量时间(墙很高),并且这个book项目github上并没有提供Dockerfile文件

docker commit d6f1c2309b7f paddlepaddle/book-ssh:0.10.0 

这样子在paddlepaddle/book-ssh:0.10.0这个镜像中添加了openssh-server软件,但是却不能自启动,docker中的linux系统,不能正常设置启动,docker中更讲究的是容器的启动,也就是容器启动时,应用随容器启动而启动,这就需要Dockerfile来构建整个脚本并且添加自启动。

所以我们办不到通过Dockerfile来重构镜像(新生成才对吧),来达到自启动,所以保存之后只能笨一点的方法,手动开启服务,再ssh远程了。

4、docker exec 开启openssh-server

docker exec d6f1c2309b7f /etc/init.d/ssh start

远程试试:


5、Pycharm远程调试

如果你觉得不好,也可以参考这个:Pycharm远程开发配置与使用技巧
创建项目:


添加remote:

接着点ok

会提示如下:

[2017/7/22 2:12] Upload to ssh://root@127.0.0.1:2202/usr/bin/python
[2017/7/22 2:12] No files or folders found to process

并且项目是空的:



一直写java,也是第一次看到空项目,我下意识以为出错了,但是新建一个py文件,运行正确,py文件内容如下:

import paddle.v2 as paddle
import paddle.v2.dataset.uci_housing as uci_housing


def main():
    # init
    paddle.init(use_gpu=False, trainer_count=1)

    # network config
    x = paddle.layer.data(name='x', type=paddle.data_type.dense_vector(13))
    y_predict = paddle.layer.fc(input=x, size=1, act=paddle.activation.Linear())
    y = paddle.layer.data(name='y', type=paddle.data_type.dense_vector(1))
    cost = paddle.layer.mse_cost(input=y_predict, label=y)

    # create parameters
    parameters = paddle.parameters.create(cost)

    # create optimizer
    optimizer = paddle.optimizer.Momentum(momentum=0)

    trainer = paddle.trainer.SGD(
        cost=cost, parameters=parameters, update_equation=optimizer)

    feeding = {'x': 0, 'y': 1}

    # event_handler to print training and testing info
    def event_handler(event):
        if isinstance(event, paddle.event.EndIteration):
            if event.batch_id % 100 == 0:
                print "Pass %d, Batch %d, Cost %f" % (
                    event.pass_id, event.batch_id, event.cost)

        if isinstance(event, paddle.event.EndPass):
            result = trainer.test(
                reader=paddle.batch(uci_housing.test(), batch_size=2),
                feeding=feeding)
            print "Test %d, Cost %f" % (event.pass_id, result.cost)

    # training
    trainer.train(
        reader=paddle.batch(
            paddle.reader.shuffle(uci_housing.train(), buf_size=500),
            batch_size=2),
        feeding=feeding,
        event_handler=event_handler,
        num_passes=30)


if __name__ == '__main__':
    main()

最后是code 0说明正常退出。

这个看不出东西,我们在PyCharm中创建jupyter notebook,就能看到效果了


PyCharm会自动同步本地与ssh远程的服务器文件,还有一个重点就是当你关闭容器,东西会被清空,其实看看,拥有不同的容器ID也可以知道,就是压根就是不同实例,内容是初始值也正常啊。
PS:要显示remotehost:


最后,写得很啰嗦,但是也只是想说清楚一点,不要看得稀里糊涂,我可以只写关键步骤,但是这体现不了这是过程,只体现了结果,所以我选择啰嗦。

6、windows辅助启动脚本

第7行变为你要的名字
第8行改为镜像名字(这个要你机器上的,你用我的这个肯定找不到镜像滴啊

效果:


@echo off  
title 远程Paddle_Book  
setlocal enabledelayedexpansion  
::color 0D  
::mode con cols=50 lines=30 

set "book=book-ssh"
set "docker-image=paddlepaddle/book3:latest"
echo =====================================  
echo               docker tools  
echo  显示镜像、容器、所有容器、运行book
echo                 打开book
echo =====================================  
echo.
rem echo.是显示一行空白  
echo         1、run book
echo         2、stop book
echo         3、run http://localhost:8888
echo         4、list images
echo         5、list running containers
echo         6、list hitstory containers(except %book%
echo         c、退  出



rem 开始循环
:loop 
echo.
set /p var=请选择要进行的操作,然后按回车: 

if "%var%" == "" set /a var=1  
if not "%var%" == """" set var=%var:~0,1%  
for %%t in (1,2,3,4,5,6,c) do if %%t==%var% set /a temp=-1
  
rem 这个for循环检测输入是否是在这个set中
rem 这个temp只是一个中间变量,检测是否存在用,在的话应该是-1,否则不是的话说明不在这些数之中
if not %temp%==-1 set /a var=-1
rem 如果不在set默认值为-1,之后进行提示  
  
if %var% == c goto mExit
rem 如果选择的是c的话直接退出  

echo ------------------------------------------------  
  
 
    if "%file_path%"=="""" goto mContinue  
    REM 为"双引号就停止"
    if %var% == -1 goto mError 
    if %var% == 1 (
                    docker run --name %book% -d -p 2202:22 -p 8888:8888 %docker-image%
                    echo.
                    docker ps
                    echo.
                    echo 正在启动ssh服务
                    docker exec %book% /etc/init.d/ssh start
                  )
    if %var% == 2 (
                    echo 稍等......正在停止%book%
                    docker stop %book%
                    docker rm %book%
                  )
    if %var% == 3 start http://localhost:8888
    if %var% == 4 docker images
    if %var% == 5 docker ps
    if %var% == 6 docker ps -a

    if %var% == c goto mExit
    
  
goto mContinue  
  
:mError 
echo 输入操作数有误
goto mContinue
  
:mContinue 
goto loop  
  
pause  

:mExit
echo 稍等......正在停止%book%
docker stop %book%
docker rm %book%

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

推荐阅读更多精彩内容

  • Docker — 云时代的程序分发方式 要说最近一年云计算业界有什么大事件?Google Compute Engi...
    ahohoho阅读 15,418评论 15 147
  • 转载自 http://blog.opskumu.com/docker.html 一、Docker 简介 Docke...
    极客圈阅读 10,404评论 0 120
  • 一、Docker 简介 Docker 两个主要部件:Docker: 开源的容器虚拟化平台Docker Hub: 用...
    R_X阅读 4,342评论 0 27
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,099评论 18 139
  • 吾有如意宝 亦名金刚心 欲得圣道果 当下即见闻 ——《读雪漠老师《真心》实修偈颂》 吾有真老母 亦名...
    石竹阅读 291评论 3 7