大体情况是这样的,我在本地用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最开始部分如下:

upfirdn2d.py最开始部分如下:
在这里插入图片描述
两个文件在同一个目录下,目录里的文件如下:
在这里插入图片描述
懂pytorch的都知道,pytorch利用torch.utils.cpp_extension构建CUDA/C++拓展,将cpp和cu文件做成.so动态库供python调用,可参考链接,生成的.so文件自动缓存到临时目录:
在这里插入图片描述
可以看到upfirdn2d文件夹下有一个lock文件,这就是导致卡死的原因,可参考链接
于是我用命令把它删除后,就可以运行了。

第三步:找到问题原因,这还不够
每次运行都得编译生成.so文件在导入,这导致启动程序很慢,所以我索性直接将两个.so文件复制在fused.act.py,upfirdn2d.py同级目录下,直接import这两个.so文件于是就成了这样:
fused.act.py开头部分:
在这里插入图片描述
upfirdn2d.py开头部分:
在这里插入图片描述
这样修改后,每次启动程序就不需要编译生成.so文件,直接从同级目录下导入.so文件即可,加快程序运行时间。

Logo

更多推荐