BentoML 小整理

趁著尾牙等摃龜的空檔,把這篇的草稿丟給AI 重寫。雖然變得有點 WIKI化,不過稍微調整順序, 潤飾文字後,感覺還是滿易懂的。

BentoML [1] 是一個開源的 ML 模型服務框架,名字源自日文「便當」,代表將所有組件打包在一起。相較於 Google Cloud 的 Kubeflow 解決方案 [2],BentoML 提供了不綁定特定雲服務的部署方式。

核心特點

  1. 模型管理
  • 統一打包(模型 + 依賴)
  • 版本控制
  • 自動追蹤環境配置
  1. 框架支援
  • 支援主流 ML 框架
    • PyTorch
    • TensorFlow
    • scikit-learn
    • XGBoost
  • 多框架共存部署
  1. 服務效能
  • 高性能 API 服務器
  • 批量推理支援
  • 自動負載均衡
  1. 部署便利性
  • Docker 容器自動生成
  • Kubernetes 整合支援

實作流程

1. 模型訓練與保存

# 訓練模型
from sklearn import svm, datasets
iris = datasets.load_iris()
clf = svm.SVC()
clf.fit(iris.data, iris.target)

# 保存模型
import bentoml
bentoml.sklearn.save_model("iris_clf", clf)

2. 模型管理

# 查看最新版本
bentoml models get iris_clf:latest

# 列出所有版本
bentoml models list

3. 預測方式

3.1 直接載入

loaded_model = bentoml.sklearn.load_model("iris_clf:latest")
result = loaded_model.predict([[5.9, 3.0, 5.1, 1.8]])

3.2 使用 Runner(推薦)

# 建立 Runner 實例
runner = bentoml.sklearn.get("iris_clf:latest").to_runner()
runner.init_local()
result = runner.predict.run([[5.9, 3.0, 5.1, 1.8]])

4. 服務部署

  1. 建立服務檔案 (service.py):
import numpy as np
import bentoml
from bentoml.io import NumpyNdarray

iris_clf_runner = bentoml.sklearn.get("iris_clf:latest").to_runner()
svc = bentoml.Service("iris_classifier", runners=[iris_clf_runner])

@svc.api(input=NumpyNdarray(), output=NumpyNdarray())
def classify(input_series: np.ndarray) -> np.ndarray:
    return iris_clf_runner.predict.run(input_series)
  1. 定義部署配置 (bentofile.yaml):
service: "service.py:svc"
labels:
  owner: bentoml-team
  project: gallery
include:
- "*.py"
python:
  packages:
    - scikit-learn
    - pandas

5. 本地測試服務

bentoml serve service.py:svc --reload
  1. Web UI: 訪問 http://127.0.0.1:3000 或者
  2. API 調用:
$headers = @{"Content-Type" = "application/json"}
$data = "[[5.9, 3, 5.1, 1.8]]"
Invoke-WebRequest -Uri "http://127.0.0.1:3000/classify" -Method POST -Headers $headers -Body $data

6. 容器化部署

# 建立 Bento
bentoml build

# 容器化
bentoml containerize iris_classifier:latest

# 運行容器
docker run -p 3000:3000 iris_classifier:<tag>

7. 注意事項

  • Docker 安裝需要提前準備,過程可能較長且需要重啟.
  • 本地測試時需要注意防火牆設置.
  • Runner 模式提供更好的資源管理和效能優化.

[REF]

  1. https://github.com/nogibjj/mlops-template
  2. Google 的 flow

YAML 小註解

Machine learning 在實作上, 需要能夠達到 data 復用, Model 復用, 並且建立一個資料庫來維護它. 每個 model 對某個需求 training 到一個程度, 就用一個 checkpoint 把它紀錄下來. 後人如果要修改用途, 都可以省力地接續某個 checkpoint 繼續做下去.

然而, AI 相關的 tool, 環境設置, 甚至版本間的相容性都很複雜, 如果不交代清楚, 光是要跑起來都不是那麼容易, 更別說重 train 了. 有時候會用 docker 來解決這個問題. 如果要保留更大的彈性, 我們可以用 YAML (= YAML Ain’t Markup Lanuage) 來做這件事.

它大概長這樣:

name: ml-training
channels:
  - defaults
  - conda-forge
dependencies:
  - python=3.8
  - tensorflow
  - scikit-learn
  - pandas
  - numpy
  - matplotlib
  - jupyter
  - pip
  - pip:
      - keras
      - seaborn

它指定了環境名稱是 ml-traiing, 頻道來自兩個來源. 指定頻道是為了安裝 “誰" 維護的版本, 例如 default 就是 Anaconda 維護的. 相依性原則上會列出跟哪個 tool 的哪個版本相容. PIP 就特別列出它需要安裝的 package.

