1. 程式人生 > >基於Python技術棧的演算法落地踩坑

基於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