大体情况是这样的,我在本地用xshell连接到远程服务器,用xshell的界面打开服务器终端,通过Anaconda虚拟环境执行工程服务文件,执行命令是这样的:CUDA_VISIBLE_DEVICES=1 python service.py,当我在终端敲完这条命令,点击enter键,终端没任何反应(排除掉ctrl+s锁死终端界面的情况,因为我还能输入命令,按enter键后,光标能跳到下一行)
附上终端的快捷键命令:
ctrl+s 暂停屏幕输出
ctrl+q 恢复屏幕输出
ctrl+l 清屏,和clear作用一样
ctrl+d 退出用户
ctrl+c 结束当前正在运行的程序

解决思路

第一步:在service.py文件里面导入系统库后面添加打印信息,在导入自己写的模块后面添加打印信息;结果看到在程序其实能运行,只是卡死在导入自己写的模块的地方,但是明明上午我还能运行,这点有些奇怪。

第二步:确定具体是哪个模块导入出错,根据自己导入的文件一步一步深入发现有两个文件:fused.act.py,upfirdn2d.py,在导入upfirdn2d模块时卡住了。

fused_act.py最开始部分如下:

python终端运行不出结果 python点击运行 终端无反应_python终端运行不出结果


upfirdn2d.py最开始部分如下:

python终端运行不出结果 python点击运行 终端无反应_python_02


两个文件在同一个目录下,目录里的文件如下:

python终端运行不出结果 python点击运行 终端无反应_linux_03


懂pytorch的都知道,pytorch利用torch.utils.cpp_extension构建CUDA/C++拓展,将cpp和cu文件做成.so动态库供python调用,生成的.so文件自动缓存到临时目录:

python终端运行不出结果 python点击运行 终端无反应_python_04


可以看到upfirdn2d文件夹下有一个lock文件,这就是导致卡死的原因,可参考链接 于是我用命令把它删除后,就可以运行了。第三步:找到问题原因,这还不够

每次运行都得编译生成.so文件在导入,这导致启动程序很慢,所以我索性直接将两个.so文件复制在fused.act.py,upfirdn2d.py同级目录下,直接import这两个.so文件于是就成了这样:

fused.act.py开头部分:

python终端运行不出结果 python点击运行 终端无反应_pytorch_05


upfirdn2d.py开头部分:

python终端运行不出结果 python点击运行 终端无反应_linux_06


这样修改后,每次启动程序就不需要编译生成.so文件,直接从同级目录下导入.so文件即可,加快程序运行时间。