隨著資料量和模型複雜度的提升,單機運算已無法滿足機器學習的需求,分散式運算框架應運而生。Ray 作為一個開源 Python 分散式計算框架,提供簡潔易用的 API 和豐富的函式庫,能有效簡化分散式機器學習任務的開發和佈署。它支援多種機器學習框架,並能有效整合 GPU 等硬體加速器,提升運算效率。Ray 的彈性架構允許使用者根據需求動態調整計算資源,並具備容錯機制,確保任務穩定執行。

使用Ray進行分散式機器學習:從基礎到進階

什麼是Ray?

Ray是一個開放原始碼的分散式計算框架,能夠簡化大規模Python工作負載的擴充套件過程。作為Python程式設計師、資料工程師和資料科學家,可以利用Ray在本機端執行分散式應用程式,並啟動計算叢集。透過Ray,可以結構化並大規模執行機器學習程式。

Ray的設計原則

Ray的設計遵循多項重要原則,包括:

  1. 簡易性:讓使用者能夠輕鬆地編寫分散式應用程式。
  2. 彈性:支援動態任務排程和容錯機制。
  3. 可擴充套件性:能夠在大型叢集中高效執行。

Ray的三層架構

Ray的架構分為三個主要層次:

  1. Ray Core:提供底層的分散式計算功能。
  2. Ray Libraries:包括用於強化學習(RLlib)、超引數調優(Tune)和分散式訓練(Train)等功能的函式庫。
  3. Ray Ecosystem:整合了多種資料科學工具和函式庫,形成完整的生態系統。

開始使用Ray Core

要開始使用Ray,首先需要了解Ray Core的基本概念和API。以下是一個簡單的範例,展示如何使用Ray API建立分散式任務:

import ray

# 初始化Ray
ray.init()

# 定義一個遠端函式
@ray.remote
def hello_world():
    return "Hello, World!"

# 呼叫遠端函式
result = hello_world.remote()
print(ray.get(result))  # 輸出:Hello, World!

# 關閉Ray
ray.shutdown()

內容解密:

  1. ray.init():初始化Ray執行環境。
  2. @ray.remote:將函式標記為遠端函式,使其能夠在分散式環境中執行。
  3. hello_world.remote():非同步呼叫遠端函式,傳回一個未來物件(Future Object)。
  4. ray.get(result):取得遠端函式執行的結果。

使用Ray進行超引數調優

Ray Tune是一個用於超引數調優的強大工具。以下範例展示如何使用Tune進行簡單的超引數調優:

from ray import tune

def objective(config):
    score = config["a"] ** 2 + config["b"]
    return score

# 定義搜尋空間
search_space = {
    "a": tune.grid_search([0.1, 0.2, 0.3]),
    "b": tune.uniform(0, 1)
}

# 執行調優
tune.run(objective, config=search_space)

內容解密:

  1. objective函式:定義目標函式,接受組態引數並傳回評估結果。
  2. search_space:定義超引數的搜尋空間,包括網格搜尋和均勻分佈抽樣。
  3. tune.run():執行超引數調優,自動搜尋最佳引陣列合。

Ray在資料處理中的應用

Ray Datasets提供了高效的資料處理能力。以下範例展示如何使用Ray Datasets讀取和處理資料:

import ray

# 初始化Ray
ray.init()

# 建立資料集
ds = ray.data.read_csv("s3://anonymous@air-example-data/iris.csv")

# 資料處理
ds = ds.filter(lambda row: row["sepal length (cm)"] > 5)

# 檢視結果
print(ds.show())

內容解密:

  1. ray.data.read_csv():從CSV檔案讀取資料,支援多種儲存後端,如S3。
  2. ds.filter():對資料集進行篩選,保留符合條件的資料列。
  3. ds.show():顯示資料集的部分內容,用於檢查處理結果。

隨著人工智慧和機器學習技術的不斷進步,分散式計算框架如Ray將面臨新的挑戰和機遇。未來,Ray可能會在以下幾個方面繼續發展:

  1. 更高效的排程機制:最佳化任務排程和資源分配,提高整體系統效率。
  2. 更豐富的生態系統整合:與更多資料科學工具和框架整合,提供更全面的解決方案。
  3. 更好的容錯和還原能力:增強系統的穩定性和可靠性,確保在大規模叢集中的平穩執行。

透過不斷創新和改進,Ray有望成為分散式機器學習領域的重要工具之一。

使用Ray進行分散式機器學習的基礎與進階技術

簡介

