Accelerate 文件
資料載入器、最佳化器和排程器
並獲得增強的文件體驗
開始使用
資料載入器、最佳化器和排程器
在呼叫 prepare() 時,Accelerate 用於為分散式訓練準備物件的內部類。
DataLoader 實用工具
accelerate.data_loader.prepare_data_loader
< 原始碼 >( dataloader: DataLoader device: typing.Optional[torch.device] = None num_processes: typing.Optional[int] = None process_index: typing.Optional[int] = None split_batches: bool = False put_on_device: bool = False rng_types: typing.Optional[list[typing.Union[str, accelerate.utils.dataclasses.RNGType]]] = None dispatch_batches: typing.Optional[bool] = None even_batches: bool = True slice_fn_for_dispatch: typing.Optional[typing.Callable] = None use_seedable_sampler: bool = False data_seed: typing.Optional[int] = None non_blocking: bool = False use_stateful_dataloader: bool = False torch_device_mesh = None ) → torch.utils.data.dataloader.DataLoader
引數
- dataloader (
torch.utils.data.dataloader.DataLoader
) — 需要在多個裝置間拆分的資料載入器。 - device (
torch.device
) — 返回的DataLoader
的目標裝置。 - num_processes (
int
, 可選) — 併發執行的程序數。預設為 PartialState 給定的值。 - process_index (
int
, 可選) — 當前程序的索引。預設為 PartialState 給定的值。 - split_batches (
bool
, 可選, 預設為False
) — 結果DataLoader
是否應將原始資料載入器的批次拆分到各個裝置上,還是生成完整的批次(在這種情況下,它將從第process_index
個批次開始生成,並在每次迭代中前進num_processes
個批次)。換句話說,如果此選項設定為
True
,觀察到的批次大小將與初始dataloader
相同,否則為初始dataloader
的批次大小乘以num_processes
。將此選項設定為
True
要求dataloader
的批次大小是batch_size
的整數倍。 - put_on_device (
bool
, 可選, 預設為False
) — 是否將批次放到device
上(僅當批次是張量的巢狀列表、元組或字典時才有效)。 - rng_types (
str
或 RNGType 列表) — 每次迭代開始時需要同步的隨機數生成器列表。應為以下一項或多項:"torch"
:基礎 torch 隨機數生成器"cuda"
:CUDA 隨機數生成器(僅 GPU)"xla"
:XLA 隨機數生成器(僅 TPU)"generator"
:取樣器(或如果沒有采樣器,則是批次取樣器)的torch.Generator
,或者如果底層資料集是可迭代資料集型別,則是可迭代資料集的torch.Generator
(如果存在)。
- dispatch_batches (
bool
, 可選) — 如果設定為True
,準備好的資料載入器僅在主程序上迭代,然後將批次拆分並廣播到每個程序。當底層資料集是IterableDataset
時,預設為True
,否則為False
。 - even_batches (
bool
, 可選, 預設為True
) — 如果設定為True
,當所有程序的總批次大小不能完全整除資料集時,將複製資料集開頭的樣本,以便批次可以平均分配給所有工作程序。 - slice_fn_for_dispatch (
Callable
, 可選`) -- 如果傳遞,此函式將用於跨 `num_processes` 切分張量。預設為 [slice_tensors()](/docs/accelerate/v1.10.0/en/package_reference/utilities#accelerate.utils.slice_tensors)。此引數僅在 `dispatch_batches` 設定為 `True` 時使用,否則將被忽略。 - use_seedable_sampler (
bool
, 可選, 預設為False
) — 是否使用SeedableRandomSampler
代替RandomSampler
以獲得更好的可復現性。這可能會因不同的洗牌演算法而導致效能差異,但能確保結果*完全*相同。應在每個self.set_epoch
處與set_seed()
配合使用。 - data_seed (
int
, 可選, 預設為None
) — 在使用use_seedable_sampler
時,用於底層生成器的種子。如果為None
,生成器將使用 torch 的當前預設種子。 - non_blocking (
bool
, 可選, 預設為False
) — 如果設定為True
,資料載入器將利用非阻塞主機到裝置的資料傳輸。如果資料載入器的pin_memory
設定為True
,這將有助於增加資料傳輸和計算之間的重疊。 - use_stateful_dataloader (
bool
, 可選, 預設為False
) — 如果設定為 true,由 Accelerator 準備的資料載入器將由 ” ”torchdata.StatefulDataLoader 支援。這需要安裝支援 StatefulDataLoader 的 `torchdata` 0.8.0 或更高版本。 - torch_device_mesh (
torch.distributed.DeviceMesh
, 可選, 預設為None
) — PyTorch 裝置網格。
返回
torch.utils.data.dataloader.DataLoader
一個新的資料載入器,它將生成批次的一部分。
包裝一個 PyTorch `DataLoader`,使其僅為其中一個程序生成批次。
根據傳入的 dataloader
的 drop_last
屬性值,它要麼在第一個太小/並非在所有程序上都存在的批次處停止迭代,要麼從頭開始迴圈索引。
預設情況下不啟用具有可變批次大小的 BatchSampler
。要啟用此行為,請將 `even_batches` 設定為 `False`。
建立一個 `torch.utils.data.DataLoader`,它將高效地跳過前 `num_batches` 個批次。如果原始資料載入器是 `StatefulDataLoader`,則不應使用此函式。
BatchSamplerShard
class accelerate.data_loader.BatchSamplerShard
< 原始碼 >( batch_sampler: BatchSampler num_processes: int = 1 process_index: int = 0 split_batches: bool = False even_batches: bool = True )
引數
- batch_sampler (
torch.utils.data.sampler.BatchSampler
) — 需要拆分成多個分片的批次取樣器。 - num_processes (
int
, 可選, 預設為 1) — 併發執行的程序數。 - process_index (
int
, 可選, 預設為 0) — 當前程序的索引。 - split_batches (
bool
, 可選, 預設為False
) — 是否透過拆分一個批次在每個程序上分配一部分來建立分片,還是在每個程序上生成不同的完整批次。在兩個程序上,對於一個取樣器 `[[0, 1, 2, 3], [4, 5, 6, 7]]`,結果將是:
- 如果此引數設定為
False
,程序 0 上的取樣器將生成 `[0, 1, 2, 3]`,程序 1 上的取樣器將生成 `[4, 5, 6, 7]`。 - 如果此引數設定為
True
,程序 0 上的取樣器將生成 `[0, 1]` 然後是 `[4, 5]`,而程序 1 上的取樣器將生成 `[2, 3]` 然後是 `[6, 7]`。
- 如果此引數設定為
- even_batches (
bool
, 可選, 預設為True
) — 當樣本數不是(原始批次大小 / 程序數)的整數倍時,是否從取樣器開頭迴圈。
包裝一個 PyTorch `BatchSampler`,使其僅為其中一個程序生成批次。此類的例項將始終生成 `num_processes` 的整數倍數量的批次,並且所有批次大小相同。根據傳入的批次取樣器的 `drop_last` 屬性值,它要麼在第一個太小/並非在所有程序上都存在的批次處停止迭代,要麼從頭開始迴圈索引。
預設情況下不啟用具有可變批次大小的 BatchSampler
。要啟用此行為,請將 `even_batches` 設定為 `False`。
IterableDatasetShard
class accelerate.data_loader.IterableDatasetShard
< 原始碼 >( dataset: IterableDataset batch_size: int = 1 drop_last: bool = False num_processes: int = 1 process_index: int = 0 split_batches: bool = False )
引數
- dataset (
torch.utils.data.dataset.IterableDataset
) — 需要拆分成多個分片的批次取樣器。 - batch_size (
int
, 可選, 預設為 1) — 每個分片的批次大小(如果split_batches=False
)或批次大小(如果split_batches=True
)。 - drop_last (
bool
, 可選, 預設為False
) — 是丟棄最後一個不完整的批次,還是透過使用開頭的樣本來補全最後一個批次。 - num_processes (
int
, 可選, 預設為 1) — 併發執行的程序數。 - process_index (
int
, 可選, 預設為 0) — 當前程序的索引。 - split_batches (
bool
, 可選, 預設為False
) — 是否透過拆分一個批次在每個程序上分配一部分來建立分片,還是在每個程序上生成不同的完整批次。在兩個程序上,對於一個可迭代資料集生成 `[0, 1, 2, 3, 4, 5, 6, 7]`,結果將是:
- 如果此引數設定為
False
,程序 0 上的分片將生成 `[0, 1, 2, 3]`,程序 1 上的分片將生成 `[4, 5, 6, 7]`。 - 如果此引數設定為
True
,程序 0 上的分片將生成 `[0, 1, 4, 5]`,程序 1 上的取樣器將生成 `[2, 3, 6, 7]`。
- 如果此引數設定為
包裝一個 PyTorch `IterableDataset`,使其僅為其中一個程序生成樣本。此類的例項將始終生成實際批次大小的整數倍數量的樣本(根據 `split_batches` 的值,這可以是 `batch_size` 或 `batch_size x num_processes`)。根據傳入的批次取樣器的 `drop_last` 屬性值,它要麼在第一個太小的批次處停止迭代,要麼從頭開始迴圈索引。
DataLoaderShard
class accelerate.data_loader.DataLoaderShard
< 原始碼 >( dataset device = None rng_types = None synchronized_generator = None skip_batches = 0 use_stateful_dataloader = False _drop_last: bool = False _non_blocking: bool = False torch_device_mesh = None **kwargs )
引數
- dataset (
torch.utils.data.dataset.Dataset
) — 用於構建此 dataloader 的資料集。 - device (
torch.device
, 可選) — 如果傳入,則將所有批次放置到該裝置上。 - rng_types (
str
列表或 RNGType) — 每次迭代開始時需要同步的隨機數生成器列表。應為以下一項或多項:"torch"
: 基礎 torch 隨機數生成器"cuda"
: CUDA 隨機數生成器(僅限 GPU)"xla"
: XLA 隨機數生成器(僅限 TPU)"generator"
: 可選的torch.Generator
- synchronized_generator (
torch.Generator
, 可選) — 一個在所有程序間保持同步的隨機數生成器。 - skip_batches (
int
, 可選, 預設為 0) — 在開始時跳過的批次數。 - use_stateful_dataloader (
bool
, 可選, 預設為False
) — 是否讓此類適配來自torchdata
的StatefulDataLoader
,而不是常規的DataLoader
。 - **kwargs (附加關鍵字引數, 可選) — 傳遞給常規
DataLoader
初始化的所有其他關鍵字引數。
DataLoaderAdapter
的子類,用於處理裝置放置和當前的分散式設定。
可用屬性
total_batch_size (
int
) — 所有程序中 dataloader 的總批次大小。當 `split_batches=True` 時等於原始批次大小;否則為原始批次大小 * 程序總數。total_dataset_length (
int
) — 所有程序中內部資料集的總長度。
DataLoaderDispatcher
class accelerate.data_loader.DataLoaderDispatcher
< 來源 >( dataset split_batches: bool = False skip_batches = 0 use_stateful_dataloader = False _drop_last: bool = False _non_blocking: bool = False slice_fn = None torch_device_mesh = None **kwargs )
引數
- split_batches (
bool
, 可選, 預設為False
) — 生成的DataLoader
是應該在裝置間拆分原始資料載入器的批次,還是生成完整的批次(在這種情況下,它將從第 `process_index` 個批次開始,每次迭代前進 `num_processes` 個批次)。換一種方式看,如果此選項設定為 `True`,觀察到的批次大小將與初始 `dataloader` 相同,否則將是初始 `dataloader` 的批次大小乘以 `num_processes`。將此選項設定為 `True` 要求 `dataloader` 的批次大小是 `batch_size` 的整數倍。 - skip_batches (
int
, 可選, 預設為 0) — 在迭代開始時跳過的批次數。 - use_stateful_dataloader (
bool
, 可選, 預設為False
) — 是否讓此類適配來自torchdata
的StatefulDataLoader
,而不是常規的DataLoader
。
DataLoaderAdapter
的子類,它將僅在程序 0 上進行迭代和預處理,然後將批次的部分分發給每個程序。
可用屬性
total_batch_size (
int
) — 所有程序中 dataloader 的總批次大小。當 `split_batches=True` 時等於原始批次大小;否則為原始批次大小 * 程序總數。total_dataset_length (
int
) — 所有程序中內部資料集的總長度。
AcceleratedOptimizer
class accelerate.optimizer.AcceleratedOptimizer
< 來源 >( optimizer device_placement = True scaler = None )
Torch 最佳化器的內部包裝器。
在進行梯度累積時,如果需要同步梯度,則會有條件地執行 `step` 和 `zero_grad`。
將最佳化器設定為“評估”模式。對於像 `schedule_free` 這樣的最佳化器很有用。
將最佳化器設定為“訓練”模式。對於像 `schedule_free` 這樣的最佳化器很有用。
AcceleratedScheduler
class accelerate.scheduler.AcceleratedScheduler
< 來源 >( scheduler optimizers step_with_optimizer: bool = True split_batches: bool = False )
學習率排程器的包裝器,它只會在最佳化器進行訓練步驟時才步進。這對於避免在梯度溢位且沒有訓練步驟時(在混合精度訓練中)排程器步進過快非常有用。
在進行梯度累積時,排程器的長度不應相應更改,Accelerate 會始終步進排程器以考慮這一點。