2020年4月

在阿里云 vgn5i 实例上部署深度学习环境,服务器系统为 Ubuntu 16.04

1. 安装 GRID 驱动

https://help.aliyun.com/document_detail/118852.html

按照此文档安装 GRID 驱动,注意 vGPU 需要使用专用的 GRID 驱动,安装普通驱动是无法识别虚拟卡的,且安装完驱动之后需要按照文档获得许可才可以实际使用 CUDA。在没有获得许可之前,虽然torch.cuda.is_available()返回的是True,但实际上到了代码中model.to(cuda)这一步还是会报RuntimeError: CUDA error: all CUDA-capable devices are busy or unavailable错误。

2. 使用 systemd + gunicorn 部署项目

这一步创建了个没有 sudo 权限的用户ob来跑项目,保证生产环境上服务器安全。代码放在/home/ob/ob_cuda_server目录下。坑点在于 systemd 中 anaconda 环境的切换,解决办法就是在 service 配置里指定环境变量 PATH 就直接是对应的 conda 下的 env/bin 目录,就不会用冲突了。

2.1 安装项目依赖

按照此文档下载 anaconda 并配置国内源

https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/

创建虚拟环境:

conda create -n ob_prod python=3.6

切换到此环境:

conda activate ob_prod

通过 conda 安装 torch:

conda install pytorch torchvision cudatoolkit=10.1 -c pytorch

通过 pip 安装其他依赖:

pip install flask opencv-python numpy

其中 opencv-python 可能会缺少一些系统 so 库,稍后运行程序时如果提示缺少某 lib 文件则需要使用 apt 安装对应的库。

2.2 配置生产环境

安装 gunicorn 进行生产环境部署以提供更好的性能:

pip install gunicorn

安装好之后可以使用gunicorn -w 8 -b 0.0.0.0:9001 main:app来部署项目看看效果

另开一个会话使用 curl 测试服务是否在线:

(base) syf@obulb:~$ curl localhost:9001
ob cuda server online!

可以看到已经返回了自定义的首页信息

确认可以运行后按Ctrl+C停止,后面用 systemd 来启动管理守护进程。

为了守护项目进程,让其后台自启运行,需要写一个 service 配置将 gunicorn 写入 systemd 服务。

新建/etc/systemd/system/ob_cuda并编辑:

[Unit]
Description=ob cuda server
After=network.target

[Service]
User=ob
WorkingDirectory=/home/ob/ob_cuda_server
Environment="PATH=/home/ob/anaconda3/envs/ob_prod/bin"
ExecStart=/home/ob/anaconda3/envs/ob_prod/bin/gunicorn -w 8 -b 0.0.0.0:9001 main:app
# gunicorn 多线程加载模型可能会造成显存不足或其他问题,如果用此部署后有问题则直接跑 flask,就可以解决:
# ExecStart=/home/ob/anaconda3/envs/ob_prod/bin/python main.py

[Install]
WantedBy=multi-user.target

保存后重新加载 systemd:

sudo systemctl daemon-reload

写成 systemd 服务后就可以直接用 systemctl 来管理服务了:

设置开机启动:

systemctl enable ob_cuda

查看服务状态:

systemctl status ob_cuda

重启服务:

systemctl restart ob_cuda