使用PyCharm进行远程调试:a.远程连接服务器,b.传入命令行参数和c.多线程调试(伪)(猎风习习原创)

参考

a
a
a
b
b
b

配置方法

1. 配置服务器连接方式等

第一步,打开如图所示的配置文件:
使用PyCharm进行远程调试:a.远程连接服务器,b.传入命令行参数和c.多线程调试(伪)(猎风习习原创)
如果你的PyCharm没有这个选项,那么很可能是因为你不是专业版,如果你是学生,那么可以在PyCharm上免费注册账号使用专业版。具体操作请另外查询。
第二步,编辑配置文件,如下图:
使用PyCharm进行远程调试:a.远程连接服务器,b.传入命令行参数和c.多线程调试(伪)(猎风习习原创)
连接类型一般选择SFTP,其余部分该怎么选,是什么含义,已经在图片上了。
使用PyCharm进行远程调试:a.远程连接服务器,b.传入命令行参数和c.多线程调试(伪)(猎风习习原创)
Mappings配置路径映射,即本地工程的目录和服务器上工程目录的对应位置,注意后者目录为相对目录——相对第一张图片配置的Root Path
使用PyCharm进行远程调试:a.远程连接服务器,b.传入命令行参数和c.多线程调试(伪)(猎风习习原创)
Excluded Paths: 排除目录,在服务器配置好之后,本地的代码和远程的代码要同步,这个排除目录列表就可以帮你选择哪些目录下的文件不用同步

2. 配置远程解释器

第一步,打开如图所示的设置:
使用PyCharm进行远程调试:a.远程连接服务器,b.传入命令行参数和c.多线程调试(伪)(猎风习习原创)
第二步,配置项目下的Project Interpreter的设置:
使用PyCharm进行远程调试:a.远程连接服务器,b.传入命令行参数和c.多线程调试(伪)(猎风习习原创)
这里主要有两项,如果之前没有配置过,这两项应该都为空的。第二项Path mappings大概是两个工程目录的映射关系(我也不太确定但是这样配置没有问题);主要是第一项Project Interpreter即python解释器的配置,接下来介绍。

第三步,点击Project Interpreter最右边的齿轮/add,配置远程服务器上的python解释器。
使用PyCharm进行远程调试:a.远程连接服务器,b.传入命令行参数和c.多线程调试(伪)(猎风习习原创)
如图,选择SHH Interpreter。如果没有配置过的话,选择New…,反之,则可以选择Existing…。这里介绍New的方法。
接下来,输入服务器上此用户的密码,登录
使用PyCharm进行远程调试:a.远程连接服务器,b.传入命令行参数和c.多线程调试(伪)(猎风习习原创)
填好之后,点Next,之后进入在服务器上选择解释器的步骤:
使用PyCharm进行远程调试:a.远程连接服务器,b.传入命令行参数和c.多线程调试(伪)(猎风习习原创)
Interpreter选择解释器在服务器上的位置,一般使用anaconda虚拟环境的话,位置应该是:/anaconda安装位置/envs/environmet name/bin/python,同文件夹下一般还有python3、python3.6等,实测是一样的,应该都指向同一个解释器。下面那个Sync folders应该是本地代码在远程运行的临时目录,但是我不清楚为什么在1里面设置了项目的Mappings之后还需要这一项,知道的小伙伴可以告诉我(我又看了一下,这个应该也要设置成1里面设置的项目的Mappings在服务器上相同的地址)
这一切完成之后,点击Finish就可以了。

3. 配置运行环境

虽然配置好了上面两项,但是还有最后一步,代码才能正常地运行。这一步也包括了如何在使用图形界面时使用命令行参数。
打开如图所示的设置:
使用PyCharm进行远程调试:a.远程连接服务器,b.传入命令行参数和c.多线程调试(伪)(猎风习习原创)
打开之后会有如图所示的界面:
使用PyCharm进行远程调试:a.远程连接服务器,b.传入命令行参数和c.多线程调试(伪)(猎风习习原创)
在这张图片里:Script path代表了要运行的代码;Parameters是代码运行的命令行参数,怎么设置的看这个例子应该就明白了,不明白可以看最前面编号为b的参考连接;Environment下,python解释器、工作目录和路径映射之前已经设置过了。其他设置保持默认就行。

4. 值得注意的点

服务器下当前目录(工作目录)的配置

多线程调试(伪)

说是多线程,其实就是PyTorch在运行代码的时候,使用了多个GPU。因此使用了类DistributedDataParallel等对model进行了包装,使用多个线程来进行训练。这导致了ipdb无法进入model的具体方法下查看运行情况,因此无法在shell下使用ipdb进行调试。这也是为什么使用PyCharm的原因,不然的话,ipdb它不香么。

使用PyCharm后,我没有去调研多线程调试的方法,而是直接使用单步运行+断点的方式来进行调试,还真的成功进入了model的具体方法内部查看执行情况。主要的方法就是:在合适的位置加断点和step into,举个例子,我在这个工程下加断点和step into的位置是:
使用PyCharm进行远程调试:a.远程连接服务器,b.传入命令行参数和c.多线程调试(伪)(猎风习习原创)
使用PyCharm进行远程调试:a.远程连接服务器,b.传入命令行参数和c.多线程调试(伪)(猎风习习原创)
使用PyCharm进行远程调试:a.远程连接服务器,b.传入命令行参数和c.多线程调试(伪)(猎风习习原创)
使用PyCharm进行远程调试:a.远程连接服务器,b.传入命令行参数和c.多线程调试(伪)(猎风习习原创)
使用PyCharm进行远程调试:a.远程连接服务器,b.传入命令行参数和c.多线程调试(伪)(猎风习习原创)
使用PyCharm进行远程调试:a.远程连接服务器,b.传入命令行参数和c.多线程调试(伪)(猎风习习原创)
从这个断点开始(配置了线程),每步都step into,最后会进入model