前阵子参考一份外文的教程(https://www.pyimagesearch.com/2018/02/05/deep-learning-production-keras-redis-flask-apache/)在云端部署了一项深度模型web服务,其中反反复复最繁琐的就是环境配置(中间出了一点波折,还曾经在在winServer上配了一次),下面捡其中重要的记录一下。
环境:ubuntu 16.04 + apache 2.4.18 + redis 3.0.6 +
mod_wsgi 4.6.4 + flask 1.0.2(based on python 3.5.2)
apachectl -v 查看当前apache版本
redis-server -v 查看当前redis版本
ubuntu系统一般会自带apache2,但注意这是一个非完整版的apache,其中剔除了如asxp这样的编译工具,在测试apache的hello world的时候不涉及这些,但到了要安装mod_wsgi的时候就会报错,告诉你缺少asxp,要解决这个问题,需要安装额外的部件apache-dev。
(sudo) apt-get apache2-dev
安装了完整的apache组件后,我们可以先测试一下,开启apache2的服务
service apache2 start
默认的访问端口在80,打开浏览器,键入 http://localhost/ 或者 http://xxx.xxx.xxx.xxx/,正常的话应该可以看到apache2的测试页面(这里一般是不需要把端口号写明的,服务控制会自动地把http类的请求转到80端口)。
apache2存放测试页面的目录是 /var/www/html,之后我们自己的web应用或是页面一般也是放在这个目录下。(直接放进去或是用软连接)
在有GPU的设备上使用深度学习框架,需要cuda和cuDNN的支持,在安装之前,你需要到下面的网站查看自己的GPU是不是支持cuda(有许多系列是不支持的)
https://developer.nvidia.com/cuda-gpus
到下面的网站选择你需要的CUDA版本,找到链接后wget下载。
https://developer.nvidia.com/cuda-toolkit-archive
安装的时候有可能报出警告,告诉你找不到GPU硬件驱动,如果你确定GPU是支持CUDA的,可以去查看一下自己的驱动版本, nvidia-smi打印的信息中就有。CUDA在Linux下的安装过程比较简洁,到了windows可能还要配一配环境变量。
如果你的驱动版本确实有问题,可以到nvidia官网更新你的驱动:
https://www.nvidia.cn/Download/index.aspx?lang=cn
cuDNN,是一个专门用于支持深度学习的组件,CUDA安装之后才可以安装cuDNN,链接如下,需要填一些信息才能下载,下载前看清楚其对硬件驱动和CUDA版本的要求。
https://developer.nvidia.com/cudnn
我们的web应用是用python编写的,需要python环境的支持,为了隔离不同的py版本和环境,我们构建一个虚拟环境。实际测试中发现,anaconda的体量略大,且安装耗时,所以,我们使用更为轻便的virtualenv。
virtualenv可以使用pip来安装
pip install virtualenv
pip install virtualenvwrapper (额外工具,可以理解成virtualenv的一个补丁)
安装完成,在 ~/.bashrc 中添加如下的内容:
export WORKON_HOME=/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh
不少的教程里会让你把WORKON_HOME设置在root目录(即 ~/)下,但由于我们是要提供web服务,root目录本身严格的访问权限限制会使之后服务软件无法调用其中的python解释器,apache会报错:
(13)Permission denied: mod_wsgi (pid=6099): Unable to stat Python home /root/.virtualenvs/web_app. Python interpreter may not be able to be initialized correctly. Verify the supplied path and access permissions for whole of the path.
Fatal Python error: Py_Initialize: Unable to get the locale encoding
ImportError: No module named 'encodings'
所以,我们选择将python虚拟环境安装在根目录下的一个隐藏文件夹中,用 ls -al 可以看到,.vritualenvs文件夹的权限为755。修改.bashrc之后需要激活操作。
source ~/.bashrc
我们利用ubuntu中已有的python3.5编译器创建一个虚拟环境。
mkvirtualenv --python=/usr/bin/python3.5 venv_name
具体的解释器执行文件的路径可以用 whereis python 查看,虚拟环境创建完成后,用如下命令激活
workon venv_name
激活了环境后,你就可以随意地用pip安装需要的包了,退出环境使用:
deactivate
为了让你的apache可以部署用python编写的应用,需要一个接口:WSGI。它可以作为一个mod添加到apache中。mod_wsgi的安装是之前环境配工作中最折腾人的一环,因为它有各种各样的安装方法,你不知道哪一种对于你来说是合适的,关于这些安装方法,pypi上有一篇十分完整的说明:https://pypi.org/project/mod_wsgi 在尝试了几乎所有的安装方法后,我发现pip安装是最高效稳定的,安装命令如下:
pip install mod_wsgi (虽然是pip安装,但还是需要gcc5和asxp的支持)
pip安装之后,mod_wsgi可以安装后还需要将其连接到apache2中,使用命令
mod_wsgi-express module-config
查看当前的PythonHome与.so文件的路径,在我的云主机上,这条命令的返回结果是:
LoadModule wsgi_module "/.virtualenvs/keras_flask/lib/python3.5/site-packages/mod_wsgi/server/mod_wsgi-py35.cpython-35m-x86_64-linux-gnu.so"
WSGIPythonHome "/.virtualenvs/keras_flask"
将上面内容添加到apache2的配置文件 /etc/apache2/mods-available/wsgi.load (即使原本没有这个文件,你也可以自己添加)。配置文件保存之后,我们就可以让apache2加载这个新的mod:
(sudo)a2enmod wsgi
mod使能之后再重启apache2:
(sudo)service apache2 restart
安装redis没有经历什么波折,直接(sudo)apt-get redis-server 即可,之后要启动数据库就直接redis-server即可。redis默认的端口号是6379,当程序非正常关闭时,这个端口会被持续地占用,想要在开就要kill掉之前的进程,释放这个端口。
主要参考:https://www.pyimagesearch.com/2018/02/05/deep-learning-production-keras-redis-flask-apache/