踩坑踩坑之Flask+ uWSGI + Tensorflow的Web服務部署


一、簡介

        作為算法開發人員,在算法模塊完成后,擬部署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()卡住等問題,在后續將會逐步展開,敬請關注。

 

   


      作者:志青雲集  劉勇 lyssym@sina.com
      出處:https://www.cnblogs.com/lyssym/p/11643256.html
   如果,您認為閱讀這篇博客讓您有些收獲,不妨點擊一下右下角的【推薦】。
   如果,您希望更容易地發現我的新博客,不妨點擊一下左下角的【關注我】。
   如果,您對我的博客所講述的內容有興趣,請繼續關注我的后續博客,我是【志青雲集】。
   歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM