赞
踩
- from accelerate import Accelerator
-
- accelerator = Accelerator()
- train_dataloader, eval_dataloader, model, optimizer = accelerator.prepare(
- train_dataloader,
- eval_dataloader,
- model,
- optimizer
- )
唯一不同的是把loss.backward()替换成Accelerate的backward
绿色的是加上的,红色的是去掉的
运行以下命令创建并保存配置文件
accelerate config
然后启动训练:
accelerate launch train.py
prepare()
方法将模型包装成适合分布式训练的接口。- # 假设有两个GPU进程
- from torch.nn.parallel import DistributedDataParallel
- from accelerate import Accelerator
-
- accelerator = Accelerator()
- model = accelerator.prepare(MyModel())
- print(model.__class__.__name__)
- #DistributedDataParallel
-
- model = accelerator.unwrap_model(model)
- print(model.__class__.__name__)
- #MyModel
-
- torch.save(model.state_dict(), path)
- #解包之后,可以用torch的save函数
还可以使用使用 accelerate提供的save_model()
方法来解包并保存模型状态字典。
- accelerator.wait_for_everyone()
- accelerator.save_model(model, save_directory)
这样可以后续用from_pretrained的方式再得到模型
- from transformers import AutoModel
-
- unwrapped_model = accelerator.unwrap_model(model)
- unwrapped_model.save_pretrained(
- "path/to/my_model_directory",
- is_main_process=accelerator.is_main_process,
- save_function=accelerator.save,
- )
-
- model = AutoModel.from_pretrained("path/to/my_model_directory")
- for inputs, targets in validation_dataloader:
- predictions = model(inputs)
-
-
- # Gather all predictions and targets
- all_predictions, all_targets = accelerator.gather_for_metrics((predictions, targets))
-
-
- # Example of use with a *Datasets.Metric*
- metric.add_batch(all_predictions, all_targets)
( tensordim = 0,pad_index = 0,pad_first = False ) → torch.Tensor,
递归地填充来自所有设备的嵌套列表/元组/字典中的张量,以便它们可以安全地被聚合。
tensor | 要聚合的数据 |
dim | 填充的维度 |
pad_index | 用于填充的值 |
pad_first | 是否在开始或结束时进行填充 |
- # 假设有两个进程,第一个进程有一个大小为1的张量,第二个进程的张量大小为2
- import torch
- from accelerate import Accelerator
-
- accelerator = Accelerator()
- process_tensor = torch.arange(accelerator.process_index + 1).to(accelerator.device)
- '''
- accelerator.process_index:这是当前进程的索引。
- 在两个进程的设置中,第一个进程的索引为 0,第二个进程的索引为 1。
- '''
- padded_tensor = accelerator.pad_across_processes(process_tensor)
- '''
- 它确保所有进程中的张量都被填充到相同的大小,这样它们就可以安全地聚合或进行其他并行操作
- '''
- padded_tensor.shape
- #torch.Size([2])
然后,调用 prepare() 时,库会:
将模型封装在适用于分布式设置的容器中,
将优化器封装在 AcceleratedOptimizer 中,
将调度器封装在 AcceleratedScheduler 中,
在 DataLoaderShard 或 DataLoaderDispatcher 中创建数据加载器的新版本。
创建的原因是, PyTorch 不允许用户在数据加载器创建后更改其批处理采样器
DataLoaderShard 继承自 DataLoader,添加了以下功能:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。