You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

mindspore.boost.rst 18 kB

4 years ago
4 years ago
4 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504
  1. mindspore.boost
  2. ==============================
  3. Boost能够自动加速网络,如减少BN/梯度冻结/累积梯度等。
  4. 注:此特性为测试版本,我们仍在改进其功能。
  5. .. py:class:: mindspore.boost.AutoBoost(level="O0", boost_config_dict="")
  6. MindSpore自动优化算法库。
  7. **参数:**
  8. - **level** (str) – Boost的配置级别。
  9. - **boost_config_dict** (dict) – 用户可配置的超参字典,建议的格式如下:
  10. .. code-block::
  11. {
  12. "boost": {
  13. "mode": "auto",
  14. "less_bn": False,
  15. "grad_freeze": False,
  16. "adasum": False,
  17. "grad_accumulation": False,
  18. "dim_reduce": False},
  19. "common": {
  20. "gradient_split_groups": [50, 100],
  21. "device_number": 8},
  22. "less_bn": {
  23. "fn_flag": True,
  24. "gc_flag": True},
  25. "grad_freeze": {
  26. "param_groups": 10,
  27. "freeze_type": 1,
  28. "freeze_p": 0.7,
  29. "total_steps": 65536},
  30. "grad_accumulation": {
  31. "grad_accumulation_step": 1},
  32. "dim_reduce": {
  33. "rho": 0.55,
  34. "gamma": 0.9,
  35. "alpha": 0.001,
  36. "sigma": 0.4,
  37. "n_components": 32,
  38. "pca_mat_path": None,
  39. "weight_load_dir": None,
  40. "timeout": 1800}
  41. }
  42. - boost:
  43. - mode (str): boost配置模式,支持 ["auto", "manual", "enable_all", "disable_all"]。默认值: "auto"。
  44. - auto: 自动配置,取决于Model类中的"boost_level"参数配置。
  45. - manual: 在"boost_config_dict"中人工配置。
  46. - enable_all: 开启所有boost算法。
  47. - disable_all: 关闭所有boost算法。
  48. - less_bn (bool): 是否开启LessBN算法,默认: 不开启。
  49. - grad_freeze: (bool): 是否开启梯度冻结算法,默认: 不开启。
  50. - adasum (bool): 是否开启自适应求和算法,默认: 不开启。
  51. - grad_accumulation (bool): 是否开启梯度累加算法,默认: 不开启。
  52. - dim_reduce (bool): 是否开启降维训练算法,默认: 不开启。
  53. 如果开启dim_reduce算法,其他算法会失效。
  54. 如果开启grad_freeze算法,同时关闭dim_reduce,其他算法会失效。
  55. - common:
  56. - gradient_split_groups (list): 网络的梯度分割点,默认: [50, 100]。
  57. - device_number (int): 设备数,默认: 8。
  58. - less_bn:
  59. - fn_flag (bool): 是否采用fn替换fc,默认: 替换。
  60. - gc_flag (bool): 是否启用gc,默认: 启用gc。
  61. - grad_freeze:
  62. - param_groups (int): 参数分组数量,默认值: 10。
  63. - freeze_type (int): 梯度冻结策略,参数选择[0, 1],默认值: 1。
  64. - freeze_p (float): 梯度冻结概率,默认值: 0.7。
  65. - total_steps (int): 总训练步数,默认值: 65536。
  66. - grad_accumulation:
  67. - grad_accumulation_step (int): 累加梯度的步数,默认值: 1。
  68. - dim_reduce:
  69. dim_reduce主要原理:
  70. .. math::
  71. \begin{align}
  72. grad\_k &= pca\_mat \cdot grad\\
  73. dk &= - bk \cdot grad\_k\\
  74. sk &= rho ^ m \cdot dk\\
  75. delta\_loss &= sigma \cdot grad\_k.T \cdot sk
  76. \end{align}
  77. 其中:
  78. - pca_mat (array): 维度(k*n),k是n_components的大小,n是权重的大小。
  79. - bk (array): 维度(k*k),bk是拟牛顿法中的对称正定矩阵。
  80. 我们需要找到满足以下条件的m:
  81. .. math::
  82. new\_loss < old\_loss + delta\_loss
  83. 然后使用delta_grad去更新模型的权重:
  84. .. math::
  85. \begin{align}
  86. grad\_k\_proj &= pca\_mat.T \cdot grad\_k\\
  87. new\_grad\_momentum &= gamma \cdot old\_grad\_momentum + grad - grad\_k\_proj\\
  88. delta\_grad &= alpha \cdot new\_grad\_momentum - pca\_mat.T \cdot sk
  89. \end{align}
  90. - rho (float): 超参,一般无需调整,默认值: 0.55。
  91. - gamma (float): 超参,一般无需调整,默认值: 0.9。
  92. - alpha (float): 超参,一般无需调整,默认值: 0.001。
  93. - sigma (float): 超参,一般无需调整,默认值: 0.4。
  94. - n_components (int): PCA后的维度,默认值: 32。
  95. - pca_mat_path (str): PCA矩阵的加载路径,默认值: None。
  96. - weight_load_dir (str): 以checkpoint形式保存的权重加载路径,用于计算PCA矩阵,默认值: None。
  97. - timeout (int): 加载PCA矩阵的最长等待时间,默认值: 1800(s)。
  98. 用户可以通过加载JSON文件或者直接使用字典来配置boost_config_dict。
  99. 未配置的参数会使用默认值。
  100. **异常:**
  101. - **ValueError** – Boost的模式不在["auto", "manual", "enable_all", "disable_all"]这个列表中。
  102. .. py:method:: network_auto_process_eval(network)
  103. 使用Boost算法推理。
  104. **参数:**
  105. **network** (Cell) - 推理网络。
  106. .. py:method:: network_auto_process_train(network, optimizer)
  107. 使用Boost算法训练。
  108. **参数:**
  109. - **network** (Cell) - 训练网络。
  110. - **optimizer** (Union[Cell]) - 用于更新权重的优化器。
  111. .. py:class:: mindspore.boost.OptimizerProcess(opt)
  112. 处理Boost的优化器,目前支持给优化器添加梯度中心化和创建新的优化器。
  113. **参数:**
  114. - **opt** (Cell) – 使用的优化器。
  115. .. py:method:: add_grad_centralization(network)
  116. 添加梯度中心化。
  117. **参数:**
  118. - **network** (Cell) – 训练网络。
  119. .. py:method:: build_gc_params_group(params_dict, parameters)
  120. 构建网络权重的dict。
  121. **参数:**
  122. - **params_dict** (dict) – 训练权重的字典。
  123. - **parameters** (list) – 训练权重的列表。
  124. .. py:method:: build_params_dict(network)
  125. 构建网络权重的dict。
  126. **参数:**
  127. - **network** (Cell) – 训练网络。
  128. .. py:method:: generate_new_optimizer()
  129. 生成新的优化器。
  130. .. py:class:: mindspore.boost.ParameterProcess()
  131. 处理Boost网络的权重。当前支持创建分组参数和自动设置网络梯度切分点。
  132. .. py:method:: assign_parameter_group(parameters, split_point=None)
  133. 设置分组权重。
  134. **参数:**
  135. - **parameters** (list) – 训练网络的权重。
  136. - **split_point** (list) – 网络梯度切分点。默认为None。
  137. .. py:method:: generate_group_params(parameters, origin_params)
  138. 创建分组权重。
  139. **参数:**
  140. - **parameters** (list) – 训练网络的新权重。
  141. - **origin_params** (list) – 训练网络的初始权重。
  142. .. py:class:: mindspore.boost.BoostTrainOneStepCell(network, optimizer, sens=1.0)
  143. Boost网络训练封装类。
  144. 用优化器封装网络,使用输入训练网络来获取结果。反向图在*construct*函数中自动创建,并且支持多种不同的并行模式。
  145. **参数:**
  146. - **network** (Cell) – 训练网络,当前网络只支持单个输出。
  147. - **optimizer** (Union[Cell]) – 用于更新网络参数的优化器。
  148. - **sens** (numbers.Number) – 作为反向传播输入要填充的缩放数,默认值为1.0。
  149. **输入:**
  150. - **(*inputs)** (Tuple(Tensor))- 网络的所有输入组成的元组。
  151. **输出:**
  152. Tuple,包含三个Tensor,分别为损失函数值、溢出状态和当前损失缩放系数。
  153. - loss(Tensor),标量Tensor。
  154. - overflow(Tensor),标量Tensor,类型为bool。
  155. - loss scaling value(Tensor),标量Tensor。
  156. **异常:**
  157. - **TypeError** – 如果*sens*不是一个数字。
  158. .. py:method:: adasum_process(loss, grads)
  159. 使用Adasum算法训练。
  160. **参数:**
  161. - **loss** (Tensor) – 网络训练的loss值。
  162. - **grads** (Tuple(Tensor)) – 网络训练过程中的梯度。
  163. **返回:**
  164. Tensor,网络训练过程中得到的loss值。
  165. .. py:method:: check_adasum_enable()
  166. Adasum算法仅在多卡或者多机场景生效,并且要求卡数符合2的n次方,该函数用来判断adasum算法能否生效。
  167. **返回:**
  168. enable_adasum (bool),Adasum算法是否生效。
  169. .. py:method:: check_dim_reduce_enable()
  170. 使用降维二阶训练算法训练。
  171. **返回:**
  172. enable_dim_reduce (bool),降维二阶训练算法是否生效。
  173. .. py:method:: gradient_accumulation_process(loss, grads, sens, *inputs)
  174. 使用梯度累积算法训练。
  175. **参数:**
  176. - **loss** (Tensor) – 网络训练的loss值。
  177. - **grads** (Tuple(Tensor)) – 网络训练过程中的梯度。
  178. - **sens** (Tensor) – 作为反向传播输入要填充的缩放数。
  179. - **inputs** (Tuple(Tensor)) – 网络训练的输入。
  180. **返回:**
  181. Tensor,网络训练过程中得到的loss值。
  182. .. py:method:: gradient_freeze_process(*inputs)
  183. 使用梯度冻结算法训练。
  184. **参数:**
  185. - **inputs** (Tuple(Tensor)) – 网络训练的输入。
  186. **返回:**
  187. Tensor,网络训练过程中得到的loss值。
  188. .. py:class:: mindspore.boost.BoostTrainOneStepWithLossScaleCell(network, optimizer, scale_sense)
  189. 使用混合精度功能的Boost训练网络。
  190. 实现了包含损失缩放(loss scale)的单次训练。它使用网络、优化器和用于更新损失缩放系数(loss scale)的Cell(或一个Tensor)作为参数。可在host侧或device侧更新损失缩放系数。
  191. 如果需要在host侧更新,使用Tensor作为 `scale_sense` ,否则,使用可更新损失缩放系数的Cell实例作为 `scale_sense` 。
  192. **参数:**
  193. - **network** (Cell) – 训练网络,当前网络只支持单个输出。
  194. - **optimizer** (Union[Cell]) – 用于更新网络参数的优化器。
  195. - **scale_sense** (Union[Tensor, Cell]) - 如果此值为Cell类型,`BoostTrainOneStepWithLossScaleCell` 会调用它来更新损失缩放系数。如果此值为Tensor类型,可调用 `set_sense_scale` 来更新损失缩放系数,shape为 :math:`()` 或 :math:`(1,)` 。
  196. **输入:**
  197. - **(*inputs)** (Tuple(Tensor))- 网络的所有输入组成的元组。
  198. **输出:**
  199. Tuple,包含三个Tensor,分别为损失函数值、溢出状态和当前损失缩放系数。
  200. - loss(Tensor),标量Tensor。
  201. - overflow(Tensor),标量Tensor,类型为bool。
  202. - loss scaling value(Tensor),标量Tensor。
  203. **异常:**
  204. - **TypeError** - `scale_sense` 既不是Cell,也不是Tensor。
  205. - **ValueError** - `scale_sense` 的shape既不是(1,)也不是()。
  206. .. py:class:: mindspore.boost.LessBN(network, fn_flag=False)
  207. LessBN算法,可以在不损失网络精度的前提下,自动减少网络中批归一化(Batch Normalization)的数量,来提升网络性能。
  208. **参数:**
  209. - **network** (Cell) – 待训练的网络模型。
  210. - **fn_flag** (bool) – 是否将网络中最后一个全连接层替换为全归一化层。默认值:False。
  211. .. py:class:: mindspore.boost.GradientFreeze(param_groups, freeze_type, freeze_p, total_steps)
  212. 梯度冻结算法,根据指定策略随机冻结某些层的梯度,来提升网络训练性能。
  213. 冻结的层数和冻结的概率均可由用户配置。
  214. **参数:**
  215. - **param_groups** (Union[tuple, list]) – 梯度冻结训练的权重。
  216. - **freeze_type** (int) – 梯度冻结训练的策略。
  217. - **freeze_p** (float) – 梯度冻结训练的概率。
  218. - **total_steps** (numbers.Number) – 整个训练过程的总的步数。
  219. .. py:method:: freeze_generate(network, optimizer)
  220. 生成梯度冻结的网络与优化器。
  221. **参数:**
  222. - **network** (Cell) – 训练网络。
  223. - **optimizer** (Union[Cell]) – 用于更新权重的优化器。
  224. .. py:method:: generate_freeze_index_sequence(parameter_groups_number, freeze_strategy, freeze_p, total_steps)
  225. 生成梯度冻结每一步需要冻结的层数。
  226. **参数:**
  227. - **parameter_groups_number** (numbers.Number) – 梯度冻结训练的权重个数。
  228. - **freeze_strategy** (int) – 梯度冻结训练的策略。
  229. - **freeze_p** (float) – 梯度冻结训练的概率。
  230. - **total_steps** (numbers.Number) – 整个训练过程的总的步数。
  231. .. py:method:: split_parameters_groups(net, freeze_para_groups_number)
  232. 拆分用于梯度冻结训练的权重。
  233. **参数:**
  234. - **net** (Cell) – 训练网络。
  235. - **freeze_para_groups_number** (numbers.Number) – 梯度冻结训练的权重个数。
  236. .. py:class:: mindspore.boost.FreezeOpt(opt, train_parameter_groups=None, train_strategy=None)
  237. 支持梯度冻结训练的优化器。
  238. **参数:**
  239. - **opt** (Cell) – 非冻结优化器实例,如*Momentum*,*SGD*。
  240. - **train_parameter_groups** (Union[tuple, list]) – 梯度冻结训练的权重。
  241. - **train_strategy** (Union[tuple(int), list(int), Tensor]) – 梯度冻结训练的策略。
  242. .. py:function:: freeze_cell(reducer_flag, network, optimizer, sens, grad, use_grad_accumulation, mean=None, degree=None, max_accumulation_step=1)
  243. 提供带梯度冻结的网络Cell。
  244. **参数:**
  245. - **reducer_flag** (bool): 是否多卡训练的标志位。
  246. - **network** (Cell): 训练网络。
  247. - **optimizer** (Cell): 优化器。
  248. - **sens** (numbers.Number): 损失缩放系数。
  249. - **grad** (tuple(Tensor)): 网络梯度。
  250. - **use_grad_accumulation** (bool): 是否使用梯度累积。
  251. - **mean** (bool): 梯度是否求平均。默认值为None。
  252. - **degree** (int): device卡数。默认值为None。
  253. - **max_accumulation_step** (int): 梯度累积步数。默认值为1。
  254. .. py:class:: mindspore.boost.GradientAccumulation(max_accumulation_step, optimizer)
  255. 梯度累积算法,在累积多个step的梯度之后,再用来更新网络权重,可以提高训练效率。
  256. **参数:**
  257. - **max_accumulation_step** (int) – 累积梯度的步数。
  258. - **optimizer** (Cell) – 网络训练使用的优化器。
  259. .. py:class:: mindspore.boost.AdaSum(rank, device_number, group_number, parameter_tuple)
  260. Adaptive Summation(AdaSum)是一种优化深度学习模型并行训练的算法,它可以提升不同规模集群训练的精度,减小不同规模集群调参难度。
  261. **参数:**
  262. - **rank** (int) – 总的训练的卡数。
  263. - **device_number** (int) – 单机的卡数。
  264. - **group_number** (int) – 分组的数量。
  265. - **parameter_tuple** (Tuple(Parameter)) – 网络训练权重组成的元组。
  266. **输入:**
  267. - **delta_weights** (Tuple(Tensor)) – 梯度tuple。
  268. - **parameters** (Tuple(Parameter)) – 当前权重组成的元组。
  269. - **old_parameters** (Tuple(Parameter)) – 旧的权重组成的元组。
  270. **输出:**
  271. - **adasum_parameters** (Tuple(Tensor)) - adasum处理后更新的权重。
  272. .. py:class:: mindspore.boost.DimReduce(network, optimizer, weight, pca_mat_local, n_components, rho, gamma, alpha, sigma, rank, rank_size)
  273. 降维训练(dimension reduce training)是一种优化深度学习模型训练的算法,它可以加速模型的收敛。
  274. 算法主要原理:
  275. .. math::
  276. \begin{align}
  277. grad\_k &= pca\_mat \cdot grad\\
  278. dk &= - bk \cdot grad\_k\\
  279. sk &= rho ^ m \cdot dk\\
  280. delta\_loss &= sigma \cdot grad\_k.T \cdot sk
  281. \end{align}
  282. 其中:
  283. - pca_mat (array): 维度(k*n),k是n_components的大小,n是权重的大小。
  284. - bk (array): 维度(k*k),bk是拟牛顿法中的对称正定矩阵。
  285. 我们需要找到满足以下条件的m:
  286. .. math::
  287. new\_loss < old\_loss + delta\_loss
  288. 然后使用delta_grad去更新模型的权重:
  289. .. math::
  290. \begin{align}
  291. grad\_k\_proj &= pca\_mat.T \cdot grad\_k\\
  292. new\_grad\_momentum &= gamma \cdot old\_grad\_momentum + grad - grad\_k\_proj\\
  293. delta\_grad &= alpha \cdot new\_grad\_momentum - pca\_mat.T \cdot sk
  294. \end{align}
  295. **参数:**
  296. - **network** (Cell) - 训练网络,只支持单输出。
  297. - **optimizer** (Union[Cell]) - 更新权重的优化器。
  298. - **weight** (Tuple(Parameter)) - 网络权重组成的元组。
  299. - **pca_mat_local** (numpy.ndarray) - 用于PCA操作的,经过切分的PCA转换矩阵,维度为k*n,k是切分的n_components的大小,n是权重的大小。
  300. - **n_components** (int) - PCA的主成分维度(components)。
  301. - **rho** (float) - 超参。
  302. - **gamma** (float) - 超参。
  303. - **alpha** (float) - 超参。
  304. - **sigma** (float) - 超参。
  305. - **rank** (int) - Rank编号。
  306. - **rank_size** (int) - Rank总数。
  307. **输入:**
  308. - **loss** (Tensor) - 标量Tensor。
  309. - **old_grad** (Tuple(Tensor)) - 网络权重提取组成的元组。
  310. - **weight** (Tuple(Tensor)) - 网络权重组成的元组。
  311. - **weight_clone** (Tuple(Tensor)) - 网络权重的副本。
  312. - **(\*inputs)** (Tuple(Tensor)) - 网络的所有输入组成的元组。
  313. **输出:**
  314. - **loss** (Tensor) - 标量Tensor。
  315. .. automodule:: mindspore.boost
  316. :members: