踩坑踩坑之Flask+ uWSGI + Tensorflow的Web服務部署
- 2019 年 10 月 9 日
- 筆記
一、簡介
作為演算法開發人員,在演算法模組完成後,擬部署Web服務以對外提供服務,從而將演算法模型落地應用。本文針對首次基於Flask + uWSGI + Tensorflow + Nginx部署Web服務時可能會遇到的問題進行簡要分析,並提供解決方案,以供大家參考。
二、環境介紹
OS:CentOS 7.0, 記憶體:16G,系統盤:40G,無掛載盤。
備註:本文作者因環境資源的限制,踩過環境的坑,故此對系統配置也給出。
三、報錯異常與解決方案
1) cannot allocate memory for thread-local data: ABORT
在基於TensorFlow的服務啟動過程中,在輸出CPU頻率後報出該錯誤,第一反應則為記憶體不夠,查看了下記憶體,雖然只剩6G左右,但是考慮到還有交換分區的空間,應該不是問題,驟然查看硬碟空間,發現幾乎快佔用完了。
解決方案:若硬碟資源充分,可增加掛載盤;若資源緊張,可刪減系統盤空間,以便給交換空間擴容,避免存在記憶體分配不足的風險。
2) what(): Resource temporarily unavailable
由於在服務配置uWSGI的參數中受buffer-size與limit-as的影響,導致分配的空間不夠,導致服務不可用。
解決方案:合理調整一下buffer-size與limit-as的值,即提高上述參數的大小,以滿足服務的需求。
備註:部署服務時中間鏈路較多,殊不知某個地方的參數配置則可能給自己挖了個坑。
3) terminate called after throwing an instance of ‘std: bad_alloc’
同上所示,受buffer-size與limit-as的影響,以致服務不可用。
解決方案:進一步調整一下buffer-size與limit-as的值,即提高上述參數的大小,以滿足服務的需求。
4) 基於Tensorflow載入圖模型後,調用session.run()後,Web服務卡住
由於考慮到服務部署採用全局的模型在後續的服務中調用,故對該全局模型進行載入,在普通Flask服務中測試通過,但是部署在uWSGI + Nginx時一直阻塞。主要是原因是uWSGI採用多執行緒調用Flask服務,即對於上述全局的模型,若是初始化後,會被每一個執行緒複製一次,即每個執行緒會有一個自己獨立的全局圖模型,但在後續調用服務時,會導致session的阻塞。
解決方案:使上述所有的執行緒共享同一個全局的圖模型,即不在多個執行緒中進行複製,可基於Flask調用鉤子函數before_first_request載入全局的圖模型,從而解決上述問題。
備註:受經驗影響,載入全局的模型後理所當然認為多執行緒共享同一個,但是多執行緒複製後,實則有一些影響,在此不再詳細闡述。由於該問題在網路上檢索時出現較少,困擾了本文作者大約半天時間,希望能給大家提供參考。
5) 服務調用中module未能正確識別,即uWSGI中Python解析器版本不一致
在採用pip install uwsgi後,潛意識中任務已經安裝完畢uWSGI,但是在實際運行時,uWSGI識別的Python版本可能存在不一致,導致在開發環境上驗證過的服務未能正確部署。
解決方案:首先基於uwsgi –python-version查看當前uWSGI識別的Python解析器,若出現與預期版本(主要為Python2與Python3)不一致時,可進行重裝。若是多次重裝無效,則直接採用uwsgi的源碼進行安裝。
四、總結
本文作者對首次採用uWSGI + Flask + Tensorflow部署web服務進行了實踐,針對遇到的問題進行了簡要分析,並提供了解決方案以供大家參考。至於出錯部分的深入原理,例如session.run()卡住等問題,在後續將會逐步展開,敬請關注。
作者:志青雲集 劉勇 [email protected]
出處:https://www.cnblogs.com/lyssym/p/11643256.html
如果,您認為閱讀這篇部落格讓您有些收穫,不妨點擊一下右下角的【推薦】。
如果,您希望更容易地發現我的新部落格,不妨點擊一下左下角的【關注我】。
如果,您對我的部落格所講述的內容有興趣,請繼續關注我的後續部落格,我是【志青雲集】。
歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接。