Analytics Zoo Cluster Serving自動擴充套件分散式推理

示說網發表於2020-09-19

作者: Jiaming Song, Dongjie Shi, Gong, Qiyuan, Lei Xia, Wei Du, Jason Dai

       隨著深度學習專案從實驗到生產的發展,越來越多的應用需要對深度學習模型進行大規模和實時的分散式推理服務。雖然已經有一些工具可用於相關任務(如模型優化、服務、叢集排程、工作流管理等等),但對於許多深度學習的工程師和科學家來說,開發和部署能夠透明地擴充套件到大型叢集的分散式推理工作流仍然是一個具有挑戰性的過程。

 

       為了應對這一挑戰,我們在Analytics Zoo 0.7.0版本中釋出了Cluster Serving的支援。Analytics Zoo Cluster Serving是一個輕量級、分散式、實時的模型服務解決方案,支援多種深度學習模型(例如TensorFlow*、PyTorch*、Caffe*、BigDL和OpenVINO™的模型)。它提供了一個簡單的pub/sub API(釋出/訂閱),使用者可以輕鬆地將他們的推理請求傳送到輸入佇列(使用一個簡單的Python API)。然後,Cluster Serving將使用分散式流框架(如Apache Spark* Streaming、Apache Flink*等等)在大型叢集中進行實時模型推理和自動擴充套件規模。Analytics Zoo Cluster Serving的總體架構如圖1所示。

 

圖1   Analytics Zoo Cluster Serving 解決方案總體框架

Cluster Serving的工作原理

你可以按照下面的三個簡單步驟使用Cluster Serving解決方案(如圖2所示)。

 

圖2   使用Analytics  Zoo Cluster Serving解決方案的步驟

1、 在本地節點安裝和準備Cluster Serving環境

  • 將已經完成訓練的模型複製到本地節點。當前支援的模型包括TensorFlow、PyTorch、Caffe、BigDL和OpenVINO的模型。
  • 在本地節點上安裝Analytics Zoo(例如使用單個pip Install命令即可完成)
  • 在本地節點上配置叢集伺服器,包括模型的檔案路徑和叢集地址(如Apache Hadoop*YARN叢集、Spark叢集、Kubernetes*叢集等)

請注意這一點,Cluster Serving解決方案只需要部署在本地節點上,叢集(YARN或者Kubernetes)並不需要做任何改動。

2、 啟動Cluster Serving服務

通過在本地節點上執行startup script指令碼啟動Cluster Serving服務,例如:

start-cluster-serving.sh 

在後臺,Cluster Serving將自動部署訓練好的模型,並以分散式的方式跨叢集服務於模型推理請求。您可以使用TensorBoard*監測其執行時狀態(例如推理吞吐量)。

3、 分散式實時(流式)推理

Cluster Serving提供了一個簡單的pub/sub API(釋出/訂閱),你可以使用這個簡單的Python API將推理請求輕鬆地傳送到輸入佇列(當前使用的是Redis* Streams),例如:

input = InputQueue()
input.enqueue_image(id, image)

然後,Cluster Serving將從Redis* Streams讀取請求,使用Spark Streaming或Flink跨叢集執行分散式實時推理,並通過Redis返回結果。最後,您可以再次使用這個簡單的Python API獲得推理結果,例如:

output = OutputQueue()
results = output.dequeue()

 

快速入門示例

你也可以通過執行Analytics Zoo 0.7.0版本中提供的快速入門示例來嘗試使用Cluster Serving。快速入門示例包含了使用Cluster Serving執行分散式推理流程所需的所有元件,首次使用它的使用者能夠在幾分鐘內啟動並執行。快速入門示例包含:

  • 一個Analytics Zoo Cluster Serving的Docker Image (已安裝所有依賴)
  • 一個示例配置檔案
  • 一個訓練好的TensorFlow模型,以及推理樣本資料
  • 一個示例Python客戶端程式

按照下面的步驟執行快速入門示例。有關詳細說明,請參閱Analytics Zoo Cluster Serving程式設計指南

1、 啟動 Analytics Zoo docker

#docker run -itd --name cluster-serving --net=host intelanalytics/zoo-cluster-serving:0.7.0 bash

2、 登入container並轉到我們準備好的工作目錄

#docker exec -it cluster-serving bash
#cd cluster-serving

3、 在container內啟動Cluster Serving

#cluster-serving-start

4、 執行Python客戶端程式,開始推理

#python quick_start.py

以下推理結果應該出現在你本地終端顯示上:

image: fish1.jpeg, classification-result: class: 1's prob: 0.9974158
image: cat1.jpeg, classification-result: class: 287's prob: 0.52377725
image: dog1.jpeg, classification-result: class: 207's prob: 0.9226527

        如果你希望構建和部署定製的Cluster Serving流程,可以從修改快速入門示例中提供的示例配置檔案和示例Python程式開始。下面是這些檔案的大致結構,僅供參考。有關更多詳細資訊,請參閱 Cluster Serving程式設計指南

配置檔案(config.yaml)如下所示:

## Analytics Zoo Cluster Serving Config Example
model:
  # model path must be set
  path: /opt/work/model
data:
  # default, localhost:6379
  src:
  # default, 3,224,224
  image_shape:
params:
  # default, 4
  batch_size:
  # default, 1
  top_n:
spark:
  # default, local[*], change this to spark://, yarn, k8s:// etc if you want to run on cluster
  master: local[*]
  # default, 4g
  driver_memory:
  # default, 1g
  executor_memory:
  # default, 1
  num_executors:
  # default, 4
  executor_cores:
  # default, 4
  total_executor_cores:

Python程式(quick_start.py)如下所示:

from zoo.serving.client import InputQueue, OutputQueue
import os
import cv2
import json
import time

if __name__ == "__main__":
    input_api = InputQueue()
    base_path = "../../test/zoo/resources/serving_quick_start"
    if not base_path:
        raise EOFError("You have to set your image path")
    output_api = OutputQueue()
    output_api.dequeue()
    path = os.listdir(base_path)
    for p in path:
        if not p.endswith("jpeg"):
            continue
        img = cv2.imread(os.path.join(base_path, p))
        img = cv2.resize(img, (224, 224))
        input_api.enqueue_image(p, img)
    time.sleep(5)
    # get all results and dequeue
    result = output_api.dequeue()
    for k in result.keys():
        output = "image: " + k + ", classification-result:"
        tmp_dict = json.loads(result[k])
        for class_idx in tmp_dict.keys():
            output += "class: " + class_idx + "'s prob: " + tmp_dict[class_idx]
        print(output)

 

結論

        我們很高興與您分享Analytics Zoo 0.7.0版本中提供的這種新的群集模型服務支援,並希望此解決方案有助於簡化您的分散式推理工作流並提高您的工作效率。我們很樂意在GitHub和郵件列表上聽到您的問題和反饋。我們將持續對Analytics Zoo進行開發工作,構建統一資料分析和人工智慧平臺,敬請期待更多關於Analytics Zoo的資訊。

 

關於Cluster Serving,也可以參見視訊講解回放:《ClusterServing簡介與案例

相關文章