基於Python技術棧的算法落地踩坑

背景介紹html

  在一些業務場景,咱們須要把離線訓練好的模型以微服務部署線上,若是是簡單的使用sklearn pipeline,能夠保存爲XML格式的pmml供Java調用,
在配置爲4 core,8G內存的docker環境能夠提供8K左右的高併發,而且這種docker能夠快速大規模部署到PaaS雲平臺,優點至關明顯,實際狀況是
算法人員會基於Python自定義lambda處理數據,而自定義的lambda是很難保存到pmml中的,而且不少公司的算法團隊也是要求基於Python技術棧是python

落地的。linux

踩坑過程web

  算法人員序列化訓練好的模型無外乎pkl 、h5,就以pkl爲例,pkl中包含了數據的預處理、模型的pipeline等,把這種模型包裝爲微服務也不難,能夠算法

選擇flak+gevent+Gunicorn,前兩個能夠包裝標準的API接口,Gunicorn是web容器能夠提供異步高併發服務,在測試服務器(8 cores, 16G內存)QPS達到docker

10K +,性能仍是能夠的。shell

  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

相關文章
相關標籤/搜索