Accelerate 文件

Accelerate 的內部機制

Hugging Face's logo
加入 Hugging Face 社群

並獲得增強的文件體驗

開始使用

Accelerate 的內部機制

在內部,Accelerate 首先分析指令碼啟動的環境,以確定使用了哪種分散式設定、有多少個不同的程序以及當前指令碼所在的程序。所有這些資訊都儲存在 ~AcceleratorState 中。

這個類在您第一次例項化 ~Accelerator 時被初始化,並執行分散式設定所需的任何特定初始化。然後,它的狀態在所有 AcceleratorState 例項中唯一共享。(同樣的操作也可以透過 PartialState 完成,它是一個更精簡的版本,並且繼承自 AcceleratorState

然後,當呼叫 prepare() 時,該庫會

雖然模型、最佳化器和排程器只是被放入簡單的包裝器中,但資料載入器是重新建立的。這主要是因為 PyTorch 不允許使用者在資料載入器建立後更改其 batch_sampler,而該庫透過更改 batch_sampler 來處理程序間的資料分片,使其每隔 num_processes 個批次產生一個批次(如果啟用)。

DataLoaderShard 子類化了 DataLoader 並添加了以下功能:

  • 它在每次新迭代時同步所有程序的適當隨機數生成器,以確保任何隨機化(如洗牌)在所有程序中都以完全相同的方式進行。
  • 它在產生批次之前將批次放在正確的裝置上(除非您已選擇退出 device_placement=True)。

DataLoaderDispatcher 子類與 DataLoaderShard 的不同之處在於,在迭代 DataLoader 時,資料全部從程序 0 開始,然後 才被分割併發送到每個程序,而不是在資料集層面進行。

隨機數生成器的同步預設會同步:

  • 對於 PyTorch >= 1.6,同步給定取樣器(如 PyTorch RandomSampler)的 generator 屬性
  • 在 PyTorch <=1.5.1 中同步主隨機數生成器

您可以使用主 Acceleratorrng_types 引數選擇要同步的隨機數生成器。在 PyTorch >= 1.6 中,建議依賴本地 generator 以避免在所有程序的主隨機數生成器中設定相同的種子。

同步主 torch(或 CUDA 或 XLA)隨機數生成器將影響資料集中任何其他潛在的隨機因素(如隨機資料增強),因為所有程序將從 torch 隨機模組獲得相同的隨機數(因此如果由 torch 控制,將應用相同的隨機資料增強)。

自定義取樣器、批處理取樣器或可迭代資料集的隨機化部分應使用本地 torch.Generator 物件(在 PyTorch >= 1.6 中),可參考傳統的 RandomSampler 作為示例。

如果您安裝了 torchdata>=0.8.0,並且已將 use_stateful_dataloader=True 傳入您的 DataLoaderConfiguration,這些類將直接從 StatefulDataLoader 繼承,並維護一個 state_dict

有關內部的更多詳細資訊,請參閱內部頁面

< > 在 GitHub 上更新

© . This site is unofficial and not affiliated with Hugging Face, Inc.