---
title: NPUOptimizer构造函数
description: "| 产品 | 是否支持 |"
url: https://www.hiascend.com/document/detail/zh/TensorFlowCommercial/latest/migration/tfmigr1/tfmigr1_tfadapi_0057.html
sourcePath: /source/zh/TensorFlowCommercial/900/migration/tfmigr1/tfmigr1_tfadapi_0057.html
indexId: a70459e4df92760bf2bc75a758fd6e86cd155b9ebc5d6cf8d8772e9661235d3e79
---
# NPUOptimizer构造函数

#### 产品支持情况

| 产品 | 是否支持 |
| --- | --- |
| Atlas 350 加速卡 | √ |
| Atlas A3 训练系列产品 / Atlas A3 推理系列产品 | √ |
| Atlas A2 训练系列产品 / Atlas A2 推理系列产品 | √ |
| Atlas 200I/500 A2 推理产品 | ☓ |
| Atlas 推理系列产品 | ☓ |
| Atlas 训练系列产品 | √ |


#### 功能说明

NPUOptimizer类的构造函数，该优化器将NPUDistributedOptimizer和NPULossScaleOptimizer优化器合并。主要提供如下功能：- Loss Scaling：支持在混合精度训练中使能Loss Scaling，从而解决由于float16表示范围较小导致的下溢出问题。
- 分布式训练：包装用户提供的单机训练优化器，构造NPU分布式训练优化器，支持单机单卡、单机多卡、多机多卡等组网形式下，各个Device之间计算梯度后执行梯度聚合操作。
- 通信拖尾优化：通过计算依赖关系的改变，将不依赖于最后一个AR（梯度聚合分片）的计算操作调度到和最后一个AR并行进行，以达到优化通信拖尾时间的目的。


#### 函数原型

```
class NPUOptimizer(tf.train.Optimizer):
    def __init__(self, opt, loss_scale_manager=None, is_distributed=False, is_loss_scale=False,
                 is_tailing_optimization=False, name=None)
```


#### 参数说明

| 参数名 | 输入/输出 | 描述 |
| --- | --- | --- |
| opt | 输入 | 用于梯度计算和更新权重的单机版训练优化器。 |
| loss\_scale\_manager | 输入 | 仅当is\_loss\_scale为True，开启Loss Scaling功能时需要配置该参数，用于决定Loss Scale的更新方式，包括静态更新和动态更新。 用户在创建NPUOptimizer之前，可以实例化一个FixedLossScaleManager类进行静态Loss Scale的配置（Loss Scale值固定，用户需指定Loss Scale值）。FixedLossScaleManager类的构造函数，请参见FixedLossScaleManager构造函数。 用户在创建NPUOptimizer之前，可以实例化一个ExponentialUpdateLossScaleManager类进行动态Loss Scale的配置。ExponentialUpdateLossScaleManager类的构造函数，请参见ExponentialUpdateLossScaleManager构造函数。 |
| is\_distributed | 输入 | 是否开启分布式训练，取值： True：开启。 False（默认值）：不开启。 |
| is\_loss\_scale | 输入 | 是否开启Loss Scaling，取值： True：开启Loss Scaling。使用自动混合精度功能后，推荐开启，此时loss\_scale\_manager的值不能为None。 False（默认值）：不开启Loss Scaling。 |
| is\_tailing\_optimization | 输入 | 是否开启通信拖尾优化，用于提升训练性能，该功能仅在is\_distributed为True的情况下配置生效。 True：开启通信拖尾。 False（默认值）：不开启通信拖尾。 必须和NPURunConfig构造函数中的配置值保持一致。 |
| name | 输入 | 优化器名称。 |


#### 返回值

返回NPUOptimizer类对象。


#### 调用示例

```
import tensorflow as tf
from npu_bridge.npu_init import *

#定义单机优化器
optimizer = LAMBOptimizer(
          learning_rate=learning_rate,
          weight_decay_rate=0.01,
          beta_1=0.9,
          beta_2=0.999,
          epsilon=1e-6,
          exclude_from_weight_decay=["LayerNorm", "layer_norm", "bias"])
		
#使能Loss Scaling
  if tf.flags.FLAGS.npu_bert_loss_scale not in [None, -1]:
    if tf.flags.FLAGS.npu_bert_loss_scale == 0:
      loss_scale_manager = ExponentialUpdateLossScaleManager(init_loss_scale=tf.flags.FLAGS.init_loss_scale_value, incr_every_n_steps=1000, decr_every_n_nan_or_inf=2, decr_ratio=0.5)
    elif tf.flags.FLAGS.npu_bert_loss_scale >= 1:
      loss_scale_manager = FixedLossScaleManager(loss_scale=tf.flags.FLAGS.npu_bert_loss_scale)
    else:
      raise ValueError("Invalid loss scale: %d" % tf.flags.FLAGS.npu_bert_loss_scale)
    optimizer = NPUOptimizer(optimizer, loss_scale_manager, is_distributed=tf.flags.FLAGS.distributed, is_loss_scale=True, is_tailing_optimization=True)

#不使能loss_scale
  else:
    optimizer = NPUOptimizer(optimizer, is_distributed=tf.flags.FLAGS.distributed)
```
