提交 84eb98a6 编写于 作者: M mindspore-ci-bot 提交者: Gitee

!78 modify resnet50 cloud docs

Merge pull request !78 from wangnan39/modify_resnet50_in_cloud_docs
...@@ -11,9 +11,9 @@ ...@@ -11,9 +11,9 @@
- [数据准备](#数据准备) - [数据准备](#数据准备)
- [执行脚本准备](#执行脚本准备) - [执行脚本准备](#执行脚本准备)
- [通过简单适配将MindSpore脚本运行在ModelArts](#通过简单适配将mindspore脚本运行在modelarts) - [通过简单适配将MindSpore脚本运行在ModelArts](#通过简单适配将mindspore脚本运行在modelarts)
- [脚本参数](#脚本参数) - [适配脚本参数](#适配脚本参数)
- [适配OBS数据](#适配obs数据) - [适配OBS数据](#适配obs数据)
- [获取环境变量](#获取环境变量) - [适配8卡训练任务](#适配8卡训练任务)
- [示例代码](#示例代码) - [示例代码](#示例代码)
- [创建训练任务](#创建训练任务) - [创建训练任务](#创建训练任务)
- [进入ModelArts控制台](#进入modelarts控制台) - [进入ModelArts控制台](#进入modelarts控制台)
...@@ -25,12 +25,12 @@ ...@@ -25,12 +25,12 @@
## 概述 ## 概述
ModelArts是华为云提供的面向开发者的一站式AI开发平台,集成了昇腾AI处理器资源池,用户可以在该平台下体验MindSpore。在ModelArts上使用MindSpore 0.1.0-alpha版本的训练性能如下表所示。 ModelArts是华为云提供的面向开发者的一站式AI开发平台,集成了昇腾AI处理器资源池,用户可以在该平台下体验MindSpore。在ModelArts上使用MindSpore 0.2.0-alpha版本的训练性能如下表所示。
| 模型 | 数据集 | MindSpore版本 | 资源 | 处理速度(images/sec) | | 模型 | 数据集 | MindSpore版本 | 资源 | 处理速度(images/sec) |
| --- | --- | --- | --- | --- | | --- | --- | --- | --- | --- |
| ResNet-50 v1.5 | CIFAR-10 | 0.1.0-alpha | Ascend: 1 * Ascend 910 </br> CPU:24 核 96GiB | 1,611.1 | | ResNet-50 v1.5 | CIFAR-10 | 0.2.0-alpha | Ascend: 1 * Ascend 910 </br> CPU:24 核 96GiB | 1,759.0 |
| ResNet-50 v1.5 | CIFAR-10 | 0.1.0-alpha | Ascend: 8 * Ascend 910 </br> CPU:192 核 768GiB | 12,245.7 | | ResNet-50 v1.5 | CIFAR-10 | 0.2.0-alpha | Ascend: 8 * Ascend 910 </br> CPU:192 核 768GiB | 13,391.6 |
本教程以ResNet-50为例,简要介绍如何在ModelArts使用MindSpore完成训练任务。 本教程以ResNet-50为例,简要介绍如何在ModelArts使用MindSpore完成训练任务。
...@@ -87,11 +87,11 @@ ModelArts使用对象存储服务(Object Storage Service,简称OBS)进行 ...@@ -87,11 +87,11 @@ ModelArts使用对象存储服务(Object Storage Service,简称OBS)进行
## 通过简单适配将MindSpore脚本运行在ModelArts ## 通过简单适配将MindSpore脚本运行在ModelArts
如果需要将自定义MindSpore脚本或更多MindSpore示例代码在ModelArts运行起来,可以参考本章节对MindSpore代码进行简单适配。想要快速体验ResNet-50训练CIFAR-10可以跳过本章节 “执行脚本准备”章节提供的脚本可以直接运行在ModelArts,想要快速体验ResNet-50训练CIFAR-10可以跳过本章节。如果需要将自定义MindSpore脚本或更多MindSpore示例代码在ModelArts运行起来,需要参考本章节对MindSpore代码进行简单适配
### 脚本参数 ### 适配脚本参数
1. 两个固定参数 1. 在ModelArts运行的脚本必须配置`data_url``train_url`,分别对应数据存储路径(OBS路径)和训练输出路径(OBS路径)。
``` python ``` python
import parser import parser
...@@ -100,7 +100,6 @@ ModelArts使用对象存储服务(Object Storage Service,简称OBS)进行 ...@@ -100,7 +100,6 @@ ModelArts使用对象存储服务(Object Storage Service,简称OBS)进行
parser.add_argument('--data_url', required=True, default=None, help='Location of data.') parser.add_argument('--data_url', required=True, default=None, help='Location of data.')
parser.add_argument('--train_url', required=True, default=None, help='Location of training outputs.') parser.add_argument('--train_url', required=True, default=None, help='Location of training outputs.')
``` ```
`data_url`和`train_url`是在ModelArts执行训练任务时两个必传参数,分别对应数据存储路径(OBS路径)和训练输出路径(OBS路径)。
2. ModelArts界面支持向脚本中其他参数传值,在下一章节“创建训练作业”中将会详细介绍。 2. ModelArts界面支持向脚本中其他参数传值,在下一章节“创建训练作业”中将会详细介绍。
...@@ -127,11 +126,25 @@ MindSpore暂时没有提供直接访问OBS数据的接口,需要通过MoXing ...@@ -127,11 +126,25 @@ MindSpore暂时没有提供直接访问OBS数据的接口,需要通过MoXing
mox.file.copy_parallel(src_url='/cache/output_path', dst_url='s3://output_url/') mox.file.copy_parallel(src_url='/cache/output_path', dst_url='s3://output_url/')
``` ```
### 获取环境变量 ### 适配8卡训练任务
如果需要将脚本运行在`8*Ascend`规格的环境上,需要对创建数据集的代码和本地数据路径进行适配,并配置分布式策略。通过获取`DEVICE_ID``RANK_SIZE`两个环境变量,用户可以构建适用于`1*Ascend``8*Ascend`两种不同规格的训练脚本。
MindSpore创建数据集和配置分布式策略与运行环境有关,通过获取`DEVICE_ID``RANK_SIZE`两个环境变量,用户可以构建适用于`1*Ascend``8*Ascend`两种不同规格的训练脚本 1. 本地路径适配
1. 创建数据集。 ```python
import os
device_num = int(os.getenv('RANK_SIZE'))
device_id = int(os.getenv('DEVICE_ID'))
# define local data path
local_data_path = '/cache/data'
if device_num > 1:
# define distributed local data path
local_data_path = os.path.join(local_data_path, str(device_id))
```
2. 数据集适配。
```python ```python
import os import os
...@@ -140,21 +153,20 @@ MindSpore创建数据集和配置分布式策略与运行环境有关,通过 ...@@ -140,21 +153,20 @@ MindSpore创建数据集和配置分布式策略与运行环境有关,通过
device_id = int(os.getenv('DEVICE_ID')) device_id = int(os.getenv('DEVICE_ID'))
device_num = int(os.getenv('RANK_SIZE')) device_num = int(os.getenv('RANK_SIZE'))
if device_num == 1: if device_num == 1:
ds = de.Cifar10Dataset(dataset_path, num_parallel_workers=4, shuffle=True) # create train data for 1 Ascend situation
ds = de.Cifar10Dataset(dataset_path, num_parallel_workers=8, shuffle=True)
else: else:
# split train data for 8 Ascend situation # create train data for 1 Ascend situation, split train data for 8 Ascend situation
ds = de.Cifar10Dataset(dataset_path, num_parallel_workers=4, shuffle=True, ds = de.Cifar10Dataset(dataset_path, num_parallel_workers=8, shuffle=True,
num_shards=device_num, shard_id=device_id) num_shards=device_num, shard_id=device_id)
``` ```
2. 配置分布式策略。 3. 配置分布式策略。
```python ```python
import os import os
device_id = int(os.getenv('DEVICE_ID'))
device_num = int(os.getenv('RANK_SIZE')) device_num = int(os.getenv('RANK_SIZE'))
context.set_context(mode=context.GRAPH_MODE)
if device_num > 1: if device_num > 1:
context.set_auto_parallel_context(device_num=device_num, context.set_auto_parallel_context(device_num=device_num,
parallel_mode=ParallelMode.DATA_PARALLEL, parallel_mode=ParallelMode.DATA_PARALLEL,
...@@ -178,17 +190,13 @@ device_num = int(os.getenv('RANK_SIZE')) ...@@ -178,17 +190,13 @@ device_num = int(os.getenv('RANK_SIZE'))
def create_dataset(dataset_path): def create_dataset(dataset_path):
if device_num == 1: if device_num == 1:
ds = de.Cifar10Dataset(dataset_path, num_parallel_workers=4, shuffle=True) ds = de.Cifar10Dataset(dataset_path, num_parallel_workers=8, shuffle=True)
else: else:
ds = de.Cifar10Dataset(dataset_path, num_parallel_workers=4, shuffle=True, ds = de.Cifar10Dataset(dataset_path, num_parallel_workers=8, shuffle=True,
num_shards=device_num, shard_id=device_id) num_shards=device_num, shard_id=device_id)
return ds return ds
def resnet50_train(args_opt): def resnet50_train(args_opt):
epoch_size = args_opt.epoch_size
local_data_path = args_opt.local_data_path
context.set_context(mode=context.GRAPH_MODE)
if device_num > 1: if device_num > 1:
context.set_auto_parallel_context(device_num=device_num, context.set_auto_parallel_context(device_num=device_num,
parallel_mode=ParallelMode.DATA_PARALLEL, parallel_mode=ParallelMode.DATA_PARALLEL,
...@@ -220,9 +228,9 @@ device_num = int(os.getenv('RANK_SIZE')) ...@@ -220,9 +228,9 @@ device_num = int(os.getenv('RANK_SIZE'))
def create_dataset(dataset_path): def create_dataset(dataset_path):
if device_num == 1: if device_num == 1:
ds = de.Cifar10Dataset(dataset_path, num_parallel_workers=4, shuffle=True) ds = de.Cifar10Dataset(dataset_path, num_parallel_workers=8, shuffle=True)
else: else:
ds = de.Cifar10Dataset(dataset_path, num_parallel_workers=4, shuffle=True, ds = de.Cifar10Dataset(dataset_path, num_parallel_workers=8, shuffle=True,
num_shards=device_num, shard_id=device_id) num_shards=device_num, shard_id=device_id)
return ds return ds
...@@ -258,6 +266,7 @@ if __name__ == '__main__': ...@@ -258,6 +266,7 @@ if __name__ == '__main__':
## 创建训练任务 ## 创建训练任务
准备好数据和执行脚本以后,需要创建训练任务将MindSpore脚本真正运行起来。首次使用ModelArts的用户可以根据本章节了解ModelArts创建训练作业的流程。 准备好数据和执行脚本以后,需要创建训练任务将MindSpore脚本真正运行起来。首次使用ModelArts的用户可以根据本章节了解ModelArts创建训练作业的流程。
> 本章节以MindSpore 0.1.0-alpha版本为例。
### 进入ModelArts控制台 ### 进入ModelArts控制台
......
...@@ -45,9 +45,9 @@ def create_dataset(dataset_path, do_train, repeat_num=1, batch_size=32): ...@@ -45,9 +45,9 @@ def create_dataset(dataset_path, do_train, repeat_num=1, batch_size=32):
do_shuffle = False do_shuffle = False
if device_num == 1 or not do_train: if device_num == 1 or not do_train:
ds = de.Cifar10Dataset(dataset_path, num_parallel_workers=4, shuffle=do_shuffle) ds = de.Cifar10Dataset(dataset_path, num_parallel_workers=8, shuffle=do_shuffle)
else: else:
ds = de.Cifar10Dataset(dataset_path, num_parallel_workers=4, shuffle=do_shuffle, ds = de.Cifar10Dataset(dataset_path, num_parallel_workers=8, shuffle=do_shuffle,
num_shards=device_num, shard_id=device_id) num_shards=device_num, shard_id=device_id)
resize_height = 224 resize_height = 224
...@@ -74,11 +74,8 @@ def create_dataset(dataset_path, do_train, repeat_num=1, batch_size=32): ...@@ -74,11 +74,8 @@ def create_dataset(dataset_path, do_train, repeat_num=1, batch_size=32):
type_cast_op = C2.TypeCast(mstype.int32) type_cast_op = C2.TypeCast(mstype.int32)
ds = ds.map(input_columns="label", operations=type_cast_op) ds = ds.map(input_columns="label", num_parallel_workers=8, operations=type_cast_op)
ds = ds.map(input_columns="image", operations=trans) ds = ds.map(input_columns="image", num_parallel_workers=8, operations=trans)
# apply shuffle operations
ds = ds.shuffle(buffer_size=buffer_size)
# apply batch operations # apply batch operations
ds = ds.batch(batch_size, drop_remainder=True) ds = ds.batch(batch_size, drop_remainder=True)
......
...@@ -27,12 +27,14 @@ from mindspore.nn.loss import SoftmaxCrossEntropyWithLogits ...@@ -27,12 +27,14 @@ from mindspore.nn.loss import SoftmaxCrossEntropyWithLogits
from mindspore.train.model import Model, ParallelMode from mindspore.train.model import Model, ParallelMode
from mindspore.train.callback import Callback, LossMonitor from mindspore.train.callback import Callback, LossMonitor
from mindspore.train.loss_scale_manager import FixedLossScaleManager from mindspore.train.loss_scale_manager import FixedLossScaleManager
import mindspore.dataset.engine as de
from dataset import create_dataset, device_id, device_num from dataset import create_dataset, device_id, device_num
from mindspore.model_zoo.resnet import resnet50 from mindspore.model_zoo.resnet import resnet50
random.seed(1) random.seed(1)
np.random.seed(1) np.random.seed(1)
de.config.set_seed(1)
class PerformanceCallback(Callback): class PerformanceCallback(Callback):
...@@ -113,7 +115,10 @@ def resnet50_train(args_opt): ...@@ -113,7 +115,10 @@ def resnet50_train(args_opt):
local_data_path = '/cache/data' local_data_path = '/cache/data'
# set graph mode and parallel mode # set graph mode and parallel mode
context.set_context(mode=context.GRAPH_MODE) context.set_context(mode=context.GRAPH_MODE, device_target="Ascend", save_graphs=False)
context.set_context(enable_task_sink=True, device_id=device_id)
context.set_context(enable_loop_sink=True)
context.set_context(enable_mem_reuse=True)
if device_num > 1: if device_num > 1:
context.set_auto_parallel_context(device_num=device_num, context.set_auto_parallel_context(device_num=device_num,
parallel_mode=ParallelMode.DATA_PARALLEL, parallel_mode=ParallelMode.DATA_PARALLEL,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册