vscode 无法连接 本地docker_pycharm中添加docker解释器

配置深度学习的环境一直是一个让人头大的问题。不过值得庆幸的是,随着容器虚拟化技术的发展,我们可以用docker来创建和保存环境。越来越多的代码作者乐于提供代码运行环境的完整镜像,我们可以方便地在docker hub上下载。本文以配置目标检测的mmdetection框架为例,介绍如何在pycharm中添加docker镜像作为python运行的解释器。

第一步 下载镜像

关于docker的安装和使用,请见我之前的文章。

于文涛:随时随地享受编程的乐趣​zhuanlan.zhihu.com
6c5a1eb98fedc0002f5ecdef74da0cfb.png

在docker hub上有许多mmdetection框架的镜像,我们选择下载人数最多的vistart/mmdetection 镜像,在命令行中输入以下命令:

docker pull vistart/mmdetection

如果下载速度太慢,可以用阿里云提供的docker镜像下载加速,具体方法网上有很多。

第二步 创建容器

下载完镜像之后,用以下的命令创建容器

docker run --runtime=nvidia --name my_mmdetection --ipc=host -v /home/project:/home -i -t vistart/mmdetection /bin/bash

其中,-v /home/project:/home是将本地/home/project路径映射到容器中的j/home路径。其他的一些设置可以参考[1]

需要指出的是,第二个步骤对于pycharm加载docker解释器并没有作用,执行或者不执行都可以。

第三步 配置解释器

需要说明的是,按照上述2个步骤,已经可以使用容器进行开发了。但是只能在命令行中进行命令的输入,也只能使用vim进行代码编辑。此外,这种方式也无法进行debug,只能通过在程序中相应位置print来查看代码运行情况,非常不利于初学者和开发者调试代码。

当然,目前流行的方法是通过SSH连接到容器内部,然后使用pycharm[2]或者VSCode[3]来调试代码。但是这两种方法都有各自存在的缺点。

前一个方法的不足在于

一是因为实在不喜欢PyCharm,而是因为它并不是直接编辑docker中的文件,而是在本地创建一个文件夹,编辑本地文件,然后和远程docker同步,除了每次都要麻烦地点击鼠标同步以外,还要担心在docker上编辑和在本地编辑会不会有冲突。

后一个方法的不足在于:VSCode连接到远程服务器或者容器不稳定,有时会突然断开连接,而且并不支持断点调试。

pycharm的思想是代码在本地,解释器在远程;而VSCode的思想是代码和解释器都在远程。我自己认为理想的应该是代码在本地,解释器在容器中,两者分离。

考虑到目标检测代码繁多,结构复杂,如果能在pycharm这种IDE中编辑代码,调试程序,那就非常开心了。本文提供的方法就是能够做到这2点,能够用IDE编辑代码,能够调试程序。(本文提供的方法可能需要pycharm专业版,pycharm社区版还未测试。本文方法在Ubuntu18.04下的pycharm2019.3.4专业版测试通过)

打开pycharm,新建一个工程,打开'File'->'Settings'->'Project Interpreter'.在一个齿轮处,选择'Add'.以往在这里我们添加的都是本地自带的解释器,或者添加的是Conda中的解释器,而这一次,我们添加的是Docker解释器

0212009312ddb38bd47b7e7b480584f1.png
添加Docker解释器

各位在第一次这样操作的时候,可能在这一栏看到的都是空的,不用担心。点击"New.."按钮

674aec75c06344206762d8391e3a05e2.png
点击"New.."按钮之后的弹出界面

按照这样的设置方式,pycharm会自动与docker进行连接,连接成功后会显示上图左下角的'Connection successful',然后点击"OK".

然而,我在实验过程中遇到了弹出窗口报错"can't retrieve image ID from build stream"这个问题网上也没有找到合适的解决方法。然而,在我重复上述操作几次之后,不再报错了,解释器配置成功了。

eb53a1d9da8c993e94721068d340f9e0.png
解释器配置成功

看到这个之后,就说明解释器连接成功了,docker hub下载下来的镜像中安装了什么环境,我们此刻就拥有了什么环境,我们可以非常方便地拿来,直接使用,就和手动安装在本地的环境一模一样。我们可以自由地断点调试。

关于pycharm docker解释器原理的思考

其实到上面的步骤为止,已经把这个解释器的问题解决了。但是,我抱着一个好奇心,想深入探究一下pycharm连接docker解释器背后的机制,就做了一些分析。

此时,在pycharm界面的下面会出现一个关于docker的选项卡,里面呈现出了本地安装的docker镜像和容器的所有信息,非常详细和全面。

ab7b37ff9addbed9e8b97ff2c3e64810.png
docker选项卡

仔细观察上图可以发现,多了一些新的镜像和容器。比如"pycharm_helpers_PY-193.6911.25"容器,这个容器不是我创建的,是pycharm自己创建的。比如"busybox:latest"和"pycharm_helpers:PY-193.6911.25"这两个镜像,不是我下载或者创建的,而是pycharm自己生成的。

我手动将所有正在运行着的容器全部关闭,包括pycharm自己创建的容器。然后,我执行代码,发现解释器里提供的环境和一些包仍然能够正常使用。这就说明pycharm对docker环境解释器的加载只与镜像有关,与容器无关。无论容器是否正常运行,只要提供了镜像,镜像里的环境就能加载。

因此,这也导致了一个问题,当我们需要在已有的镜像中安装新的环境,直接在容器中改变对pycharm的解释器是没有用的,不会发生变化。我们需要手动将修改后的容器保存为新的镜像,重新执行上述步骤,让pycharm加载新的解释器。

还有一点需要说明的是,在本文第2个步骤创建容器时,指定了--runtime=nvidia,这代表容器可以使用本机的GPU。但是,pycharm在添加docker解释器时,并没有指定使用GPU。因此,在按照本文方式调试和运行代码时,使用的是CPU,无法使用到GPU。(本文用pytorch进行了测试,发现了这个现象。)但是不用担心,如果我们只用它调试代码,CPU和GPU的差距并不明显。我们可以在程序调试通过后,在手动开启的容器中(按照第2个步骤执行)在命令行运行程序,这样就可以解决这个问题了。

参考

  1. ^容器设置 https://zhuanlan.zhihu.com/p/101263456
  2. ^PyCharm+Docker https://zhuanlan.zhihu.com/p/52827335
  3. ^VSCode+Docker https://zhuanlan.zhihu.com/p/80099904
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值