decorate

paddle.amp. decorate ( models, optimizers=None, level='O1', dtype='float16', master_weight=None, save_dtype=None, master_grad=False, excluded_layers=None ) [源代码]

装饰神经网络参数,来支持动态图模式下执行的算子的自动混合精度策略(AMP)。 在 O1 模式下,该函数不做任何处理,直接返回输入的 models 和 optimizers。在 O2 模式下,将对输入的网络参数数据类型由 float32 转为 float16 或 bfloat16,(除 BatchNorm 和 LayerNorm)。 通过该函数可为支持 master weight 策略的优化器开启 master weight 策略,以保证训练精度。通过 save_dtype 可指定 paddle.savepaddle.jit.save 存储的网络参数数据类型。

参数

  • models (Layer|list of Layer) - 网络模型。在 O2 模式下,输入的模型参数将由 float32 转为 float16 或 bfloat16。

  • optimizers (Optimizer|list of Optimizer,可选) - 优化器,默认值为 None,若传入优化器或由优化器组成的 list 列表,将依据 master_weight 对优化器的 master_weight 属性进行设置。

  • level (str,可选) - 混合精度训练模式,默认 O1 模式。

  • dtype (str,可选) - 混合精度训练数据类型使用 float16 还是 bfloat16,默认为 float16 类型。

  • master_weight (bool|None,可选) - 是否使用 master weight 策略。支持 master weight 策略的优化器包括 adamadamWmomentum,默认值为 None,在 O2 模式下使用 master weight 策略。

  • save_dtype (str|None,可选) - 网络存储类型,可为 float16、bfloat16、float32、float64。通过 save_dtype 可指定通过 paddle.savepaddle.jit.save 存储的网络参数数据类型。默认为 None,采用现有网络参数类型进行存储。

  • master_grad (bool, 可选) - 在 O2 模式下是否使用 float32 类型的权重梯度进行梯度裁剪、权重衰减、权重更新等计算。如果被启用,在反向传播结束后权重的梯度将会是 float32 类型。默认值:False,模型仅保存一份 float16 类型的权重梯度。

  • excluded_layers (Layer|list of Layer, 可选) - 指定不需要被转换的层,在 O2 模式下,这些层的权重将始终保持 float32 类型。 excluded_layers 可以指定为 Layer 的实例/类型,或 Layer 的实例/类型的列表。默认为 None,整个模型的权重将转换为 float16 或 bfloat16 类型。

代码示例

>>> # Demo1: single model and optimizer:
>>> import paddle
>>> paddle.device.set_device('gpu')

>>> model = paddle.nn.Conv2D(3, 2, 3, bias_attr=False)
>>> optimizer = paddle.optimizer.SGD(parameters=model.parameters())

>>> model, optimizer = paddle.amp.decorate(models=model, optimizers=optimizer, level='O2')

>>> data = paddle.rand([10, 3, 32, 32])

>>> with paddle.amp.auto_cast(enable=True, custom_white_list=None, custom_black_list=None, level='O2'):
...     output = model(data)
...     print(output.dtype)
paddle.float16

>>> # Demo2: multi models and optimizers:
>>> model2 = paddle.nn.Conv2D(3, 2, 3, bias_attr=False)
>>> optimizer2 = paddle.optimizer.Adam(parameters=model2.parameters())

>>> models, optimizers = paddle.amp.decorate(models=[model, model2], optimizers=[optimizer, optimizer2], level='O2')

>>> data = paddle.rand([10, 3, 32, 32])

>>> with paddle.amp.auto_cast(enable=True, custom_white_list=None, custom_black_list=None, level='O2'):
...     output = models[0](data)
...     output2 = models[1](data)
...     print(output.dtype)
...     print(output2.dtype)
paddle.float16
paddle.float16

>>> # Demo3: optimizers is None:
>>> model3 = paddle.nn.Conv2D(3, 2, 3, bias_attr=False)
>>> optimizer3 = paddle.optimizer.Adam(parameters=model3.parameters())

>>> model = paddle.amp.decorate(models=model3, level='O2')

>>> data = paddle.rand([10, 3, 32, 32])

>>> with paddle.amp.auto_cast(enable=True, custom_white_list=None, custom_black_list=None, level='O2'):
...     output = model(data)
...     print(output.dtype)
paddle.float16

使用本API的教程文档