Pytorch model Production部署探索
需求
利用Pytorch 训练好模型后,如何在生产环境部署目前还是一个探索中的问题,尚未形成比较统一的方案.
不像TensorFlow有比较好的生态,生产环境中可以将模型放到Serving上.
那为什么不到TensorFlow中进行模型的开发呢?主要是:觉得TensorFlow中开发太慢了,不太熟悉,更喜欢Pytorch.
那么尚没有比较完整生态的Pytorch模型应该怎么部署呢?
主要有几种不同的场景:
- 客户端部署(例如消费端本地,APP内等)
- 服务端
- API封装调用
API封装调用本质上来讲也是服务端部署,只是架构上做了一层分离,更容易scale,但是也可能需要付出更多的通信成本.
除了区分不同场景外,还有几种主要的操作方式,主要有:直接嵌入/模型服务(微服务/C++服务/云端部署/框架部署(MLFlow, Kubeflow, RedisAI,甚至TensorFlow Serving))
几种方式的基本介绍在Pytorch官网有一篇blog,谈了目前推荐的一些方案,可参考.Model Serving in PyTorch(https://pytorch.org/blog/model-serving-in-pyorch/)
背景
针对服务端做了两个尝试:
- 模型直接嵌入在web框架中(Django)
- 用C++ 起了一个服务,进行API调用
环境
mbp/Django/python3.6/torch1.1.0
这里可能需要说一下的是,如果torch版本不是最新稳定版本的话,可能需要注意一下,对结果影响也是挺大的.
评价标准
- 简洁性
- 速度/并发
其实主要测的还是并发,因为如果速度优势足够大的话牺牲一点简洁性也是可以接受的.
步骤
- 需要先将模型转译到C++环境,可以参考:LOADING A PYTORCH MODEL IN C++(https://pytorch.org/tutorials/advanced/cpp_export.html)
起一个C++web服务,具体我已将repo传到GitHub,详见:Pytorch-NLP-serving-inference-example(https://github.com/LG-1/Pytorch-NLP-serving-inference-example)
repo是完整的,环境OK的话可以运行测试.
- 模型直接在服务启动是setting中load
- 在项目内部调用
结果
其实步骤都比较简单
最关键的其实是我想记录一下测试结果.
原本想着用C++起服务可能会比较快一点,但是结果测下来,发现然而并没有(也有可能是我不熟悉C++的原因).
C++的RPS只能到20左右
Django嵌入可以到50左右.
另外,当然是后者的方式更简洁一些.
再另外,如果需要要在C++中做比较多的处理步骤,可能就会更不方便,比如分词.
所以,如果是图像一类,如果做得合适,还有可能用C++起个服务,但是NLP一类可能会更困难一些.
相对来说,Django嵌入的方式应该简单多了.
再再另外,
模型对系统版本,框架版本,部署线程等其实也挺敏感的,多试几次就好了++,搜索空间也不大.
Ubuntu 16.04/torch1.1.0/ gunicorn1
torch.set_num_threads(3)
1
gunicorn --env DJANGO_SETTINGS_MODULE=xxxx.settings xxxx.wsgi:application -w 3 -b 0.0.0.0:8001 -k gthread --thread 3 --max-requests 4096 --max-requests-jitter 512 --log-level=debug --timeout 120 --preload