透過結合 Ray Serve 和 Gradio,可以快速建立一個線上影像分類別服務。首先,利用 Ray Train 訓練好的模型會被載入,接著透過 Gradio 建立一個使用者友善的網頁介面,讓使用者可以上傳圖片並獲得分類別結果。Ray Serve 則負責後端的模型佈署和管理,確保服務的高效性和可擴充套件性。此架構簡化了機器學習模型佈署的流程,讓開發者能更專注於模型的訓練和最佳化。

# gradio_demo.py
from ray.train.torch import TorchCheckpoint, TorchPredictor
from ray.serve.gradio_integrations import GradioServer
import gradio as gr
import numpy as np

CHECKPOINT_PATH = "torch_checkpoint"
checkpoint = TorchCheckpoint.from_directory(CHECKPOINT_PATH)
predictor = TorchPredictor.from_checkpoint(checkpoint=checkpoint, model=Net())

def predict(payload):
    payload = np.array(payload, dtype=np.float32)
    array = payload.reshape((1, 3, 32, 32))
    return np.argmax(predictor.predict(array))

demo = gr.Interface(
    fn=predict,
    inputs=gr.Image(),
    outputs=gr.Label(num_top_classes=10)
)

app = GradioServer.options(
    num_replicas=2,
    ray_actor_options={"num_cpus": 2}
).bind(demo)

使用Ray Serve與Gradio構建影像分類別服務

在前面的章節中,我們已經瞭解瞭如何使用Ray進行分散式訓練和超引數調優。現在,我們將展示如何使用Ray Serve和Gradio構建一個影像分類別服務。

步驟1:載入模型檢查點

首先,我們需要載入之前訓練好的模型檢查點。在這個例子中,我們使用TorchCheckpoint和TorchPredictor來載入模型。

# gradio_demo.py
from ray.train.torch import TorchCheckpoint, TorchPredictor

CHECKPOINT_PATH = "torch_checkpoint"
checkpoint = TorchCheckpoint.from_directory(CHECKPOINT_PATH)
predictor = TorchPredictor.from_checkpoint(
    checkpoint=checkpoint,
    model=Net()
)

內容解密:

  • 我們從指定的檢查點目錄載入TorchCheckpoint。
  • 使用載入的檢查點和我們的Net()模型定義建立一個TorchPredictor例項,用於進行推理。

步驟2:定義Gradio介面

接下來,我們需要定義Gradio介面,該介面將影像作為輸入並產生標籤作為輸出。

from ray.serve.gradio_integrations import GradioServer
import gradio as gr
import numpy as np

def predict(payload):
    payload = np.array(payload, dtype=np.float32)
    array = payload.reshape((1, 3, 32, 32))
    return np.argmax(predictor.predict(array))

demo = gr.Interface(
    fn=predict,
    inputs=gr.Image(),
    outputs=gr.Label(num_top_classes=10)
)

app = GradioServer.options(
    num_replicas=2,
    ray_actor_options={"num_cpus": 2}
).bind(demo)

內容解密:

  • predict函式將Gradio的輸入轉換為NumPy陣列,並調整形狀以適應我們的模型。
  • 使用TorchPredictor進行預測,並傳回預測結果中機率最高的類別索引。
  • Gradio介面定義了一個輸入(影像)和一個輸出(CIFAR-10資料集的10個類別之一的標籤)。
  • 將Gradio演示繫結到一個Ray Serve GradioServer物件,該物件佈署在兩個副本上,每個副本使用2個CPU。

步驟3:執行服務

要執行此應用程式,只需在shell中輸入以下命令:

serve run gradio_demo:app

這個命令啟動了我們的Serve支援的Gradio演示,可以在localhost:8000存取。您可以上傳或拖曳影像到相應的輸入欄位,並請求預測,預測結果將顯示在應用程式的輸出欄位中。

Ray Serve生態系統

Ray Serve目前支援多種整合,如表11-4所示。

函式庫描述
Serving frameworks and applicationsFastAPI, Flask, Streamlit, Gradio
Explainability and observabilityArize, Seldon Alibi, WhyLabs

自定義整合

Ray AIR的設計考慮了可擴充套件性,因此您可以為想要構建自定義整合的任務找到合適的介面。例如,要從Snowflake讀取資料,使用JAX訓練模型,並將調優結果記錄到Neptune,您需要建立自定義的資料來源和訓練器。

from ray.data import read_datasource, datasource

class SnowflakeDatasource(datasource.Datasource):
    pass

