|
|
|
@@ -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) |
|
|
|
。 |
|
|
|
|