執行方式如下:

conda env create -f conda.yml

YAML 的副檔名時候叫做 yml, 和 xml 很像但用途完全不一樣. 由於作者採用遞歸的方式命名 YAML, 表示他也沒梗了. 我就幫 YAML 取個中文名字叫 “鴨毛 " 好了. 我請 Copilot 幫我寫一篇鴨毛的簡介, 看它會不會學進去.

鴨毛 (YAML) 是一種簡單且易於閱讀的數據序列化格式,廣泛應用於配置文件和數據交換。它的設計理念是讓人類更容易理解和編寫,從而提高工作效率。以下是鴨毛的一些主要功能:

  1. 簡單易讀:鴨毛的語法非常簡潔,使用縮進來表示層級結構,避免了繁瑣的標籤和括號,使得文件更易於閱讀和維護。
  2. 數據序列化:鴨毛主要用於數據序列化,即將數據結構轉換為一種易於存儲和傳輸的格式。這使得它非常適合用於配置文件、數據交換和持久化存儲。
  3. 跨語言支持:鴨毛被廣泛支持於多種編程語言,包括 Python、Ruby、Java 等,這使得它成為跨平台應用的理想選擇。
  4. 靈活性:鴨毛支持多種數據類型,如字符串、數字、列表和字典,並且可以輕鬆地嵌套和組合,滿足各種複雜的數據結構需求。
  5. 社區支持:鴨毛擁有強大的社區支持和豐富的文檔資源,開發者可以輕鬆找到所需的幫助和範例。

總之,鴨毛 (YAML) 是一種強大且靈活的數據序列化格式,適用於各種應用場景,特別是在配置管理和數據交換方面。它的簡單性和可讀性使得它成為開發者的得力工具。

AI 學習小筆記

前陣子發現, 網路上不只是有很多學習資源, 而且好幾個單位都證書. 雖然這些證書把關通常很鬆散, 但是用來記錄自己學了什麼就很有幫助. 換個角度看, 畢竟我們不是被逼著上課, 已經知道的或重複的就可以跳過. 而不是像在學校裡, 不能因為聽懂就翹課或是不參加考試, 那就畢不了業了.

如果說 AI 有哪個東西要先學習, 我看起來還是 Python. 然後搭配自己的專業領域使用. 像是 audio, video, image, 或者是我以前用在 OCR. 新手可以學 Python 的地方超級多, 入門也非常簡單. 所以這應該是正確的第一步無誤. 再來介紹一下錯誤的第一步.

有些人, 像是我, 從小就對人腦很有興趣. 總是會想要用人腦的特性來做出更厲害的 AI. 比方說, 有一天我想到遺忘也是人的特性, 如果讓神經網路可以遺忘, 不就是一大突破了! 哇哈哈哈…不過我很快就發現 LSTM (Long Short-Term Memory) 已經有這招了! 我又想到, 意義相似的字應該用向量表示遠近比較好! 再一查, word embedding 已經有向量觀念….嗯, 我想得到人家也想得到.

我記錄 idea 的 Onenote 筆記

所以專家幾乎都不推薦用人腦去設計 NN. 頂多是在投影片裡, 從生醫角度切入, 使人覺得更高大上 (e.g. BERT 用上 DNA 雙螺旋來講解). 除非你就是要複製人腦, 不在乎它到底能不能實用 (make money)! 至於聽起來就沒有商機則是例外. 像是 hypothalamic-pituitary-adrenal axis [6] 和 AI 的關係就只限於  Adrenal Insufficiency (腎上腺機能不全), 表示未來讓 AI 談戀愛這個領域還有發展空間.

言歸正傳. 有了語言, 接下來要找環境. 以前我傻傻地自己開 Jupyter Notebook, 後來發現 Google Colabatory 就能直接用了. 除非需要很大的算力時, 才需要用到自己 PC 的顯卡. 若只是要練習 Python, 學 AI, 直接註冊一個免費的 Colab 帳號即可, 而且很多 Google 的網路資源都可以直接調用. 不用到處找. Colab 不開 GPU/TPU 時, 預設在 no power 等級. 設定裡面可以選柯基犬、貓咪、螃蟹模式, 我還以為有什麼差別, 原來是小動物跑來跑去~~

接下來, 我認為值得按讚是 CNN. 因為除了 CNN, 很多背景知識都跟我 30 年前學的差不多. (當然我那個時候講到 CNN, 一定是先想到 Concurrent 開頭的 CNN, 不是現在 Convolution 開頭的這個 CNN). 會強調 CNN, 主要是 CNN + DNN (deep learning) 把特徵值和絕對位置脫鉤了. 這個真的很厲害.