dataset = read_datasource(SnowflakeDatasource(), ...)

內容解密:

  • 透過定義SnowflakeDatasource類別來建立自定義資料來源。
  • 使用read_datasource函式從Snowflake讀取資料到Ray Dataset。

同樣,您可以透過擴充套件DataParallelTrainer來建立自定義的JAX訓練器。

from ray.train.data_parallel_trainer import DataParallelTrainer

class JaxTrainer(DataParallelTrainer):
    pass

內容解密:

  • 透過擴充套件DataParallelTrainer來建立自定義的JAX訓練器。
  • 自定義訓練器可以使用與所有AIR範例相同的Trainer介面。

Ray 與其他系統的比較

在探討 Ray 的生態系統之後,我們現在可以將其與其他系統進行比較。由於 Ray 具有很高的靈活性,並包含多個元件,因此可以與機器學習(ML)生態系統中的不同工具進行比較。

分散式 Python 框架

在提供完整 Python 支援且不受雲端供應商限制的分散式運算框架中,目前的「三大」框架分別是 Dask、Spark 和 Ray。雖然這些框架之間存在技術和效能上的差異,但最好根據您想要在其上執行的任務型別進行比較。表格 11-5 對比了最常見的工作負載型別。

表格 11-5:Ray、Dask 和 Spark 的工作負載型別支援比較

工作負載型別DaskSparkRay
結構化資料處理第一級支援第一級支援透過 Ray Datasets 和整合支援,但非第一級
低階平行處理透過任務提供第一級支援透過任務和角色提供第一級支援
深度學習工作負載支援,但非第一級支援,但非第一級透過多個 ML 函式庫提供第一級支援

Ray AIR 與更廣泛的 ML 生態系統

Ray AIR 主要關注 AI 運算,例如透過 Ray Train 提供任何型別的分散式訓練,但它並非旨在涵蓋 AI 工作負載的每個方面。例如,AIR 選擇與 ML 實驗的追蹤和監控工具以及資料儲存解決方案整合,而不是提供原生的解決方案。表格 11-6 列出了該生態系統的互補元件。

表格 11-6:互補的生態系統元件

類別範例
ML 追蹤和可觀察性MLflow、Weights & Biases、Arize 等
訓練框架PyTorch、TensorFlow、Lightning、JAX 等
ML 特徵儲存Feast、Tecton 等

在另一個極端,您可以找到一些工具類別,對於這些工具,Ray AIR 可以被視為替代方案。例如,有許多與特定框架緊密結合的工具包,如 TorchX 或 TFX。相比之下,AIR 是框架無關的,從而避免了供應商鎖定,並提供了類別似的工具。

from ray.tune import logger, tuner
from ray.air.config import RunConfig

class NeptuneCallback(logger.LoggerCallback):
    def __init__(self):
        # 初始化 NeptuneCallback
        pass

    def log_trial_start(self, trial):
        # 在試驗開始時記錄
        pass

    def log_trial_end(self, trial):
        # 在試驗結束時記錄
        pass

    def log_trial_result(self, trial, result):
        # 記錄試驗結果
        pass

tuner = tuner.Tuner(
    trainer,
    run_config=RunConfig(callbacks=[NeptuneCallback()])
)

#### 內容解密:

此程式碼範例展示瞭如何定義一個名為 NeptuneCallback 的自訂 LoggerCallback,用於與 Neptune 整合,用於記錄和視覺化 Tune 試驗。首先,從 ray.tune.loggerray.air.config 匯入必要的模組。然後,定義 NeptuneCallback 類別,繼承自 logger.LoggerCallback。在這個類別中,您需要實作三個方法:log_trial_startlog_trial_endlog_trial_result。這些方法分別在試驗開始、結束和產生結果時被呼叫,以記錄相關資訊。最後,建立一個 Tuner 物件,並將 NeptuneCallback 的例項傳遞給 RunConfigcallbacks 引數,以啟用自訂的日誌記錄功能。

與特定雲端服務的比較

一些主要的雲端服務提供了全面的工具包來處理 Python 中的 ML 工作負載。例如,AWS SageMaker 是一個很好的全方位套件,可以讓您與 AWS 生態系統很好地連線起來。AIR 的目標不是取代像 SageMaker 這樣的工具,而是為像訓練、評估和服務這樣的運算密集型元件提供替代方案。

與 ML 工作流程框架的比較

