Skip to content
Snippets Groups Projects
Unverified Commit d312bc40 authored by Tau's avatar Tau Committed by GitHub
Browse files

[Doc] Refine chinese doc (#516)


* refine chinese doc

* remove  in title

* Update docs/zh_cn/tutorials/param_scheduler.md

* fix link

* remove files from building docs

Co-authored-by: default avatarZaida Zhou <58739961+zhouzaida@users.noreply.github.com>
Co-authored-by: default avatarzhouzaida <zhouzaida@163.com>
parent 29390688
No related branches found
No related tags found
No related merge requests found
......@@ -11,9 +11,9 @@ MMCV 中的学习率配置与 MMEngine 中的参数调度器配置对应关系
### 学习率预热(Warmup)迁移
由于 MMEngine 中的学习率调度器在实现时增加了 begin 和 end 参数,指定了调度器的生效区间,所以可以通过调度器组合的方式实现学习率预热。MMCV 中有 3 种学习率预热方式,分别是 'constant', 'linear', 'exp',在 MMEngine 中对应的配置应修改为:
由于 MMEngine 中的学习率调度器在实现时增加了 begin 和 end 参数,指定了调度器的生效区间,所以可以通过调度器组合的方式实现学习率预热。MMCV 中有 3 种学习率预热方式,分别是 `'constant'`, `'linear'`, `'exp'`,在 MMEngine 中对应的配置应修改为:
#### 常数预热('constant')
#### 常数预热(constant)
<table class="docutils">
<thead>
......@@ -52,7 +52,7 @@ param_scheduler = [
</thead>
</table>
#### 线性预热('linear')
#### 线性预热(linear)
<table class="docutils">
<thead>
......@@ -91,7 +91,7 @@ param_scheduler = [
</thead>
</table>
#### 指数预热('exp')
#### 指数预热(exp)
<table class="docutils">
<thead>
......@@ -130,7 +130,7 @@ param_scheduler = [
</thead>
</table>
### 'fixed' 学习率(FixedLrUpdaterHook)迁移
### fixed 学习率(FixedLrUpdaterHook)迁移
<table class="docutils">
<thead>
......@@ -159,7 +159,7 @@ param_scheduler = [
</thead>
</table>
### 'step' 学习率(StepLrUpdaterHook)迁移
### step 学习率(StepLrUpdaterHook)迁移
<table class="docutils">
<thead>
......@@ -196,7 +196,7 @@ param_scheduler = [
</thead>
</table>
### 'poly' 学习率(PolyLrUpdaterHook)迁移
### poly 学习率(PolyLrUpdaterHook)迁移
<table class="docutils">
<thead>
......@@ -235,7 +235,7 @@ param_scheduler = [
</thead>
</table>
### 'exp' 学习率(ExpLrUpdaterHook)迁移
### exp 学习率(ExpLrUpdaterHook)迁移
<table class="docutils">
<thead>
......@@ -272,7 +272,7 @@ param_scheduler = [
</thead>
</table>
### 'CosineAnnealing' 学习率(CosineAnnealingLrUpdaterHook)迁移
### CosineAnnealing 学习率(CosineAnnealingLrUpdaterHook)迁移
<table class="docutils">
<thead>
......@@ -310,7 +310,7 @@ param_scheduler = [
</thead>
</table>
### 'FlatCosineAnnealing' 学习率(FlatCosineAnnealingLrUpdaterHook)迁移
### FlatCosineAnnealing 学习率(FlatCosineAnnealingLrUpdaterHook)迁移
像 FlatCosineAnnealing 这种由多个学习率策略拼接而成的学习率,原本需要重写 Hook 来实现,而在 MMEngine 中只需将两个参数调度器组合即可
......@@ -352,7 +352,7 @@ param_scheduler = [
</thead>
</table>
### 'CosineRestart' 学习率(CosineRestartLrUpdaterHook)迁移
### CosineRestart 学习率(CosineRestartLrUpdaterHook)迁移
<table class="docutils">
<thead>
......@@ -389,7 +389,7 @@ param_scheduler = [
</thead>
</table>
### 'OneCycle' 学习率(OneCycleLrUpdaterHook)迁移
### OneCycle 学习率(OneCycleLrUpdaterHook)迁移
<table class="docutils">
<thead>
......@@ -436,7 +436,7 @@ param_scheduler = [
需要注意的是 `by_epoch` 参数 MMCV 默认是 `False`, MMEngine 默认是 `True`
### 'LinearAnnealing' 学习率(LinearAnnealingLrUpdaterHook)迁移
### LinearAnnealing 学习率(LinearAnnealingLrUpdaterHook)迁移
<table class="docutils">
<thead>
......
......@@ -8,7 +8,7 @@
## 接口约定
[forward](mmengine.model.BaseModel.forward): `forward` 的入参需要和 [DataLoader](https://pytorch.org/tutorials/beginner/basics/data_tutorial.html) 的输出保持一致 (自定义[数据处理器](数据处理器(DataPreprocessor))除外),如果 `DataLoader` 返回元组类型的数据 `data``forward` 需要能够接受 `*data` 的解包后的参数;如果返回字典类型的数据 `data``forward` 需要能够接受 `**data` 解包后的参数。 `mode` 参数用于控制 forward 的返回结果:
[forward](mmengine.model.BaseModel.forward): `forward` 的入参需要和 [DataLoader](https://pytorch.org/tutorials/beginner/basics/data_tutorial.html) 的输出保持一致 (自定义[数据处理器](数据处理器(DataPreprocessor))除外),如果 `DataLoader` 返回元组类型的数据 `data``forward` 需要能够接受 `*data` 的解包后的参数;如果返回字典类型的数据 `data``forward` 需要能够接受 `**data` 解包后的参数。 `mode` 参数用于控制 forward 的返回结果:
- `mode='loss'``loss` 模式通常在训练阶段启用,并返回一个损失字典。损失字典的 key-value 分别为损失名和可微的 `torch.Tensor`。字典中记录的损失会被用于更新参数和记录日志。模型基类会在 `train_step` 方法中调用该模式的 `forward`
- `mode='predict'``predict` 模式通常在验证、测试阶段启用,并返回列表/元组形式的预测结果,预测结果需要和 [process](mmengine.evaluator.Evaluator) 接口的参数相匹配。OpenMMLab 系列算法对 `predict` 模式的输出有着更加严格的约定,需要输出列表形式的[数据元素](./data_element.md)。模型基类会在 `val_step``test_step` 方法中调用该模式的 `forward`
......@@ -106,13 +106,13 @@ runner.train()
相比于 [Pytorch 官方示例](https://pytorch.org/tutorials/beginner/basics/optimization_tutorial.html#),MMEngine 的代码更加简洁,记录的日志也更加丰富。
## 数据处理器(DataPreprocessor)
## 数据处理器(DataPreprocessor)
如果你的电脑配有 GPU(或其他能够加速训练的硬件,如 mps、ipu 等),并运行了上节的代码示例。你会发现 Pytorch 的示例是在 CPU 上运行的,而 MMEngine 的示例是在 GPU 上运行的。`MMEngine` 是在何时把数据和模型从 CPU 搬运到 GPU 的呢?
事实上,执行器会在构造阶段将模型搬运到指定设备,而数据则会在 `train_step``val_step``test_step` 中,被[基础数据处理器(BaseDataPreprocessor)](mmengine.model.BaseDataPreprocessor)搬运到指定设备,进一步将处理好的数据传给模型。数据处理器作为模型基类的一个属性,会在模型基类的构造过程中被实例化。
事实上,执行器会在构造阶段将模型搬运到指定设备,而数据则会在 `train_step``val_step``test_step` 中,被[基础数据处理器(BaseDataPreprocessor)](mmengine.model.BaseDataPreprocessor)搬运到指定设备,进一步将处理好的数据传给模型。数据处理器作为模型基类的一个属性,会在模型基类的构造过程中被实例化。
为了体现数据处理器起到的作用,我们仍然以[上一节](#接口约定)训练 FashionMNIST 为例, 实现了一个简易的数据处理器,用于搬运数据和归一化:
为了体现数据处理器起到的作用,我们仍然以[上一节](#接口约定)训练 FashionMNIST 为例, 实现了一个简易的数据处理器,用于搬运数据和归一化:
```python
from torch.optim import SGD
......@@ -162,9 +162,9 @@ model.test_step(data)
上例中,我们实现了 `BaseModel.train_step``BaseModel.val_step``BaseModel.test_step` 的简化版。数据经 `NormalizeDataPreprocessor.forward` 归一化处理,解包后传给 `NeuralNetwork.forward`,进一步返回损失或者预测结果。如果想实现自定义的参数优化或预测逻辑,可以自行实现 `train_step``val_step``test_step`,具体例子可以参考:[使用 MMEngine 训练生成对抗网络](../examples/train_a_gan.md)
```{note}
上例中数据处理器的 training 参数用于区分训练、测试阶段不同的批增强策略,`train_step` 会传入 `training=True`,`test_step` 和 `val_step` 则会传入 `trainig=Fasle`。
上例中数据处理器的 training 参数用于区分训练、测试阶段不同的批增强策略,`train_step` 会传入 `training=True`,`test_step` 和 `val_step` 则会传入 `trainig=Fasle`。
```
```{note}
通常情况下,我们要求 DataLoader 的 `data` 数据解包后(字典类型的被 **data 解包,元组列表类型被 *data 解包)能够直接传给模型的 `forward`。但是如果数据处理器修改了 data 的数据类型,则要求数据处理器的 `forward` 的返回值与模型 `forward` 的入参相匹配。
通常情况下,我们要求 DataLoader 的 `data` 数据解包后(字典类型的被 **data 解包,元组列表类型被 *data 解包)能够直接传给模型的 `forward`。但是如果数据处理器修改了 data 的数据类型,则要求数据处理器的 `forward` 的返回值与模型 `forward` 的入参相匹配。
```
# 优化器参数调整策略(Parameter Scheduler)
在模型训练过程中,我们往往不是采用固定的优化参数,例如学习率等,会随着训练轮数的增加进行调整。最简单常见的学习率调整策略就是阶梯式下降,例如每隔一段时间将学习率降低为原来的几分之一。PyTorch 中有学习率调度器 LRScheduler 来对各种不同的学习率调整方式进行抽象,但支持仍然比较有限,在 MMEngine 中,我们对其进行了拓展,实现了更通用的参数调度器 `mmengine.optim.scheduler`,可以对学习率、动量等优化器相关的参数进行调整,并且支持多个调度器进行组合,应用更复杂的调度策略。
在模型训练过程中,我们往往不是采用固定的优化参数,例如学习率等,会随着训练轮数的增加进行调整。最简单常见的学习率调整策略就是阶梯式下降,例如每隔一段时间将学习率降低为原来的几分之一。PyTorch 中有学习率调度器 LRScheduler 来对各种不同的学习率调整方式进行抽象,但支持仍然比较有限,在 MMEngine 中,我们对其进行了拓展,实现了更通用的[参数调度器](mmengine.optim._ParamScheduler),可以对学习率、动量等优化器相关的参数进行调整,并且支持多个调度器进行组合,应用更复杂的调度策略。
## 参数调度器的使用
这里我们先简单介绍一下如何使用 PyTorch 内置的学习率调度器来进行学习率的调整。下面是参考 [PyTorch 官方文档](https://pytorch.org/docs/stable/optim.html) 实现的一个例子,我们构造一个 ExponentialLR,并且在每个 epoch 结束后调用 `scheduler.step()`,实现了随 epoch 指数下降的学习率调整策略。
这里我们先简单介绍一下如何使用 PyTorch 内置的学习率调度器来进行学习率的调整。下面是参考 [PyTorch 官方文档](https://pytorch.org/docs/stable/optim.html) 实现的一个例子,我们构造一个 [ExponentialLR](mmengine.optim.ExponentialLR),并且在每个 epoch 结束后调用 `scheduler.step()`,实现了随 epoch 指数下降的学习率调整策略。
```python
import torch
......@@ -26,7 +26,7 @@ for epoch in range(10):
scheduler.step()
```
`mmengine.optim.scheduler` 中,我们支持大部分 PyTorch 中的学习率调度器,例如 `ExponentialLR``LinearLR``StepLR``MultiStepLR` 等,使用方式也基本一致,所有支持的调度器见[调度器接口文档](TODO)。同时增加了对动量的调整,在类名中将 `LR` 替换成 `Momentum` 即可,例如 `ExponentialMomentum``LinearMomentum`。更进一步地,我们实现了通用的参数调度器 ParamScheduler,用于调整优化器的中的其他参数,包括 weight_decay 等。这个特性可以很方便地配置一些新算法中复杂的调整策略。
MMEngine 中,我们支持大部分 PyTorch 中的学习率调度器,例如 `ExponentialLR``LinearLR``StepLR``MultiStepLR` 等,使用方式也基本一致,所有支持的调度器见[调度器接口文档](https://mmengine.readthedocs.io/zh_CN/latest/api/optim.html#scheduler)。同时增加了对动量的调整,在类名中将 `LR` 替换成 `Momentum` 即可,例如 `ExponentialMomentum``LinearMomentum`。更进一步地,我们实现了通用的参数调度器 ParamScheduler,用于调整优化器的中的其他参数,包括 weight_decay 等。这个特性可以很方便地配置一些新算法中复杂的调整策略。
和 PyTorch 文档中所给示例不同,MMEngine 中通常不需要手动来实现训练循环以及调用 `optimizer.step()`,而是在执行器(Runner)中对训练流程进行自动管理,同时通过 `ParamSchedulerHook` 来控制参数调度器的执行。
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment