PyTorch CUDA进程在Flask debug模式下死锁原因推测
基于Flask部署的PyTorch模型HTTP
API在debug模式下偶现死锁问题,无法被kill
掉,reboot
或shutdown
无法正常重启,nvidia-smi
无法调出。初步推测可能与debug
模式下创建的两套进程有关。
PyTorch CUDA进程在Flask debug模式下死锁原因推测
1 问题描述
我通过Flask开发API,把基于PyTorch深度学习模型实现为HTTP接口。应合作方需求,需要把Flask函数中的一些变量内容输出到Flask日志中供查阅。因此我使用了Flask的logger来进行输出,并开启Flask application的debug模式。
运行后,出现过一次进程无响应的情况。API无法被调用,ps -aux
可以查看进程,但服务器上的kill
,
kill -9
无法杀死进程。nvidia-smi
无法掉出NVIDIA
GPU检视面板,reboot
,
shutdown -r now
均无法connect到service上,无法重启。
最终通过reboot -f
强制设备重启解决。
2 原因推测
通过一系列测试和调试。我发现flask启动debug mode的时候,nvidia-smi里会出现两个进程,进程执行的脚本及参数相同,但PID不同。
目前推测原因可能与Flask的debug mode有关。开启Flask的debug
mode后,Flask在debug
mode下会启动相同的两套进程,这两个GPU上的进程可能因争用资源而小概率出现死锁,内核态死锁后导致即使是kill的发出的signal
9也无法被进程接收,因此死锁进程无法被系统命令,如kill
命令正常关闭,GPU资源被锁导致nvidia-smi
无法执行并显示。