Accelerate 文件
Accelerate 的內部機制
並獲得增強的文件體驗
開始使用
Accelerate 的內部機制
在內部,Accelerate 首先分析指令碼啟動的環境,以確定使用了哪種分散式設定、有多少個不同的程序以及當前指令碼所在的程序。所有這些資訊都儲存在 ~AcceleratorState
中。
這個類在您第一次例項化 ~Accelerator 時被初始化,並執行分散式設定所需的任何特定初始化。然後,它的狀態在所有 AcceleratorState 例項中唯一共享。(同樣的操作也可以透過 PartialState 完成,它是一個更精簡的版本,並且繼承自 AcceleratorState
)
然後,當呼叫 prepare() 時,該庫會
- 將您的模型包裝在適用於分散式設定的容器中,
- 將您的最佳化器包裝在 AcceleratedOptimizer 中,
- 將您的排程器包裝在 AcceleratedScheduler 中
- 在 DataLoaderShard 或 DataLoaderDispatcher 中建立資料載入器的新版本
雖然模型、最佳化器和排程器只是被放入簡單的包裝器中,但資料載入器是重新建立的。這主要是因為 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 中同步主隨機數生成器
您可以使用主 Accelerator 的 rng_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 上更新