AIR 也代表了對像 KubeFlow 或 Flyte 這樣的 ML 工作流程框架的有效替代方案。與許多根據容器的解決方案相比,AIR 提供了一個直觀的高階 Python API,並提供了對分散式資料的原生支援。表格 11-7 總結了這些替代方案。

表格 11-7:替代的生態系統元件

類別範例
特定框架的工具包TorchX、TFX 等
ML 工作流程框架KubeFlow、Flyte、FBLearner Flow

AIR 的使用場景

有時,情況並不那麼明確,Ray AIR 可以被視為 ML 生態系統中的替代元件或互補元件。例如,作為開源系統,Ray 和 AIR 特別可以用於像 SageMaker 這樣的託管 ML 平台,但您也可以用它來建立自己的 ML 平台。

此外,如前所述,AIR 並不總是能與像 Spark 或 Dask 這樣專門的大資料處理系統競爭,但通常 Ray Datasets 就足以滿足您的處理需求。

表格 11-8:AIR 可以補充或替代的生態系統元件
類別範例
ML 平台SageMaker、Azure ML、Vertex AI、Databricks
資料處理系統Spark、Dask
工作流程協調器Argo、AirFlow、Metaflow
MLOps 框架ZenML、Lightning

圖表翻譯: 此圖示展示了 Ray AIR 與其他生態系統元件之間的關係。Ray AIR 可以與 ML 平台、資料處理系統、工作流程協調器和 MLOps 框架互補或替代。

如何將 Ray AI Runtime(AIR)整合至現有的機器學習平台

在深入瞭解 Ray 與 AIR 的關係後,我們來總結一下如何建立自己的機器學習(ML)平台並將 Ray 與其他生態系統元件整合。

建立以 Ray 為核心的 ML 系統

你的 ML 系統核心由一組 Ray 叢集(Clusters)組成,每個叢集負責不同的任務。例如,一個叢集可能執行預處理、訓練 PyTorch 模型和推論;另一個叢集可能專門用於批次推論和模型服務。你可以利用 Ray Autoscaler 滿足你的擴充套件需求,並在 Kubernetes 上使用 KubeRay 佈署整個系統。

擴充套件與整合其他元件

你可以根據需求為核心系統新增其他元件,例如:

  • 新增其他運算步驟,如使用 Spark 進行資料密集的預處理任務。
  • 使用工作流程協調器(Workflow Orchestrator),如 AirFlow、Oozie 或 SageMaker Pipelines,來排程和建立 Ray 叢集並執行 Ray AIR 應用程式。每個 AIR 應用程式可以是更大工作流程的一部分。
  • 為互動式使用建立 Ray AIR 叢集,並與 Jupyter Notebook(如 Google Colab 或 Databricks Notebooks)整合。
  • 如果需要存取特徵儲存(Feature Store),如 Feast 或 Tecton,Ray Train、Datasets 和 Serve 提供了與這些工具的整合。
  • 使用 MLflow 和 Weights & Biases 等工具進行實驗追蹤和指標儲存,Ray Train 和 Tune 提供了與這些工具的整合。
  • 從外部儲存解決方案(如 S3)檢索和儲存資料和模型。

圖表整合說明

此圖示展示瞭如何使用 Ray AI Runtime 和其他 ML 生態系統元件建立自己的 ML 平台。 圖表翻譯: 此圖展示了一個完整的 ML 平台架構,包括 Ray Clusters、預處理、模型訓練、推論等步驟,以及與其他工具的整合,如 Spark、AirFlow、Jupyter Notebook、Feast、MLflow 和 S3。

未來學習方向

本文介紹了 Ray 的核心概念和 AIR 的使用方法,但 Ray 的功能遠不止於此。若要更深入地瞭解 Ray Core 的進階用法、Ray 叢集的管理和擴充套件,可以參考 Ray 的官方檔案和相關研究論文。

深入學習資源:

  • Ray Core 使用者:深入瞭解 Ray 任務、角色和物件的管理,以及如何處理應用程式的依賴關係。
  • Ray Observability 檔案:學習如何除錯和監控 Ray 應用程式,包括日誌記錄和指標匯出。
  • Ray Dashboard:瞭解如何使用 Ray Dashboard 來監控和管理 Ray 程式。
  • Ray 生態系統頁面:探索更多 Ray 的第三方整合和擴充套件功能。
如何參與 Ray 社群:
  • 加入 Ray Slack:與 Ray 開發者和社群成員交流。
  • 參與 Ray 論壇:提問和取得幫助。
  • 貢獻程式碼或檔案:參考官方貢獻,幫助改進 Ray。

