DistModel¶
注解
不推荐直接使用这个 API 生成实例,建议使用 paddle.distributed.to_static
。
DistModel 是一个由 paddle.nn.Layer
转换而来的静态图模型,其中的参数是分布式张量。DistModel 包含了一个由 paddle.nn.Layer
转换而来的静态图,并提供了模型训练、评估和推理的 API。
DistModel 通过自身的 __call__
方法来执行模型训练、评估和推理。在执行对应的流程前,请先使用 train()/eval()/predict()
方法将 DistModel 设置为对应的模式。
详细的使用方法请参考 to_static API 中的示例代码。
参数¶
layer (paddle.nn.Layer) - 动态图中所使用的
paddle.nn.Layer
实例,其参数包含由paddle.distributed.shard_tensor
生成的分布式张量。loader (paddle.io.DataLoader) - 动态图模式下所使用的
paddle.io.DataLoader
实例,用于生成静态图训练所需要的DistributedDataloader
。loss (Loss|Callable|None, 可选) - 损失函数。可以是
paddle.nn.Layer
实例或任何可调用函数。如果 loss 不为 None,则 DistModel 会默认设置为 "train"(当 optimizer 不为 None 时)或 "eval" 模式(当 optimizer 为 None 时)。如果 loss 为 None,则 DistModel 会默认设置为 "predict" 模式。默认值:None。optimizer (paddle.optimizer.Optimizer|None, 可选) - 优化器。如果同时设置了 optimizer 和 loss,DistModel 会默认设置为 "train" 模式。默认值:None。
strategy (paddle.distributed.Strategy|None, 可选) - 并行策略和优化策略的配置(例如优化器分片、流水线并行等)。默认值:None。
代码示例
>>> import numpy as np
>>> import paddle
>>> import paddle.distributed as dist
>>> from paddle import nn
>>> from paddle.distributed import Replicate, Shard
>>> BATCH_SIZE = 4
>>> BATCH_NUM = 4
>>> IMAGE_SIZE = 16
>>> CLASS_NUM = 8
>>> class RandomDataset(paddle.io.Dataset):
... def __init__(self, images, labels, num_samples):
... self.images = images
... self.labels = labels
... self.num_samples = num_samples
... def __getitem__(self, idx):
... return self.images[idx], self.labels[idx]
... def __len__(self):
... return self.num_samples
>>> class DemoNet(nn.Layer):
... def __init__(self, mesh):
... super().__init__()
... self._mesh = mesh
... self.linear_0 = nn.Linear(IMAGE_SIZE, IMAGE_SIZE)
... self.linear_1 = nn.Linear(IMAGE_SIZE, CLASS_NUM)
... self.relu = nn.ReLU()
... # shard the weights of this layer
... self.linear_0.weight = dist.shard_tensor(
... self.linear_0.weight,
... self._mesh,
... [Shard(1)],
... stop_gradient=False,
... )
... self.linear_1.weight = dist.shard_tensor(
... self.linear_1.weight,
... self._mesh,
... [Shard(0)],
... stop_gradient=False,
... )
... def forward(self, x):
... out = self.linear_0(x)
... out = self.relu(out)
... out = self.linear_1(out)
... return out
>>> images = np.random.rand(BATCH_SIZE, IMAGE_SIZE).astype('float32')
>>> labels = np.random.rand(BATCH_SIZE, CLASS_NUM).astype('float32')
>>> dataset = RandomDataset(images, labels, BATCH_SIZE)
>>> loader = paddle.io.DataLoader(dataset, batch_size=BATCH_SIZE)
>>> mesh = dist.ProcessMesh([0, 1], dim_names=["x"])
>>> layer = DemoNet(mesh)
>>> opt = paddle.optimizer.SGD(
... learning_rate=0.1, parameters=layer.parameters()
... )
>>> loss_fn = nn.MSELoss()
>>> dist_loader = dist.shard_dataloader(loader, meshes=[mesh])
>>> dist_model = dist.to_static(
... layer, dist_loader, loss_fn, opt
... )
>>> # training
>>> dist_model.train()
>>> for batch_id, (image, label) in enumerate(dist_loader()):
... # in train mode, executing the __call__ method will
... # update the parameters of the model and return the
... # loss
... loss = dist_model(image, label)
>>> # evaluation
>>> dist_model.eval()
>>> for batch_id, (image, label) in enumerate(dist_loader()):
... # in eval mode, executing the __call__ method will
... # return the loss
... loss = dist_model(image, label)
>>> # prediction
>>> dist_model.predict()
>>> for batch_id, (image, label) in enumerate(dist_loader()):
... # in predict mode, executing the __call__ method will
... # return a dict that contains the outputs of the model,
... # where the value of "out0" is the first output.
... outs = dist_model(image)
>>> # This case need to be executed in multi-card environment
>>> # export CUDA_VISIBLE_DEVICES=0,1
>>> # python -m paddle.distributed.launch {test_case}.py
方法¶
train()¶
将 DistModel 设置为 "train" 模式。在 "train" 模式下,执行 __call__
方法会更新模型的参数并返回 loss。
eval()¶
将 DistModel 设置为 "eval" 模式。在 "eval" 模式下,执行 __call__
方法会返回 loss。
predict()¶
将 DistModel 设置为 "predict" 模式。在 "predict" 模式下,执行 __call__
方法会以字典的格式返回模型的输出。
dist_main_program(mode=None)¶
获取指定 mode
的分布式 main_program
。 main_program
用于存储模型中变量和计算的描述信息。分布式 main_program
存储了每个进程上局部模型的描述信息。每个 mode
都有自己的分布式 main_program
,用于执行模型的训练、评估或推理。 dist_main_program
返回指定 mode
的对应分布式 main_program
。
参数
mode (str|None, 可选) - 指定需要返回的
main_program
的模式,可以是 "train"、"eval" 或 "predict",如果未设置,则使用 DistModel 的当前模式。默认值:None。
返回
指定
mode
的分布式main_program
。
dist_startup_program(mode=None)¶
获取指定 mode
的分布式 startup_program
。 startup_program
用于存储模型初始化的描述信息。分布式 startup_program
存储了每个进程上局部模型的初始化操作。每个 mode
都有自己的分布式 startup_program
,用于模型训练、评估或推理时的初始化。
参数
mode (str|None, 可选) - 指定需要返回的
startup_program
的模式,可以是 "train"、 "eval" 或 "predict",如果未设置,则使用 DistModel 的当前模式。默认值:None。
返回
指定
mode
的分布式startup_program
。
serial_main_program(mode=None)¶
获取指定 mode
的串行 main_program
。串行 main_program
是包含了完整模型的变量和计算描述信息。
参数
mode (str|None, 可选) - 指定需要返回的
main_program
的模式,可以是 "train"、 "eval" 或 "predict",如果未设置,则使用 DistModel 的当前模式。默认值:None。
返回
指定
mode
的串行main_program
。
serial_startup_program(mode=None)¶
获取指定 mode
的串行 startup_program
,包含了完整的初始化操作。
参数
mode (str|None, 可选) - 指定需要返回的
startup_program
的模式,可以是 "train "、"eval" 或 "predict",如果未设置,则使用 DistModel 的当前模式。默认值:None。
返回
指定
mode
的串行startup_program
。