add resnet_thor readme of cn

This commit is contained in:
wangmin 2020-11-19 16:37:17 +08:00
parent f827c18f1d
commit 7d1194f406
1 changed files with 255 additions and 0 deletions

View File

@ -0,0 +1,255 @@
# ResNet-50-THOR 示例
<!-- TOC -->
- [ResNet-50-THOR 示例](#resnet-50-thor-示例)
- [概述](#概述)
- [模型架构](#模型架构)
- [数据集](#数据集)
- [特性](#特性)
- [环境要求](#环境要求)
- [快速入门](#快速入门)
<!-- /TOC -->
## 概述
本文举例说明了如何用二阶优化器THOR及ImageNet2012数据集训练ResNet-50 V1.5网络。THOR是MindSpore中一种近似二阶优化、迭代更少的新方法。THOR采用8卡Ascend 910能在72分钟内达到75.9%的top-1准确率完成ResNet-50 V1.5训练远高于使用SGD+Momentum算法。
## 模型架构
ResNet-50的总体网络架构如下[链接](https://arxiv.org/pdf/1512.03385.pdf)
## 数据集
使用的数据集ImageNet2012
- 数据集大小共1000个类的224*224彩色图像
- 训练集1,281,167张图像
- 测试集5万张图像
- 数据格式JPEG
- 注数据在dataset.py中处理。
- 下载数据集ImageNet2012。
> 解压ImageNet2012数据集到任意路径目录结构应包含训练数据集和验证数据集如下所示
> ```
> ├── ilsvrc # 训练数据集
> └── ilsvrc_eval # 验证数据集
> ```
## 特性
传统一阶优化算法如SGD计算量小但收敛速度慢迭代次数多。二阶优化算法利用目标函数的二阶导数加速收敛收敛速度更快迭代次数少。但是由于计算成本高二阶优化算法在深度神经网络训练中的应用并不普遍。二阶优化算法的主要计算成本在于二阶信息矩阵Hessian矩阵、Fisher信息矩阵等的求逆运算时间复杂度约为$O (n^3)$。在现有自然梯度算法的基础上通过近似和剪切Fisher信息矩阵以降低逆矩阵的计算复杂度实现了基于MindSpore的二阶优化器THOR。THOR使用8张Ascend 910芯片可在72分钟内完成ResNet50-v1.5+ImageNet的训练。
## 环境要求
- 硬件昇腾处理器Ascend或GPU
- 使用Ascend或GPU处理器搭建硬件环境。如需试用昇腾处理器请发送[申请表](https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/file/other/Ascend%20Model%20Zoo%E4%BD%93%E9%AA%8C%E8%B5%84%E6%BA%90%E7%94%B3%E8%AF%B7%E8%A1%A8.docx)
至ascend@huawei.com审核通过即可获得资源。
- 框架
- [MindSpore](https://www.mindspore.cn/install)
- 如需查看详情,请参见如下资源:
- [MindSpore教程](https://www.mindspore.cn/tutorial/training/zh-CN/master/index.html)
- [MindSpore Python API](https://www.mindspore.cn/doc/api_python/zh-CN/master/index.html)
## 快速入门
通过官方网站安装MindSpore后您可以按照如下步骤进行训练和验证
- Ascend处理器环境运行
```python
# 分布式训练运行示例
sh run_distribute_train.sh [RANK_TABLE_FILE] [DATASET_PATH] [DEVICE_NUM]
# 推理运行示例
sh run_eval.sh [DATASET_PATH] [CHECKPOINT_PATH]
```
> 对于分布式训练需要提前创建JSON格式的HCCL配置文件。关于配置文件可以参考[HCCL_TOOL](https://gitee.com/mindspore/mindspore/tree/master/model_zoo/utils/hccl_tools)
- GPU处理器环境运行
```python
# 分布式训练运行示例
sh run_distribute_train_gpu.sh [DATASET_PATH] [DEVICE_NUM]
# 推理运行示例
sh run_eval_gpu.sh [DATASET_PATH] [CHECKPOINT_PATH]
```
## 脚本说明
### 脚本代码结构
```shell
└── resnet_thor
├── README.md # resnet_thor相关描述
├── scripts
│ ├── run_distribute_train.sh # 启动Ascend分布式训练
│ └── run_eval.sh # 启动Ascend推理
│ ├── run_distribute_train_gpu.sh # 启动GPU分布式训练
│ └── run_eval_gpu.sh # 启动GPU推理
├──src
│ ├── crossentropy.py # 交叉熵损失函数
│ ├── config.py # 参数配置
│ ├── dataset_helper.py # minddata数据脚本
│ ├── grad_reducer_thor.py # Thor的梯度reducer
│ ├── model_thor.py # model脚本
│ ├── resnet_thor.py # resnet50模型
│ ├── thor.py # Thor优化器
│ ├── thor_layer.py # Thor层
│ └── dataset.py # 数据预处理
├── eval.py # 推理脚本
├── train.py # 训练脚本
├── export.py # 将checkpoint文件导出为AIR文件
└── mindspore_hub_conf.py # MinSpore Hub仓库的配置文件
```
### 脚本参数
在config.py中可以同时配置训练和推理参数。
- Ascend 910参数说明
```
"class_num"1001, # 数据集类数
"batch_size"32, # 输入张量的批次大小只支持32
"loss_scale"128, # loss_scale缩放系数
"momentum": 0.9, # THOR优化器中动量
"weight_decay": 5e-4, # 权重衰减系数
"epoch_size"45, # 此值仅适用于训练应用于推理时固定为1
"save_checkpoint": True, # 是否保存checkpoint
"save_checkpoint_epochs": 1, # 两个checkpoint之间的轮次间隔默认情况下每个epoch都会保存checkpoint
"keep_checkpoint_max": 15, # 只保留最后的keep_checkpoint_max个checkpoint文件
"save_checkpoint_path": "./", # checkpoint文件的保存路径
"use_label_smooth": True, # 是否使用label smooth
"label_smooth_factor": 0.1, # label smooth系数
"lr_init": 0.045, # 初始学习率
"lr_decay": 6,# 学习率衰减值
"lr_end_epoch"70, # 学习速率结束epoch值
"damping_init"0.03, # 初始Fisher信息矩阵阻尼
"damping_decay": 0.87, # 阻尼衰减率
"frequency": 834, # 更新二阶信息矩阵的步长间隔应为每个epoch step数的除数
```
- GPU参数
```
"class_num"1001, # 数据集类数
"batch_size"32, # 输入张量的批次大小
"loss_scale"128, # loss缩放系数
"momentum": 0.9, # THOR优化器中momentum
"weight_decay": 5e-4, # 权重衰减
"epoch_size"40, # 只对训练有效推理固定值为1
"save_checkpoint": True, # 是否保存checkpoint
"save_checkpoint_epochs": 1, # 两个checkpoint之间的轮次间隔默认情况下每个epoch都会保存checkpoint
"keep_checkpoint_max": 15, # 只保留最后的keep_checkpoint_max个checkpoint文件
"save_checkpoint_path": "./", # checkpoint文件的保存路径
"use_label_smooth": True, # 是否使用label smooth
"label_smooth_factor": 0.1, # label smooth系数
"lr_init": 0.05672, # 学习速率初始值
"lr_decay"4.9687,# 学习速率衰减率值
"lr_end_epoch"50, # 学习速率结束epoch值
"damping_init"0.02345,# Fisher信息矩阵阻尼初始值
"damping_decay": 0.5467, # 阻尼衰减率
"frequency": 834, # 更新二阶信息矩阵的步长间隔应为每epoch step数的除数
```
> 由于算子的限制目前Ascend中batch size只支持32。二阶信息矩阵的更新频率必须设置为每个epoch的step数的除数例如834是5004的除数。总之由于框架和算子的局限性我们的算法在设置这些参数时并不十分灵活。但后续版本会解决这些问题。
### 训练过程
#### Ascend 910
```
sh run_distribute_train.sh [RANK_TABLE_FILE] [DATASET_PATH] [DEVICE_NUM]
```
此脚本需设置三个参数:
- `RANK_TABLE_FILE`rank_table.json文件路径
- `DATASET_PATH`:训练数据集的路径
- `DEVICE_NUM`:分布式训练的设备号
训练结果保存在当前路径下文件夹名称以“train_parallel”开头。您可在日志中找到checkpoint文件以及结果如下所示。
```
...
epoch1 step5004loss is 4.4182425
epoch2 step: 5004loss is 3.740064
epoch3 step: 5004loss is 4.0546017
epoch4 step: 5004loss is 3.7598825
epoch5 step: 5004loss is 3.3744206
......
epoch40 step: 5004loss is 1.6907625
epoch41 step: 5004loss is 1.8217756
epoch42 step: 5004loss is 1.6453942
...
```
#### GPU
```
sh run_distribute_train_gpu.sh [DATASET_PATH] [DEVICE_NUM]
```
训练结果保存在当前路径下文件夹名称以“train_parallel”开头。您可在日志中找到checkpoint文件以及结果如下所示。
```
...
epoch 1 step: 5004loss is 4.2546034
epoch 2 step: 5004loss is 4.0819564
epoch 3 step: 5004loss is 3.7005644
epoch 4 step: 5004loss is 3.2668946
epoch 5 step: 5004loss is 3.023509
......
epoch 36 step: 5004loss is 1.645802
...
```
### 推理过程
在运行以下命令之前请检查用于推理的checkpoint路径。请将checkpoint路径设置为绝对路径如`username/resnet_thor/train_parallel0/resnet-42_5004.ckpt`。
#### Ascend 910
```
sh run_eval.sh [DATASET_PATH] [CHECKPOINT_PATH]
```
此脚本需设置两个参数:
- `DATASET_PATH`:验证数据集的路径。
- `CHECKPOINT_PATH`checkpoint文件的绝对路径。
> 训练过程中可以生成checkpoint。
推理结果保存在示例路径,文件夹名为`eval`。您可在日志中找到如下结果。
```
result: {'top_5_accuracy': 0.9295574583866837, 'top_1_accuracy': 0.761443661971831} ckpt=train_parallel0/resnet-42_5004.ckpt
```
#### GPU
```
sh run_eval_gpu.sh [DATASET_PATH] [CHECKPOINT_PATH]
```
推理结果保存在示例路径,文件夹名为`eval`。您可在日志中找到如下结果。
```
result: {'top_5_accuracy': 0.9287972151088348, 'top_1_accuracy': 0.7597031049935979} ckpt=train_parallel/resnet-36_5004.ckpt
```
## 型号说明
### 评估性能
| 参数 | Ascend 910 | GPU |
| -------------------------- | -------------------------------------- | ---------------------------------- |
| 模型版本 | ResNet50-v1.5 | ResNet50-v1.5 |
| 资源 | Ascend 910-CPU 2.60GHz 192核-内存755G | GPU(Tesla V100 SXM2)-CPU 2.1GHz 24核-内存128G |
| 上传日期 | 2020-06-01 | 2020-09-23 |
| MindSpore版本 | 0.3.0-alpha | 1.0.0|
| 数据集 | ImageNet2012 | ImageNet2012 |
| 训练参数 | epoch=45, steps per epoch=5004, batch_size = 32 |epoch=40, steps per epoch=5004, batch_size = 32 |
| 优化器 |THOR|THOR |
| 损耗函数 | Softmax交叉熵 | Softmax交叉熵 |
| 输出 | 概率 | 概率 |
| loss | 1.6453942 | 1.645802 |
| Speed | 20.4毫秒/步8卡 | 76毫秒/步8卡 |
| 总时间按75.9%计算) | 72分钟 | 229分钟 |
| 参数(M) | 25.5 |25.5 |
| checkpoint | 491M.ckpt file | 380M.ckpt file |
| 脚本 |[链接](https://gitee.com/mindspore/mindspore/tree/master/model_zoo/official/cv/resnet_thor) |[链接](https://gitee.com/mindspore/mindspore/tree/master/model_zoo/official/cv/resnet_thor) |
## 随机情况说明
在dataset.py中我们设置了“create_dataset”函数内的种子。我们还在train.py中使用随机种子。
## ModelZoo首页
请查看官方[主页](https://gitee.com/mindspore/mindspore/tree/master/model_zoo)