在過去十年中,機器學習和資料應用的計算需求已經遠遠超出了單一伺服器或單一處理器的能力,包括GPU和TPU等硬體加速器。這種趨勢迫使我們不得不將這些應用分散化。然而,建立這樣的分散式應用程式是非常困難的。Ray作為一個簡化開發分散式應用的框架,已經在過去幾年中脫穎而出。

Ray的核心功能與優勢

Ray包含一個靈活的核心和一套強大的函式庫,使開發人員能夠輕鬆地擴充套件各種工作負載,包括訓練、超引數調優、強化學習、模型服務和批次處理非結構化資料。Ray是目前最受歡迎的開源專案之一,已被數千家公司用於實作從機器學習平台到推薦系統、詐騙檢測等各種應用,甚至包括訓練一些最大的模型,如Open AI的ChatGPT。

本文的目標與內容

本文由Max Pumperla、Edward Oakes和Richard Liaw撰寫,提供了一個溫和而全面的介紹Ray及其函式庫的,透過易於遵循的範例進行講解。在本文結束時,讀者將掌握Ray中的關鍵概念和抽象,並能夠開發和快速擴充套件端對端機器學習應用,從筆記型電腦到大型本地叢集或雲端。

Ray在分散式機器學習中的應用

1. 簡單的MapReduce範例

Ray提供了一個簡單而強大的MapReduce API,用於處理大規模資料。以下是一個簡單的範例:

import ray

# 初始化Ray
ray.init()

# 定義一個簡單的Map函式
def map_function(x):
    return x * x

# 定義一個簡單的Reduce函式
def reduce_function(results):
    return sum(results)

# 建立一個分散式的資料集
data = [1, 2, 3, 4, 5]

# 使用MapReduce進行計算
results = ray.get([map_function.remote(x) for x in data])
final_result = reduce_function(results)

print(final_result)  # 輸出:55

內容解密:

  • 初始化Ray以建立分散式環境。
  • 定義Map和Reduce函式來處理資料。
  • 使用remote關鍵字將函式轉換為可遠端執行的任務。
  • 使用ray.get取得任務的結果。

分散式訓練與超引數調優

1. 使用Ray Train進行分散式訓練

Ray Train提供了一個簡單而高效的方式來進行分散式模型訓練。以下是一個使用Ray Train訓練深度學習模型的範例:

from ray import train
from ray.train import Trainer

# 定義一個深度學習模型
def train_func(config):
    # 模型定義和訓練邏輯
    pass

# 建立一個Trainer例項
trainer = Trainer(backend="torch", num_workers=4)

# 進行分散式訓練
trainer.run(train_func)

內容解密:

  • 使用Trainer類別來建立一個分散式訓練環境。
  • 定義一個訓練函式train_func,包含模型的定義和訓練邏輯。
  • 使用trainer.run方法啟動分散式訓練。

前言

分散式運算是一個令人著迷的領域。回顧電腦的早期發展,我們不禁對如今許多公司將工作負載分散到電腦叢集的事實感到印象深刻。我們已經找到有效的方法來實作這一點,但擴充套件規模也變得越來越必要。單個電腦不斷變得更快,但我們對大規模計算的需求仍然超出了單台機器所能提供的能力。

Ray 的目標是使分散式運算對開發者來說變得簡單。它使分散式運算變得容易被非專業人士接受,並且可以輕鬆地將 Python 指令碼擴充套件到多個節點。Ray 擅長擴充套件資料密集型和計算密集型工作負載,例如資料預處理和模型訓練,並且它明確針對需要擴充套件的機器學習(ML)工作負載。雖然如今在沒有 Ray 的情況下也可以擴充套件這兩種型別的工作負載,但您可能需要為每個任務使用不同的 API 和分散式系統。管理多個分散式系統在很多方面都可能很混亂和低效。

2022 年 8 月發布的 Ray 2.0 新增了 Ray AI Runtime(AIR),進一步增強了對複雜 ML 工作負載的支援。AIR 是一組函式庫和工具,使您能夠輕鬆地在單一分散式系統中構建和佈署端對端的 ML 應用程式。使用 AIR,即使最複雜的工作流程通常也可以表示為單個 Python 指令碼。這意味著您可以先在本地執行程式,這可以對除錯和開發速度產生很大的影響。

資料科學家可以從 Ray 中受益,因為他們可以依賴不斷增長的 Ray ML 函式庫和第三方整合生態系統。Ray AIR 幫助您快速原型化想法,並更輕鬆地從開發轉向生產。與許多其他分散式系統不同,Ray 對 GPU 有原生支援,這對於像 ML 工程師這樣的角色尤為重要。為了支援資料工程師,Ray 還與 Kubernetes 等工具緊密整合,並且可以在多雲環境中佈署。

您可以將其用作統一的計算層,以提供工作負載的擴充套件、容錯、排程和協調。換句話說,值得投資學習 Ray 以適應各種角色。

本文讀者

您可能拿起這本文是因為您對 Ray 的某些方面感興趣。也許您是一位分散式系統工程師,想要了解 Ray 的引擎工作原理。您也可能是一位軟體開發者,想要學習新技術。或者,您是一位資料工程師,想要評估 Ray 與類別似工具的比較。您也可能是一位機器學習從業者或資料科學家,需要找到擴充套件實驗的方法。

無論您的具體角色是什麼,要充分利用這本文,共同點是您需要對 Python 程式設計感到舒適。本文的範例是用 Python 編寫的,需要對該語言有中級水平的瞭解。就像您作為 Python 開發者所瞭解的那樣,明確比隱含更好。因此,讓我們明確一點,我認為瞭解 Python 意味著您知道如何在系統上使用命令列,如何在遇到困難時獲得幫助,以及如何自行設定程式設計環境。

如果您以前從未與分散式系統合作過,那沒關係。我們在本文中涵蓋了入門所需的所有基礎知識。此外,您可以在筆記型電腦上執行此處介紹的大多數程式碼範例。涵蓋基礎知識意味著我們無法對分散式系統進行太詳細的討論。本文最終專注於使用 Ray 的應用程式開發者,特別是在資料科學和 ML 領域。

對於本文的後面章節,您需要對 ML 有一定的熟悉度,但我們不期望您曾經在該領域工作過。特別是,您應該對 ML 正規化及其與傳統程式設計的不同有基本的瞭解。您還應該瞭解使用 NumPy 和 Pandas 的基礎知識。此外,您至少應該能夠閱讀使用流行的 TensorFlow 和 PyTorch 函式庫的範例。在 API 級別上跟隨程式碼流程就足夠了,但您不需要知道如何編寫自己的模型。我們涵蓋了使用這兩個主流深度學習函式庫(TensorFlow 和 PyTorch)的範例,以說明無論您喜歡哪個框架,都可以使用 Ray 進行 ML 工作負載。

我們在高階 ML 主題上涵蓋了很多內容,但主要重點是 Ray 作為一種技術以及如何使用它。我們討論的 ML 範例可能對您來說是新的,可能需要第二次閱讀,但您仍然可以專注於 Ray 的 API 以及如何在實踐中使用它。瞭解了這些要求後,您可能會從本文中獲得以下內容:

  • 如果您是一位資料科學家,Ray 將為您開啟思考和構建分散式 ML 應用程式的新方式。您將瞭解如何在規模上進行超引數選擇,獲得大規模模型訓練的實際知識,並瞭解最先進的強化學習函式庫。
  • 如果您是一位資料工程師,您將學習如何使用 Ray Datasets 進行大規模資料攝取,如何透過利用 Ray 上的 Dask 等工具來改進您的管道,以及如何有效地擴充套件模型佈署。
  • 如果您是一位工程師,您將瞭解 Ray 在底層的工作原理,如何在雲中執行和擴充套件 Ray Clusters,以及如何使用 Ray 構建與您熟悉的專案整合的應用程式。

當然,無論您的角色如何,您都可以學習所有這些主題。我們的希望是,到本文結束時,您將學會欣賞 Ray 的所有優點。

本文目標

本文主要是為剛接觸 Ray 的讀者編寫的,希望他們能夠快速充分利用它。我們選擇的材料使您能夠瞭解 Ray 背後的核心思想,並學習使用其主要構建模組。讀完本文後,您將能夠輕鬆地自行導航更複雜的主題,這些主題超出了本文的介紹範圍。

我們還應該清楚本文不是什麼。它不是為了給您提供盡可能多的資訊,像 API 參考或權威那樣。它也不是為了幫助您完成具體任務,像操作或食譜那樣。本文專注於學習和理解 Ray,並為您提供有趣的範例來入門。

軟體發展和廢棄的速度很快,但軟體背後的基本概念即使在主要版本週期之間也往往保持穩定。我們試圖在傳達思想和提供具體程式碼範例之間取得平衡。本文中的思想即使在程式碼最終需要更新時也將繼續有用。

雖然 Ray 的檔案越來越好,但我們相信書籍可以提供專案檔案難以匹敵的品質。正如您正在閱讀這些文字一樣,我們意識到我們可能是在敞開大門。因為我們所知的一些最好的技術書籍能夠激發人們對專案的興趣,並讓您想要深入研究那些原本不會觸及的簡潔 API 。我們希望這就是這樣的一本文。

本文導讀

本文的組織結構旨在引導讀者從 Ray 的核心概念逐步深入到更進階的主題。書中的許多觀念都附有範例程式碼,讀者可在本文的 GitHub 儲存函式庫中找到這些程式碼。

本文章節概述

本文共分為十一章,前三章介紹 Ray 作為分散式 Python 框架的基礎知識,並提供實用的範例。第四章至第十章則深入介紹 Ray 的高階函式庫,並展示如何使用它們構建應用程式。最後一章對 Ray 的生態系統進行綜述,並指出讀者接下來可以探索的方向。

章節簡介

  1. Ray 概述

    • 本章介紹 Ray 的三層架構:核心層、機器學習函式庫層以及生態系統層。讀者將執行第一個 Ray 程式範例,對 Ray 的功能有初步瞭解。
  2. Ray Core 入門

    • 本章探討 Ray 專案的核心 API,介紹 Ray 任務和角色如何自然地擴充套件自 Python 函式和類別。同時也會介紹 Ray 的系統元件及其協同工作原理。
  3. 構建第一個分散式應用程式

    • 本章指導讀者使用 Ray Core 從零開始實作一個分散式強化學習應用程式,展示 Ray 在分散式 Python 程式碼方面的靈活性。
  4. 使用 Ray RLlib 進行強化學習

    • 本章簡要介紹強化學習,並展示 Ray 如何在 RLlib 中實作重要概念。讀者將共同構建一些範例,並探討更進階的主題,如課程學習或處理離線資料。
  5. 使用 Ray Tune 進行超引數最佳化

    • 本章討論高效調整超引數的挑戰、Ray Tune 的概念性工作原理,以及如何在實際的機器學習專案中使用它。
  6. 使用 Ray 進行資料處理

    • 本章介紹 Ray Datasets 抽象概念及其在其他資料處理系統中的地位。讀者將學習如何使用第三方整合工具,如在 Ray 上執行的 Dask。
  7. 使用 Ray Train 進行分散式訓練

    • 本章介紹分散式模型訓練的基礎知識,並展示如何將 Ray Train 與 PyTorch 等機器學習框架結合使用。同時也會介紹如何為模型新增自定義前處理器、使用回撥函式監控訓練,以及使用 Tune 調整模型的超引數。
  8. 使用 Ray Serve 進行線上推理

    • 本章介紹如何將訓練好的機器學習模型暴露為可從任何地方查詢的 API 端點。內容涵蓋 Ray Serve 如何應對線上推理的挑戰、其架構設計,以及實際使用方法。
  9. Ray 叢集

    • 本章討論如何組態、啟動和擴充套件用於應用程式的 Ray 叢集。讀者將瞭解 Ray 的叢集啟動器 CLI 和自動縮放器,以及如何在雲端設定叢集。此外,還會介紹如何在 Kubernetes 和其他叢集管理器上佈署 Ray。
  10. Ray AI Runtime 入門

    • 本章介紹 Ray AIR,一個為機器學習工作負載提供統一工具包的解決方案,支援多種第三方整合,用於模型訓練或存取自定義資料來源。
  11. Ray 的生態系統及展望

    • 本章綜述 Ray 多年來吸引的眾多有趣擴充套件和整合。

如何使用範例程式碼

本文的所有程式碼範例都可在 GitHub 儲存函式庫中找到。每章都有對應的筆記本,讀者可以邊讀邊操作,或稍後從 GitHub 下載程式碼執行。範例假設讀者已安裝 Python 3.7 或更高版本,並且已安裝 Ray。每一章都有特定的依賴要求,範例已在 Ray 2.2.0 版本上測試,建議讀者使用相同版本以確保相容性。

本文使用的排版慣例

  • 斜體:表示新術語、URL、電子郵件地址、檔案名稱和檔案副檔名。
  • 等寬字型:用於程式清單,以及在段落中參照程式元素,如變數或函式名稱、資料函式庫、資料型別、環境變數、陳述式和關鍵字。
  • 等寬粗體:表示應該由使用者逐字輸入的命令或其他文字。
  • <尖括號中的文字>:應該替換為使用者提供的值或由上下文決定的值。

使用範例程式碼的注意事項