PyCharm 使用远程 Interpreter


发布于

|

分类

我发现我跟 TensorFlow 有仇。

自己电脑上没有 GPU,所以只能远程带有 GPU 的服务器学习写 TensorFlow。Vim 虽然高效,但真的真的还是 IDE 用得习惯一些。所以,就想用 Pycharm 的远程功能直接在服务器上建立项目、调试运行。

下面的教程将带你做一件奇怪的事情: 在本地写代码,代码时时同步到服务器上。按下 “Run”/“Debug”,代码将跑在服务器上,本地可以时时看到输出、可以调试。

假设

我们假设服务器上 Python 的路径是 /home/haoyu/conda/bin/python。如果使用了 CondaEnv 的话,Python 的路径是 /home/haoyu/miniconda3/envs/YOUR_CONDA_ENV/bin/python

我们的代码放在本地的 /home/haoyu/Workspace/DemoProject 里,同时希望将代码上传到服务器上的 /home/haoyu/RemoteWorkspace/DemoProject 里。

我们假设你正在使用 PyCharm 专业版。

服务器配置

在服务器上配置好 VirtualEnv 或者 conda,亦或者直接使用系统 Python。我们只需要知道所用 Python 的路径即可。

在这里我使用 Miniconda,安装在了 /home/haoyu/conda 里面,所以 Python 的路径是 /home/haoyu/conda/bin/python

顺手安装其他依赖,测试 import tensorflow as tf,正常。

本地配置

基本用法

如果你是第一次使用,那么最简单了:

  1. 新建项目,展开「Project Interpreter」选择「Existing Interpreter」,点击右边的三个小点点
  2. 左边选择「SSH Interpreter」,输入服务器地址和用户名,下一步输入密码
  3. 再下一步。输入前面或取到的 Python 路径
  4. 回到之前的界面,会发现最下面多出了一个叫「Remote Project Location」的东西。输入上面「将代码上传到服务器上的地址」,点击「创建」

这时候,通过 PyCharm 新建的文件、编辑的文件,都会时时被发送到服务器上。点击右上角的 Run 或者 Debug,代码也是跑在服务器上的。但是!但是!你完全不必担心,因为跟你运行在本地是一模一样的体验!

进阶用法

上面的过程其实是分为两个部分的:Python 的配置、代码上传配置。在 PyCharm 里面,分别叫「Project Interpreter」和「Deployment」。前者负责「代码怎么跑」,后者负责「代码怎么上传」。

Project Interpreter 配置

这里右边有个小齿轮。点击,然后点击「Show All」。这里列出了我们全部记录在案的 Python 解释器。

我们可以新建、改名、删除某些解释器。

同上面一样,为了运行在远程服务器上,我们选择 SSH,输入各种信息就好了。如果是通过上面「基础用法」创建的,那么第二行可能选在了「Deployment configuration」上,意思是使用某个 Deployment 的配置。保险起见,也为了不用每次新建项目都重新配置一遍,我们在这里改成 SSH 方式。

我们需要注意的是,「Project Interpreter 配置」里面有个 「Path Mapping」。这个 Mapping 负责告诉解释器,服务器上的代码和本地代码之间是怎么样的影射关系。比如,服务器上的 /foo/main.py 在本地应该是 /work/bar/main.py——这对于单步调试、运行报错时的快速定位是必须的。所以,如果出现 Mapping 为 None,请尽量设置一下。否则调试会比较痛苦。

Deployment 配置

就这个。它是控制「代码往哪里传」的。同样的,右边,服务器 ip、RootPath(一般填 / 就好了,这样 Mapping 就能填绝对路径了,否则 Mapping 是个相对路径,不太好理解)、用户名、密码,要多说么?

但是切换到第二个选项卡,就要说几句了

这里仍旧是配置 Mapping。个人建议是和前面「Project Interpreter 配置」里面的 Mapping 填成一样的。

下面的 Web Path,随便填吧,我习惯直接填个 /。为空也可以,只是启动项目的时候右下角会报一个 Warning,说 Web Path 为空。

注意中间一栏,说的是「目前记录在册的部署服务器的详情」。上面有四个按钮,其中最右边的是「设置 / 取消 默认」。如果将某个服务器设置为默认,那么它会在列表里面加粗显示。

使用

好了,上面都配置完毕了,下面说如何使用。

先说代码上传。我们可以手动上传代码到指定服务器,也可以在按下保存之后将代码自动上传到默认服务器上。

手动上传: 在代码树里面点右键,Deployment,Upload To XXX

自动上传: 在设置了默认上传服务器后,勾选菜单栏里面的 Tools,Deployment,Automatic Upload。这样当你在 PyCharm 中保存文件时,你的文件就会被自动上传到默认服务器上。

再说运行。首先去「Project Interpreter」选择对应的服务器,在已经将代码上传的前提下,直接点击右上角的 Run、Debug 就好。和本地调试别无二样。

如果 Mapping 没有设置好,那么出现断点的时候会弹出一个东西让你临时设置 Mapping。一般 Auto 就好。

新建项目

我们新建项目的时候就可以在「Existing Interseptor」里面选择我们自己添加的远程 Python 了。同样是设置一下 Mapping 即可。

