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

505 lines
18 KiB
ReStructuredText
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

mindspore.boost
==============================
Boost能够自动加速网络如减少BN/梯度冻结/累积梯度等。
注:此特性为测试版本,我们仍在改进其功能。
.. py:class:: mindspore.boost.AutoBoost(level="O0", boost_config_dict="")
MindSpore自动优化算法库。
**参数:**
- **level** (str) Boost的配置级别默认值"O0"。
- **boost_config_dict** (dict) 用户可配置的超参字典,建议的格式如下:
.. code-block::
{
"boost": {
"mode": "auto",
"less_bn": False,
"grad_freeze": False,
"adasum": False,
"grad_accumulation": False,
"dim_reduce": False},
"common": {
"gradient_split_groups": [50, 100],
"device_number": 8},
"less_bn": {
"fn_flag": True,
"gc_flag": True},
"grad_freeze": {
"param_groups": 10,
"freeze_type": 1,
"freeze_p": 0.7,
"total_steps": 65536},
"grad_accumulation": {
"grad_accumulation_step": 1},
"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}
}
- boost:
- mode (str): boost配置模式支持 ["auto", "manual", "enable_all", "disable_all"]。默认值: "auto"。
- auto: 自动配置取决于Model类中的"boost_level"参数配置。
- manual: 在"boost_config_dict"中人工配置。
- enable_all: 开启所有boost算法。
- disable_all: 关闭所有boost算法。
- less_bn (bool): 是否开启LessBN算法默认: 不开启。
- grad_freeze: (bool): 是否开启梯度冻结算法,默认: 不开启。
- adasum (bool): 是否开启自适应求和算法,默认: 不开启。
- grad_accumulation (bool): 是否开启梯度累加算法,默认: 不开启。
- dim_reduce (bool): 是否开启降维训练算法,默认: 不开启。
如果开启dim_reduce算法其他算法会失效。
如果开启grad_freeze算法同时关闭dim_reduce其他算法会失效。
- common:
- gradient_split_groups (list): 网络的梯度分割点,默认: [50, 100]。
- device_number (int): 设备数,默认: 8。
- less_bn:
- fn_flag (bool): 是否采用fn替换fc默认: 替换。
- gc_flag (bool): 是否启用gc默认: 启用gc。
- grad_freeze:
- param_groups (int): 参数分组数量,默认值: 10。
- freeze_type (int): 梯度冻结策略,参数选择[0, 1],默认值: 1。
- freeze_p (float): 梯度冻结概率,默认值: 0.7。
- total_steps (int): 总训练步数,默认值: 65536。
- grad_accumulation:
- grad_accumulation_step (int): 累加梯度的步数,默认值: 1。
- dim_reduce:
dim_reduce主要原理
.. math::
\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}
其中:
- pca_mat (array): 维度(k*n)k是n_components的大小n是权重的大小。
- bk (array): 维度(k*k)bk是拟牛顿法中的对称正定矩阵。
我们需要找到满足以下条件的m:
.. math::
new\_loss < old\_loss + delta\_loss
然后使用delta_grad去更新模型的权重:
.. math::
\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}
- 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)。
用户可以通过加载JSON文件或者直接使用字典来配置boost_config_dict。
未配置的参数会使用默认值。
**异常:**
- **ValueError** Boost的模式不在["auto", "manual", "enable_all", "disable_all"]这个列表中。
.. py:method:: network_auto_process_eval(network)
使用Boost算法推理。
**参数:**
**network** (Cell) - 推理网络。
.. py:method:: network_auto_process_train(network, optimizer)
使用Boost算法训练。
**参数:**
- **network** (Cell) - 训练网络。
- **optimizer** (Union[Cell]) - 用于更新权重的优化器。
.. py:class:: mindspore.boost.OptimizerProcess(opt)
处理Boost的优化器目前支持给优化器添加梯度中心化和创建新的优化器。
**参数:**
- **opt** (Cell) 使用的优化器。
.. py:method:: add_grad_centralization(network)
添加梯度中心化。
**参数:**
- **network** (Cell) 训练网络。
.. py:method:: build_gc_params_group(params_dict, parameters)
构建网络权重的dict。
**参数:**
- **params_dict** (dict) 训练权重的字典。
- **parameters** (list) 训练权重的列表。
.. py:method:: build_params_dict(network)
构建网络权重的dict。
**参数:**
- **network** (Cell) 训练网络。
.. py:method:: generate_new_optimizer()
生成新的优化器。
.. py:class:: mindspore.boost.ParameterProcess()
处理Boost网络的权重。当前支持创建分组参数和自动设置网络梯度切分点。
.. py:method:: assign_parameter_group(parameters, split_point=None)
设置分组权重。
**参数:**
- **parameters** (list) 训练网络的权重。
- **split_point** (list) 网络梯度切分点。默认为None。
.. py:method:: generate_group_params(parameters, origin_params)
创建分组权重。
**参数:**
- **parameters** (list) 训练网络的新权重。
- **origin_params** (list) 训练网络的初始权重。
.. py:class:: mindspore.boost.BoostTrainOneStepCell(network, optimizer, sens=1.0)
Boost网络训练封装类。
用优化器封装网络,使用输入训练网络来获取结果。反向图在*construct*函数中自动创建,并且支持多种不同的并行模式。
**参数:**
- **network** (Cell) 训练网络,当前网络只支持单个输出。
- **optimizer** (Union[Cell]) 用于更新网络参数的优化器。
- **sens** (numbers.Number) 作为反向传播输入要填充的缩放数默认值为1.0。
**输入:**
- **(*inputs)** (Tuple(Tensor))- 网络的所有输入组成的元组。
**输出:**
Tuple包含三个Tensor分别为损失函数值、溢出状态和当前损失缩放系数。
- loss(Tensor)标量Tensor。
- overflow(Tensor)标量Tensor类型为bool。
- loss scaling value(Tensor)标量Tensor。
**异常:**
- **TypeError** 如果*sens*不是一个数字。
.. py:method:: adasum_process(loss, grads)
使用Adasum算法训练。
**参数:**
- **loss** (Tensor) 网络训练的loss值。
- **grads** (Tuple(Tensor)) 网络训练过程中的梯度。
**返回:**
Tensor网络训练过程中得到的loss值。
.. py:method:: check_adasum_enable()
Adasum算法仅在多卡或者多机场景生效并且要求卡数符合2的n次方该函数用来判断adasum算法能否生效。
**返回:**
enable_adasum (bool)Adasum算法是否生效。
.. py:method:: check_dim_reduce_enable()
使用降维二阶训练算法训练。
**返回:**
enable_dim_reduce (bool),降维二阶训练算法是否生效。
.. py:method:: gradient_accumulation_process(loss, grads, sens, *inputs)
使用梯度累积算法训练。
**参数:**
- **loss** (Tensor) 网络训练的loss值。
- **grads** (Tuple(Tensor)) 网络训练过程中的梯度。
- **sens** (Tensor) 作为反向传播输入要填充的缩放数。
- **inputs** (Tuple(Tensor)) 网络训练的输入。
**返回:**
Tensor网络训练过程中得到的loss值。
.. py:method:: gradient_freeze_process(*inputs)
使用梯度冻结算法训练。
**参数:**
- **inputs** (Tuple(Tensor)) 网络训练的输入。
**返回:**
Tensor网络训练过程中得到的loss值。
.. py:class:: mindspore.boost.BoostTrainOneStepWithLossScaleCell(network, optimizer, scale_sense)
使用混合精度功能的Boost训练网络。
实现了包含损失缩放loss scale的单次训练。它使用网络、优化器和用于更新损失缩放系数loss scale的Cell(或一个Tensor)作为参数。可在host侧或device侧更新损失缩放系数。
如果需要在host侧更新使用Tensor作为 `scale_sense` 否则使用可更新损失缩放系数的Cell实例作为 `scale_sense`
**参数:**
- **network** (Cell) 训练网络,当前网络只支持单个输出。
- **optimizer** (Union[Cell]) 用于更新网络参数的优化器。
- **scale_sense** (Union[Tensor, Cell]) - 如果此值为Cell类型`BoostTrainOneStepWithLossScaleCell` 会调用它来更新损失缩放系数。如果此值为Tensor类型可调用 `set_sense_scale` 来更新损失缩放系数shape为 :math:`()`:math:`(1,)`
**输入:**
- **(*inputs)** (Tuple(Tensor))- 网络的所有输入组成的元组。
**输出:**
Tuple包含三个Tensor分别为损失函数值、溢出状态和当前损失缩放系数。
- loss(Tensor)标量Tensor。
- overflow(Tensor)标量Tensor类型为bool。
- loss scaling value(Tensor)标量Tensor。
**异常:**
- **TypeError** - `scale_sense` 既不是Cell也不是Tensor。
- **ValueError** - `scale_sense` 的shape既不是(1,)也不是()。
.. py:class:: mindspore.boost.LessBN(network, fn_flag=False)
LessBN算法可以在不损失网络精度的前提下自动减少网络中批归一化Batch Normalization的数量来提升网络性能。
**参数:**
- **network** (Cell) 待训练的网络模型。
- **fn_flag** (bool) 是否将网络中最后一个全连接层替换为全归一化层。默认值False。
.. py:class:: mindspore.boost.GradientFreeze(param_groups, freeze_type, freeze_p, total_steps)
梯度冻结算法,根据指定策略随机冻结某些层的梯度,来提升网络训练性能。
冻结的层数和冻结的概率均可由用户配置。
**参数:**
- **param_groups** (Union[tuple, list]) 梯度冻结训练的权重。
- **freeze_type** (int) 梯度冻结训练的策略。
- **freeze_p** (float) 梯度冻结训练的概率。
- **total_steps** (numbers.Number) 整个训练过程的总的步数。
.. py:method:: freeze_generate(network, optimizer)
生成梯度冻结的网络与优化器。
**参数:**
- **network** (Cell) 训练网络。
- **optimizer** (Union[Cell]) 用于更新权重的优化器。
.. py:method:: generate_freeze_index_sequence(parameter_groups_number, freeze_strategy, freeze_p, total_steps)
生成梯度冻结每一步需要冻结的层数。
**参数:**
- **parameter_groups_number** (numbers.Number) 梯度冻结训练的权重个数。
- **freeze_strategy** (int) 梯度冻结训练的策略。
- **freeze_p** (float) 梯度冻结训练的概率。
- **total_steps** (numbers.Number) 整个训练过程的总的步数。
.. py:method:: split_parameters_groups(net, freeze_para_groups_number)
拆分用于梯度冻结训练的权重。
**参数:**
- **net** (Cell) 训练网络。
- **freeze_para_groups_number** (numbers.Number) 梯度冻结训练的权重个数。
.. py:class:: mindspore.boost.FreezeOpt(opt, train_parameter_groups=None, train_strategy=None)
支持梯度冻结训练的优化器。
**参数:**
- **opt** (Cell) 非冻结优化器实例,如*Momentum**SGD*
- **train_parameter_groups** (Union[tuple, list]) 梯度冻结训练的权重。
- **train_strategy** (Union[tuple(int), list(int), Tensor]) 梯度冻结训练的策略。
.. py:function:: mindspore.boost.freeze_cell(reducer_flag, network, optimizer, sens, grad, use_grad_accumulation, mean=None, degree=None, max_accumulation_step=1)
提供带梯度冻结的网络Cell。
**参数:**
- **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。
.. py:class:: mindspore.boost.GradientAccumulation(max_accumulation_step, optimizer)
梯度累积算法在累积多个step的梯度之后再用来更新网络权重可以提高训练效率。
**参数:**
- **max_accumulation_step** (int) 累积梯度的步数。
- **optimizer** (Cell) 网络训练使用的优化器。
.. py:class:: mindspore.boost.AdaSum(rank, device_number, group_number, parameter_tuple)
Adaptive Summation(AdaSum)是一种优化深度学习模型并行训练的算法,它可以提升不同规模集群训练的精度,减小不同规模集群调参难度。
**参数:**
- **rank** (int) 总的训练的卡数。
- **device_number** (int) 单机的卡数。
- **group_number** (int) 分组的数量。
- **parameter_tuple** (Tuple(Parameter)) 网络训练权重组成的元组。
**输入:**
- **delta_weights** (Tuple(Tensor)) 梯度tuple。
- **parameters** (Tuple(Parameter)) 当前权重组成的元组。
- **old_parameters** (Tuple(Parameter)) 旧的权重组成的元组。
**输出:**
- **adasum_parameters** (Tuple(Tensor)) - adasum处理后更新的权重。
.. py:class:: mindspore.boost.DimReduce(network, optimizer, weight, pca_mat_local, n_components, rho, gamma, alpha, sigma, rank, rank_size)
降维训练(dimension reduce training)是一种优化深度学习模型训练的算法,它可以加速模型的收敛。
算法主要原理:
.. math::
\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}
其中:
- pca_mat (array): 维度(k*n)k是n_components的大小n是权重的大小。
- bk (array): 维度(k*k)bk是拟牛顿法中的对称正定矩阵。
我们需要找到满足以下条件的m:
.. math::
new\_loss < old\_loss + delta\_loss
然后使用delta_grad去更新模型的权重:
.. math::
\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}
**参数:**
- **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) - 标量Tensor。
- **old_grad** (Tuple(Tensor)) - 网络权重提取组成的元组。
- **weight** (Tuple(Tensor)) - 网络权重组成的元组。
- **weight_clone** (Tuple(Tensor)) - 网络权重的副本。
- **(\*inputs)** (Tuple(Tensor)) - 网络的所有输入组成的元组。
**输出:**
- **loss** (Tensor) - 标量Tensor。
.. automodule:: mindspore.boost
:members: