1 of 31

使用clipper打造低延遲的預測系統

speaker : 陳威宇 weiyu chen

NCHC TW

投影片位置

2 of 31

微服務架構

優點:

* 每個服務簡單

* 每個服務可獨立開發

* 架構可鬆散耦合

* 可透過不同程式語言實作

缺點:

* 維運成本高

* DevOps !!

* 程式碼重複

* 分散式系統的複雜

* 測試代價高

微服務 (Microservices) 是一種軟體架構風格,它是以專注於單一責任與功能的小型功能區段 (Small Building Blocks) 為基礎,利用模組化的方式組合出複雜的大型應用程式,各功能區段使用與語言無關 (Language-Independent/Language agnostic) 的 API 集相互通訊。

3 of 31

心中有個夢:擁抱微服務的優點,降低微服務的門檻

優點:

* 每個服務簡單

* 每個服務可獨立開發

* 架構可鬆散耦合

* 可透過不同程式語言實作

缺點:

* 維運成本高

* DevOps !!

* 程式碼重複

* 分散式系統的複雜

* 測試代價高

Clipper : A Low-Latency Online Prediction Serving System

4 of 31

Agenda

  • 介紹 clipper
    • 是什麼
    • 使用者
    • 特色
  • Demo
    • 環境介紹
    • 案例
  • 如何快速使用
    • 老司機的經驗談
    • 常見問題 5分鐘-> out

陳威宇 WeiYu Chen

國家高速網路與計算中心 副研究員

勞工 / 學生 / 爸爸 /

自由軟體 / 系統維護

https://github.com/waue0920

waue0920 @ gmail.com

5 of 31

Clipper : A Low-Latency Online Prediction Serving System

Clipper : 兼顧低延遲與高效能且高彈性的微服務架構

• 簡化模型部署

• // 若善用Caching、Batching機制能更增加效率

• // 通過智慧選擇和合併模型來改善預測的準確率

• Clipper支援以下幾種模型:

• 純Python函數 / PyShark / PyTorch / Tensorflow / MXnet

6 of 31

Offline Scoring

Online Scoring

Prediction-Serving for interactive applications

Timescale: ~10s of milliseconds

+

7 of 31

作者: RISE Lab

https://rise.cs.berkeley.edu/

8 of 31

誰會喜歡 Clipper

  • 可以用REST API 與machine learning model 界接
  • 簡化model的佈署
  • 透過 clipper提供的batching, caching機制提升效能與減少 latency
  • 由整合與重組演算法能提升正確率

Product team

Data Scientists

Infra-Team

User

9 of 31

Clipper Decouples Applications and Models

10 of 31

Clipper Software Architecture

11 of 31

Clipper Architecture

12 of 31

Clipper w/ Spark Integration Mode

13 of 31

benchmark 1 :clipper 與原生 tensorFlow 比較

14 of 31

Benchmark 2 : 使用Batching 技術

15 of 31

Demo

Server (MicroService)

TWCC VM

Client

現場筆電

from: 愛情釀的酒 - 林志炫版

前輩

==

Never LiveDemo

==============

  • doc

http://clipper.ai/

  • project

https://github.com/ucbrise/clipper

  • examples

https://github.com/ucbrise/clipper/tree/develop/examples

  • my github

https://github.com/waue0920/clipper_study

  • sample data

https://scidm.nchc.org.tw/dataset/datacon2019clipper

  • docker hub

https://cloud.docker.com/repository/docker/waue0920/face_detect_cv2

16 of 31

資料來源:資料市集

17 of 31

運算平台:TWCC

  • 48 cores + 320GB memory 100GB HDD

1.5 %

10G

0

400 KB/s

10 %

13G

18 of 31

老司機分享篇

  • 快速上手
  • 避免走冤枉路
  • ...沒別的了 我只是小司機

19 of 31

1. 啟動 clipper cluster 並聯上 clipper manager

clipper_conn.start_clipper()

同時會啟動五個 docker

  • front_end exporter : no port
  • query_frontend : 1337 / 7000
  • management_frontend : 1338
  • radis : 6379
  • prometheus : 9090

20 of 31

2 載入model於container, 註冊app, 連結

  • python_deployer.deploy_python_closure(� clipper_conn, name, version=2, input_type="bytes",� func=image_size, registry="waue0920",� pkgs_to_install=['pillow']

)

  • clipper_conn.register_application(� name="image-example", input_type="bytes", � default_output="-1.0", slo_micros=100000

)

  • clipper_conn.link_model_to_app(� app_name="image-example", model_name="image-example“

)

21 of 31

2 載入model於container, 註冊app, 連結

in one function

  • python_deployer.create_endpoint(

clipper_conn=clipper_conn,

name="image-example",

input_type="bytes",

func=image_size,

pkgs_to_install=['pillow']

)

  • python_deployer.deploy_python_closure(� clipper_conn, name, version=2, input_type="bytes",� func=image_size, registry="waue0920",� pkgs_to_install=['pillow']

)

  • clipper_conn.register_application(� name="image-example", input_type="bytes", � default_output="-1.0", slo_micros=100000

)

  • clipper_conn.link_model_to_app(� app_name="image-example", model_name="image-example“

)

22 of 31

3. 分手的藝術

撤銷註冊 與 結束服務大不同

撤銷app & model

結束 clipper cluster

  • clipper_conn.unlink_model_from_app(�model_name=model_name, app_name=app_name )

  • clipper_conn.stop_models(�model_name )

  • clipper_conn.delete_application(�app_name )
  • clipper_conn.stop_all()

23 of 31

4. get more information to debug

24 of 31

5. clipper 中的單元測試

  • clipper 較難run time debug 因為error message 會被系統吃掉。問題可能出在:
    • container : base image 裡沒有包含到 predict 用的 library
    • predict function : 有error message 但用restful API 展現不出來
  • 建議解法:
  • predict 的內容 應該先獨立測試,觀察結果如預期
  • 修改成predict function 結構,再進行測試
  • 註冊成微服務後 run time 測試非預期,用docker ps & docker log 觀察是否 container instance 起不起來
    1. 若是因為 container 問題,如container 內沒裝所需要用的 library

MR Unit Test

1. Setup

2. Exercise

3. Verify

4. Tear down

25 of 31

6. 建立 model 能運行的container

import clipper_admin.deployers.keras

clipper_admin.deployers.keras.deploy_keras_model(

clipper_conn,

func=predict,

batch_size=1,

base_image="face_detect_cv2",

pkgs_to_install=['pillow']

)

  • 先確定是container 出錯:
    • docker log 可以看到錯誤訊息
    • 或用 docker exec -it <id> /bin/bash 進到instance 裡 用python跑 predict function 那段
  • 在 container instance 裡裝好環境套件
    • 如 用到 opencv ,無法使用pip 安裝,只能用 apt install
  • docker commit
    • docker commit <id> <name>
  • 程式段,指定base_image

26 of 31

常見問題 15分鐘-> out

  • 若遇到 PyYAML 版本太舊又無法移除的錯誤導致無法安裝
  • clipper Manager run 不起來
  • clipper Manager 啟動錯誤,已經存在
    • Error starting Clipper: Cluster default-cluster cannot be started because it already exists.
  • container 無法載入 hub.docker 的 registry

27 of 31

若遇到pip 版本太舊又無法移除的錯誤導致無法安裝 clipper

安裝過程中遇到某個python套件錯誤

(A) 移除並重新安裝:

(ex: PyYAML)

(B) 指定版本

(ex: cloudpickle )

# mv /opt/anaconda3/lib/python3.6/site-packages/yaml ./

# mv /opt/anaconda3/lib/python3.6/site-packages/PyYAML-3.12-py3.6.egg-info ./

# pip install PyYAML

# pip install -U cloudpickle==0.5.3

28 of 31

clipper Manager run 不起來

  • 檢查環境是否有裝 docker , k8s
  • 確認目前使用者的權限是否能執行 docker & k8s
    • simplest way : by root

# yum install docker kubelet kubeadm kubectl kubernetes-cni

# systemctl enable docker

# systemctl start docker

# systemctl enable kubelet

# systemctl start kubelet

29 of 31

clipper Manager 啟動錯誤,已經存在

  • 使用 start_clipper() 會有重複存在的問題
    • clipper_conn.start_clipper()
  • 建議使用以下取代

from clipper_admin import ClipperException

try:

clipper_conn.start_clipper()

except ClipperException as e:

clipper_conn.connect()

except Exception as e:

print(e)

30 of 31

container 無法載入 hub.docker 的 registry

  1. ssh到該台機器,執行 docker login
  2. deploy 的程式碼段,加入 registry & version 資訊

python_deployer.deploy_python_closure(clipper_conn,

name="waue-sum-model",

version=2,

input_type="doubles",

func=feature_sum,

registry="waue0920"

)

31 of 31