Accelerate documentation
DataLoaders, Optimizers và Schedulers
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
< source >( 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 choDataLoaderđượ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 toFalse) — Whether the resultingDataLoadershould split the batches of the original data loader across devices or yield full batches (in which case it will yield batches starting at theprocess_index-th and advancing ofnum_processesbatches 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
dataloaderban đầu nếu tùy chọn này được đặt thànhTrue, còn nếu không thì sẽ là kích thước batch củadataloaderban đầu nhân vớinum_processes.Việc đặt tùy chọn này thành
Trueyêu cầu kích thước lô củadataloaderphải là bội số nguyên củabatch_size. - put_on_device (
bool, tùy chọn, mặc định làFalse) — Có nên đặt các batch lêndevicehay 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
strhoặ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.Generatorcủ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ànhTrue, 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àTruekhi tập dữ liệu cơ bản là mộtIterableDataset, ngược lại làFalse. - even_batches (
bool, tùy chọn, mặc định làTrue) — Nếu được đặt thànhTrue, 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 acrossnum_processes. Will default to [slice_tensors()](/docs/accelerate/main/en/package_reference/utilities#accelerate.utils.slice_tensors). This argument is used only whendispatch_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ụngSeedableRandomSamplerthay 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ớiset_seed()ở mỗi lần gọiself.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ùnguse_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ànhTrue, 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ànhTrue, đ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 đặttorchdataphiê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
BatchSamplercó 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 đặteven_batchesbằngFalse
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
< source >( 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ànhFalse. - 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ànhTrue.
- sampler trên process 0 sẽ trả về
- 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
BatchSamplercó 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 đặteven_batchesbằngFalse
IterableDatasetShard
class accelerate.data_loader.IterableDatasetShard
< source >( 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ếusplit_batches=False) hoặc kích thước của các lô (nếusplit_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ànhFalse. - 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ànhTrue.
- shard trên process 0 sẽ cho ra
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
< source >( 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
strhoặ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ộttorch.Generatortù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 ứngStatefulDataLoadertừtorchdatathay vìDataLoaderthô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
DataLoaderthô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 khisplit_batches=True; nếu không, bằng kích thước batch ban đầu * tổng số tiến trìnhtotal_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
< source >( 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 xemDataLoaderkế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_indexvà tiến thêmnum_processesbatch ở 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ớidataloaderban đầu nếu tùy chọn này được đặt thànhTrue, còn nếu không thì kích thước batch sẽ bằng kích thước batch củadataloaderban đầu nhân vớinum_processes. Việc đặt tùy chọn này thànhTrueyêu cầu kích thước batch củadataloaderphải là bội số nguyên củabatch_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 ứngStatefulDataLoadertừtorchdatathay vìDataLoaderthô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 khisplit_batches=True; nếu không, bằng kích thước batch ban đầu * tổng số tiến trìnhtotal_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
< source >( 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ủaoptimizertrên thiết bị phù hợp. - scaler (
torch.amp.GradScalerhoặctorch.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.
Đặt optimizer ở chế độ “eval”. Hữu ích cho các optimizer như schedule_free
Đặt optimizer ở chế độ “train”. Hữu ích cho các optimizer như schedule_free
AcceleratedScheduler
lớp accelerate.scheduler.AcceleratedScheduler
< source >( 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.