基于Python技术栈的算法落地踩坑
背景介紹
在一些業務場景,我們需要把離線訓練好的模型以微服務部署線上,如果是簡單的使用sklearn pipeline,可以保存為XML格式的pmml供Java調用,
在配置為4 core,8G內存的docker環境可以提供8K左右的高并發,并且這種docker可以快速大規模部署到PaaS云平臺,優勢相當明顯,實際情況是
算法人員會基于Python自定義lambda處理數據,而自定義的lambda是很難保存到pmml中的,并且很多公司的算法團隊也是要求基于Python技術棧是
落地的。
踩坑過程
算法人員序列化訓練好的模型無外乎pkl 、h5,就以pkl為例,pkl中包含了數據的預處理、模型的pipeline等,把這種模型包裝為微服務也不難,可以
選擇flak+gevent+Gunicorn,前兩個可以包裝標準的API接口,Gunicorn是web容器可以提供異步高并發服務,在測試服務器(8 cores, 16G內存)QPS達到
10K +,性能還是可以的。
1)docker部署踩坑,Python工程根目錄下自己編寫docker file,可以從開源鏡像庫選擇自己的一款,Dockerfile里面命令行類似shell,比如下圖:
Python以來的相關模塊、工程路徑等要加上,接著docker build構建鏡像,把鏡像push到公司鏡像庫,在PaaS云平臺pull鏡像,整個流程不是太復雜,
但是壓測的時候,幾秒之內會發現docker的使用情況是CPU全部滿負載100%,內存倒是50%左右,其實模型就是簡單的分類算法,這其中的瓶頸主要是
兩方面的:
a)docker內部的Python應用與外部的通信鏈路比較耗時,優化代價較高,需要專業的docker專家來優化;
b)Python應用本身既要有多線程、多協程的開銷,是消耗CPU資源的,并且分類算法本身就是很耗費CPU資源的,屬于計算密集型,所以docker的CPU很快
滿負載,除非把算法的計算單獨剝離出去;
至此基于docker的Python微服務行不通。
2)直接把Python應用部署物理機,gunicorn作為web容器可以設置IP、port、工作進程數、最大并發數等等,可以參照gunicorn docs,具體策略有:
a)application部署采用多進程部署,代碼內部采用多線程、協程處理請求響應;
b)對于一些重復的請求參數,引入LRU cache既降低了延時也避免了重復調用;
c)由于Python是動態解釋語言,可以想辦法做到靜態語言的水平,借助cython可以把Python工程編譯為C文件及.so(linux)文件,這時可以把請求響應
延時進一步降低30%以上;
? 延伸:YouTube在使用Python構建高并發服務值得借鑒,使用Python做到快速靈活的開發和部署,使用psyco,一種Python到C的動態編譯器,該編譯器
使用一種JIT編譯方法來優化內層循環,再將內容完整的Python對象緩存起來,整體達到很高的性能。
refer:
https://gunicorn.org/#docs
https://www.cnblogs.com/break-python/p/5459169.html
https://docs.docker.com/engine/reference/builder/#format?
https://blog.csdn.net/wo18237095579/article/details/80540571
http://www.browserwork.com/architecture/youtube-architecture
轉載于:https://www.cnblogs.com/John-Geek-2018/p/9941943.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的基于Python技术栈的算法落地踩坑的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用Arcgis进行画面(线)并计算大小
- 下一篇: SSH学习(2)