函數計算部署機器學習遇到的問題和解法

摘要: 隨着 Serverless 的流行,將應用遷移到雲上已經成了一種必然的趨勢。咱們今天來看一下如何將機器學習應用遷移到函數計算上。 1. 本地開發 首先咱們看一下本地開發機器學習應用的步驟。咱們大概能夠將本地開發歸納爲三個步驟,分別是代碼編寫,安裝依賴,運行調試。

隨着 Serverless 的流行,將應用遷移到雲上已經成了一種必然的趨勢。java

咱們今天來看一下如何將機器學習應用遷移到函數計算上。python

  1. 本地開發

首先咱們看一下本地開發機器學習應用的步驟。咱們大概能夠將本地開發歸納爲三個步驟,分別是代碼編寫,安裝依賴,運行調試。咱們分別來看一下。c++

1.1 代碼編寫docker

假定咱們的項目結構爲:npm

clipboard.png

其中 index.py 存放了機器學習相關的代碼,model_data 存放了數據模型,pic 中存放了要進行測試的圖片。app

index.py 的內容爲(代碼參考了這篇文章):less

clipboard.png

1.2 安裝依賴機器學習

在運行應用前,須要先安裝應用依賴的模塊,這裏主要依賴了 opencv 以及 tensorflow,安裝方法很簡單:maven

clipboard.png

執行完這兩條命令後,opencv-python 以及 tensorflow 就被安裝到系統目錄裏。Linux 下默認爲 /usr/local/lib/pythonX.Y/site-packages。函數

1.3 運行

運行時,python 會自動在配置的路徑下查找相關模塊並進行加載。

clipboard.png

通過這三個步驟,咱們就完成了本地機器學習應用的開發,咱們接下來看下如何遷移應用到函數計算。

  1. 遷移函數計算

2.1 本地開發與函數計算開發對比

首先,咱們須要作一些準備工做。讓咱們來思考下函數計算應用開發方式與本地應用應用的開發方式有什麼不一樣呢?

  1. 代碼入口。本地開發時,代碼能夠省略 main 函數,也能夠提供 main 函數做爲程序入口,但在函數計算中,函數入口是固定的,非 Http 觸發器的函數入口必須是一個包含了兩個參數的函數,好比:def handler(event, context)。
  2. 模塊依賴。本地開發時,項目依賴的模塊一般會被安裝到系統的某個目錄。好比咱們上面執行的 pip install tensorflow。而對於函數計算,因爲爲了可以最大限度的對應用進行優化,開放給用戶的操做空間一般是比較小的。所以,對於函數計算,目前還沒法作到安裝項目依賴到運行環境。咱們只能經過將自定義模塊一同打包的方式。參考。
  3. 運行。本地開發時,須要使用 python 命令或者 IDE 來運行代碼。而在函數計算,咱們須要首先部署應用到函數計算,再經過觸發器或者控制檯手動觸發執行。

接下來咱們針對這三點開發方式的不一樣對代碼進行改造。

2.2 改造代碼

2.2.1 代碼入口改造

這個比較簡單,只須要將

clipboard.png

修改成

clipboard.png

並刪除下面代碼:

clipboard.png

2.2.2. 模塊依賴

這一塊稍微複雜些。不一樣的語言由於模塊加載機制的不一樣,這裏的處理邏輯也會有差別。好比對於 java,不管是使用 maven,仍是 gradle,均可以很容易的一鍵將代碼以及依賴打包成 jar。但遺憾的是 python 目前沒有這種機制。

咱們先根據場景對 python 依賴的模塊作個簡單的分類。

應用依賴: 對於本例中使用 pip 安裝的模塊,好比 pip install tensorflow,咱們暫且將其稱爲應用依賴。

系統依賴: 在某些場景下,python 安裝的庫僅僅是對底層 c、c++ 庫調用的封裝,例如使用 zbar 時,除了使用 pip install zbar,還要在系統中安裝相應的庫:apt-get install -y libzbar-dev。咱們暫且把像 libzbar-dev 同樣須要使用系統軟件包管理器安裝的庫稱爲系統依賴。

資源依賴:對於一些應用,好比機器學習,啓動後還須要加載數據模型,數據模型須要在程序啓動時準備好,咱們暫且將這種依賴稱爲資源依賴。資源依賴比較特殊,它是咱們的應用邏輯所須要的,一般體積比較大。

對於應用依賴,咱們能夠經過 pip 的 -t 參數改變其安裝位置,好比 pip install -t $(pwd) tensorflow。而且能夠經過 sys.path 改變加載行爲,使得能夠從指定目錄加載模塊。

對於系統依賴,咱們能夠經過 apt-get 下載 deb 包,再利用 deb 包安裝到指定目錄。

clipboard.png

對於系統依賴包含的連接庫,能夠經過 LD_LIBRARY_PATH 變量改變其加載行爲。

對於資源依賴,由於控制權在咱們的代碼裏,所以只須要改變代碼的處理邏輯就能夠了。