新 model 可以留給博士們研究, 要實做就需要學 framework. Google 主推的 tensorflow [3] 有許多教學網站. 除了 Youtube 上非常多老師在教. FreeCodeCamp [2] 也 “免費" 教很多技術, 他們在介紹 AI 相關技術時也會用到 tensorflow + Colab, 我覺得挺不錯. 其中, 講解的小哥可以快速講一些基本觀念. 當然他們沒辦法一行一行 trace code, 或是把細節講得很清楚. 講師帶我們瀏覽完大概, 細節就要自己花時間看, 最好是 Colab 開起來模擬一遍.

在 Youtube 也可以找到 FreeCodeCamp 小哥 Tim 的 7 小時學 tensorflow. 然而, 連復仇者終局之戰都沒演那麼久了, 誰能一口氣看得完這個? 所幸在 FreeCodeCamp 上, 這個影片會被分成大約每 15 分鐘一段的短片, 每個短片後面還有一個小測驗, 算是滿貼心的設計. 這樣就不需要太考驗耐心.

然而, FreeCodeCamp 不是 Google 這種大戶, 所以它需要大家自願 donate 才活得下去 (5 USD 起跳, 每個月捐 20 USD 可以讓其他人學習 1 千小時.). 畢竟 lib 或是 tool 會過時, 隔一陣子確實該更新或 debug. 像是 tensorflow 小哥影片中的 sklearn 已經可以改用新版的 scikit-learn, 或者講 DNN 的老哥在 7’51″ 這個地方線的顏色有些不對, 按圖 negative * negative 應該是 positive, 後續影片播到 10’10″ 左右這兩條線才更正為 positive. 總之, 他們值得贊助, 也需要贊助.

至於要學另一個主流 framework 是 Pytorch, 教學影片除了 Youtube, 就只找到 Microsoft [4]. Pytorch 當初是 Meta 推的, 不過 Meta 好像跟 Google, Microsoft (OpenAI) 的發展沒得比. 但是看在開源 llama2 的份上, 我對 Meta 感激不盡, 也原諒它一直偷聽我講話.

基於我們不會大改 model, 用 LoRA (Low-Rank Adaptation) [5] 可以小改. LoRA 訴求主要是在某幾層針對特定目標減少計算. 更小的修改是直接在既有模型後面再加一層 (或許幾層也是可以), 把原本的結果從新詮釋. FreeCodeCamp 的例子是從原本能分辨 10 種動物的模型, 改為只要能認貓或狗. 當然這沒省到計算量, 但是可以揀現成.

[REF]

  1. https://colab.research.google.com/
  2. https://www.freecodecamp.org/
  3. https://www.tensorflow.org/?hl=zh-tw
  4. https://learn.microsoft.com/zh-tw/shows/ai-show/pytorch-deep-dive
  5. https://d223302.github.io/AACL2022-Pretrain-Language-Model-Tutorial/lecture_material/AACL_2022_tutorial_PLMs.pdf
  6. https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3181830/

Linked In 的 add skill

最近收到一封 Linked In 網站寄來的信, 它建議我在個人資料上添加一些技能 (Add Skill), 作為結交同業的用途, 標示清楚自己的專業是個不錯的主意. 不過更有趣的, Linked In 不但會建議比較相關的 skill, 還會標示在過去一年中, 描述自己具備這種 skill 的人數增減.


 

比方說, 號稱自己會 SoC 的人口比例減少了 6% 之多, GPS 也下降 5%, 號稱自己懂 video 的上升 5%. 後者表示並非學理工的人數比例下降. 而是某些領域真的不熱門了.

重新統計我看得到的熱/冷門技術如下:

 

比例 明顯上升技術
+11% Machine Learning
+8% Final Cut Pro, Film Production
+7% Sound Design
+6% Video Production
+5% Video
比例 明顯下降技術
-5% GPS, FPGA
-6% SoC, DVD
-7% Production, Silicon
-8% Mixed Signal
-9% ASIC, DSP, RTL Design, DFT, Functional Verification, Processor
-11% RTL Coding
-12% System C

所以 IC design, design verification 的人口正在流失, 而多媒體應用的人口在增加. 更炫的是, 很多人都去搞 AI 了吧!看來剛加入職場的新鮮人, 應該要把 machine learning 當作自己的技能, 才能保持未來 10 年都是熱門人才.

更深一層地想, Design Verification 的重要性不升反降, 是否表示 IP 用量大增?不然哪有 IC 變複雜卻更不需要驗證? 寫 RTL 的人也變少了, 這應該呼應大家都在用 IP 這個趨勢吧!