PyTorch CUDA进程在Flask debug模式下死锁原因推测

基于Flask部署的PyTorch模型HTTP API在debug模式下偶现死锁问题,无法被kill掉,rebootshutdown无法正常重启,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无法执行并显示。