Categories
程式開發

Analytics Zoo Cluster Serving自動擴展分佈式推理


[*]

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

Analytics Zoo Cluster Serving自動擴展分佈式推理 1

為了應對這一挑戰,我們在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所示。

Analytics Zoo Cluster Serving自動擴展分佈式推理 2

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

Cluster Serving的工作原理

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

Analytics Zoo Cluster Serving自動擴展分佈式推理 3

圖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的信息。

[*]