diff --git a/model_zoo/official/cv/resnet_thor/README_CN.md b/model_zoo/official/cv/resnet_thor/README_CN.md new file mode 100644 index 00000000000..6c49c734375 --- /dev/null +++ b/model_zoo/official/cv/resnet_thor/README_CN.md @@ -0,0 +1,255 @@ +# ResNet-50-THOR 示例 + + +- [ResNet-50-THOR 示例](#resnet-50-thor-示例) + - [概述](#概述) + - [模型架构](#模型架构) + - [数据集](#数据集) + - [特性](#特性) + - [环境要求](#环境要求) + - [快速入门](#快速入门) + + + +## 概述 + +本文举例说明了如何用二阶优化器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) + 。 +