LKY 只有原創內容的 Blog

今之能者,謂能轉貼,至於魯蛇,皆能轉貼。不原創,何以別乎?

如何用Docker高效部署Python寫的機器學習推論服務

Lin, Kao-Yuan's Avatar 2021-05-02

  1. 1. 準備
  2. 2. 觀念
  3. 3. 操作
  4. 4. 延伸
  5. 5. 待解決問題:

這一篇是我個人近期的經驗總結。個人感覺與 Docker 相見恨晚,要是早點懂,以前做的機器學工具,效果都能放大很多倍了。

以前總覺得把程式碼放到別的 server、別的電腦上跑,要搞定各種環境細節上的差異,是一件骯髒的苦差事。自從有了 Docker,一切都變得輕鬆快速無負擔。

每次一鍵部署(如上圖)都覺得很爽快!從改完程式碼到上線生效,就只有一行指令的距離(前提是網路穩定、指令編寫正確)。

準備

  • 必須:
    • 開發機&目標機,都要安裝 Docker
    • 至少需要寫一個簡單 server(建議 Python+Flask),方便推論數據進出虛擬機
  • 建議:盡可能不要把只有訓練才用到的東西(程式碼、數據、函式庫)部署出去,所以能做以下這些事:
    • 「訓練&推論」數據分離
      • 不必分開放。兩種數據不在同一個文件內,路徑能區分清楚就好。
    • 「訓練&推論」城市碼分離
      • 前提:模型能存檔,可用 pickle r/w。
    • pip install 加速與減負
      • –no-cache-dir 映像是免洗筷環境,不快取,爭取輕量
      • 中國大陸內 proxy
        • pip3 install XXX -i https://mirrors.ustc.edu.cn/pypi/web/simple/
      • requirements.txt 定向瘦身
        • pip3 install pipreqs
        • pipreqs .(在要部署的repo內)
        • 效果?
          • 1.54GB VS 424MB
          • 大的已經手動刪除很多 package,還是這麼大。手動刪除效果比不上自動工具。

觀念

  1. Docker 虛擬機是一個小黑屋
  2. 人可以用,但不能親自操作
  3. 一切操作都要寫在一張紙上,請 Docker 管家代辦
  4. 這張紙叫做 Dockerfile (第一個字母必須大寫)
  • Dockerfile 上的交辦事項分兩大類:
    • 如何裝修?(一次性設置)
    • 以後每次進門的慣例?(重複使用)
  • Dockerfile 的好處&不足:
    • 強迫開發者把環境設定寫成程式碼,可標準化、可輕易重復。
    • 對機器學習來說,Dockerfile 只能標準化推論與部署。訓練與演算法的內涵 Docker 管不到,還是要主動寫才會留下。(這句看起來很像「一分鐘有60秒」之類的廢話,但很真的很多主管不懂機器學習)
  • Dockerfile 將會與 Python 程式碼一起維護,是整個 repo 程式碼的一部分。
  • Dockerfile 的寫法,就是打包服務的重點。

操作

  • 撰寫 Dockerfile
  • docker build(裝修)
  • docker run(執行慣例)
  • 上述操作失敗的應對方式:說清楚太麻煩,我靠大量練習與肌肉記憶

延伸

  • Python官方鏡像各版本差異
    • https://hub.docker.com/_/python Image_Variants
  • 製作運行 Python 的 docker image 前,如何選擇 docker 基底鏡像?
    • https://aws.amazon.com/cn/blogs/china/choose-the-best-docker-image-for-your-python-application/
  • bash 一鍵部署
    • 如何撰寫 bash
    • Linux 子帳號權限設置
    • put ssh pub key to the server
  • log 或其他 container 產生數據
    • container 如免洗餐具,隨時消失、隨時可棄,不應該留存數據。
    • 數據保存應該用 mount 或 volume。

待解決問題:

  • Python 演算法或模型,是否應該用 mount 做到彈性更新?
  • 多個虛擬機連動:docker compose
本文最后更新于 天前,文中所描述的信息可能已发生改变