mindspore/docs/api/api_python/mindspore.boost.rst

519 lines
20 KiB
ReStructuredText
Raw Normal View History

2022-02-11 17:34:24 +08:00
mindspore.boost
2022-02-17 16:26:58 +08:00
==============================
Boost能够自动加速网络如减少BN/梯度冻结/累积梯度等。
2022-08-02 19:15:24 +08:00
.. note::
此特性为测试版本,我们仍在改进其功能。
2022-02-17 16:26:58 +08:00
.. py:class:: mindspore.boost.AutoBoost(level="O0", boost_config_dict="")
MindSpore自动优化算法库。
2022-07-26 16:39:37 +08:00
参数:
- **level** (str) - Boost的配置级别默认值"O0"。
2022-02-17 16:26:58 +08:00
2022-07-26 16:39:37 +08:00
- "O0":不变化。
- "O1"启用boost模式性能将提升约20%,准确率保持不变。
- "O2"启用boost模式性能将提升约30%准确率下降小于3%。
2022-03-28 20:42:33 +08:00
2022-07-26 16:39:37 +08:00
- **boost_config_dict** (dict) - 用户可配置的超参字典,建议的格式如下:
2022-03-28 20:42:33 +08:00
2022-07-26 16:39:37 +08:00
.. code-block::
2022-02-17 16:26:58 +08:00
2022-07-26 16:39:37 +08:00
{
"boost": {
"mode": "auto",
"less_bn": False,
"grad_freeze": False,
"adasum": False,
"grad_accumulation": False,
"dim_reduce": False},
2022-02-17 16:26:58 +08:00
2022-07-26 16:39:37 +08:00
"common": {
"gradient_split_groups": [50, 100],
"device_number": 8},
2022-02-17 16:26:58 +08:00
2022-07-26 16:39:37 +08:00
"less_bn": {
"fn_flag": True,
"gc_flag": True},
2022-02-17 16:26:58 +08:00
2022-07-26 16:39:37 +08:00
"grad_freeze": {
"param_groups": 10,
"freeze_type": 1,
"freeze_p": 0.7,
"total_steps": 65536},
2022-02-17 16:26:58 +08:00
2022-07-26 16:39:37 +08:00
"grad_accumulation": {
"grad_accumulation_step": 1},
2022-02-17 16:26:58 +08:00
2022-07-26 16:39:37 +08:00
"dim_reduce": {
"rho": 0.55,
"gamma": 0.9,
"alpha": 0.001,
"sigma": 0.4,
"n_components": 32,
"pca_mat_path": None,
"weight_load_dir": None,
"timeout": 1800}
2022-02-17 16:26:58 +08:00
2022-07-26 16:39:37 +08:00
}
2022-02-17 16:26:58 +08:00
2022-07-26 16:39:37 +08:00
- boost
2022-02-17 16:26:58 +08:00
2022-07-26 16:39:37 +08:00
- mode (str)Boost配置模式支持 ["auto", "manual", "enable_all", "disable_all"]。默认值: "auto"。
2022-02-21 19:56:53 +08:00
2022-07-26 16:39:37 +08:00
- auto自动配置取决于Model类中的 `boost_level` 参数配置。
- manual`boost_config_dict` 中人工配置。
- enable_all开启所有boost算法。
- disable_all关闭所有boost算法。
2022-02-21 19:56:53 +08:00
2022-07-26 16:39:37 +08:00
- less_bn (bool)是否开启LessBN算法默认False
- grad_freeze (bool)是否开启梯度冻结算法默认False。
- adasum (bool)是否开启自适应求和算法默认False。
- grad_accumulation (bool)是否开启梯度累加算法默认False。
- dim_reduce (bool)是否开启降维训练算法默认False。
2022-02-21 19:56:53 +08:00
2022-07-26 16:39:37 +08:00
如果开启dim_reduce算法其他算法会失效。
如果开启grad_freeze算法同时关闭dim_reduce其他算法会失效。
2022-02-21 19:56:53 +08:00
2022-07-26 16:39:37 +08:00
- common
2022-02-21 19:56:53 +08:00
2022-07-26 16:39:37 +08:00
- gradient_split_groups (list):网络的梯度分割点,默认:[50, 100]。
- device_number (int)设备数默认8。
2022-02-21 19:56:53 +08:00
2022-07-26 16:39:37 +08:00
- less_bn
2022-02-21 19:56:53 +08:00
2022-07-26 16:39:37 +08:00
- fn_flag (bool)是否采用fn替换fc默认替换。
- gc_flag (bool)是否启用gc默认启用gc。
2022-02-21 19:56:53 +08:00
2022-07-26 16:39:37 +08:00
- grad_freeze
2022-02-21 19:56:53 +08:00
2022-07-26 16:39:37 +08:00
- param_groups (int)参数分组数量默认值10。
- freeze_type (int):梯度冻结策略,参数选择[0, 1]默认值1。
- freeze_p (float)梯度冻结概率默认值0.7。
- total_steps (int)总训练步数默认值65536。
2022-02-21 19:56:53 +08:00
2022-07-26 16:39:37 +08:00
- grad_accumulation
2022-02-21 19:56:53 +08:00
2022-07-26 16:39:37 +08:00
- grad_accumulation_step (int)累加梯度的步数默认值1。
2022-02-21 19:56:53 +08:00
2022-07-26 16:39:37 +08:00
- dim_reduce
2022-02-21 19:56:53 +08:00
2022-07-26 16:39:37 +08:00
dim_reduce主要原理
2022-02-21 19:56:53 +08:00
2022-07-26 16:39:37 +08:00
.. math::
2022-02-21 19:56:53 +08:00
2022-07-26 16:39:37 +08:00
\begin{align}
grad\_k &= pca\_mat \cdot grad\\
dk &= - bk \cdot grad\_k\\
sk &= rho ^ m \cdot dk\\
delta\_loss &= sigma \cdot grad\_k.T \cdot sk
\end{align}
2022-02-21 19:56:53 +08:00
2022-07-26 16:39:37 +08:00
其中:
2022-02-21 19:56:53 +08:00
2022-07-26 16:39:37 +08:00
- pca_mat (array):维度(k*n)k是 *n_components* 的大小n是权重的大小。
- bk (array):维度(k*k)bk是拟牛顿法中的对称正定矩阵。
2022-02-21 19:56:53 +08:00
2022-07-26 16:39:37 +08:00
我们需要找到满足以下条件的m
2022-02-21 19:56:53 +08:00
2022-07-26 16:39:37 +08:00
.. math::
new\_loss < old\_loss + delta\_loss
2022-02-21 19:56:53 +08:00
2022-07-26 16:39:37 +08:00
然后使用 *delta_grad* 去更新模型的权重:
2022-02-21 19:56:53 +08:00
2022-07-26 16:39:37 +08:00
.. math::
2022-02-21 19:56:53 +08:00
2022-07-26 16:39:37 +08:00
\begin{align}
grad\_k\_proj &= pca\_mat.T \cdot grad\_k\\
new\_grad\_momentum &= gamma \cdot old\_grad\_momentum + grad - grad\_k\_proj\\
delta\_grad &= alpha \cdot new\_grad\_momentum - pca\_mat.T \cdot sk
\end{align}
2022-02-21 19:56:53 +08:00
2022-07-26 16:39:37 +08:00
- rho (float)超参一般无需调整默认值0.55。
- gamma (float)超参一般无需调整默认值0.9。
- alpha (float)超参一般无需调整默认值0.001。
- sigma (float)超参一般无需调整默认值0.4。
- n_components (int)PCA后的维度默认值32。
- pca_mat_path (str)PCA矩阵的加载路径使用绝对路径默认值None。
- weight_load_dir (str)以checkpoint形式保存的权重加载路径用于计算PCA矩阵默认值None。
- timeout (int)加载PCA矩阵的最长等待时间默认值1800(s)。
2022-02-21 19:56:53 +08:00
2022-07-26 16:39:37 +08:00
用户可以通过加载JSON文件或者直接使用字典来配置 *boost_config_dict*
未配置的参数会使用默认值。
2022-02-21 19:56:53 +08:00
2022-07-26 16:39:37 +08:00
异常:
- **ValueError** - Boost的模式不在["auto", "manual", "enable_all", "disable_all"]这个列表中。
2022-02-17 16:26:58 +08:00
2022-03-09 12:15:39 +08:00
.. py:method:: network_auto_process_eval(network)
2022-03-09 12:15:39 +08:00
使用Boost算法推理。
2022-07-26 16:39:37 +08:00
参数:
- **network** (Cell) - 推理网络。
2022-03-09 12:15:39 +08:00
2022-02-28 14:19:59 +08:00
.. py:method:: network_auto_process_train(network, optimizer)
2022-02-17 16:26:58 +08:00
使用Boost算法训练。
2022-07-26 16:39:37 +08:00
参数:
- **network** (Cell) - 训练网络。
2022-08-31 10:25:10 +08:00
- **optimizer** (Cell) - 用于更新权重的优化器。
2022-03-09 12:15:39 +08:00
.. py:class:: mindspore.boost.OptimizerProcess(opt)
2022-08-24 17:45:11 +08:00
处理Boost的优化器。目前支持给优化器添加梯度中心化和创建新的优化器。
2022-03-09 12:15:39 +08:00
2022-07-26 16:39:37 +08:00
参数:
- **opt** (Cell) - 使用的优化器。
2022-03-09 12:15:39 +08:00
.. py:method:: add_grad_centralization(network)
添加梯度中心化。
2022-07-26 16:39:37 +08:00
参数:
- **network** (Cell) - 训练网络。
2022-03-09 12:15:39 +08:00
.. py:method:: build_gc_params_group(params_dict, parameters)
2022-03-28 20:42:33 +08:00
构建梯度中心化的分组权重。
2022-03-09 12:15:39 +08:00
2022-07-26 16:39:37 +08:00
参数:
- **params_dict** (dict) - 训练权重的字典。
- **parameters** (list) - 训练权重的列表。
2022-03-09 12:15:39 +08:00
.. py:method:: build_params_dict(network)
2022-03-28 20:42:33 +08:00
构建网络权重的字典。
2022-03-09 12:15:39 +08:00
2022-07-26 16:39:37 +08:00
参数:
- **network** (Cell) - 训练网络。
2022-03-09 12:15:39 +08:00
.. py:method:: generate_new_optimizer()
生成新的优化器。
.. py:class:: mindspore.boost.ParameterProcess()
处理Boost网络的权重。当前支持创建分组参数和自动设置网络梯度切分点。
.. py:method:: assign_parameter_group(parameters, split_point=None)
设置分组权重。
2022-07-26 16:39:37 +08:00
参数:
- **parameters** (list) - 训练网络的权重。
- **split_point** (list) - 网络梯度切分点。默认为None。
2022-03-09 12:15:39 +08:00
.. py:method:: generate_group_params(parameters, origin_params)
创建分组权重。
2022-07-26 16:39:37 +08:00
参数:
- **parameters** (list) - 训练网络的新权重。
- **origin_params** (list) - 训练网络的初始权重。
2022-02-17 16:26:58 +08:00
.. py:class:: mindspore.boost.BoostTrainOneStepCell(network, optimizer, sens=1.0)
2022-02-17 14:34:59 +08:00
Boost网络训练封装类。
2022-02-17 16:26:58 +08:00
2022-08-24 17:45:11 +08:00
用优化器封装网络。使用输入训练网络来获取结果。反向图在 *construct* 函数中创建,以更新参数,并且支持多种不同的并行模式。
2022-02-17 16:26:58 +08:00
2022-07-26 16:39:37 +08:00
参数:
- **network** (Cell) - 训练网络,当前网络只支持单个输出。
- **optimizer** (Union[Cell]) - 用于更新网络参数的优化器。
- **sens** (numbers.Number) - 作为反向传播输入要填充的缩放数默认值为1.0。
2022-02-17 16:26:58 +08:00
2022-07-26 16:39:37 +08:00
输入:
2023-02-23 10:04:43 +08:00
- **\*inputs** (Tuple(Tensor)) - 网络的所有输入组成的元组。
2022-02-17 16:26:58 +08:00
2022-07-26 16:39:37 +08:00
输出:
Tuple包含三个Tensor分别为损失函数值、溢出状态和当前损失缩放系数。
2022-02-17 16:26:58 +08:00
2022-07-26 16:39:37 +08:00
- loss(Tensor)标量Tensor。
- overflow(Tensor)标量Tensor类型为bool。
- loss scaling value(Tensor)标量Tensor。
2022-02-17 16:26:58 +08:00
2022-07-26 16:39:37 +08:00
异常:
- **TypeError** - 如果 `sens` 不是一个数字。
2022-02-17 16:26:58 +08:00
2022-03-09 12:15:39 +08:00
.. py:method:: adasum_process(loss, grads)
2022-03-09 12:15:39 +08:00
使用Adasum算法训练。
2022-02-28 19:09:11 +08:00
2022-07-26 16:39:37 +08:00
参数:
- **loss** (Tensor) - 网络训练的loss值。
2022-08-31 10:25:10 +08:00
- **grads** (tuple(Tensor)) - 网络训练过程中的梯度。
2022-07-26 16:39:37 +08:00
返回:
Tensor网络训练过程中得到的loss值。
2022-03-09 12:15:39 +08:00
.. py:method:: check_adasum_enable()
2022-03-09 12:15:39 +08:00
Adasum算法仅在多卡或者多机场景生效并且要求卡数符合2的n次方该函数用来判断adasum算法能否生效。
2022-07-26 16:39:37 +08:00
返回:
enable_adasum (bool)Adasum算法是否生效。
2022-03-09 12:15:39 +08:00
.. py:method:: check_dim_reduce_enable()
2022-03-28 20:42:33 +08:00
获取当前是否使用降维二阶训练算法训练。
2022-07-26 16:39:37 +08:00
返回:
enable_dim_reduce (bool),降维二阶训练算法是否生效。
2022-03-09 12:15:39 +08:00
2022-02-17 16:26:58 +08:00
.. py:method:: gradient_accumulation_process(loss, grads, sens, *inputs)
2022-02-17 16:26:58 +08:00
使用梯度累积算法训练。
2022-02-28 19:09:11 +08:00
2022-07-26 16:39:37 +08:00
参数:
- **loss** (Tensor) - 网络训练的loss值。
2022-08-31 10:25:10 +08:00
- **grads** (tuple(Tensor)) - 网络训练过程中的梯度。
2022-07-26 16:39:37 +08:00
- **sens** (Tensor) - 作为反向传播输入要填充的缩放数。
2022-08-31 10:25:10 +08:00
- **inputs** (tuple(Tensor)) - 网络训练的输入。
2022-02-28 19:09:11 +08:00
2022-07-26 16:39:37 +08:00
返回:
Tensor网络训练过程中得到的loss值。
2022-03-09 12:15:39 +08:00
.. py:method:: gradient_freeze_process(*inputs)
2022-03-09 12:15:39 +08:00
使用梯度冻结算法训练。
2022-02-28 19:09:11 +08:00
2022-07-26 16:39:37 +08:00
参数:
2022-08-31 10:25:10 +08:00
- **inputs** (tuple(Tensor)) - 网络训练的输入。
2022-07-26 16:39:37 +08:00
返回:
Tensor网络训练过程中得到的loss值。
2022-02-17 16:26:58 +08:00
2022-02-17 14:34:59 +08:00
.. py:class:: mindspore.boost.BoostTrainOneStepWithLossScaleCell(network, optimizer, scale_sense)
使用混合精度功能的Boost训练网络。
2022-08-24 17:45:11 +08:00
实现了包含损失缩放loss scale的单次训练。它使用网络、优化器和用于更新损失缩放系数loss scale的Cell(或一个Tensor)作为参数。可在host侧或device侧更新损失缩放系数。BoostTrainOneStepWithLossScaleCell会被编译成图其中inputs作为输入数据。张量类型参数 `scale_sense` 作为损失缩放时使用的值。
如果需要在host侧更新使用Tensor作为 `scale_sense` 。如果需要在device侧更新使用可更新损失缩放系数的Cell实例作为 `scale_sense`
2022-02-17 14:34:59 +08:00
2022-07-26 16:39:37 +08:00
参数:
- **network** (Cell) - 训练网络,当前网络只支持单个输出。
2022-08-31 10:25:10 +08:00
- **optimizer** (Cell) - 用于更新网络参数的优化器。
2022-07-26 16:39:37 +08:00
- **scale_sense** (Union[Tensor, Cell]) - 如果此值为Cell类型`BoostTrainOneStepWithLossScaleCell` 会调用它来更新损失缩放系数。如果此值为Tensor类型可调用 `set_sense_scale` 来更新损失缩放系数shape为 :math:`()`:math:`(1,)`
2022-02-17 14:34:59 +08:00
2022-07-26 16:39:37 +08:00
输入:
2023-02-23 10:04:43 +08:00
- **\*inputs** (Tuple(Tensor)) - 网络的所有输入组成的元组。
2022-02-17 14:34:59 +08:00
2022-07-26 16:39:37 +08:00
输出:
Tuple包含三个Tensor分别为损失函数值、溢出状态和当前损失缩放系数。
2022-02-17 14:34:59 +08:00
2022-07-26 16:39:37 +08:00
- **loss** (Tensor) - 标量Tensor。
- **overflow** (Tensor) - 标量Tensor类型为bool。
- **loss scaling value** (Tensor) - 标量Tensor。
2022-02-17 14:34:59 +08:00
2022-07-26 16:39:37 +08:00
异常:
- **TypeError** - `scale_sense` 既不是Cell也不是Tensor。
- **ValueError** - `scale_sense` 的shape既不是(1,)也不是()。
2022-02-17 14:34:59 +08:00
2022-03-09 12:15:39 +08:00
.. py:class:: mindspore.boost.LessBN(network, fn_flag=False)
2022-02-21 19:56:53 +08:00
2022-03-09 12:15:39 +08:00
LessBN算法可以在不损失网络精度的前提下自动减少网络中批归一化Batch Normalization的数量来提升网络性能。
2022-02-21 19:56:53 +08:00
2022-07-26 16:39:37 +08:00
参数:
- **network** (Cell) - 待训练的网络模型。
- **fn_flag** (bool) - 是否将网络中最后一个全连接层替换为全归一化层。默认值False。
2022-02-21 19:56:53 +08:00
2022-02-17 16:26:58 +08:00
.. py:class:: mindspore.boost.GradientFreeze(param_groups, freeze_type, freeze_p, total_steps)
梯度冻结算法,根据指定策略随机冻结某些层的梯度,来提升网络训练性能。
冻结的层数和冻结的概率均可由用户配置。
2022-07-26 16:39:37 +08:00
参数:
- **param_groups** (Union[tuple, list]) - 梯度冻结训练的权重。
- **freeze_type** (int) - 梯度冻结训练的策略。
- **freeze_p** (float) - 梯度冻结训练的概率。
- **total_steps** (int) - 整个训练过程的总的步数。
2022-02-17 16:26:58 +08:00
2022-03-09 12:15:39 +08:00
.. py:method:: freeze_generate(network, optimizer)
生成梯度冻结的网络与优化器。
2022-07-26 16:39:37 +08:00
参数:
- **network** (Cell) - 训练网络。
2022-08-31 10:25:10 +08:00
- **optimizer** (Cell) - 用于更新权重的优化器。
2022-03-09 12:15:39 +08:00
2022-02-17 16:26:58 +08:00
.. py:method:: generate_freeze_index_sequence(parameter_groups_number, freeze_strategy, freeze_p, total_steps)
2022-02-17 14:34:59 +08:00
2022-02-17 16:26:58 +08:00
生成梯度冻结每一步需要冻结的层数。
2022-02-17 14:34:59 +08:00
2022-07-26 16:39:37 +08:00
参数:
2022-08-31 10:25:10 +08:00
- **parameter_groups_number** (int) - 梯度冻结训练的权重个数。
2022-07-26 16:39:37 +08:00
- **freeze_strategy** (int) - 梯度冻结训练的策略。
- **freeze_p** (float) - 梯度冻结训练的概率。
2022-08-31 10:25:10 +08:00
- **total_steps** (int) - 整个训练过程的总的步数。
2022-02-17 14:34:59 +08:00
2022-02-17 16:26:58 +08:00
.. py:method:: split_parameters_groups(net, freeze_para_groups_number)
2022-02-17 14:34:59 +08:00
2022-02-17 16:26:58 +08:00
拆分用于梯度冻结训练的权重。
2022-02-17 14:34:59 +08:00
2022-07-26 16:39:37 +08:00
参数:
- **net** (Cell) - 训练网络。
- **freeze_para_groups_number** (int) - 梯度冻结训练的权重个数。
2022-02-17 16:26:58 +08:00
2022-03-09 12:15:39 +08:00
.. py:class:: mindspore.boost.FreezeOpt(opt, train_parameter_groups=None, train_strategy=None)
2022-02-17 14:34:59 +08:00
2022-03-09 12:15:39 +08:00
支持梯度冻结训练的优化器。
2022-02-17 14:34:59 +08:00
2022-07-26 16:39:37 +08:00
参数:
- **opt** (Cell) - 非冻结优化器实例,如 *Momentum**SGD*
- **train_parameter_groups** (Union[tuple, list]) - 梯度冻结训练的权重。
- **train_strategy** (Union[tuple(int), list(int), Tensor]) - 梯度冻结训练的策略。
2022-02-17 14:34:59 +08:00
2022-03-31 14:50:00 +08:00
.. py:function:: mindspore.boost.freeze_cell(reducer_flag, network, optimizer, sens, grad, use_grad_accumulation, mean=None, degree=None, max_accumulation_step=1)
2022-02-17 14:34:59 +08:00
提供带梯度冻结的网络Cell。
2022-07-26 16:39:37 +08:00
参数:
- **reducer_flag** (bool) - 是否分布式训练。
- **network** (Cell) - 训练网络。
- **optimizer** (Cell) - 优化器。
- **sens** (numbers.Number) - 损失缩放系数。
- **grad** (tuple(Tensor)) - 网络梯度。
- **use_grad_accumulation** (bool) - 是否使用梯度累积。
- **mean** (bool) - 可选参数梯度是否求平均仅分布式训练时生效。默认值为None。
- **degree** (int) - 可选参数device卡数仅分布式训练时生效。默认值为None。
- **max_accumulation_step** (int) - 可选参数梯度累积步数。默认值为1。
2022-02-17 14:34:59 +08:00
2022-02-17 16:26:58 +08:00
.. py:class:: mindspore.boost.GradientAccumulation(max_accumulation_step, optimizer)
梯度累积算法在累积多个step的梯度之后再用来更新网络权重可以提高训练效率。
2022-07-26 16:39:37 +08:00
参数:
- **max_accumulation_step** (int) - 累积梯度的步数。
- **optimizer** (Cell) - 网络训练使用的优化器。
2022-02-17 16:26:58 +08:00
2022-03-09 12:15:39 +08:00
.. py:class:: mindspore.boost.AdaSum(rank, device_number, group_number, parameter_tuple)
2022-02-17 14:34:59 +08:00
2022-03-09 12:15:39 +08:00
Adaptive Summation(AdaSum)是一种优化深度学习模型并行训练的算法,它可以提升不同规模集群训练的精度,减小不同规模集群调参难度。
2022-02-17 14:34:59 +08:00
2022-07-26 16:39:37 +08:00
参数:
- **rank** (int) - 总的训练的卡数。
- **device_number** (int) - 单机的卡数。
- **group_number** (int) - 分组的数量。
- **parameter_tuple** (Tuple(Parameter)) - 网络训练权重组成的元组。
2022-02-17 14:34:59 +08:00
2022-07-26 16:39:37 +08:00
输入:
- **delta_weights** (Tuple(Tensor)) - 梯度tuple。
- **parameters** (Tuple(Parameter)) - 当前权重组成的元组。
- **old_parameters** (Tuple(Parameter)) - 旧的权重组成的元组。
2022-02-17 14:34:59 +08:00
2022-07-26 16:39:37 +08:00
输出:
- **adasum_parameters** (Tuple(Tensor)) - adasum处理后更新的权重。
2022-02-17 14:34:59 +08:00
2022-03-09 12:15:39 +08:00
.. py:class:: mindspore.boost.DimReduce(network, optimizer, weight, pca_mat_local, n_components, rho, gamma, alpha, sigma, rank, rank_size)
2022-02-17 14:34:59 +08:00
2022-03-09 12:15:39 +08:00
降维训练(dimension reduce training)是一种优化深度学习模型训练的算法,它可以加速模型的收敛。
2022-02-17 14:34:59 +08:00
2022-03-09 12:15:39 +08:00
算法主要原理:
2022-02-17 14:34:59 +08:00
2022-03-09 12:15:39 +08:00
.. math::
2022-02-17 14:34:59 +08:00
2022-03-09 12:15:39 +08:00
\begin{align}
grad\_k &= pca\_mat \cdot grad\\
dk &= - bk \cdot grad\_k\\
sk &= rho ^ m \cdot dk\\
delta\_loss &= sigma \cdot grad\_k.T \cdot sk
\end{align}
2022-02-17 14:34:59 +08:00
2022-03-09 12:15:39 +08:00
其中:
2022-02-17 14:34:59 +08:00
2022-03-28 20:42:33 +08:00
- pca_mat (array): PCA矩阵维度(k*n)k是 `n_components` 的大小n是权重的大小。
2022-03-09 12:15:39 +08:00
- bk (array): 维度(k*k)bk是拟牛顿法中的对称正定矩阵。
2022-02-17 14:34:59 +08:00
2022-03-09 12:15:39 +08:00
我们需要找到满足以下条件的m:
2022-02-17 14:34:59 +08:00
2022-03-09 12:15:39 +08:00
.. math::
new\_loss < old\_loss + delta\_loss
2022-02-17 14:34:59 +08:00
2022-03-09 12:15:39 +08:00
然后使用delta_grad去更新模型的权重:
2022-02-17 14:34:59 +08:00
2022-03-09 12:15:39 +08:00
.. math::
2022-02-17 14:34:59 +08:00
2022-03-09 12:15:39 +08:00
\begin{align}
grad\_k\_proj &= pca\_mat.T \cdot grad\_k\\
new\_grad\_momentum &= gamma \cdot old\_grad\_momentum + grad - grad\_k\_proj\\
delta\_grad &= alpha \cdot new\_grad\_momentum - pca\_mat.T \cdot sk
\end{align}
2022-02-17 14:34:59 +08:00
2022-07-26 16:39:37 +08:00
参数:
- **network** (Cell) - 训练网络,只支持单输出。
- **optimizer** (Union[Cell]) - 更新权重的优化器。
- **weight** (Tuple(Parameter)) - 网络权重组成的元组。
- **pca_mat_local** (numpy.ndarray) - 用于PCA操作的经过切分的PCA转换矩阵维度为k*nk是切分的 `n_components` 的大小n是权重的大小。
- **n_components** (int) - PCA的主成分维度(components)。
- **rho** (float) - 超参。
- **gamma** (float) - 超参。
- **alpha** (float) - 超参。
- **sigma** (float) - 超参。
- **rank** (int) - Rank编号。
- **rank_size** (int) - Rank总数。
输入:
- **loss** (Tensor) - 网络loss标量Tensor。
- **old_grad** (Tuple(Tensor)) - 网络权重提取组成的元组。
- **weight** (Tuple(Tensor)) - 网络权重组成的元组。
- **weight_clone** (Tuple(Tensor)) - 网络权重的副本。
2023-02-23 10:04:43 +08:00
- **\*inputs** (Tuple(Tensor)) - 网络的所有输入组成的元组。
2022-07-26 16:39:37 +08:00
输出:
- **loss** (Tensor) - 网络loss标量Tensor。
2022-02-17 14:34:59 +08:00
.. py:class:: mindspore.boost.GroupLossScaleManager(init_loss_scale, loss_scale_groups)
增强型混合精度算法支持不同loss scale的多层应用和损失尺度的动态更新。
2022-07-26 16:39:37 +08:00
参数:
- **init_loss_scale** (Number) - 初始化loss scale。
- **loss_scale_groups** (List) - 从参数列表里分离出来的loss scale组。
2022-07-26 16:39:37 +08:00
输入:
- **x** (Tensor) - 最后一个operator的输出。
- **layer1** (int) - 当前网络层的值。
- **layer2** (int) - 最后一个网络层的值。
2022-07-26 16:39:37 +08:00
输出:
- **x** (Tensor) - _DynamicLossScale operator的输出。
.. py:method:: get_loss_scale()
获取loss scale的值。
2022-07-26 16:39:37 +08:00
返回:
bool`loss_scale` 的值。
.. py:method:: get_update_cell()
返回 :class:`mindspore.boost.GroupLossScaleManager` 实例。
2022-07-26 16:39:37 +08:00
返回:
:class:`mindspore.boost.GroupLossScaleManager` 实例。
.. py:method:: set_loss_scale_status(loss_scale_number, init_loss_scale)
生成动态loss scale元组并设置溢出状态列表。
2022-07-26 16:39:37 +08:00
参数:
- **loss_scale_number** (int) - loss scale的数量。
- **init_loss_scale** (float) - 已初始化的loss scale。
.. py:method:: update_loss_scale_status(layer, update_ratio)
更新动态loss scale。
2022-07-26 16:39:37 +08:00
参数:
- **layer** (int) - 当前层。
- **update_ratio** (float) - 更新loss scale的当前比例。
2022-07-26 16:39:37 +08:00
输出:
float新loss scale的值。
2022-02-11 17:34:24 +08:00
.. automodule:: mindspore.boost
2022-02-17 16:26:58 +08:00
:members: