Accelerate 文件

資料載入器、最佳化器和排程器

Hugging Face's logo
加入 Hugging Face 社群

並獲得增強的文件體驗

開始使用

資料載入器、最佳化器和排程器

在呼叫 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 (strRNGType 列表) — 每次迭代開始時需要同步的隨機數生成器列表。應為以下一項或多項:

    • "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`,使其僅為其中一個程序生成批次。

根據傳入的 dataloaderdrop_last 屬性值,它要麼在第一個太小/並非在所有程序上都存在的批次處停止迭代,要麼從頭開始迴圈索引。

預設情況下不啟用具有可變批次大小的 BatchSampler。要啟用此行為,請將 `even_batches` 設定為 `False`。

accelerate.skip_first_batches

< >

( dataloader num_batches = 0 )

建立一個 `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) — 是否讓此類適配來自 torchdataStatefulDataLoader,而不是常規的 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) — 是否讓此類適配來自 torchdataStatefulDataLoader,而不是常規的 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 )

引數

  • optimizer (torch.optim.optimizer.Optimizer) — 要包裝的最佳化器。
  • device_placement (bool, 可選, 預設為 True) — 最佳化器是否應處理裝置放置。如果是,它會將 optimizer 的狀態字典放置在正確的裝置上。
  • scaler (torch.amp.GradScalertorch.cuda.amp.GradScaler, 可選) — 如果使用混合精度訓練,則在 step 函式中使用的縮放器。

Torch 最佳化器的內部包裝器。

在進行梯度累積時,如果需要同步梯度,則會有條件地執行 `step` 和 `zero_grad`。

eval

< >

( )

將最佳化器設定為“評估”模式。對於像 `schedule_free` 這樣的最佳化器很有用。

train

< >

( )

將最佳化器設定為“訓練”模式。對於像 `schedule_free` 這樣的最佳化器很有用。

AcceleratedScheduler

class accelerate.scheduler.AcceleratedScheduler

< >

( scheduler optimizers step_with_optimizer: bool = True split_batches: bool = False )

引數

  • scheduler (torch.optim.lr_scheduler._LRScheduler) — 要包裝的排程器。
  • optimizers (一個或一個 torch.optim.Optimizer 列表) — 使用的最佳化器。
  • step_with_optimizer (bool, 可選, 預設為 True) — 排程器是否應在每個最佳化器步驟時都進行步進。
  • split_batches (bool, 可選, 預設為 False) — 資料載入器是否在不同程序間拆分一個批次(因此無論程序數多少,批次大小都相同),還是在每個程序上建立批次(因此批次大小是原始批次大小乘以程序數)。

學習率排程器的包裝器,它只會在最佳化器進行訓練步驟時才步進。這對於避免在梯度溢位且沒有訓練步驟時(在混合精度訓練中)排程器步進過快非常有用。

在進行梯度累積時,排程器的長度不應相應更改,Accelerate 會始終步進排程器以考慮這一點。

< > 在 GitHub 上更新

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