本文到此結束,希望它能激發你對 Ray 的興趣,並幫助你開始使用 Ray 進行機器學習工作。

Ray 技術檔案索引

符號與註解

  • @ray.remote 修飾器:27, 36
  • @serve.batch 修飾器:165
  • @serve.deployment 修飾器:19, 161
    • 用於調整佈署的副本和資源分配:164

抽象層與 Ray 核心概念

  • 抽象層的漏斗定律:2
  • Ray 提供的抽象層:4
  • 動作分佈:78, 81
  • 動作空間(強化學習):66, 87
    • 在 RLlib 環境中定義策略伺服器的動作空間:92
    • RLlib 中的引數化動作空間:99

強化學習(RL)基礎

  • 動作(RL):66
    • 使用 Python RLlib API 計算動作:78
    • 在多代理環境中傳遞給步驟的動作:88
    • 每個動作的機率:78
    • 對動作的簡化假設:66
  • 代理(RL):66, 69
    • 使用多個代理:85-90
    • 將代理對映到策略:86, 89

Ray 的核心元件

  • 演員(Actors):33
    • 用於 Ray Serve 佈署的控制器演員:161
    • 將 Simulation 類別轉換為演員:62
    • GCS 儲存演員的位置:39
    • 使用演員進行帶有狀態的轉換:210
  • 任務(Tasks):24, 33
    • 在複合工作負載中,狀態演員存取無狀態任務的資料:212

Ray AIR 與 AI 相關內容

  • Ray AIR:195
    • 重點關注 AI 運算:228
  • 最近的人工智慧發展:3
  • Ray AIR 支援的 AI 工作負載型別:209

分散式運算與效能最佳化

  • 非同步執行:28
  • 執行依賴任務的非同步與平行處理:33
  • 自動擴充套件
    • Ray AIR 工作負載的自動擴充套件:213
    • Ray Serve 副本的自動擴充套件:165

資料處理與 Ray Datasets

  • Ray Datasets:10, 122
    • 使用分散式 Arrow:在 Ray Datasets 中使用分散式 Apache Arrow:122
    • 資料格式的靈活性:125
    • 支援的序列化格式:124

調整與最佳化(Tune)

  • 分析(Tune):104, 106, 107
  • 貝葉斯最佳化:108

Ray Serve 與模型佈署

  • Ray Serve
    • 使用 @serve.deployment 修飾器進行佈署:19, 161
    • 調整佈署的副本和資源分配:164

分散式訓練與預測

  • 批次預測
    • 使用 Ray Train 的分散式批次預測:147
  • 分散式訓練
    • 使用 Dask on Ray 訓練 PyTorch 神經網路:142

Ray Clusters 與雲端運算

  • Ray Clusters
    • 基本元件:6, 179
    • 自動擴充套件支援:5, 194

程式碼與範例解析

# 示例程式碼片段說明  
def cpu_intensive_preprocessing(data):
    # CPU密集型預處理範例  
    pass  

程式碼解密:

  1. 此函式 cpu_intensive_preprocessing 用於對資料進行 CPU 密集型預處理。
  2. 該函式接受 data 作為輸入引數。
  3. 該函式目前為空,可根據具體需求新增預處理邏輯。

圖表說明

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title Ray Serve Gradio構建影像分類別服務

package "機器學習流程" {
    package "資料處理" {
        component [資料收集] as collect
        component [資料清洗] as clean
        component [特徵工程] as feature
    }

    package "模型訓練" {
        component [模型選擇] as select
        component [超參數調優] as tune
        component [交叉驗證] as cv
    }

    package "評估部署" {
        component [模型評估] as eval
        component [模型部署] as deploy
        component [監控維護] as monitor
    }
}

collect --> clean : 原始資料
clean --> feature : 乾淨資料
feature --> select : 特徵向量
select --> tune : 基礎模型
tune --> cv : 最佳參數
cv --> eval : 訓練模型
eval --> deploy : 驗證模型
deploy --> monitor : 生產模型

note right of feature
  特徵工程包含:
  - 特徵選擇
  - 特徵轉換
  - 降維處理
end note

note right of eval
  評估指標:
  - 準確率/召回率
  - F1 Score
  - AUC-ROC
end note

@enduml

圖表翻譯:

此圖表展示了一個簡單的資料處理流程。從開始到處理資料,最後輸出結果。