不过,和「基本使用」不同的是,我们还需要自己再检查一下上面两个设置,看一下 Mapping 对不对。一般来说都是对的。如果 Mapping 为空,补充完整即可。

其他

环境变量

运行的时候会有一个坑。

上面说了,import tensorflow 正常我才从服务器上退出来的。可以一到 PyCharm 里面,import tensorflow 就各种出错,使用全局 Python 也不行。

过程不说了,直接说原因和怎么办:

报的错都是 “XXX.so 找不到”,但我明明都已经安装过了。原因是缺少环境变量。只需要将 Cuda 的路径 /usr/local/cuda/lib64 加入环境变量即可。路径视 CUDA 版本而定。默认 CUDA 的话可以直接写 /usr/local/cuda/lib64,如果装有多个 CUDA 又想制定版本的的话,可以写 /usr/local/cuda-9.0/lib64 之类的。

怎么做?

  1. 对整个 Console 加入环境变量: 在「Settings」-「Build, Execution, Development」-「Console」-「Python Console」里面,找到「Environment variables」,将 LD_LIBRARY_PATH=/usr/local/cuda/lib64 添加进去即可。
  2. 对某个运行文件加入环境变量:右上角的「Run/Debug Configurations」里面,找到想运行的文件,在「Configurations」选项卡中找到「Environment variables」,将 LD_LIBRARY_PATH=/usr/local/cuda/lib64 添加进去即可。

所以,如果还缺其他环境变量的话,同样的办法添加即可。

加载项目

使用远程 Python 的话会导致加载项目比较慢。具体表现为加载项目的时候,PyCharm 会和远程服务器通信,将所有依赖库都在本地做个缓存和索引,这样才能使用智能提示。在通信和做索引期间,我们是不能点击有上角的「Run/Debug」的,其他不受影响。如果服务器上的依赖库特别多,加上网速又特别慢的话……emmmm,喝杯 Java 冷静一下先?

文件同步

文件同步一般是单向的,即,在本地写代码,文件被同步到服务器上。服务器上做了什么改动,例如创建了许多 Log 文件夹啊、运行结果啊,本地是看不到的,哦不,是「不会时时同步回来」。但菜单里面也有「将目前远程的东西拉回来」。用的时候小心一点就好了。

为了保持本地的干净整洁、降低 PyCharm 的索引压力,建议本地文件夹只放代码。代码同步到服务器上后,手动 ssh 冲上服务器,Copy 数据。——这个好像没说清楚,自己体会一下?

其他说明

  1. 用了远程 Python 之后,其实本地不用安装 Python 都是可以的
  2. 可以手动上传: 右键,「Deployment」,「Upload To」
  3. 如果本地直接做了改动,而不是通过 IDE 做改动,那么需要手动上传
  4. 如果本地做了 Git 切换分支、切换版本等操作,也需要手动上传
  5. 好像 Windows 里面需要将文件 Copy 到工作目录里面才行,而不能是「仅添加到工作目录,不复制文件」
  6. 建议将数据和代码分开,只上传代码
  7. 服务器上的东西可能和本地有所不同,或者说不是双向同步的。例如,上传后,冲上服务器,新建个「Data」文件夹存放文件,那么本地是不知道的。重新上传并不会覆盖掉自己新建的文件夹
  8. 不建议后期重命名工作空间,会导致各种严重的问题,例如服务器上自己新建的文件夹丢失什么的。如果需要改工作空间名字,新建一个工作空间,将代码复制进去,上传,再删除原来的
  9. 不要问我上面这一条是怎么知道的。跑了一个月的 Weights 全!没!了!

结束

好了,最后一次尝试入坑 TensorFlow 吧!要加油哦!

第一版是针对小白的,同时也是第一次配置成功后的手记。某人说写得太笼统,遂重写第二版。


评论

  1. hellopbc 的头像
    hellopbc

    你好,我的ssh interpreter突然找不到cudatoolkit等包了,在服务器上是有安装然后跑代码也是没问题的,以前在本地连服务器环境也是可以正常使用的,今天突然发现连远程环境少了很多包,检查过了,远程环境的包一个没少,不知道博主有没有碰到这种情况?

    1. 小金鱼儿 的头像
      小金鱼儿

      没遇到过……或者看看是不是解释器切换错了?右下角可以切换

  2. young 的头像
    young

    您好,感谢您的文章。对我帮助很大,我第一次使用pycharm wiht gcp。我想问下怎么才可以直接读取在gcp运算的variables。找了好久都没有找到,希望您能指点迷津。

  3. Michael 的头像
    Michael

    非常好的文章,很有帮助,谢谢

  4. shuang.liu 的头像

    python在远端运行完毕后,在当前目录生成的某些log文件,我需要自动同步到本地,不想每次手动download。可以设置吗?

  5. kyz 的头像
    kyz

    您好,我想问下远程开发的时候第三方库没有代码提示是怎么回事,运行和debug都可以,就是没有代码提示(智能联想)功能?

    1. 小金鱼儿 的头像
      小金鱼儿

      看看最下面是不是有个进度条?等进度条走完就好了。目测是会把远程Python相关东西拉回本地一份,拉完后就有智能提示了。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注