Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Doc] Refine chinese doc #516

Merged
merged 6 commits into from
Oct 21, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
26 changes: 13 additions & 13 deletions docs/zh_cn/migration/param_scheduler.md
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand Down Expand Up @@ -52,7 +52,7 @@ param_scheduler = [
</thead>
</table>

#### 线性预热('linear')
#### 线性预热(linear)

<table class="docutils">
<thead>
Expand Down Expand Up @@ -91,7 +91,7 @@ param_scheduler = [
</thead>
</table>

#### 指数预热('exp')
#### 指数预热(exp)

<table class="docutils">
<thead>
Expand Down Expand Up @@ -130,7 +130,7 @@ param_scheduler = [
</thead>
</table>

### 'fixed' 学习率(FixedLrUpdaterHook)迁移
### fixed 学习率(FixedLrUpdaterHook)迁移

<table class="docutils">
<thead>
Expand Down Expand Up @@ -159,7 +159,7 @@ param_scheduler = [
</thead>
</table>

### 'step' 学习率(StepLrUpdaterHook)迁移
### step 学习率(StepLrUpdaterHook)迁移

<table class="docutils">
<thead>
Expand Down Expand Up @@ -196,7 +196,7 @@ param_scheduler = [
</thead>
</table>

### 'poly' 学习率(PolyLrUpdaterHook)迁移
### poly 学习率(PolyLrUpdaterHook)迁移

<table class="docutils">
<thead>
Expand Down Expand Up @@ -235,7 +235,7 @@ param_scheduler = [
</thead>
</table>

### 'exp' 学习率(ExpLrUpdaterHook)迁移
### exp 学习率(ExpLrUpdaterHook)迁移

<table class="docutils">
<thead>
Expand Down Expand Up @@ -272,7 +272,7 @@ param_scheduler = [
</thead>
</table>

### 'CosineAnnealing' 学习率(CosineAnnealingLrUpdaterHook)迁移
### CosineAnnealing 学习率(CosineAnnealingLrUpdaterHook)迁移

<table class="docutils">
<thead>
Expand Down Expand Up @@ -310,7 +310,7 @@ param_scheduler = [
</thead>
</table>

### 'FlatCosineAnnealing' 学习率(FlatCosineAnnealingLrUpdaterHook)迁移
### FlatCosineAnnealing 学习率(FlatCosineAnnealingLrUpdaterHook)迁移

像 FlatCosineAnnealing 这种由多个学习率策略拼接而成的学习率,原本需要重写 Hook 来实现,而在 MMEngine 中只需将两个参数调度器组合即可

Expand Down Expand Up @@ -352,7 +352,7 @@ param_scheduler = [
</thead>
</table>

### 'CosineRestart' 学习率(CosineRestartLrUpdaterHook)迁移
### CosineRestart 学习率(CosineRestartLrUpdaterHook)迁移

<table class="docutils">
<thead>
Expand Down Expand Up @@ -389,7 +389,7 @@ param_scheduler = [
</thead>
</table>

### 'OneCycle' 学习率(OneCycleLrUpdaterHook)迁移
### OneCycle 学习率(OneCycleLrUpdaterHook)迁移

<table class="docutils">
<thead>
Expand Down Expand Up @@ -436,7 +436,7 @@ param_scheduler = [

需要注意的是 `by_epoch` 参数 MMCV 默认是 `False`, MMEngine 默认是 `True`

### 'LinearAnnealing' 学习率(LinearAnnealingLrUpdaterHook)迁移
### LinearAnnealing 学习率(LinearAnnealingLrUpdaterHook)迁移

<table class="docutils">
<thead>
Expand Down
12 changes: 6 additions & 6 deletions docs/zh_cn/tutorials/model.md
Original file line number Diff line number Diff line change
Expand Up @@ -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`。
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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` 的入参相匹配。
```
6 changes: 3 additions & 3 deletions docs/zh_cn/tutorials/param_scheduler.md
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
# 优化器参数调整策略(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
Expand All @@ -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` 来控制参数调度器的执行。

Expand Down