官术网_书友最值得收藏!

1.3 數據科學庫套件

接下來進入Ray的第二層,本節將簡要介紹Ray附帶的所有數據科學庫。為此,我們首先從整體上了解什么是數據科學。一旦理解了數據科學的背景,就更容易學習Ray的高級庫,并了解它們的功能。

1.3.1 Ray AIR和數據科學工作流

近年來,數據科學(Data Science,DS)發展迅速,連該術語本身都變得有些難以捉摸,可以在網上找到許多關于數據科學的定義,這些定義都有一定的道理[11]。我們將“數據科學”定義為利用數據獲得洞見,并創建實際應用。這是在實踐和應用層面做出的廣義定義,重點是理解事物并獲得新知。從這個意義上說,將這個領域的從業者描述為“數據科學家”,就像將黑客描述為“計算機科學家”一樣不準確[12]

從宏觀上看,數據科學是一個不斷迭代的過程,涉及提出需求、收集和處理數據、搭建和評估模型、部署模型。機器學習不一定屬于這個過程,但通常是環節之一。如果涉及機器學習,可以進一步列出以下步驟:

處理數據

為了訓練機器學習模型,需要將數據轉換為模型能夠理解的格式。將數據經過轉換、選擇后再輸入模型的過程通常被稱為特征工程。特征工程可能非常煩瑣,如果你能熟練使用常用工具進行數據處理,可以節省許多精力。

訓練模型

在機器學習中,需要利用處理好的數據訓練算法。這個步驟需要選擇合適的算法,如果你能從多種算法中選出恰當的算法,會很有幫助。

調優超參數

在模型訓練步驟中,需要對模型進行參數調優。大多數機器學習模型中還有一組被稱為超參數的參數,可以在訓練之前對其進行修改。這些參數會對最終模型的性能產生重大影響,需要進行適當的調優。有一些很好的工具可以實現自動化超參數調優。

部署模型

訓練好的模型需要部署。部署模型意味著用戶通過任何途徑都可以訪問該模型。在原型中,通常使用簡單的HTTP服務器,此外也有許多專門用于機器學習模型部署的軟件包。

這個列表并不完整,構建機器學習應用還涉及許多其他內容[13]。但是,可以肯定的是,這4個步驟對于使用機器學習的數據科學項目成功與否至關重要。

Ray為這4個與機器學習息息相關的步驟提供了專門的庫。具體而言,你可以使用Ray Dataset處理數據,使用Ray Train進行分布式模型訓練,使用Ray RLlib運行強化學習計算任務,使用Ray Tune高效調優超參數,并使用Ray Serve部署模型。而且,Ray在設計這4個組件時也是基于分布式理念的。

另外,所有這些步驟都從屬于訓練模型的過程,極少單獨使用。你希望Ray的庫不僅支持無縫協同工作,還能使用高度一致的API,因此極具優勢。Ray AIR就是為此設計的,它能提供統一的運行時和API,還能隨時進行擴展。圖1.2展示了AIR的所有組件。

圖1.2:Ray AIR的組件

雖然本章篇幅有限,無法詳細介紹Ray AIR的API(詳見第10章),但會介紹Ray AIR中的所有組件。

1.3.2 處理數據

我們首先介紹Ray Datasets。該庫包含一個名為Dataset的數據結構、多種用于從各種格式和系統加載數據的連接器、用于轉換數據集的API,以及使用它們構建數據處理管道的方法,另外還有用于和其他數據處理框架進行集成的插件。Dataset是基于強大的Arrow框架(https://arrow.apache.org)創建的[14]

要使用Ray Dataset,你需要為Python安裝Arrow,使用命令pip install pyarrow進行安裝。下面的示例使用Python數據結構創建了一個位于本地Ray集群的分布式Dataset。具體來說,利用包含字符串name和整數值data的Python字典,創建包含10000個條目的數據集:

? 通過ray.data模塊的from_items方法創建Dataset。

? 輸出Dataset的前5項。

Dataset的show方法表示輸出其中的值。命令行中應該輸出5個元素,如下所示:

對于輸出的數據,可以進行什么處理呢?Dataset API大量使用了函數式編程,這是因為函數式編程非常適合進行數據轉換。

盡管Python 3隱藏了一些函數式編程的功能,但你可能熟悉其中一些,如map、filter、flat_map等。如果不熟悉,這些方法也很容易掌握:map將數據集的每個元素并行轉換為其他值;filter根據布爾過濾函數刪除數據點;flat_map首先用map將值進行映射,然后“展平”結果。例如,如果map生成了一個嵌套列表,flat_map將展平嵌套的列表,只返回列表。使用這三個API[15],我們查看如何操作數據集ds:

? 將ds的每一行map為僅保留其數據項的平方值。

? 使用filter過濾掉squares中的奇數,只保留偶數(總共5000個元素)。

? 使用flat_map將剩余的值變為立方值。

? take(10)表示退出Ray,并返回一個包含這些值的Python列表,支持輸出這些值。

Dataset轉換的缺點是每個步驟都是同步執行的。雖然在這個示例中不會導致什么問題,但是對于復雜的任務,例如混合讀取文件和處理數據,你可能希望將子任務進行重疊,此時可以使用DatasetPipeline。我們將前面的示例重寫為管道:

? 通過在Dataset上調用.window(),將其轉換為管道。

? 管道支持鏈式操作,結果不變。

關于Ray Dataset還有很多內容值得探討,特別是它與數據處理系統的集成,第6章將對此進行詳細討論。

1.3.3 訓練模型

接下來介紹Ray的分布式訓練庫,一個專門用于強化學習,另一個主要用于監督學習。

使用Ray RLlib進行強化學習

首先介紹使用Ray RLlib庫進行強化學習。Ray RLlib基于機器學習框架TensorFlow和PyTorch,這兩個框架從概念上越來越相近,不存在太大差異,開發者可自由進行選擇。本書示例既使用了TensorFlow,也使用了PyTorch,方便讀者進行學習。

可以通過命令pip install tensorflow安裝TensorFlow[16]。要運行代碼示例,還需要使用pip install安裝gym庫。

使用RLlib運行示例的簡單方法是使用命令行工具rllib,我們在運行pip install "ray[rllib]"時已經隱式安裝了它。在第4章運行更復雜的示例時,主要依賴其Python API,本小節將帶你初步了解如何使用RLlib運行RL項目。

下面討論一個經典的控制問題,即在小車上平衡桿子。假設有一個如圖1.3所示的桿子,固定在小車的連接處,桿子受到重力的作用。小車可以沿著無摩擦軌道自由移動,我們可以通過給小車向左或向右的力來操縱小車。如果施加的力恰當,桿子將保持直立。對于每個時間步,如果桿子沒有倒下,那么我們都會獲得1的獎勵。我們的目標是訓練強化學習算法,以獲得更高的獎勵。

圖1.3:通過向左或向右施加力來控制連接在小車上的桿子

具體而言,我們希望訓練一個強化學習智能體,它可以執行兩個動作,即向左或向右推動小車,并觀察以這種方式與環境交互時會發生什么,并通過最大化獎勵從經驗中學習。

為了使用Ray RLlib解決這個問題,可以使用一個所謂的調優示例,這是一個預先配置的算法,可以很好地運行給定的問題。可以通過簡單的命令運行調優示例。RLlib中有許多這樣的示例,可以使用rllib example list列出示例。

其中一個可用的示例是cartpole-ppo,這是一個經過調優的示例,它使用PPO算法解決了平衡車桿問題。具體而言,它解決了OpenAI Gym中的CartPole-v1環境(https://oreil.ly/YNxoz)問題。你可以通過輸入rllib example get cartpole-ppo查看此示例的配置,該命令首先從GitHub下載示例文件,然后輸出其配置。該配置是以YAML文件格式進行編碼的,如下所示:

? CartPole-v1環境模擬了車桿問題。

? 使用一種強大的強化學習算法,稱為近端策略優化算法(Proximal Policy Optimization,PPO)。

? 獎勵達到150則停止實驗。

? 為了使PPO算法對該問題生效,需要對強化學習進行配置。

目前,配置文件的詳細內容并不重要,這里不進行討論。重要的是指定Cartpole-v1環境和配置強化學習,以確保訓練過程正常進行。運行此配置不需要任何特殊的硬件,通常可在幾分鐘內完成。要訓練此示例,需要使用pip install pygame安裝PyGame依賴項,然后運行以下命令:

運行該命令后,RLlib會創建具有命名的項目并記錄重要的指標,如reward或episode_reward_mean。在訓練運行的輸出中,你還應該看到有關機器(loc,表示主機名和端口)以及訓練運行狀態的信息。如果運行狀態為TERMINATED,但在日志中未看到成功運行的項目,則可能出現了問題。下面是訓練運行的示例輸出:

當成功完成訓練時,可以看到如下輸出:

現在,可以從任何檢查點評估訓練好的算法,例如運行以下命令:

默認情況下,本地Ray檢查點文件夾是~/ray-results。對于我們使用的訓練配置,<checkpoint-path>應該是形式為~/ray_results/cartpole-ppo/PPO_CartPole-v1_<experiment_id>的路徑。在訓練過程中,中間和最終的模型檢查點會生成到此文件夾中。

為了評估訓練好的強化學習算法的性能,現在可以從檢查點進行評估,只需復制前面示例訓練運行輸出的命令即可:

運行此命令將輸出評估結果,即訓練好的強化學習算法在CartPole-v1環境中獲得的獎勵。

RLlib還支持許多其他功能,詳見第4章。這個示例的目的是展示如何通過example和evaluate命令輕松使用RLlib和rllib命令行工具。

使用Ray Train進行分布式訓練

Ray RLlib專注于強化學習,但如果你需要為其他類型的機器學習(如監督學習)訓練模型,該怎么辦呢?這種情況下可以使用Ray Train。目前,我們對諸如TensorFlow之類的框架介紹不多,因此無法提供簡潔且信息豐富的Ray Train示例。如果你對分布式訓練感興趣,可以直接跳到第6章。

1.3.4 調優超參數

正如其名,Ray Tune可用于調優各種參數,專門用于為機器學習模型尋找適合的超參數。典型步驟如下:

● 假設運行一個計算量極大的訓練函數。在機器學習中,訓練過程可能會持續幾天甚至幾周,但我們假設只需要幾分鐘。

● 作為訓練結果,要對目標函數進行計算。通常情況下,要么希望最大化收益,要么希望最小化性能損失。

● 不過,訓練函數可能依賴于某些參數,即超參數,這些參數會影響目標函數的值。

● 你可能只知道如何調優個別超參數,但調優所有超參數很困難。即使將所有參數限制在合理的范圍內,測試各種組合通常也是不切實際的,因為訓練函數成本過高。

為了高效地采樣超參數并獲得“足夠好”的結果,可以使用超參數調優(Hyperparameter Optimization,HPO)解決此問題,Ray Tune提供了一套龐大的算法來進行超參數調優。接下來,我們使用Ray Tune作為示例處理剛剛的問題。重點仍然是Ray及其API,而不是特定的機器學習任務(我們目前只是進行模擬):

? 模擬一個大計算量的訓練函數,該函數依賴于從config讀取的兩個超參數x和y。

? 睡眠10s以模擬訓練和計算目標函數,然后將分數報告給tune。

? 目標函數計算x和y的平方均值,并返回該項的平方根。這種類型的目標函數在機器學習中非常常見。

? 使用tune.run初始化training_function上的超參數調優。

? 為tune提供x和y參數空間以進行搜索。

這段代碼的輸出結構與RLlib示例非常類似,這是因為RLlib(和許多其他Ray庫一樣)在底層使用了Ray Tune。如果仔細觀察的話,你會看到等待執行的PENDING任務,以及RUNNING和TERMINATED任務。Tune會自動進行選擇、調度和執行訓練函數。

具體而言,這個Tune示例會找到參數x和y的最佳選擇,用于最小化training_function的給定objective。盡管剛開始接觸目標函數可能覺得比較難,因為計算的是x和y的平方和,所以所有值都是非負的。這意味著在x=0和時獲得最小值,此時目標函數的值為

我們對所有可能的參數組合進行網格搜索。由于顯式地傳入了5個可能的x值和y值,因此總共有25個組合被輸入訓練函數。由于指示訓練函數睡眠10s,因此順序測試所有超參數的組合將總共需要超過4min。Ray使用了并行化計算,整個實驗只花費了約35s的時間,但根據每個人運行的環境,可能需要更長時間。

現在,假設每次訓練都需要花費數小時,并且有20個而不是2個超參數。這使得網格搜索變得不可行,特別是在對參數范圍沒有明確評估的情況下。在這種情況下,必須使用Ray Tune中更復雜的HPO方法,詳見第5章。

1.3.5 部署模型

Ray Serve是專門用于部署模型的高級庫。為了查看Ray Serve的實際示例,需要一個已經訓練好的機器學習模型,我們可以從互聯網上找到許多有趣并且已經訓練好的模型。例如,Hugging Face提供了許多可以直接在Python中下載的模型。接下來使用GPT-2語言模型,它以文本作為輸入并生成后續文本或補全文本。例如,你可以提出一個問題,GPT-2將嘗試為其提供完整的答案。

部署模型可以讓模型方便訪問。你可能不知道如何在計算機上加載和運行TensorFlow模型,但一定知道如何提出問題。模型部署隱藏了解決方案的實現細節,讓用戶專注于提供輸入和理解模型的輸出。

要運行示例,需要運行pip install transformers安裝Hugging Face庫,該庫包含接下來要使用的模型[17]。安裝好后,可以導入并啟動Ray的serve庫實例,加載并部署GPT-2模型,并詢問它關于生命的意義,如下所示:

? 本地啟動serve。

? @serve.deployment裝飾器將帶有request參數的函數轉化為serve部署。

? 雖然對每個請求加載model函數的language_model效率不高,但這樣能以最快的方式展示部署。

? 指示模型最多用100個字符繼續查詢。

? 正式部署模型,以便可以通過HTTP接收請求。

? 使用requests庫獲取響應。

在第9章中,你將學習如何在各種場景中正確部署模型,本小節只是鼓勵讀者嘗試使用此示例并測試不同的查詢。重復運行代碼的最后兩行,幾乎每次都會得到不同的答案。以下是一個問題集合,包含許多問題:

通過以上介紹,我們對Ray的數據科學庫做了快速瀏覽,這是Ray的第二層。本質上,本章介紹的所有高級Ray庫都是Ray Core API的擴展。基于API,可以相對容易地創建Ray的擴展,其中包括一些本書無法完整討論的擴展。例如,相對較新的Ray Workflows(https://oreil.ly/XUT7y)支持使用Ray定義和運行需要長時間運行的應用程序。

在結束本章之前,我們簡要了解圍繞Ray的蓬勃發展的生態。

主站蜘蛛池模板: 德化县| 琼中| 卓尼县| 诏安县| 浠水县| 衡山县| 扶绥县| 临武县| 麻栗坡县| 湘西| 凤冈县| 定结县| 米林县| 大英县| 会东县| 卓尼县| 盐边县| 平乐县| 蒲江县| 灌云县| 武安市| 军事| 贺兰县| 来宾市| 二连浩特市| 石河子市| 华坪县| 衢州市| 吴旗县| 淮南市| 华池县| 兰溪市| 汤阴县| 昂仁县| 东至县| 双柏县| 乡宁县| 亳州市| 马关县| 定边县| 临沭县|