【Django】项⽬中调⽤深度学习模型model.predict()(Django两种启动。。
⽬录
问题
部署含有深度学习模型的Django项⽬的uWSGI、Nginx服务器的时候,所有模块都可以正常运⾏,也可以实现并发。唯独在处理需要调⽤深度学习模型的请求的时候⽆法成功运⾏,也不报错,之后逐⾏debug发现总是卡在模型的model.predict()这个函数中没法继续运⾏,在此记录⼀下。
另外曾⼀度怀疑是cpu跑不动了还更换了云主机,换成了有GPU的云主机,⼜掉进了显卡驱动的⼀堆坑中。附上。
测试
直接runserver启动django,然后从http端⼝访问,可以成功调⽤深度学习模型;
通过uwsgi配置http并启动django,然后从http端⼝访问,⽆法调⽤深度学习模型,不报错;
通过nginx经socket访问uwsgi再启动django,然后从socket端⼝访问,⽆法调⽤深度学习模型,不报错;
鉴于其他模块都可以正常使⽤,直接怀疑是uWSGI的部署除了问题,检查uwsgi.ini,折腾了⼀阵⼦由于uwsgi配置项太多,折戟⽽返。于时借助其他的⼯具查问题所在。
先⽤到了uwsgitop,看uwsgi负载情况,在uwsgi.ini设置了stats端⼝为127.0.0.1:8001,故使⽤该端⼝即可查看性能。
django怎么学
$ pip install uwsgitop
$ uwsgitop 127.0.0.1:8001  #实际上⽤curl 127.0.0.1:8001可以看到json格式数据,只是不直观
可以看到正常情况下负载如下
各参数含义如下
当我调⽤深度学习模型的时候,worker总是处于busy状态,但是其他参数跟cheap的worker⼀样,⼀直卡着不动了。于是使⽤lsof查看运⾏情况
(root)$ lsof -nPp pid 看卡住的pid
调⽤深度模型时的lsof -nPp 2256:
不调⽤深度模型时的lsof -nPp 32735:
结合netstat -anpt查看端⼝使⽤情况发现9001端⼝和45728端⼝建⽴链接总是处于CLOSE_WAIT状态,⽽在没有调⽤深度模型的时候就不会出现这种情况。实际上这是因为调⽤深度模型的时候,程序执⾏不下去,nginx没法得到结果所以只能保持close_wait状态。
只到了结果,没到原因。
继续使⽤strace查看运⾏情况
$ strace -ttp pid  #看卡住的pid
调⽤深度模型时strace:
参考
这⾥futex操作正在等待另⼀个线程释放⼀个锁
于时索性不启动线程,且之启动⼀个进程,在uwsgi.ini⾥⾯再次配置如下
$ master =false#不启动主进程
$ processes =1#最⼤进程数为1
$ cheaper =0#最⼩进程数为0
发现成功运⾏深度学习模型。
解决⽅法
总结⼀下:之所以只能⽤⼀个进程且主线程不能开启,是因为深度学习模型调⽤的时候都需要⼀段时间,如果有多个进程势必会争夺资源,即使只有⼀个请求的时候,可能是因为主进程和⼦进程同时在运⾏导致没法调⽤深度学习模型。另外除了上⾯的三个限制,其他限制还有下⾯两条:
不能将项⽬中存放且要⽤的图⽚和视频作为静态资源被收集,收集的静态资源⼀般都是css,html,js这些;
不能开启thunder-lock;
建议关闭stats,因为主进程不开启的话就没办法使⽤stats,再打开也是多次⼀举
另外似乎因为没有主线程的关系(只有⼀个进程),现在要杀掉⼀个uwsgi,如果不能通过uwsgi --stop uwsgi.pid 来杀uwsgi⽽是通过删除占⽤端⼝的pid,则需要删除很多个pid对应的程序,⽐之前⿇烦很多,⽤这个fuser -k (uwsgi的socket号)/tcp⽅便⼀些,更快捷的⽅法
是killall -9 uwsgi
⽬前为⽌,通过uwsgi依然只实现了单进程,没法并发处理请求,更别提并⾏。为了进⼀步提⾼并发并⾏性能,只开1个processes并且尝试打开多线程,
$ enable-threads=true
$ threads =4
再次测试,由于线程之间资源共享,此时多个线程可以并发(因为GIL所以不能并⾏),服务器也相对稳定,暂时可以满⾜需求,但毕竟只有⼀个进程,要进⼀步提⾼并发能⼒的话,关键是要解决多进程调度的问题。
这⾥考虑两个可能造成只能开启单线程的原因:
使⽤了from dule_loading import autodiscover_modules的⽅式,可能导致模型变成了全局变量,在多进程争夺资源的时候引起阻塞。
本⾝就需要使⽤来⽀持多进程的调度
这个问题需要解决才能实现Nginx+uWSGI实现⾼并发,充分利⽤多核计算资源。这⾥就涉及到了runserver和uwsgi两种启动⽅式的区别。
Django两种启动⽅式runserver和uwsgi的区别

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。