卡尼多隨筆

認識自我 • 感受世界 • 創造價值

0%

用 Algorithmia 部署 ML Models

這樣就不必在自己的 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
2
model_file = 'data://:username/:collection/:filename'
model.load_weights(model_file)

後來才知道應該要這樣寫:

1
2
3
4
client = Algorithmia.client()
file_path = 'data://:username/:collection/:filename'
model_file = client.file(file_path).getFile().name
model.load_weights(model_file)

function

function 的部分,也可以直接把它當成一般的 function 來寫,但有一個 function 比較特別,它叫做 apply(input)

它是什麼?可以把它想成,它就是 C++ 裡面的 main function,而實際上,它就是能讓外部 call 它的 interface!

1
2
3
4
# API calls will begin at the apply() method, with the request body passed as 'input'
# For more details, see algorithmia.com/developers/algorithm-development/languages
def apply(input):
return "hello {}".format(input)

所以說,其他的 function 都只是輔助,最後要把那些 function 放進 apply(input) 裡面才有作用哦!

input

input 這個 parameter 的格式呢?該怎麼去處理呢?注意哦,apply() 好像只能有一個 parameter,所以如果想傳很多 parameter 給它,可以把 input 當成一個 dictionary 來看:

1
2
3
4
5
6
# 外部傳進來的 input 格式
{ "food": "草莓果醬", "option": 2 }

# 內部處理方式
food = input['food']
option = input['option']

這是我目前想到最好的解決辦法,或許還有更好的方式處理這部分(?)

發布

BUILD → 等它處理一段時間 → 可以在下方的 Console 直接輸入 input 測試一下,像是 { "food": "草莓果醬", "option": 2 } → PUBLISH → 後面就照著步驟走

Client 端

Algorithms → Overview → 往下滑有個 Install and Use → 照著上面做就行囉!
大概會長這樣:

1
2
3
4
5
6
7
8
9
10
import Algorithmia

input = {
"food": "草莓果醬",
"option": 2
}
client = Algorithmia.client('<default-key>')
algo = client.algo('<username>/<algorithm>/<version>')
algo.set_options(timeout=300) # optional
print(algo.pipe(input).result)

就是這麼簡單 😎


希望讀完這篇文章的您能夠有所收穫,我們下篇文見啦 😃