這樣就不必在自己的 server 上裝很肥的套件了!只需要 call API 😎
本篇用簡單的方式來記錄一下好了,這樣之後需要的話,可以快速想起來當初是怎麼用的!
碎碎念一下
我為何研究這個?
2021 年的 7/1~7/3 參加了一場黑客松,我們這組其中有項 feature 要做:使用者傳皮膚照片給 LINE Bot,我們要把 model 預測出來的結果回傳給使用者。(預測是否僅是黑色素,或是有癌性的症狀)
我們當中的一個組員 Justin 把 model 的部分搞定了,但問題來了,該怎麼把 model 的部分結合進我們的 Flask 後端呢?
原本是想說,就直接在 pipenv 的環境下裝 tensorflow-cpu,但因為我們用來部署後端的 Heroku 免費帳戶有空間限制,這麼做是不可行的,除非花錢升級,但我覺得 CP 值不高⋯⋯
現在回過頭想,真的是非常感謝 Justin 對於這項 feature 的堅持,我們原本想說乾脆這個部分直接用模擬的算了,反正黑客松比較重要的是創新的 idea。倘若我們放棄掉了那項 feature,我看,這篇文應該也不會誕生,我也依然不知道該用什麼其他方法部署 ML models!
所以說,提個外話,人生就是這樣,你不去試,你永遠不會知道⋯⋯(詞窮了,反正你懂我意思xD)
我怎麼找到的?
我忘記我下什麼關鍵詞了,好像是「deploy ml model free」吧(?)
找到了這一篇:
How to Deploy a Machine Learning Model for Free – 7 ML Model Deployment Cloud Platforms
第一個就是 Algorithmia 了,也沒想太多,就立馬註冊來試試。
Server 端
我是參考上面提到的那一篇推薦的「How to Deploy your NLP Model to Production as an API with Algorithmia」,寫得很好,不過我還是簡單記錄一下,讓之後能更快上手:
前置作業
寫好 model(或 function)
就是寫好一個 input 餵給它,它能 output 出東西的 model。
這個部分,先在自己的環境上完成吧!(或 Google Colab 之類的雲端環境)
為何我還說「或 function」呢?因為如果拿 Algorithmia 做非 ML 的 API 好像也行,只是就有點殺雞用牛刀的感覺了。
註冊 Algorithmia 帳戶
https://teams.algorithmia.com/signup
Create 一個新的 Algorithm
Home → Create New → Algorithm → 填一填 → Create New Algorithm
這樣就創建好囉!
上傳靜態檔案
像是 pre-trained 好的 model 或者是 csv 檔之類的靜態檔案。
Data Sources → My Hosted Data → New Collection → 填一填 → Create Collection → 你會的
上傳完以後,檔案右側會出現「垂直的三個點點」,點開後有個「Copy Path」,複製起來,待會會需要用到,其格式為:data://:username/:collection/:filename
把 code 加進去
Algorithms → Source Code → 把之前寫好的 code 加進去
咦?直接複製貼上就行了嗎?不!有些要點,我把它列下來:
import 套件
套件直接 import 進來沒問題,要記得在上方的 DEPENDENCIES
加進套件,這樣在 build 的時候,環境就會幫我們裝好那些套件囉!
(套件名稱請參考 PyPI)
存取靜態檔案
剛上傳的靜態檔案該怎麼加進來呢?這個部分花了我不少時間 debug,後來才發現,必須要用到 Algorithmia 這個套件才能存取!
像我原本以為是這樣寫:
1 | model_file = 'data://:username/:collection/:filename' |
後來才知道應該要這樣寫:
1 | client = Algorithmia.client() |
function
function 的部分,也可以直接把它當成一般的 function 來寫,但有一個 function 比較特別,它叫做 apply(input)
。
它是什麼?可以把它想成,它就是 C++ 裡面的 main function,而實際上,它就是能讓外部 call 它的 interface!
1 | # API calls will begin at the apply() method, with the request body passed as 'input' |
所以說,其他的 function 都只是輔助,最後要把那些 function 放進 apply(input)
裡面才有作用哦!
input
input
這個 parameter 的格式呢?該怎麼去處理呢?注意哦,apply()
好像只能有一個 parameter,所以如果想傳很多 parameter 給它,可以把 input
當成一個 dictionary 來看:
1 | # 外部傳進來的 input 格式 |
這是我目前想到最好的解決辦法,或許還有更好的方式處理這部分(?)
發布
BUILD → 等它處理一段時間 → 可以在下方的 Console 直接輸入 input 測試一下,像是 { "food": "草莓果醬", "option": 2 }
→ PUBLISH → 後面就照著步驟走
Client 端
Algorithms → Overview → 往下滑有個 Install and Use → 照著上面做就行囉!
大概會長這樣:
1 | import Algorithmia |
就是這麼簡單 😎
希望讀完這篇文章的您能夠有所收穫,我們下篇文見啦 😃