Accelerate documentation

DataLoaders, Optimizers và Schedulers

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v1.15.0).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

DataLoaders, Optimizers và Schedulers

Các lớp nội bộ mà Accelerate sử dụng để chuẩn bị các đối tượng cho huấn luyện phân tán khi gọi prepare().

Công cụ DataLoader

accelerate.data_loader.prepare_data_loader

< >

( dataloader: DataLoaderdevice: torch.device | None = Nonenum_processes: int | None = Noneprocess_index: int | None = Nonesplit_batches: bool = Falseput_on_device: bool = Falserng_types: list[str | accelerate.utils.dataclasses.RNGType] | None = Nonedispatch_batches: bool | None = Noneeven_batches: bool = Trueslice_fn_for_dispatch: typing.Callable | None = Noneuse_seedable_sampler: bool = Falsedata_seed: int | None = Nonenon_blocking: bool = Falseuse_stateful_dataloader: bool = Falsetorch_device_mesh = None ) → torch.utils.data.dataloader.DataLoader

Tham số

  • dataloader (torch.utils.data.dataloader.DataLoader) — Bộ nạp dữ liệu để chia nhỏ trên nhiều thiết bị.
  • device (torch.device) — Thiết bị đích cho DataLoader được trả về.
  • num_processes (int, tùy chọn) — Số lượng tiến trình chạy đồng thời. Mặc định sẽ lấy giá trị do PartialState cung cấp.
  • process_index (int, tùy chọn) — Chỉ số của tiến trình hiện tại. Mặc định sẽ là giá trị do PartialState cung cấp.
  • split_batches (bool, optional, defaults to False) — Whether the resulting DataLoader should split the batches of the original data loader across devices or yield full batches (in which case it will yield batches starting at the process_index-th and advancing of num_processes batches at each iteration).

    Một cách khác để nhìn nhận điều này là kích thước batch quan sát được sẽ giống với kích thước của dataloader ban đầu nếu tùy chọn này được đặt thành True, còn nếu không thì sẽ là kích thước batch của dataloader ban đầu nhân với num_processes.

    Việc đặt tùy chọn này thành True yêu cầu kích thước lô của dataloader phải là bội số nguyên của batch_size.

  • put_on_device (bool, tùy chọn, mặc định là False) — Có nên đặt các batch lên device hay không (chỉ hoạt động nếu các batch là danh sách lồng nhau, bộ hoặc từ điển của các tensor).
  • rng_types (danh sách str hoặc RNGType) — Danh sách các bộ tạo số ngẫu nhiên cần đồng bộ hóa ở đầu mỗi lần lặp. Phải là một hoặc một số trong các loại sau:
    • "torch": bộ tạo số ngẫu nhiên cơ bản của torch
    • "cuda": bộ tạo số ngẫu nhiên CUDA (chỉ dành cho GPU)
    • Loại thiết bị của bất kỳ bộ tăng tốc PyTorch nào đã được đăng ký: bộ tạo số ngẫu nhiên của thiết bị đó.
    • "xla": bộ tạo số ngẫu nhiên XLA (chỉ dành cho TPU)
    • "generator": torch.Generator của sampler (hoặc batch sampler nếu dataloader của bạn không có sampler) hoặc của iterable dataset (nếu có) nếu dataset cơ bản có kiểu đó.
  • dispatch_batches (bool, tùy chọn) — Nếu được đặt thành True, dataloader đã chuẩn bị chỉ được lặp qua trên tiến trình chính, sau đó các batch sẽ được chia nhỏ và phát sóng đến từng tiến trình. Giá trị mặc định sẽ là True khi tập dữ liệu cơ bản là một IterableDataset, ngược lại là False.
  • even_batches (bool, tùy chọn, mặc định là True) — Nếu được đặt thành True, trong các trường hợp tổng kích thước batch trên tất cả các tiến trình không chia hết chính xác cho bộ dữ liệu, các mẫu ở đầu bộ dữ liệu sẽ được nhân bản để batch có thể được chia đều cho tất cả các worker.
  • slice_fn_for_dispatch (Callable, optional) -- If passed, this function will be used to slice tensors across num_processes. Will default to [slice_tensors()](/docs/accelerate/main/en/package_reference/utilities#accelerate.utils.slice_tensors). This argument is used only when dispatch_batchesis set toTrue` and will be ignored otherwise.
  • use_seedable_sampler (bool, tùy chọn, mặc định là False) — Liệu có sử dụng SeedableRandomSampler thay vì RandomSampler để đạt được khả năng tái lập tốt hơn hay không. Điều này có thể gây ra hiệu suất khác nhau do các thuật toán xáo trộn khác nhau, nhưng đảm bảo kết quả sẽ hoàn toàn giống nhau. Nên kết hợp với set_seed() ở mỗi lần gọi self.set_epoch
  • data_seed (int, tùy chọn, mặc định là None) — Hạt giống (seed) được sử dụng cho bộ tạo (generator) bên dưới khi dùng use_seedable_sampler. Nếu là None, bộ tạo sẽ sử dụng hạt giống mặc định hiện tại từ torch.
  • non_blocking (bool, tùy chọn, mặc định là False) — Nếu đặt thành True, dataloader sẽ sử dụng các thao tác chuyển dữ liệu từ host sang thiết bị không chặn. Nếu dataloader có pin_memory được đặt thành True, điều này sẽ giúp tăng mức độ chồng chéo giữa việc chuyển dữ liệu và các phép tính.
  • use_stateful_dataloader (bool, tuỳ chọn, mặc định là False) — “Nếu đặt thành true, dataloader được chuẩn bị bởi Accelerator sẽ được hỗ trợ bởi ” ”torchdata.StatefulDataLoader. Điều này yêu cầu phải cài đặt torchdata phiên bản 0.8.0 trở lên, hỗ trợ StatefulDataLoader.”
  • torch_device_mesh (torch.distributed.DeviceMesh, tùy chọn, mặc định là None) — Lưới thiết bị PyTorch.

Trả về

torch.utils.data.dataloader.DataLoader

Một trình tải dữ liệu mới sẽ tạo ra phần của các lô

Bọc một DataLoader của PyTorch để tạo các lô (batches) cho một trong các tiến trình.

Tùy thuộc vào giá trị của thuộc tính drop_last của dataloader được truyền vào, quá trình lặp sẽ dừng lại ở batch đầu tiên có kích thước quá nhỏ / không có mặt trên tất cả các tiến trình, hoặc sẽ lặp lại với các chỉ số từ đầu.

Các BatchSampler có kích thước batch thay đổi không được bật theo mặc định. Để bật hành vi này, hãy đặt even_batches bằng False

accelerate.skip_first_batches

< >

( dataloadernum_batches = 0 )

Tạo một torch.utils.data.DataLoader sẽ bỏ qua hiệu quả num_batches đầu tiên. Không nên sử dụng nếu dataloader ban đầu là một StatefulDataLoader.

BatchSamplerShard

class accelerate.data_loader.BatchSamplerShard

< >

( batch_sampler: BatchSamplernum_processes: int = 1process_index: int = 0split_batches: bool = Falseeven_batches: bool = True )

Tham số

  • batch_sampler (torch.utils.data.sampler.BatchSampler) — Batch sampler để chia thành nhiều shard.
  • num_processes (int, tùy chọn, mặc định là 1) — Số lượng tiến trình chạy đồng thời.
  • process_index (int, tuỳ chọn, mặc định là 0) — Chỉ số của tiến trình hiện tại.
  • split_batches (bool, tùy chọn, mặc định là False) — Liệu các shard có nên được tạo bằng cách chia nhỏ một batch để cấp một phần cho mỗi tiến trình, hay bằng cách trả về các batch hoàn chỉnh khác nhau trên mỗi tiến trình.

    Trên hai tiến trình với bộ lấy mẫu [[0, 1, 2, 3], [4, 5, 6, 7]], điều này sẽ dẫn đến:

    • sampler trên process 0 sẽ trả về [0, 1, 2, 3] và sampler trên process 1 sẽ trả về [4, 5, 6, 7] nếu tham số này được đặt thành False.
    • sampler trên process 0 sẽ trả về [0, 1] rồi [4, 5] và sampler trên process 1 sẽ trả về [2, 3] rồi [6, 7] nếu tham số này được đặt thành True.
  • even_batches (bool, tùy chọn, mặc định là True) — Có nên quay lại đầu bộ lấy mẫu khi số lượng mẫu không phải là bội số nguyên của (kích thước lô ban đầu / số lượng tiến trình) hay không.

Bọc một BatchSampler của PyTorch để tạo các lô (batch) cho một trong các tiến trình. Các đối tượng của lớp này luôn tạo ra một số lượng lô là bội số nguyên của num_processes và tất cả đều có cùng kích thước. Tùy thuộc vào giá trị của thuộc tính drop_last của batch sampler được truyền vào, nó sẽ dừng lặp lại ở lô đầu tiên có kích thước quá nhỏ / không có mặt trên tất cả các tiến trình, hoặc lặp lại với các chỉ số từ đầu.

Các BatchSampler có kích thước batch thay đổi không được bật theo mặc định. Để bật hành vi này, hãy đặt even_batches bằng False

IterableDatasetShard

class accelerate.data_loader.IterableDatasetShard

< >

( dataset: IterableDatasetbatch_size: int = 1drop_last: bool = Falsenum_processes: int = 1process_index: int = 0split_batches: bool = False )

Tham số

  • dataset (torch.utils.data.dataset.IterableDataset) — Batch sampler để chia thành nhiều shard.
  • batch_size (int, tùy chọn, mặc định là 1) — Kích thước của các lô trên mỗi shard (nếu split_batches=False) hoặc kích thước của các lô (nếu split_batches=True).
  • drop_last (bool, tùy chọn, mặc định là False) — Có nên loại bỏ lô cuối cùng không hoàn chỉnh hay hoàn thành các lô cuối cùng bằng cách sử dụng các mẫu từ đầu hay không.
  • num_processes (int, tùy chọn, mặc định là 1) — Số lượng tiến trình chạy đồng thời.
  • process_index (int, tuỳ chọn, mặc định là 0) — Chỉ số của tiến trình hiện tại.
  • split_batches (bool, tùy chọn, mặc định là False) — Liệu các shard có nên được tạo bằng cách chia nhỏ một batch để cấp một phần cho mỗi process, hay bằng cách trả về các batch hoàn chỉnh khác nhau trên mỗi process.

    Trên hai tiến trình với một tập dữ liệu dạng lặp xuất ra [0, 1, 2, 3, 4, 5, 6, 7], kết quả sẽ là:

    • shard trên process 0 sẽ cho ra [0, 1, 2, 3] và shard trên process 1 sẽ cho ra [4, 5, 6, 7] nếu đối số này được đặt thành False.
    • shard trên process 0 sẽ cho ra [0, 1, 4, 5] và sampler trên process 1 sẽ cho ra [2, 3, 6, 7] nếu tham số này được đặt thành True.

Bọc một IterableDataset của PyTorch để tạo ra các mẫu chỉ cho một trong các tiến trình. Các đối tượng của lớp này luôn tạo ra một số lượng mẫu là bội số nguyên của kích thước lô thực tế (tùy thuộc vào giá trị của split_batches, đây sẽ là batch_size hoặc batch_size x num_processes). Tùy thuộc vào giá trị của thuộc tính drop_last của bộ lấy mẫu lô được truyền vào, nó sẽ dừng lặp lại ở lô đầu tiên có kích thước quá nhỏ hoặc lặp lại với các chỉ số từ đầu.

DataLoaderShard

lớp accelerate.data_loader.DataLoaderShard

< >

( datasetdevice = Nonerng_types = Nonesynchronized_generator = Noneskip_batches = 0use_stateful_dataloader = False_drop_last: bool = False_non_blocking: bool = Falsetorch_device_mesh = Noneiteration = 0**kwargs )

Tham số

  • dataset (torch.utils.data.dataset.Dataset) — Bộ dữ liệu được sử dụng để xây dựng dataloader này.
  • device (torch.device, tùy chọn) — Nếu được truyền vào, thiết bị để đặt tất cả các lô (batch) lên.
  • rng_types (danh sách str hoặc RNGType) — Danh sách các bộ tạo số ngẫu nhiên cần đồng bộ hóa ở đầu mỗi lần lặp. Phải là một hoặc một số trong các loại sau:
    • "torch": bộ tạo số ngẫu nhiên cơ bản của torch
    • "cuda": bộ tạo số ngẫu nhiên CUDA (chỉ dành cho GPU)
    • Loại thiết bị của bất kỳ bộ tăng tốc PyTorch nào đã được đăng ký: bộ tạo số ngẫu nhiên của thiết bị đó.
    • "xla": bộ tạo số ngẫu nhiên XLA (chỉ dành cho TPU)
    • "generator": một torch.Generator tùy chọn
  • synchronized_generator (torch.Generator, tùy chọn) — Bộ tạo số ngẫu nhiên để giữ đồng bộ giữa các tiến trình.
  • skip_batches (int, tùy chọn, mặc định là 0) — Số lượng batch cần bỏ qua ở đầu.
  • use_stateful_dataloader (bool, tùy chọn, mặc định là False) — Liệu có để lớp này thích ứng StatefulDataLoader từ torchdata thay vì DataLoader thông thường hay không.
  • **kwargs (các đối số từ khóa bổ sung, tùy chọn) — Tất cả các đối số từ khóa khác để truyền vào khởi tạo DataLoader thông thường.

Lớp con của DataLoaderAdapter sẽ xử lý việc đặt thiết bị và cấu hình phân tán hiện tại.

Các thuộc tính khả dụng:

  • total_batch_size (int) — Tổng kích thước batch của dataloader trên tất cả các tiến trình. Bằng kích thước batch ban đầu khi split_batches=True; nếu không, bằng kích thước batch ban đầu * tổng số tiến trình

  • total_dataset_length (int) — Tổng độ dài của dataset bên trong trên tất cả các tiến trình.

DataLoaderDispatcher

class accelerate.data_loader.DataLoaderDispatcher

< >

( datasetsplit_batches: bool = Falseskip_batches = 0use_stateful_dataloader = False_drop_last: bool = False_non_blocking: bool = Falseslice_fn = Nonetorch_device_mesh = Noneiteration = 0**kwargs )

Tham số

  • split_batches (bool, tùy chọn, mặc định là False) — Xác định xem DataLoader kết quả có nên chia các batch của data loader gốc ra giữa các thiết bị hay không, hoặc trả về các batch đầy đủ (trong trường hợp đó, nó sẽ trả về các batch bắt đầu từ batch thứ process_index và tiến thêm num_processes batch ở mỗi lần lặp). Một cách khác để hiểu điều này là kích thước batch quan sát được sẽ giống với dataloader ban đầu nếu tùy chọn này được đặt thành True, còn nếu không thì kích thước batch sẽ bằng kích thước batch của dataloader ban đầu nhân với num_processes. Việc đặt tùy chọn này thành True yêu cầu kích thước batch của dataloader phải là bội số nguyên của batch_size.
  • skip_batches (int, tùy chọn, mặc định là 0) — Số lượng batch cần bỏ qua ở đầu một lần lặp.
  • use_stateful_dataloader (bool, tùy chọn, mặc định là False) — Liệu có để lớp này thích ứng StatefulDataLoader từ torchdata thay vì DataLoader thông thường hay không.

Lớp con của DataLoaderAdapter sẽ lặp và tiền xử lý chỉ trên tiến trình 0, sau đó phân phối phần của lô dữ liệu cho từng tiến trình.

Các thuộc tính khả dụng:

  • total_batch_size (int) — Tổng kích thước batch của dataloader trên tất cả các tiến trình. Bằng kích thước batch ban đầu khi split_batches=True; nếu không, bằng kích thước batch ban đầu * tổng số tiến trình

  • total_dataset_length (int) — Tổng độ dài của dataset bên trong trên tất cả các tiến trình.

AcceleratedOptimizer

lớp accelerate.optimizer.AcceleratedOptimizer

< >

( optimizerdevice_placement = Truescaler = None )

Tham số

  • optimizer (torch.optim.optimizer.Optimizer) — Optimizer cần bọc.
  • device_placement (bool, tùy chọn, mặc định là True) — Xác định xem trình tối ưu có nên xử lý việc đặt thiết bị hay không. Nếu có, nó sẽ đặt từ điển trạng thái của optimizer trên thiết bị phù hợp.
  • scaler (torch.amp.GradScaler hoặc torch.cuda.amp.GradScaler, tùy chọn) — Bộ scaler được sử dụng trong hàm step khi huấn luyện với độ chính xác hỗn hợp.

Bọc nội bộ xung quanh một trình tối ưu hóa torch.

Điều kiện sẽ thực hiện step và zero_grad nếu gradient cần được đồng bộ hóa khi thực hiện tích lũy gradient.

eval

< >

( )

Đặt optimizer ở chế độ “eval”. Hữu ích cho các optimizer như schedule_free

train

< >

( )

Đặt optimizer ở chế độ “train”. Hữu ích cho các optimizer như schedule_free

AcceleratedScheduler

lớp accelerate.scheduler.AcceleratedScheduler

< >

( scheduleroptimizersstep_with_optimizer: bool = Truesplit_batches: bool = False )

Tham số

  • scheduler (torch.optim.lr_scheduler._LRScheduler) — Trình lập lịch cần bọc.
  • optimizers (một hoặc một danh sách torch.optim.Optimizer) — Các optimizer được sử dụng.
  • step_with_optimizer (bool, tùy chọn, mặc định là True) — Xác định xem trình lập lịch có nên được bước (step) ở mỗi bước tối ưu hóa hay không.
  • split_batches (bool, tùy chọn, mặc định là False) — Xác định xem các dataloader có chia một batch qua các tiến trình khác nhau (để kích thước batch giống nhau bất kể số lượng tiến trình) hay tạo batch trên mỗi tiến trình (để kích thước batch bằng kích thước batch gốc nhân với số lượng tiến trình).

Một lớp bọc (wrapper) quanh trình lập lịch tốc độ học (learning rate scheduler) chỉ sẽ thực hiện bước (step) khi trình tối ưu (optimizer) có một bước huấn luyện. Hữu ích để tránh việc trình lập lịch thực hiện bước quá nhanh khi gradient bị tràn (overflow) và không có bước huấn luyện (trong huấn luyện độ chính xác hỗn hợp)

Khi thực hiện gradient accumulation, độ dài của scheduler không nên được thay đổi tương ứng, Accelerate sẽ luôn step scheduler để tính đến điều này.

Update on GitHub