forked from mindspore-Ecosystem/mindspore
add resnet_thor readme of cn
This commit is contained in:
parent
f827c18f1d
commit
7d1194f406
|
@ -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文件以及结果,如下所示。
|
||||||
|
|
||||||
|
```
|
||||||
|
...
|
||||||
|
epoch:1 step:5004,loss is 4.4182425
|
||||||
|
epoch:2 step: 5004,loss is 3.740064
|
||||||
|
epoch:3 step: 5004,loss is 4.0546017
|
||||||
|
epoch:4 step: 5004,loss is 3.7598825
|
||||||
|
epoch:5 step: 5004,loss is 3.3744206
|
||||||
|
......
|
||||||
|
epoch:40 step: 5004,loss is 1.6907625
|
||||||
|
epoch:41 step: 5004,loss is 1.8217756
|
||||||
|
epoch:42 step: 5004,loss is 1.6453942
|
||||||
|
...
|
||||||
|
```
|
||||||
|
#### GPU
|
||||||
|
```
|
||||||
|
sh run_distribute_train_gpu.sh [DATASET_PATH] [DEVICE_NUM]
|
||||||
|
```
|
||||||
|
训练结果保存在当前路径下,文件夹名称以“train_parallel”开头。您可在日志中找到checkpoint文件以及结果,如下所示。
|
||||||
|
```
|
||||||
|
...
|
||||||
|
epoch: 1 step: 5004,loss is 4.2546034
|
||||||
|
epoch: 2 step: 5004,loss is 4.0819564
|
||||||
|
epoch: 3 step: 5004,loss is 3.7005644
|
||||||
|
epoch: 4 step: 5004,loss is 3.2668946
|
||||||
|
epoch: 5 step: 5004,loss is 3.023509
|
||||||
|
......
|
||||||
|
epoch: 36 step: 5004,loss 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)
|
||||||
|
。
|
||||||
|
|
Loading…
Reference in New Issue