跳轉到主要內容
工程的博客

加速你的深度學習PyTorch閃電磚

分享這篇文章

PyTorch閃電是一個很好的方法來簡化PyTorch代碼和引導你的深度學習的工作負載。擴展你的工作負載,從而獲得及時的結果中的數據Lakehouse也帶來了自身的挑戰。本文將解釋如何以及如何有效地實現規模與Horovod代碼。

介紹

越來越多的公司轉向深度學習,以加速他們的先進的機器學習應用。例如,計算機視覺技術如今用來改善製造缺陷檢查;自然語言處理是利用增強業務流程與聊天機器人基於神經網絡的推薦係統用於改善客戶的結果。

培訓深入學習模型,即使優化代碼,是一個緩慢的過程,這限製了數據科學團隊的能力快速遍曆實驗並取得成果。因此,重要的是要知道如何最好的利用計算能力以規模。

在本文中,我們將說明如何為最大第一結構你的代碼庫代碼重用然後展示如何規模從一個小單節點實例在一個完整的GPU集群。我們還將整合所有與MLflow提供完整的實驗記錄跟蹤和模型。

第1部分-數據加載和采用PyTorch閃電

首先讓我們先從一個目標體係結構。

集群設置

當擴展深度學習,重要的是要從小事做起,逐步擴大實驗,以有效地利用昂貴的GPU資源。擴大你的代碼運行在多個gpu在單個節點之前尋求規模跨多個節點來減少代碼的複雜性。

磚支持單節點的集群支持這種使用模式。看到的:Azure單節點集群,AWS單節點集群,GCP單節點集群。實例的選擇、T4 Nvidia gpu提供一個成本效益的實例類型。在AWS這些是可用的G4實例。在Azure中可用NCasT4_v3實例。豐富這些是可用的A2實例

通過筆記本,遵循一個實例類型至少64 gb的RAM是必需的。內存密集型和建模過程有可能耗盡內存較小的情況下,會導致以下錯誤。

致命錯誤:Python的內核沒有響應。

代碼是建立在磚機器學習和測試運行時10.4毫升LTS也11.1毫升DBR 10.4毫升LTS隻有pytorch-lightning 1.6.5支持。DBR 11.1 ML, pytorch-lightning 1.7.2已經測試。我們已經安裝了我們的圖書館工作區水平庫。與使用%皮普隻安裝庫的活躍的筆記本驅動節點,工作區庫安裝在稍後我們需要所有節點分布式訓練。

DBR 10.4 LTS毫升配置

磚運行時10.4 LTS毫升配置

DBR 11.1毫升的配置

Datbricks運行時配置11.1毫升
圖1:庫配置

目標體係結構

圖2:關鍵部件
圖2:關鍵部件

本文的目標是建立一個代碼結構化如上所述。我們將存儲數據使用開源的Linux基金會項目三角洲湖。在引擎蓋下,三角洲湖商店鋪格式的原始數據。Petastorm呈現數據加載職責之間的接口,並提供Lakehouse和深度學習模型。MLflow將提供實驗跟蹤工具,允許儲蓄模型,我們的模型注冊表。

使用這個設置,我們可以避免不必要的數據複製成本以及管理和管理模型,我們訓練。

第2部分概述——示例用例和圖書館

示例用例

對於這個用例的示例,我們將使用tensorflow花數據集。這種數據集將被用於一個分類問題,我們正試圖確定哪些類的花。

圖3:花的數據集
圖3:花的數據集

利用數據湖與Petastorm深度學習

在曆史上,數據管理係統Lakehouses和數據倉庫開發了並行而不是在與機器學習框架的集成。因此,PyTorch dataloader模塊不支持開箱即用的鑲花格式。他們也不像蜂巢metastore與Lakehouse集成元數據結構。

Petastorm項目提供Lakehouse表和PyTorch之間的接口。它還處理數據分片跨節點和訓練提供了一個緩存層。Petastorm預打包的磚毫升的運行時。

我們先熟悉數據集和如何使用它。值得注意的是,所有我們需要做的將火花dataframe petastorm對象代碼:

peta_conv_df = make_spark_converter (preprocessed_df)

一旦我們有了spark_converter對象可以轉換成PyTorch Dataloader使用:

peta_conv_df.make_torch_dataloader (transform_spec = transform_func)作為converted_dataset

這就提供了一個converted_datasetDataLoader pytorch中我們可以使用代碼按正常。

開放和遵循筆記本題為:探索花數據集。標準的ML集群運行時就足夠了,不需要運行在GPU集群。

簡化和結構模型——輸入PyTorch閃電

