Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
MindSpore
docs
提交
84eb98a6
D
docs
项目概览
MindSpore
/
docs
通知
4
Star
2
Fork
2
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
docs
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
84eb98a6
编写于
4月 28, 2020
作者:
M
mindspore-ci-bot
提交者:
Gitee
4月 28, 2020
浏览文件
操作
浏览文件
下载
差异文件
!78 modify resnet50 cloud docs
Merge pull request !78 from wangnan39/modify_resnet50_in_cloud_docs
上级
8dc08095
68cb52dd
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
50 addition
and
39 deletion
+50
-39
tutorials/source_zh_cn/advanced_use/use_on_the_cloud.md
tutorials/source_zh_cn/advanced_use/use_on_the_cloud.md
+40
-31
tutorials/tutorial_code/sample_for_cloud/dataset.py
tutorials/tutorial_code/sample_for_cloud/dataset.py
+4
-7
tutorials/tutorial_code/sample_for_cloud/resnet50_train.py
tutorials/tutorial_code/sample_for_cloud/resnet50_train.py
+6
-1
未找到文件。
tutorials/source_zh_cn/advanced_use/use_on_the_cloud.md
浏览文件 @
84eb98a6
...
...
@@ -11,9 +11,9 @@
-
[
数据准备
](
#数据准备
)
-
[
执行脚本准备
](
#执行脚本准备
)
-
[
通过简单适配将MindSpore脚本运行在ModelArts
](
#通过简单适配将mindspore脚本运行在modelarts
)
-
[
脚本参数
](
#
脚本参数
)
-
[
适配脚本参数
](
#适配
脚本参数
)
-
[
适配OBS数据
](
#适配obs数据
)
-
[
获取环境变量
](
#获取环境变量
)
-
[
适配8卡训练任务
](
#适配8卡训练任务
)
-
[
示例代码
](
#示例代码
)
-
[
创建训练任务
](
#创建训练任务
)
-
[
进入ModelArts控制台
](
#进入modelarts控制台
)
...
...
@@ -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) |
| --- | --- | --- | --- | --- |
| 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.
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: 1
*
Ascend 910
</br>
CPU:24 核 96GiB | 1,759.0
|
| 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完成训练任务。
...
...
@@ -87,11 +87,11 @@ ModelArts使用对象存储服务(Object Storage Service,简称OBS)进行
## 通过简单适配将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
import parser
...
...
@@ -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('--train_url', required=True, default=None, help='Location of training outputs.')
```
`data_url`和`train_url`是在ModelArts执行训练任务时两个必传参数,分别对应数据存储路径(OBS路径)和训练输出路径(OBS路径)。
2.
ModelArts界面支持向脚本中其他参数传值,在下一章节“创建训练作业”中将会详细介绍。
...
...
@@ -127,11 +126,25 @@ MindSpore暂时没有提供直接访问OBS数据的接口,需要通过MoXing
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
import os
...
...
@@ -140,25 +153,24 @@ MindSpore创建数据集和配置分布式策略与运行环境有关,通过
device_id = int(os.getenv('DEVICE_ID'))
device_num = int(os.getenv('RANK_SIZE'))
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:
# split train data for 8 Ascend situation
ds = de.Cifar10Dataset(dataset_path, num_parallel_workers=
4
, shuffle=True,
num_shards=device_num, shard_id=device_id)
#
create train data for 1 Ascend situation,
split train data for 8 Ascend situation
ds = de.Cifar10Dataset(dataset_path, num_parallel_workers=
8
, shuffle=True,
num_shards=device_num, shard_id=device_id)
```
2
.
配置分布式策略。
3
.
配置分布式策略。
```python
import os
device_id = int(os.getenv('DEVICE_ID'))
device_num = int(os.getenv('RANK_SIZE'))
context.set_context(mode=context.GRAPH_MODE)
if device_num > 1:
context.set_auto_parallel_context(device_num=device_num,
parallel_mode=ParallelMode.DATA_PARALLEL,
mirror_mean=True)
parallel_mode=ParallelMode.DATA_PARALLEL,
mirror_mean=True)
```
### 示例代码
...
...
@@ -178,17 +190,13 @@ device_num = int(os.getenv('RANK_SIZE'))
def
create_dataset
(
dataset_path
):
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
:
ds
=
de
.
Cifar10Dataset
(
dataset_path
,
num_parallel_workers
=
4
,
shuffle
=
True
,
num_shards
=
device_num
,
shard_id
=
device_id
)
ds
=
de
.
Cifar10Dataset
(
dataset_path
,
num_parallel_workers
=
8
,
shuffle
=
True
,
num_shards
=
device_num
,
shard_id
=
device_id
)
return
ds
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
:
context
.
set_auto_parallel_context
(
device_num
=
device_num
,
parallel_mode
=
ParallelMode
.
DATA_PARALLEL
,
...
...
@@ -220,10 +228,10 @@ device_num = int(os.getenv('RANK_SIZE'))
def
create_dataset
(
dataset_path
):
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
:
ds
=
de
.
Cifar10Dataset
(
dataset_path
,
num_parallel_workers
=
4
,
shuffle
=
True
,
num_shards
=
device_num
,
shard_id
=
device_id
)
ds
=
de
.
Cifar10Dataset
(
dataset_path
,
num_parallel_workers
=
8
,
shuffle
=
True
,
num_shards
=
device_num
,
shard_id
=
device_id
)
return
ds
def
resnet50_train
(
args_opt
):
...
...
@@ -258,6 +266,7 @@ if __name__ == '__main__':
## 创建训练任务
准备好数据和执行脚本以后,需要创建训练任务将MindSpore脚本真正运行起来。首次使用ModelArts的用户可以根据本章节了解ModelArts创建训练作业的流程。
> 本章节以MindSpore 0.1.0-alpha版本为例。
### 进入ModelArts控制台
...
...
tutorials/tutorial_code/sample_for_cloud/dataset.py
浏览文件 @
84eb98a6
...
...
@@ -45,9 +45,9 @@ def create_dataset(dataset_path, do_train, repeat_num=1, batch_size=32):
do_shuffle
=
False
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
:
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
)
resize_height
=
224
...
...
@@ -74,11 +74,8 @@ def create_dataset(dataset_path, do_train, repeat_num=1, batch_size=32):
type_cast_op
=
C2
.
TypeCast
(
mstype
.
int32
)
ds
=
ds
.
map
(
input_columns
=
"label"
,
operations
=
type_cast_op
)
ds
=
ds
.
map
(
input_columns
=
"image"
,
operations
=
trans
)
# apply shuffle operations
ds
=
ds
.
shuffle
(
buffer_size
=
buffer_size
)
ds
=
ds
.
map
(
input_columns
=
"label"
,
num_parallel_workers
=
8
,
operations
=
type_cast_op
)
ds
=
ds
.
map
(
input_columns
=
"image"
,
num_parallel_workers
=
8
,
operations
=
trans
)
# apply batch operations
ds
=
ds
.
batch
(
batch_size
,
drop_remainder
=
True
)
...
...
tutorials/tutorial_code/sample_for_cloud/resnet50_train.py
浏览文件 @
84eb98a6
...
...
@@ -27,12 +27,14 @@ from mindspore.nn.loss import SoftmaxCrossEntropyWithLogits
from
mindspore.train.model
import
Model
,
ParallelMode
from
mindspore.train.callback
import
Callback
,
LossMonitor
from
mindspore.train.loss_scale_manager
import
FixedLossScaleManager
import
mindspore.dataset.engine
as
de
from
dataset
import
create_dataset
,
device_id
,
device_num
from
mindspore.model_zoo.resnet
import
resnet50
random
.
seed
(
1
)
np
.
random
.
seed
(
1
)
de
.
config
.
set_seed
(
1
)
class
PerformanceCallback
(
Callback
):
...
...
@@ -113,7 +115,10 @@ def resnet50_train(args_opt):
local_data_path
=
'/cache/data'
# 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
:
context
.
set_auto_parallel_context
(
device_num
=
device_num
,
parallel_mode
=
ParallelMode
.
DATA_PARALLEL
,
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录