根據上面的描述,咱們能夠整理成下面的表格:

clipboard.png

2.2.3 下載依賴的邏輯

對於咱們的 demo 應用,存在兩種依賴,一種是應用依賴,另外一種是資源依賴。而須要咱們特別處理的只有應用依賴。咱們須要在項目目錄下建立一個名爲 applib 的目錄,並下載應用依賴到該目錄。這裏須要注意的是若是引用的模塊使用 C / C++ / go 編譯出來的可執行文件或者庫文件,那麼推薦使用 fcli 的 sbox 進行下載,使用方法爲:

clipboard.png

執行完畢後,就會發現 applib 中就包含了項目所須要的應用依賴。

2.2.4 打包依賴上傳到 OSS

機器學習的應用依賴、資源依賴一般比較大,會很容易超過函數計算對代碼包的限制(50M)。爲了避開這個問題,咱們須要將這些依賴上傳到 OSS

clipboard.png

執行完畢後,項目會多出一個名爲 applib.zip 的壓縮包,上傳到 oss 便可。

一樣的,對資源依賴進行相同的操做:

clipboard.png

2.2.5 初始化依賴

這裏咱們提供一個模板代碼,負責在函數第一次啓動時,從 OSS 下載資源到本地、解壓,並配置好相應的環境變量。咱們能夠在項目中建立一個名爲 loader.py 文件,內容爲:

這裏咱們提供一個模板代碼,負責在函數第一次啓動時,從 OSS 下載資源到本地、解壓,並配置好相應的環境變量。咱們能夠在項目中建立一個名爲 loader.py 文件,內容爲:

clipboard.png

這段代碼會首先讀取 AppLibObject 環境變量,用於從 OSS 下載應用依賴,並解壓到 AppLibDir 這個環境變量所表明的目錄。

其次會讀取 ModelObject 環境變量,用於從 OSS 下載資源依賴,並解壓到 ModelDir 這個環境變量所表明的目錄。

最後,當依賴準備穩當後,會調用 index.py 中的 handler 函數。

理論上,這個代碼能夠用於其它任何須要下載應用依賴、資源依賴的場景。而咱們的 index.py 須要修改的,只有將原先的獲取模型依賴的固定的路徑,修改成利用 ModelDir 獲取路徑便可。

2.3 本地運行調試

代碼編寫完成後,咱們的目錄結構調整爲:

clipboard.png

咱們本地運行看下效果,這裏咱們藉助於函數計算推出的 fc-dcoker 工具。

爲了不本地每次調試作無謂的下載,咱們取下巧,將應用依賴、資源依賴掛載到 fc-docker 中,並開啓 local 的標識:

clipboard.png

2.4 部署

本地開發完成,接下來,咱們就須要部署應用到線上了。這裏咱們藉助函數計算推出的 Fun 工具。

Fun 工具使用步驟以下:

  1. 去 release 頁面對應平臺的 binary 版本,解壓就可使用。或者使用 npm install @alicloud/fun -g 也能夠直接使用。
  2. 使用 fun config 配置 ak、region 等信息。
  3. 編寫 template.yml
  4. fun deploy 部署

是的,不須要登陸控制檯進行繁瑣的配置,僅僅在項目下提供一個 template.yml 便可:

clipboard.png

至此,咱們的項目中又多了一個 template.yml,結構爲

clipboard.png

經過這一個 template.yml,執行 fun deploy 後便可建立好相應的服務、函數,並配置好函數的環境變量。

clipboard.png

即便修改了代碼,只要重複執行 fun deploy 便可。

接下來,打開 https://fc.console.aliyun.com/ 控制檯,依次找到建立好的服務、函數,點擊執行,便可獲得與本地一致的輸出:

clipboard.png

2.5 補充

在上面的例子中,咱們只列出了應用依賴、資源依賴的狀況。對於系統依賴的處理邏輯是比較簡單的,好比咱們拿 zbar 舉例。除了須要在 applib 中經過 pip 安裝 zbar,還要在 code 目錄下新建一個 lib 目錄,並經過 sandbox 在這個目錄中執行:

clipboard.png

執行完成後,目錄結構變化爲:

clipboard.png

就像上面提到的,咱們須要修改 LD_LIBRARY_PATH 來改變系統依賴的加載行爲,所以咱們須要在 template.yaml 中的 EnvironmentVariables 下添加一行:

clipboard.png

至此,就能夠直接在 index.py 等文件中直接使用 zbar 了。

  1. 總結

結果一番努力,咱們終於將機器學習應用上線到函數計算了。回顧上面的全部操做能夠發現,其實大部分的改造工做都是能夠經過工具解決的。不管是 template.yml,仍是 loader.py 都是直接拿來就能用的。而真正須要開發者操做的也就只有下載依賴、修改對資源依賴的引用路徑了。

本文做者:tanhe123

閱讀原文

本文爲雲棲社區原創內容,未經容許不得轉載。

相關文章
相關標籤/搜索