默認情況下,PyTorch代碼可以很詳細。模型定義,訓練循環和dataloaders的設置。默認情況下所有這些代碼混合在一起,使得很難交換數據和模型,可以快速試驗的關鍵。

PyTorch閃電有助於使這個簡單,大大降低了所需樣板建立實驗模型和主訓練循環。這是一個固執己見的方法構建PyTorch允許更可讀的代碼可維護的代碼。

對於我們的項目,我們將代碼分解成三個主要模塊

  • PyTorch模型
  • 數據加載器和轉換
  • 主要培訓循環

這將有助於使我們的代碼的可移植性更好,同時改善組織。這些類和函數都被拉到主要執行筆記本,通過運行%,培訓hyperparameters將定義和實際執行的代碼。

圖4:代碼布局
圖4:代碼布局

模型定義:

這個模塊包含的代碼模型架構本身在一個模型類,LightningModule。這就是模型架構的生活。供參考,這是需要更新的模塊利用流行的模型框架蒂姆,HuggingFace等。這個模塊還包含當今的定義。在本例中,我們隻使用SGD但它可以parameterised測試其他類型的當今。

DataLoader類:

與本地PyTorch,數據加載程序代碼和模型代碼混雜在一起,PyTorch閃電讓我們到一個單獨分離出來LightningDataModule類。這樣可以更容易的管理數據和快速測試數據集的不同交互的能力。

當構建一個LightningDataModule與Petastorm dataloader,我們喂spark_converter對象而不是原始的火花dataframes。火花Dataframe由底層火花集群,已分配,而PyTorch Dataloader以後將通過其他方式分布。

主要培訓循環:

這是主要的培訓功能。需要的LightningDataModuleLightningModule定義模型之前給到教練類。我們將實例化PyTorch閃電教練和定義所有必要的回調。

我們擴大培訓過程後,我們不需要一些過程像MLflow日誌處理節點上運行。因此,我們將限製這些第一隻GPU上運行。

如果device_id = =0:#我們隻需要在節點0mlflow.pytorch.autolog ()

檢查點保存進步我們的模型在訓練是很重要的,但PyTorch照明默認情況下處理這個問題對我們和我們不需要添加代碼。

跟隨的構建PyTorch閃電模塊筆記本


第3部分-擴展培訓工作

而單一的GPU培訓要快得多的CPU,這往往是不夠的。適當的生產模型可以大,所需的數據集訓練這些正確也會大。因此我們需要考慮我們如何跨多個gpu可以擴展我們的培訓。

分布深度學習模型的主要方法是通過數據的並行性,我們發送一個副本模型每個GPU和飼料中不同的數據碎片。這讓我們增加批量大小和高等杠杆率提高培訓倍了這篇文章

協助我們分布在gpu上我們可以利用Horovod培訓工作。Horovod是另一個Linux基金會項目,為我們提供了另一種手動觸發分布式pytorch流程跨多個節點。磚毫升運行時包括默認情況下HorovodRunner類,幫助我們對單節點和多節點規模的訓練。

為了利用horovod,我們需要創建一個新的“超級”列車循環。

def train_hvd ():hvd.init ()# MLflow設置工作流程mlflow.set_tracking_uri(“磚”)os.environ [“DATABRICKS_HOST”]=db_hostos.environ [“DATABRICKS_TOKEN”]=db_token
              hvd_model=LitClassificationModel (class_count=5,learning_rate=1 e-5*device_id hvd.size ()=hvd。排名(),device_count=hvd.size ())hvd_datamodule=FlowersDataModule (train_converter val_converter device_id=hvd。排名(),device_count=hvd.size ())#“gpu”參數這裏應該是1由於並行性控製通過Horovod返回火車(hvd_model hvd_datamodule, gpu=1、戰略=”device_id horovod”=hvd。排名(),device_count=hvd.size ())

這個函數將horovod開始hvd.init ()並確保DataModule和訓練函數觸發正確的節點數量,hvd.rank ()和設備的總數hvd.size ()。如前所述在這個horovod文章我們擴大了學習速率與gpu的數量。

hvd_model=LitClassificationModel (class_count=5,learning_rate=1 e-5*device_id hvd.size ()=hvd。排名(),device_count=hvd.size ())

然後我們返回正常的訓練循環與gpu數設置為1 Horovod是並行處理。

跟隨的主要執行筆記本我們將經曆從單一到Multi-GPU方法。

步驟1 -比例在一個節點上

圖5:單節點擴展
圖5:單節點擴展

擴展規模一個節點是最簡單的方法。也非常多節點所需的性能,因為它避免了網絡流量的訓練。Spark-native毫升庫不同,大多數深度學習訓練過程不會自動從節點故障中恢複。PyTorch閃電,然而,是否自動保存檢查點恢複訓練時期。

在我們的代碼中,我們設置了default_dir參數dbfs位置在火車上的功能。這就是PyTorch閃電將節省的檢查點。如果我們設定一個ckpt_restore路徑指向ckpt,火車從檢查站函數將恢複訓練。

def火車(模型、dataloader gpu:int=0,策略:str=沒有一個device_id:int=0,device_count:int=1logging_level = logging.INFO,default_dir:str=' / dbfs / tmp / trainer_logs ',ckpt_restore:str=沒有一個,mlflow_experiment_id:str=沒有一個):

擴展我們的訓練函數多個gpu在一個節點上,我們將使用HorovodRunner:

sparkdl進口HorovodRunnerhr = HorovodRunner (np = -4driver_log_verbosity =“所有”)hvd_model = hr.run (train_hvd)

設置np-那麼它將運行在單個節點上,司機節點上4 gpu在這個例子中,或在工作節點np是正的。

步驟2 -跨節點擴展

圖5:多節點擴展
圖5:多節點擴展

我們已經把我們的培訓horovod包裝器函數,我們已經成功地為單節點杠杆HorovodRunner multi-gpu處理。最後一步是去一個多節點/ multi-gpu設置。如果你已經按照單個節點集群,這是點,我們將搬到一個多節點集群。對於之前的代碼,我們將使用集群配置如下所示:

圖6:多節點集群的設置
圖6:多節點集群的設置

當運行分布式訓練數據磚,目前不支持自動定量我們將工人提前固定數量。

hr = HorovodRunner (np =8driver_log_verbosity =“所有”)hvd_model = hr.run (train_hvd)

一個常見的問題,這些都將發生在你擴大分布深度學習工作是petastorm表沒有分區,確保所有的gpu得到一批分裂。我們需要確保至少盡可能多的數據分區gpu

我們在代碼解決這個問題通過設置的gpuprepare_data函數與num_devices變量。

flowers_df、train_converter val_converter = prepare_data (data_dir = Data_Directory num_devices = num_devices)
              datamodule = FlowersDataModule (train_converter = train_converter,val_converter = val_converter)

這隻是調用一個標準的火花再分配命令。我們設置分區的數量是多的num_devicesgpu的數量,確保數據集有足夠的分區的gpu用於訓練過程。不足空轉gpu的分區是一種常見的原因。

flowers_dataset = flowers_dataset.repartition (num_devices * 2)

分析

深層神經網絡訓練時,重要的是要確保我們不會overfit網絡。標準的方法來管理這是利用早期停止。這個過程檢查確保每個時代,我們仍然看到改進,我們將它設置為監測的指標。在這種情況下,val_loss

在我們的實驗中,我們設置min_delta到0.01,所以我們希望看到至少0.01的改進val_loss每一個時代。我們設置耐心10所以火車循環將繼續運行10時代沒有改善的培訓前停了下來。我們這確保我們可以擠出最後一滴的性能。保持實驗短,我們還設置一個stopping_threshold0.55我們將停止訓練過程val_loss低於這個水平。

記住這些參數,我們擴展實驗的結果如下:

樣本深度學習實驗集群擴展性能,運行時間與集群的設置

樣本深度學習實驗集群擴展性能,val損失(低更好)和集群的設置

我們可以看到,在運行時間和集群設置圖表,我們幾乎一半的訓練時間增加了係統資源。由於的比例並不是線性的開銷在不同的gpu協調訓練過程。當縮放深度學習,通常看到收益遞減,因此重要的是要確保火車循環添加gpu之前是有效的。

這不是完整的圖片,不過,按照最佳實踐建議在我們以前的博客文章,(不)如何規模深度學習在6簡單的步驟,我們使用EarlyStopping因此重要的是要檢查最後確認損失通過各種培訓運行。在這個例子中,我們設置了stopping_threshold0.55。有趣的是,單一GPU設置停在驗證損失比multi-gpu設置。單一GPU訓練跑,直到沒有更多的改進val_loss

開始

我們已經展示了如何利用PyTorch閃電在磚和包裝的HorovodRunner跨多個節點規模以及如何利用提供一些指導EarlyStopping。現在輪到你去嚐試。

筆記本電腦:

探索花數據集
構建PyTorch閃電模塊
主要執行筆記本

參見:

HorovodRunner
Petastorm
深度學習的最佳實踐
(不)深度學習規模如何
平整的競技場:HorovodRunner分布式深度學習培訓

免費試著磚

相關的帖子

看到所有工程的博客的帖子
Baidu
map