From 0676c99b933b6fae8a7c8f853775129f42c9bcbb Mon Sep 17 00:00:00 2001 From: yuhan Date: Tue, 30 Jul 2024 13:47:24 +0800 Subject: [PATCH 01/69] add golden-stick generate --- tools/generate_html/daily.json | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tools/generate_html/daily.json b/tools/generate_html/daily.json index 7ce2c85dcb..d9d29300a2 100644 --- a/tools/generate_html/daily.json +++ b/tools/generate_html/daily.json @@ -110,5 +110,14 @@ "whl_name" : "mindformers-.*-py3-none-any.whl$", "environ" : "", "uninstall_name" : "mindformers" +}, +{ + "id" : 13 , + "name" : "golden_stick", + "branch" : "master", + "whl_path" : "/golden-stick/newest/any/", + "whl_name" : "mindspore_gs-.*-py3-none-any.whl$", + "environ" : "GS_PATH", + "uninstall_name" : "mindspore_gs" } ] \ No newline at end of file -- Gitee From 3a35fdaf556f4e210e727aea398c61ab3a53a8ef Mon Sep 17 00:00:00 2001 From: yuhan Date: Tue, 30 Jul 2024 20:22:18 +0800 Subject: [PATCH 02/69] modify yaml path --- docs/mindspore/source_en/conf.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/mindspore/source_en/conf.py b/docs/mindspore/source_en/conf.py index fe0027923f..1d068e7f78 100644 --- a/docs/mindspore/source_en/conf.py +++ b/docs/mindspore/source_en/conf.py @@ -330,16 +330,16 @@ docs_branch = [version_inf[i]['branch'] for i in range(len(version_inf)) if vers cst_module_name = 'mindspore' repo_whl = 'mindspore/python/mindspore' giturl = 'https://gitee.com/mindspore/' -ops_yaml = 'mindspore/core/ops/ops_def/doc/' +ops_yaml = 'mindspore/ops/op_def/yaml/doc/' try: - ops_yaml_list = [i for i in os.listdir(os.path.join(repo_path, 'mindspore/core/ops/ops_def/doc')) if i.endswith('_doc.yaml') and '_grad' not in i] + ops_yaml_list = [i for i in os.listdir(os.path.join(repo_path, 'mindspore/ops/op_def/yaml/doc')) if i.endswith('_doc.yaml') and '_grad' not in i] except: ops_yaml_list = [] func_name_dict = {} -for i in os.listdir(os.path.join(repo_path, 'mindspore/core/ops/ops_def')): +for i in os.listdir(os.path.join(repo_path, 'mindspore/ops/op_def/yaml')): if i.endswith('_op.yaml') and '_grad' not in i: - with open(os.path.join(repo_path, 'mindspore/core/ops/ops_def', i), 'r+', encoding='utf-8') as f: + with open(os.path.join(repo_path, 'mindspore/ops/op_def/yaml', i), 'r+', encoding='utf-8') as f: op_content = f.read() if re.findall('function:\n\s+?name: (.*)', op_content): func_name_dict[re.findall('function:\n\s+?name: (.*)', op_content)[0]] = i.replace('_op.yaml', '') -- Gitee From aa2d471da3401eee71b088398e8493d4bda2b14f Mon Sep 17 00:00:00 2001 From: huan <3174348550@qq.com> Date: Wed, 31 Jul 2024 09:35:07 +0800 Subject: [PATCH 03/69] modify the code format --- .../experts/source_en/operation/op_custom_ascendc.md | 1 - .../source_zh_cn/operation/op_custom_ascendc.md | 10 +++++----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/tutorials/experts/source_en/operation/op_custom_ascendc.md b/tutorials/experts/source_en/operation/op_custom_ascendc.md index bb5c2de508..2fc609ec91 100644 --- a/tutorials/experts/source_en/operation/op_custom_ascendc.md +++ b/tutorials/experts/source_en/operation/op_custom_ascendc.md @@ -1,4 +1,3 @@ - # Ascend C Custom Operator Development and Usage [![View Source File](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/tutorials/experts/source_en/operation/op_custom_ascendc.md) diff --git a/tutorials/experts/source_zh_cn/operation/op_custom_ascendc.md b/tutorials/experts/source_zh_cn/operation/op_custom_ascendc.md index f52a82b9b5..1399830b4f 100644 --- a/tutorials/experts/source_zh_cn/operation/op_custom_ascendc.md +++ b/tutorials/experts/source_zh_cn/operation/op_custom_ascendc.md @@ -108,13 +108,13 @@ MindSpore的自定义算子接口为[ops.Custom](https://www.mindspore.cn/docs/z . ├── compile_utils.py //自定义算子编译公共文件 ├── infer_file -│   ├── add_custom_infer.cc //自定义算子c++侧infer shape -│   └── custom_aot_extra.h //自定义算子infer shape编译依赖头文件 +│ ├── add_custom_infer.cc //自定义算子c++侧infer shape +│ └── custom_aot_extra.h //自定义算子infer shape编译依赖头文件 ├── op_host //自定义算子源码op_host -│   ├── add_custom.cpp -│   └── add_custom_tiling.h +│ ├── add_custom.cpp +│ └── add_custom_tiling.h ├── op_kernel //自定义算子源码op_kernel -│   └── add_custom.cpp +│ └── add_custom.cpp ├── test_compile_custom.py //自定义算子编译用例 ├── test_custom_aclnn.py //自定义算子aclnn使用样例 ├── test_custom_aclop.py //自定义算子tbe使用样例 -- Gitee From 33d2a430fee8b0d5021e8362b3eb839a1aea98f5 Mon Sep 17 00:00:00 2001 From: huan <3174348550@qq.com> Date: Wed, 31 Jul 2024 11:17:36 +0800 Subject: [PATCH 04/69] modify the error anchors --- .../migration_guide/analysis_and_preparation.md | 4 ++-- .../source_en/note/static_graph_syntax_support.md | 6 +++--- .../migration_guide/analysis_and_preparation.md | 4 ++-- docs/xai/docs/source_en/using_cv_benchmarks.md | 2 +- tutorials/experts/source_en/debug/dump.md | 12 ++++++------ tutorials/experts/source_en/operation/op_custom.md | 2 +- tutorials/experts/source_zh_cn/debug/dump.md | 10 +++++----- .../experts/source_zh_cn/operation/op_custom.ipynb | 2 +- 8 files changed, 21 insertions(+), 21 deletions(-) diff --git a/docs/mindspore/source_en/migration_guide/analysis_and_preparation.md b/docs/mindspore/source_en/migration_guide/analysis_and_preparation.md index 79b93fc504..1467b6a8d7 100644 --- a/docs/mindspore/source_en/migration_guide/analysis_and_preparation.md +++ b/docs/mindspore/source_en/migration_guide/analysis_and_preparation.md @@ -99,9 +99,9 @@ See [TroubleShooter application scenarios](https://gitee.com/mindspore/toolkits/ MindSpore provides Dump function, used to model training in the graph and operator input and output data saved to disk files, generally used for network migration complex problem location (eg: operator overflow, etc). It can be dumped out of the operator level data. -For getting Dump data, refer to: [Synchronous Dump Step](https://www.mindspore.cn/tutorials/experts/en/master/debug/dump.html#synchronous-dump-step) and [Asynchronous Dump Step](https://www.mindspore.cn/tutorials/experts/en/master/debug/dump.html#asynchronous-dump-step). +For getting Dump data, refer to: [Synchronous Dump Step](https://www.mindspore.cn/tutorials/experts/en/master/debug/dump.html#dump-step) and [Asynchronous Dump Step](https://www.mindspore.cn/tutorials/experts/en/master/debug/dump.html##dump-step-1). -For analyzig Dump data, refer to: [Synchronous Dump Data Analysis Sample](https://www.mindspore.cn/tutorials/experts/en/master/debug/dump.html#synchronous-dump-data-analysis-sample) and [Asynchronous Dump Data Analysis Sample](https://www.mindspore.cn/tutorials/experts/en/master/debug/dump.html#asynchronous-dump-data-analysis-sample) +For analyzig Dump data, refer to: [Synchronous Dump Data Analysis Sample](https://www.mindspore.cn/tutorials/experts/en/master/debug/dump.html#data-analysis-sample) and [Asynchronous Dump Data Analysis Sample](https://www.mindspore.cn/tutorials/experts/en/master/debug/dump.html#data-analysis-sample-1) See [Dump](https://www.mindspore.cn/tutorials/experts/en/master/debug/dump.html) for details. diff --git a/docs/mindspore/source_en/note/static_graph_syntax_support.md b/docs/mindspore/source_en/note/static_graph_syntax_support.md index 01cb31ff01..813c2dcdd0 100644 --- a/docs/mindspore/source_en/note/static_graph_syntax_support.md +++ b/docs/mindspore/source_en/note/static_graph_syntax_support.md @@ -14,7 +14,7 @@ MindSpore static graph execution process actually consists of two steps, corresp There are two ways to use the Graph mode. The first way is to call the `@jit` decorator to modify a function or a class member method, and then the decorated function or method will be compiled into a static computation graph. For details about how to use `jit`, click [jit API document](https://www.mindspore.cn/docs/en/master/api_python/mindspore/mindspore.jit.html#mindspore.jit). The second way is to set `ms.set_context(mode=ms.GRAPH_MODE)`, then write the code in the `construct` function of the `Cell` so that the code in the `construct` function will be compiled into a static computation graph. For details about the definition of `Cell`, click [Cell API document](https://www.mindspore.cn/docs/en/master/api_python/nn/mindspore.nn.Cell.html). -Due to syntax parsing restrictions, the supported data types, syntax, and related operations during graph building are not completely consistent with the Python syntax. As a result, some usage is restricted. Borrowing the traditional JIT compilation idea, considers the unification of static and dynamic graphs from the perspective of graph mode and extends the syntax capabilities of graph patterns. The static graph provides a syntax experience close to that of the dynamic graph, so as to realize the unity of dynamic and static. In order to facilitate users to choose whether to extend the static graph syntax, the JIT syntax support level option 'jit_syntax_level' is provided, and its value must be in the range of [STRICT,LAX], and selecting 'STRICT' is considered to use the basic syntax and do not extend the static graph syntax. The default value is 'LAX', please refer to the [Extended Syntaxes (LAX level)](#extended-syntaxes-lax-level) section of this article for more information. All backends are supported at all levels. +Due to syntax parsing restrictions, the supported data types, syntax, and related operations during graph building are not completely consistent with the Python syntax. As a result, some usage is restricted. Borrowing the traditional JIT compilation idea, considers the unification of static and dynamic graphs from the perspective of graph mode and extends the syntax capabilities of graph patterns. The static graph provides a syntax experience close to that of the dynamic graph, so as to realize the unity of dynamic and static. In order to facilitate users to choose whether to extend the static graph syntax, the JIT syntax support level option 'jit_syntax_level' is provided, and its value must be in the range of [STRICT,LAX], and selecting 'STRICT' is considered to use the basic syntax and do not extend the static graph syntax. The default value is 'LAX', please refer to the [Extended Syntaxes (LAX level)](#extended-syntaxes-(lAX-level)) section of this article for more information. All backends are supported at all levels. - STRICT: Only basic syntaxes is supported, and execution performance is optimal. Can be used for MindIR load and export. - LAX: Supporting more complex syntaxes, compatible with all Python syntax as much as possible. Cannot be used for MindIR load and export due to some syntax that may not be able to be exported. @@ -1036,11 +1036,11 @@ The execution graph in graph mode is converted from source code, and not all Pyt RuntimeError: Unsupported statement 'Try'. ``` -4. Benchmarking Python built-in data types, except for [Built-in Python Data Types](#built-in-python-data-types) supported in the current graph mode, complex 'complex' and collection 'set' types are not supported. Some high-level uses of the list 'list' and dictionary 'dictionary' are not supported in the basic syntax scenario, and need to be supported when the JIT syntax support level option 'jit_syntax_level' is 'LAX', please refer to the [Extended Syntaxes (LAX level)](#extended-syntaxes-lax-level) section of this article for more information. +4. Benchmarking Python built-in data types, except for [Built-in Python Data Types](#built-in-python-data-types) supported in the current graph mode, complex 'complex' and collection 'set' types are not supported. Some high-level uses of the list 'list' and dictionary 'dictionary' are not supported in the basic syntax scenario, and need to be supported when the JIT syntax support level option 'jit_syntax_level' is 'LAX', please refer to the [Extended Syntaxes (LAX level)](#extended-syntaxes-(lAX-level)) section of this article for more information. 5. In the basic syntax scenario, in addition to the [Python Built-in Functions](https://www.mindspore.cn/docs/en/master/note/static_graph_syntax/python_builtin_functions.html) supported in the current graph mode, there are still some built-in functions that are not supported in graph mode. For example: basestring, bin, bytearray, callable, chr, cmp, compile, delattr, dir, divmod, eval, execfile, file, frozenset, hash, hex, id, input, issubclass, iter, locals, long, memoryview, next, object, oct, open, ord, property, raw_input, reduce, reload, repr, reverse, set, slice, sorted, unichr, unicode, vars, xrange, \_\_import\_\_. -6. Python provides a number of third-party libraries that usually need to be called via import statements. In graph mode, when the JIT syntax support level is 'STRICT', you cannot directly use third-party libraries. If you need to use the data types of third-party libraries in graph mode or call methods of third-party libraries, you need to support them only if the JIT syntax support level option 'jit_syntax_level' is 'LAX', please refer to the [Calling the Third-party Libraries](#calling-the-third-party-libraries) section in [Extended Syntaxes (LAX level)](#extended-syntaxes-lax-level) of this article. +6. Python provides a number of third-party libraries that usually need to be called via import statements. In graph mode, when the JIT syntax support level is 'STRICT', you cannot directly use third-party libraries. If you need to use the data types of third-party libraries in graph mode or call methods of third-party libraries, you need to support them only if the JIT syntax support level option 'jit_syntax_level' is 'LAX', please refer to the [Calling the Third-party Libraries](#calling-the-third-party-libraries) section in [Extended Syntaxes (LAX level)](#extended-syntaxes-(lAX-level)) of this article. 7. In graph mode, the modification of the attributes of the class outside the graph is not perceived, that is, the modification of the attributes of the class outside the graph will not take effect. For example: diff --git a/docs/mindspore/source_zh_cn/migration_guide/analysis_and_preparation.md b/docs/mindspore/source_zh_cn/migration_guide/analysis_and_preparation.md index 2818168b25..df93ee5502 100644 --- a/docs/mindspore/source_zh_cn/migration_guide/analysis_and_preparation.md +++ b/docs/mindspore/source_zh_cn/migration_guide/analysis_and_preparation.md @@ -99,9 +99,9 @@ MindRecord是MindSpore开发的一种高效数据格式,当出现精度问题 MindSpore提供了Dump功能,用来将模型训练中的图以及算子的输入输出数据保存到磁盘文件,一般用于网络迁移复杂问题定位(例如:算子溢出等)可以dump出算子级别的数据。 -获取Dump数据参考:[同步Dump数据获取介绍](https://www.mindspore.cn/tutorials/experts/zh-CN/master/debug/dump.html#%E5%90%8C%E6%AD%A5dump%E6%93%8D%E4%BD%9C%E6%AD%A5%E9%AA%A4)和[异步Dump数据获取介绍](https://www.mindspore.cn/tutorials/experts/zh-CN/master/debug/dump.html#%E5%BC%82%E6%AD%A5dump%E6%93%8D%E4%BD%9C%E6%AD%A5%E9%AA%A4) +获取Dump数据参考:[同步Dump数据获取介绍](https://www.mindspore.cn/tutorials/experts/zh-CN/master/debug/dump.html#%E6%93%8D%E4%BD%9C%E6%AD%A5%E9%AA%A4)和[异步Dump数据获取介绍](https://www.mindspore.cn/tutorials/experts/zh-CN/master/debug/dump.html#%E6%93%8D%E4%BD%9C%E6%AD%A5%E9%AA%A4-1) -分析Dump数据参考:[同步Dump数据分析介绍](https://www.mindspore.cn/tutorials/experts/zh-CN/master/debug/dump.html#%E5%90%8C%E6%AD%A5dump%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%E6%A0%B7%E4%BE%8B)和[异步Dump数据分析介绍](https://www.mindspore.cn/tutorials/experts/zh-CN/master/debug/dump.html#%E5%BC%82%E6%AD%A5dump%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%E6%A0%B7%E4%BE%8B) +分析Dump数据参考:[同步Dump数据分析介绍](https://www.mindspore.cn/tutorials/experts/zh-CN/master/debug/dump.html#%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%E6%A0%B7%E4%BE%8B)和[异步Dump数据分析介绍](https://www.mindspore.cn/tutorials/experts/zh-CN/master/debug/dump.html#%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%E6%A0%B7%E4%BE%8B-1) 具体可参考[Dump](https://www.mindspore.cn/tutorials/experts/zh-CN/master/debug/dump.html)。 diff --git a/docs/xai/docs/source_en/using_cv_benchmarks.md b/docs/xai/docs/source_en/using_cv_benchmarks.md index ffbb80a9e8..dcdc274c2b 100644 --- a/docs/xai/docs/source_en/using_cv_benchmarks.md +++ b/docs/xai/docs/source_en/using_cv_benchmarks.md @@ -10,7 +10,7 @@ Benchmarks are algorithms evaluating the goodness of saliency maps from explaine The complete code of the tutorial below is [using_cv_benchmarks.py](https://gitee.com/mindspore/xai/blob/master/examples/using_cv_benchmarks.py). -Please follow the [Downloading Data Package](https://www.mindspore.cn/xai/docs/en/master/using_cv_explainers.html#downloading-data-package) instructions to download the necessary files for the tutorial. +Please follow the [Downloading Data Package](https://www.mindspore.cn/xai/docs/en/master/using_cv_explainers.html#downloading-data-package-and-model) instructions to download the necessary files for the tutorial. With the tutorial package, we have to get the sample image, trained classifier, explainer and optionally the saliency map ready: diff --git a/tutorials/experts/source_en/debug/dump.md b/tutorials/experts/source_en/debug/dump.md index dcf324ab71..34c76a3c4a 100644 --- a/tutorials/experts/source_en/debug/dump.md +++ b/tutorials/experts/source_en/debug/dump.md @@ -15,7 +15,7 @@ MindSpore provides two Dump modes: > Different modes require different configuration files, and the generated data formats also differ: > -> - For GPU/CPU backends and Ascend backend with compilation levels O0/O1, it is recommended to use [synchronous dump](#synchronous-dump). For details, refer to [synchronous dump step](#synchronous-dump-step). For Ascend backend with compilation level O2, it is recommended to use [asynchronous dump](#asynchronous-dump). For details, refer to [asynchronous dump step](#asynchronous-dump-step). +> - For GPU/CPU backends and Ascend backend with compilation levels O0/O1, it is recommended to use [synchronous dump](#synchronous-dump). For details, refer to [synchronous dump step](https://www.mindspore.cn/tutorials/experts/en/master/debug/dump.html#dump-step). For Ascend backend with compilation level O2, it is recommended to use [asynchronous dump](#asynchronous-dump). For details, refer to [asynchronous dump step](https://www.mindspore.cn/tutorials/experts/en/master/debug/dump.html#dump-step-1). > - Currently, Dump does not support heterogeneous training. If Dump is enabled in a heterogeneous training scenario, the generated Dump data object directory may not match the expected directory structure. The support for Synchronous Dump on Ascend backend is shown in the table below (GPU/CPU backend refers to the `O0/O1`) @@ -200,7 +200,7 @@ The support for Asynchronous Dump on Ascend backend is shown in the table below - `input_output`: 0: dump input and output of kernel, 1:dump input of kernel, 2:dump output of kernel. Only input of kernel can be saved when "op_debug_mode" is set to `4`. - `kernels`: This item can be configured in three formats: 1. List of operator names. Turn on the IR save switch `set_context(save_graphs=2)` and execute the network to obtain the operator name from the generated `trace_code_graph_{graph_id}`IR file. For details, please refer to [Saving IR](https://www.mindspore.cn/tutorials/en/master/advanced/error_analysis/mindir.html#saving-ir). - Note that whether setting `set_context(save_graphs=2)` may cause the different IDs of the same operator, so when dump specified operators, keep this setting unchanged after obtaining the operator name. Or you can obtain the operator names from the file `ms_output_trace_code_graph_{graph_id}.ir` saved by Dump. Refer to [Synchronous Dump Data Object Directory](#synchronous-dump-data-object-directory). + Note that whether setting `set_context(save_graphs=2)` may cause the different IDs of the same operator, so when dump specified operators, keep this setting unchanged after obtaining the operator name. Or you can obtain the operator names from the file `ms_output_trace_code_graph_{graph_id}.ir` saved by Dump. Refer to [Synchronous Dump Data Object Directory](https://www.mindspore.cn/tutorials/experts/en/master/debug/dump.html#introduction-to-data-object-directory-and-data-file). 2. You can also specify an operator type. When there is no operator scope information or operator id information in the string, the background considers it as an operator type, such as "conv". The matching rule of operator type is: when the operator name contains an operator type string, the matching is considered successful (case insensitive). For example, "conv" can match operators "Conv2D-op1234" and "Conv3D-op1221". 3. Regular expressions are supported. When the string conforms to the format of "name-regex(xxx)", it would be considered a regular expression. For example, "name-regex(Default/.+)" can match all operators with names starting with "Default/". - `support_device`: Supported devices, default setting is `[0,1,2,3,4,5,6,7]`. You can specify specific device ids to dump specific device data. This configuration parameter is invalid on the CPU, because there is no concept of device on the CPU, but it is still need to reserve this parameter in the json file. @@ -263,7 +263,7 @@ The support for Asynchronous Dump on Ascend backend is shown in the table below You can set `set_context(reserve_class_name_in_scope=False)` in your training script to avoid dump failure because of file name is too long. -4. Read and parse synchronous dump data through `numpy.load`, refer to [Introduction to Synchronous Dump Data File](#introduction-to-synchronous-dump-data-file). +4. Read and parse synchronous dump data through `numpy.load`, refer to [Introduction to Synchronous Dump Data File](#introduction-to-data-object-directory-and-data-file). ### Introduction to Data Object Directory and Data File @@ -657,11 +657,11 @@ If ".", "/", "\", and spaces appear in `op_type` and `op_name`, they will be con The original data file generated by dump can also be parsed by using the data parsing tool DumpParser of MindSpore Insight. Please refer to [DumpParser Introduction](https://gitee.com/mindspore/mindinsight/blob/master/mindinsight/parser/README.md#) for the usage of DumpParser. The data format parsed by MindSpore Insight is exactly the same as that of synchronous dump. -If setting `file_format` to `npy`, the naming convention of data files generated by asynchronous dump is the same as those of synchronous dump. Please refer to [Introduction to Synchronous Dump Data File](#introduction-to-synchronous-dump-data-file). The overflow file generated by overflow detection is in the `json` format, and the content analysis of the overflow file can refer to the [Analyzing the Data File of an Overflow/Underflow Operator](https://www.hiascend.com/document/detail/en/CANNCommunityEdition/600alphaX/infacldevg/aclcppdevg/aclcppdevg_000160.html) . +If setting `file_format` to `npy`, the naming convention of data files generated by asynchronous dump is the same as those of synchronous dump. Please refer to [Introduction to Synchronous Dump Data File](#introduction-to-data-object-directory-and-data-file). The overflow file generated by overflow detection is in the `json` format, and the content analysis of the overflow file can refer to the [Analyzing the Data File of an Overflow/Underflow Operator](https://www.hiascend.com/document/detail/en/CANNCommunityEdition/600alphaX/infacldevg/aclcppdevg/aclcppdevg_000160.html) . -The `saved_data` option only takes effect when `file_format` is "npy". If `saved_data` is "statistic" or "full", tensor statistics will be dumped in `statistic.csv`. When `saved_data` is "tensor" or "full", full tensor data will be dumped in `{op_type}.{op_name}.{task_id}.{stream_id}.{timestamp}.{input_output_index}.{slot}.{format}.npy`. The format of the statistic file will be the same as that of synchonous dump. Please refer to [Introduction to Synchronous Dump Data File](#introduction-to-synchronous-dump-data-file). +The `saved_data` option only takes effect when `file_format` is "npy". If `saved_data` is "statistic" or "full", tensor statistics will be dumped in `statistic.csv`. When `saved_data` is "tensor" or "full", full tensor data will be dumped in `{op_type}.{op_name}.{task_id}.{stream_id}.{timestamp}.{input_output_index}.{slot}.{format}.npy`. The format of the statistic file will be the same as that of synchonous dump. Please refer to [Introduction to Synchronous Dump Data File](#introduction-to-data-object-directory-and-data-file). -The constant dump file, final execution graph file and execution order file naming rules generated by asynchronous Dump are the same as that of synchronous Dump. You can refer to [Introduction to Synchronous Dump Data File](#introduction-to-synchronous-dump-data-file). +The constant dump file, final execution graph file and execution order file naming rules generated by asynchronous Dump are the same as that of synchronous Dump. You can refer to [Introduction to Synchronous Dump Data File](#introduction-to-data-object-directory-and-data-file). ### Data Analysis Sample diff --git a/tutorials/experts/source_en/operation/op_custom.md b/tutorials/experts/source_en/operation/op_custom.md index fa12a8ebee..ec6bd63cf2 100644 --- a/tutorials/experts/source_en/operation/op_custom.md +++ b/tutorials/experts/source_en/operation/op_custom.md @@ -26,7 +26,7 @@ The difference between these operator development methods are as follows: | Defining Methods | Development Language | Compilation Method | Supported Platforms | Recommended Scenarios | |:----------------:|:--------------------:| :------: | ------ |-------------------------------------------------------------------------------| -| [pyfunc](#the-introduction-to-custom-operator-an-example) | Python | JIT | `CPU` | Fast algorithm verification, need to interact with Python and other scenarios | +| [pyfunc](https://www.mindspore.cn/tutorials/experts/en/master/operation/op_custom.html#the-introduction-to-custom-operator-an-example) | Python | JIT | `CPU` | Fast algorithm verification, need to interact with Python and other scenarios | | [hybrid](#defining-custom-operator-of-hybrid-type) | MindSpore HYBRID DSL | N/A | `GPU` `CPU` | General development and rapid validation for all platforms| | [akg](#defining-custom-operator-of-akg-type) | MindSpore AKG DSL | JIT | `GPU` | GPU platform general scenarios | | [aot](#defining-custom-operator-of-aot-type) | C/C++/CUDA | AOT | `GPU` `CPU` | high-performance scenarios / use third-party operators scenarios | diff --git a/tutorials/experts/source_zh_cn/debug/dump.md b/tutorials/experts/source_zh_cn/debug/dump.md index c94086cc0b..cf6517cf76 100644 --- a/tutorials/experts/source_zh_cn/debug/dump.md +++ b/tutorials/experts/source_zh_cn/debug/dump.md @@ -15,7 +15,7 @@ MindSpore提供了两种Dump模式: > 不同模式需要不同的配置文件,生成的数据格式也不同: > -> - GPU/CPU后端和编译等级为O0/O1下的Ascend后端,推荐使用[同步Dump](#同步dump),具体参考[同步dump操作步骤](#同步dump操作步骤);编译等级为O2的Ascend后端推荐使用[异步Dump](#异步dump),具体参考[异步dump操作步骤](#异步dump操作步骤)。 +> - GPU/CPU后端和编译等级为O0/O1下的Ascend后端,推荐使用[同步Dump](#同步dump),具体参考[同步dump操作步骤](https://www.mindspore.cn/tutorials/experts/zh-CN/master/debug/dump.html#%E6%93%8D%E4%BD%9C%E6%AD%A5%E9%AA%A4);编译等级为O2的Ascend后端推荐使用[异步Dump](#异步dump),具体参考[异步dump操作步骤](https://www.mindspore.cn/tutorials/experts/zh-CN/master/debug/dump.html#%E6%93%8D%E4%BD%9C%E6%AD%A5%E9%AA%A4-1)。 > - Dump暂不支持异构训练,如果在异构训练场景启用Dump,生成的Dump数据对象目录可能不符合预期的目录结构。 Ascend后端同步Dump支持情况如下表(GPU/CPU后端参考 `O0/O1` 列)。 @@ -200,7 +200,7 @@ Ascend后端异步Dump支持情况如下表(GPU/CPU后端不支持)。 - `input_output`:设置成0,表示Dump出算子的输入和算子的输出;设置成1,表示Dump出算子的输入;设置成2,表示Dump出算子的输出。在op_debug_mode设置为4时,只能保存算子输入。 - `kernels`:该项可以配置三种格式: 1. 算子的名称列表。开启IR保存开关`set_context(save_graphs=2)`并执行用例,从生成的IR文件`trace_code_graph_{graph_id}`中获取算子名称。详细说明可以参照教程:[如何保存IR](https://www.mindspore.cn/tutorials/zh-CN/master/advanced/error_analysis/mindir.html#如何保存ir)。 - 需要注意的是,是否设置`set_context(save_graphs=2)`可能会导致同一个算子的id不同,所以在Dump指定算子时要在获取算子名称之后保持这一项设置不变。或者也可以在Dump保存的`ms_output_trace_code_graph_{graph_id}.ir`文件中获取算子名称,参考[同步Dump数据对象目录](#同步dump数据对象目录)。 + 需要注意的是,是否设置`set_context(save_graphs=2)`可能会导致同一个算子的id不同,所以在Dump指定算子时要在获取算子名称之后保持这一项设置不变。或者也可以在Dump保存的`ms_output_trace_code_graph_{graph_id}.ir`文件中获取算子名称,参考[同步Dump数据对象目录](https://www.mindspore.cn/tutorials/experts/zh-CN/master/debug/dump.html#%E6%95%B0%E6%8D%AE%E5%AF%B9%E8%B1%A1%E7%9B%AE%E5%BD%95%E5%92%8C%E6%95%B0%E6%8D%AE%E6%96%87%E4%BB%B6%E4%BB%8B%E7%BB%8D)。 2. 还可以指定算子类型。当字符串中不带算子scope信息和算子id信息时,后台则认为其为算子类型,例如:"conv"。算子类型的匹配规则为:当发现算子名中包含算子类型字符串时,则认为匹配成功(不区分大小写),例如:"conv" 可以匹配算子 "Conv2D-op1234"、"Conv3D-op1221"。 3. 算子名称的正则表达式。当字符串符合"name-regex(xxx)"格式时,后台则会将其作为正则表达式。例如,"name-regex(Default/.+)"可匹配算子名称以"Default/"开头的所有算子。 - `support_device`:支持的设备,默认设置成0到7即可;在分布式训练场景下,需要dump个别设备上的数据,可以只在`support_device`中指定需要Dump的设备Id。该配置参数在CPU上无效,因为CPU下没有device这个概念,但是在json格式的配置文件中仍需保留该字段。 @@ -263,7 +263,7 @@ Ascend后端异步Dump支持情况如下表(GPU/CPU后端不支持)。 可以在训练脚本中设置`set_context(reserve_class_name_in_scope=False)`,避免Dump文件名称过长导致Dump数据文件生成失败。 -4. 通过`numpy.load`读取和解析同步Dump数据,参考[同步Dump数据文件介绍](#同步dump数据文件介绍)。 +4. 通过`numpy.load`读取和解析同步Dump数据,参考[同步Dump数据文件介绍](#数据对象目录和数据文件介绍)。 ### 数据对象目录和数据文件介绍 @@ -660,9 +660,9 @@ Opdebug.Node_OpDebug.{task_id}.{stream_id}.{timestamp}.output.0.json Dump生成的原始数据文件也可以使用MindSpore Insight的数据解析工具DumpParser解析,DumpParser的使用方式详见[DumpParser介绍](https://gitee.com/mindspore/mindinsight/tree/master/mindinsight/parser) 。MindSpore Insight解析出来的数据格式与同步dump的数据格式完全相同。 -若配置`file_format`值为`npy`,则启用异步dump生成的数据文件命名规则与同步Dump相同,可以参考[同步Dump数据文件介绍](#同步dump数据文件介绍),溢出检测生成的溢出文件是`json`格式,溢出文件内容解析可参考[解析算子溢出数据文件](https://www.hiascend.com/document/detail/zh/CANNCommunityEdition/80RC1alpha001/devguide/appdevg/aclpythondevg/aclpythondevg_0078.html#ZH-CN_TOPIC_0000001781325073__section6864050111619) 。 +若配置`file_format`值为`npy`,则启用异步dump生成的数据文件命名规则与同步Dump相同,可以参考[同步Dump数据文件介绍](#数据对象目录和数据文件介绍),溢出检测生成的溢出文件是`json`格式,溢出文件内容解析可参考[解析算子溢出数据文件](https://www.hiascend.com/document/detail/zh/CANNCommunityEdition/80RC1alpha001/devguide/appdevg/aclpythondevg/aclpythondevg_0078.html#ZH-CN_TOPIC_0000001781325073__section6864050111619) 。 -选项`saved_data`只有在`file_format`为"npy"的时候生效。如`saved_data`是"statistic"或者"full"。张量统计数据会落盘到`statistic.csv`。如`saved_data`是"tensor"或者"full"完整张量数据会落盘到`{op_type}.{op_name}.{task_id}.{stream_id}.{timestamp}.{input_output_index}.{slot}.{format}.npy`。`statistic.csv`的格式与同步Dump相同,可以参考[同步Dump数据文件介绍](#同步dump数据文件介绍)。 +选项`saved_data`只有在`file_format`为"npy"的时候生效。如`saved_data`是"statistic"或者"full"。张量统计数据会落盘到`statistic.csv`。如`saved_data`是"tensor"或者"full"完整张量数据会落盘到`{op_type}.{op_name}.{task_id}.{stream_id}.{timestamp}.{input_output_index}.{slot}.{format}.npy`。`statistic.csv`的格式与同步Dump相同,可以参考[同步Dump数据文件介绍](#数据对象目录和数据文件介绍)。 ### 数据分析样例 diff --git a/tutorials/experts/source_zh_cn/operation/op_custom.ipynb b/tutorials/experts/source_zh_cn/operation/op_custom.ipynb index 309cf89053..8248cc256b 100644 --- a/tutorials/experts/source_zh_cn/operation/op_custom.ipynb +++ b/tutorials/experts/source_zh_cn/operation/op_custom.ipynb @@ -32,7 +32,7 @@ "\n", "| 算子开发方式 | 开发语言 | 编译方式 | 支持平台 | 推荐场景 |\n", "|:-------|:------------------|:------ |:------ |:------------------------|\n", - "| [pyfunc](#自定义算子入门) | Python | N/A | `CPU` | 快速算法验证、需要与Python进行交互等场景 |\n", + "| [pyfunc](https://www.mindspore.cn/tutorials/experts/zh-CN/master/operation/op_custom.html#%E8%87%AA%E5%AE%9A%E4%B9%89%E7%AE%97%E5%AD%90%E5%85%A5%E9%97%A8) | Python | N/A | `CPU` | 快速算法验证、需要与Python进行交互等场景 |\n", "| [hybrid](#hybrid类型的自定义算子开发) | MindSpore HYBRID DSL | JIT | `GPU` `CPU` | 全平台通用开发和快速验证 |\n", "| [akg](#akg类型的自定义算子开发) | MindSpore AKG DSL | JIT | `GPU` | 用于开发验证场景,不建议普通用户使用 |\n", "| [aot](#aot类型的自定义算子开发) | C/C++/CUDA | AOT | `GPU` `CPU` | 高性能手写、对接调用第三方算子库场景 |\n", -- Gitee From e0f3939a3ca86145bf276bc63049a197b40f21ab Mon Sep 17 00:00:00 2001 From: yuhan Date: Wed, 31 Jul 2024 11:57:17 +0800 Subject: [PATCH 05/69] fix bug for golden-stick --- docs/golden_stick/docs/source_zh_cn/conf.py | 16 ++++++++++++++-- docs/mindspore/source_en/conf.py | 2 +- docs/mindspore/source_zh_cn/conf.py | 2 +- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/docs/golden_stick/docs/source_zh_cn/conf.py b/docs/golden_stick/docs/source_zh_cn/conf.py index 791d130a76..5b04e764b8 100644 --- a/docs/golden_stick/docs/source_zh_cn/conf.py +++ b/docs/golden_stick/docs/source_zh_cn/conf.py @@ -209,6 +209,20 @@ for root,dirs,files in os.walk(src_dir_api): os.remove(os.path.join(moment_dir,'quantization',file)) shutil.copy(os.path.join(root,file),os.path.join(moment_dir,'quantization',file)) copy_list.append(os.path.join(moment_dir,file)) + elif '/ptq' in root: + if not os.path.exists(os.path.join(moment_dir, 'ptq')): + os.makedirs(os.path.join(moment_dir, 'ptq')) + if os.path.exists(os.path.join(moment_dir,'ptq',file)): + os.remove(os.path.join(moment_dir,'ptq',file)) + shutil.copy(os.path.join(root,file),os.path.join(moment_dir,'ptq',file)) + copy_list.append(os.path.join(moment_dir,file)) + else: + if not os.path.exists('.' + root.split(copy_path)[-1]): + os.makedirs('.' + root.split(copy_path)[-1]) + if os.path.exists('.'+root.split(copy_path)[-1]+'/'+file): + os.remove('.'+root.split(copy_path)[-1]+'/'+file) + shutil.copy(os.path.join(root,file),'.'+root.split(copy_path)[-1]+'/'+file) + copy_list.append('.'+root.split(copy_path)[-1]+'/'+file) # add view import json @@ -260,8 +274,6 @@ for cur, _, files in os.walk(moment_dir): except Exception: print(f'打开{i}文件失败') -if not os.path.exists(os.path.join(moment_dir, 'ptq')): - os.makedirs(os.path.join(moment_dir, 'ptq')) if not os.path.exists(os.path.join(moment_dir, 'ptq/round_to_nearest.ipynb')): shutil.copy(os.path.join(os.getenv("GS_PATH"), 'mindspore_gs/ptq/round_to_nearest/README.ipynb'), os.path.join(moment_dir, 'ptq/round_to_nearest.ipynb')) diff --git a/docs/mindspore/source_en/conf.py b/docs/mindspore/source_en/conf.py index 1d068e7f78..71c4660aa4 100644 --- a/docs/mindspore/source_en/conf.py +++ b/docs/mindspore/source_en/conf.py @@ -425,7 +425,7 @@ release_source = f'[![View Source On Gitee](https://mindspore-website.obs.cn-nor with open(src_release, "r", encoding="utf-8") as f: data = f.read() if len(re.findall("\n## (.*?)\n",data)) > 1: - data = re.sub("\n## MindSpore 2.3.0 [\s\S\n]*?\n## ", "\n## ", data) + data = re.sub("\n## MindSpore 2.3.1 [\s\S\n]*?\n## ", "\n## ", data) content = regex.findall("(\n## MindSpore [^L][\s\S\n]*?)\n## ", data, overlapped=True) repo_version = re.findall("\n## MindSpore ([0-9]+?\.[0-9]+?)\.([0-9]+?)[ -]", content[0])[0] content_new = '' diff --git a/docs/mindspore/source_zh_cn/conf.py b/docs/mindspore/source_zh_cn/conf.py index fe9936af8c..232ef610ec 100644 --- a/docs/mindspore/source_zh_cn/conf.py +++ b/docs/mindspore/source_zh_cn/conf.py @@ -549,7 +549,7 @@ release_source = f'[![查看源文件](https://mindspore-website.obs.cn-north-4. with open(src_release, "r", encoding="utf-8") as f: data = f.read() if len(re.findall("\n## (.*?)\n",data)) > 1: - data = re.sub("\n## MindSpore 2.3.0 [\s\S\n]*?\n## ", "\n## ", data) + data = re.sub("\n## MindSpore 2.3.1 [\s\S\n]*?\n## ", "\n## ", data) content = regex.findall("(\n## MindSpore [^L][\s\S\n]*?)\n## ", data, overlapped=True) repo_version = re.findall("\n## MindSpore ([0-9]+?\.[0-9]+?)\.([0-9]+?)[ -]", content[0])[0] content_new = '' -- Gitee From c83c0b9084b19117e4153a3b75c7423f2cfcf192 Mon Sep 17 00:00:00 2001 From: yuhan Date: Wed, 31 Jul 2024 17:27:45 +0800 Subject: [PATCH 06/69] add pyyaml in requirements --- docs/golden_stick/docs/requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/golden_stick/docs/requirements.txt b/docs/golden_stick/docs/requirements.txt index 46904323e5..fb57d308d8 100644 --- a/docs/golden_stick/docs/requirements.txt +++ b/docs/golden_stick/docs/requirements.txt @@ -6,3 +6,4 @@ numpy nbsphinx == 0.8.11 IPython jieba +pyyaml \ No newline at end of file -- Gitee From 1dcfd4c8fd30a902e3f015fadf32f33d8dcad66f Mon Sep 17 00:00:00 2001 From: maning202007 Date: Wed, 31 Jul 2024 19:56:01 +0800 Subject: [PATCH 07/69] fix dump doc error --- tutorials/experts/source_en/debug/dump.md | 14 +++++++++----- tutorials/experts/source_zh_cn/debug/dump.md | 16 +++++++++------- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/tutorials/experts/source_en/debug/dump.md b/tutorials/experts/source_en/debug/dump.md index 34c76a3c4a..c01cbced46 100644 --- a/tutorials/experts/source_en/debug/dump.md +++ b/tutorials/experts/source_en/debug/dump.md @@ -225,7 +225,7 @@ The support for Asynchronous Dump on Ascend backend is shown in the table below - `enable`: When set to true, enable Synchronous Dump. When set to false, asynchronous dump will be used on Ascend and synchronous dump will still be used on GPU. - `trans_flag`: Enable trans flag. Transform the device data format into NCHW. If it is `True`, the data will be saved in the 4D format (NCHW) format on the Host side; if it is `False`, the data format on the Device side will be retained. Default: `True`. - `stat_calc_mode`: Select the backend for statistical calculations. Options are "host" and "device". Choosing "device" enables device computation of statistics, currently only effective on Ascend, and supports only min/max/avg/l2norm statistics. - - `sample_mode`: Setting it to 0 means the sample dump function is not enabled. Enable the sample dump function in graph compilation with optimization level O0. This field is effective only when "op_debug_mode" is set to `0`, sample dump cannot be enabled in other scene. + - `sample_mode`: Setting it to 0 means the sample dump function is not enabled. Enable the sample dump function in graph compilation with optimization level O0 or O1. This field is effective only when "op_debug_mode" is set to `0`, sample dump cannot be enabled in other scene. - `sample_num`: Used to control the size of sample in sample dump. The default value is 100. 2. Set Dump environment variable. @@ -522,7 +522,7 @@ MindSpore provides debugging capabilities for large networks through asynchronou } ``` - - `op_debug_mode`: This attribute is used for operator overflow debugging. 0: disable overflow check function; 3: enable overflow check function; 4: enable the lightweight exception dump function (this feature only takes effect when using ACL dump). Set it to 0 when Dump data is processed. If it is not set to 0, only the data of the overflow operator or exception operator will be dumped. + - `op_debug_mode`: This attribute is used for operator overflow debugging. 0: disable overflow check function; 3: enable overflow check function; 4: enable the lightweight exception dump function. Set it to 0 when Dump data is processed. If it is not set to 0, only the data of the overflow operator or exception operator will be dumped. - `dump_mode`: 0: all operator data in the network dumped out; 1: dump kernels data in kernels list. When overflow detection is enabled, the setting of this field becomes invalid, and Dump only saves the data of the overflow node. Specified data dump is supported only when "dump_mode' is set to `0`. - `path`: The absolute path to save Dump data. When the graph compilation level is O0, MindSpore will create a new subdirectory for each step in the path directory. - `net_name`: The customized net name: "ResNet50". @@ -593,6 +593,7 @@ When the graph compilation level is not O0 or O1, the Dump directory structure i {op_type}.{op_name}.{task_id}.{stream_id}.{timestamp} Opdebug.Node_OpDebug.{task_id}.{stream_id}.{timestamp} mapping.csv + acl_dump_{device_id}.json ``` When the graph compilation level is O0 or O1, the Dump directory structure is as follows. In this scenario, the dump files for aclop and aclnn operators will be saved in {device_id} directory, and the dump files for communication operators such as "ResuceSum" will be saved in {iteration_id} directory: @@ -613,6 +614,7 @@ When the graph compilation level is O0 or O1, the Dump directory structure is as {op_type}.{op_name}.{task_id}.{stream_id}.{timestamp} //aclop ops {op_name}.{op_type}.{task_id}.{stream_id}.{timestamp} //aclnn ops mapping.csv + acl_dump_{device_id}.json ``` - `path`: the absolute path set in the `data_dump.json` configuration file. @@ -628,6 +630,8 @@ When the graph compilation level is O0 or O1, the Dump directory structure is as - `timestamp`: the time stamp. - `step_id`: user side training step id. +The `acl_damp_{device_id}.json` file in the {path} directory is an intermediate file generated by asynchronous dump during interface calls, and generally does not need to be paid attention to. + The overflow file (file `Opdebug.Node_OpDebug.{task_id}.{stream_id}.{timestamp}`) is only saved when overflow dump is enabled and overflow is detected. If set `file_format` to `npy`, the operator file will be saved as a npy format file, and the overflow file will be saved as a json format file. The file naming formats are: @@ -728,7 +732,7 @@ Through the asynchronous Dump function, the data files generated by the operator In some special scenarios, the GE dump mode can be applied under development guidance. -To enable GE dump, set the environment variable MINDSPORE_DUMP_CONFIG and ENABLE_MS_GE_DUMP to 1. This mode applies only to the scenario where the compilation level of the graph is O2. The format of the configuration file is the same as that of the acl dump configuration file. The op_debug_mode field cannot be set to 4. Other parameters are the same as those of the acl dump configuration file. +To enable GE dump, set the environment variable MINDSPORE_DUMP_CONFIG and ENABLE_MS_GE_DUMP to 1. This mode applies only to the scenario where the compilation level of the graph is O2. The format of the configuration file is the same as that of the asynchronous dump configuration file. The op_debug_mode field cannot be set to 4. Other parameters are the same as those of the asynchronous dump configuration file. ```bash export ENABLE_MS_GE_DUMP=1 @@ -749,7 +753,7 @@ When GE dump is enabled, and the graph compilation level is O2, the Dump directo mapping.csv ``` -Among them, the meanings of `path`, `time`, `device_id`, `model_name`, `model_id`, `iteration_id`, `op_type`, `op_name`, `task_id`, `stream_id`, and `timestamp` are the same as those of ACL dump. +Among them, the meanings of `path`, `time`, `device_id`, `model_name`, `model_id`, `iteration_id`, `op_type`, `op_name`, `task_id`, `stream_id`, and `timestamp` are the same as those of asynchronous dump. This method will be abandoned in the future and is not recommended for use. @@ -759,4 +763,4 @@ This method will be abandoned in the future and is not recommended for use. - Dump only supports saving data with type of bool, int, int8, in16, int32, int64, uint, uint8, uint16, uint32, uint64, float, float16, float32, float64, bfloat16, double, complex64 and complex128. - Complex64 and complex128 only support saving as npy files, not as statistics information. - The Print operator has an input parameter with type of string, which is not a data type supported by Dump. Therefore, when the Print operator is included in the script, there will be an error log, which will not affect the saving data of other types. -- When ACL dump is enabled, lite exception dump is not supported by using set_context(ascend_config={"exception_dump": "2"), while full exception dump is supported by using set_context(ascend_config={"exception_dump": "1"). +- When asynchronous dump is enabled, lite exception dump is not supported by using set_context(ascend_config={"exception_dump": "2"), while full exception dump is supported by using set_context(ascend_config={"exception_dump": "1"). diff --git a/tutorials/experts/source_zh_cn/debug/dump.md b/tutorials/experts/source_zh_cn/debug/dump.md index cf6517cf76..f187290e50 100644 --- a/tutorials/experts/source_zh_cn/debug/dump.md +++ b/tutorials/experts/source_zh_cn/debug/dump.md @@ -225,7 +225,7 @@ Ascend后端异步Dump支持情况如下表(GPU/CPU后端不支持)。 - `enable`:设置成true,表示开启同步Dump;设置成false时,在Ascend上会使用异步Dump,在GPU上仍然使用同步Dump。 - `trans_flag`:开启格式转换。将设备上的数据格式转换成NCHW格式。若为`True`,则数据会以Host侧的4D格式(NCHW)格式保存;若为`False`,则保留Device侧的数据格式。该配置参数在CPU上无效,因为CPU上没有format转换。默认值:true。 - `stat_calc_mode`:选择统计信息计算后端,可选"host"和"device"。选择"device"后可以使能device计算统计信息,当前只在Ascend生效,只支持`min/max/avg/l2norm`统计量。 - - `sample_mode`:设置成0,表示不开启切片dump功能;设置成1时,在图编译等级为O0的情况下开启切片dump功能。仅在op_debug_mode设置为0时生效,其它场景不会开启切片dump功能。 + - `sample_mode`:设置成0,表示不开启切片dump功能;设置成1时,在图编译等级为O0或O1的情况下开启切片dump功能。仅在op_debug_mode设置为0时生效,其它场景不会开启切片dump功能。 - `sample_num`:用于控制切片dump中切片的大小。默认值为100。 2. 设置Dump环境变量。 @@ -522,7 +522,7 @@ MindSpore通过异步Dump提供了Ascend平台上大型网络的调试能力。 } ``` - - `op_debug_mode`:该属性用于算子溢出调试,设置成0,表示不开启溢出;设置成3,表示开启溢出检测功能;设置成4,表示开启轻量异常Dump功能(该功能仅在使用ACL dump时生效)。在Dump数据的时候请设置成0,若设置成其他值,则只会Dump溢出算子或异常算子的数据。 + - `op_debug_mode`:该属性用于算子溢出调试,设置成0,表示不开启溢出;设置成3,表示开启溢出检测功能;设置成4,表示开启轻量异常Dump功能。在Dump数据的时候请设置成0,若设置成其他值,则只会Dump溢出算子或异常算子的数据。 - `dump_mode`:设置成0,表示Dump出该网络中的所有算子数据;设置成1,表示Dump`"kernels"`里面指定的算子数据或算子类型数据。仅在op_debug_mode设置为0时支持指定算子dump。op_debug_mode设置为非0值时,此字段的设置失效,Dump只会保存溢出算子的数据或者异常算子的数据。 - `path`:Dump保存数据的绝对路径。在图编译等级为O0时,MindSpore会在path目录下新建每个step的子目录。 - `net_name`:自定义的网络名称,例如:"ResNet50"。 @@ -594,6 +594,7 @@ MindSpore通过异步Dump提供了Ascend平台上大型网络的调试能力。 {op_type}.{op_name}.{task_id}.{stream_id}.{timestamp} Opdebug.Node_OpDebug.{task_id}.{stream_id}.{timestamp} mapping.csv + acl_dump_{device_id}.json ``` 图编译等级为O0或O1时,Dump目录结构如下所示,此种场景下aclop和aclnn算子的Dump数据会保存于{device_id}目录,"ReduceSum"类通信算子的Dump数据会保存在{iteration_id}目录: @@ -614,10 +615,9 @@ MindSpore通过异步Dump提供了Ascend平台上大型网络的调试能力。 {op_type}.{op_name}.{task_id}.{stream_id}.{timestamp} //aclop 算子 {op_name}.{op_type}.{task_id}.{stream_id}.{timestamp} //aclnn 算子 mapping.csv + acl_dump_{device_id}.json ``` -使能ACL dump时,除上述dump数据外,还会在{path}目录生成调用acl接口所需要的json文件,一般情况下无需关注。 - - `path`:`data_dump.json`配置文件中设置的绝对路径。 - `time`: dump目录的创建时间。 - `device_id`: 卡号。 @@ -631,6 +631,8 @@ MindSpore通过异步Dump提供了Ascend平台上大型网络的调试能力。 - `timestamp`:时间戳。 - `step_id`: 用户侧的训练轮次。 +在{path}目录的`acl_dump_{device_id}.json`文件,是异步Dump在接口调用过程中生成的中间文件,一般情况下无需关注。 + 其中,溢出文件(`Opdebug.Node_OpDebug.{task_id}.{stream_id}.{timestamp}`文件)只会在开启溢出Dump且检测到溢出时保存。 若配置文件中`file_format`值设置为`npy`,算子文件会保存成npy格式的文件,溢出文件会被保存成json格式的文件。文件命名格式分别为: @@ -729,7 +731,7 @@ Dump生成的原始数据文件也可以使用MindSpore Insight的数据解析 在一些特殊场景下,可在开发指导下应用GE dump模式。 -如果要使能GE dump,除了配置环境变量MINDSPORE_DUMP_CONFIG之外,还需要另外配置环境变量ENABLE_MS_GE_DUMP=1,该方式仅支持图编译等级为O2的场景。配置文件的格式和acl dump相同,op_debug_mode字段不支持配置为4,其余各项参数和acl dump相同。 +如果要使能GE dump,除了配置环境变量MINDSPORE_DUMP_CONFIG之外,还需要另外配置环境变量ENABLE_MS_GE_DUMP=1,该方式仅支持图编译等级为O2的场景。配置文件的格式和异步Dump相同,op_debug_mode字段不支持配置为4,其余各项参数和异步Dump相同。 ```bash export ENABLE_MS_GE_DUMP=1 @@ -750,7 +752,7 @@ GE dump的目录结构如下: mapping.csv ``` -其中, `path`、`time`、`device_id`、`model_name`、`model_id`、`iteration_id`、`op_type`、`op_name`、`task_id`、`stream_id`、`timestamp`的含义和acl dump的相同。 +其中, `path`、`time`、`device_id`、`model_name`、`model_id`、`iteration_id`、`op_type`、`op_name`、`task_id`、`stream_id`、`timestamp`的含义和异步Dump的相同。 该方式在将来会被废弃,不推荐使用。 @@ -760,4 +762,4 @@ GE dump的目录结构如下: - Dump仅支持bool、int、int8、in16、int32、int64、uint、uint8、uint16、uint32、uint64、float、float16、float32、float64、bfloat16、double、complex64、complex128类型数据的保存。 - complex64和complex128仅支持保存为npy文件,不支持保存为统计值信息。 - Print算子内部有一个输入参数为string类型,string类型不属于Dump支持的数据类型,所以在脚本中包含Print算子时,会有错误日志,这不会影响其它类型数据的保存。 -- 使能ACL dump时,不支持同时使用set_context(ascend_config={"exception_dump": "2")配置轻量异常dump; 支持同时使用set_context(ascend_config={"exception_dump": "1")配置全量异常dump。 +- 使能异步Dump时,不支持同时使用set_context(ascend_config={"exception_dump": "2")配置轻量异常dump; 支持同时使用set_context(ascend_config={"exception_dump": "1")配置全量异常dump。 -- Gitee From c31553e3ff1a3a4dbdf820f49b2709156c6b7915 Mon Sep 17 00:00:00 2001 From: yuhan Date: Thu, 1 Aug 2024 14:26:03 +0800 Subject: [PATCH 08/69] fix bug for golden_stick --- docs/golden_stick/docs/source_en/conf.py | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/docs/golden_stick/docs/source_en/conf.py b/docs/golden_stick/docs/source_en/conf.py index 239a4c9162..dab39ba7e4 100644 --- a/docs/golden_stick/docs/source_en/conf.py +++ b/docs/golden_stick/docs/source_en/conf.py @@ -14,11 +14,10 @@ import os import re import shutil import sys +import sphinx from sphinx.ext import autodoc as sphinx_autodoc import sphinx.ext.autosummary.generate as g -import mindspore_gs - # -- Project information ----------------------------------------------------- project = 'MindSpore' @@ -159,6 +158,25 @@ with open(autodoc_source_path, "r+", encoding="utf8") as f: exec(get_param_func_str, sphinx_autodoc.__dict__) exec(code_str, sphinx_autodoc.__dict__) +# Repair error content defined in mindspore. +try: + decorator_list = [("mindspore/common/dtype.py","restore error", + "# generate api by del decorator.\nclass QuantDtype():","@enum.unique\nclass QuantDtype(enum.Enum):")] + + base_path = os.path.dirname(os.path.dirname(sphinx.__file__)) + for i in decorator_list: + with open(os.path.join(base_path, os.path.normpath(i[0])), "r+", encoding="utf8") as f: + content = f.read() + if i[2] in content: + content = content.replace(i[2], i[3]) + f.seek(0) + f.truncate() + f.write(content) +except: + pass + +import mindspore_gs + # Copy source files of chinese python api from golden-stick repository. from sphinx.util import logging import shutil -- Gitee From 00512d3dabac70c2200d15e99b9e246b834130ff Mon Sep 17 00:00:00 2001 From: yuhan Date: Fri, 2 Aug 2024 10:45:21 +0800 Subject: [PATCH 09/69] del copy mindinsight debugger --- docs/mindinsight/docs/source_zh_cn/conf.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/docs/mindinsight/docs/source_zh_cn/conf.py b/docs/mindinsight/docs/source_zh_cn/conf.py index 5ff324ae28..79d7c6633b 100644 --- a/docs/mindinsight/docs/source_zh_cn/conf.py +++ b/docs/mindinsight/docs/source_zh_cn/conf.py @@ -165,17 +165,17 @@ copy_list = [] present_path = os.path.dirname(__file__) -for i in os.listdir(src_dir): - if os.path.isfile(os.path.join(src_dir,i)): - if os.path.exists('./'+i): - os.remove('./'+i) - shutil.copy(os.path.join(src_dir,i),'./'+i) - copy_list.append(os.path.join(present_path,i)) - else: - if os.path.exists('./'+i): - shutil.rmtree('./'+i) - shutil.copytree(os.path.join(src_dir,i),'./'+i) - copy_list.append(os.path.join(present_path,i)) +# for i in os.listdir(src_dir): +# if os.path.isfile(os.path.join(src_dir,i)): +# if os.path.exists('./'+i): +# os.remove('./'+i) +# shutil.copy(os.path.join(src_dir,i),'./'+i) +# copy_list.append(os.path.join(present_path,i)) +# else: +# if os.path.exists('./'+i): +# shutil.rmtree('./'+i) +# shutil.copytree(os.path.join(src_dir,i),'./'+i) +# copy_list.append(os.path.join(present_path,i)) # add view import json -- Gitee From 0c8760f2de88e95c53bef3c635a627d6e9d3e0dc Mon Sep 17 00:00:00 2001 From: yuhan Date: Fri, 2 Aug 2024 11:16:12 +0800 Subject: [PATCH 10/69] fit chemistry conf --- docs/mindchemistry/docs/_ext/myautosummary.py | 6 +-- .../_ext/overwriteautosummary_generate.txt | 27 ++++------- docs/mindchemistry/docs/source_en/conf.py | 46 ++++++------------- docs/mindchemistry/docs/source_zh_cn/conf.py | 9 ++-- tools/generate_html/base_version.json | 9 ++++ tools/generate_html/daily.json | 9 ++++ 6 files changed, 46 insertions(+), 60 deletions(-) diff --git a/docs/mindchemistry/docs/_ext/myautosummary.py b/docs/mindchemistry/docs/_ext/myautosummary.py index 326d0bdf5a..c8e37cee88 100644 --- a/docs/mindchemistry/docs/_ext/myautosummary.py +++ b/docs/mindchemistry/docs/_ext/myautosummary.py @@ -1,9 +1,8 @@ """Customized autosummary directives for sphinx.""" - -import importlib -import inspect import os import re +import inspect +import importlib from typing import List, Tuple from docutils.nodes import Node from sphinx.locale import __ @@ -225,7 +224,6 @@ class MsNoteAutoSummary(MsAutosummary): env_sum = piece[10:] return env_sum - class MsPlatformAutoSummary(MsAutosummary): """ Inherited from MsAutosummary. Add a third column about `Supported Platforms` to the table. diff --git a/docs/mindchemistry/docs/_ext/overwriteautosummary_generate.txt b/docs/mindchemistry/docs/_ext/overwriteautosummary_generate.txt index b6d35fed4e..4b0a1b1dd2 100644 --- a/docs/mindchemistry/docs/_ext/overwriteautosummary_generate.txt +++ b/docs/mindchemistry/docs/_ext/overwriteautosummary_generate.txt @@ -73,10 +73,10 @@ class DummyApplication: self.config.add('autosummary_ignore_module_all', True, 'env', bool) self.config.add('docs_branch', '', True, None) self.config.add('branch', '', True, None) - self.config.add('cst_module_name', [], True, None) + self.config.add('cst_module_name', '', True, None) self.config.add('copy_repo', '', True, None) self.config.add('giturl', '', True, None) - self.config.add('repo_whl', [], True, None) + self.config.add('repo_whl', '', True, None) self.config.init_values() def emit_firstresult(self, *args: Any) -> None: @@ -470,22 +470,13 @@ def generate_autosummary_docs(sources: List[str], output_dir: str = None, logger.warning(name) py_source_rel = '' - if app.config.cst_module_name[0] in name: - re_view = f"\n.. image:: https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/{app.config.docs_branch}/" + \ - f"resource/_static/logo_source_en.svg\n :target: " + app.config.giturl + \ - f"{app.config.copy_repo}/blob/{app.config.branch}/" + app.config.repo_whl[0] + \ - py_source_rel.split(app.config.cst_module_name[0])[-1] + '\n :alt: View Source On Gitee\n\n' - - if re_view not in content and py_source_rel: - content = re.sub('([=]{5,})\n', r'\1\n' + re_view, content, 1) - elif app.config.cst_module_name[1] in name: - re_view = f"\n.. image:: https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/{app.config.docs_branch}/" + \ - f"resource/_static/logo_source_en.svg\n :target: " + app.config.giturl + \ - f"{app.config.copy_repo}/blob/{app.config.branch}/" + app.config.repo_whl[1] + \ - py_source_rel.split(app.config.cst_module_name[1])[-1] + '\n :alt: View Source On Gitee\n\n' - - if re_view not in content and py_source_rel: - content = re.sub('([=]{5,})\n', r'\1\n' + re_view, content, 1) + re_view = f"\n.. image:: https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/{app.config.docs_branch}/" + \ + f"resource/_static/logo_source_en.svg\n :target: " + app.config.giturl + \ + f"{app.config.copy_repo}/blob/{app.config.branch}/" + app.config.repo_whl + \ + py_source_rel.split(app.config.cst_module_name)[-1] + '\n :alt: View Source On Gitee\n\n' + + if re_view not in content and py_source_rel: + content = re.sub('([=]{5,})\n', r'\1\n' + re_view, content, 1) filename = os.path.join(path, filename_map.get(name, name) + suffix) if os.path.isfile(filename): with open(filename, encoding=encoding) as f: diff --git a/docs/mindchemistry/docs/source_en/conf.py b/docs/mindchemistry/docs/source_en/conf.py index 2849e91835..f25e79e4e8 100644 --- a/docs/mindchemistry/docs/source_en/conf.py +++ b/docs/mindchemistry/docs/source_en/conf.py @@ -49,6 +49,7 @@ extensions = [ 'sphinx.ext.napoleon', 'sphinx.ext.viewcode', 'myst_parser', + 'nbsphinx', 'sphinx.ext.mathjax', 'IPython.sphinxext.ipython_console_highlighting' ] @@ -142,40 +143,21 @@ with open(autodoc_source_path, "r+", encoding="utf8") as f: exec(get_param_func_str, sphinx_autodoc.__dict__) exec(code_str, sphinx_autodoc.__dict__) -# Repair error content defined in mindsponge. -try: - decorator_list = [("sponge/optimizer/updater.py","del decorator", - "@opt_init_args_register","# generate api by del decorator.")] - - base_path = os.path.dirname(os.path.dirname(sphinx.__file__)) - for i in decorator_list: - with open(os.path.join(base_path, os.path.normpath(i[0])), "r+", encoding="utf8") as f: - content = f.read() - if i[2] in content: - content = content.replace(i[2], i[3]) - f.seek(0) - f.truncate() - f.write(content) -except: - pass - # Copy source files of chinese python api from mindscience repository. from sphinx.util import logging logger = logging.getLogger(__name__) -src_dir_msg = os.path.join(os.getenv("MSC_PATH"), 'MindSPONGE/docs/api/api_python_en') - -present_path = os.path.dirname(__file__) +src_dir_mc = os.path.join(os.getenv("MSC_PATH"), 'docs/api_python_en/mindchemistry') -for i in os.listdir(src_dir_msg): - if os.path.isfile(os.path.join(src_dir_msg,i)): +for i in os.listdir(src_dir_mc): + if os.path.isfile(os.path.join(src_dir_mc,i)): if os.path.exists('./'+i): os.remove('./'+i) - shutil.copy(os.path.join(src_dir_msg,i),'./'+i) + shutil.copy(os.path.join(src_dir_mc,i),'./'+i) else: if os.path.exists('./'+i): shutil.rmtree('./'+i) - shutil.copytree(os.path.join(src_dir_msg,i),'./'+i) + shutil.copytree(os.path.join(src_dir_mc,i),'./'+i) # get params for add view source import json @@ -197,11 +179,11 @@ else: branch = [version_inf[i]['branch'] for i in range(len(version_inf)) if version_inf[i]['name'] == copy_repo][0] docs_branch = [version_inf[i]['branch'] for i in range(len(version_inf)) if version_inf[i]['name'] == 'tutorials'][0] -cst_module_name = ['mindsponge', 'sponge'] -repo_whl = ['MindSPONGE/src/mindsponge', 'MindSPONGE/src/sponge'] +cst_module_name = 'mindchemistry' +repo_whl = 'MindChemistry/mindchemistry' giturl = 'https://gitee.com/mindspore/' -import mindsponge +import mindchemistry sys.path.append(os.path.abspath('../../../../resource/sphinx_ext')) # import anchor_mod @@ -213,20 +195,19 @@ import search_code sys.path.append(os.path.abspath('../../../../resource/custom_directives')) from custom_directives import IncludeCodeDirective -from myautosummary import MsPlatformAutoSummary, MsNoteAutoSummary +from myautosummary import MsPlatformAutoSummary def setup(app): app.add_directive('msplatformautosummary', MsPlatformAutoSummary) - app.add_directive('msnoteautosummary', MsNoteAutoSummary) app.add_directive('includecode', IncludeCodeDirective) app.add_config_value('docs_branch', '', True) app.add_config_value('branch', '', True) - app.add_config_value('cst_module_name', [], True) + app.add_config_value('cst_module_name', '', True) app.add_config_value('copy_repo', '', True) app.add_config_value('giturl', '', True) - app.add_config_value('repo_whl', [], True) + app.add_config_value('repo_whl', '', True) -src_release = os.path.join(os.getenv("MSC_PATH"), 'MindSPONGE/RELEASE.md') +src_release = os.path.join(os.getenv("MSC_PATH"), 'MindChemistry/RELEASE.md') des_release = "./RELEASE.md" with open(src_release, "r", encoding="utf-8") as f: data = f.read() @@ -234,7 +215,6 @@ if len(re.findall("\n## (.*?)\n",data)) > 1: content = re.findall("(## [\s\S\n]*?)\n## ", data) else: content = re.findall("(## [\s\S\n]*)", data) -#result = content[0].replace('# MindSPONGE', '#', 1) with open(des_release, "w", encoding="utf-8") as p: p.write("# Release Notes"+"\n\n") p.write(content[0]) \ No newline at end of file diff --git a/docs/mindchemistry/docs/source_zh_cn/conf.py b/docs/mindchemistry/docs/source_zh_cn/conf.py index 7676433f45..d377d626b2 100644 --- a/docs/mindchemistry/docs/source_zh_cn/conf.py +++ b/docs/mindchemistry/docs/source_zh_cn/conf.py @@ -160,7 +160,7 @@ with open(autodoc_source_path, "r+", encoding="utf8") as f: from sphinx.util import logging logger = logging.getLogger(__name__) -copy_path = 'MindSPONGE/docs/api/api_python' +copy_path = 'docs/api_python/mindchemistry' src_dir = os.path.join(os.getenv("MSC_PATH"), copy_path) copy_list = [] @@ -229,25 +229,24 @@ for cur, _, files in os.walk(present_path): except Exception: print(f'打开{i}文件失败') -import mindsponge +import mindchemistry sys.path.append(os.path.abspath('../../../../resource/search')) import search_code sys.path.append(os.path.abspath('../../../../resource/custom_directives')) from custom_directives import IncludeCodeDirective -from myautosummary import MsPlatformAutoSummary, MsNoteAutoSummary, MsCnPlatformAutoSummary +from myautosummary import MsPlatformAutoSummary, MsCnPlatformAutoSummary rst_files = set([i.replace('.rst', '') for i in glob.glob('./**/*.rst', recursive=True)]) def setup(app): app.add_directive('msplatformautosummary', MsPlatformAutoSummary) - app.add_directive('msnoteautosummary', MsNoteAutoSummary) app.add_directive('mscnplatformautosummary', MsCnPlatformAutoSummary) app.add_directive('includecode', IncludeCodeDirective) app.add_config_value('rst_files', set(), False) -src_release = os.path.join(os.getenv("MSC_PATH"), 'MindSPONGE/RELEASE_CN.md') +src_release = os.path.join(os.getenv("MSC_PATH"), 'MindChemistry/RELEASE_CN.md') des_release = "./RELEASE.md" with open(src_release, "r", encoding="utf-8") as f: data = f.read() diff --git a/tools/generate_html/base_version.json b/tools/generate_html/base_version.json index 656a36f876..d0b466e92b 100644 --- a/tools/generate_html/base_version.json +++ b/tools/generate_html/base_version.json @@ -288,5 +288,14 @@ }, "repo_name": "xai", "theme": "theme-docs" + }, + { + "version": "master", + "label": { + "zh": "MindSpore Chemistry", + "en": "MindSpore Chemistry" + }, + "repo_name": "mindchemistry", + "theme": "theme-docs" } ] \ No newline at end of file diff --git a/tools/generate_html/daily.json b/tools/generate_html/daily.json index d9d29300a2..0df45843e8 100644 --- a/tools/generate_html/daily.json +++ b/tools/generate_html/daily.json @@ -119,5 +119,14 @@ "whl_name" : "mindspore_gs-.*-py3-none-any.whl$", "environ" : "GS_PATH", "uninstall_name" : "mindspore_gs" +}, +{ + "id" : 14 , + "name" : "mindchemistry", + "branch" : "master", + "whl_path" : "/mindchemistry/gpu/x86_64/cuda-11.1/", + "whl_name" : "mindchemistry_gpu-.*-py3-none-any.whl$", + "environ" : "MSC_PATH", + "uninstall_name" : "mindchemistry_gpu" } ] \ No newline at end of file -- Gitee From 0a1979ef5dd0b33e3cf265929467be86d1d10362 Mon Sep 17 00:00:00 2001 From: yuhan Date: Fri, 2 Aug 2024 14:14:40 +0800 Subject: [PATCH 11/69] del generate chemistry and copy golden-stick file --- docs/golden_stick/docs/source_en/conf.py | 5 +++++ tools/generate_html/daily.json | 9 --------- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/docs/golden_stick/docs/source_en/conf.py b/docs/golden_stick/docs/source_en/conf.py index dab39ba7e4..c7658a4a45 100644 --- a/docs/golden_stick/docs/source_en/conf.py +++ b/docs/golden_stick/docs/source_en/conf.py @@ -191,6 +191,11 @@ for root,dirs,files in os.walk(src_dir_api): os.remove(os.path.join(moment_dir,file)) shutil.copy(os.path.join(src_dir_api,file),os.path.join(moment_dir,file)) +if not os.path.exists(os.path.join(moment_dir, 'ptq/round_to_nearest.md')): + os.makedirs(os.path.join(moment_dir, 'ptq'), exist_ok=True) + shutil.copy(os.path.join(os.getenv("GS_PATH"), 'mindspore_gs/ptq/round_to_nearest/README_EN.md'), + os.path.join(moment_dir, 'ptq/round_to_nearest.md')) + # get params for add view source import json diff --git a/tools/generate_html/daily.json b/tools/generate_html/daily.json index 0df45843e8..d9d29300a2 100644 --- a/tools/generate_html/daily.json +++ b/tools/generate_html/daily.json @@ -119,14 +119,5 @@ "whl_name" : "mindspore_gs-.*-py3-none-any.whl$", "environ" : "GS_PATH", "uninstall_name" : "mindspore_gs" -}, -{ - "id" : 14 , - "name" : "mindchemistry", - "branch" : "master", - "whl_path" : "/mindchemistry/gpu/x86_64/cuda-11.1/", - "whl_name" : "mindchemistry_gpu-.*-py3-none-any.whl$", - "environ" : "MSC_PATH", - "uninstall_name" : "mindchemistry_gpu" } ] \ No newline at end of file -- Gitee From 4755b220d0a8e5550f23d29b3c16d06579c4629c Mon Sep 17 00:00:00 2001 From: huan <3174348550@qq.com> Date: Fri, 2 Aug 2024 17:19:31 +0800 Subject: [PATCH 12/69] modify the mindformers structure --- docs/mindformers/docs/Makefile | 20 - .../_ext/overwriteautosummary_generate.txt | 707 ------------------ .../docs/_ext/overwriteobjectiondirective.txt | 368 --------- .../docs/_ext/overwriteviewcode.txt | 378 ---------- docs/mindformers/docs/requirements.txt | 7 - .../docs/source_en/advanced_interface.md | 7 - docs/mindformers/docs/source_en/aicc.md | 1 - .../docs/source_en/api_register.md | 5 - .../mindformers/docs/source_en/api_startup.md | 1 - docs/mindformers/docs/source_en/conf.py | 175 ----- .../docs/source_en/configuration.md | 1 - .../docs/source_en/contribution_guide.md | 1 - .../docs/source_en/data_process.md | 1 - .../docs/source_en/env_variable.md | 1 - docs/mindformers/docs/source_en/evaluation.md | 3 - .../docs/source_en/faq_advanced_interface.md | 1 - .../docs/source_en/faq_configuration.md | 1 - .../mindformers/docs/source_en/fine_tuning.md | 3 - docs/mindformers/docs/source_en/inference.md | 5 - .../docs/source_en/installation.md | 1 - .../mindformers/docs/source_en/large_model.md | 7 - docs/mindformers/docs/source_en/model.md | 1 - docs/mindformers/docs/source_en/overview.md | 1 - .../docs/source_en/performance_tuning.md | 1 - .../docs/source_en/precision_tuning.md | 1 - .../docs/source_en/source_code_startup.md | 1 - docs/mindformers/docs/source_en/training.md | 31 - .../docs/source_en/weight_process.md | 7 - .../docs/source_zh_cn/advanced_interface.md | 13 - docs/mindformers/docs/source_zh_cn/aicc.md | 6 - .../docs/source_zh_cn/api_register.md | 9 - .../docs/source_zh_cn/api_startup.md | 3 - docs/mindformers/docs/source_zh_cn/conf.py | 155 ---- .../docs/source_zh_cn/configuration.md | 5 - .../docs/source_zh_cn/data_process.md | 3 - .../docs/source_zh_cn/env_variable.md | 3 - .../docs/source_zh_cn/evaluation.md | 5 - .../source_zh_cn/faq_advanced_interface.md | 1 - .../docs/source_zh_cn/faq_configuration.md | 1 - .../docs/source_zh_cn/fine_tuning.md | 5 - .../docs/source_zh_cn/inference.md | 9 - .../docs/source_zh_cn/installation.md | 5 - .../docs/source_zh_cn/large_model.md | 9 - docs/mindformers/docs/source_zh_cn/model.md | 5 - .../mindformers/docs/source_zh_cn/overview.md | 3 - .../docs/source_zh_cn/performance_tuning.md | 1 - .../docs/source_zh_cn/precision_tuning.md | 1 - .../docs/source_zh_cn/source_code_startup.md | 3 - .../mindformers/docs/source_zh_cn/training.md | 45 -- .../docs/source_zh_cn/weight_process.md | 13 - .../mindformers/appendix/conf_files.md | 1 + .../mindformers/appendix/env_variables.md | 1 + .../source_en/mindformers/faq/func_related.md | 1 + .../faq/mindformers_contribution.md | 1 + .../mindformers/faq/model_related.md | 1 + .../mindformers/faq/openmind_contribution.md | 1 + .../source_en/mindformers/function/dataset.md | 1 + .../function/distributed_parallel.md | 1 + .../mindformers/function/res_training.md | 1 + .../mindformers/function/weight_conversion.md | 1 + .../source_en/mindformers}/index.rst | 69 +- .../mindformers/quick_start/install.md | 1 + .../quick_start/source_code_start.md | 1 + .../source_en/mindformers/start/models.md | 1 + .../source_en/mindformers/start/overview.md | 1 + .../mindformers/usage/dev_migration.md | 1 + .../source_en/mindformers/usage/evaluation.md | 1 + .../source_en/mindformers/usage/inference.md | 1 + .../mindformers/usage/lora_tuning.md | 1 + .../mindformers/usage/mindie_deployment.md | 1 + .../mindformers/usage/pre_training.md | 1 + .../mindformers/usage/quantization.md | 1 + .../source_en/mindformers/usage/sft_tuning.md | 1 + .../mindformers/appendix/conf_files.md | 1 + .../mindformers/appendix/env_variables.md | 1 + .../mindformers/faq/func_related.md | 1 + .../faq/mindformers_contribution.md} | 0 .../mindformers/faq/model_related.md | 1 + .../mindformers/faq/openmind_contribution.md | 1 + .../mindformers/function/dataset.md | 1 + .../function/distributed_parallel.md | 1 + .../mindformers/function/res_training.md | 1 + .../mindformers/function/weight_conversion.md | 1 + .../source_zh_cn/mindformers}/index.rst | 67 +- .../mindformers/quick_start/install.md | 1 + .../quick_start/source_code_start.md | 1 + .../source_zh_cn/mindformers/start/models.md | 1 + .../mindformers/start/overview.md | 1 + .../mindformers/usage/dev_migration.md | 1 + .../mindformers/usage/evaluation.md | 1 + .../mindformers/usage/inference.md | 1 + .../mindformers/usage/lora_tuning.md | 1 + .../mindformers/usage/mindie_deployment.md | 1 + .../mindformers/usage/pre_training.md | 1 + .../mindformers/usage/quantization.md | 1 + .../mindformers/usage/sft_tuning.md | 1 + 96 files changed, 108 insertions(+), 2111 deletions(-) delete mode 100644 docs/mindformers/docs/Makefile delete mode 100644 docs/mindformers/docs/_ext/overwriteautosummary_generate.txt delete mode 100644 docs/mindformers/docs/_ext/overwriteobjectiondirective.txt delete mode 100644 docs/mindformers/docs/_ext/overwriteviewcode.txt delete mode 100644 docs/mindformers/docs/requirements.txt delete mode 100644 docs/mindformers/docs/source_en/advanced_interface.md delete mode 100644 docs/mindformers/docs/source_en/aicc.md delete mode 100644 docs/mindformers/docs/source_en/api_register.md delete mode 100644 docs/mindformers/docs/source_en/api_startup.md delete mode 100644 docs/mindformers/docs/source_en/conf.py delete mode 100644 docs/mindformers/docs/source_en/configuration.md delete mode 100644 docs/mindformers/docs/source_en/contribution_guide.md delete mode 100644 docs/mindformers/docs/source_en/data_process.md delete mode 100644 docs/mindformers/docs/source_en/env_variable.md delete mode 100644 docs/mindformers/docs/source_en/evaluation.md delete mode 100644 docs/mindformers/docs/source_en/faq_advanced_interface.md delete mode 100644 docs/mindformers/docs/source_en/faq_configuration.md delete mode 100644 docs/mindformers/docs/source_en/fine_tuning.md delete mode 100644 docs/mindformers/docs/source_en/inference.md delete mode 100644 docs/mindformers/docs/source_en/installation.md delete mode 100644 docs/mindformers/docs/source_en/large_model.md delete mode 100644 docs/mindformers/docs/source_en/model.md delete mode 100644 docs/mindformers/docs/source_en/overview.md delete mode 100644 docs/mindformers/docs/source_en/performance_tuning.md delete mode 100644 docs/mindformers/docs/source_en/precision_tuning.md delete mode 100644 docs/mindformers/docs/source_en/source_code_startup.md delete mode 100644 docs/mindformers/docs/source_en/training.md delete mode 100644 docs/mindformers/docs/source_en/weight_process.md delete mode 100644 docs/mindformers/docs/source_zh_cn/advanced_interface.md delete mode 100644 docs/mindformers/docs/source_zh_cn/aicc.md delete mode 100644 docs/mindformers/docs/source_zh_cn/api_register.md delete mode 100644 docs/mindformers/docs/source_zh_cn/api_startup.md delete mode 100644 docs/mindformers/docs/source_zh_cn/conf.py delete mode 100644 docs/mindformers/docs/source_zh_cn/configuration.md delete mode 100644 docs/mindformers/docs/source_zh_cn/data_process.md delete mode 100644 docs/mindformers/docs/source_zh_cn/env_variable.md delete mode 100644 docs/mindformers/docs/source_zh_cn/evaluation.md delete mode 100644 docs/mindformers/docs/source_zh_cn/faq_advanced_interface.md delete mode 100644 docs/mindformers/docs/source_zh_cn/faq_configuration.md delete mode 100644 docs/mindformers/docs/source_zh_cn/fine_tuning.md delete mode 100644 docs/mindformers/docs/source_zh_cn/inference.md delete mode 100644 docs/mindformers/docs/source_zh_cn/installation.md delete mode 100644 docs/mindformers/docs/source_zh_cn/large_model.md delete mode 100644 docs/mindformers/docs/source_zh_cn/model.md delete mode 100644 docs/mindformers/docs/source_zh_cn/overview.md delete mode 100644 docs/mindformers/docs/source_zh_cn/performance_tuning.md delete mode 100644 docs/mindformers/docs/source_zh_cn/precision_tuning.md delete mode 100644 docs/mindformers/docs/source_zh_cn/source_code_startup.md delete mode 100644 docs/mindformers/docs/source_zh_cn/training.md delete mode 100644 docs/mindformers/docs/source_zh_cn/weight_process.md create mode 100644 docs/mindspore/source_en/mindformers/appendix/conf_files.md create mode 100644 docs/mindspore/source_en/mindformers/appendix/env_variables.md create mode 100644 docs/mindspore/source_en/mindformers/faq/func_related.md create mode 100644 docs/mindspore/source_en/mindformers/faq/mindformers_contribution.md create mode 100644 docs/mindspore/source_en/mindformers/faq/model_related.md create mode 100644 docs/mindspore/source_en/mindformers/faq/openmind_contribution.md create mode 100644 docs/mindspore/source_en/mindformers/function/dataset.md create mode 100644 docs/mindspore/source_en/mindformers/function/distributed_parallel.md create mode 100644 docs/mindspore/source_en/mindformers/function/res_training.md create mode 100644 docs/mindspore/source_en/mindformers/function/weight_conversion.md rename docs/{mindformers/docs/source_en => mindspore/source_en/mindformers}/index.rst (31%) create mode 100644 docs/mindspore/source_en/mindformers/quick_start/install.md create mode 100644 docs/mindspore/source_en/mindformers/quick_start/source_code_start.md create mode 100644 docs/mindspore/source_en/mindformers/start/models.md create mode 100644 docs/mindspore/source_en/mindformers/start/overview.md create mode 100644 docs/mindspore/source_en/mindformers/usage/dev_migration.md create mode 100644 docs/mindspore/source_en/mindformers/usage/evaluation.md create mode 100644 docs/mindspore/source_en/mindformers/usage/inference.md create mode 100644 docs/mindspore/source_en/mindformers/usage/lora_tuning.md create mode 100644 docs/mindspore/source_en/mindformers/usage/mindie_deployment.md create mode 100644 docs/mindspore/source_en/mindformers/usage/pre_training.md create mode 100644 docs/mindspore/source_en/mindformers/usage/quantization.md create mode 100644 docs/mindspore/source_en/mindformers/usage/sft_tuning.md create mode 100644 docs/mindspore/source_zh_cn/mindformers/appendix/conf_files.md create mode 100644 docs/mindspore/source_zh_cn/mindformers/appendix/env_variables.md create mode 100644 docs/mindspore/source_zh_cn/mindformers/faq/func_related.md rename docs/{mindformers/docs/source_zh_cn/contribution_guide.md => mindspore/source_zh_cn/mindformers/faq/mindformers_contribution.md} (100%) create mode 100644 docs/mindspore/source_zh_cn/mindformers/faq/model_related.md create mode 100644 docs/mindspore/source_zh_cn/mindformers/faq/openmind_contribution.md create mode 100644 docs/mindspore/source_zh_cn/mindformers/function/dataset.md create mode 100644 docs/mindspore/source_zh_cn/mindformers/function/distributed_parallel.md create mode 100644 docs/mindspore/source_zh_cn/mindformers/function/res_training.md create mode 100644 docs/mindspore/source_zh_cn/mindformers/function/weight_conversion.md rename docs/{mindformers/docs/source_zh_cn => mindspore/source_zh_cn/mindformers}/index.rst (35%) create mode 100644 docs/mindspore/source_zh_cn/mindformers/quick_start/install.md create mode 100644 docs/mindspore/source_zh_cn/mindformers/quick_start/source_code_start.md create mode 100644 docs/mindspore/source_zh_cn/mindformers/start/models.md create mode 100644 docs/mindspore/source_zh_cn/mindformers/start/overview.md create mode 100644 docs/mindspore/source_zh_cn/mindformers/usage/dev_migration.md create mode 100644 docs/mindspore/source_zh_cn/mindformers/usage/evaluation.md create mode 100644 docs/mindspore/source_zh_cn/mindformers/usage/inference.md create mode 100644 docs/mindspore/source_zh_cn/mindformers/usage/lora_tuning.md create mode 100644 docs/mindspore/source_zh_cn/mindformers/usage/mindie_deployment.md create mode 100644 docs/mindspore/source_zh_cn/mindformers/usage/pre_training.md create mode 100644 docs/mindspore/source_zh_cn/mindformers/usage/quantization.md create mode 100644 docs/mindspore/source_zh_cn/mindformers/usage/sft_tuning.md diff --git a/docs/mindformers/docs/Makefile b/docs/mindformers/docs/Makefile deleted file mode 100644 index 1eff895270..0000000000 --- a/docs/mindformers/docs/Makefile +++ /dev/null @@ -1,20 +0,0 @@ -# Minimal makefile for Sphinx documentation -# - -# You can set these variables from the command line, and also -# from the environment for the first two. -SPHINXOPTS ?= -SPHINXBUILD ?= sphinx-build -SOURCEDIR = source_zh_cn -BUILDDIR = build_zh_cn - -# Put it first so that "make" without argument is like "make help". -help: - @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) - -.PHONY: help Makefile - -# Catch-all target: route all unknown targets to Sphinx using the new -# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). -%: Makefile - @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/mindformers/docs/_ext/overwriteautosummary_generate.txt b/docs/mindformers/docs/_ext/overwriteautosummary_generate.txt deleted file mode 100644 index 4b0a1b1dd2..0000000000 --- a/docs/mindformers/docs/_ext/overwriteautosummary_generate.txt +++ /dev/null @@ -1,707 +0,0 @@ -""" - sphinx.ext.autosummary.generate - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - Usable as a library or script to generate automatic RST source files for - items referred to in autosummary:: directives. - - Each generated RST file contains a single auto*:: directive which - extracts the docstring of the referred item. - - Example Makefile rule:: - - generate: - sphinx-autogen -o source/generated source/*.rst - - :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. - :license: BSD, see LICENSE for details. -""" - -import argparse -import importlib -import inspect -import locale -import os -import pkgutil -import pydoc -import re -import sys -import warnings -from gettext import NullTranslations -from os import path -from typing import Any, Dict, List, NamedTuple, Sequence, Set, Tuple, Type, Union - -from jinja2 import TemplateNotFound -from jinja2.sandbox import SandboxedEnvironment - -import sphinx.locale -from sphinx import __display_version__, package_dir -from sphinx.application import Sphinx -from sphinx.builders import Builder -from sphinx.config import Config -from sphinx.deprecation import RemovedInSphinx50Warning -from sphinx.ext.autodoc import Documenter -from sphinx.ext.autodoc.importer import import_module -from sphinx.ext.autosummary import (ImportExceptionGroup, get_documenter, import_by_name, - import_ivar_by_name) -from sphinx.locale import __ -from sphinx.pycode import ModuleAnalyzer, PycodeError -from sphinx.registry import SphinxComponentRegistry -from sphinx.util import logging, rst, split_full_qualified_name, get_full_modname -from sphinx.util.inspect import getall, safe_getattr -from sphinx.util.osutil import ensuredir -from sphinx.util.template import SphinxTemplateLoader - -logger = logging.getLogger(__name__) - - -class DummyApplication: - """Dummy Application class for sphinx-autogen command.""" - - def __init__(self, translator: NullTranslations) -> None: - self.config = Config() - self.registry = SphinxComponentRegistry() - self.messagelog: List[str] = [] - self.srcdir = "/" - self.translator = translator - self.verbosity = 0 - self._warncount = 0 - self.warningiserror = False - - self.config.add('autosummary_context', {}, True, None) - self.config.add('autosummary_filename_map', {}, True, None) - self.config.add('autosummary_ignore_module_all', True, 'env', bool) - self.config.add('docs_branch', '', True, None) - self.config.add('branch', '', True, None) - self.config.add('cst_module_name', '', True, None) - self.config.add('copy_repo', '', True, None) - self.config.add('giturl', '', True, None) - self.config.add('repo_whl', '', True, None) - self.config.init_values() - - def emit_firstresult(self, *args: Any) -> None: - pass - - -class AutosummaryEntry(NamedTuple): - name: str - path: str - template: str - recursive: bool - - -def setup_documenters(app: Any) -> None: - from sphinx.ext.autodoc import (AttributeDocumenter, ClassDocumenter, DataDocumenter, - DecoratorDocumenter, ExceptionDocumenter, - FunctionDocumenter, MethodDocumenter, ModuleDocumenter, - NewTypeAttributeDocumenter, NewTypeDataDocumenter, - PropertyDocumenter) - documenters: List[Type[Documenter]] = [ - ModuleDocumenter, ClassDocumenter, ExceptionDocumenter, DataDocumenter, - FunctionDocumenter, MethodDocumenter, NewTypeAttributeDocumenter, - NewTypeDataDocumenter, AttributeDocumenter, DecoratorDocumenter, PropertyDocumenter, - ] - for documenter in documenters: - app.registry.add_documenter(documenter.objtype, documenter) - - -def _simple_info(msg: str) -> None: - warnings.warn('_simple_info() is deprecated.', - RemovedInSphinx50Warning, stacklevel=2) - print(msg) - - -def _simple_warn(msg: str) -> None: - warnings.warn('_simple_warn() is deprecated.', - RemovedInSphinx50Warning, stacklevel=2) - print('WARNING: ' + msg, file=sys.stderr) - - -def _underline(title: str, line: str = '=') -> str: - if '\n' in title: - raise ValueError('Can only underline single lines') - return title + '\n' + line * len(title) - - -class AutosummaryRenderer: - """A helper class for rendering.""" - - def __init__(self, app: Union[Builder, Sphinx], template_dir: str = None) -> None: - if isinstance(app, Builder): - warnings.warn('The first argument for AutosummaryRenderer has been ' - 'changed to Sphinx object', - RemovedInSphinx50Warning, stacklevel=2) - if template_dir: - warnings.warn('template_dir argument for AutosummaryRenderer is deprecated.', - RemovedInSphinx50Warning, stacklevel=2) - - system_templates_path = [os.path.join(package_dir, 'ext', 'autosummary', 'templates')] - loader = SphinxTemplateLoader(app.srcdir, app.config.templates_path, - system_templates_path) - - self.env = SandboxedEnvironment(loader=loader) - self.env.filters['escape'] = rst.escape - self.env.filters['e'] = rst.escape - self.env.filters['underline'] = _underline - - if isinstance(app, (Sphinx, DummyApplication)): - if app.translator: - self.env.add_extension("jinja2.ext.i18n") - self.env.install_gettext_translations(app.translator) - elif isinstance(app, Builder): - if app.app.translator: - self.env.add_extension("jinja2.ext.i18n") - self.env.install_gettext_translations(app.app.translator) - - def exists(self, template_name: str) -> bool: - """Check if template file exists.""" - warnings.warn('AutosummaryRenderer.exists() is deprecated.', - RemovedInSphinx50Warning, stacklevel=2) - try: - self.env.get_template(template_name) - return True - except TemplateNotFound: - return False - - def render(self, template_name: str, context: Dict) -> str: - """Render a template file.""" - try: - template = self.env.get_template(template_name) - except TemplateNotFound: - try: - # objtype is given as template_name - template = self.env.get_template('autosummary/%s.rst' % template_name) - except TemplateNotFound: - # fallback to base.rst - template = self.env.get_template('autosummary/base.rst') - - return template.render(context) - - -# -- Generating output --------------------------------------------------------- - - -class ModuleScanner: - def __init__(self, app: Any, obj: Any) -> None: - self.app = app - self.object = obj - - def get_object_type(self, name: str, value: Any) -> str: - return get_documenter(self.app, value, self.object).objtype - - def is_skipped(self, name: str, value: Any, objtype: str) -> bool: - try: - return self.app.emit_firstresult('autodoc-skip-member', objtype, - name, value, False, {}) - except Exception as exc: - logger.warning(__('autosummary: failed to determine %r to be documented, ' - 'the following exception was raised:\n%s'), - name, exc, type='autosummary') - return False - - def scan(self, imported_members: bool) -> List[str]: - members = [] - for name in members_of(self.object, self.app.config): - try: - value = safe_getattr(self.object, name) - except AttributeError: - value = None - - objtype = self.get_object_type(name, value) - if self.is_skipped(name, value, objtype): - continue - - try: - if inspect.ismodule(value): - imported = True - elif safe_getattr(value, '__module__') != self.object.__name__: - imported = True - else: - imported = False - except AttributeError: - imported = False - - respect_module_all = not self.app.config.autosummary_ignore_module_all - if imported_members: - # list all members up - members.append(name) - elif imported is False: - # list not-imported members - members.append(name) - elif '__all__' in dir(self.object) and respect_module_all: - # list members that have __all__ set - members.append(name) - - return members - - -def members_of(obj: Any, conf: Config) -> Sequence[str]: - """Get the members of ``obj``, possibly ignoring the ``__all__`` module attribute - - Follows the ``conf.autosummary_ignore_module_all`` setting.""" - - if conf.autosummary_ignore_module_all: - return dir(obj) - else: - return getall(obj) or dir(obj) - - -def generate_autosummary_content(name: str, obj: Any, parent: Any, - template: AutosummaryRenderer, template_name: str, - imported_members: bool, app: Any, - recursive: bool, context: Dict, - modname: str = None, qualname: str = None) -> str: - doc = get_documenter(app, obj, parent) - - def skip_member(obj: Any, name: str, objtype: str) -> bool: - try: - return app.emit_firstresult('autodoc-skip-member', objtype, name, - obj, False, {}) - except Exception as exc: - logger.warning(__('autosummary: failed to determine %r to be documented, ' - 'the following exception was raised:\n%s'), - name, exc, type='autosummary') - return False - - def get_class_members(obj: Any) -> Dict[str, Any]: - members = sphinx.ext.autodoc.get_class_members(obj, [qualname], safe_getattr) - return {name: member.object for name, member in members.items()} - - def get_module_members(obj: Any) -> Dict[str, Any]: - members = {} - for name in members_of(obj, app.config): - try: - members[name] = safe_getattr(obj, name) - except AttributeError: - continue - return members - - def get_all_members(obj: Any) -> Dict[str, Any]: - if doc.objtype == "module": - return get_module_members(obj) - elif doc.objtype == "class": - return get_class_members(obj) - return {} - - def get_members(obj: Any, types: Set[str], include_public: List[str] = [], - imported: bool = True) -> Tuple[List[str], List[str]]: - items: List[str] = [] - public: List[str] = [] - - all_members = get_all_members(obj) - for name, value in all_members.items(): - documenter = get_documenter(app, value, obj) - if documenter.objtype in types: - # skip imported members if expected - if imported or getattr(value, '__module__', None) == obj.__name__: - skipped = skip_member(value, name, documenter.objtype) - if skipped is True: - pass - elif skipped is False: - # show the member forcedly - items.append(name) - public.append(name) - else: - items.append(name) - if name in include_public or not name.startswith('_'): - # considers member as public - public.append(name) - return public, items - - def get_module_attrs(members: Any) -> Tuple[List[str], List[str]]: - """Find module attributes with docstrings.""" - attrs, public = [], [] - try: - analyzer = ModuleAnalyzer.for_module(name) - attr_docs = analyzer.find_attr_docs() - for namespace, attr_name in attr_docs: - if namespace == '' and attr_name in members: - attrs.append(attr_name) - if not attr_name.startswith('_'): - public.append(attr_name) - except PycodeError: - pass # give up if ModuleAnalyzer fails to parse code - return public, attrs - - def get_modules(obj: Any) -> Tuple[List[str], List[str]]: - items: List[str] = [] - for _, modname, _ispkg in pkgutil.iter_modules(obj.__path__): - fullname = name + '.' + modname - try: - module = import_module(fullname) - if module and hasattr(module, '__sphinx_mock__'): - continue - except ImportError: - pass - - items.append(fullname) - public = [x for x in items if not x.split('.')[-1].startswith('_')] - return public, items - - ns: Dict[str, Any] = {} - ns.update(context) - - if doc.objtype == 'module': - scanner = ModuleScanner(app, obj) - ns['members'] = scanner.scan(imported_members) - ns['functions'], ns['all_functions'] = \ - get_members(obj, {'function'}, imported=imported_members) - ns['classes'], ns['all_classes'] = \ - get_members(obj, {'class'}, imported=imported_members) - ns['exceptions'], ns['all_exceptions'] = \ - get_members(obj, {'exception'}, imported=imported_members) - ns['attributes'], ns['all_attributes'] = \ - get_module_attrs(ns['members']) - ispackage = hasattr(obj, '__path__') - if ispackage and recursive: - ns['modules'], ns['all_modules'] = get_modules(obj) - elif doc.objtype == 'class': - ns['members'] = dir(obj) - ns['inherited_members'] = \ - set(dir(obj)) - set(obj.__dict__.keys()) - ns['methods'], ns['all_methods'] = \ - get_members(obj, {'method'}, ['__init__']) - ns['attributes'], ns['all_attributes'] = \ - get_members(obj, {'attribute', 'property'}) - - if modname is None or qualname is None: - modname, qualname = split_full_qualified_name(name) - - if doc.objtype in ('method', 'attribute', 'property'): - ns['class'] = qualname.rsplit(".", 1)[0] - - if doc.objtype in ('class',): - shortname = qualname - else: - shortname = qualname.rsplit(".", 1)[-1] - - ns['fullname'] = name - ns['module'] = modname - ns['objname'] = qualname - ns['name'] = shortname - - ns['objtype'] = doc.objtype - ns['underline'] = len(name) * '=' - - if template_name: - return template.render(template_name, ns) - else: - return template.render(doc.objtype, ns) - - -def generate_autosummary_docs(sources: List[str], output_dir: str = None, - suffix: str = '.rst', base_path: str = None, - builder: Builder = None, template_dir: str = None, - imported_members: bool = False, app: Any = None, - overwrite: bool = True, encoding: str = 'utf-8') -> None: - - if builder: - warnings.warn('builder argument for generate_autosummary_docs() is deprecated.', - RemovedInSphinx50Warning, stacklevel=2) - - if template_dir: - warnings.warn('template_dir argument for generate_autosummary_docs() is deprecated.', - RemovedInSphinx50Warning, stacklevel=2) - - showed_sources = list(sorted(sources)) - if len(showed_sources) > 20: - showed_sources = showed_sources[:10] + ['...'] + showed_sources[-10:] - logger.info(__('[autosummary] generating autosummary for: %s') % - ', '.join(showed_sources)) - - if output_dir: - logger.info(__('[autosummary] writing to %s') % output_dir) - - if base_path is not None: - sources = [os.path.join(base_path, filename) for filename in sources] - - template = AutosummaryRenderer(app) - - # read - items = find_autosummary_in_files(sources) - - # keep track of new files - new_files = [] - - if app: - filename_map = app.config.autosummary_filename_map - else: - filename_map = {} - - # write - for entry in sorted(set(items), key=str): - if entry.path is None: - # The corresponding autosummary:: directive did not have - # a :toctree: option - continue - - path = output_dir or os.path.abspath(entry.path) - ensuredir(path) - - try: - name, obj, parent, modname = import_by_name(entry.name, grouped_exception=True) - qualname = name.replace(modname + ".", "") - except ImportExceptionGroup as exc: - try: - # try to import as an instance attribute - name, obj, parent, modname = import_ivar_by_name(entry.name) - qualname = name.replace(modname + ".", "") - except ImportError as exc2: - if exc2.__cause__: - exceptions: List[BaseException] = exc.exceptions + [exc2.__cause__] - else: - exceptions = exc.exceptions + [exc2] - - errors = list(set("* %s: %s" % (type(e).__name__, e) for e in exceptions)) - logger.warning(__('[autosummary] failed to import %s.\nPossible hints:\n%s'), - entry.name, '\n'.join(errors)) - continue - - context: Dict[str, Any] = {} - if app: - context.update(app.config.autosummary_context) - - content = generate_autosummary_content(name, obj, parent, template, entry.template, - imported_members, app, entry.recursive, context, - modname, qualname) - try: - py_source_rel = get_full_modname(modname, qualname).replace('.', '/') + '.py' - except: - logger.warning(name) - py_source_rel = '' - - re_view = f"\n.. image:: https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/{app.config.docs_branch}/" + \ - f"resource/_static/logo_source_en.svg\n :target: " + app.config.giturl + \ - f"{app.config.copy_repo}/blob/{app.config.branch}/" + app.config.repo_whl + \ - py_source_rel.split(app.config.cst_module_name)[-1] + '\n :alt: View Source On Gitee\n\n' - - if re_view not in content and py_source_rel: - content = re.sub('([=]{5,})\n', r'\1\n' + re_view, content, 1) - filename = os.path.join(path, filename_map.get(name, name) + suffix) - if os.path.isfile(filename): - with open(filename, encoding=encoding) as f: - old_content = f.read() - - if content == old_content: - continue - elif overwrite: # content has changed - with open(filename, 'w', encoding=encoding) as f: - f.write(content) - new_files.append(filename) - else: - with open(filename, 'w', encoding=encoding) as f: - f.write(content) - new_files.append(filename) - - # descend recursively to new files - if new_files: - generate_autosummary_docs(new_files, output_dir=output_dir, - suffix=suffix, base_path=base_path, - builder=builder, template_dir=template_dir, - imported_members=imported_members, app=app, - overwrite=overwrite) - - -# -- Finding documented entries in files --------------------------------------- - -def find_autosummary_in_files(filenames: List[str]) -> List[AutosummaryEntry]: - """Find out what items are documented in source/*.rst. - - See `find_autosummary_in_lines`. - """ - documented: List[AutosummaryEntry] = [] - for filename in filenames: - with open(filename, encoding='utf-8', errors='ignore') as f: - lines = f.read().splitlines() - documented.extend(find_autosummary_in_lines(lines, filename=filename)) - return documented - - -def find_autosummary_in_docstring(name: str, module: str = None, filename: str = None - ) -> List[AutosummaryEntry]: - """Find out what items are documented in the given object's docstring. - - See `find_autosummary_in_lines`. - """ - if module: - warnings.warn('module argument for find_autosummary_in_docstring() is deprecated.', - RemovedInSphinx50Warning, stacklevel=2) - - try: - real_name, obj, parent, modname = import_by_name(name, grouped_exception=True) - lines = pydoc.getdoc(obj).splitlines() - return find_autosummary_in_lines(lines, module=name, filename=filename) - except AttributeError: - pass - except ImportExceptionGroup as exc: - errors = list(set("* %s: %s" % (type(e).__name__, e) for e in exc.exceptions)) - print('Failed to import %s.\nPossible hints:\n%s' % (name, '\n'.join(errors))) - except SystemExit: - print("Failed to import '%s'; the module executes module level " - "statement and it might call sys.exit()." % name) - return [] - - -def find_autosummary_in_lines(lines: List[str], module: str = None, filename: str = None - ) -> List[AutosummaryEntry]: - """Find out what items appear in autosummary:: directives in the - given lines. - - Returns a list of (name, toctree, template) where *name* is a name - of an object and *toctree* the :toctree: path of the corresponding - autosummary directive (relative to the root of the file name), and - *template* the value of the :template: option. *toctree* and - *template* ``None`` if the directive does not have the - corresponding options set. - """ - autosummary_re = re.compile(r'^(\s*)\.\.\s+(ms[a-z]*)?autosummary::\s*') - automodule_re = re.compile( - r'^\s*\.\.\s+automodule::\s*([A-Za-z0-9_.]+)\s*$') - module_re = re.compile( - r'^\s*\.\.\s+(current)?module::\s*([a-zA-Z0-9_.]+)\s*$') - autosummary_item_re = re.compile(r'^\s+(~?[_a-zA-Z][a-zA-Z0-9_.]*)\s*.*?') - recursive_arg_re = re.compile(r'^\s+:recursive:\s*$') - toctree_arg_re = re.compile(r'^\s+:toctree:\s*(.*?)\s*$') - template_arg_re = re.compile(r'^\s+:template:\s*(.*?)\s*$') - - documented: List[AutosummaryEntry] = [] - - recursive = False - toctree: str = None - template = None - current_module = module - in_autosummary = False - base_indent = "" - - for line in lines: - if in_autosummary: - m = recursive_arg_re.match(line) - if m: - recursive = True - continue - - m = toctree_arg_re.match(line) - if m: - toctree = m.group(1) - if filename: - toctree = os.path.join(os.path.dirname(filename), - toctree) - continue - - m = template_arg_re.match(line) - if m: - template = m.group(1).strip() - continue - - if line.strip().startswith(':'): - continue # skip options - - m = autosummary_item_re.match(line) - if m: - name = m.group(1).strip() - if name.startswith('~'): - name = name[1:] - if current_module and \ - not name.startswith(current_module + '.'): - name = "%s.%s" % (current_module, name) - documented.append(AutosummaryEntry(name, toctree, template, recursive)) - continue - - if not line.strip() or line.startswith(base_indent + " "): - continue - - in_autosummary = False - - m = autosummary_re.match(line) - if m: - in_autosummary = True - base_indent = m.group(1) - recursive = False - toctree = None - template = None - continue - - m = automodule_re.search(line) - if m: - current_module = m.group(1).strip() - # recurse into the automodule docstring - documented.extend(find_autosummary_in_docstring( - current_module, filename=filename)) - continue - - m = module_re.match(line) - if m: - current_module = m.group(2) - continue - - return documented - - -def get_parser() -> argparse.ArgumentParser: - parser = argparse.ArgumentParser( - usage='%(prog)s [OPTIONS] ...', - epilog=__('For more information, visit .'), - description=__(""" -Generate ReStructuredText using autosummary directives. - -sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates -the reStructuredText files from the autosummary directives contained in the -given input files. - -The format of the autosummary directive is documented in the -``sphinx.ext.autosummary`` Python module and can be read using:: - - pydoc sphinx.ext.autosummary -""")) - - parser.add_argument('--version', action='version', dest='show_version', - version='%%(prog)s %s' % __display_version__) - - parser.add_argument('source_file', nargs='+', - help=__('source files to generate rST files for')) - - parser.add_argument('-o', '--output-dir', action='store', - dest='output_dir', - help=__('directory to place all output in')) - parser.add_argument('-s', '--suffix', action='store', dest='suffix', - default='rst', - help=__('default suffix for files (default: ' - '%(default)s)')) - parser.add_argument('-t', '--templates', action='store', dest='templates', - default=None, - help=__('custom template directory (default: ' - '%(default)s)')) - parser.add_argument('-i', '--imported-members', action='store_true', - dest='imported_members', default=False, - help=__('document imported members (default: ' - '%(default)s)')) - parser.add_argument('-a', '--respect-module-all', action='store_true', - dest='respect_module_all', default=False, - help=__('document exactly the members in module __all__ attribute. ' - '(default: %(default)s)')) - - return parser - - -def main(argv: List[str] = sys.argv[1:]) -> None: - sphinx.locale.setlocale(locale.LC_ALL, '') - sphinx.locale.init_console(os.path.join(package_dir, 'locale'), 'sphinx') - translator, _ = sphinx.locale.init([], None) - - app = DummyApplication(translator) - logging.setup(app, sys.stdout, sys.stderr) # type: ignore - setup_documenters(app) - args = get_parser().parse_args(argv) - - if args.templates: - app.config.templates_path.append(path.abspath(args.templates)) - app.config.autosummary_ignore_module_all = not args.respect_module_all # type: ignore - - generate_autosummary_docs(args.source_file, args.output_dir, - '.' + args.suffix, - imported_members=args.imported_members, - app=app) - - -if __name__ == '__main__': - main() diff --git a/docs/mindformers/docs/_ext/overwriteobjectiondirective.txt b/docs/mindformers/docs/_ext/overwriteobjectiondirective.txt deleted file mode 100644 index 8a58bf7119..0000000000 --- a/docs/mindformers/docs/_ext/overwriteobjectiondirective.txt +++ /dev/null @@ -1,368 +0,0 @@ -""" - sphinx.directives - ~~~~~~~~~~~~~~~~~ - - Handlers for additional ReST directives. - - :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. - :license: BSD, see LICENSE for details. -""" - -import re -import inspect -import importlib -from typing import TYPE_CHECKING, Any, Dict, Generic, List, Tuple, TypeVar, cast - -from docutils import nodes -from docutils.nodes import Node -from docutils.parsers.rst import directives, roles - -from sphinx import addnodes -from sphinx.addnodes import desc_signature -from sphinx.deprecation import RemovedInSphinx50Warning, deprecated_alias -from sphinx.util import docutils, logging -from sphinx.util.docfields import DocFieldTransformer, Field, TypedField -from sphinx.util.docutils import SphinxDirective -from sphinx.util.typing import OptionSpec - -if TYPE_CHECKING: - from sphinx.application import Sphinx - - -# RE to strip backslash escapes -nl_escape_re = re.compile(r'\\\n') -strip_backslash_re = re.compile(r'\\(.)') - -T = TypeVar('T') -logger = logging.getLogger(__name__) - -def optional_int(argument: str) -> int: - """ - Check for an integer argument or None value; raise ``ValueError`` if not. - """ - if argument is None: - return None - else: - value = int(argument) - if value < 0: - raise ValueError('negative value; must be positive or zero') - return value - -def get_api(fullname): - try: - module_name, api_name= ".".join(fullname.split('.')[:-1]), fullname.split('.')[-1] - module_import = importlib.import_module(module_name) - except ModuleNotFoundError: - module_name, api_name = ".".join(fullname.split('.')[:-2]), ".".join(fullname.split('.')[-2:]) - module_import = importlib.import_module(module_name) - api = eval(f"module_import.{api_name}") - return api - -def get_example(name: str): - try: - api_doc = inspect.getdoc(get_api(name)) - example_str = re.findall(r'Examples:\n([\w\W]*?)(\n\n|$)', api_doc) - if not example_str: - return [] - example_str = re.sub(r'\n\s+', r'\n', example_str[0][0]) - example_str = example_str.strip() - example_list = example_str.split('\n') - return ["", "**样例:**", ""] + example_list + [""] - except: - return [] - -def get_platforms(name: str): - try: - api_doc = inspect.getdoc(get_api(name)) - example_str = re.findall(r'Supported Platforms:\n\s+(.*?)\n\n', api_doc) - if not example_str: - example_str_leak = re.findall(r'Supported Platforms:\n\s+(.*)', api_doc) - if example_str_leak: - example_str = example_str_leak[0].strip() - example_list = example_str.split('\n') - example_list = [' ' + example_list[0]] - return ["", "支持平台:"] + example_list + [""] - return [] - example_str = example_str[0].strip() - example_list = example_str.split('\n') - example_list = [' ' + example_list[0]] - return ["", "支持平台:"] + example_list + [""] - except: - return [] - -class ObjectDescription(SphinxDirective, Generic[T]): - """ - Directive to describe a class, function or similar object. Not used - directly, but subclassed (in domain-specific directives) to add custom - behavior. - """ - - has_content = True - required_arguments = 1 - optional_arguments = 0 - final_argument_whitespace = True - option_spec: OptionSpec = { - 'noindex': directives.flag, - } # type: Dict[str, DirectiveOption] - - # types of doc fields that this directive handles, see sphinx.util.docfields - doc_field_types: List[Field] = [] - domain: str = None - objtype: str = None - indexnode: addnodes.index = None - - # Warning: this might be removed in future version. Don't touch this from extensions. - _doc_field_type_map = {} # type: Dict[str, Tuple[Field, bool]] - - def get_field_type_map(self) -> Dict[str, Tuple[Field, bool]]: - if self._doc_field_type_map == {}: - self._doc_field_type_map = {} - for field in self.doc_field_types: - for name in field.names: - self._doc_field_type_map[name] = (field, False) - - if field.is_typed: - typed_field = cast(TypedField, field) - for name in typed_field.typenames: - self._doc_field_type_map[name] = (field, True) - - return self._doc_field_type_map - - def get_signatures(self) -> List[str]: - """ - Retrieve the signatures to document from the directive arguments. By - default, signatures are given as arguments, one per line. - - Backslash-escaping of newlines is supported. - """ - lines = nl_escape_re.sub('', self.arguments[0]).split('\n') - if self.config.strip_signature_backslash: - # remove backslashes to support (dummy) escapes; helps Vim highlighting - return [strip_backslash_re.sub(r'\1', line.strip()) for line in lines] - else: - return [line.strip() for line in lines] - - def handle_signature(self, sig: str, signode: desc_signature) -> Any: - """ - Parse the signature *sig* into individual nodes and append them to - *signode*. If ValueError is raised, parsing is aborted and the whole - *sig* is put into a single desc_name node. - - The return value should be a value that identifies the object. It is - passed to :meth:`add_target_and_index()` unchanged, and otherwise only - used to skip duplicates. - """ - raise ValueError - - def add_target_and_index(self, name: Any, sig: str, signode: desc_signature) -> None: - """ - Add cross-reference IDs and entries to self.indexnode, if applicable. - - *name* is whatever :meth:`handle_signature()` returned. - """ - return # do nothing by default - - def before_content(self) -> None: - """ - Called before parsing content. Used to set information about the current - directive context on the build environment. - """ - pass - - def transform_content(self, contentnode: addnodes.desc_content) -> None: - """ - Called after creating the content through nested parsing, - but before the ``object-description-transform`` event is emitted, - and before the info-fields are transformed. - Can be used to manipulate the content. - """ - pass - - def after_content(self) -> None: - """ - Called after parsing content. Used to reset information about the - current directive context on the build environment. - """ - pass - - def check_class_end(self, content): - for i in content: - if not i.startswith('.. include::') and i != "\n" and i != "": - return False - return True - - def extend_items(self, rst_file, start_num, num): - ls = [] - for i in range(1, num+1): - ls.append((rst_file, start_num+i)) - return ls - - def run(self) -> List[Node]: - """ - Main directive entry function, called by docutils upon encountering the - directive. - - This directive is meant to be quite easily subclassable, so it delegates - to several additional methods. What it does: - - * find out if called as a domain-specific directive, set self.domain - * create a `desc` node to fit all description inside - * parse standard options, currently `noindex` - * create an index node if needed as self.indexnode - * parse all given signatures (as returned by self.get_signatures()) - using self.handle_signature(), which should either return a name - or raise ValueError - * add index entries using self.add_target_and_index() - * parse the content and handle doc fields in it - """ - if ':' in self.name: - self.domain, self.objtype = self.name.split(':', 1) - else: - self.domain, self.objtype = '', self.name - self.indexnode = addnodes.index(entries=[]) - - node = addnodes.desc() - node.document = self.state.document - node['domain'] = self.domain - # 'desctype' is a backwards compatible attribute - node['objtype'] = node['desctype'] = self.objtype - node['noindex'] = noindex = ('noindex' in self.options) - if self.domain: - node['classes'].append(self.domain) - node['classes'].append(node['objtype']) - - self.names: List[T] = [] - signatures = self.get_signatures() - for sig in signatures: - # add a signature node for each signature in the current unit - # and add a reference target for it - signode = addnodes.desc_signature(sig, '') - self.set_source_info(signode) - node.append(signode) - try: - # name can also be a tuple, e.g. (classname, objname); - # this is strictly domain-specific (i.e. no assumptions may - # be made in this base class) - name = self.handle_signature(sig, signode) - except ValueError: - # signature parsing failed - signode.clear() - signode += addnodes.desc_name(sig, sig) - continue # we don't want an index entry here - if name not in self.names: - self.names.append(name) - if not noindex: - # only add target and index entry if this is the first - # description of the object with this name in this desc block - self.add_target_and_index(name, sig, signode) - - contentnode = addnodes.desc_content() - node.append(contentnode) - if self.names: - # needed for association of version{added,changed} directives - self.env.temp_data['object'] = self.names[0] - self.before_content() - try: - example = get_example(self.names[0][0]) - platforms = get_platforms(self.names[0][0]) - except Exception as e: - example = '' - platforms = '' - logger.warning(f'Error API names in {self.arguments[0]}.') - logger.warning(f'{e}') - extra = platforms + example - if extra: - if self.objtype == "method": - self.content.data.extend(extra) - else: - index_num = 0 - for num, i in enumerate(self.content.data): - if i.startswith('.. py:method::') or self.check_class_end(self.content.data[num:]): - index_num = num - break - if index_num: - count = len(self.content.data) - for i in extra: - self.content.data.insert(index_num-count, i) - else: - self.content.data.extend(extra) - try: - self.content.items.extend(self.extend_items(self.content.items[0][0], self.content.items[-1][1], len(extra))) - except Exception as e: - logger.warning(f'{e}') - self.state.nested_parse(self.content, self.content_offset, contentnode) - self.transform_content(contentnode) - self.env.app.emit('object-description-transform', - self.domain, self.objtype, contentnode) - DocFieldTransformer(self).transform_all(contentnode) - self.env.temp_data['object'] = None - self.after_content() - return [self.indexnode, node] - - -class DefaultRole(SphinxDirective): - """ - Set the default interpreted text role. Overridden from docutils. - """ - - optional_arguments = 1 - final_argument_whitespace = False - - def run(self) -> List[Node]: - if not self.arguments: - docutils.unregister_role('') - return [] - role_name = self.arguments[0] - role, messages = roles.role(role_name, self.state_machine.language, - self.lineno, self.state.reporter) - if role: - docutils.register_role('', role) - self.env.temp_data['default_role'] = role_name - else: - literal_block = nodes.literal_block(self.block_text, self.block_text) - reporter = self.state.reporter - error = reporter.error('Unknown interpreted text role "%s".' % role_name, - literal_block, line=self.lineno) - messages += [error] - - return cast(List[nodes.Node], messages) - - -class DefaultDomain(SphinxDirective): - """ - Directive to (re-)set the default domain for this source file. - """ - - has_content = False - required_arguments = 1 - optional_arguments = 0 - final_argument_whitespace = False - option_spec = {} # type: Dict - - def run(self) -> List[Node]: - domain_name = self.arguments[0].lower() - # if domain_name not in env.domains: - # # try searching by label - # for domain in env.domains.values(): - # if domain.label.lower() == domain_name: - # domain_name = domain.name - # break - self.env.temp_data['default_domain'] = self.env.domains.get(domain_name) - return [] - -def setup(app: "Sphinx") -> Dict[str, Any]: - app.add_config_value("strip_signature_backslash", False, 'env') - directives.register_directive('default-role', DefaultRole) - directives.register_directive('default-domain', DefaultDomain) - directives.register_directive('describe', ObjectDescription) - # new, more consistent, name - directives.register_directive('object', ObjectDescription) - - app.add_event('object-description-transform') - - return { - 'version': 'builtin', - 'parallel_read_safe': True, - 'parallel_write_safe': True, - } - diff --git a/docs/mindformers/docs/_ext/overwriteviewcode.txt b/docs/mindformers/docs/_ext/overwriteviewcode.txt deleted file mode 100644 index 172780ec56..0000000000 --- a/docs/mindformers/docs/_ext/overwriteviewcode.txt +++ /dev/null @@ -1,378 +0,0 @@ -""" - sphinx.ext.viewcode - ~~~~~~~~~~~~~~~~~~~ - - Add links to module code in Python object descriptions. - - :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. - :license: BSD, see LICENSE for details. -""" - -import posixpath -import traceback -import warnings -from os import path -from typing import Any, Dict, Generator, Iterable, Optional, Set, Tuple, cast - -from docutils import nodes -from docutils.nodes import Element, Node - -import sphinx -from sphinx import addnodes -from sphinx.application import Sphinx -from sphinx.builders import Builder -from sphinx.builders.html import StandaloneHTMLBuilder -from sphinx.deprecation import RemovedInSphinx50Warning -from sphinx.environment import BuildEnvironment -from sphinx.locale import _, __ -from sphinx.pycode import ModuleAnalyzer -from sphinx.transforms.post_transforms import SphinxPostTransform -from sphinx.util import get_full_modname, logging, status_iterator -from sphinx.util.nodes import make_refnode - - -logger = logging.getLogger(__name__) - - -OUTPUT_DIRNAME = '_modules' - - -class viewcode_anchor(Element): - """Node for viewcode anchors. - - This node will be processed in the resolving phase. - For viewcode supported builders, they will be all converted to the anchors. - For not supported builders, they will be removed. - """ - - -def _get_full_modname(app: Sphinx, modname: str, attribute: str) -> Optional[str]: - try: - return get_full_modname(modname, attribute) - except AttributeError: - # sphinx.ext.viewcode can't follow class instance attribute - # then AttributeError logging output only verbose mode. - logger.verbose('Didn\'t find %s in %s', attribute, modname) - return None - except Exception as e: - # sphinx.ext.viewcode follow python domain directives. - # because of that, if there are no real modules exists that specified - # by py:function or other directives, viewcode emits a lot of warnings. - # It should be displayed only verbose mode. - logger.verbose(traceback.format_exc().rstrip()) - logger.verbose('viewcode can\'t import %s, failed with error "%s"', modname, e) - return None - - -def is_supported_builder(builder: Builder) -> bool: - if builder.format != 'html': - return False - elif builder.name == 'singlehtml': - return False - elif builder.name.startswith('epub') and not builder.config.viewcode_enable_epub: - return False - else: - return True - - -def doctree_read(app: Sphinx, doctree: Node) -> None: - env = app.builder.env - if not hasattr(env, '_viewcode_modules'): - env._viewcode_modules = {} # type: ignore - - def has_tag(modname: str, fullname: str, docname: str, refname: str) -> bool: - entry = env._viewcode_modules.get(modname, None) # type: ignore - if entry is False: - return False - - code_tags = app.emit_firstresult('viewcode-find-source', modname) - if code_tags is None: - try: - analyzer = ModuleAnalyzer.for_module(modname) - analyzer.find_tags() - except Exception: - env._viewcode_modules[modname] = False # type: ignore - return False - - code = analyzer.code - tags = analyzer.tags - else: - code, tags = code_tags - - if entry is None or entry[0] != code: - entry = code, tags, {}, refname - env._viewcode_modules[modname] = entry # type: ignore - _, tags, used, _ = entry - if fullname in tags: - used[fullname] = docname - return True - - return False - - for objnode in list(doctree.findall(addnodes.desc)): - if objnode.get('domain') != 'py': - continue - names: Set[str] = set() - for signode in objnode: - if not isinstance(signode, addnodes.desc_signature): - continue - modname = signode.get('module') - fullname = signode.get('fullname') - try: - if fullname and modname==None: - if fullname.split('.')[-1].lower() == fullname.split('.')[-1] and fullname.split('.')[-2].lower() != fullname.split('.')[-2]: - modname = '.'.join(fullname.split('.')[:-2]) - fullname = '.'.join(fullname.split('.')[-2:]) - else: - modname = '.'.join(fullname.split('.')[:-1]) - fullname = fullname.split('.')[-1] - fullname_new = fullname - except Exception: - logger.warning(f'error_modename:{modname}') - logger.warning(f'error_fullname:{fullname}') - refname = modname - if env.config.viewcode_follow_imported_members: - new_modname = app.emit_firstresult( - 'viewcode-follow-imported', modname, fullname, - ) - if not new_modname: - new_modname = _get_full_modname(app, modname, fullname) - modname = new_modname - # logger.warning(f'new_modename:{modname}') - if not modname: - continue - # fullname = signode.get('fullname') - # if fullname and modname==None: - fullname = fullname_new - if not has_tag(modname, fullname, env.docname, refname): - continue - if fullname in names: - # only one link per name, please - continue - names.add(fullname) - pagename = posixpath.join(OUTPUT_DIRNAME, modname.replace('.', '/')) - signode += viewcode_anchor(reftarget=pagename, refid=fullname, refdoc=env.docname) - - -def env_merge_info(app: Sphinx, env: BuildEnvironment, docnames: Iterable[str], - other: BuildEnvironment) -> None: - if not hasattr(other, '_viewcode_modules'): - return - # create a _viewcode_modules dict on the main environment - if not hasattr(env, '_viewcode_modules'): - env._viewcode_modules = {} # type: ignore - # now merge in the information from the subprocess - for modname, entry in other._viewcode_modules.items(): # type: ignore - if modname not in env._viewcode_modules: # type: ignore - env._viewcode_modules[modname] = entry # type: ignore - else: - if env._viewcode_modules[modname]: # type: ignore - used = env._viewcode_modules[modname][2] # type: ignore - for fullname, docname in entry[2].items(): - if fullname not in used: - used[fullname] = docname - - -def env_purge_doc(app: Sphinx, env: BuildEnvironment, docname: str) -> None: - modules = getattr(env, '_viewcode_modules', {}) - - for modname, entry in list(modules.items()): - if entry is False: - continue - - code, tags, used, refname = entry - for fullname in list(used): - if used[fullname] == docname: - used.pop(fullname) - - if len(used) == 0: - modules.pop(modname) - - -class ViewcodeAnchorTransform(SphinxPostTransform): - """Convert or remove viewcode_anchor nodes depends on builder.""" - default_priority = 100 - - def run(self, **kwargs: Any) -> None: - if is_supported_builder(self.app.builder): - self.convert_viewcode_anchors() - else: - self.remove_viewcode_anchors() - - def convert_viewcode_anchors(self) -> None: - for node in self.document.findall(viewcode_anchor): - anchor = nodes.inline('', _('[源代码]'), classes=['viewcode-link']) - refnode = make_refnode(self.app.builder, node['refdoc'], node['reftarget'], - node['refid'], anchor) - node.replace_self(refnode) - - def remove_viewcode_anchors(self) -> None: - for node in list(self.document.findall(viewcode_anchor)): - node.parent.remove(node) - - -def missing_reference(app: Sphinx, env: BuildEnvironment, node: Element, contnode: Node - ) -> Optional[Node]: - # resolve our "viewcode" reference nodes -- they need special treatment - if node['reftype'] == 'viewcode': - warnings.warn('viewcode extension is no longer use pending_xref node. ' - 'Please update your extension.', RemovedInSphinx50Warning) - return make_refnode(app.builder, node['refdoc'], node['reftarget'], - node['refid'], contnode) - - return None - - -def get_module_filename(app: Sphinx, modname: str) -> Optional[str]: - """Get module filename for *modname*.""" - source_info = app.emit_firstresult('viewcode-find-source', modname) - if source_info: - return None - else: - try: - filename, source = ModuleAnalyzer.get_module_source(modname) - return filename - except Exception: - return None - - -def should_generate_module_page(app: Sphinx, modname: str) -> bool: - """Check generation of module page is needed.""" - module_filename = get_module_filename(app, modname) - if module_filename is None: - # Always (re-)generate module page when module filename is not found. - return True - - builder = cast(StandaloneHTMLBuilder, app.builder) - basename = modname.replace('.', '/') + builder.out_suffix - page_filename = path.join(app.outdir, '_modules/', basename) - - try: - if path.getmtime(module_filename) <= path.getmtime(page_filename): - # generation is not needed if the HTML page is newer than module file. - return False - except IOError: - pass - - return True - - -def collect_pages(app: Sphinx) -> Generator[Tuple[str, Dict[str, Any], str], None, None]: - env = app.builder.env - if not hasattr(env, '_viewcode_modules'): - return - if not is_supported_builder(app.builder): - return - highlighter = app.builder.highlighter # type: ignore - urito = app.builder.get_relative_uri - - modnames = set(env._viewcode_modules) # type: ignore - - for modname, entry in status_iterator( - sorted(env._viewcode_modules.items()), # type: ignore - __('highlighting module code... '), "blue", - len(env._viewcode_modules), # type: ignore - app.verbosity, lambda x: x[0]): - if not entry: - continue - if not should_generate_module_page(app, modname): - continue - - code, tags, used, refname = entry - # construct a page name for the highlighted source - pagename = posixpath.join(OUTPUT_DIRNAME, modname.replace('.', '/')) - # highlight the source using the builder's highlighter - if env.config.highlight_language in ('python3', 'default', 'none'): - lexer = env.config.highlight_language - else: - lexer = 'python' - highlighted = highlighter.highlight_block(code, lexer, linenos=False) - # split the code into lines - lines = highlighted.splitlines() - # split off wrap markup from the first line of the actual code - before, after = lines[0].split('
')
-        lines[0:1] = [before + '
', after]
-        # nothing to do for the last line; it always starts with 
anyway - # now that we have code lines (starting at index 1), insert anchors for - # the collected tags (HACK: this only works if the tag boundaries are - # properly nested!) - maxindex = len(lines) - 1 - for name, docname in used.items(): - type, start, end = tags[name] - backlink = urito(pagename, docname) + '#' + refname + '.' + name - lines[start] = ( - '
%s' % (name, backlink, _('[文档]')) + - lines[start]) - lines[min(end, maxindex)] += '
' - # try to find parents (for submodules) - parents = [] - parent = modname - while '.' in parent: - parent = parent.rsplit('.', 1)[0] - if parent in modnames: - parents.append({ - 'link': urito(pagename, - posixpath.join(OUTPUT_DIRNAME, parent.replace('.', '/'))), - 'title': parent}) - parents.append({'link': urito(pagename, posixpath.join(OUTPUT_DIRNAME, 'index')), - 'title': _('Module code')}) - parents.reverse() - # putting it all together - context = { - 'parents': parents, - 'title': modname, - 'body': (_('

Source code for %s

') % modname + - '\n'.join(lines)), - } - yield (pagename, context, 'page.html') - - if not modnames: - return - - html = ['\n'] - # the stack logic is needed for using nested lists for submodules - stack = [''] - for modname in sorted(modnames): - if modname.startswith(stack[-1]): - stack.append(modname + '.') - html.append('
    ') - else: - stack.pop() - while not modname.startswith(stack[-1]): - stack.pop() - html.append('
') - stack.append(modname + '.') - html.append('
  • %s
  • \n' % ( - urito(posixpath.join(OUTPUT_DIRNAME, 'index'), - posixpath.join(OUTPUT_DIRNAME, modname.replace('.', '/'))), - modname)) - html.append('' * (len(stack) - 1)) - context = { - 'title': _('Overview: module code'), - 'body': (_('

    All modules for which code is available

    ') + - ''.join(html)), - } - - yield (posixpath.join(OUTPUT_DIRNAME, 'index'), context, 'page.html') - - -def setup(app: Sphinx) -> Dict[str, Any]: - app.add_config_value('viewcode_import', None, False) - app.add_config_value('viewcode_enable_epub', False, False) - app.add_config_value('viewcode_follow_imported_members', True, False) - app.connect('doctree-read', doctree_read) - app.connect('env-merge-info', env_merge_info) - app.connect('env-purge-doc', env_purge_doc) - app.connect('html-collect-pages', collect_pages) - app.connect('missing-reference', missing_reference) - # app.add_config_value('viewcode_include_modules', [], 'env') - # app.add_config_value('viewcode_exclude_modules', [], 'env') - app.add_event('viewcode-find-source') - app.add_event('viewcode-follow-imported') - app.add_post_transform(ViewcodeAnchorTransform) - return { - 'version': sphinx.__display_version__, - 'env_version': 1, - 'parallel_read_safe': True - } diff --git a/docs/mindformers/docs/requirements.txt b/docs/mindformers/docs/requirements.txt deleted file mode 100644 index a1b6a69f6d..0000000000 --- a/docs/mindformers/docs/requirements.txt +++ /dev/null @@ -1,7 +0,0 @@ -sphinx == 4.4.0 -docutils == 0.17.1 -myst-parser == 0.18.1 -sphinx_rtd_theme == 1.0.0 -numpy -IPython -jieba diff --git a/docs/mindformers/docs/source_en/advanced_interface.md b/docs/mindformers/docs/source_en/advanced_interface.md deleted file mode 100644 index 1dc3d7f2cd..0000000000 --- a/docs/mindformers/docs/source_en/advanced_interface.md +++ /dev/null @@ -1,7 +0,0 @@ -# High-Level Interface Guide - -## AutoClass - -## Pipeline - -## Trainer \ No newline at end of file diff --git a/docs/mindformers/docs/source_en/aicc.md b/docs/mindformers/docs/source_en/aicc.md deleted file mode 100644 index c571195d89..0000000000 --- a/docs/mindformers/docs/source_en/aicc.md +++ /dev/null @@ -1 +0,0 @@ -# AICC Guide diff --git a/docs/mindformers/docs/source_en/api_register.md b/docs/mindformers/docs/source_en/api_register.md deleted file mode 100644 index 035ea3c7f9..0000000000 --- a/docs/mindformers/docs/source_en/api_register.md +++ /dev/null @@ -1,5 +0,0 @@ -# Introduction to API Registration Mechanism - -## API Component Registration Mechanism - -## API Component Build Mechanisms \ No newline at end of file diff --git a/docs/mindformers/docs/source_en/api_startup.md b/docs/mindformers/docs/source_en/api_startup.md deleted file mode 100644 index 08e60b8cda..0000000000 --- a/docs/mindformers/docs/source_en/api_startup.md +++ /dev/null @@ -1 +0,0 @@ -# Calling API Startup diff --git a/docs/mindformers/docs/source_en/conf.py b/docs/mindformers/docs/source_en/conf.py deleted file mode 100644 index dd9f30bec3..0000000000 --- a/docs/mindformers/docs/source_en/conf.py +++ /dev/null @@ -1,175 +0,0 @@ -# Configuration file for the Sphinx documentation builder. -# -# This file only contains a selection of the most common options. For a full -# list see the documentation: -# https://www.sphinx-doc.org/en/master/usage/configuration.html - -# -- Path setup -------------------------------------------------------------- - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -# -import os -import shutil -import IPython -import re -import sys -import sphinx.ext.autosummary.generate as g -from sphinx.ext import autodoc as sphinx_autodoc - -# -- Project information ----------------------------------------------------- - -project = 'MindSpore' -copyright = 'MindSpore' -author = 'MindSpore' - -# The full version, including alpha/beta/rc tags -release = 'master' - - -# -- General configuration --------------------------------------------------- - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. -myst_enable_extensions = ["dollarmath", "amsmath"] - - -myst_heading_anchors = 5 -extensions = [ - 'sphinx.ext.autodoc', - 'sphinx.ext.doctest', - 'sphinx.ext.intersphinx', - 'sphinx.ext.todo', - 'sphinx.ext.coverage', - 'sphinx.ext.napoleon', - 'sphinx.ext.viewcode', - 'myst_parser', - 'sphinx.ext.mathjax', - 'IPython.sphinxext.ipython_console_highlighting' -] - -source_suffix = { - '.rst': 'restructuredtext', - '.md': 'markdown', -} - -# Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -# This pattern also affects html_static_path and html_extra_path. -mathjax_path = 'https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/mathjax/MathJax-3.2.2/es5/tex-mml-chtml.js' - -mathjax_options = { - 'async':'async' -} - -smartquotes_action = 'De' - -exclude_patterns = [] - -pygments_style = 'sphinx' - -autodoc_inherit_docstrings = False - -# -- Options for HTML output ------------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -# -html_theme = 'sphinx_rtd_theme' - -import sphinx_rtd_theme -layout_target = os.path.join(os.path.dirname(sphinx_rtd_theme.__file__), 'layout.html') -layout_src = '../../../../resource/_static/layout.html' -if os.path.exists(layout_target): - os.remove(layout_target) -shutil.copy(layout_src, layout_target) - -# Example configuration for intersphinx: refer to the Python standard library. -intersphinx_mapping = { - 'python': ('https://docs.python.org/', '../../../../resource/python_objects.inv'), - 'numpy': ('https://docs.scipy.org/doc/numpy/', '../../../../resource/numpy_objects.inv'), -} - -# overwriteautosummary_generate add view source for api and more autosummary class availably. -# with open('../_ext/overwriteautosummary_generate.txt', 'r', encoding="utf8") as f: -# exec(f.read(), g.__dict__) - -# Modify default signatures for autodoc. -autodoc_source_path = os.path.abspath(sphinx_autodoc.__file__) -autodoc_source_re = re.compile(r'stringify_signature\(.*?\)') -get_param_func_str = r"""\ -import re -import inspect as inspect_ - -def get_param_func(func): - try: - source_code = inspect_.getsource(func) - if func.__doc__: - source_code = source_code.replace(func.__doc__, '') - all_params_str = re.findall(r"def [\w_\d\-]+\(([\S\s]*?)(\):|\) ->.*?:)", source_code) - all_params = re.sub("(self|cls)(,|, )?", '', all_params_str[0][0].replace("\n", "").replace("'", "\"")) - return all_params - except: - return '' - -def get_obj(obj): - if isinstance(obj, type): - return obj.__init__ - - return obj -""" - -with open(autodoc_source_path, "r+", encoding="utf8") as f: - code_str = f.read() - code_str = autodoc_source_re.sub('"(" + get_param_func(get_obj(self.object)) + ")"', code_str, count=0) - exec(get_param_func_str, sphinx_autodoc.__dict__) - exec(code_str, sphinx_autodoc.__dict__) - -# get params for add view source -# import json - -# if os.path.exists('../../../../tools/generate_html/version.json'): -# with open('../../../../tools/generate_html/version.json', 'r+', encoding='utf-8') as f: -# version_inf = json.load(f) -# elif os.path.exists('../../../../tools/generate_html/daily_dev.json'): -# with open('../../../../tools/generate_html/daily_dev.json', 'r+', encoding='utf-8') as f: -# version_inf = json.load(f) -# elif os.path.exists('../../../../tools/generate_html/daily.json'): -# with open('../../../../tools/generate_html/daily.json', 'r+', encoding='utf-8') as f: -# version_inf = json.load(f) - -# if os.getenv("MI_PATH").split('/')[-1]: -# copy_repo = os.getenv("MI_PATH").split('/')[-1] -# else: -# copy_repo = os.getenv("MI_PATH").split('/')[-2] - -# branch = [version_inf[i]['branch'] for i in range(len(version_inf)) if version_inf[i]['name'] == copy_repo][0] -# docs_branch = [version_inf[i]['branch'] for i in range(len(version_inf)) if version_inf[i]['name'] == 'tutorials'][0] -# cst_module_name = 'mindformers' -# repo_whl = 'mindformers' -# giturl = 'https://gitee.com/mindspore/' - -sys.path.append(os.path.abspath('../../../../resource/sphinx_ext')) -# import anchor_mod -import nbsphinx_mod - -sys.path.append(os.path.abspath('../../../../resource/search')) -import search_code - -sys.path.append(os.path.abspath('../../../../resource/custom_directives')) -from custom_directives import IncludeCodeDirective - -def setup(app): - app.add_directive('includecode', IncludeCodeDirective) - # app.add_config_value('docs_branch', '', True) - # app.add_config_value('branch', '', True) - # app.add_config_value('cst_module_name', '', True) - # app.add_config_value('copy_repo', '', True) - # app.add_config_value('giturl', '', True) - # app.add_config_value('repo_whl', '', True) - diff --git a/docs/mindformers/docs/source_en/configuration.md b/docs/mindformers/docs/source_en/configuration.md deleted file mode 100644 index bbee8bb8a7..0000000000 --- a/docs/mindformers/docs/source_en/configuration.md +++ /dev/null @@ -1 +0,0 @@ -# Configuration File Description diff --git a/docs/mindformers/docs/source_en/contribution_guide.md b/docs/mindformers/docs/source_en/contribution_guide.md deleted file mode 100644 index ffe6d1e12b..0000000000 --- a/docs/mindformers/docs/source_en/contribution_guide.md +++ /dev/null @@ -1 +0,0 @@ -# MindFormers Contribution Guide \ No newline at end of file diff --git a/docs/mindformers/docs/source_en/data_process.md b/docs/mindformers/docs/source_en/data_process.md deleted file mode 100644 index 0f2795ea65..0000000000 --- a/docs/mindformers/docs/source_en/data_process.md +++ /dev/null @@ -1 +0,0 @@ -# Data Processing diff --git a/docs/mindformers/docs/source_en/env_variable.md b/docs/mindformers/docs/source_en/env_variable.md deleted file mode 100644 index c9c1a91278..0000000000 --- a/docs/mindformers/docs/source_en/env_variable.md +++ /dev/null @@ -1 +0,0 @@ -# Description of Environment Variables diff --git a/docs/mindformers/docs/source_en/evaluation.md b/docs/mindformers/docs/source_en/evaluation.md deleted file mode 100644 index a203c1b76e..0000000000 --- a/docs/mindformers/docs/source_en/evaluation.md +++ /dev/null @@ -1,3 +0,0 @@ -# Evaluation - -## Evaluation While Training diff --git a/docs/mindformers/docs/source_en/faq_advanced_interface.md b/docs/mindformers/docs/source_en/faq_advanced_interface.md deleted file mode 100644 index 2c8ddb02b0..0000000000 --- a/docs/mindformers/docs/source_en/faq_advanced_interface.md +++ /dev/null @@ -1 +0,0 @@ -# High-Level Interface \ No newline at end of file diff --git a/docs/mindformers/docs/source_en/faq_configuration.md b/docs/mindformers/docs/source_en/faq_configuration.md deleted file mode 100644 index ae5bd78596..0000000000 --- a/docs/mindformers/docs/source_en/faq_configuration.md +++ /dev/null @@ -1 +0,0 @@ -# Configuration File \ No newline at end of file diff --git a/docs/mindformers/docs/source_en/fine_tuning.md b/docs/mindformers/docs/source_en/fine_tuning.md deleted file mode 100644 index e7e02717de..0000000000 --- a/docs/mindformers/docs/source_en/fine_tuning.md +++ /dev/null @@ -1,3 +0,0 @@ -# Fine-Tuning - -## Low-Parameter Fine-Tuning diff --git a/docs/mindformers/docs/source_en/inference.md b/docs/mindformers/docs/source_en/inference.md deleted file mode 100644 index ed26c0c74a..0000000000 --- a/docs/mindformers/docs/source_en/inference.md +++ /dev/null @@ -1,5 +0,0 @@ -# Inference - -## Text-Generation Inference - -## Chat Web \ No newline at end of file diff --git a/docs/mindformers/docs/source_en/installation.md b/docs/mindformers/docs/source_en/installation.md deleted file mode 100644 index d5ab633962..0000000000 --- a/docs/mindformers/docs/source_en/installation.md +++ /dev/null @@ -1 +0,0 @@ -# Installing MindFormers \ No newline at end of file diff --git a/docs/mindformers/docs/source_en/large_model.md b/docs/mindformers/docs/source_en/large_model.md deleted file mode 100644 index 1c04350865..0000000000 --- a/docs/mindformers/docs/source_en/large_model.md +++ /dev/null @@ -1,7 +0,0 @@ -# Large Model Development Guide - -## GPT2 Implementation from the Beginning - -## A New Example of Model Migration - -*To-be Added* \ No newline at end of file diff --git a/docs/mindformers/docs/source_en/model.md b/docs/mindformers/docs/source_en/model.md deleted file mode 100644 index e77ff28cef..0000000000 --- a/docs/mindformers/docs/source_en/model.md +++ /dev/null @@ -1 +0,0 @@ -# MindFormers Model Library diff --git a/docs/mindformers/docs/source_en/overview.md b/docs/mindformers/docs/source_en/overview.md deleted file mode 100644 index 4bba659ebc..0000000000 --- a/docs/mindformers/docs/source_en/overview.md +++ /dev/null @@ -1 +0,0 @@ -# Overview \ No newline at end of file diff --git a/docs/mindformers/docs/source_en/performance_tuning.md b/docs/mindformers/docs/source_en/performance_tuning.md deleted file mode 100644 index 4701299add..0000000000 --- a/docs/mindformers/docs/source_en/performance_tuning.md +++ /dev/null @@ -1 +0,0 @@ -# Performance Tuning \ No newline at end of file diff --git a/docs/mindformers/docs/source_en/precision_tuning.md b/docs/mindformers/docs/source_en/precision_tuning.md deleted file mode 100644 index 1e7951ab66..0000000000 --- a/docs/mindformers/docs/source_en/precision_tuning.md +++ /dev/null @@ -1 +0,0 @@ -# Precision Tuning \ No newline at end of file diff --git a/docs/mindformers/docs/source_en/source_code_startup.md b/docs/mindformers/docs/source_en/source_code_startup.md deleted file mode 100644 index 3e08f40920..0000000000 --- a/docs/mindformers/docs/source_en/source_code_startup.md +++ /dev/null @@ -1 +0,0 @@ -# Calling Source Code Startup \ No newline at end of file diff --git a/docs/mindformers/docs/source_en/training.md b/docs/mindformers/docs/source_en/training.md deleted file mode 100644 index 3e3ad225cf..0000000000 --- a/docs/mindformers/docs/source_en/training.md +++ /dev/null @@ -1,31 +0,0 @@ -# Training - -## Breakpoint Training - -### Introduction - -### Usage - -## Distributed Parallel - -### Auto-parallel - -## Pipeline Parallel Load Configuration - -## Recalculating and Selecting Recalculating Configuration - -## Training Optimization Algorithms - -### Gradient Accumulation - -### Gradient Clipping - -### Token Distribution - -### Flash Attention - -### Adaption Loss Scaling - -### Lazy Inline - -### MoE Expert Optimization \ No newline at end of file diff --git a/docs/mindformers/docs/source_en/weight_process.md b/docs/mindformers/docs/source_en/weight_process.md deleted file mode 100644 index 9e2c11c89f..0000000000 --- a/docs/mindformers/docs/source_en/weight_process.md +++ /dev/null @@ -1,7 +0,0 @@ -# Weight Processing - -## Offline Weight Conversion - -## Automatic Weight Conversion - -## Lora Weight Combination \ No newline at end of file diff --git a/docs/mindformers/docs/source_zh_cn/advanced_interface.md b/docs/mindformers/docs/source_zh_cn/advanced_interface.md deleted file mode 100644 index 20a45174ec..0000000000 --- a/docs/mindformers/docs/source_zh_cn/advanced_interface.md +++ /dev/null @@ -1,13 +0,0 @@ -# 高阶接口使用指南 - -## AutoClass - -*Mindformers提供ModelConfig、Model、Tokenzier、Processor的自动实例化功能,对应接口AutoConfig、AutoModel、AutoTokenizer、AutoProcessor* - -## Pipeline - -*MindFormers提供计pipeline推理接口,用户可以通过该接口快速体验不同任务下大模型的在线推理服务* - -## Trainer - -*MindFormers提供计Trainer接口,用户可以通过该接口快速使用预置任务和模型的训练、微调、评估、推理能力* \ No newline at end of file diff --git a/docs/mindformers/docs/source_zh_cn/aicc.md b/docs/mindformers/docs/source_zh_cn/aicc.md deleted file mode 100644 index 3b6077b38d..0000000000 --- a/docs/mindformers/docs/source_zh_cn/aicc.md +++ /dev/null @@ -1,6 +0,0 @@ -# AICC使用指南 - -*该部分主要包含两部分内容:* - -*1. 准备工作,主要涉及模型相关内容准备、存储对象服务准备以及镜像准备等* -*2. 拉起训练流程的介绍,主要涉及任务配置、各种训练方式启动以及权重切分、模型调试等* \ No newline at end of file diff --git a/docs/mindformers/docs/source_zh_cn/api_register.md b/docs/mindformers/docs/source_zh_cn/api_register.md deleted file mode 100644 index a75b5846bb..0000000000 --- a/docs/mindformers/docs/source_zh_cn/api_register.md +++ /dev/null @@ -1,9 +0,0 @@ -# API注册机制介绍 - -## API组件注册机制 - -*介绍MIndFormers中各种API的注册机制以及使用示例,开发者可以通过该方式将模块进行注册,方便其他用户使用高阶接口进行调用,可注册模块类型包括'trainer'、'pipeline'、'dataset'等* - -## API组件Build机制 - -*介绍MIndFormers中的build功能,并提供了相关案例,通过build接口可以将经过注册的模块进行实例化,对应模块使用build_trainer、build_pipeline、build_dataset等* \ No newline at end of file diff --git a/docs/mindformers/docs/source_zh_cn/api_startup.md b/docs/mindformers/docs/source_zh_cn/api_startup.md deleted file mode 100644 index 962fbb6879..0000000000 --- a/docs/mindformers/docs/source_zh_cn/api_startup.md +++ /dev/null @@ -1,3 +0,0 @@ -# 调用API启动 - -*介绍MindFormers支持的高阶接口,并提供了相关示例,包括Trainer、pipeline以及AutoClass快速入门* \ No newline at end of file diff --git a/docs/mindformers/docs/source_zh_cn/conf.py b/docs/mindformers/docs/source_zh_cn/conf.py deleted file mode 100644 index fcaa847ec4..0000000000 --- a/docs/mindformers/docs/source_zh_cn/conf.py +++ /dev/null @@ -1,155 +0,0 @@ -# Configuration file for the Sphinx documentation builder. -# -# This file only contains a selection of the most common options. For a full -# list see the documentation: -# https://www.sphinx-doc.org/en/master/usage/configuration.html - -# -- Path setup -------------------------------------------------------------- - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -# -import os -import IPython -import re -import sys - -# from sphinx import directives -# with open('../_ext/overwriteobjectiondirective.txt', 'r') as f: -# exec(f.read(), directives.__dict__) - -# from sphinx.ext import viewcode -# with open('../_ext/overwriteviewcode.txt', 'r', encoding="utf8") as f: -# exec(f.read(), viewcode.__dict__) - -from docutils import statemachine - -with open(statemachine.__file__, 'r') as g: - code = g.read().replace("assert len(self.data) == len(self.items), 'data mismatch'", "#assert len(self.data) == len(self.items), 'data mismatch'") - exec(code, statemachine.__dict__) - -from sphinx.ext import autodoc as sphinx_autodoc - -# -- Project information ----------------------------------------------------- - -project = 'MindSpore' -copyright = 'MindSpore' -author = 'MindSpore' - -# The full version, including alpha/beta/rc tags -release = 'master' - - -# -- General configuration --------------------------------------------------- - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. -myst_enable_extensions = ["dollarmath", "amsmath"] - - -myst_heading_anchors = 5 -extensions = [ - 'sphinx.ext.autodoc', - 'sphinx.ext.doctest', - 'sphinx.ext.intersphinx', - 'sphinx.ext.todo', - 'sphinx.ext.coverage', - 'sphinx.ext.napoleon', - 'sphinx.ext.viewcode', - 'myst_parser', - 'sphinx.ext.mathjax', - 'IPython.sphinxext.ipython_console_highlighting' -] - -source_suffix = { - '.rst': 'restructuredtext', - '.md': 'markdown', -} - -# Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -# This pattern also affects html_static_path and html_extra_path. -mathjax_path = 'https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/mathjax/MathJax-3.2.2/es5/tex-mml-chtml.js' - -mathjax_options = { - 'async':'async' -} - -smartquotes_action = 'De' - -exclude_patterns = [] - -pygments_style = 'sphinx' - -autodoc_inherit_docstrings = False - -# -- Options for HTML output ------------------------------------------------- - -# Reconstruction of sphinx auto generated document translation. -language = 'zh_CN' -locale_dirs = ['../../../../resource/locale/'] -gettext_compact = False - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -# -html_theme = 'sphinx_rtd_theme' - -html_search_language = 'zh' - -html_search_options = {'dict': '../../../resource/jieba.txt'} - -# Example configuration for intersphinx: refer to the Python standard library. -intersphinx_mapping = { - 'python': ('https://docs.python.org/', '../../../../resource/python_objects.inv'), - 'numpy': ('https://docs.scipy.org/doc/numpy/', '../../../../resource/numpy_objects.inv'), -} - -sys.path.append(os.path.abspath('../../../../resource/sphinx_ext')) -# import anchor_mod -import nbsphinx_mod - -# Modify default signatures for autodoc. -autodoc_source_path = os.path.abspath(sphinx_autodoc.__file__) -autodoc_source_re = re.compile(r'stringify_signature\(.*?\)') -get_param_func_str = r"""\ -import re -import inspect as inspect_ - -def get_param_func(func): - try: - source_code = inspect_.getsource(func) - if func.__doc__: - source_code = source_code.replace(func.__doc__, '') - all_params_str = re.findall(r"def [\w_\d\-]+\(([\S\s]*?)(\):|\) ->.*?:)", source_code) - all_params = re.sub("(self|cls)(,|, )?", '', all_params_str[0][0].replace("\n", "").replace("'", "\"")) - return all_params - except: - return '' - -def get_obj(obj): - if isinstance(obj, type): - return obj.__init__ - - return obj -""" - -with open(autodoc_source_path, "r+", encoding="utf8") as f: - code_str = f.read() - code_str = autodoc_source_re.sub('"(" + get_param_func(get_obj(self.object)) + ")"', code_str, count=0) - exec(get_param_func_str, sphinx_autodoc.__dict__) - exec(code_str, sphinx_autodoc.__dict__) - -sys.path.append(os.path.abspath('../../../../resource/search')) -import search_code - -sys.path.append(os.path.abspath('../../../../resource/custom_directives')) -from custom_directives import IncludeCodeDirective - -def setup(app): - app.add_directive('includecode', IncludeCodeDirective) diff --git a/docs/mindformers/docs/source_zh_cn/configuration.md b/docs/mindformers/docs/source_zh_cn/configuration.md deleted file mode 100644 index a98b62bca4..0000000000 --- a/docs/mindformers/docs/source_zh_cn/configuration.md +++ /dev/null @@ -1,5 +0,0 @@ -# 配置文件说明 - -*1. 介绍MindFormers中配置文件以及各关键字的含义,以及其对应的相关功能* - -*2. 主要介绍MindFormersConfig类,该类用于模型配置加载* \ No newline at end of file diff --git a/docs/mindformers/docs/source_zh_cn/data_process.md b/docs/mindformers/docs/source_zh_cn/data_process.md deleted file mode 100644 index 6539995807..0000000000 --- a/docs/mindformers/docs/source_zh_cn/data_process.md +++ /dev/null @@ -1,3 +0,0 @@ -# 数据处理 - -*内容待补充* \ No newline at end of file diff --git a/docs/mindformers/docs/source_zh_cn/env_variable.md b/docs/mindformers/docs/source_zh_cn/env_variable.md deleted file mode 100644 index f87b3faa63..0000000000 --- a/docs/mindformers/docs/source_zh_cn/env_variable.md +++ /dev/null @@ -1,3 +0,0 @@ -# 环境变量说明 - -*介绍与MindFormers相关系统环境变量的功能,并提供MindSpore相关环境变量的链接* \ No newline at end of file diff --git a/docs/mindformers/docs/source_zh_cn/evaluation.md b/docs/mindformers/docs/source_zh_cn/evaluation.md deleted file mode 100644 index 32680d685a..0000000000 --- a/docs/mindformers/docs/source_zh_cn/evaluation.md +++ /dev/null @@ -1,5 +0,0 @@ -# 评估 - -## 边训边评估 - -*目前分布式训练和推理需要权重和分布式策略匹配,因此Mindformers提供权重转换功能在训练过程中进行评估的流程方法,以及run_mindformer、Trainer启用使用说明* \ No newline at end of file diff --git a/docs/mindformers/docs/source_zh_cn/faq_advanced_interface.md b/docs/mindformers/docs/source_zh_cn/faq_advanced_interface.md deleted file mode 100644 index bf91b16eb5..0000000000 --- a/docs/mindformers/docs/source_zh_cn/faq_advanced_interface.md +++ /dev/null @@ -1 +0,0 @@ -# 高阶接口 \ No newline at end of file diff --git a/docs/mindformers/docs/source_zh_cn/faq_configuration.md b/docs/mindformers/docs/source_zh_cn/faq_configuration.md deleted file mode 100644 index 050731aea7..0000000000 --- a/docs/mindformers/docs/source_zh_cn/faq_configuration.md +++ /dev/null @@ -1 +0,0 @@ -# 配置文件 \ No newline at end of file diff --git a/docs/mindformers/docs/source_zh_cn/fine_tuning.md b/docs/mindformers/docs/source_zh_cn/fine_tuning.md deleted file mode 100644 index 487d8ce3c9..0000000000 --- a/docs/mindformers/docs/source_zh_cn/fine_tuning.md +++ /dev/null @@ -1,5 +0,0 @@ -# 微调特性 - -## 低参微调 - -*MindPet是属于Mindspore领域的微调算法套件,该部分提供了Lora和P-Tuning v2的使用示例* \ No newline at end of file diff --git a/docs/mindformers/docs/source_zh_cn/inference.md b/docs/mindformers/docs/source_zh_cn/inference.md deleted file mode 100644 index c3db8b4069..0000000000 --- a/docs/mindformers/docs/source_zh_cn/inference.md +++ /dev/null @@ -1,9 +0,0 @@ -# 推理特性 - -## 文本生成推理 - -*Mindformers支持多种文本生成推理方式,该部分提供了相关使用说明,主要包括增量推理、Batch推理、流式推理以及分布式推理* - -## Chat Web - -*Mindformers支持通过网页应用进行推理对话的功能,当前支持启动单卡和多卡服务,该部分提供了详细的使用案例来帮助用户实现大模型服务化* \ No newline at end of file diff --git a/docs/mindformers/docs/source_zh_cn/installation.md b/docs/mindformers/docs/source_zh_cn/installation.md deleted file mode 100644 index e8f5c30844..0000000000 --- a/docs/mindformers/docs/source_zh_cn/installation.md +++ /dev/null @@ -1,5 +0,0 @@ -# 安装MindFormers - -*1. 版本配套:介绍MindFormers的软硬件配套版本,当前主要配套内容包括硬件型号、MindFormers、MindPet、MindSpore、CANN、驱动固件、镜像链接等* - -*2. 安装方式:提供MindFormers安装方式,当前支持Linux源码编译方式安装* \ No newline at end of file diff --git a/docs/mindformers/docs/source_zh_cn/large_model.md b/docs/mindformers/docs/source_zh_cn/large_model.md deleted file mode 100644 index 4594ada2f7..0000000000 --- a/docs/mindformers/docs/source_zh_cn/large_model.md +++ /dev/null @@ -1,9 +0,0 @@ -# 大模型开发指南 - -## GPT2从头开始实现 - -*介绍如何从零开始开发一个自定义大预言模型,这里以GPT2为例介绍了模型构建及注册、数据集构建及注册、Task构建与注册以及模型训练和推理实现* - -## 新的模型迁移示例 - -*待添加* \ No newline at end of file diff --git a/docs/mindformers/docs/source_zh_cn/model.md b/docs/mindformers/docs/source_zh_cn/model.md deleted file mode 100644 index fa12d5144c..0000000000 --- a/docs/mindformers/docs/source_zh_cn/model.md +++ /dev/null @@ -1,5 +0,0 @@ -# MindFormers模型库 - -*1. 根据模型所支持的不同任务类型,通过表格列出模型评估相关内容(包括模型性能),主要包括模型名称、模型规模、数据集、评估指标、评估得分以及配置文件* - -*2. LLM大模型能力支持一览,通过表格列出模型对各种特性的适配情况,可以通过点击模型名链接到模型文档,主要特性包括低参微调、边训边评、Flash Attention、并行推理、流式推理等* \ No newline at end of file diff --git a/docs/mindformers/docs/source_zh_cn/overview.md b/docs/mindformers/docs/source_zh_cn/overview.md deleted file mode 100644 index fcdc997a89..0000000000 --- a/docs/mindformers/docs/source_zh_cn/overview.md +++ /dev/null @@ -1,3 +0,0 @@ -# MindFormers概览 - -*MindFormers整体架构图,对架构图中各模块进行总体说明* \ No newline at end of file diff --git a/docs/mindformers/docs/source_zh_cn/performance_tuning.md b/docs/mindformers/docs/source_zh_cn/performance_tuning.md deleted file mode 100644 index 46d15b2644..0000000000 --- a/docs/mindformers/docs/source_zh_cn/performance_tuning.md +++ /dev/null @@ -1 +0,0 @@ -# 性能调优 \ No newline at end of file diff --git a/docs/mindformers/docs/source_zh_cn/precision_tuning.md b/docs/mindformers/docs/source_zh_cn/precision_tuning.md deleted file mode 100644 index 799b03558e..0000000000 --- a/docs/mindformers/docs/source_zh_cn/precision_tuning.md +++ /dev/null @@ -1 +0,0 @@ -# 精度调优 \ No newline at end of file diff --git a/docs/mindformers/docs/source_zh_cn/source_code_startup.md b/docs/mindformers/docs/source_zh_cn/source_code_startup.md deleted file mode 100644 index 33fd746f91..0000000000 --- a/docs/mindformers/docs/source_zh_cn/source_code_startup.md +++ /dev/null @@ -1,3 +0,0 @@ -# 调用源码启动 - -*需要拉取MindFormers仓库代码,介绍MindFormers通过MindSpore原生msrun分布式启动特性开发的模型训推脚本,使用该脚本可以快速拉起单机多卡、多机多卡等任务* \ No newline at end of file diff --git a/docs/mindformers/docs/source_zh_cn/training.md b/docs/mindformers/docs/source_zh_cn/training.md deleted file mode 100644 index 45ccdcd5d8..0000000000 --- a/docs/mindformers/docs/source_zh_cn/training.md +++ /dev/null @@ -1,45 +0,0 @@ -# 训练特性 - -## 断点续训 - -### 介绍 - -*Mindformers支持step级断点续训,在训练过程中如果遇到意外情况导致训练中断,可以使用断点续训的方式恢复之前的状态继续训练* - -### 使用 - -*介绍断点续训在脚本、Trainer高阶接口等场景中的使用,并提供了使用案例* - -## 分布式并行 - -*分布式并行介绍及使用说明* - -### 自动并行 - -*该特性为实验特性,介绍了当前版本支持的自动并行算法以及使用说明* - -## 流水线并行的负载配置 - -*Mindformers提供流水线并行负载配置介绍和使用说明* - -## 重计算与选择重计算配置 - -*Mindformers重计算配置介绍和使用说明* - -## 训练优化算法 - -*主要介绍了特性的功能以及如何通过配置文件在模型中使能特性* - -### 梯度累积 - -### 梯度裁剪 - -### Token分布 - -### Flash Attention - -### Adaption loss scaling - -### Lazy Inline - -### MoE冷热门专家优化 \ No newline at end of file diff --git a/docs/mindformers/docs/source_zh_cn/weight_process.md b/docs/mindformers/docs/source_zh_cn/weight_process.md deleted file mode 100644 index 80d17de4eb..0000000000 --- a/docs/mindformers/docs/source_zh_cn/weight_process.md +++ /dev/null @@ -1,13 +0,0 @@ -# 权重处理 - -## 离线权重转换 - -*介绍了离线转换方式,可通过脚本以及高阶接口使用* - -## 自动权重转换 - -*介绍了自动转换功能相关参数和适用场景,并提供了多个使用案例,用户在使用过程中遇到与权重相关的问题都可参考案例进行解决* - -## Lora权重合并 - -*介绍了低参微调的原理和使用说明,通常在进行低参微调后需要将微调参数和模型预训练参数进行合并* \ No newline at end of file diff --git a/docs/mindspore/source_en/mindformers/appendix/conf_files.md b/docs/mindspore/source_en/mindformers/appendix/conf_files.md new file mode 100644 index 0000000000..e42751fde6 --- /dev/null +++ b/docs/mindspore/source_en/mindformers/appendix/conf_files.md @@ -0,0 +1 @@ +# Configuration File Descriptions \ No newline at end of file diff --git a/docs/mindspore/source_en/mindformers/appendix/env_variables.md b/docs/mindspore/source_en/mindformers/appendix/env_variables.md new file mode 100644 index 0000000000..f1f98aec89 --- /dev/null +++ b/docs/mindspore/source_en/mindformers/appendix/env_variables.md @@ -0,0 +1 @@ +# Environment Variable Descriptions \ No newline at end of file diff --git a/docs/mindspore/source_en/mindformers/faq/func_related.md b/docs/mindspore/source_en/mindformers/faq/func_related.md new file mode 100644 index 0000000000..3bcbbfa161 --- /dev/null +++ b/docs/mindspore/source_en/mindformers/faq/func_related.md @@ -0,0 +1 @@ +# Function_releated \ No newline at end of file diff --git a/docs/mindspore/source_en/mindformers/faq/mindformers_contribution.md b/docs/mindspore/source_en/mindformers/faq/mindformers_contribution.md new file mode 100644 index 0000000000..44a90b5775 --- /dev/null +++ b/docs/mindspore/source_en/mindformers/faq/mindformers_contribution.md @@ -0,0 +1 @@ +# MindFormers Contribution Guidelines diff --git a/docs/mindspore/source_en/mindformers/faq/model_related.md b/docs/mindspore/source_en/mindformers/faq/model_related.md new file mode 100644 index 0000000000..d2a7293985 --- /dev/null +++ b/docs/mindspore/source_en/mindformers/faq/model_related.md @@ -0,0 +1 @@ +# Model-Releated \ No newline at end of file diff --git a/docs/mindspore/source_en/mindformers/faq/openmind_contribution.md b/docs/mindspore/source_en/mindformers/faq/openmind_contribution.md new file mode 100644 index 0000000000..9362378830 --- /dev/null +++ b/docs/mindspore/source_en/mindformers/faq/openmind_contribution.md @@ -0,0 +1 @@ +# openMind Contribution Guidelines \ No newline at end of file diff --git a/docs/mindspore/source_en/mindformers/function/dataset.md b/docs/mindspore/source_en/mindformers/function/dataset.md new file mode 100644 index 0000000000..20b39a01e4 --- /dev/null +++ b/docs/mindspore/source_en/mindformers/function/dataset.md @@ -0,0 +1 @@ +# Dataset \ No newline at end of file diff --git a/docs/mindspore/source_en/mindformers/function/distributed_parallel.md b/docs/mindspore/source_en/mindformers/function/distributed_parallel.md new file mode 100644 index 0000000000..0fa56b4e2c --- /dev/null +++ b/docs/mindspore/source_en/mindformers/function/distributed_parallel.md @@ -0,0 +1 @@ +# Distributed Parallel \ No newline at end of file diff --git a/docs/mindspore/source_en/mindformers/function/res_training.md b/docs/mindspore/source_en/mindformers/function/res_training.md new file mode 100644 index 0000000000..d824a9f774 --- /dev/null +++ b/docs/mindspore/source_en/mindformers/function/res_training.md @@ -0,0 +1 @@ +# Resumable Training After Breakpoint \ No newline at end of file diff --git a/docs/mindspore/source_en/mindformers/function/weight_conversion.md b/docs/mindspore/source_en/mindformers/function/weight_conversion.md new file mode 100644 index 0000000000..ff6ee09222 --- /dev/null +++ b/docs/mindspore/source_en/mindformers/function/weight_conversion.md @@ -0,0 +1 @@ +# Weight Conversion \ No newline at end of file diff --git a/docs/mindformers/docs/source_en/index.rst b/docs/mindspore/source_en/mindformers/index.rst similarity index 31% rename from docs/mindformers/docs/source_en/index.rst rename to docs/mindspore/source_en/mindformers/index.rst index 7843352b78..9e817d0cd6 100644 --- a/docs/mindformers/docs/source_en/index.rst +++ b/docs/mindspore/source_en/mindformers/index.rst @@ -1,77 +1,74 @@ -MindFormers -============================ - -*1. 介绍MindFormers的主要功能和特点* - -*2. 展示所有文档的目录* +Large Model Specialization +=========================== .. toctree:: :glob: :maxdepth: 1 - :caption: Beginner + :caption: Start - overview - model + start/overview + start/models .. toctree:: :glob: :maxdepth: 1 - :caption: Install + :caption: Quick Start - installation + quick_start/install + quick_start/source_code_start .. toctree:: :glob: :maxdepth: 1 - :caption: Quick Start + :caption: Usage Tutorials - source_code_startup - api_startup + usage/dev_migration + usage/pre_training + usage/sft_tuning + usage/lora_tuning + usage/evaluation + usage/inference + usage/mindie_deployment + usage/quantization .. toctree:: :glob: :maxdepth: 1 - :caption: Practice Guide + :caption: Function Description - env_variable - configuration - api_register - advanced_interface - large_model - aicc + function/weight_conversion + function/distributed_parallel + function/dataset + function/res_training .. toctree:: :glob: :maxdepth: 1 - :caption: Characteristics + :caption: Precision Optimization - data_process - weight_process - training - fine_tuning - inference - evaluation + acc_optimize .. toctree:: :glob: :maxdepth: 1 - :caption: Debugging and Tuning + :caption: Performance Optimization - precision_tuning - performance_tuning + perf_optimize .. toctree:: :glob: :maxdepth: 1 - :caption: API + :caption: Appendix - *列举说明MindFormers中所有对外接口及说明* + appendix/env_variables + appendix/conf_files .. toctree:: :glob: :maxdepth: 1 :caption: FAQ - faq_configuration - faq_advanced_interface - contribution_guide \ No newline at end of file + faq/model_related + faq/func_releated + faq/mindformers_contribution + faq/openmind_contribution \ No newline at end of file diff --git a/docs/mindspore/source_en/mindformers/quick_start/install.md b/docs/mindspore/source_en/mindformers/quick_start/install.md new file mode 100644 index 0000000000..f34d65bd73 --- /dev/null +++ b/docs/mindspore/source_en/mindformers/quick_start/install.md @@ -0,0 +1 @@ +# Installation \ No newline at end of file diff --git a/docs/mindspore/source_en/mindformers/quick_start/source_code_start.md b/docs/mindspore/source_en/mindformers/quick_start/source_code_start.md new file mode 100644 index 0000000000..b00438c585 --- /dev/null +++ b/docs/mindspore/source_en/mindformers/quick_start/source_code_start.md @@ -0,0 +1 @@ +# Calling Source Code to Start \ No newline at end of file diff --git a/docs/mindspore/source_en/mindformers/start/models.md b/docs/mindspore/source_en/mindformers/start/models.md new file mode 100644 index 0000000000..e89b5f2b2b --- /dev/null +++ b/docs/mindspore/source_en/mindformers/start/models.md @@ -0,0 +1 @@ +# Models \ No newline at end of file diff --git a/docs/mindspore/source_en/mindformers/start/overview.md b/docs/mindspore/source_en/mindformers/start/overview.md new file mode 100644 index 0000000000..07dd0c5c77 --- /dev/null +++ b/docs/mindspore/source_en/mindformers/start/overview.md @@ -0,0 +1 @@ +# Overview diff --git a/docs/mindspore/source_en/mindformers/usage/dev_migration.md b/docs/mindspore/source_en/mindformers/usage/dev_migration.md new file mode 100644 index 0000000000..93b1ea36cf --- /dev/null +++ b/docs/mindspore/source_en/mindformers/usage/dev_migration.md @@ -0,0 +1 @@ +# Development Migration \ No newline at end of file diff --git a/docs/mindspore/source_en/mindformers/usage/evaluation.md b/docs/mindspore/source_en/mindformers/usage/evaluation.md new file mode 100644 index 0000000000..5f5eb37b83 --- /dev/null +++ b/docs/mindspore/source_en/mindformers/usage/evaluation.md @@ -0,0 +1 @@ +# Evaluation \ No newline at end of file diff --git a/docs/mindspore/source_en/mindformers/usage/inference.md b/docs/mindspore/source_en/mindformers/usage/inference.md new file mode 100644 index 0000000000..c41f3e0a6c --- /dev/null +++ b/docs/mindspore/source_en/mindformers/usage/inference.md @@ -0,0 +1 @@ +# Inference \ No newline at end of file diff --git a/docs/mindspore/source_en/mindformers/usage/lora_tuning.md b/docs/mindspore/source_en/mindformers/usage/lora_tuning.md new file mode 100644 index 0000000000..93f77566ba --- /dev/null +++ b/docs/mindspore/source_en/mindformers/usage/lora_tuning.md @@ -0,0 +1 @@ +# LoRA Low Parameter Fine-Tuning \ No newline at end of file diff --git a/docs/mindspore/source_en/mindformers/usage/mindie_deployment.md b/docs/mindspore/source_en/mindformers/usage/mindie_deployment.md new file mode 100644 index 0000000000..f1f2855520 --- /dev/null +++ b/docs/mindspore/source_en/mindformers/usage/mindie_deployment.md @@ -0,0 +1 @@ +# MindIE Service Deployment \ No newline at end of file diff --git a/docs/mindspore/source_en/mindformers/usage/pre_training.md b/docs/mindspore/source_en/mindformers/usage/pre_training.md new file mode 100644 index 0000000000..4d266d1dfc --- /dev/null +++ b/docs/mindspore/source_en/mindformers/usage/pre_training.md @@ -0,0 +1 @@ +# Pre-training \ No newline at end of file diff --git a/docs/mindspore/source_en/mindformers/usage/quantization.md b/docs/mindspore/source_en/mindformers/usage/quantization.md new file mode 100644 index 0000000000..95849fce00 --- /dev/null +++ b/docs/mindspore/source_en/mindformers/usage/quantization.md @@ -0,0 +1 @@ +# Quantization \ No newline at end of file diff --git a/docs/mindspore/source_en/mindformers/usage/sft_tuning.md b/docs/mindspore/source_en/mindformers/usage/sft_tuning.md new file mode 100644 index 0000000000..0bdb66ab1c --- /dev/null +++ b/docs/mindspore/source_en/mindformers/usage/sft_tuning.md @@ -0,0 +1 @@ +# SFT-Tuning \ No newline at end of file diff --git a/docs/mindspore/source_zh_cn/mindformers/appendix/conf_files.md b/docs/mindspore/source_zh_cn/mindformers/appendix/conf_files.md new file mode 100644 index 0000000000..3322c36778 --- /dev/null +++ b/docs/mindspore/source_zh_cn/mindformers/appendix/conf_files.md @@ -0,0 +1 @@ +# 配置文件说明 \ No newline at end of file diff --git a/docs/mindspore/source_zh_cn/mindformers/appendix/env_variables.md b/docs/mindspore/source_zh_cn/mindformers/appendix/env_variables.md new file mode 100644 index 0000000000..0715649da5 --- /dev/null +++ b/docs/mindspore/source_zh_cn/mindformers/appendix/env_variables.md @@ -0,0 +1 @@ +# 环境变量说明 \ No newline at end of file diff --git a/docs/mindspore/source_zh_cn/mindformers/faq/func_related.md b/docs/mindspore/source_zh_cn/mindformers/faq/func_related.md new file mode 100644 index 0000000000..0e550c19c9 --- /dev/null +++ b/docs/mindspore/source_zh_cn/mindformers/faq/func_related.md @@ -0,0 +1 @@ +# 功能相关 \ No newline at end of file diff --git a/docs/mindformers/docs/source_zh_cn/contribution_guide.md b/docs/mindspore/source_zh_cn/mindformers/faq/mindformers_contribution.md similarity index 100% rename from docs/mindformers/docs/source_zh_cn/contribution_guide.md rename to docs/mindspore/source_zh_cn/mindformers/faq/mindformers_contribution.md diff --git a/docs/mindspore/source_zh_cn/mindformers/faq/model_related.md b/docs/mindspore/source_zh_cn/mindformers/faq/model_related.md new file mode 100644 index 0000000000..6c25235193 --- /dev/null +++ b/docs/mindspore/source_zh_cn/mindformers/faq/model_related.md @@ -0,0 +1 @@ +# 模型相关 \ No newline at end of file diff --git a/docs/mindspore/source_zh_cn/mindformers/faq/openmind_contribution.md b/docs/mindspore/source_zh_cn/mindformers/faq/openmind_contribution.md new file mode 100644 index 0000000000..90cedd9efb --- /dev/null +++ b/docs/mindspore/source_zh_cn/mindformers/faq/openmind_contribution.md @@ -0,0 +1 @@ +# openMind贡献指南 \ No newline at end of file diff --git a/docs/mindspore/source_zh_cn/mindformers/function/dataset.md b/docs/mindspore/source_zh_cn/mindformers/function/dataset.md new file mode 100644 index 0000000000..5cdc48863c --- /dev/null +++ b/docs/mindspore/source_zh_cn/mindformers/function/dataset.md @@ -0,0 +1 @@ +# 数据集 \ No newline at end of file diff --git a/docs/mindspore/source_zh_cn/mindformers/function/distributed_parallel.md b/docs/mindspore/source_zh_cn/mindformers/function/distributed_parallel.md new file mode 100644 index 0000000000..fcffdb99cd --- /dev/null +++ b/docs/mindspore/source_zh_cn/mindformers/function/distributed_parallel.md @@ -0,0 +1 @@ +# 分布式并行 \ No newline at end of file diff --git a/docs/mindspore/source_zh_cn/mindformers/function/res_training.md b/docs/mindspore/source_zh_cn/mindformers/function/res_training.md new file mode 100644 index 0000000000..36c57989b4 --- /dev/null +++ b/docs/mindspore/source_zh_cn/mindformers/function/res_training.md @@ -0,0 +1 @@ +# 断点续训功能 \ No newline at end of file diff --git a/docs/mindspore/source_zh_cn/mindformers/function/weight_conversion.md b/docs/mindspore/source_zh_cn/mindformers/function/weight_conversion.md new file mode 100644 index 0000000000..496fb02ac6 --- /dev/null +++ b/docs/mindspore/source_zh_cn/mindformers/function/weight_conversion.md @@ -0,0 +1 @@ +# 权重转换功能 \ No newline at end of file diff --git a/docs/mindformers/docs/source_zh_cn/index.rst b/docs/mindspore/source_zh_cn/mindformers/index.rst similarity index 35% rename from docs/mindformers/docs/source_zh_cn/index.rst rename to docs/mindspore/source_zh_cn/mindformers/index.rst index 81304353f6..ea4379ad4d 100644 --- a/docs/mindformers/docs/source_zh_cn/index.rst +++ b/docs/mindspore/source_zh_cn/mindformers/index.rst @@ -1,77 +1,74 @@ -MindFormers文档 -============================ - -*1. 介绍MindFormers的主要功能和特点* - -*2. 展示所有文档的目录* +大模型专项 +============== .. toctree:: :glob: :maxdepth: 1 :caption: 开始 - overview - model + start/overview + start/models .. toctree:: :glob: :maxdepth: 1 - :caption: 安装 + :caption: 快速入门 - installation + quick_start/install + quick_start/source_code_start .. toctree:: :glob: :maxdepth: 1 - :caption: 快速入门 + :caption: 使用教程 - source_code_startup - api_startup + usage/dev_migration + usage/pre_training + usage/sft_tuning + usage/lora_tuning + usage/evaluation + usage/inference + usage/mindie_deployment + usage/quantization .. toctree:: :glob: :maxdepth: 1 - :caption: 实践指南 + :caption: 功能说明 - env_variable - configuration - api_register - advanced_interface - large_model - aicc + function/weight_conversion + function/distributed_parallel + function/dataset + function/res_training .. toctree:: :glob: :maxdepth: 1 - :caption: 特性说明 + :caption: 精度调优 - data_process - weight_process - training - fine_tuning - inference - evaluation + acc_optimize .. toctree:: :glob: :maxdepth: 1 - :caption: 调试调优 + :caption: 性能调优 - precision_tuning - performance_tuning + perf_optimize .. toctree:: :glob: :maxdepth: 1 - :caption: API参考 + :caption: 附录 - *列举说明MindFormers中所有对外接口及说明* + appendix/env_variables + appendix/conf_files .. toctree:: :glob: :maxdepth: 1 :caption: FAQ - faq_configuration - faq_advanced_interface - contribution_guide \ No newline at end of file + faq/model_related + faq/func_releated + faq/mindformers_contribution + faq/openmind_contribution diff --git a/docs/mindspore/source_zh_cn/mindformers/quick_start/install.md b/docs/mindspore/source_zh_cn/mindformers/quick_start/install.md new file mode 100644 index 0000000000..b5f657d6f9 --- /dev/null +++ b/docs/mindspore/source_zh_cn/mindformers/quick_start/install.md @@ -0,0 +1 @@ +# 安装 \ No newline at end of file diff --git a/docs/mindspore/source_zh_cn/mindformers/quick_start/source_code_start.md b/docs/mindspore/source_zh_cn/mindformers/quick_start/source_code_start.md new file mode 100644 index 0000000000..abe8a09d36 --- /dev/null +++ b/docs/mindspore/source_zh_cn/mindformers/quick_start/source_code_start.md @@ -0,0 +1 @@ +# 调用源码启动 \ No newline at end of file diff --git a/docs/mindspore/source_zh_cn/mindformers/start/models.md b/docs/mindspore/source_zh_cn/mindformers/start/models.md new file mode 100644 index 0000000000..e51b16818a --- /dev/null +++ b/docs/mindspore/source_zh_cn/mindformers/start/models.md @@ -0,0 +1 @@ +# 模型库 \ No newline at end of file diff --git a/docs/mindspore/source_zh_cn/mindformers/start/overview.md b/docs/mindspore/source_zh_cn/mindformers/start/overview.md new file mode 100644 index 0000000000..3bf12917cc --- /dev/null +++ b/docs/mindspore/source_zh_cn/mindformers/start/overview.md @@ -0,0 +1 @@ +# 概览 \ No newline at end of file diff --git a/docs/mindspore/source_zh_cn/mindformers/usage/dev_migration.md b/docs/mindspore/source_zh_cn/mindformers/usage/dev_migration.md new file mode 100644 index 0000000000..ffbe483fe2 --- /dev/null +++ b/docs/mindspore/source_zh_cn/mindformers/usage/dev_migration.md @@ -0,0 +1 @@ +# 开发迁移 \ No newline at end of file diff --git a/docs/mindspore/source_zh_cn/mindformers/usage/evaluation.md b/docs/mindspore/source_zh_cn/mindformers/usage/evaluation.md new file mode 100644 index 0000000000..1030677496 --- /dev/null +++ b/docs/mindspore/source_zh_cn/mindformers/usage/evaluation.md @@ -0,0 +1 @@ +# 评测 \ No newline at end of file diff --git a/docs/mindspore/source_zh_cn/mindformers/usage/inference.md b/docs/mindspore/source_zh_cn/mindformers/usage/inference.md new file mode 100644 index 0000000000..248b824847 --- /dev/null +++ b/docs/mindspore/source_zh_cn/mindformers/usage/inference.md @@ -0,0 +1 @@ +# 推理 \ No newline at end of file diff --git a/docs/mindspore/source_zh_cn/mindformers/usage/lora_tuning.md b/docs/mindspore/source_zh_cn/mindformers/usage/lora_tuning.md new file mode 100644 index 0000000000..28c7c535da --- /dev/null +++ b/docs/mindspore/source_zh_cn/mindformers/usage/lora_tuning.md @@ -0,0 +1 @@ +# LoRA低参微调 \ No newline at end of file diff --git a/docs/mindspore/source_zh_cn/mindformers/usage/mindie_deployment.md b/docs/mindspore/source_zh_cn/mindformers/usage/mindie_deployment.md new file mode 100644 index 0000000000..f06fc2a653 --- /dev/null +++ b/docs/mindspore/source_zh_cn/mindformers/usage/mindie_deployment.md @@ -0,0 +1 @@ +# MindIE服务化部署 \ No newline at end of file diff --git a/docs/mindspore/source_zh_cn/mindformers/usage/pre_training.md b/docs/mindspore/source_zh_cn/mindformers/usage/pre_training.md new file mode 100644 index 0000000000..8b1bdd4b69 --- /dev/null +++ b/docs/mindspore/source_zh_cn/mindformers/usage/pre_training.md @@ -0,0 +1 @@ +# 预训练 \ No newline at end of file diff --git a/docs/mindspore/source_zh_cn/mindformers/usage/quantization.md b/docs/mindspore/source_zh_cn/mindformers/usage/quantization.md new file mode 100644 index 0000000000..91a6d60c33 --- /dev/null +++ b/docs/mindspore/source_zh_cn/mindformers/usage/quantization.md @@ -0,0 +1 @@ +# 量化 \ No newline at end of file diff --git a/docs/mindspore/source_zh_cn/mindformers/usage/sft_tuning.md b/docs/mindspore/source_zh_cn/mindformers/usage/sft_tuning.md new file mode 100644 index 0000000000..2a1b7483b5 --- /dev/null +++ b/docs/mindspore/source_zh_cn/mindformers/usage/sft_tuning.md @@ -0,0 +1 @@ +# SFT微调 \ No newline at end of file -- Gitee From ae3c243f7db5a817f9c7fa852e87f3d22689bb33 Mon Sep 17 00:00:00 2001 From: wangpingan2 Date: Mon, 5 Aug 2024 10:42:22 +0800 Subject: [PATCH 13/69] add lite 2.3.1 download url --- docs/lite/docs/source_en/use/downloads.md | 22 ++++++++++++++++++++ docs/lite/docs/source_zh_cn/use/downloads.md | 21 +++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/docs/lite/docs/source_en/use/downloads.md b/docs/lite/docs/source_en/use/downloads.md index 7cf7b52356..1eab782c4d 100644 --- a/docs/lite/docs/source_en/use/downloads.md +++ b/docs/lite/docs/source_en/use/downloads.md @@ -6,6 +6,28 @@ Welcome to MindSpore Lite. We provide functions such as model conversion, model The Linux-x86_64 and Linux-aarch64 target have been tested and verified on the Linux distribution versions Euleros2.0, Centos7.8 and Ubuntu18.04. +## 2.3.1 + +Inference runtime +| Module Name | Hardware Platform | Operating System | Download Links | SHA-256 | +| --- | --- | --- | --- | --- | +| Cloud-side inference runtime lib, inference jar package, benchmark tool, converter tool | CPU/GPU/Ascend | Linux-x86_64 | [mindspore-lite-2.3.1-linux-x64.tar.gz](https://ms-release.obs.cn-north-4.myhuaweicloud.com/2.3.1/MindSpore/lite/release/linux/x86_64/cloud_fusion/python37/mindspore-lite-2.3.1-linux-x64.tar.gz) | df702ba03a8a6a94a482273a2be15f1098fcaffb92ba396533b6b0896aab2292 | +| Cloud-side inference runtime lib, inference jar package, benchmark tool, converter tool | CPU/Ascend | Linux-aarch64 | [mindspore-lite-2.3.1-linux-aarch64.tar.gz](https://ms-release.obs.cn-north-4.myhuaweicloud.com/2.3.1/MindSpore/lite/release/linux/aarch64/cloud_fusion/python37/mindspore-lite-2.3.1-linux-aarch64.tar.gz) | 9ba19a675d61da90e0e4f28ad54d2750ea7dfbfbc7611f001f64d3bdf952aac5 | +| Inference/training runtime lib, inference/training aar package, Micro lib, benchmark tool | CPU/GPU | Android-aarch64 | [mindspore-lite-2.3.1-android-aarch64.tar.gz](https://ms-release.obs.cn-north-4.myhuaweicloud.com/2.3.1/MindSpore/lite/release/android/gpu/mindspore-lite-2.3.1-android-aarch64.tar.gz) | eb0c13158f06b8a17975380ad190c28882e86989895ed4193d7223d3904337b0 | +| Device-side inference/training runtime lib, inference/training jar package, Micro lib, benchmark tool, converter tool, cropper tool | CPU | Linux-x86_64 | [mindspore-lite-2.3.1-linux-x64.tar.gz](https://ms-release.obs.cn-north-4.myhuaweicloud.com/2.3.1/MindSpore/lite/release/linux/x86_64/mindspore-lite-2.3.1-linux-x64.tar.gz) | 26792aabebde4f3c9a7b779b9da9b9c7bb9b80d5411efc6571e1ef45f0839f83 | +| Device-side inference runtime lib, Micro lib, benchmark tool, converter tool | CPU | Linux-aarch64 | [mindspore-lite-2.3.1-linux-aarch64.tar.gz](https://ms-release.obs.cn-north-4.myhuaweicloud.com/2.3.1/MindSpore/lite/release/linux/aarch64/mindspore-lite-2.3.1-linux-aarch64.tar.gz) | 7eec6a578ac7c96f33e0bb026f1f9f974cafada03d1a060e3fb121dc09ccf243 | +| Inference runtime lib, Micro lib, benchmark tool, converter tool | CPU | Windows-x86_64 | [mindspore-lite-2.3.1-win-x64.zip](https://ms-release.obs.cn-north-4.myhuaweicloud.com/2.3.1/MindSpore/lite/release/windows/mindspore-lite-2.3.1-win-x64.zip) | 67f5fbba85d5b0682e228928f4cae5f48e6d6f5320a2fb10291a792e52748d03 | + +Python API wheel package +| Module Name | Hardware Platform | Operating System | Python Version | Download Links | SHA-256 | +| --- | --- | --- | --- | --- | --- | +| Cloud-side inference runtime and converter | CPU/GPU/Ascend | Linux-x86_64 | Python3.8 | [mindspore_lite-2.3.1-cp38-cp38-linux_x86_64.whl](https://ms-release.obs.cn-north-4.myhuaweicloud.com/2.3.1/MindSpore/lite/release/linux/x86_64/cloud_fusion/python38/mindspore_lite-2.3.1-cp38-cp38-linux_x86_64.whl) | 436b7afb77caeee217141cccf3a728f7b25c66f89255fc77b0801c261a4c19b5 | +| Cloud-side inference runtime and converter | CPU/Ascend | Linux-aarch64 | Python3.8 | [mindspore_lite-2.3.1-cp38-cp38-linux_aarch64.whl](https://ms-release.obs.cn-north-4.myhuaweicloud.com/2.3.1/MindSpore/lite/release/linux/aarch64/cloud_fusion/python38/mindspore_lite-2.3.1-cp38-cp38-linux_aarch64.whl) | 0f69ec441f13e0fdba6ea71fe975a84b0ceaaef2c6162a9ce9c876ec674bbd5f | +| Cloud-side inference runtime and converter | CPU/GPU/Ascend | Linux-x86_64 | Python3.9 | [mindspore_lite-2.3.1-cp39-cp39-linux_x86_64.whl](https://ms-release.obs.cn-north-4.myhuaweicloud.com/2.3.1/MindSpore/lite/release/linux/x86_64/cloud_fusion/python39/mindspore_lite-2.3.1-cp39-cp39-linux_x86_64.whl) | 13775d493c57cf7a804d9fb667c591e550620d6e633885cce61b5905ced0a624 | +| Cloud-side inference runtime and converter | CPU/Ascend | Linux-aarch64 | Python3.9 | [mindspore_lite-2.3.1-cp39-cp39-linux_aarch64.whl](https://ms-release.obs.cn-north-4.myhuaweicloud.com/2.3.1/MindSpore/lite/release/linux/aarch64/cloud_fusion/python39/mindspore_lite-2.3.1-cp39-cp39-linux_aarch64.whl) | b6007fc1df2a47367d3734ad7b4112e8a80d46f31d8f57c90520cecc0848c790 | +| Cloud-side inference runtime and converter | CPU/GPU/Ascend | Linux-x86_64 | Python3.10 | [mindspore_lite-2.3.1-cp310-cp310-linux_x86_64.whl](https://ms-release.obs.cn-north-4.myhuaweicloud.com/2.3.1/MindSpore/lite/release/linux/x86_64/cloud_fusion/python310/mindspore_lite-2.3.1-cp310-cp310-linux_x86_64.whl) | 04021504bf6c73c6284ba0bc75b2f49e04402cfc76c4d402f2d235231b456bf1 | +| Cloud-side inference runtime and converter | CPU/Ascend | Linux-aarch64 | Python3.10 | [mindspore_lite-2.3.1-cp310-cp310-linux_aarch64.whl](https://ms-release.obs.cn-north-4.myhuaweicloud.com/2.3.1/MindSpore/lite/release/linux/aarch64/cloud_fusion/python310/mindspore_lite-2.3.1-cp310-cp310-linux_aarch64.whl) | 767068f587ac25924b4ba172f47ef9a2f9bab8c6e8cedc1f7115fa1239ddc7bf | + ## 2.3.0 Inference runtime diff --git a/docs/lite/docs/source_zh_cn/use/downloads.md b/docs/lite/docs/source_zh_cn/use/downloads.md index c56fefedc6..d917d2c70b 100644 --- a/docs/lite/docs/source_zh_cn/use/downloads.md +++ b/docs/lite/docs/source_zh_cn/use/downloads.md @@ -6,6 +6,27 @@ 其中Linux-x86_64、Linux-aarch64的包已在Linux发行版Euleros2.0、Centos7.8、Ubuntu18.04版本上经过测试验证。 +## 2.3.1 + +| 组件 | 硬件平台 | 操作系统 | 链接 | SHA-256 | +| --- | --- | --- | --- | --- | +| 云侧推理runtime库、推理jar包、benchmark工具、converter工具 | CPU/GPU/Ascend | Linux-x86_64 | [mindspore-lite-2.3.1-linux-x64.tar.gz](https://ms-release.obs.cn-north-4.myhuaweicloud.com/2.3.1/MindSpore/lite/release/linux/x86_64/cloud_fusion/python37/mindspore-lite-2.3.1-linux-x64.tar.gz) | df702ba03a8a6a94a482273a2be15f1098fcaffb92ba396533b6b0896aab2292 | +| 云侧推理runtime库、推理jar包、benchmark工具、converter工具 | CPU/Ascend | Linux-aarch64 | [mindspore-lite-2.3.1-linux-aarch64.tar.gz](https://ms-release.obs.cn-north-4.myhuaweicloud.com/2.3.1/MindSpore/lite/release/linux/aarch64/cloud_fusion/python37/mindspore-lite-2.3.1-linux-aarch64.tar.gz) | 9ba19a675d61da90e0e4f28ad54d2750ea7dfbfbc7611f001f64d3bdf952aac5 | +| 推理和训练runtime库、推理和训练aar包、Micro库、benchmark工具 | CPU/GPU | Android-aarch64 | [mindspore-lite-2.3.1-android-aarch64.tar.gz](https://ms-release.obs.cn-north-4.myhuaweicloud.com/2.3.1/MindSpore/lite/release/android/gpu/mindspore-lite-2.3.1-android-aarch64.tar.gz) | eb0c13158f06b8a17975380ad190c28882e86989895ed4193d7223d3904337b0 | +| 端侧推理和训练runtime库、推理和训练jar包、Micro库、benchmark工具、converter工具、cropper工具 | CPU | Linux-x86_64 | [mindspore-lite-2.3.1-linux-x64.tar.gz](https://ms-release.obs.cn-north-4.myhuaweicloud.com/2.3.1/MindSpore/lite/release/linux/x86_64/mindspore-lite-2.3.1-linux-x64.tar.gz) | 26792aabebde4f3c9a7b779b9da9b9c7bb9b80d5411efc6571e1ef45f0839f83 | +| 端侧推理runtime库、Micro库、benchmark工具、converter工具 | CPU | Linux-aarch64 | [mindspore-lite-2.3.1-linux-aarch64.tar.gz](https://ms-release.obs.cn-north-4.myhuaweicloud.com/2.3.1/MindSpore/lite/release/linux/aarch64/mindspore-lite-2.3.1-linux-aarch64.tar.gz) | 7eec6a578ac7c96f33e0bb026f1f9f974cafada03d1a060e3fb121dc09ccf243 | +| 推理runtime库、Micro库、benchmark工具、converter工具 | CPU | Windows-x86_64 | [mindspore-lite-2.3.1-win-x64.zip](https://ms-release.obs.cn-north-4.myhuaweicloud.com/2.3.1/MindSpore/lite/release/windows/mindspore-lite-2.3.1-win-x64.zip) | 67f5fbba85d5b0682e228928f4cae5f48e6d6f5320a2fb10291a792e52748d03 | + +Python 接口 Wheel安装包 +| 组件 | 硬件平台 | 操作系统 | Python版本 | 链接 | SHA-256 | +| --- | --- | --- | --- | --- | --- | +| 云侧推理runtime及converter | CPU/GPU/Ascend | Linux-x86_64 | Python3.8 | [mindspore_lite-2.3.1-cp38-cp38-linux_x86_64.whl](https://ms-release.obs.cn-north-4.myhuaweicloud.com/2.3.1/MindSpore/lite/release/linux/x86_64/cloud_fusion/python38/mindspore_lite-2.3.1-cp38-cp38-linux_x86_64.whl) | 436b7afb77caeee217141cccf3a728f7b25c66f89255fc77b0801c261a4c19b5 | +| 云侧推理runtime及converter | CPU/Ascend | Linux-aarch64 | Python3.8 | [mindspore_lite-2.3.1-cp38-cp38-linux_aarch64.whl](https://ms-release.obs.cn-north-4.myhuaweicloud.com/2.3.1/MindSpore/lite/release/linux/aarch64/cloud_fusion/python38/mindspore_lite-2.3.1-cp38-cp38-linux_aarch64.whl) | 0f69ec441f13e0fdba6ea71fe975a84b0ceaaef2c6162a9ce9c876ec674bbd5f | +| 云侧推理runtime及converter | CPU/GPU/Ascend | Linux-x86_64 | Python3.9 | [mindspore_lite-2.3.1-cp39-cp39-linux_x86_64.whl](https://ms-release.obs.cn-north-4.myhuaweicloud.com/2.3.1/MindSpore/lite/release/linux/x86_64/cloud_fusion/python39/mindspore_lite-2.3.1-cp39-cp39-linux_x86_64.whl) | 13775d493c57cf7a804d9fb667c591e550620d6e633885cce61b5905ced0a624 | +| 云侧推理runtime及converter | CPU/Ascend | Linux-aarch64 | Python3.9 | [mindspore_lite-2.3.1-cp39-cp39-linux_aarch64.whl](https://ms-release.obs.cn-north-4.myhuaweicloud.com/2.3.1/MindSpore/lite/release/linux/aarch64/cloud_fusion/python39/mindspore_lite-2.3.1-cp39-cp39-linux_aarch64.whl) | b6007fc1df2a47367d3734ad7b4112e8a80d46f31d8f57c90520cecc0848c790 | +| 云侧推理runtime及converter | CPU/GPU/Ascend | Linux-x86_64 | Python3.10 | [mindspore_lite-2.3.1-cp310-cp310-linux_x86_64.whl](https://ms-release.obs.cn-north-4.myhuaweicloud.com/2.3.1/MindSpore/lite/release/linux/x86_64/cloud_fusion/python310/mindspore_lite-2.3.1-cp310-cp310-linux_x86_64.whl) | 04021504bf6c73c6284ba0bc75b2f49e04402cfc76c4d402f2d235231b456bf1 | +| 云侧推理runtime及converter | CPU/Ascend | Linux-aarch64 | Python3.10 | [mindspore_lite-2.3.1-cp310-cp310-linux_aarch64.whl](https://ms-release.obs.cn-north-4.myhuaweicloud.com/2.3.1/MindSpore/lite/release/linux/aarch64/cloud_fusion/python310/mindspore_lite-2.3.1-cp310-cp310-linux_aarch64.whl) | 767068f587ac25924b4ba172f47ef9a2f9bab8c6e8cedc1f7115fa1239ddc7bf | + ## 2.3.0 | 组件 | 硬件平台 | 操作系统 | 链接 | SHA-256 | -- Gitee From 8e8d69f9355f6be76af1e2db85fa34c8961b1a0a Mon Sep 17 00:00:00 2001 From: huan <3174348550@qq.com> Date: Mon, 5 Aug 2024 10:47:45 +0800 Subject: [PATCH 14/69] add links --- docs/mindspore/source_en/mindformers/appendix/conf_files.md | 4 +++- .../mindspore/source_en/mindformers/appendix/env_variables.md | 4 +++- docs/mindspore/source_en/mindformers/faq/func_related.md | 4 +++- .../source_en/mindformers/faq/mindformers_contribution.md | 2 ++ docs/mindspore/source_en/mindformers/faq/model_related.md | 4 +++- .../source_en/mindformers/faq/openmind_contribution.md | 4 +++- docs/mindspore/source_en/mindformers/function/dataset.md | 4 +++- .../source_en/mindformers/function/distributed_parallel.md | 4 +++- docs/mindspore/source_en/mindformers/function/res_training.md | 4 +++- .../source_en/mindformers/function/weight_conversion.md | 4 +++- docs/mindspore/source_en/mindformers/quick_start/install.md | 4 +++- .../source_en/mindformers/quick_start/source_code_start.md | 4 +++- docs/mindspore/source_en/mindformers/start/models.md | 4 +++- docs/mindspore/source_en/mindformers/start/overview.md | 2 ++ docs/mindspore/source_en/mindformers/usage/dev_migration.md | 4 +++- docs/mindspore/source_en/mindformers/usage/evaluation.md | 4 +++- docs/mindspore/source_en/mindformers/usage/inference.md | 4 +++- docs/mindspore/source_en/mindformers/usage/lora_tuning.md | 4 +++- .../source_en/mindformers/usage/mindie_deployment.md | 4 +++- docs/mindspore/source_en/mindformers/usage/pre_training.md | 4 +++- docs/mindspore/source_en/mindformers/usage/quantization.md | 4 +++- docs/mindspore/source_en/mindformers/usage/sft_tuning.md | 4 +++- .../mindspore/source_zh_cn/mindformers/appendix/conf_files.md | 4 +++- .../source_zh_cn/mindformers/appendix/env_variables.md | 4 +++- docs/mindspore/source_zh_cn/mindformers/faq/func_related.md | 4 +++- .../source_zh_cn/mindformers/faq/mindformers_contribution.md | 4 +++- docs/mindspore/source_zh_cn/mindformers/faq/model_related.md | 4 +++- .../source_zh_cn/mindformers/faq/openmind_contribution.md | 4 +++- docs/mindspore/source_zh_cn/mindformers/function/dataset.md | 4 +++- .../source_zh_cn/mindformers/function/distributed_parallel.md | 4 +++- .../source_zh_cn/mindformers/function/res_training.md | 4 +++- .../source_zh_cn/mindformers/function/weight_conversion.md | 4 +++- .../mindspore/source_zh_cn/mindformers/quick_start/install.md | 4 +++- .../source_zh_cn/mindformers/quick_start/source_code_start.md | 4 +++- docs/mindspore/source_zh_cn/mindformers/start/models.md | 4 +++- docs/mindspore/source_zh_cn/mindformers/start/overview.md | 4 +++- .../mindspore/source_zh_cn/mindformers/usage/dev_migration.md | 4 +++- docs/mindspore/source_zh_cn/mindformers/usage/evaluation.md | 4 +++- docs/mindspore/source_zh_cn/mindformers/usage/inference.md | 4 +++- docs/mindspore/source_zh_cn/mindformers/usage/lora_tuning.md | 4 +++- .../source_zh_cn/mindformers/usage/mindie_deployment.md | 4 +++- docs/mindspore/source_zh_cn/mindformers/usage/pre_training.md | 4 +++- docs/mindspore/source_zh_cn/mindformers/usage/quantization.md | 4 +++- docs/mindspore/source_zh_cn/mindformers/usage/sft_tuning.md | 4 +++- 44 files changed, 130 insertions(+), 42 deletions(-) diff --git a/docs/mindspore/source_en/mindformers/appendix/conf_files.md b/docs/mindspore/source_en/mindformers/appendix/conf_files.md index e42751fde6..7c9bcfdba9 100644 --- a/docs/mindspore/source_en/mindformers/appendix/conf_files.md +++ b/docs/mindspore/source_en/mindformers/appendix/conf_files.md @@ -1 +1,3 @@ -# Configuration File Descriptions \ No newline at end of file +# Configuration File Descriptions + +[![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_en/mindformers/appendix/conf_files.md) \ No newline at end of file diff --git a/docs/mindspore/source_en/mindformers/appendix/env_variables.md b/docs/mindspore/source_en/mindformers/appendix/env_variables.md index f1f98aec89..edffa2c619 100644 --- a/docs/mindspore/source_en/mindformers/appendix/env_variables.md +++ b/docs/mindspore/source_en/mindformers/appendix/env_variables.md @@ -1 +1,3 @@ -# Environment Variable Descriptions \ No newline at end of file +# Environment Variable Descriptions + +![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)(https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_en/mindformers/appendix/env_variables.md) \ No newline at end of file diff --git a/docs/mindspore/source_en/mindformers/faq/func_related.md b/docs/mindspore/source_en/mindformers/faq/func_related.md index 3bcbbfa161..fb33e04fe1 100644 --- a/docs/mindspore/source_en/mindformers/faq/func_related.md +++ b/docs/mindspore/source_en/mindformers/faq/func_related.md @@ -1 +1,3 @@ -# Function_releated \ No newline at end of file +# Function_releated + +[![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_en/mindformers/faq/func_related.md) \ No newline at end of file diff --git a/docs/mindspore/source_en/mindformers/faq/mindformers_contribution.md b/docs/mindspore/source_en/mindformers/faq/mindformers_contribution.md index 44a90b5775..9b50b7578e 100644 --- a/docs/mindspore/source_en/mindformers/faq/mindformers_contribution.md +++ b/docs/mindspore/source_en/mindformers/faq/mindformers_contribution.md @@ -1 +1,3 @@ # MindFormers Contribution Guidelines + +[![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_en/mindformers/faq/mindformers_contribution.md) \ No newline at end of file diff --git a/docs/mindspore/source_en/mindformers/faq/model_related.md b/docs/mindspore/source_en/mindformers/faq/model_related.md index d2a7293985..708c85a964 100644 --- a/docs/mindspore/source_en/mindformers/faq/model_related.md +++ b/docs/mindspore/source_en/mindformers/faq/model_related.md @@ -1 +1,3 @@ -# Model-Releated \ No newline at end of file +# Model-Releated + +[![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_en/mindformers/faq/model_related.md) \ No newline at end of file diff --git a/docs/mindspore/source_en/mindformers/faq/openmind_contribution.md b/docs/mindspore/source_en/mindformers/faq/openmind_contribution.md index 9362378830..c13d7c1421 100644 --- a/docs/mindspore/source_en/mindformers/faq/openmind_contribution.md +++ b/docs/mindspore/source_en/mindformers/faq/openmind_contribution.md @@ -1 +1,3 @@ -# openMind Contribution Guidelines \ No newline at end of file +# openMind Contribution Guidelines + +[![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_en/mindformers/faq/openmind_contribution.md) \ No newline at end of file diff --git a/docs/mindspore/source_en/mindformers/function/dataset.md b/docs/mindspore/source_en/mindformers/function/dataset.md index 20b39a01e4..085bd22419 100644 --- a/docs/mindspore/source_en/mindformers/function/dataset.md +++ b/docs/mindspore/source_en/mindformers/function/dataset.md @@ -1 +1,3 @@ -# Dataset \ No newline at end of file +# Dataset + +[![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_en/mindformers/function/dataset.md) \ No newline at end of file diff --git a/docs/mindspore/source_en/mindformers/function/distributed_parallel.md b/docs/mindspore/source_en/mindformers/function/distributed_parallel.md index 0fa56b4e2c..f718468cd2 100644 --- a/docs/mindspore/source_en/mindformers/function/distributed_parallel.md +++ b/docs/mindspore/source_en/mindformers/function/distributed_parallel.md @@ -1 +1,3 @@ -# Distributed Parallel \ No newline at end of file +# Distributed Parallel + +[![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_en/mindformers/function/distributed_parallel.md) \ No newline at end of file diff --git a/docs/mindspore/source_en/mindformers/function/res_training.md b/docs/mindspore/source_en/mindformers/function/res_training.md index d824a9f774..08134087b7 100644 --- a/docs/mindspore/source_en/mindformers/function/res_training.md +++ b/docs/mindspore/source_en/mindformers/function/res_training.md @@ -1 +1,3 @@ -# Resumable Training After Breakpoint \ No newline at end of file +# Resumable Training After Breakpoint + +[![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_en/mindformers/function/res_training.md) \ No newline at end of file diff --git a/docs/mindspore/source_en/mindformers/function/weight_conversion.md b/docs/mindspore/source_en/mindformers/function/weight_conversion.md index ff6ee09222..7fb46c4d58 100644 --- a/docs/mindspore/source_en/mindformers/function/weight_conversion.md +++ b/docs/mindspore/source_en/mindformers/function/weight_conversion.md @@ -1 +1,3 @@ -# Weight Conversion \ No newline at end of file +# Weight Conversion + +[![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_en/mindformers/function/weight_conversion.md) \ No newline at end of file diff --git a/docs/mindspore/source_en/mindformers/quick_start/install.md b/docs/mindspore/source_en/mindformers/quick_start/install.md index f34d65bd73..87b4bc56db 100644 --- a/docs/mindspore/source_en/mindformers/quick_start/install.md +++ b/docs/mindspore/source_en/mindformers/quick_start/install.md @@ -1 +1,3 @@ -# Installation \ No newline at end of file +# Installation + +[![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_en/mindformers/quick_start/install.md) \ No newline at end of file diff --git a/docs/mindspore/source_en/mindformers/quick_start/source_code_start.md b/docs/mindspore/source_en/mindformers/quick_start/source_code_start.md index b00438c585..bdcefc5f33 100644 --- a/docs/mindspore/source_en/mindformers/quick_start/source_code_start.md +++ b/docs/mindspore/source_en/mindformers/quick_start/source_code_start.md @@ -1 +1,3 @@ -# Calling Source Code to Start \ No newline at end of file +# Calling Source Code to Start + +[![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_en/mindformers/quick_start/source_code_start.md) \ No newline at end of file diff --git a/docs/mindspore/source_en/mindformers/start/models.md b/docs/mindspore/source_en/mindformers/start/models.md index e89b5f2b2b..920f56e47f 100644 --- a/docs/mindspore/source_en/mindformers/start/models.md +++ b/docs/mindspore/source_en/mindformers/start/models.md @@ -1 +1,3 @@ -# Models \ No newline at end of file +# Models + +[![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_en/mindformers/start/models.md) \ No newline at end of file diff --git a/docs/mindspore/source_en/mindformers/start/overview.md b/docs/mindspore/source_en/mindformers/start/overview.md index 07dd0c5c77..51142848a0 100644 --- a/docs/mindspore/source_en/mindformers/start/overview.md +++ b/docs/mindspore/source_en/mindformers/start/overview.md @@ -1 +1,3 @@ # Overview + +[![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_en/mindformers/start/overview.md) \ No newline at end of file diff --git a/docs/mindspore/source_en/mindformers/usage/dev_migration.md b/docs/mindspore/source_en/mindformers/usage/dev_migration.md index 93b1ea36cf..2bbc0d45cb 100644 --- a/docs/mindspore/source_en/mindformers/usage/dev_migration.md +++ b/docs/mindspore/source_en/mindformers/usage/dev_migration.md @@ -1 +1,3 @@ -# Development Migration \ No newline at end of file +# Development Migration + +[![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_en/mindformers/usage/dev_migration.md) \ No newline at end of file diff --git a/docs/mindspore/source_en/mindformers/usage/evaluation.md b/docs/mindspore/source_en/mindformers/usage/evaluation.md index 5f5eb37b83..7713fca9f0 100644 --- a/docs/mindspore/source_en/mindformers/usage/evaluation.md +++ b/docs/mindspore/source_en/mindformers/usage/evaluation.md @@ -1 +1,3 @@ -# Evaluation \ No newline at end of file +# Evaluation + +[![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_en/mindformers/usage/evaluation.md) \ No newline at end of file diff --git a/docs/mindspore/source_en/mindformers/usage/inference.md b/docs/mindspore/source_en/mindformers/usage/inference.md index c41f3e0a6c..2b3297fd6b 100644 --- a/docs/mindspore/source_en/mindformers/usage/inference.md +++ b/docs/mindspore/source_en/mindformers/usage/inference.md @@ -1 +1,3 @@ -# Inference \ No newline at end of file +# Inference + +[![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_en/mindformers/usage/inference.md) \ No newline at end of file diff --git a/docs/mindspore/source_en/mindformers/usage/lora_tuning.md b/docs/mindspore/source_en/mindformers/usage/lora_tuning.md index 93f77566ba..6b517c4876 100644 --- a/docs/mindspore/source_en/mindformers/usage/lora_tuning.md +++ b/docs/mindspore/source_en/mindformers/usage/lora_tuning.md @@ -1 +1,3 @@ -# LoRA Low Parameter Fine-Tuning \ No newline at end of file +# LoRA Low Parameter Fine-Tuning + +[![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_en/mindformers/usage/lora_tuning.md) \ No newline at end of file diff --git a/docs/mindspore/source_en/mindformers/usage/mindie_deployment.md b/docs/mindspore/source_en/mindformers/usage/mindie_deployment.md index f1f2855520..54b4d26560 100644 --- a/docs/mindspore/source_en/mindformers/usage/mindie_deployment.md +++ b/docs/mindspore/source_en/mindformers/usage/mindie_deployment.md @@ -1 +1,3 @@ -# MindIE Service Deployment \ No newline at end of file +# MindIE Service Deployment + +[![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_en/mindformers/usage/mindie_deployment.md) \ No newline at end of file diff --git a/docs/mindspore/source_en/mindformers/usage/pre_training.md b/docs/mindspore/source_en/mindformers/usage/pre_training.md index 4d266d1dfc..8ac0b4e3de 100644 --- a/docs/mindspore/source_en/mindformers/usage/pre_training.md +++ b/docs/mindspore/source_en/mindformers/usage/pre_training.md @@ -1 +1,3 @@ -# Pre-training \ No newline at end of file +# Pre-training + +[![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_en/mindformers/usage/pre_training.md) \ No newline at end of file diff --git a/docs/mindspore/source_en/mindformers/usage/quantization.md b/docs/mindspore/source_en/mindformers/usage/quantization.md index 95849fce00..259b39b15f 100644 --- a/docs/mindspore/source_en/mindformers/usage/quantization.md +++ b/docs/mindspore/source_en/mindformers/usage/quantization.md @@ -1 +1,3 @@ -# Quantization \ No newline at end of file +# Quantization + +[![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_en/mindformers/usage/quantization.md) \ No newline at end of file diff --git a/docs/mindspore/source_en/mindformers/usage/sft_tuning.md b/docs/mindspore/source_en/mindformers/usage/sft_tuning.md index 0bdb66ab1c..dbe8b8cff4 100644 --- a/docs/mindspore/source_en/mindformers/usage/sft_tuning.md +++ b/docs/mindspore/source_en/mindformers/usage/sft_tuning.md @@ -1 +1,3 @@ -# SFT-Tuning \ No newline at end of file +# SFT-Tuning + +[![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_en/mindformers/usage/sft_tuning.md) \ No newline at end of file diff --git a/docs/mindspore/source_zh_cn/mindformers/appendix/conf_files.md b/docs/mindspore/source_zh_cn/mindformers/appendix/conf_files.md index 3322c36778..7b7dcc038a 100644 --- a/docs/mindspore/source_zh_cn/mindformers/appendix/conf_files.md +++ b/docs/mindspore/source_zh_cn/mindformers/appendix/conf_files.md @@ -1 +1,3 @@ -# 配置文件说明 \ No newline at end of file +# 配置文件说明 + +[![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_zh_cn/mindformers/appendix/conf_files.md) \ No newline at end of file diff --git a/docs/mindspore/source_zh_cn/mindformers/appendix/env_variables.md b/docs/mindspore/source_zh_cn/mindformers/appendix/env_variables.md index 0715649da5..5116f6efbe 100644 --- a/docs/mindspore/source_zh_cn/mindformers/appendix/env_variables.md +++ b/docs/mindspore/source_zh_cn/mindformers/appendix/env_variables.md @@ -1 +1,3 @@ -# 环境变量说明 \ No newline at end of file +# 环境变量说明 + +[![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_zh_cn/mindformers/appendix/env_variables.md) \ No newline at end of file diff --git a/docs/mindspore/source_zh_cn/mindformers/faq/func_related.md b/docs/mindspore/source_zh_cn/mindformers/faq/func_related.md index 0e550c19c9..cc95c7a1fc 100644 --- a/docs/mindspore/source_zh_cn/mindformers/faq/func_related.md +++ b/docs/mindspore/source_zh_cn/mindformers/faq/func_related.md @@ -1 +1,3 @@ -# 功能相关 \ No newline at end of file +# 功能相关 + +[![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_zh_cn/mindformers/faq/func_related.md) \ No newline at end of file diff --git a/docs/mindspore/source_zh_cn/mindformers/faq/mindformers_contribution.md b/docs/mindspore/source_zh_cn/mindformers/faq/mindformers_contribution.md index 6e1ed29899..c0dd31a7b9 100644 --- a/docs/mindspore/source_zh_cn/mindformers/faq/mindformers_contribution.md +++ b/docs/mindspore/source_zh_cn/mindformers/faq/mindformers_contribution.md @@ -1 +1,3 @@ -# MindFormers贡献指南 \ No newline at end of file +# MindFormers贡献指南 + +[![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_zh_cn/mindformers/faq/mindformers_contribution.md) \ No newline at end of file diff --git a/docs/mindspore/source_zh_cn/mindformers/faq/model_related.md b/docs/mindspore/source_zh_cn/mindformers/faq/model_related.md index 6c25235193..30a5ac5645 100644 --- a/docs/mindspore/source_zh_cn/mindformers/faq/model_related.md +++ b/docs/mindspore/source_zh_cn/mindformers/faq/model_related.md @@ -1 +1,3 @@ -# 模型相关 \ No newline at end of file +# 模型相关 + +[![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_zh_cn/mindformers/faq/model_related.md) \ No newline at end of file diff --git a/docs/mindspore/source_zh_cn/mindformers/faq/openmind_contribution.md b/docs/mindspore/source_zh_cn/mindformers/faq/openmind_contribution.md index 90cedd9efb..94331866da 100644 --- a/docs/mindspore/source_zh_cn/mindformers/faq/openmind_contribution.md +++ b/docs/mindspore/source_zh_cn/mindformers/faq/openmind_contribution.md @@ -1 +1,3 @@ -# openMind贡献指南 \ No newline at end of file +# openMind贡献指南 + +[![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_zh_cn/mindformers/faq/openmind_contribution.md) \ No newline at end of file diff --git a/docs/mindspore/source_zh_cn/mindformers/function/dataset.md b/docs/mindspore/source_zh_cn/mindformers/function/dataset.md index 5cdc48863c..7101fe965d 100644 --- a/docs/mindspore/source_zh_cn/mindformers/function/dataset.md +++ b/docs/mindspore/source_zh_cn/mindformers/function/dataset.md @@ -1 +1,3 @@ -# 数据集 \ No newline at end of file +# 数据集 + +[![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_zh_cn/mindformers/function/dataset.md) \ No newline at end of file diff --git a/docs/mindspore/source_zh_cn/mindformers/function/distributed_parallel.md b/docs/mindspore/source_zh_cn/mindformers/function/distributed_parallel.md index fcffdb99cd..a699487932 100644 --- a/docs/mindspore/source_zh_cn/mindformers/function/distributed_parallel.md +++ b/docs/mindspore/source_zh_cn/mindformers/function/distributed_parallel.md @@ -1 +1,3 @@ -# 分布式并行 \ No newline at end of file +# 分布式并行 + +[![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_zh_cn/mindformers/function/distributed_parallel.md) \ No newline at end of file diff --git a/docs/mindspore/source_zh_cn/mindformers/function/res_training.md b/docs/mindspore/source_zh_cn/mindformers/function/res_training.md index 36c57989b4..1e9e9a557b 100644 --- a/docs/mindspore/source_zh_cn/mindformers/function/res_training.md +++ b/docs/mindspore/source_zh_cn/mindformers/function/res_training.md @@ -1 +1,3 @@ -# 断点续训功能 \ No newline at end of file +# 断点续训功能 + +[![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_zh_cn/mindformers/function/res_training.md) \ No newline at end of file diff --git a/docs/mindspore/source_zh_cn/mindformers/function/weight_conversion.md b/docs/mindspore/source_zh_cn/mindformers/function/weight_conversion.md index 496fb02ac6..a2c2fe74fc 100644 --- a/docs/mindspore/source_zh_cn/mindformers/function/weight_conversion.md +++ b/docs/mindspore/source_zh_cn/mindformers/function/weight_conversion.md @@ -1 +1,3 @@ -# 权重转换功能 \ No newline at end of file +# 权重转换功能 + +[![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_zh_cn/mindformers/function/weight_conversion.md) \ No newline at end of file diff --git a/docs/mindspore/source_zh_cn/mindformers/quick_start/install.md b/docs/mindspore/source_zh_cn/mindformers/quick_start/install.md index b5f657d6f9..65b071bde9 100644 --- a/docs/mindspore/source_zh_cn/mindformers/quick_start/install.md +++ b/docs/mindspore/source_zh_cn/mindformers/quick_start/install.md @@ -1 +1,3 @@ -# 安装 \ No newline at end of file +# 安装 + +[![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_zh_cn/mindformers/quick_start/install.md) \ No newline at end of file diff --git a/docs/mindspore/source_zh_cn/mindformers/quick_start/source_code_start.md b/docs/mindspore/source_zh_cn/mindformers/quick_start/source_code_start.md index abe8a09d36..8499efe533 100644 --- a/docs/mindspore/source_zh_cn/mindformers/quick_start/source_code_start.md +++ b/docs/mindspore/source_zh_cn/mindformers/quick_start/source_code_start.md @@ -1 +1,3 @@ -# 调用源码启动 \ No newline at end of file +# 调用源码启动 + +[![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_zh_cn/mindformers/quick_start/source_code_start.md) \ No newline at end of file diff --git a/docs/mindspore/source_zh_cn/mindformers/start/models.md b/docs/mindspore/source_zh_cn/mindformers/start/models.md index e51b16818a..8c78d6220e 100644 --- a/docs/mindspore/source_zh_cn/mindformers/start/models.md +++ b/docs/mindspore/source_zh_cn/mindformers/start/models.md @@ -1 +1,3 @@ -# 模型库 \ No newline at end of file +# 模型库 + +[![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_zh_cn/mindformers/start/models.md) \ No newline at end of file diff --git a/docs/mindspore/source_zh_cn/mindformers/start/overview.md b/docs/mindspore/source_zh_cn/mindformers/start/overview.md index 3bf12917cc..c46b8d549f 100644 --- a/docs/mindspore/source_zh_cn/mindformers/start/overview.md +++ b/docs/mindspore/source_zh_cn/mindformers/start/overview.md @@ -1 +1,3 @@ -# 概览 \ No newline at end of file +# 概览 + +[![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_zh_cn/mindformers/start/overview.md) \ No newline at end of file diff --git a/docs/mindspore/source_zh_cn/mindformers/usage/dev_migration.md b/docs/mindspore/source_zh_cn/mindformers/usage/dev_migration.md index ffbe483fe2..d079d83fcc 100644 --- a/docs/mindspore/source_zh_cn/mindformers/usage/dev_migration.md +++ b/docs/mindspore/source_zh_cn/mindformers/usage/dev_migration.md @@ -1 +1,3 @@ -# 开发迁移 \ No newline at end of file +# 开发迁移 + +[![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_zh_cn/mindformers/usage/dev_migration.md) \ No newline at end of file diff --git a/docs/mindspore/source_zh_cn/mindformers/usage/evaluation.md b/docs/mindspore/source_zh_cn/mindformers/usage/evaluation.md index 1030677496..617841eadb 100644 --- a/docs/mindspore/source_zh_cn/mindformers/usage/evaluation.md +++ b/docs/mindspore/source_zh_cn/mindformers/usage/evaluation.md @@ -1 +1,3 @@ -# 评测 \ No newline at end of file +# 评测 + +[![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_zh_cn/mindformers/usage/evaluation.md) \ No newline at end of file diff --git a/docs/mindspore/source_zh_cn/mindformers/usage/inference.md b/docs/mindspore/source_zh_cn/mindformers/usage/inference.md index 248b824847..049d917358 100644 --- a/docs/mindspore/source_zh_cn/mindformers/usage/inference.md +++ b/docs/mindspore/source_zh_cn/mindformers/usage/inference.md @@ -1 +1,3 @@ -# 推理 \ No newline at end of file +# 推理 + +[![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_zh_cn/mindformers/usage/inference.md) \ No newline at end of file diff --git a/docs/mindspore/source_zh_cn/mindformers/usage/lora_tuning.md b/docs/mindspore/source_zh_cn/mindformers/usage/lora_tuning.md index 28c7c535da..8115f5d0bf 100644 --- a/docs/mindspore/source_zh_cn/mindformers/usage/lora_tuning.md +++ b/docs/mindspore/source_zh_cn/mindformers/usage/lora_tuning.md @@ -1 +1,3 @@ -# LoRA低参微调 \ No newline at end of file +# LoRA低参微调 + +[![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_zh_cn/mindformers/usage/lora_tuning.md) \ No newline at end of file diff --git a/docs/mindspore/source_zh_cn/mindformers/usage/mindie_deployment.md b/docs/mindspore/source_zh_cn/mindformers/usage/mindie_deployment.md index f06fc2a653..301dc631eb 100644 --- a/docs/mindspore/source_zh_cn/mindformers/usage/mindie_deployment.md +++ b/docs/mindspore/source_zh_cn/mindformers/usage/mindie_deployment.md @@ -1 +1,3 @@ -# MindIE服务化部署 \ No newline at end of file +# MindIE服务化部署 + +[![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_zh_cn/mindformers/usage/mindie_deployment.md) \ No newline at end of file diff --git a/docs/mindspore/source_zh_cn/mindformers/usage/pre_training.md b/docs/mindspore/source_zh_cn/mindformers/usage/pre_training.md index 8b1bdd4b69..43e2f84adb 100644 --- a/docs/mindspore/source_zh_cn/mindformers/usage/pre_training.md +++ b/docs/mindspore/source_zh_cn/mindformers/usage/pre_training.md @@ -1 +1,3 @@ -# 预训练 \ No newline at end of file +# 预训练 + +[![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_zh_cn/mindformers/usage/pre_training.md) \ No newline at end of file diff --git a/docs/mindspore/source_zh_cn/mindformers/usage/quantization.md b/docs/mindspore/source_zh_cn/mindformers/usage/quantization.md index 91a6d60c33..635ebf432d 100644 --- a/docs/mindspore/source_zh_cn/mindformers/usage/quantization.md +++ b/docs/mindspore/source_zh_cn/mindformers/usage/quantization.md @@ -1 +1,3 @@ -# 量化 \ No newline at end of file +# 量化 + +[![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_zh_cn/mindformers/usage/quantization.md) \ No newline at end of file diff --git a/docs/mindspore/source_zh_cn/mindformers/usage/sft_tuning.md b/docs/mindspore/source_zh_cn/mindformers/usage/sft_tuning.md index 2a1b7483b5..cf0b5b506f 100644 --- a/docs/mindspore/source_zh_cn/mindformers/usage/sft_tuning.md +++ b/docs/mindspore/source_zh_cn/mindformers/usage/sft_tuning.md @@ -1 +1,3 @@ -# SFT微调 \ No newline at end of file +# SFT微调 + +[![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_zh_cn/mindformers/usage/sft_tuning.md) \ No newline at end of file -- Gitee From f0c71ce3e7a8eb5df276b04f652a152b75240940 Mon Sep 17 00:00:00 2001 From: yanghaoran Date: Mon, 5 Aug 2024 21:54:04 +0800 Subject: [PATCH 15/69] update version 2.3.1 --- install/mindspore_ascend_install_pip.md | 2 +- install/mindspore_ascend_install_pip_en.md | 2 +- resource/release/release_list_en.md | 14 ++++++++++++++ resource/release/release_list_zh_cn.md | 14 ++++++++++++++ 4 files changed, 30 insertions(+), 2 deletions(-) diff --git a/install/mindspore_ascend_install_pip.md b/install/mindspore_ascend_install_pip.md index 8363d03faa..97366302ba 100644 --- a/install/mindspore_ascend_install_pip.md +++ b/install/mindspore_ascend_install_pip.md @@ -31,7 +31,7 @@ ```bash wget https://gitee.com/mindspore/mindspore/raw/master/scripts/install/euleros-ascend-pip.sh -# 安装MindSpore 2.3.0和Python 3.9 +# 安装MindSpore 2.3.1和Python 3.9 # 默认LOCAL_ASCEND路径为/usr/local/Ascend PYTHON_VERSION=3.9 bash -i ./euleros-ascend-pip.sh # 如需指定Python和MindSpore版本,以Python 3.8和MindSpore 1.6.0为例 diff --git a/install/mindspore_ascend_install_pip_en.md b/install/mindspore_ascend_install_pip_en.md index c97e916db8..a3a4536377 100644 --- a/install/mindspore_ascend_install_pip_en.md +++ b/install/mindspore_ascend_install_pip_en.md @@ -31,7 +31,7 @@ Run the following command to obtain and run the automatic installation script. T ```bash wget https://gitee.com/mindspore/mindspore/raw/master/scripts/install/euleros-ascend-pip.sh -# install MindSpore 2.3.0 and Python 3.9 +# install MindSpore 2.3.1 and Python 3.9 # the default value of LOCAL_ASCEND is /usr/local/Ascend PYTHON_VERSION=3.9 bash -i ./euleros-ascend-pip.sh # to specify Python and MindSpore version, taking Python 3.8 and MindSpore 1.6.0 as examples diff --git a/resource/release/release_list_en.md b/resource/release/release_list_en.md index 81133cf91c..7e31d5d6ae 100644 --- a/resource/release/release_list_en.md +++ b/resource/release/release_list_en.md @@ -6,6 +6,7 @@ - [Related Documents](#related-documents) - [Ascend Supporting Software Package](#ascend-supporting-software-package) - [Downloads](#downloads) + - [2.3.1](#231) - [2.3.0](#230) - [2.3.0-rc2](#230-rc2) - [2.3.0-RC1](#230-rc1) @@ -114,6 +115,7 @@ | MindSpore Version | Hardware Platform | Commercial edition Installation Guide | Community edition download link (refer to commercial edition for instructions) | |-------------|--------|-----------|------------------| +| 2.3.1 | Ascend | TBD | [CANN 8.0.RC2.beta1](https://www.hiascend.com/developer/download/community/result?module=cann)
    [firmware and driver](https://www.hiascend.com/hardware/firmware-drivers/community) | | 2.3.0 | Ascend | TBD | [CANN 8.0.RC2.beta1](https://www.hiascend.com/developer/download/community/result?module=cann)
    [firmware and driver](https://www.hiascend.com/hardware/firmware-drivers/community) | | 2.3.0-rc2 | Ascend | [Ascend Training Solution 24.0.RC1](https://support.huawei.com/enterprise/zh/doc/EDOC1100373131) | [CANN 8.0.RC1.beta1](https://www.hiascend.com/developer/download/community/result?module=cann)
    [firmware and driver](https://www.hiascend.com/hardware/firmware-drivers/community) | | 2.3.0-rc1 | Ascend | [Ascend Training Solution 24.0.RC1](https://support.huawei.com/enterprise/zh/doc/EDOC1100373131) | [CANN 8.0.RC1.beta1](https://www.hiascend.com/developer/download/community/result?module=cann)
    [firmware and driver](https://www.hiascend.com/hardware/firmware-drivers/community) | @@ -167,6 +169,18 @@ ## Downloads +### 2.3.1 + +| Module Name | Hardware Platform | Operating System | Python Version | Download Links | SHA-256 | +|------------------------------|--------|---------------|------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------| +| MindSpore | Ascend | Linux-aarch64 | Python3.8 | [mindspore-2.3.1-cp38-cp38-linux_aarch64.whl](https://ms-release.obs.cn-north-4.myhuaweicloud.com/2.3.1/MindSpore/unified/aarch64/mindspore-2.3.1-cp38-cp38-linux_aarch64.whl) | 976854b9e0c2535541cacb6e1b0b887595fd7aaa03572670b148d1846b08d339 | +| | | | Python3.9 | [mindspore-2.3.1-cp39-cp39-linux_aarch64.whl](https://ms-release.obs.cn-north-4.myhuaweicloud.com/2.3.1/MindSpore/unified/aarch64/mindspore-2.3.1-cp39-cp39-linux_aarch64.whl) | 5fe6a476a7a718c413ac66db71ba93bfe2d6870e13ef90f10652a27170ed338e | +| | | | Python3.10 | [mindspore-2.3.1-cp310-cp310-linux_aarch64.whl](https://ms-release.obs.cn-north-4.myhuaweicloud.com/2.3.1/MindSpore/unified/aarch64/mindspore-2.3.1-cp310-cp310-linux_aarch64.whl) | d9be757fa42b30e546920b5dffe76527f3f94e9aac88b262174ecd2a0f32c2e0 | +| | Ascend | Linux-x86_64 | Python3.8 | [mindspore-2.3.1-cp38-cp38-linux_x86_64.whl](https://ms-release.obs.cn-north-4.myhuaweicloud.com/2.3.1/MindSpore/unified/x86_64/mindspore-2.3.1-cp38-cp38-linux_x86_64.whl) | f7d19669517be1624d3475a6b22b54f2bc730b998eefd6020a9c9d6ef9d09dee | +| | | | Python3.9 | [mindspore-2.3.1-cp39-cp39-linux_x86_64.whl](https://ms-release.obs.cn-north-4.myhuaweicloud.com/2.3.1/MindSpore/unified/x86_64/mindspore-2.3.1-cp39-cp39-linux_x86_64.whl) | 291ce96deb150445dfb6648998276fa0389264c822abddce58bd93ef65fdd993 | +| | | | Python3.10 | [mindspore-2.3.1-cp310-cp310-linux_x86_64.whl](https://ms-release.obs.cn-north-4.myhuaweicloud.com/2.3.1/MindSpore/unified/x86_64/mindspore-2.3.1-cp310-cp310-linux_x86_64.whl) | 568fc4a52e60f3087e9e0399fa9eed9ff0338bd08ecbcd9c101f2db39ee5fb01 | +| MindSpore
    Golden
    Stick | | any | Python3 | [mindspore_gs-0.5.0-py3-none-any.whl](https://ms-release.obs.cn-north-4.myhuaweicloud.com/2.3.1/GoldenStick/any/mindspore_gs-0.5.0-py3-none-any.whl) | eb1c37e35468fef1e4ff1237ab88b1d718acd47f65117ec532bdb04da9d5372b | + ### 2.3.0 | Module Name | Hardware Platform | Operating System | Python Version | Download Links | SHA-256 | diff --git a/resource/release/release_list_zh_cn.md b/resource/release/release_list_zh_cn.md index 81ab11fb85..f5f0217491 100644 --- a/resource/release/release_list_zh_cn.md +++ b/resource/release/release_list_zh_cn.md @@ -6,6 +6,7 @@ - [配套资料](#配套资料) - [Ascend配套软件包](#ascend配套软件包) - [下载地址](#下载地址) + - [2.3.1](#231) - [2.3.0](#230) - [2.3.0-rc2](#230-rc2) - [2.3.0-rc1](#230-rc1) @@ -114,6 +115,7 @@ | MindSpore版本 | 硬件平台 | 商用版安装指引文档 | 社区版下载地址(安装参考商用版) | |-------------|--------|-----------|------------------| +| 2.3.1 | Ascend | TBD | [CANN 8.0.RC2.beta1](https://www.hiascend.com/developer/download/community/result?module=cann)
    [固件与驱动](https://www.hiascend.com/hardware/firmware-drivers/community) | | 2.3.0 | Ascend | TBD | [CANN 8.0.RC2.beta1](https://www.hiascend.com/developer/download/community/result?module=cann)
    [固件与驱动](https://www.hiascend.com/hardware/firmware-drivers/community) | | 2.3.0-rc2 | Ascend | [Ascend Training Solution 24.0.RC1](https://support.huawei.com/enterprise/zh/doc/EDOC1100373131) | [CANN 8.0.RC1.beta1](https://www.hiascend.com/developer/download/community/result?module=cann)
    [固件与驱动](https://www.hiascend.com/hardware/firmware-drivers/community) | | 2.3.0-rc1 | Ascend | [Ascend Training Solution 24.0.RC1](https://support.huawei.com/enterprise/zh/doc/EDOC1100373131) | [CANN 8.0.RC1.beta1](https://www.hiascend.com/developer/download/community/result?module=cann)
    [固件与驱动](https://www.hiascend.com/hardware/firmware-drivers/community) | @@ -167,6 +169,18 @@ ## 下载地址 +### 2.3.1 + +| 组件 | 硬件平台 | 操作系统 | Python版本 | 链接 | SHA-256 | +|------------------------------|--------|---------------|------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------| +| MindSpore | Ascend | Linux-aarch64 | Python3.8 | [mindspore-2.3.1-cp38-cp38-linux_aarch64.whl](https://ms-release.obs.cn-north-4.myhuaweicloud.com/2.3.1/MindSpore/unified/aarch64/mindspore-2.3.1-cp38-cp38-linux_aarch64.whl) | 976854b9e0c2535541cacb6e1b0b887595fd7aaa03572670b148d1846b08d339 | +| | | | Python3.9 | [mindspore-2.3.1-cp39-cp39-linux_aarch64.whl](https://ms-release.obs.cn-north-4.myhuaweicloud.com/2.3.1/MindSpore/unified/aarch64/mindspore-2.3.1-cp39-cp39-linux_aarch64.whl) | 5fe6a476a7a718c413ac66db71ba93bfe2d6870e13ef90f10652a27170ed338e | +| | | | Python3.10 | [mindspore-2.3.1-cp310-cp310-linux_aarch64.whl](https://ms-release.obs.cn-north-4.myhuaweicloud.com/2.3.1/MindSpore/unified/aarch64/mindspore-2.3.1-cp310-cp310-linux_aarch64.whl) | d9be757fa42b30e546920b5dffe76527f3f94e9aac88b262174ecd2a0f32c2e0 | +| | Ascend | Linux-x86_64 | Python3.8 | [mindspore-2.3.1-cp38-cp38-linux_x86_64.whl](https://ms-release.obs.cn-north-4.myhuaweicloud.com/2.3.1/MindSpore/unified/x86_64/mindspore-2.3.1-cp38-cp38-linux_x86_64.whl) | f7d19669517be1624d3475a6b22b54f2bc730b998eefd6020a9c9d6ef9d09dee | +| | | | Python3.9 | [mindspore-2.3.1-cp39-cp39-linux_x86_64.whl](https://ms-release.obs.cn-north-4.myhuaweicloud.com/2.3.1/MindSpore/unified/x86_64/mindspore-2.3.1-cp39-cp39-linux_x86_64.whl) | 291ce96deb150445dfb6648998276fa0389264c822abddce58bd93ef65fdd993 | +| | | | Python3.10 | [mindspore-2.3.1-cp310-cp310-linux_x86_64.whl](https://ms-release.obs.cn-north-4.myhuaweicloud.com/2.3.1/MindSpore/unified/x86_64/mindspore-2.3.1-cp310-cp310-linux_x86_64.whl) | 568fc4a52e60f3087e9e0399fa9eed9ff0338bd08ecbcd9c101f2db39ee5fb01 | +| MindSpore
    Golden
    Stick | | any | Python3 | [mindspore_gs-0.5.0-py3-none-any.whl](https://ms-release.obs.cn-north-4.myhuaweicloud.com/2.3.1/GoldenStick/any/mindspore_gs-0.5.0-py3-none-any.whl) | eb1c37e35468fef1e4ff1237ab88b1d718acd47f65117ec532bdb04da9d5372b | + ### 2.3.0 | 组件 | 硬件平台 | 操作系统 | Python版本 | 链接 | SHA-256 | -- Gitee From a99afd3358810eff5a47f0c714de792062f27f7c Mon Sep 17 00:00:00 2001 From: yanghaoran Date: Mon, 5 Aug 2024 22:00:42 +0800 Subject: [PATCH 16/69] cudnn download link is missing on Chinese Nvidia webpage, replacing with English version --- install/mindspore_gpu_install_conda.md | 2 +- install/mindspore_gpu_install_conda_en.md | 2 +- install/mindspore_gpu_install_nightly.md | 2 +- install/mindspore_gpu_install_nightly_en.md | 2 +- install/mindspore_gpu_install_pip.md | 2 +- install/mindspore_gpu_install_pip_en.md | 2 +- install/mindspore_gpu_install_source.md | 2 +- install/mindspore_gpu_install_source_en.md | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/install/mindspore_gpu_install_conda.md b/install/mindspore_gpu_install_conda.md index d4a122eecb..8be0fbcee6 100644 --- a/install/mindspore_gpu_install_conda.md +++ b/install/mindspore_gpu_install_conda.md @@ -139,7 +139,7 @@ source ~/.bashrc ### 安装cuDNN -完成CUDA的安装后,在[cuDNN页面](https://developer.nvidia.com/zh-cn/cudnn)登录并下载对应的cuDNN安装包。如果之前安装了CUDA 10.1,下载配套CUDA 10.1的cuDNN v7.6.x;如果之前安装了CUDA 11.1,下载配套CUDA 11.1的cuDNN v8.0.x;如果之前安装了CUDA 11.6,下载配套CUDA 11.6的cuDNN v8.5.x。注意下载后缀名为tgz的压缩包。假设下载的cuDNN包名为`cudnn.tgz`,安装的CUDA版本为11.6,执行以下命令安装cuDNN。 +完成CUDA的安装后,在[cuDNN页面](https://developer.nvidia.com/cudnn)登录并下载对应的cuDNN安装包。如果之前安装了CUDA 10.1,下载配套CUDA 10.1的cuDNN v7.6.x;如果之前安装了CUDA 11.1,下载配套CUDA 11.1的cuDNN v8.0.x;如果之前安装了CUDA 11.6,下载配套CUDA 11.6的cuDNN v8.5.x。注意下载后缀名为tgz的压缩包。假设下载的cuDNN包名为`cudnn.tgz`,安装的CUDA版本为11.6,执行以下命令安装cuDNN。 ```bash tar -zxvf cudnn.tgz diff --git a/install/mindspore_gpu_install_conda_en.md b/install/mindspore_gpu_install_conda_en.md index b6cd419fdf..f0a8d4a490 100644 --- a/install/mindspore_gpu_install_conda_en.md +++ b/install/mindspore_gpu_install_conda_en.md @@ -139,7 +139,7 @@ When the default path /usr/local/cuda has an installation package, the LD_LIBRAR ### Installing cuDNN -After completing the installation of CUDA, Log in and download the corresponding cuDNN installation package from [cuDNN page](https://developer.nvidia.com/zh-cn/cudnn). If CUDA 10.1 was previously installed, download cuDNN v7.6.x for CUDA 10.1. If CUDA 11.1 was previously installed, download cuDNN v8.0.x for CUDA 11.1. If CUDA 11.6 was previously installed, download cuDNN v8.5.x for CUDA 11.6. Note that download the tgz compressed file. Assuming that the downloaded cuDNN package file is named `cudnn.tgz` and the installed CUDA version is 11.6, execute the following command to install cuDNN. +After completing the installation of CUDA, Log in and download the corresponding cuDNN installation package from [cuDNN page](https://developer.nvidia.com/cudnn). If CUDA 10.1 was previously installed, download cuDNN v7.6.x for CUDA 10.1. If CUDA 11.1 was previously installed, download cuDNN v8.0.x for CUDA 11.1. If CUDA 11.6 was previously installed, download cuDNN v8.5.x for CUDA 11.6. Note that download the tgz compressed file. Assuming that the downloaded cuDNN package file is named `cudnn.tgz` and the installed CUDA version is 11.6, execute the following command to install cuDNN. ```bash tar -zxvf cudnn.tgz diff --git a/install/mindspore_gpu_install_nightly.md b/install/mindspore_gpu_install_nightly.md index 3a9f70f87f..73b20c52b0 100644 --- a/install/mindspore_gpu_install_nightly.md +++ b/install/mindspore_gpu_install_nightly.md @@ -85,7 +85,7 @@ source ~/.bashrc ### 安装cuDNN -完成CUDA的安装后,在[cuDNN页面](https://developer.nvidia.com/zh-cn/cudnn)登录并下载对应的cuDNN安装包。如果之前安装了CUDA 10.1,下载配套CUDA 10.1的cuDNN v7.6.x;如果之前安装了CUDA 11.1,下载配套CUDA 11.1的cuDNN v8.0.x;如果之前安装了CUDA 11.6,下载配套CUDA 11.6的cuDNN v8.5.x。注意下载后缀名为tgz的压缩包。假设下载的cuDNN包名为`cudnn.tgz`,安装的CUDA版本为11.6,执行以下命令安装cuDNN。 +完成CUDA的安装后,在[cuDNN页面](https://developer.nvidia.com/cudnn)登录并下载对应的cuDNN安装包。如果之前安装了CUDA 10.1,下载配套CUDA 10.1的cuDNN v7.6.x;如果之前安装了CUDA 11.1,下载配套CUDA 11.1的cuDNN v8.0.x;如果之前安装了CUDA 11.6,下载配套CUDA 11.6的cuDNN v8.5.x。注意下载后缀名为tgz的压缩包。假设下载的cuDNN包名为`cudnn.tgz`,安装的CUDA版本为11.6,执行以下命令安装cuDNN。 ```bash tar -zxvf cudnn.tgz diff --git a/install/mindspore_gpu_install_nightly_en.md b/install/mindspore_gpu_install_nightly_en.md index 05783d35e9..68472e7253 100644 --- a/install/mindspore_gpu_install_nightly_en.md +++ b/install/mindspore_gpu_install_nightly_en.md @@ -85,7 +85,7 @@ When the default path /usr/local/cuda has an installation package, the LD_LIBRAR ### Installing cuDNN -After completing the installation of CUDA, Log in and download the corresponding cuDNN installation package from [cuDNN page](https://developer.nvidia.com/zh-cn/cudnn). If CUDA 10.1 was previously installed, download cuDNN v7.6.x for CUDA 10.1. If CUDA 11.1 was previously installed, download cuDNN v8.0.x for CUDA 11.1. If CUDA 11.6 was previously installed, download cuDNN v8.5.x for CUDA 11.6. Note that download the tgz compressed file. Assuming that the downloaded cuDNN package file is named `cudnn.tgz` and the installed CUDA version is 11.6, execute the following command to install cuDNN. +After completing the installation of CUDA, Log in and download the corresponding cuDNN installation package from [cuDNN page](https://developer.nvidia.com/cudnn). If CUDA 10.1 was previously installed, download cuDNN v7.6.x for CUDA 10.1. If CUDA 11.1 was previously installed, download cuDNN v8.0.x for CUDA 11.1. If CUDA 11.6 was previously installed, download cuDNN v8.5.x for CUDA 11.6. Note that download the tgz compressed file. Assuming that the downloaded cuDNN package file is named `cudnn.tgz` and the installed CUDA version is 11.6, execute the following command to install cuDNN. ```bash tar -zxvf cudnn.tgz diff --git a/install/mindspore_gpu_install_pip.md b/install/mindspore_gpu_install_pip.md index 6cb27db35d..e52d98dedc 100644 --- a/install/mindspore_gpu_install_pip.md +++ b/install/mindspore_gpu_install_pip.md @@ -127,7 +127,7 @@ source ~/.bashrc ### 安装cuDNN -完成CUDA的安装后,在[cuDNN页面](https://developer.nvidia.com/zh-cn/cudnn)登录并下载对应的cuDNN安装包。如果之前安装了CUDA 10.1,下载配套CUDA 10.1的cuDNN v7.6.x;如果之前安装了CUDA 11.1,下载配套CUDA 11.1的cuDNN v8.0.x;如果之前安装了CUDA 11.6,下载配套CUDA 11.6的cuDNN v8.5.x。注意下载后缀名为tgz的压缩包。假设下载的cuDNN包名为`cudnn.tgz`,安装的CUDA版本为11.6,执行以下命令安装cuDNN。 +完成CUDA的安装后,在[cuDNN页面](https://developer.nvidia.com/cudnn)登录并下载对应的cuDNN安装包。如果之前安装了CUDA 10.1,下载配套CUDA 10.1的cuDNN v7.6.x;如果之前安装了CUDA 11.1,下载配套CUDA 11.1的cuDNN v8.0.x;如果之前安装了CUDA 11.6,下载配套CUDA 11.6的cuDNN v8.5.x。注意下载后缀名为tgz的压缩包。假设下载的cuDNN包名为`cudnn.tgz`,安装的CUDA版本为11.6,执行以下命令安装cuDNN。 ```bash tar -zxvf cudnn.tgz diff --git a/install/mindspore_gpu_install_pip_en.md b/install/mindspore_gpu_install_pip_en.md index dcd4d3a06c..1f908ed41c 100644 --- a/install/mindspore_gpu_install_pip_en.md +++ b/install/mindspore_gpu_install_pip_en.md @@ -127,7 +127,7 @@ When the default path /usr/local/cuda has an installation package, the LD_LIBRAR ### Installing cuDNN -After completing the installation of CUDA, Log in and download the corresponding cuDNN installation package from [cuDNN page](https://developer.nvidia.com/zh-cn/cudnn). If CUDA 10.1 was previously installed, download cuDNN v7.6.x for CUDA 10.1. If CUDA 11.1 was previously installed, download cuDNN v8.0.x for CUDA 11.1. If CUDA 11.6 was previously installed, download cuDNN v8.5.x for CUDA 11.6. Note that download the tgz compressed file. Assuming that the downloaded cuDNN package file is named `cudnn.tgz` and the installed CUDA version is 11.6, execute the following command to install cuDNN. +After completing the installation of CUDA, Log in and download the corresponding cuDNN installation package from [cuDNN page](https://developer.nvidia.com/cudnn). If CUDA 10.1 was previously installed, download cuDNN v7.6.x for CUDA 10.1. If CUDA 11.1 was previously installed, download cuDNN v8.0.x for CUDA 11.1. If CUDA 11.6 was previously installed, download cuDNN v8.5.x for CUDA 11.6. Note that download the tgz compressed file. Assuming that the downloaded cuDNN package file is named `cudnn.tgz` and the installed CUDA version is 11.6, execute the following command to install cuDNN. ```bash tar -zxvf cudnn.tgz diff --git a/install/mindspore_gpu_install_source.md b/install/mindspore_gpu_install_source.md index b27524d9c5..5a74ebf386 100644 --- a/install/mindspore_gpu_install_source.md +++ b/install/mindspore_gpu_install_source.md @@ -145,7 +145,7 @@ source ~/.bashrc ### 安装cuDNN -完成CUDA的安装后,在[cuDNN页面](https://developer.nvidia.com/zh-cn/cudnn)登录并下载对应的cuDNN安装包。如果之前安装了CUDA 10.1,下载配套CUDA 10.1的cuDNN v7.6.x;如果之前安装了CUDA 11.1,下载配套CUDA 11.1的cuDNN v8.0.x;如果之前安装了CUDA 11.6,下载配套CUDA 11.6的cuDNN v8.5.x。注意下载后缀名为tgz的压缩包。假设下载的cuDNN包名为`cudnn.tgz`,安装的CUDA版本为11.6,执行以下命令安装cuDNN。 +完成CUDA的安装后,在[cuDNN页面](https://developer.nvidia.com/cudnn)登录并下载对应的cuDNN安装包。如果之前安装了CUDA 10.1,下载配套CUDA 10.1的cuDNN v7.6.x;如果之前安装了CUDA 11.1,下载配套CUDA 11.1的cuDNN v8.0.x;如果之前安装了CUDA 11.6,下载配套CUDA 11.6的cuDNN v8.5.x。注意下载后缀名为tgz的压缩包。假设下载的cuDNN包名为`cudnn.tgz`,安装的CUDA版本为11.6,执行以下命令安装cuDNN。 ```bash tar -zxvf cudnn.tgz diff --git a/install/mindspore_gpu_install_source_en.md b/install/mindspore_gpu_install_source_en.md index d5cd34f644..e029eae3f2 100644 --- a/install/mindspore_gpu_install_source_en.md +++ b/install/mindspore_gpu_install_source_en.md @@ -145,7 +145,7 @@ When the default path /usr/local/cuda has an installation package, the LD_LIBRAR ### Installing cuDNN -After completing the installation of CUDA, Log in and download the corresponding cuDNN installation package from [cuDNN page](https://developer.nvidia.com/zh-cn/cudnn). If CUDA 10.1 was previously installed, download cuDNN v7.6.x for CUDA 10.1. If CUDA 11.1 was previously installed, download cuDNN v8.0.x for CUDA 11.1. If CUDA 11.6 was previously installed, download cuDNN v8.5.x for CUDA 11.6. Note that download the tgz compressed file. Assuming that the downloaded cuDNN package file is named `cudnn.tgz` and the installed CUDA version is 11.6, execute the following command to install cuDNN. +After completing the installation of CUDA, Log in and download the corresponding cuDNN installation package from [cuDNN page](https://developer.nvidia.com/cudnn). If CUDA 10.1 was previously installed, download cuDNN v7.6.x for CUDA 10.1. If CUDA 11.1 was previously installed, download cuDNN v8.0.x for CUDA 11.1. If CUDA 11.6 was previously installed, download cuDNN v8.5.x for CUDA 11.6. Note that download the tgz compressed file. Assuming that the downloaded cuDNN package file is named `cudnn.tgz` and the installed CUDA version is 11.6, execute the following command to install cuDNN. ```bash tar -zxvf cudnn.tgz -- Gitee From 6bc2dd2b483b141a44028c1fffe275980d398d4d Mon Sep 17 00:00:00 2001 From: huan <3174348550@qq.com> Date: Tue, 6 Aug 2024 10:44:01 +0800 Subject: [PATCH 17/69] add lite links and version links --- resource/release/release_list_en.md | 19 ++++++++++--------- resource/release/release_list_zh_cn.md | 19 ++++++++++--------- 2 files changed, 20 insertions(+), 18 deletions(-) diff --git a/resource/release/release_list_en.md b/resource/release/release_list_en.md index 7e31d5d6ae..e1252750d4 100644 --- a/resource/release/release_list_en.md +++ b/resource/release/release_list_en.md @@ -62,11 +62,11 @@ | Category | Subcategory | Version | | --- | --- | --- | -| Releasenotes and API Updates | | [2.3.0](https://gitee.com/mindspore/mindspore/blob/master/RELEASE.md#mindspore-230-release-notes)    [2.3.0-rc2](https://gitee.com/mindspore/mindspore/blob/master/RELEASE.md#mindspore-230-rc2-release-notes)    [2.3.0-rc1](https://gitee.com/mindspore/mindspore/blob/master/RELEASE.md#mindspore-230-rc1-release-notes)    [2.2.14](https://gitee.com/mindspore/mindspore/blob/r2.2/RELEASE.md#)    [2.1.1](https://gitee.com/mindspore/mindspore/blob/r2.1/RELEASE.md#)    [2.0.0](https://gitee.com/mindspore/mindspore/blob/r2.0/RELEASE.md#)    [2.0.0-alpha](https://gitee.com/mindspore/mindspore/blob/r2.0.0-alpha/RELEASE.md#)    [1.10.1](https://gitee.com/mindspore/mindspore/blob/r1.10/RELEASE.md#)    [1.9.0](https://gitee.com/mindspore/mindspore/blob/r1.9/RELEASE.md#)    [1.8.1](https://gitee.com/mindspore/mindspore/blob/r1.8/RELEASE.md#)   
    [1.7.1](https://gitee.com/mindspore/mindspore/blob/r1.7/RELEASE.md#)    [1.6.2](https://gitee.com/mindspore/mindspore/blob/r1.6/RELEASE.md#)    [1.5.2](https://gitee.com/mindspore/mindspore/blob/r1.5/RELEASE.md#)    [1.3.0](https://gitee.com/mindspore/mindspore/blob/r1.3/RELEASE.md#)    [1.2.1](https://gitee.com/mindspore/mindspore/blob/r1.2/RELEASE.md#)    [1.1.1](https://gitee.com/mindspore/mindspore/blob/r1.1/RELEASE.md#)    [1.0.1](https://gitee.com/mindspore/mindspore/blob/r1.0/RELEASE.md#)    [0.7.0-beta](https://gitee.com/mindspore/mindspore/blob/r0.7/RELEASE.md#)   
    [0.6.0-beta](https://gitee.com/mindspore/mindspore/blob/r0.6/RELEASE.md#)    [0.5.2-beta](https://gitee.com/mindspore/mindspore/blob/r0.5/RELEASE.md#)    [0.3.0-alpha](https://gitee.com/mindspore/mindspore/blob/r0.3/RELEASE.md#)    [0.2.0-alpha](https://gitee.com/mindspore/mindspore/blob/r0.2/RELEASE.md#)    [0.1.0-alpha](https://gitee.com/mindspore/mindspore/blob/r0.1/RELEASE.md#) | -| Installation | | [2.3.0](https://gitee.com/mindspore/docs/tree/r2.3.0/install)    [2.3.0-rc2](https://gitee.com/mindspore/docs/tree/r2.3.0rc2/install)    [2.3.0-rc1](https://gitee.com/mindspore/docs/tree/r2.3.q1/install)    [2.2.14](https://gitee.com/mindspore/docs/tree/r2.2/install)    [2.1.1](https://gitee.com/mindspore/docs/tree/r2.1/install)    [2.0.0](https://gitee.com/mindspore/docs/tree/r2.0/install)    [2.0.0-alpha](https://gitee.com/mindspore/docs/tree/r2.0.0-alpha/install)    [1.10.1](https://gitee.com/mindspore/docs/tree/r1.10/install)    [1.9.0](https://gitee.com/mindspore/docs/tree/r1.9/install)    [1.8.1](https://gitee.com/mindspore/docs/tree/r1.8/install)   
    [1.7.1](https://gitee.com/mindspore/docs/tree/r1.7/install)    [1.6.2](https://gitee.com/mindspore/docs/tree/r1.6/install)    [1.5.2](https://gitee.com/mindspore/docs/tree/r1.5/install)    [1.3.0](https://gitee.com/mindspore/docs/tree/r1.3/install)    [1.2.1](https://gitee.com/mindspore/docs/tree/r1.2/install)    [1.1.1](https://gitee.com/mindspore/docs/tree/r1.1/install)    [1.0.1](https://gitee.com/mindspore/docs/tree/r1.0/install)    [0.7.0-beta](https://gitee.com/mindspore/docs/tree/r0.7/install)   
    [0.6.0-beta](https://gitee.com/mindspore/docs/tree/r0.6/install)    [0.5.2-beta](https://gitee.com/mindspore/docs/tree/r0.5/install)    [0.3.0-alpha](https://gitee.com/mindspore/docs/tree/r0.3/install)    [0.2.0-alpha](https://gitee.com/mindspore/docs/tree/r0.2/install)    [0.1.0-alpha](https://gitee.com/mindspore/docs/tree/r0.1/install) | -| Tutorials | | [2.3.0](https://www.mindspore.cn/tutorials/en/r2.3.0/index.html)    [2.3.0-rc2](https://www.mindspore.cn/tutorials/en/r2.3.0rc2/index.html)    [2.3.0-rc1](https://www.mindspore.cn/tutorials/en/r2.3.0rc1/index.html)    [2.2.14](https://mindspore.cn/tutorials/en/r2.2/index.html)    [2.1.1](https://mindspore.cn/tutorials/en/r2.1/index.html)    [2.0.0](https://mindspore.cn/tutorials/en/r2.0/index.html)    [2.0.0-alpha](https://mindspore.cn/tutorials/en/r2.0.0-alpha/index.html)    [1.10.1](https://www.mindspore.cn/tutorials/en/r1.10/index.html)    [1.9.0](https://www.mindspore.cn/tutorials/en/r1.9/index.html)    [1.8.1](https://www.mindspore.cn/tutorials/en/r1.8/index.html)   
    [1.7.1](https://www.mindspore.cn/tutorials/en/r1.7/index.html)    [1.6.2](https://www.mindspore.cn/tutorials/en/r1.6/index.html)    [1.5.2](https://www.mindspore.cn/tutorials/en/r1.5/index.html)    [1.3.0](https://www.mindspore.cn/tutorials/en/r1.3/index.html)    [1.2.1-Training](https://www.mindspore.cn/tutorial/training/en/r1.2/index.html)    [1.2.1-Inference](https://www.mindspore.cn/tutorial/inference/en/r1.2/index.html)   
    [1.2.1-Mobile Phone&IoT](https://www.mindspore.cn/tutorial/lite/en/r1.2/index.html)    [1.1.1-Training](https://www.mindspore.cn/tutorial/training/en/r1.1/index.html)    [1.1.1-Inference](https://www.mindspore.cn/tutorial/inference/en/r1.1/index.html)   
    [1.1.1-Mobile Phone&IoT](https://www.mindspore.cn/tutorial/lite/en/r1.1/index.html)    [1.0.1-Training](https://www.mindspore.cn/tutorial/training/en/r1.0/index.html)    [1.0.1-Inference](https://www.mindspore.cn/tutorial/inference/en/r1.0/index.html)   
    [1.0.0-Mobile Phone&IoT](https://www.mindspore.cn/tutorial/lite/en/r1.0/index.html)    [0.7.0-beta](https://www.mindspore.cn/tutorial/en/r0.7/index.html)    [0.7.0-beta-Mobile Phone&IoT](https://www.mindspore.cn/lite/tutorial/en/r0.7/index.html)   
    [0.6.0-beta](https://www.mindspore.cn/tutorial/en/r0.6/index.html)    [0.5.2-beta](https://www.mindspore.cn/tutorial/en/r0.5/index.html)   [0.3.0-alpha](https://www.mindspore.cn/tutorial/en/0.3.0-alpha/index.html)    [0.2.0-alpha](https://www.mindspore.cn/tutorial/en/0.2.0-alpha/index.html)    [0.1.0-alpha](https://www.mindspore.cn/tutorial/en/0.1.0-alpha/index.html)   
    [master](https://www.mindspore.cn/tutorials/en/master/index.html) | -| Docs |MindSpore | [2.3.0](https://www.mindspore.cn/docs/en/r2.3.0/index.html)    [2.3.0-rc2](https://www.mindspore.cn/docs/en/r2.3.0rc2/index.html)    [2.3.0-rc1](https://www.mindspore.cn/docs/en/r2.3.0rc1/index.html)    [2.2.14](https://www.mindspore.cn/docs/en/r2.2/index.html)    [2.1.1](https://www.mindspore.cn/docs/en/r2.1/index.html)    [2.0.0](https://www.mindspore.cn/docs/en/r2.0/index.html)    [2.0.0-alpha](https://www.mindspore.cn/docs/en/r2.0.0-alpha/index.html)    [1.10.1](https://www.mindspore.cn/docs/en/r1.10/index.html)    [1.9.0](https://www.mindspore.cn/docs/en/r1.9/index.html)    [1.8.1](https://www.mindspore.cn/docs/en/r1.8/index.html)   
    [1.7.1](https://www.mindspore.cn/docs/en/r1.7/index.html)    [1.6.2](https://www.mindspore.cn/docs/programming_guide/en/r1.6/index.html)    [1.5.2](https://www.mindspore.cn/docs/programming_guide/en/r1.5/index.html)    [1.3.0](https://www.mindspore.cn/docs/programming_guide/en/r1.3/index.html)    [1.2.1-Programming Guide](https://www.mindspore.cn/doc/programming_guide/en/r1.2/index.html)   
    [1.2.1-Design&Specification](https://www.mindspore.cn/doc/note/en/r1.2/index.html)    [1.2.1-FAQ](https://www.mindspore.cn/doc/faq/en/r1.2/index.html)    [1.1.1-Programming Guide](https://www.mindspore.cn/doc/programming_guide/en/r1.1/index.html)   
    [1.1.1-Design&Specification](https://www.mindspore.cn/doc/note/en/r1.1/index.html)    [1.1.1-FAQ](https://www.mindspore.cn/doc/faq/en/r1.1/index.html)    [1.0.1-Programming Guide](https://www.mindspore.cn/doc/programming_guide/en/r1.0/index.html)   
    [1.0.1-Design&Specification](https://www.mindspore.cn/doc/note/en/r1.0/index.html)    [1.0.1-FAQ](https://www.mindspore.cn/doc/faq/en/r1.0/index.html)    [0.7.0-beta](https://www.mindspore.cn/docs/en/r0.7/index.html)    [0.6.0-beta](https://www.mindspore.cn/docs/en/r0.6/index.html)   
    [0.5.2-beta](https://www.mindspore.cn/docs/en/r0.5/index.html)    [0.3.0-alpha](https://www.mindspore.cn/docs/en/0.3.0-alpha/index.html)    [0.2.0-alpha](https://www.mindspore.cn/docs/en/0.2.0-alpha/index.html)    [0.1.0-alpha](https://www.mindspore.cn/docs/en/0.1.0-alpha/index.html)    [master](https://www.mindspore.cn/docs/en/master/index.html) | -| |MindSpore Lite | [2.3.0](https://www.mindspore.cn/lite/docs/en/r2.3.0/index.html)    [2.3.0-rc2](https://www.mindspore.cn/lite/docs/en/r2.3.0rc2/index.html)    [2.3.0-rc1](https://www.mindspore.cn/lite/docs/en/r2.3.0rc1/index.html)    [2.2.14](https://www.mindspore.cn/lite/docs/en/r2.2/index.html)    [2.1.1](https://www.mindspore.cn/lite/docs/en/r2.1/index.html)    [2.0.0](https://www.mindspore.cn/lite/docs/en/r2.0/index.html)    [2.0.0-alpha](https://www.mindspore.cn/lite/docs/en/r2.0.0-alpha/index.html)    [1.10.1](https://www.mindspore.cn/lite/docs/en/r1.10/index.html)    [1.9.0](https://www.mindspore.cn/lite/docs/en/r1.9/index.html)    [1.8.1](https://www.mindspore.cn/lite/docs/en/r1.8/index.html)   
    [1.7.0](https://www.mindspore.cn/lite/docs/en/r1.7/index.html)    [1.6.1](https://www.mindspore.cn/lite/docs/en/r1.6/index.html)    [1.5.0](https://www.mindspore.cn/lite/docs/en/r1.5/index.html)    [1.3.0](https://www.mindspore.cn/lite/docs/en/r1.3/index.html)    [0.7.0-beta](https://www.mindspore.cn/lite/docs/en/r0.7/index.html)    [master](https://www.mindspore.cn/lite/docs/en/master/index.html) | +| Releasenotes and API Updates | | [2.3.1](https://gitee.com/mindspore/mindspore/blob/master/RELEASE.md#mindspore-231-release-notes)    [2.3.0](https://gitee.com/mindspore/mindspore/blob/master/RELEASE.md#mindspore-230-release-notes)    [2.3.0-rc2](https://gitee.com/mindspore/mindspore/blob/master/RELEASE.md#mindspore-230-rc2-release-notes)    [2.3.0-rc1](https://gitee.com/mindspore/mindspore/blob/master/RELEASE.md#mindspore-230-rc1-release-notes)    [2.2.14](https://gitee.com/mindspore/mindspore/blob/r2.2/RELEASE.md#)    [2.1.1](https://gitee.com/mindspore/mindspore/blob/r2.1/RELEASE.md#)    [2.0.0](https://gitee.com/mindspore/mindspore/blob/r2.0/RELEASE.md#)    [2.0.0-alpha](https://gitee.com/mindspore/mindspore/blob/r2.0.0-alpha/RELEASE.md#)    [1.10.1](https://gitee.com/mindspore/mindspore/blob/r1.10/RELEASE.md#)    [1.9.0](https://gitee.com/mindspore/mindspore/blob/r1.9/RELEASE.md#)    [1.8.1](https://gitee.com/mindspore/mindspore/blob/r1.8/RELEASE.md#)   
    [1.7.1](https://gitee.com/mindspore/mindspore/blob/r1.7/RELEASE.md#)    [1.6.2](https://gitee.com/mindspore/mindspore/blob/r1.6/RELEASE.md#)    [1.5.2](https://gitee.com/mindspore/mindspore/blob/r1.5/RELEASE.md#)    [1.3.0](https://gitee.com/mindspore/mindspore/blob/r1.3/RELEASE.md#)    [1.2.1](https://gitee.com/mindspore/mindspore/blob/r1.2/RELEASE.md#)    [1.1.1](https://gitee.com/mindspore/mindspore/blob/r1.1/RELEASE.md#)    [1.0.1](https://gitee.com/mindspore/mindspore/blob/r1.0/RELEASE.md#)    [0.7.0-beta](https://gitee.com/mindspore/mindspore/blob/r0.7/RELEASE.md#)   
    [0.6.0-beta](https://gitee.com/mindspore/mindspore/blob/r0.6/RELEASE.md#)    [0.5.2-beta](https://gitee.com/mindspore/mindspore/blob/r0.5/RELEASE.md#)    [0.3.0-alpha](https://gitee.com/mindspore/mindspore/blob/r0.3/RELEASE.md#)    [0.2.0-alpha](https://gitee.com/mindspore/mindspore/blob/r0.2/RELEASE.md#)    [0.1.0-alpha](https://gitee.com/mindspore/mindspore/blob/r0.1/RELEASE.md#) | +| Installation | | [2.3.1](https://gitee.com/mindspore/docs/tree/r2.3.1/install)    [2.3.0](https://gitee.com/mindspore/docs/tree/r2.3.0/install)    [2.3.0-rc2](https://gitee.com/mindspore/docs/tree/r2.3.0rc2/install)    [2.3.0-rc1](https://gitee.com/mindspore/docs/tree/r2.3.q1/install)    [2.2.14](https://gitee.com/mindspore/docs/tree/r2.2/install)    [2.1.1](https://gitee.com/mindspore/docs/tree/r2.1/install)    [2.0.0](https://gitee.com/mindspore/docs/tree/r2.0/install)    [2.0.0-alpha](https://gitee.com/mindspore/docs/tree/r2.0.0-alpha/install)    [1.10.1](https://gitee.com/mindspore/docs/tree/r1.10/install)    [1.9.0](https://gitee.com/mindspore/docs/tree/r1.9/install)    [1.8.1](https://gitee.com/mindspore/docs/tree/r1.8/install)   
    [1.7.1](https://gitee.com/mindspore/docs/tree/r1.7/install)    [1.6.2](https://gitee.com/mindspore/docs/tree/r1.6/install)    [1.5.2](https://gitee.com/mindspore/docs/tree/r1.5/install)    [1.3.0](https://gitee.com/mindspore/docs/tree/r1.3/install)    [1.2.1](https://gitee.com/mindspore/docs/tree/r1.2/install)    [1.1.1](https://gitee.com/mindspore/docs/tree/r1.1/install)    [1.0.1](https://gitee.com/mindspore/docs/tree/r1.0/install)    [0.7.0-beta](https://gitee.com/mindspore/docs/tree/r0.7/install)   
    [0.6.0-beta](https://gitee.com/mindspore/docs/tree/r0.6/install)    [0.5.2-beta](https://gitee.com/mindspore/docs/tree/r0.5/install)    [0.3.0-alpha](https://gitee.com/mindspore/docs/tree/r0.3/install)    [0.2.0-alpha](https://gitee.com/mindspore/docs/tree/r0.2/install)    [0.1.0-alpha](https://gitee.com/mindspore/docs/tree/r0.1/install) | +| Tutorials | | [2.3.1](https://www.mindspore.cn/tutorials/en/r2.3.1/index.html)    [2.3.0](https://www.mindspore.cn/tutorials/en/r2.3.0/index.html)    [2.3.0-rc2](https://www.mindspore.cn/tutorials/en/r2.3.0rc2/index.html)    [2.3.0-rc1](https://www.mindspore.cn/tutorials/en/r2.3.0rc1/index.html)    [2.2.14](https://mindspore.cn/tutorials/en/r2.2/index.html)    [2.1.1](https://mindspore.cn/tutorials/en/r2.1/index.html)    [2.0.0](https://mindspore.cn/tutorials/en/r2.0/index.html)    [2.0.0-alpha](https://mindspore.cn/tutorials/en/r2.0.0-alpha/index.html)    [1.10.1](https://www.mindspore.cn/tutorials/en/r1.10/index.html)    [1.9.0](https://www.mindspore.cn/tutorials/en/r1.9/index.html)    [1.8.1](https://www.mindspore.cn/tutorials/en/r1.8/index.html)   
    [1.7.1](https://www.mindspore.cn/tutorials/en/r1.7/index.html)    [1.6.2](https://www.mindspore.cn/tutorials/en/r1.6/index.html)    [1.5.2](https://www.mindspore.cn/tutorials/en/r1.5/index.html)    [1.3.0](https://www.mindspore.cn/tutorials/en/r1.3/index.html)    [1.2.1-Training](https://www.mindspore.cn/tutorial/training/en/r1.2/index.html)    [1.2.1-Inference](https://www.mindspore.cn/tutorial/inference/en/r1.2/index.html)   
    [1.2.1-Mobile Phone&IoT](https://www.mindspore.cn/tutorial/lite/en/r1.2/index.html)    [1.1.1-Training](https://www.mindspore.cn/tutorial/training/en/r1.1/index.html)    [1.1.1-Inference](https://www.mindspore.cn/tutorial/inference/en/r1.1/index.html)   
    [1.1.1-Mobile Phone&IoT](https://www.mindspore.cn/tutorial/lite/en/r1.1/index.html)    [1.0.1-Training](https://www.mindspore.cn/tutorial/training/en/r1.0/index.html)    [1.0.1-Inference](https://www.mindspore.cn/tutorial/inference/en/r1.0/index.html)   
    [1.0.0-Mobile Phone&IoT](https://www.mindspore.cn/tutorial/lite/en/r1.0/index.html)    [0.7.0-beta](https://www.mindspore.cn/tutorial/en/r0.7/index.html)    [0.7.0-beta-Mobile Phone&IoT](https://www.mindspore.cn/lite/tutorial/en/r0.7/index.html)   
    [0.6.0-beta](https://www.mindspore.cn/tutorial/en/r0.6/index.html)    [0.5.2-beta](https://www.mindspore.cn/tutorial/en/r0.5/index.html)   [0.3.0-alpha](https://www.mindspore.cn/tutorial/en/0.3.0-alpha/index.html)    [0.2.0-alpha](https://www.mindspore.cn/tutorial/en/0.2.0-alpha/index.html)    [0.1.0-alpha](https://www.mindspore.cn/tutorial/en/0.1.0-alpha/index.html)   
    [master](https://www.mindspore.cn/tutorials/en/master/index.html) | +| Docs |MindSpore | [2.3.1](https://www.mindspore.cn/docs/en/r2.3.1/index.html)    [2.3.0](https://www.mindspore.cn/docs/en/r2.3.0/index.html)    [2.3.0-rc2](https://www.mindspore.cn/docs/en/r2.3.0rc2/index.html)    [2.3.0-rc1](https://www.mindspore.cn/docs/en/r2.3.0rc1/index.html)    [2.2.14](https://www.mindspore.cn/docs/en/r2.2/index.html)    [2.1.1](https://www.mindspore.cn/docs/en/r2.1/index.html)    [2.0.0](https://www.mindspore.cn/docs/en/r2.0/index.html)    [2.0.0-alpha](https://www.mindspore.cn/docs/en/r2.0.0-alpha/index.html)    [1.10.1](https://www.mindspore.cn/docs/en/r1.10/index.html)    [1.9.0](https://www.mindspore.cn/docs/en/r1.9/index.html)    [1.8.1](https://www.mindspore.cn/docs/en/r1.8/index.html)   
    [1.7.1](https://www.mindspore.cn/docs/en/r1.7/index.html)    [1.6.2](https://www.mindspore.cn/docs/programming_guide/en/r1.6/index.html)    [1.5.2](https://www.mindspore.cn/docs/programming_guide/en/r1.5/index.html)    [1.3.0](https://www.mindspore.cn/docs/programming_guide/en/r1.3/index.html)    [1.2.1-Programming Guide](https://www.mindspore.cn/doc/programming_guide/en/r1.2/index.html)   
    [1.2.1-Design&Specification](https://www.mindspore.cn/doc/note/en/r1.2/index.html)    [1.2.1-FAQ](https://www.mindspore.cn/doc/faq/en/r1.2/index.html)    [1.1.1-Programming Guide](https://www.mindspore.cn/doc/programming_guide/en/r1.1/index.html)   
    [1.1.1-Design&Specification](https://www.mindspore.cn/doc/note/en/r1.1/index.html)    [1.1.1-FAQ](https://www.mindspore.cn/doc/faq/en/r1.1/index.html)    [1.0.1-Programming Guide](https://www.mindspore.cn/doc/programming_guide/en/r1.0/index.html)   
    [1.0.1-Design&Specification](https://www.mindspore.cn/doc/note/en/r1.0/index.html)    [1.0.1-FAQ](https://www.mindspore.cn/doc/faq/en/r1.0/index.html)    [0.7.0-beta](https://www.mindspore.cn/docs/en/r0.7/index.html)    [0.6.0-beta](https://www.mindspore.cn/docs/en/r0.6/index.html)   
    [0.5.2-beta](https://www.mindspore.cn/docs/en/r0.5/index.html)    [0.3.0-alpha](https://www.mindspore.cn/docs/en/0.3.0-alpha/index.html)    [0.2.0-alpha](https://www.mindspore.cn/docs/en/0.2.0-alpha/index.html)    [0.1.0-alpha](https://www.mindspore.cn/docs/en/0.1.0-alpha/index.html)    [master](https://www.mindspore.cn/docs/en/master/index.html) | +| |MindSpore Lite | [2.3.1](https://www.mindspore.cn/lite/docs/en/r2.3.1/index.html)    [2.3.0](https://www.mindspore.cn/lite/docs/en/r2.3.0/index.html)    [2.3.0-rc2](https://www.mindspore.cn/lite/docs/en/r2.3.0rc2/index.html)    [2.3.0-rc1](https://www.mindspore.cn/lite/docs/en/r2.3.0rc1/index.html)    [2.2.14](https://www.mindspore.cn/lite/docs/en/r2.2/index.html)    [2.1.1](https://www.mindspore.cn/lite/docs/en/r2.1/index.html)    [2.0.0](https://www.mindspore.cn/lite/docs/en/r2.0/index.html)    [2.0.0-alpha](https://www.mindspore.cn/lite/docs/en/r2.0.0-alpha/index.html)    [1.10.1](https://www.mindspore.cn/lite/docs/en/r1.10/index.html)    [1.9.0](https://www.mindspore.cn/lite/docs/en/r1.9/index.html)    [1.8.1](https://www.mindspore.cn/lite/docs/en/r1.8/index.html)   
    [1.7.0](https://www.mindspore.cn/lite/docs/en/r1.7/index.html)    [1.6.1](https://www.mindspore.cn/lite/docs/en/r1.6/index.html)    [1.5.0](https://www.mindspore.cn/lite/docs/en/r1.5/index.html)    [1.3.0](https://www.mindspore.cn/lite/docs/en/r1.3/index.html)    [0.7.0-beta](https://www.mindspore.cn/lite/docs/en/r0.7/index.html)    [master](https://www.mindspore.cn/lite/docs/en/master/index.html) | | |MindSpore Insight | [2.3.0](https://www.mindspore.cn/mindinsight/docs/en/r2.3/index.html)    [2.2.10](https://www.mindspore.cn/mindinsight/docs/en/r2.2/index.html)    [2.1.0](https://www.mindspore.cn/mindinsight/docs/en/r2.1/index.html)    [2.0.0](https://www.mindspore.cn/mindinsight/docs/en/r2.0/index.html)    [2.0.0-alpha](https://www.mindspore.cn/mindinsight/docs/en/r2.0.0-alpha/index.html)    [1.10.1](https://www.mindspore.cn/mindinsight/docs/en/r1.10/index.html)    [1.9.0](https://www.mindspore.cn/mindinsight/docs/en/r1.9/index.html)    [1.8.0](https://www.mindspore.cn/mindinsight/docs/en/r1.8/index.html)   
    [1.7.0](https://www.mindspore.cn/mindinsight/docs/en/r1.7/index.html)    [1.6.1](https://www.mindspore.cn/mindinsight/docs/en/r1.6/index.html)    [1.5.0](https://www.mindspore.cn/mindinsight/docs/en/r1.5/index.html)    [1.3.0](https://www.mindspore.cn/mindinsight/docs/en/r1.3/index.html)    [master](https://www.mindspore.cn/mindinsight/docs/en/master/index.html) | | |MindSpore Hub | [1.9.0](https://www.mindspore.cn/hub/docs/en/r1.9/index.html)    [1.6.0](https://www.mindspore.cn/hub/docs/en/r1.6/index.html)    [1.5.0](https://www.mindspore.cn/hub/docs/en/r1.5/index.html)    [1.3.0](https://www.mindspore.cn/hub/docs/en/r1.3/index.html)    [master](https://www.mindspore.cn/hub/docs/en/master/index.html) | | |MindSpore Armour | [2.0.0](https://www.mindspore.cn/mindarmour/docs/en/r2.0/index.html)    [1.9.0](https://www.mindspore.cn/mindarmour/docs/en/r1.9/index.html)    [1.8.1](https://www.mindspore.cn/mindarmour/docs/en/r1.8/index.html)    [1.7.0](https://www.mindspore.cn/mindarmour/docs/en/r1.7/index.html)    [1.6.0](https://www.mindspore.cn/mindarmour/docs/en/r1.6/index.html)    [1.5.0](https://www.mindspore.cn/mindarmour/docs/en/r1.5/index.html)    [1.3.0](https://www.mindspore.cn/mindarmour/docs/en/r1.3/index.html)    [master](https://www.mindspore.cn/mindarmour/docs/en/master/index.html) | @@ -82,14 +82,14 @@ | |MindSpore Flow | [0.2.0](https://mindspore.cn/mindflow/docs/en/r0.2/index.html)    [0.1.0](https://mindspore.cn/mindflow/docs/en/r0.1/index.html)    [0.1.0-alpha](https://mindspore.cn/mindflow/docs/en/r0.1.0-alpha/index.html)    [master](https://mindspore.cn/mindflow/docs/en/master/index.html) | | |MindSpore Reinforcement | [0.7.0](https://www.mindspore.cn/reinforcement/docs/en/r0.7/index.html)    [0.6.0](https://www.mindspore.cn/reinforcement/docs/en/r0.6/index.html)    [0.6.0-alpha](https://www.mindspore.cn/reinforcement/docs/en/r0.6.0-alpha/index.html)    [0.5.0](https://www.mindspore.cn/reinforcement/docs/en/r0.5/index.html)    [0.3.0](https://www.mindspore.cn/reinforcement/docs/en/r0.3/index.html)    [0.2.1](https://www.mindspore.cn/reinforcement/docs/en/r0.2/index.html)    [0.1.0](https://www.mindspore.cn/reinforcement/docs/en/r0.1/index.html)    [master](https://www.mindspore.cn/reinforcement/docs/en/master/index.html) | | |MindSpore Graph Learning | [0.2.0](https://www.mindspore.cn/graphlearning/docs/en/r0.2/index.html)    [0.2.0-alpha](https://www.mindspore.cn/graphlearning/docs/en/r0.2.0-alpha/index.html)    [0.1.0](https://www.mindspore.cn/graphlearning/docs/en/r0.1/index.html)    [master](https://www.mindspore.cn/graphlearning/docs/en/master/index.html) | -| |MindSpore Golden Stick | [0.4.0](https://www.mindspore.cn/golden_stick/docs/en/r0.4/index.html)    [0.3.0](https://www.mindspore.cn/golden_stick/docs/en/r0.3/index.html)    [0.3.0-alpha](https://www.mindspore.cn/golden_stick/docs/en/r0.3.0-alpha/index.html)    [0.2.0](http://www.mindspore.cn/golden_stick/docs/en/r0.2/index.html)    [0.1.0](http://www.mindspore.cn/golden_stick/docs/en/r0.1/index.html)    [master](http://www.mindspore.cn/golden_stick/docs/en/master/index.html)| +| |MindSpore Golden Stick | [0.5.0](https://www.mindspore.cn/golden_stick/docs/en/r0.5.0/index.html)    [0.4.0](https://www.mindspore.cn/golden_stick/docs/en/r0.4/index.html)    [0.3.0](https://www.mindspore.cn/golden_stick/docs/en/r0.3/index.html)    [0.3.0-alpha](https://www.mindspore.cn/golden_stick/docs/en/r0.3.0-alpha/index.html)    [0.2.0](http://www.mindspore.cn/golden_stick/docs/en/r0.2/index.html)    [0.1.0](http://www.mindspore.cn/golden_stick/docs/en/r0.1/index.html)    [master](http://www.mindspore.cn/golden_stick/docs/en/master/index.html)| | |MindSpore XAI | [1.8.1](https://www.mindspore.cn/xai/docs/en/r1.8/index.html)    [1.5.0](https://www.mindspore.cn/xai/docs/en/r1.5/index.html)    [master](https://www.mindspore.cn/xai/docs/en/master/index.html) | | |MindSpore Recommender | [0.3.0](https://mindspore.cn/recommender/docs/en/r0.3/index.html)    [0.2.0](https://mindspore.cn/recommender/docs/en/r0.2/index.html)    [master](https://mindspore.cn/recommender/docs/en/master/index.html) | | |MindSpore Dev Toolkit(IDE_PLUGING_VERSION_URL) | [2.2.0](https://www.mindspore.cn/devtoolkit/docs/en/r2.2/index.html)    [2.1.0](https://www.mindspore.cn/devtoolkit/docs/en/r2.1/index.html)    [2.0.0](https://www.mindspore.cn/devtoolkit/docs/en/r2.0/index.html)    [1.8.0](http://www.mindspore.cn/devtoolkit/docs/en/r1.8/index.html)    [master](http://www.mindspore.cn/devtoolkit/docs/en/master/index.html)| | |MindSpore Pandas | [0.2.0](https://www.mindspore.cn/mindpandas/docs/en/r0.2/index.html)    [0.1.0](https://www.mindspore.cn/mindpandas/docs/en/r0.1/index.html)    [master](https://www.mindspore.cn//mindpandas/docs/en/master/index.html) | | |MindSpore Vision | [0.1.0](http://www.mindspore.cn/vision/docs/en/r0.1/index.html) | -| API |MindSpore | [2.3.0](https://www.mindspore.cn/docs/en/r2.3.0/api_python/mindspore.html)    [2.3.0rc2](https://www.mindspore.cn/docs/en/r2.3.0rc2/api_python/mindspore.html)    [2.3.0rc1](https://www.mindspore.cn/docs/en/r2.3.0rc1/api_python/mindspore.html)    [2.2.14](https://www.mindspore.cn/docs/en/r2.2/api_python/mindspore.html)    [2.1.1](https://www.mindspore.cn/docs/en/r2.1/api_python/mindspore.html)    [2.0.0](https://www.mindspore.cn/docs/en/r2.0/api_python/mindspore.html)    [2.0.0-alpha](https://www.mindspore.cn/docs/en/r2.0.0-alpha/api_python/mindspore.html)    [1.10.1](https://www.mindspore.cn/docs/en/r1.10/api_python/mindspore.html)    [1.9.0](https://www.mindspore.cn/docs/en/r1.9/api_python/mindspore.html)    [1.8.1](https://www.mindspore.cn/docs/en/r1.8/api_python/mindspore.html)   
    [1.7.1](https://www.mindspore.cn/docs/en/r1.7/api_python/mindspore.html)    [1.6.2](https://www.mindspore.cn/docs/api/en/r1.6/index.html)    [1.5.2](https://www.mindspore.cn/docs/api/en/r1.5/index.html)    [1.3.0](https://www.mindspore.cn/docs/api/en/r1.3/index.html)    [1.2.1](https://www.mindspore.cn/doc/api_python/en/r1.2/index.html)    [1.1.1](https://www.mindspore.cn/doc/api_python/en/r1.1/index.html)    [1.0.1](https://www.mindspore.cn/doc/api_python/en/r1.0/index.html)    [0.7.0-beta](https://www.mindspore.cn/api/en/r0.7/index.html)   
    [0.6.0-beta](https://www.mindspore.cn/api/en/r0.6/index.html)    [0.5.2-beta](https://www.mindspore.cn/api/en/r0.5/index.html)    [0.3.0-alpha](https://www.mindspore.cn/api/en/0.3.0-alpha/index.html)    [0.2.0-alpha](https://www.mindspore.cn/api/en/0.2.0-alpha/index.html)    [0.1.0-alpha](https://www.mindspore.cn/api/en/0.1.0-alpha/index.html)   
    [master](https://www.mindspore.cn/docs/en/master/api_python/mindspore.html) | -| |MindSpore Lite | [2.3.0](https://www.mindspore.cn/lite/api/en/r2.3.0/index.html)    [2.3.0-rc2](https://www.mindspore.cn/lite/api/en/r2.3.0rc2/index.html)    [2.3.0-rc1](https://www.mindspore.cn/lite/api/en/r2.3.0rc1/index.html)    [2.2.14](https://www.mindspore.cn/lite/api/en/r2.2/index.html)    [2.1.1](https://www.mindspore.cn/lite/api/en/r2.1/index.html)    [2.0.0](https://www.mindspore.cn/lite/api/en/r2.0/index.html)    [2.0.0-alpha](https://www.mindspore.cn/lite/api/en/r2.0.0-alpha/index.html)    [1.10.1](https://www.mindspore.cn/lite/api/en/r1.10/index.html)    [1.9.0](https://www.mindspore.cn/lite/api/en/r1.9/index.html)    [1.8.1](https://www.mindspore.cn/lite/api/en/r1.8/index.html)   
    [1.7.0](https://www.mindspore.cn/lite/api/en/r1.7/index.html)    [1.6.1](https://www.mindspore.cn/lite/api/en/r1.6/index.html)    [1.5.0](https://www.mindspore.cn/lite/api/en/r1.5/index.html)    [1.3.0](https://www.mindspore.cn/lite/api/en/r1.3/index.html)    [1.2.1-C++](https://www.mindspore.cn/doc/api_cpp/en/r1.2/index.html)    [1.2.1-Java](https://www.mindspore.cn/doc/api_java/en/r1.2/index.html)    [1.1.1-C++](https://www.mindspore.cn/doc/api_cpp/en/r1.1/index.html)   
    [1.1.1-Java](https://www.mindspore.cn/doc/api_java/en/r1.1/index.html)    [1.0.0](https://www.mindspore.cn/doc/api_cpp/en/r1.0/index.html)    [master](https://www.mindspore.cn/lite/api/en/master/index.html) | +| API |MindSpore | [2.3.1](https://www.mindspore.cn/docs/en/r2.3.1/api_python/mindspore.html)    [2.3.0](https://www.mindspore.cn/docs/en/r2.3.0/api_python/mindspore.html)    [2.3.0rc2](https://www.mindspore.cn/docs/en/r2.3.0rc2/api_python/mindspore.html)    [2.3.0rc1](https://www.mindspore.cn/docs/en/r2.3.0rc1/api_python/mindspore.html)    [2.2.14](https://www.mindspore.cn/docs/en/r2.2/api_python/mindspore.html)    [2.1.1](https://www.mindspore.cn/docs/en/r2.1/api_python/mindspore.html)    [2.0.0](https://www.mindspore.cn/docs/en/r2.0/api_python/mindspore.html)    [2.0.0-alpha](https://www.mindspore.cn/docs/en/r2.0.0-alpha/api_python/mindspore.html)    [1.10.1](https://www.mindspore.cn/docs/en/r1.10/api_python/mindspore.html)    [1.9.0](https://www.mindspore.cn/docs/en/r1.9/api_python/mindspore.html)    [1.8.1](https://www.mindspore.cn/docs/en/r1.8/api_python/mindspore.html)   
    [1.7.1](https://www.mindspore.cn/docs/en/r1.7/api_python/mindspore.html)    [1.6.2](https://www.mindspore.cn/docs/api/en/r1.6/index.html)    [1.5.2](https://www.mindspore.cn/docs/api/en/r1.5/index.html)    [1.3.0](https://www.mindspore.cn/docs/api/en/r1.3/index.html)    [1.2.1](https://www.mindspore.cn/doc/api_python/en/r1.2/index.html)    [1.1.1](https://www.mindspore.cn/doc/api_python/en/r1.1/index.html)    [1.0.1](https://www.mindspore.cn/doc/api_python/en/r1.0/index.html)    [0.7.0-beta](https://www.mindspore.cn/api/en/r0.7/index.html)   
    [0.6.0-beta](https://www.mindspore.cn/api/en/r0.6/index.html)    [0.5.2-beta](https://www.mindspore.cn/api/en/r0.5/index.html)    [0.3.0-alpha](https://www.mindspore.cn/api/en/0.3.0-alpha/index.html)    [0.2.0-alpha](https://www.mindspore.cn/api/en/0.2.0-alpha/index.html)    [0.1.0-alpha](https://www.mindspore.cn/api/en/0.1.0-alpha/index.html)   
    [master](https://www.mindspore.cn/docs/en/master/api_python/mindspore.html) | +| |MindSpore Lite |[2.3.1](https://www.mindspore.cn/lite/api/en/r2.3.1/index.html)    [2.3.0](https://www.mindspore.cn/lite/api/en/r2.3.0/index.html)    [2.3.0-rc2](https://www.mindspore.cn/lite/api/en/r2.3.0rc2/index.html)    [2.3.0-rc1](https://www.mindspore.cn/lite/api/en/r2.3.0rc1/index.html)    [2.2.14](https://www.mindspore.cn/lite/api/en/r2.2/index.html)    [2.1.1](https://www.mindspore.cn/lite/api/en/r2.1/index.html)    [2.0.0](https://www.mindspore.cn/lite/api/en/r2.0/index.html)    [2.0.0-alpha](https://www.mindspore.cn/lite/api/en/r2.0.0-alpha/index.html)    [1.10.1](https://www.mindspore.cn/lite/api/en/r1.10/index.html)    [1.9.0](https://www.mindspore.cn/lite/api/en/r1.9/index.html)    [1.8.1](https://www.mindspore.cn/lite/api/en/r1.8/index.html)   
    [1.7.0](https://www.mindspore.cn/lite/api/en/r1.7/index.html)    [1.6.1](https://www.mindspore.cn/lite/api/en/r1.6/index.html)    [1.5.0](https://www.mindspore.cn/lite/api/en/r1.5/index.html)    [1.3.0](https://www.mindspore.cn/lite/api/en/r1.3/index.html)    [1.2.1-C++](https://www.mindspore.cn/doc/api_cpp/en/r1.2/index.html)    [1.2.1-Java](https://www.mindspore.cn/doc/api_java/en/r1.2/index.html)    [1.1.1-C++](https://www.mindspore.cn/doc/api_cpp/en/r1.1/index.html)   
    [1.1.1-Java](https://www.mindspore.cn/doc/api_java/en/r1.1/index.html)    [1.0.0](https://www.mindspore.cn/doc/api_cpp/en/r1.0/index.html)    [master](https://www.mindspore.cn/lite/api/en/master/index.html) | | |MindSpore Insight | [2.3.0](https://www.mindspore.cn/mindinsight/docs/en/r2.3/mindinsight.debugger.html)    [2.2.10](https://www.mindspore.cn/mindinsight/docs/en/r2.2/mindinsight.debugger.html)    [2.1.0](https://www.mindspore.cn/mindinsight/docs/en/r2.1/mindinsight.debugger.html)    [2.0.0](https://www.mindspore.cn/mindinsight/docs/en/r2.0/mindinsight.debugger.html)    [2.0.0-alpha](https://www.mindspore.cn/mindinsight/docs/en/r2.0.0-alpha/mindinsight.debugger.html)    [1.10.1](https://www.mindspore.cn/mindinsight/docs/en/r1.10/mindinsight.debugger.html)    [1.9.0](https://www.mindspore.cn/mindinsight/docs/en/r1.9/mindinsight.debugger.html)    [1.8.0](https://www.mindspore.cn/mindinsight/docs/en/r1.8/mindinsight.debugger.html)   
    [1.7.0](https://www.mindspore.cn/mindinsight/docs/en/r1.7/mindinsight.debugger.html)    [1.6.1](https://www.mindspore.cn/mindinsight/docs/en/r1.6/mindinsight.debugger.html) | | |MindSpore Hub | [1.9.0](https://www.mindspore.cn/hub/docs/en/r1.9/hub.html)    [1.6.0](https://www.mindspore.cn/hub/docs/en/r1.6/hub.html)    [1.5.0](https://www.mindspore.cn/hub/api/en/r1.5/index.html)    [1.3.0](https://www.mindspore.cn/hub/api/en/r1.3/index.html)    [1.2.0](https://www.mindspore.cn/doc/api_python/en/r1.2/mindspore_hub/mindspore_hub.html)    [1.1.1](https://www.mindspore.cn/doc/api_python/en/r1.1/mindspore_hub/mindspore_hub.html)    [1.0.1](https://www.mindspore.cn/doc/api_python/en/r1.0/mindspore_hub/mindspore_hub.html)    [master](https://www.mindspore.cn/hub/docs/en/master/hub.html) | | |MindSpore Armour | [2.0.0](https://www.mindspore.cn/mindarmour/docs/en/r2.0/mindarmour.html)    [1.9.0](https://www.mindspore.cn/mindarmour/docs/en/r1.9/mindarmour.html)    [1.8.1](https://www.mindspore.cn/mindarmour/docs/en/r1.8/mindarmour.html)    [1.7.0](https://www.mindspore.cn/mindarmour/docs/en/r1.7/mindarmour.html)    [1.6.0](https://www.mindspore.cn/mindarmour/docs/en/r1.6/mindarmour.html)    [1.5.0](https://www.mindspore.cn/mindarmour/api/en/r1.5/index.html)    [1.3.0](https://www.mindspore.cn/mindarmour/api/en/r1.3/index.html)    [1.2.1](https://www.mindspore.cn/doc/api_python/en/r1.2/mindarmour/mindarmour.html)   
    [1.1.1](https://www.mindspore.cn/doc/api_python/en/r1.1/mindarmour/mindarmour.html)    [1.0.1](https://www.mindspore.cn/doc/api_python/en/r1.0/mindarmour/mindarmour.html)    [0.7.0-beta](https://www.mindspore.cn/api/en/r0.7/api/python/mindarmour/mindarmour.html)    [0.6.0-beta](https://www.mindspore.cn/api/en/r0.6/api/python/mindarmour/mindarmour.html)    [0.5.0-beta](https://www.mindspore.cn/api/en/r0.5/api/python/mindarmour/mindarmour.html)    [0.3.0-alpha](https://www.mindspore.cn/api/en/0.3.0-alpha/api/python/mindarmour/mindarmour.html)   
    [0.2.0-alpha](https://www.mindspore.cn/api/en/0.2.0-alpha/api/python/mindarmour/mindarmour.html)    [0.1.0-alpha](https://www.mindspore.cn/api/en/0.1.0-alpha/api/python/mindarmour/mindarmour.html)    [master](https://www.mindspore.cn/mindarmour/docs/en/master/mindarmour.html) | @@ -105,7 +105,7 @@ | |MindSpore Flow | [0.2.0](https://mindspore.cn/mindflow/docs/en/r0.2/mindflow.cell.html)    [0.1.0](https://mindspore.cn/mindflow/docs/en/r0.1/mindflow.cell.html)    [0.1.0-alpha](https://mindspore.cn/mindflow/docs/en/r0.1.0-alpha/mindflow.cell.html)    [master](https://mindspore.cn/mindflow/docs/en/master/mindflow.cell.html) | | |MindSpore Reinforcement | [0.7.0](https://www.mindspore.cn/reinforcement/docs/en/r0.7/reinforcement.html)    [0.6.0](https://www.mindspore.cn/reinforcement/docs/en/r0.6/reinforcement.html)    [0.6.0-alpha](https://www.mindspore.cn/reinforcement/docs/en/r0.6.0-alpha/reinforcement.html)    [0.5.0](https://www.mindspore.cn/reinforcement/docs/en/r0.5/reinforcement.html)    [0.3.0](https://www.mindspore.cn/reinforcement/docs/en/r0.3/reinforcement.html)    [0.2.1](https://www.mindspore.cn/reinforcement/docs/en/r0.2/reinforcement.html)    [0.1.0](https://www.mindspore.cn/reinforcement/api/en/r0.1/index.html)    [master](https://www.mindspore.cn/reinforcement/docs/en/master/reinforcement.html) | | |MindSpore Graph Learning | [0.2.0](https://www.mindspore.cn/graphlearning/docs/en/r0.2/mindspore_gl.dataset.html)    [0.2.0-alpha](https://www.mindspore.cn/graphlearning/docs/en/r0.2.0-alpha/mindspore_gl.dataset.html)    [0.1.0](https://www.mindspore.cn/graphlearning/docs/en/r0.1/mindspore_gl.dataset.html)    [master](https://www.mindspore.cn/graphlearning/docs/en/master/mindspore_gl.dataset.html) | -| |MindSpore Golden Stick | [0.4.0](https://www.mindspore.cn/golden_stick/docs/en/r0.4/mindspore_gs.quantization.html)    [0.3.0](https://www.mindspore.cn/golden_stick/docs/en/r0.3/mindspore_gs.quantization.html)    [0.3.0-alpha](https://www.mindspore.cn/golden_stick/docs/en/r0.3.0-alpha/mindspore_gs.quantization.html)    [0.2.0](http://www.mindspore.cn/golden_stick/docs/en/r0.2/mindspore_gs.quantization.html)    [0.1.0](http://www.mindspore.cn/golden_stick/docs/en/r0.1/mindspore_gs.html)    [master](http://www.mindspore.cn/golden_stick/docs/en/master/mindspore_gs.html)| +| |MindSpore Golden Stick | [0.5.0](https://www.mindspore.cn/golden_stick/docs/en/r0.5.0/mindspore_gs.quantization.html)    [0.4.0](https://www.mindspore.cn/golden_stick/docs/en/r0.4/mindspore_gs.quantization.html)    [0.3.0](https://www.mindspore.cn/golden_stick/docs/en/r0.3/mindspore_gs.quantization.html)    [0.3.0-alpha](https://www.mindspore.cn/golden_stick/docs/en/r0.3.0-alpha/mindspore_gs.quantization.html)    [0.2.0](http://www.mindspore.cn/golden_stick/docs/en/r0.2/mindspore_gs.quantization.html)    [0.1.0](http://www.mindspore.cn/golden_stick/docs/en/r0.1/mindspore_gs.html)    [master](http://www.mindspore.cn/golden_stick/docs/en/master/mindspore_gs.html)| | |MindSpore XAI | [1.8.1](https://www.mindspore.cn/xai/docs/en/r1.8/mindspore_xai.explainer.html)    [1.5.0](https://www.mindspore.cn/xai/api/en/r1.5/index.html)    [master](https://www.mindspore.cn/xai/docs/en/master/mindspore_xai.explainer.html) | | |MindSpore Recommender | [0.3.0](https://www.mindspore.cn/recommender/docs/en/r0.3/recommender.html)    [0.2.0](https://www.mindspore.cn/recommender/docs/en/r0.2/recommender.html)    [master](https://www.mindspore.cn/recommender/docs/en/master/recommender.html) | | |MindSpore Pandas | [0.2.0](https://www.mindspore.cn/mindpandas/docs/en/r0.2/mindpandas.config.html)    [0.1.0](https://www.mindspore.cn/mindpandas/docs/en/r0.1/mindpandas.config.html)    [master](https://www.mindspore.cn//mindpandas/docs/en/master/mindpandas.config.html) | @@ -179,6 +179,7 @@ | | Ascend | Linux-x86_64 | Python3.8 | [mindspore-2.3.1-cp38-cp38-linux_x86_64.whl](https://ms-release.obs.cn-north-4.myhuaweicloud.com/2.3.1/MindSpore/unified/x86_64/mindspore-2.3.1-cp38-cp38-linux_x86_64.whl) | f7d19669517be1624d3475a6b22b54f2bc730b998eefd6020a9c9d6ef9d09dee | | | | | Python3.9 | [mindspore-2.3.1-cp39-cp39-linux_x86_64.whl](https://ms-release.obs.cn-north-4.myhuaweicloud.com/2.3.1/MindSpore/unified/x86_64/mindspore-2.3.1-cp39-cp39-linux_x86_64.whl) | 291ce96deb150445dfb6648998276fa0389264c822abddce58bd93ef65fdd993 | | | | | Python3.10 | [mindspore-2.3.1-cp310-cp310-linux_x86_64.whl](https://ms-release.obs.cn-north-4.myhuaweicloud.com/2.3.1/MindSpore/unified/x86_64/mindspore-2.3.1-cp310-cp310-linux_x86_64.whl) | 568fc4a52e60f3087e9e0399fa9eed9ff0338bd08ecbcd9c101f2db39ee5fb01 | +|MindSpore
    Lite | | | | [Installation Packages Links](https://www.mindspore.cn/lite/docs/en/r2.3.1/use/downloads.html#2-3-1) | | | MindSpore
    Golden
    Stick | | any | Python3 | [mindspore_gs-0.5.0-py3-none-any.whl](https://ms-release.obs.cn-north-4.myhuaweicloud.com/2.3.1/GoldenStick/any/mindspore_gs-0.5.0-py3-none-any.whl) | eb1c37e35468fef1e4ff1237ab88b1d718acd47f65117ec532bdb04da9d5372b | ### 2.3.0 diff --git a/resource/release/release_list_zh_cn.md b/resource/release/release_list_zh_cn.md index f5f0217491..c01acacd6b 100644 --- a/resource/release/release_list_zh_cn.md +++ b/resource/release/release_list_zh_cn.md @@ -62,11 +62,11 @@ | 类别 | 子类别 | 版本 | | --- | --- | --- | -| 版本说明和接口变更 | | [2.3.0](https://gitee.com/mindspore/mindspore/blob/master/RELEASE_CN.md#mindspore-230-release-notes)    [2.3.0-rc2](https://gitee.com/mindspore/mindspore/blob/master/RELEASE_CN.md#mindspore-230-rc2-release-notes)    [2.3.0-rc1](https://gitee.com/mindspore/mindspore/blob/master/RELEASE_CN.md#mindspore-230-rc1-release-notes)    [2.2.14](https://gitee.com/mindspore/mindspore/blob/r2.2/RELEASE_CN.md#)    [2.1.1](https://gitee.com/mindspore/mindspore/blob/r2.1/RELEASE_CN.md#)    [2.0.0](https://gitee.com/mindspore/mindspore/blob/r2.0/RELEASE_CN.md#)    [2.0.0-alpha](https://gitee.com/mindspore/mindspore/blob/r2.0.0-alpha/RELEASE_CN.md#)    [1.10.1](https://gitee.com/mindspore/mindspore/blob/r1.10/RELEASE_CN.md#)    [1.9.0](https://gitee.com/mindspore/mindspore/blob/r1.9/RELEASE_CN.md#)    [1.8.1](https://gitee.com/mindspore/mindspore/blob/r1.8/RELEASE_CN.md#)    [1.7.1](https://gitee.com/mindspore/mindspore/blob/r1.7/RELEASE_CN.md#)   
    [1.6.2](https://gitee.com/mindspore/mindspore/blob/r1.6/RELEASE.md#)    [1.5.2](https://gitee.com/mindspore/mindspore/blob/r1.5/RELEASE.md#)    [1.3.0](https://gitee.com/mindspore/mindspore/blob/r1.3/RELEASE.md#)    [1.2.1](https://gitee.com/mindspore/mindspore/blob/r1.2/RELEASE.md#)    [1.1.1](https://gitee.com/mindspore/mindspore/blob/r1.1/RELEASE.md#)    [1.0.1](https://gitee.com/mindspore/mindspore/blob/r1.0/RELEASE.md#)    [0.7.0-beta](https://gitee.com/mindspore/mindspore/blob/r0.7/RELEASE.md#)    [0.6.0-beta](https://gitee.com/mindspore/mindspore/blob/r0.6/RELEASE.md#)   
    [0.5.2-beta](https://gitee.com/mindspore/mindspore/blob/r0.5/RELEASE.md#)    [0.3.0-alpha](https://gitee.com/mindspore/mindspore/blob/r0.3/RELEASE.md#)    [0.2.0-alpha](https://gitee.com/mindspore/mindspore/blob/r0.2/RELEASE.md#)    [0.1.0-alpha](https://gitee.com/mindspore/mindspore/blob/r0.1/RELEASE.md#)| -| 安装 | | [2.3.0](https://gitee.com/mindspore/docs/tree/r2.3.0/install)    [2.3.0-rc2](https://gitee.com/mindspore/docs/tree/r2.3.0rc2/install)   [2.3.0-rc1](https://gitee.com/mindspore/docs/tree/r2.3.q1/install)    [2.2.14](https://gitee.com/mindspore/docs/tree/r2.2/install)    [2.1.1](https://gitee.com/mindspore/docs/tree/r2.1/install)    [2.0.0](https://gitee.com/mindspore/docs/tree/r2.0/install)    [2.0.0-alpha](https://gitee.com/mindspore/docs/tree/r2.0.0-alpha/install)    [1.10.1](https://gitee.com/mindspore/docs/tree/r1.10/install)    [1.9.0](https://gitee.com/mindspore/docs/tree/r1.9/install)    [1.8.1](https://gitee.com/mindspore/docs/tree/r1.8/install)    [1.7.1](https://gitee.com/mindspore/docs/tree/r1.7/install)   
    [1.6.2](https://gitee.com/mindspore/docs/tree/r1.6/install)    [1.5.2](https://gitee.com/mindspore/docs/tree/r1.5/install)    [1.3.0](https://gitee.com/mindspore/docs/tree/r1.3/install)    [1.2.1](https://gitee.com/mindspore/docs/tree/r1.2/install)    [1.1.1](https://gitee.com/mindspore/docs/tree/r1.1/install)    [1.0.1](https://gitee.com/mindspore/docs/tree/r1.0/install)    [0.7.0-beta](https://gitee.com/mindspore/docs/tree/r0.7/install)    [0.6.0-beta](https://gitee.com/mindspore/docs/tree/r0.6/install)   
    [0.5.2-beta](https://gitee.com/mindspore/docs/tree/r0.5/install)    [0.3.0-alpha](https://gitee.com/mindspore/docs/tree/r0.3/install)    [0.2.0-alpha](https://gitee.com/mindspore/docs/tree/r0.2/install)    [0.1.0-alpha](https://gitee.com/mindspore/docs/tree/r0.1/install)| -| 教程 | | [2.3.0](https://www.mindspore.cn/tutorials/zh-CN/r2.3.0/index.html)    [2.3.0-rc2](https://www.mindspore.cn/tutorials/zh-CN/r2.3.0rc2/index.html)    [2.3.0-rc1](https://www.mindspore.cn/tutorials/zh-CN/r2.3.0rc1/index.html)    [2.2.14](https://www.mindspore.cn/tutorials/zh-CN/r2.2/index.html)    [2.1.1](https://www.mindspore.cn/tutorials/zh-CN/r2.1/index.html)    [2.0.0](https://www.mindspore.cn/tutorials/zh-CN/r2.0/index.html)    [2.0.0-alpha](https://www.mindspore.cn/tutorials/zh-CN/r2.0.0-alpha/index.html)    [1.10.1](https://www.mindspore.cn/tutorials/zh-CN/r1.10/index.html)    [1.9.0](https://www.mindspore.cn/tutorials/zh-CN/r1.9/index.html)    [1.8.1](https://www.mindspore.cn/tutorials/zh-CN/r1.8/index.html)    [1.7.1](https://www.mindspore.cn/tutorials/zh-CN/r1.7/index.html)   
    [1.6.2](https://www.mindspore.cn/tutorials/zh-CN/r1.6/index.html)    [1.5.2](https://www.mindspore.cn/tutorials/zh-CN/r1.5/index.html)    [1.3.0](https://www.mindspore.cn/tutorials/zh-CN/r1.3/index.html)    [1.2.1-训练](https://www.mindspore.cn/tutorial/training/zh-CN/r1.2/index.html)    [1.2.1-推理](https://www.mindspore.cn/tutorial/inference/zh-CN/r1.2/index.html)    [1.2.1-手机&IoT](https://www.mindspore.cn/tutorial/lite/zh-CN/r1.2/index.html)    [1.1.1-训练](https://www.mindspore.cn/tutorial/training/zh-CN/r1.1/index.html)   
    [1.1.1-推理](https://www.mindspore.cn/tutorial/inference/zh-CN/r1.1/index.html)    [1.1.1-手机&IoT](https://www.mindspore.cn/tutorial/lite/zh-CN/r1.1/index.html)    [1.0.1-训练](https://www.mindspore.cn/tutorial/training/zh-CN/r1.0/index.html)    [1.0.1-推理](https://www.mindspore.cn/tutorial/inference/zh-CN/r1.0/index.html)    [1.0.0-手机&IoT](https://www.mindspore.cn/tutorial/lite/zh-CN/r1.0/index.html)  
    [0.7.0-beta](https://www.mindspore.cn/tutorial/zh-CN/r0.7/index.html)    [0.7.0-beta手机&IoT](https://www.mindspore.cn/lite/tutorial/zh-CN/r0.7/index.html)    [0.6.0-beta](https://www.mindspore.cn/tutorial/zh-CN/r0.6/index.html)    [0.5.2-beta](https://www.mindspore.cn/tutorial/zh-CN/r0.5/index.html)    [0.3.0-alpha](https://www.mindspore.cn/tutorial/zh-CN/0.3.0-alpha/index.html)   
    [0.2.0-alpha](https://www.mindspore.cn/tutorial/zh-CN/0.2.0-alpha/index.html)    [0.1.0-alpha](https://www.mindspore.cn/tutorial/zh-CN/0.1.0-alpha/index.html)    [master](https://www.mindspore.cn/tutorials/zh-CN/master/index.html) | -| 文档 |MindSpore | [2.3.0](https://www.mindspore.cn/docs/zh-CN/r2.3.0/index.html)    [2.3.0-rc2](https://www.mindspore.cn/docs/zh-CN/r2.3.0rc2/index.html)    [2.3.0-rc1](https://www.mindspore.cn/docs/zh-CN/r2.3.0rc1/index.html)    [2.2.14](https://www.mindspore.cn/docs/zh-CN/r2.2/index.html)    [2.1.1](https://www.mindspore.cn/docs/zh-CN/r2.1/index.html)    [2.0.0](https://www.mindspore.cn/docs/zh-CN/r2.0/index.html)    [2.0.0-alpha](https://www.mindspore.cn/docs/zh-CN/r2.0.0-alpha/index.html)    [1.10.1](https://www.mindspore.cn/docs/zh-CN/r1.10/index.html)    [1.9.0](https://www.mindspore.cn/docs/zh-CN/r1.9/index.html)    [1.8.1](https://www.mindspore.cn/docs/zh-CN/r1.8/index.html)    [1.7.1](https://www.mindspore.cn/docs/zh-CN/r1.7/index.html)   
    [1.6.2](https://www.mindspore.cn/docs/programming_guide/zh-CN/r1.6/index.html)    [1.5.2](https://www.mindspore.cn/docs/programming_guide/zh-CN/r1.5/index.html)    [1.3.0](https://www.mindspore.cn/docs/programming_guide/zh-CN/r1.3/index.html)    [1.2.1-编程指南](https://www.mindspore.cn/doc/programming_guide/zh-CN/r1.2/index.html)    [1.2.1-设计和规格](https://www.mindspore.cn/doc/note/zh-CN/r1.2/index.html)    [1.2.1-FAQ](https://www.mindspore.cn/doc/faq/zh-CN/r1.2/index.html)   
    [1.1.1-编程指南](https://www.mindspore.cn/doc/programming_guide/zh-CN/r1.1/index.html)    [1.1.1-设计和规格](https://www.mindspore.cn/doc/note/zh-CN/r1.1/index.html)    [1.1.1-FAQ](https://www.mindspore.cn/doc/faq/zh-CN/r1.1/index.html)    [1.0.1-编程指南](https://www.mindspore.cn/doc/programming_guide/zh-CN/r1.0/index.html)   
    [1.0.1-设计和规格](https://www.mindspore.cn/doc/note/zh-CN/r1.0/index.html)    [1.0.1-FAQ](https://www.mindspore.cn/doc/faq/zh-CN/r1.0/index.html)    [0.7.0-beta](https://www.mindspore.cn/docs/zh-CN/r0.7/index.html)    [0.6.0-beta](https://www.mindspore.cn/docs/zh-CN/r0.6/index.html)    [0.5.2-beta](https://www.mindspore.cn/docs/zh-CN/r0.5/index.html)   
    [0.3.0-alpha](https://www.mindspore.cn/docs/zh-CN/0.3.0-alpha/index.html)    [0.2.0-alpha](https://www.mindspore.cn/docs/zh-CN/0.2.0-alpha/index.html)    [0.1.0-alpha](https://www.mindspore.cn/docs/zh-CN/0.1.0-alpha/index.html)    [master](https://www.mindspore.cn/docs/zh-CN/master/index.html) | -| |MindSpore Lite | [2.3.0](https://www.mindspore.cn/lite/docs/zh-CN/r2.3.0/index.html)    [2.3.0-rc2](https://www.mindspore.cn/lite/docs/zh-CN/r2.3.0rc2/index.html)    [2.3.0-rc1](https://www.mindspore.cn/lite/docs/zh-CN/r2.3.0rc1/index.html)    [2.2.14](https://www.mindspore.cn/lite/docs/zh-CN/r2.2/index.html)    [2.1.1](https://www.mindspore.cn/lite/docs/zh-CN/r2.1/index.html)    [2.0.0](https://www.mindspore.cn/lite/docs/zh-CN/r2.0/index.html)    [2.0.0-alpha](https://www.mindspore.cn/lite/docs/zh-CN/r2.0.0-alpha/index.html)    [1.10.1](https://www.mindspore.cn/lite/docs/zh-CN/r1.10/index.html)    [1.9.0](https://www.mindspore.cn/lite/docs/zh-CN/r1.9/index.html)    [1.8.1](https://www.mindspore.cn/lite/docs/zh-CN/r1.8/index.html)    [1.7.0](https://www.mindspore.cn/lite/docs/zh-CN/r1.7/index.html)   
    [1.6.1](https://www.mindspore.cn/lite/docs/zh-CN/r1.6/index.html)    [1.5.0](https://www.mindspore.cn/lite/docs/zh-CN/r1.5/index.html)    [1.3.0](https://www.mindspore.cn/lite/docs/zh-CN/r1.3/index.html)    [0.7.0-beta](https://www.mindspore.cn/lite/docs/zh-CN/r0.7/index.html)    [master](https://www.mindspore.cn/lite/docs/zh-CN/master/index.html) | +| 版本说明和接口变更 | |[2.3.1](https://gitee.com/mindspore/mindspore/blob/master/RELEASE_CN.md#mindspore-231-release-notes)    [2.3.0](https://gitee.com/mindspore/mindspore/blob/master/RELEASE_CN.md#mindspore-230-release-notes)    [2.3.0-rc2](https://gitee.com/mindspore/mindspore/blob/master/RELEASE_CN.md#mindspore-230-rc2-release-notes)    [2.3.0-rc1](https://gitee.com/mindspore/mindspore/blob/master/RELEASE_CN.md#mindspore-230-rc1-release-notes)    [2.2.14](https://gitee.com/mindspore/mindspore/blob/r2.2/RELEASE_CN.md#)    [2.1.1](https://gitee.com/mindspore/mindspore/blob/r2.1/RELEASE_CN.md#)    [2.0.0](https://gitee.com/mindspore/mindspore/blob/r2.0/RELEASE_CN.md#)    [2.0.0-alpha](https://gitee.com/mindspore/mindspore/blob/r2.0.0-alpha/RELEASE_CN.md#)    [1.10.1](https://gitee.com/mindspore/mindspore/blob/r1.10/RELEASE_CN.md#)    [1.9.0](https://gitee.com/mindspore/mindspore/blob/r1.9/RELEASE_CN.md#)    [1.8.1](https://gitee.com/mindspore/mindspore/blob/r1.8/RELEASE_CN.md#)    [1.7.1](https://gitee.com/mindspore/mindspore/blob/r1.7/RELEASE_CN.md#)   
    [1.6.2](https://gitee.com/mindspore/mindspore/blob/r1.6/RELEASE.md#)    [1.5.2](https://gitee.com/mindspore/mindspore/blob/r1.5/RELEASE.md#)    [1.3.0](https://gitee.com/mindspore/mindspore/blob/r1.3/RELEASE.md#)    [1.2.1](https://gitee.com/mindspore/mindspore/blob/r1.2/RELEASE.md#)    [1.1.1](https://gitee.com/mindspore/mindspore/blob/r1.1/RELEASE.md#)    [1.0.1](https://gitee.com/mindspore/mindspore/blob/r1.0/RELEASE.md#)    [0.7.0-beta](https://gitee.com/mindspore/mindspore/blob/r0.7/RELEASE.md#)    [0.6.0-beta](https://gitee.com/mindspore/mindspore/blob/r0.6/RELEASE.md#)   
    [0.5.2-beta](https://gitee.com/mindspore/mindspore/blob/r0.5/RELEASE.md#)    [0.3.0-alpha](https://gitee.com/mindspore/mindspore/blob/r0.3/RELEASE.md#)    [0.2.0-alpha](https://gitee.com/mindspore/mindspore/blob/r0.2/RELEASE.md#)    [0.1.0-alpha](https://gitee.com/mindspore/mindspore/blob/r0.1/RELEASE.md#)| +| 安装 | | [2.3.1](https://gitee.com/mindspore/docs/tree/r2.3.1/install)    [2.3.0](https://gitee.com/mindspore/docs/tree/r2.3.0/install)    [2.3.0-rc2](https://gitee.com/mindspore/docs/tree/r2.3.0rc2/install)   [2.3.0-rc1](https://gitee.com/mindspore/docs/tree/r2.3.q1/install)    [2.2.14](https://gitee.com/mindspore/docs/tree/r2.2/install)    [2.1.1](https://gitee.com/mindspore/docs/tree/r2.1/install)    [2.0.0](https://gitee.com/mindspore/docs/tree/r2.0/install)    [2.0.0-alpha](https://gitee.com/mindspore/docs/tree/r2.0.0-alpha/install)    [1.10.1](https://gitee.com/mindspore/docs/tree/r1.10/install)    [1.9.0](https://gitee.com/mindspore/docs/tree/r1.9/install)    [1.8.1](https://gitee.com/mindspore/docs/tree/r1.8/install)    [1.7.1](https://gitee.com/mindspore/docs/tree/r1.7/install)   
    [1.6.2](https://gitee.com/mindspore/docs/tree/r1.6/install)    [1.5.2](https://gitee.com/mindspore/docs/tree/r1.5/install)    [1.3.0](https://gitee.com/mindspore/docs/tree/r1.3/install)    [1.2.1](https://gitee.com/mindspore/docs/tree/r1.2/install)    [1.1.1](https://gitee.com/mindspore/docs/tree/r1.1/install)    [1.0.1](https://gitee.com/mindspore/docs/tree/r1.0/install)    [0.7.0-beta](https://gitee.com/mindspore/docs/tree/r0.7/install)    [0.6.0-beta](https://gitee.com/mindspore/docs/tree/r0.6/install)   
    [0.5.2-beta](https://gitee.com/mindspore/docs/tree/r0.5/install)    [0.3.0-alpha](https://gitee.com/mindspore/docs/tree/r0.3/install)    [0.2.0-alpha](https://gitee.com/mindspore/docs/tree/r0.2/install)    [0.1.0-alpha](https://gitee.com/mindspore/docs/tree/r0.1/install)| +| 教程 | | [2.3.1](https://www.mindspore.cn/tutorials/zh-CN/r2.3.1/index.html)    [2.3.0](https://www.mindspore.cn/tutorials/zh-CN/r2.3.0/index.html)    [2.3.0-rc2](https://www.mindspore.cn/tutorials/zh-CN/r2.3.0rc2/index.html)    [2.3.0-rc1](https://www.mindspore.cn/tutorials/zh-CN/r2.3.0rc1/index.html)    [2.2.14](https://www.mindspore.cn/tutorials/zh-CN/r2.2/index.html)    [2.1.1](https://www.mindspore.cn/tutorials/zh-CN/r2.1/index.html)    [2.0.0](https://www.mindspore.cn/tutorials/zh-CN/r2.0/index.html)    [2.0.0-alpha](https://www.mindspore.cn/tutorials/zh-CN/r2.0.0-alpha/index.html)    [1.10.1](https://www.mindspore.cn/tutorials/zh-CN/r1.10/index.html)    [1.9.0](https://www.mindspore.cn/tutorials/zh-CN/r1.9/index.html)    [1.8.1](https://www.mindspore.cn/tutorials/zh-CN/r1.8/index.html)    [1.7.1](https://www.mindspore.cn/tutorials/zh-CN/r1.7/index.html)   
    [1.6.2](https://www.mindspore.cn/tutorials/zh-CN/r1.6/index.html)    [1.5.2](https://www.mindspore.cn/tutorials/zh-CN/r1.5/index.html)    [1.3.0](https://www.mindspore.cn/tutorials/zh-CN/r1.3/index.html)    [1.2.1-训练](https://www.mindspore.cn/tutorial/training/zh-CN/r1.2/index.html)    [1.2.1-推理](https://www.mindspore.cn/tutorial/inference/zh-CN/r1.2/index.html)    [1.2.1-手机&IoT](https://www.mindspore.cn/tutorial/lite/zh-CN/r1.2/index.html)    [1.1.1-训练](https://www.mindspore.cn/tutorial/training/zh-CN/r1.1/index.html)   
    [1.1.1-推理](https://www.mindspore.cn/tutorial/inference/zh-CN/r1.1/index.html)    [1.1.1-手机&IoT](https://www.mindspore.cn/tutorial/lite/zh-CN/r1.1/index.html)    [1.0.1-训练](https://www.mindspore.cn/tutorial/training/zh-CN/r1.0/index.html)    [1.0.1-推理](https://www.mindspore.cn/tutorial/inference/zh-CN/r1.0/index.html)    [1.0.0-手机&IoT](https://www.mindspore.cn/tutorial/lite/zh-CN/r1.0/index.html)  
    [0.7.0-beta](https://www.mindspore.cn/tutorial/zh-CN/r0.7/index.html)    [0.7.0-beta手机&IoT](https://www.mindspore.cn/lite/tutorial/zh-CN/r0.7/index.html)    [0.6.0-beta](https://www.mindspore.cn/tutorial/zh-CN/r0.6/index.html)    [0.5.2-beta](https://www.mindspore.cn/tutorial/zh-CN/r0.5/index.html)    [0.3.0-alpha](https://www.mindspore.cn/tutorial/zh-CN/0.3.0-alpha/index.html)   
    [0.2.0-alpha](https://www.mindspore.cn/tutorial/zh-CN/0.2.0-alpha/index.html)    [0.1.0-alpha](https://www.mindspore.cn/tutorial/zh-CN/0.1.0-alpha/index.html)    [master](https://www.mindspore.cn/tutorials/zh-CN/master/index.html) | +| 文档 |MindSpore | [2.3.1](https://www.mindspore.cn/docs/zh-CN/r2.3.1/index.html)    [2.3.0](https://www.mindspore.cn/docs/zh-CN/r2.3.0/index.html)    [2.3.0-rc2](https://www.mindspore.cn/docs/zh-CN/r2.3.0rc2/index.html)    [2.3.0-rc1](https://www.mindspore.cn/docs/zh-CN/r2.3.0rc1/index.html)    [2.2.14](https://www.mindspore.cn/docs/zh-CN/r2.2/index.html)    [2.1.1](https://www.mindspore.cn/docs/zh-CN/r2.1/index.html)    [2.0.0](https://www.mindspore.cn/docs/zh-CN/r2.0/index.html)    [2.0.0-alpha](https://www.mindspore.cn/docs/zh-CN/r2.0.0-alpha/index.html)    [1.10.1](https://www.mindspore.cn/docs/zh-CN/r1.10/index.html)    [1.9.0](https://www.mindspore.cn/docs/zh-CN/r1.9/index.html)    [1.8.1](https://www.mindspore.cn/docs/zh-CN/r1.8/index.html)    [1.7.1](https://www.mindspore.cn/docs/zh-CN/r1.7/index.html)   
    [1.6.2](https://www.mindspore.cn/docs/programming_guide/zh-CN/r1.6/index.html)    [1.5.2](https://www.mindspore.cn/docs/programming_guide/zh-CN/r1.5/index.html)    [1.3.0](https://www.mindspore.cn/docs/programming_guide/zh-CN/r1.3/index.html)    [1.2.1-编程指南](https://www.mindspore.cn/doc/programming_guide/zh-CN/r1.2/index.html)    [1.2.1-设计和规格](https://www.mindspore.cn/doc/note/zh-CN/r1.2/index.html)    [1.2.1-FAQ](https://www.mindspore.cn/doc/faq/zh-CN/r1.2/index.html)   
    [1.1.1-编程指南](https://www.mindspore.cn/doc/programming_guide/zh-CN/r1.1/index.html)    [1.1.1-设计和规格](https://www.mindspore.cn/doc/note/zh-CN/r1.1/index.html)    [1.1.1-FAQ](https://www.mindspore.cn/doc/faq/zh-CN/r1.1/index.html)    [1.0.1-编程指南](https://www.mindspore.cn/doc/programming_guide/zh-CN/r1.0/index.html)   
    [1.0.1-设计和规格](https://www.mindspore.cn/doc/note/zh-CN/r1.0/index.html)    [1.0.1-FAQ](https://www.mindspore.cn/doc/faq/zh-CN/r1.0/index.html)    [0.7.0-beta](https://www.mindspore.cn/docs/zh-CN/r0.7/index.html)    [0.6.0-beta](https://www.mindspore.cn/docs/zh-CN/r0.6/index.html)    [0.5.2-beta](https://www.mindspore.cn/docs/zh-CN/r0.5/index.html)   
    [0.3.0-alpha](https://www.mindspore.cn/docs/zh-CN/0.3.0-alpha/index.html)    [0.2.0-alpha](https://www.mindspore.cn/docs/zh-CN/0.2.0-alpha/index.html)    [0.1.0-alpha](https://www.mindspore.cn/docs/zh-CN/0.1.0-alpha/index.html)    [master](https://www.mindspore.cn/docs/zh-CN/master/index.html) | +| |MindSpore Lite | [2.3.1](https://www.mindspore.cn/lite/docs/zh-CN/r2.3.1/index.html)    [2.3.0](https://www.mindspore.cn/lite/docs/zh-CN/r2.3.0/index.html)    [2.3.0-rc2](https://www.mindspore.cn/lite/docs/zh-CN/r2.3.0rc2/index.html)    [2.3.0-rc1](https://www.mindspore.cn/lite/docs/zh-CN/r2.3.0rc1/index.html)    [2.2.14](https://www.mindspore.cn/lite/docs/zh-CN/r2.2/index.html)    [2.1.1](https://www.mindspore.cn/lite/docs/zh-CN/r2.1/index.html)    [2.0.0](https://www.mindspore.cn/lite/docs/zh-CN/r2.0/index.html)    [2.0.0-alpha](https://www.mindspore.cn/lite/docs/zh-CN/r2.0.0-alpha/index.html)    [1.10.1](https://www.mindspore.cn/lite/docs/zh-CN/r1.10/index.html)    [1.9.0](https://www.mindspore.cn/lite/docs/zh-CN/r1.9/index.html)    [1.8.1](https://www.mindspore.cn/lite/docs/zh-CN/r1.8/index.html)    [1.7.0](https://www.mindspore.cn/lite/docs/zh-CN/r1.7/index.html)   
    [1.6.1](https://www.mindspore.cn/lite/docs/zh-CN/r1.6/index.html)    [1.5.0](https://www.mindspore.cn/lite/docs/zh-CN/r1.5/index.html)    [1.3.0](https://www.mindspore.cn/lite/docs/zh-CN/r1.3/index.html)    [0.7.0-beta](https://www.mindspore.cn/lite/docs/zh-CN/r0.7/index.html)    [master](https://www.mindspore.cn/lite/docs/zh-CN/master/index.html) | | |MindSpore Insight | [2.3.0](https://www.mindspore.cn/mindinsight/docs/zh-CN/r2.3/index.html)    [2.2.10](https://www.mindspore.cn/mindinsight/docs/zh-CN/r2.2/index.html)    [2.1.0](https://www.mindspore.cn/mindinsight/docs/zh-CN/r2.1/index.html)    [2.0.0](https://www.mindspore.cn/mindinsight/docs/zh-CN/r2.0/index.html)    [2.0.0-alpha](https://www.mindspore.cn/mindinsight/docs/zh-CN/r2.0.0-alpha/index.html)    [1.10.1](https://www.mindspore.cn/mindinsight/docs/zh-CN/r1.10/index.html)    [1.9.0](https://www.mindspore.cn/mindinsight/docs/zh-CN/r1.9/index.html)    [1.8.0](https://www.mindspore.cn/mindinsight/docs/zh-CN/r1.8/index.html)    [1.7.0](https://www.mindspore.cn/mindinsight/docs/zh-CN/r1.7/index.html)   
    [1.6.1](https://www.mindspore.cn/mindinsight/docs/zh-CN/r1.6/index.html)    [1.5.0](https://www.mindspore.cn/mindinsight/docs/zh-CN/r1.5/index.html)    [1.3.0](https://www.mindspore.cn/mindinsight/docs/zh-CN/r1.3/index.html)    [master](https://www.mindspore.cn/mindinsight/docs/zh-CN/master/index.html) | | |MindSpore Hub | [1.9.0](https://www.mindspore.cn/hub/docs/zh-CN/r1.9/index.html)    [1.6.0](https://www.mindspore.cn/hub/docs/zh-CN/r1.6/index.html)    [1.5.0](https://www.mindspore.cn/hub/docs/zh-CN/r1.5/index.html)    [1.3.0](https://www.mindspore.cn/hub/docs/zh-CN/r1.3/index.html)    [master](https://www.mindspore.cn/hub/docs/zh-CN/master/index.html) | | |MindSpore Armour | [2.0.0](https://www.mindspore.cn/mindarmour/docs/zh-CN/r2.0/index.html)    [1.9.0](https://www.mindspore.cn/mindarmour/docs/zh-CN/r1.9/index.html)    [1.8.1](https://www.mindspore.cn/mindarmour/docs/zh-CN/r1.8/index.html)    [1.7.0](https://www.mindspore.cn/mindarmour/docs/zh-CN/r1.7/index.html)    [1.6.0](https://www.mindspore.cn/mindarmour/docs/zh-CN/r1.6/index.html)    [1.5.0](https://www.mindspore.cn/mindarmour/docs/zh-CN/r1.5/index.html)    [1.3.0](https://www.mindspore.cn/mindarmour/docs/zh-CN/r1.3/index.html)   
    [master](https://www.mindspore.cn/mindarmour/docs/zh-CN/master/index.html) | @@ -82,14 +82,14 @@ | |MindSpore Flow | [0.2.0](https://mindspore.cn/mindflow/docs/zh-CN/r0.2/index.html)    [0.1.0](https://mindspore.cn/mindflow/docs/zh-CN/r0.1/index.html)    [0.1.0-alpha](https://mindspore.cn/mindflow/docs/zh-CN/r0.1.0-alpha/index.html)    [master](https://mindspore.cn/mindflow/docs/zh-CN/master/index.html) | | |MindSpore Reinforcement | [0.7.0](https://www.mindspore.cn/reinforcement/docs/zh-CN/r0.7/index.html)    [0.6.0](https://www.mindspore.cn/reinforcement/docs/zh-CN/r0.6/index.html)    [0.6.0-alpha](https://www.mindspore.cn/reinforcement/docs/zh-CN/r0.6.0-alpha/index.html)    [0.5.0](https://www.mindspore.cn/reinforcement/docs/zh-CN/r0.5/index.html)    [0.3.0](https://www.mindspore.cn/reinforcement/docs/zh-CN/r0.3/index.html)    [0.2.1](https://www.mindspore.cn/reinforcement/docs/zh-CN/r0.2/index.html)    [0.1.0](https://www.mindspore.cn/reinforcement/docs/zh-CN/r0.1/index.html)    [master](https://www.mindspore.cn/reinforcement/docs/zh-CN/master/index.html) | | |MindSpore Graph Learning | [0.2.0](https://www.mindspore.cn/graphlearning/docs/zh-CN/r0.2/index.html)    [0.2.0-alpha](https://www.mindspore.cn/graphlearning/docs/zh-CN/r0.2.0-alpha/index.html)    [0.1.0](https://www.mindspore.cn/graphlearning/docs/zh-CN/r0.1/index.html)    [master](https://www.mindspore.cn/graphlearning/docs/zh-CN/master/index.html) | -| |MindSpore Golden Stick | [0.4.0](https://www.mindspore.cn/golden_stick/docs/zh-CN/r0.4/index.html)    [0.3.0](https://www.mindspore.cn/golden_stick/docs/zh-CN/r0.3/index.html)    [0.3.0-alpha](https://www.mindspore.cn/golden_stick/docs/zh-CN/r0.3.0-alpha/index.html)    [0.2.0](http://www.mindspore.cn/golden_stick/docs/zh-CN/r0.2/index.html)    [0.1.0](http://www.mindspore.cn/golden_stick/docs/zh-CN/r0.1/index.html)    [master](http://www.mindspore.cn/golden_stick/docs/zh-CN/master/index.html)| +| |MindSpore Golden Stick | [0.5.0](https://www.mindspore.cn/golden_stick/docs/zh-CN/r0.5.0/index.html)    [0.4.0](https://www.mindspore.cn/golden_stick/docs/zh-CN/r0.4/index.html)    [0.3.0](https://www.mindspore.cn/golden_stick/docs/zh-CN/r0.3/index.html)    [0.3.0-alpha](https://www.mindspore.cn/golden_stick/docs/zh-CN/r0.3.0-alpha/index.html)    [0.2.0](http://www.mindspore.cn/golden_stick/docs/zh-CN/r0.2/index.html)    [0.1.0](http://www.mindspore.cn/golden_stick/docs/zh-CN/r0.1/index.html)    [master](http://www.mindspore.cn/golden_stick/docs/zh-CN/master/index.html)| | |MindSpore XAI | [1.8.1](https://www.mindspore.cn/xai/docs/zh-CN/r1.8/index.html)    [1.5.0](https://www.mindspore.cn/xai/docs/zh-CN/r1.5/index.html)    [master](https://www.mindspore.cn/xai/docs/zh-CN/master/index.html) | | |MindSpore Recommender | [0.3.0](https://www.mindspore.cn/recommender/docs/zh-CN/r0.3/index.html)    [0.2.0](https://www.mindspore.cn/recommender/docs/zh-CN/r0.2/index.html)    [master](https://www.mindspore.cn/recommender/docs/zh-CN/master/index.html) | | |MindSpore Dev Toolkit(IDE_PLUGING_VERSION_URL) | [2.2.0](https://www.mindspore.cn/devtoolkit/docs/zh-CN/r2.2/index.html)    [2.1.0](https://www.mindspore.cn/devtoolkit/docs/zh-CN/r2.1/index.html)    [2.0.0](https://www.mindspore.cn/devtoolkit/docs/zh-CN/r2.0/index.html)    [1.8.0](http://www.mindspore.cn/devtoolkit/docs/zh-CN/r1.8/index.html)    [master](http://www.mindspore.cn/devtoolkit/docs/zh-CN/master/index.html)| | |MindSpore Pandas | [0.2.0](https://www.mindspore.cn/mindpandas/docs/zh-CN/r0.2/index.html)    [0.1.0](https://www.mindspore.cn/mindpandas/docs/zh-CN/r0.1/index.html)    [master](https://www.mindspore.cn//mindpandas/docs/zh-CN/master/index.html) | | |MindSpore Vision | [0.1.0](http://www.mindspore.cn/vision/docs/zh-CN/r0.1/index.html) | -| API |MindSpore | [2.3.0](https://www.mindspore.cn/docs/zh-CN/r2.3.0/api_python/mindspore.html)    [2.3.0rc2](https://www.mindspore.cn/docs/zh-CN/r2.3.0rc2/api_python/mindspore.html)    [2.3.0rc1](https://www.mindspore.cn/docs/zh-CN/r2.3.0rc1/api_python/mindspore.html)    [2.2.14](https://www.mindspore.cn/docs/zh-CN/r2.2/api_python/mindspore.html)    [2.1.1](https://www.mindspore.cn/docs/zh-CN/r2.1/api_python/mindspore.html)    [2.0.0](https://www.mindspore.cn/docs/zh-CN/r2.0/api_python/mindspore.html)    [2.0.0-alpha](https://www.mindspore.cn/docs/zh-CN/r2.0.0-alpha/api_python/mindspore.html)    [1.10.1](https://www.mindspore.cn/docs/zh-CN/r1.10/api_python/mindspore.html)    [1.9.0](https://www.mindspore.cn/docs/zh-CN/r1.9/api_python/mindspore.html)    [1.8.1](https://www.mindspore.cn/docs/zh-CN/r1.8/api_python/mindspore.html)    [1.7.1](https://www.mindspore.cn/docs/zh-CN/r1.7/api_python/mindspore.html)   
    [1.6.2](https://www.mindspore.cn/docs/api/zh-CN/r1.6/index.html)    [1.5.2](https://www.mindspore.cn/docs/api/zh-CN/r1.5/index.html)    [1.3.0](https://www.mindspore.cn/docs/api/zh-CN/r1.3/index.html)    [1.2.1](https://www.mindspore.cn/doc/api_python/zh-CN/r1.2/index.html)    [1.1.1](https://www.mindspore.cn/doc/api_python/zh-CN/r1.1/index.html)    [1.0.1](https://www.mindspore.cn/doc/api_python/zh-CN/r1.0/index.html)    [0.7.0-beta](https://www.mindspore.cn/api/zh-CN/r0.7/index.html)   
    [0.6.0-beta](https://www.mindspore.cn/api/zh-CN/r0.6/index.html)    [0.5.2-beta](https://www.mindspore.cn/api/zh-CN/r0.5/index.html)    [0.3.0-alpha](https://www.mindspore.cn/api/zh-CN/0.3.0-alpha/index.html)    [0.2.0-alpha](https://www.mindspore.cn/api/zh-CN/0.2.0-alpha/index.html)   
    [0.1.0-alpha](https://www.mindspore.cn/api/zh-CN/0.1.0-alpha/index.html)   [master](https://www.mindspore.cn/docs/zh-CN/master/api_python/mindspore.html) | -| |MindSpore Lite | [2.3.0](https://www.mindspore.cn/lite/api/zh-CN/r2.3.0/index.html)    [2.3.0-rc2](https://www.mindspore.cn/lite/api/zh-CN/r2.3.0rc2/index.html)    [2.3.0-rc1](https://www.mindspore.cn/lite/api/zh-CN/r2.3.0rc1/index.html)    [2.2.14](https://www.mindspore.cn/lite/api/zh-CN/r2.2/index.html)    [2.1.1](https://www.mindspore.cn/lite/api/zh-CN/r2.1/index.html)    [2.0.0](https://www.mindspore.cn/lite/api/zh-CN/r2.0/index.html)    [2.0.0-alpha](https://www.mindspore.cn/lite/api/zh-CN/r2.0.0-alpha/index.html)    [1.10.1](https://www.mindspore.cn/lite/api/zh-CN/r1.10/index.html)    [1.9.0](https://www.mindspore.cn/lite/api/zh-CN/r1.9/index.html)    [1.8.1](https://www.mindspore.cn/lite/api/zh-CN/r1.8/index.html)    [1.7.0](https://www.mindspore.cn/lite/api/zh-CN/r1.7/index.html)   
    [1.6.1](https://www.mindspore.cn/lite/api/zh-CN/r1.6/index.html)    [1.5.0](https://www.mindspore.cn/lite/api/zh-CN/r1.5/index.html)    [1.3.0](https://www.mindspore.cn/lite/api/zh-CN/r1.3/index.html)    [1.2.1-C++](https://www.mindspore.cn/doc/api_cpp/zh-CN/r1.2/index.html)    [1.2.1-Java](https://www.mindspore.cn/doc/api_java/zh-CN/r1.2/index.html)    [1.1.1-C++](https://www.mindspore.cn/doc/api_cpp/zh-CN/r1.1/index.html)   
    [1.1.1-Java](https://www.mindspore.cn/doc/api_java/zh-CN/r1.1/index.html)    [1.0.0](https://www.mindspore.cn/doc/api_cpp/zh-CN/r1.0/index.html)    [master](https://www.mindspore.cn/lite/api/zh-CN/master/index.html) | +| API |MindSpore | [2.3.1](https://www.mindspore.cn/docs/zh-CN/r2.3.1/api_python/mindspore.html)    [2.3.0](https://www.mindspore.cn/docs/zh-CN/r2.3.0/api_python/mindspore.html)    [2.3.0rc2](https://www.mindspore.cn/docs/zh-CN/r2.3.0rc2/api_python/mindspore.html)    [2.3.0rc1](https://www.mindspore.cn/docs/zh-CN/r2.3.0rc1/api_python/mindspore.html)    [2.2.14](https://www.mindspore.cn/docs/zh-CN/r2.2/api_python/mindspore.html)    [2.1.1](https://www.mindspore.cn/docs/zh-CN/r2.1/api_python/mindspore.html)    [2.0.0](https://www.mindspore.cn/docs/zh-CN/r2.0/api_python/mindspore.html)    [2.0.0-alpha](https://www.mindspore.cn/docs/zh-CN/r2.0.0-alpha/api_python/mindspore.html)    [1.10.1](https://www.mindspore.cn/docs/zh-CN/r1.10/api_python/mindspore.html)    [1.9.0](https://www.mindspore.cn/docs/zh-CN/r1.9/api_python/mindspore.html)    [1.8.1](https://www.mindspore.cn/docs/zh-CN/r1.8/api_python/mindspore.html)    [1.7.1](https://www.mindspore.cn/docs/zh-CN/r1.7/api_python/mindspore.html)   
    [1.6.2](https://www.mindspore.cn/docs/api/zh-CN/r1.6/index.html)    [1.5.2](https://www.mindspore.cn/docs/api/zh-CN/r1.5/index.html)    [1.3.0](https://www.mindspore.cn/docs/api/zh-CN/r1.3/index.html)    [1.2.1](https://www.mindspore.cn/doc/api_python/zh-CN/r1.2/index.html)    [1.1.1](https://www.mindspore.cn/doc/api_python/zh-CN/r1.1/index.html)    [1.0.1](https://www.mindspore.cn/doc/api_python/zh-CN/r1.0/index.html)    [0.7.0-beta](https://www.mindspore.cn/api/zh-CN/r0.7/index.html)   
    [0.6.0-beta](https://www.mindspore.cn/api/zh-CN/r0.6/index.html)    [0.5.2-beta](https://www.mindspore.cn/api/zh-CN/r0.5/index.html)    [0.3.0-alpha](https://www.mindspore.cn/api/zh-CN/0.3.0-alpha/index.html)    [0.2.0-alpha](https://www.mindspore.cn/api/zh-CN/0.2.0-alpha/index.html)   
    [0.1.0-alpha](https://www.mindspore.cn/api/zh-CN/0.1.0-alpha/index.html)   [master](https://www.mindspore.cn/docs/zh-CN/master/api_python/mindspore.html) | +| |MindSpore Lite |[2.3.1](https://www.mindspore.cn/lite/api/zh-CN/r2.3.1/index.html)    [2.3.0](https://www.mindspore.cn/lite/api/zh-CN/r2.3.0/index.html)    [2.3.0-rc2](https://www.mindspore.cn/lite/api/zh-CN/r2.3.0rc2/index.html)    [2.3.0-rc1](https://www.mindspore.cn/lite/api/zh-CN/r2.3.0rc1/index.html)    [2.2.14](https://www.mindspore.cn/lite/api/zh-CN/r2.2/index.html)    [2.1.1](https://www.mindspore.cn/lite/api/zh-CN/r2.1/index.html)    [2.0.0](https://www.mindspore.cn/lite/api/zh-CN/r2.0/index.html)    [2.0.0-alpha](https://www.mindspore.cn/lite/api/zh-CN/r2.0.0-alpha/index.html)    [1.10.1](https://www.mindspore.cn/lite/api/zh-CN/r1.10/index.html)    [1.9.0](https://www.mindspore.cn/lite/api/zh-CN/r1.9/index.html)    [1.8.1](https://www.mindspore.cn/lite/api/zh-CN/r1.8/index.html)    [1.7.0](https://www.mindspore.cn/lite/api/zh-CN/r1.7/index.html)   
    [1.6.1](https://www.mindspore.cn/lite/api/zh-CN/r1.6/index.html)    [1.5.0](https://www.mindspore.cn/lite/api/zh-CN/r1.5/index.html)    [1.3.0](https://www.mindspore.cn/lite/api/zh-CN/r1.3/index.html)    [1.2.1-C++](https://www.mindspore.cn/doc/api_cpp/zh-CN/r1.2/index.html)    [1.2.1-Java](https://www.mindspore.cn/doc/api_java/zh-CN/r1.2/index.html)    [1.1.1-C++](https://www.mindspore.cn/doc/api_cpp/zh-CN/r1.1/index.html)   
    [1.1.1-Java](https://www.mindspore.cn/doc/api_java/zh-CN/r1.1/index.html)    [1.0.0](https://www.mindspore.cn/doc/api_cpp/zh-CN/r1.0/index.html)    [master](https://www.mindspore.cn/lite/api/zh-CN/master/index.html) | | |MindSpore Insight | [2.3.0](https://www.mindspore.cn/mindinsight/docs/zh-CN/r2.3/mindinsight.debugger.html)    [2.2.10](https://www.mindspore.cn/mindinsight/docs/zh-CN/r2.2/mindinsight.debugger.html)    [2.1.0](https://www.mindspore.cn/mindinsight/docs/zh-CN/r2.1/mindinsight.debugger.html)    [2.0.0](https://www.mindspore.cn/mindinsight/docs/zh-CN/r2.0/mindinsight.debugger.html)    [2.0.0-alpha](https://www.mindspore.cn/mindinsight/docs/zh-CN/r2.0.0-alpha/mindinsight.debugger.html)    [1.10.1](https://www.mindspore.cn/mindinsight/docs/zh-CN/r1.10/mindinsight.debugger.html)    [1.9.0](https://www.mindspore.cn/mindinsight/docs/zh-CN/r1.9/mindinsight.debugger.html)    [1.8.0](https://www.mindspore.cn/mindinsight/docs/zh-CN/r1.8/mindinsight.debugger.html)    [1.7.0](https://www.mindspore.cn/mindinsight/docs/zh-CN/r1.7/mindinsight.debugger.html)   
    [1.6.1](https://www.mindspore.cn/mindinsight/docs/zh-CN/r1.6/mindinsight.debugger.html)    [master](https://www.mindspore.cn/mindinsight/docs/zh-CN/master/mindinsight.debugger.html) | | |MindSpore Hub | [1.9.0](https://www.mindspore.cn/hub/docs/zh-CN/r1.9/hub.html)    [1.6.0](https://www.mindspore.cn/hub/docs/zh-CN/r1.6/hub.html)    [1.5.0](https://www.mindspore.cn/hub/api/zh-CN/r1.5/index.html)    [1.3.0](https://www.mindspore.cn/hub/api/zh-CN/r1.3/index.html)    [1.2.0](https://www.mindspore.cn/doc/api_python/zh-CN/r1.2/mindspore_hub/mindspore_hub.html)    [1.1.1](https://www.mindspore.cn/doc/api_python/zh-CN/r1.1/mindspore_hub/mindspore_hub.html)   
    [1.0.1](https://www.mindspore.cn/doc/api_python/zh-CN/r1.0/mindspore_hub/mindspore_hub.html)    [master](https://www.mindspore.cn/hub/docs/zh-CN/master/hub.html) | | |MindSpore Armour | [2.0.0](https://www.mindspore.cn/mindarmour/docs/zh-CN/r2.0/mindarmour.html)    [1.9.0](https://www.mindspore.cn/mindarmour/docs/zh-CN/r1.9/mindarmour.html)    [1.8.1](https://www.mindspore.cn/mindarmour/docs/zh-CN/r1.8/mindarmour.html)    [1.7.0](https://www.mindspore.cn/mindarmour/docs/zh-CN/r1.7/mindarmour.html)    [1.6.0](https://www.mindspore.cn/mindarmour/docs/zh-CN/r1.6/mindarmour.html)    [1.5.0](https://www.mindspore.cn/mindarmour/api/zh-CN/r1.5/index.html)    [1.3.0](https://www.mindspore.cn/mindarmour/api/zh-CN/r1.3/index.html)   
    [1.2.1](https://www.mindspore.cn/doc/api_python/zh-CN/r1.2/mindarmour/mindarmour.html)    [1.1.1](https://www.mindspore.cn/doc/api_python/zh-CN/r1.1/mindarmour/mindarmour.html)    [1.0.1](https://www.mindspore.cn/doc/api_python/zh-CN/r1.0/mindarmour/mindarmour.html)    [0.7.0-beta](https://www.mindspore.cn/api/zh-CN/r0.7/api/python/mindarmour/mindarmour.html)    [0.6.0-beta](https://www.mindspore.cn/api/zh-CN/r0.6/api/python/mindarmour/mindarmour.html)    [0.5.0-beta](https://www.mindspore.cn/api/zh-CN/r0.5/api/python/mindarmour/mindarmour.html)   
    [0.3.0-alpha](https://www.mindspore.cn/api/zh-CN/0.3.0-alpha/api/python/mindarmour/mindarmour.html)    [0.2.0-alpha](https://www.mindspore.cn/api/zh-CN/0.2.0-alpha/api/python/mindarmour/mindarmour.html)    [0.1.0-alpha](https://www.mindspore.cn/api/zh-CN/0.1.0-alpha/api/python/mindarmour/mindarmour.html)    [master](https://www.mindspore.cn/mindarmour/docs/zh-CN/master/mindarmour.html) | @@ -105,7 +105,7 @@ | |MindSpore Flow | [0.2.0](https://mindspore.cn/mindflow/docs/zh-CN/r0.2/mindflow.cell.html)    [0.1.0](https://mindspore.cn/mindflow/docs/zh-CN/r0.1/mindflow.cell.html)    [0.1.0-alpha](https://mindspore.cn/mindflow/docs/zh-CN/r0.1.0-alpha/mindflow.cell.html)    [master](https://mindspore.cn/mindflow/docs/zh-CN/master/mindflow.cell.html) | | |MindSpore Reinforcement | [0.7.0](https://www.mindspore.cn/reinforcement/docs/zh-CN/r0.7/reinforcement.html)    [0.6.0](https://www.mindspore.cn/reinforcement/docs/zh-CN/r0.6/reinforcement.html)    [0.6.0-alpha](https://www.mindspore.cn/reinforcement/docs/zh-CN/r0.6.0-alpha/reinforcement.html)    [0.5.0](https://www.mindspore.cn/reinforcement/docs/zh-CN/r0.5/reinforcement.html)    [0.3.0](https://www.mindspore.cn/reinforcement/docs/zh-CN/r0.3/reinforcement.html)    [0.2.1](https://www.mindspore.cn/reinforcement/docs/zh-CN/r0.2/reinforcement.html)    [0.1.0](https://www.mindspore.cn/reinforcement/api/zh-CN/r0.1/index.html)    [master](https://www.mindspore.cn/reinforcement/docs/zh-CN/master/reinforcement.html) | | |MindSpore Graph Learning | [0.2.0](https://www.mindspore.cn/graphlearning/docs/zh-CN/r0.2/mindspore_gl.dataset.html)    [0.2.0-alpha](https://www.mindspore.cn/graphlearning/docs/zh-CN/r0.2.0-alpha/mindspore_gl.dataset.html)    [0.1.0](https://www.mindspore.cn/graphlearning/docs/zh-CN/r0.1/mindspore_gl.dataset.html)    [master](https://www.mindspore.cn/graphlearning/docs/zh-CN/master/mindspore_gl.dataset.html) | -| |MindSpore Golden Stick | [0.4.0](https://www.mindspore.cn/golden_stick/docs/zh-CN/r0.4/mindspore_gs.quantization.html)    [0.3.0](https://www.mindspore.cn/golden_stick/docs/zh-CN/r0.3/mindspore_gs.quantization.html)    [0.3.0-alpha](https://www.mindspore.cn/golden_stick/docs/zh-CN/r0.3.0-alpha/mindspore_gs.quantization.html)    [0.2.0](https://www.mindspore.cn/golden_stick/docs/zh-CN/r0.2/mindspore_gs.quantization.html)    [0.1.0](http://www.mindspore.cn/golden_stick/docs/zh-CN/r0.1/mindspore_gs.html)    [master](http://www.mindspore.cn/golden_stick/docs/zh-CN/master/mindspore_gs.html)| +| |MindSpore Golden Stick | [0.5.0](https://www.mindspore.cn/golden_stick/docs/zh-CN/r0.5.0/mindspore_gs.quantization.html)    [0.4.0](https://www.mindspore.cn/golden_stick/docs/zh-CN/r0.4/mindspore_gs.quantization.html)    [0.3.0](https://www.mindspore.cn/golden_stick/docs/zh-CN/r0.3/mindspore_gs.quantization.html)    [0.3.0-alpha](https://www.mindspore.cn/golden_stick/docs/zh-CN/r0.3.0-alpha/mindspore_gs.quantization.html)    [0.2.0](https://www.mindspore.cn/golden_stick/docs/zh-CN/r0.2/mindspore_gs.quantization.html)    [0.1.0](http://www.mindspore.cn/golden_stick/docs/zh-CN/r0.1/mindspore_gs.html)    [master](http://www.mindspore.cn/golden_stick/docs/zh-CN/master/mindspore_gs.html)| | |MindSpore XAI | [1.8.1](https://www.mindspore.cn/xai/docs/zh-CN/r1.8/mindspore_xai.explainer.html)    [1.5.0](https://www.mindspore.cn/xai/api/zh-CN/r1.5/index.html)    [master](https://www.mindspore.cn/xai/docs/zh-CN/master/mindspore_xai.explainer.html) | | |MindSpore Recommender | [0.3.0](https://mindspore.cn/recommender/docs/zh-CN/r0.3/recommender.html)    [0.2.0](https://mindspore.cn/recommender/docs/zh-CN/r0.2/recommender.html)    [master](https://mindspore.cn/recommender/docs/zh-CN/master/recommender.html) | | |MindSpore Pandas | [0.2.0](https://www.mindspore.cn/mindpandas/docs/zh-CN/r0.2/mindpandas.config.html)    [0.1.0](https://www.mindspore.cn/mindpandas/docs/zh-CN/r0.1/mindpandas.config.html)    [master](https://www.mindspore.cn//mindpandas/docs/zh-CN/master/mindpandas.config.html) | @@ -179,6 +179,7 @@ | | Ascend | Linux-x86_64 | Python3.8 | [mindspore-2.3.1-cp38-cp38-linux_x86_64.whl](https://ms-release.obs.cn-north-4.myhuaweicloud.com/2.3.1/MindSpore/unified/x86_64/mindspore-2.3.1-cp38-cp38-linux_x86_64.whl) | f7d19669517be1624d3475a6b22b54f2bc730b998eefd6020a9c9d6ef9d09dee | | | | | Python3.9 | [mindspore-2.3.1-cp39-cp39-linux_x86_64.whl](https://ms-release.obs.cn-north-4.myhuaweicloud.com/2.3.1/MindSpore/unified/x86_64/mindspore-2.3.1-cp39-cp39-linux_x86_64.whl) | 291ce96deb150445dfb6648998276fa0389264c822abddce58bd93ef65fdd993 | | | | | Python3.10 | [mindspore-2.3.1-cp310-cp310-linux_x86_64.whl](https://ms-release.obs.cn-north-4.myhuaweicloud.com/2.3.1/MindSpore/unified/x86_64/mindspore-2.3.1-cp310-cp310-linux_x86_64.whl) | 568fc4a52e60f3087e9e0399fa9eed9ff0338bd08ecbcd9c101f2db39ee5fb01 | +|MindSpore
    Lite | | | | [安装包汇总链接](https://www.mindspore.cn/lite/docs/zh-CN/r2.3.1/use/downloads.html#2-3-1) | | | MindSpore
    Golden
    Stick | | any | Python3 | [mindspore_gs-0.5.0-py3-none-any.whl](https://ms-release.obs.cn-north-4.myhuaweicloud.com/2.3.1/GoldenStick/any/mindspore_gs-0.5.0-py3-none-any.whl) | eb1c37e35468fef1e4ff1237ab88b1d718acd47f65117ec532bdb04da9d5372b | ### 2.3.0 -- Gitee From 0037c4beb8dab65778cc56798a9d0cd234c46718 Mon Sep 17 00:00:00 2001 From: huan <3174348550@qq.com> Date: Tue, 6 Aug 2024 14:36:47 +0800 Subject: [PATCH 18/69] modify the code inconsistence --- tutorials/experts/source_en/debug/dump.md | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/tutorials/experts/source_en/debug/dump.md b/tutorials/experts/source_en/debug/dump.md index c01cbced46..4730ae0390 100644 --- a/tutorials/experts/source_en/debug/dump.md +++ b/tutorials/experts/source_en/debug/dump.md @@ -587,12 +587,13 @@ When the graph compilation level is not O0 or O1, the Dump directory structure i - {step_id}/ - {time}/ - {device_id}/ - - {model_id}/ - - {iteration_id}/ - statistic.csv - {op_type}.{op_name}.{task_id}.{stream_id}.{timestamp} - Opdebug.Node_OpDebug.{task_id}.{stream_id}.{timestamp} - mapping.csv + - {model_name}/ + - {model_id}/ + - {iteration_id}/ + statistic.csv + {op_type}.{op_name}.{task_id}.{stream_id}.{timestamp} + Opdebug.Node_OpDebug.{task_id}.{stream_id}.{timestamp} + mapping.csv acl_dump_{device_id}.json ``` -- Gitee From 7df889b714dda0fa272b72bcdc1b89d293276599 Mon Sep 17 00:00:00 2001 From: huan <3174348550@qq.com> Date: Wed, 7 Aug 2024 10:20:50 +0800 Subject: [PATCH 19/69] modify the links --- .../source_en/note/api_mapping/pytorch_diff/leaky_relu.md | 2 +- .../source_zh_cn/note/api_mapping/pytorch_diff/Transformer.md | 2 +- .../source_zh_cn/note/api_mapping/pytorch_diff/deform_conv2d.md | 2 +- resource/release/release_list_zh_cn.md | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/mindspore/source_en/note/api_mapping/pytorch_diff/leaky_relu.md b/docs/mindspore/source_en/note/api_mapping/pytorch_diff/leaky_relu.md index 5a63b72a36..4d81b9571f 100644 --- a/docs/mindspore/source_en/note/api_mapping/pytorch_diff/leaky_relu.md +++ b/docs/mindspore/source_en/note/api_mapping/pytorch_diff/leaky_relu.md @@ -1,6 +1,6 @@ # Differences with torch.nn.functional.leaky_relu -[![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_zh_cn/note/api_mapping/pytorch_diff/leaky_relu.md) +[![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_en/note/api_mapping/pytorch_diff/leaky_relu.md) ## torch.nn.functional.leaky_relu diff --git a/docs/mindspore/source_zh_cn/note/api_mapping/pytorch_diff/Transformer.md b/docs/mindspore/source_zh_cn/note/api_mapping/pytorch_diff/Transformer.md index b4c325ff8b..4e91f74cb5 100644 --- a/docs/mindspore/source_zh_cn/note/api_mapping/pytorch_diff/Transformer.md +++ b/docs/mindspore/source_zh_cn/note/api_mapping/pytorch_diff/Transformer.md @@ -1,6 +1,6 @@ # 比较与torch.nn.Transformer -[![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_zh_cn/note/api_mapping/pytorch_diff/Transformer.md) +[![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_zh_cn/note/api_mapping/pytorch_diff/Transformer.md) ## torch.nn.Transformer diff --git a/docs/mindspore/source_zh_cn/note/api_mapping/pytorch_diff/deform_conv2d.md b/docs/mindspore/source_zh_cn/note/api_mapping/pytorch_diff/deform_conv2d.md index d46a56de64..08ee6ac1ce 100644 --- a/docs/mindspore/source_zh_cn/note/api_mapping/pytorch_diff/deform_conv2d.md +++ b/docs/mindspore/source_zh_cn/note/api_mapping/pytorch_diff/deform_conv2d.md @@ -1,6 +1,6 @@ # 比较与torchvision.ops.deform_conv2d的差异 -[![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_en/note/api_mapping/pytorch_diff/deform_conv2d.md) +[![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_zh_cn/note/api_mapping/pytorch_diff/deform_conv2d.md) ## torchvision.ops.deform_conv2d diff --git a/resource/release/release_list_zh_cn.md b/resource/release/release_list_zh_cn.md index c01acacd6b..2067c943c8 100644 --- a/resource/release/release_list_zh_cn.md +++ b/resource/release/release_list_zh_cn.md @@ -90,7 +90,7 @@ | |MindSpore Vision | [0.1.0](http://www.mindspore.cn/vision/docs/zh-CN/r0.1/index.html) | | API |MindSpore | [2.3.1](https://www.mindspore.cn/docs/zh-CN/r2.3.1/api_python/mindspore.html)    [2.3.0](https://www.mindspore.cn/docs/zh-CN/r2.3.0/api_python/mindspore.html)    [2.3.0rc2](https://www.mindspore.cn/docs/zh-CN/r2.3.0rc2/api_python/mindspore.html)    [2.3.0rc1](https://www.mindspore.cn/docs/zh-CN/r2.3.0rc1/api_python/mindspore.html)    [2.2.14](https://www.mindspore.cn/docs/zh-CN/r2.2/api_python/mindspore.html)    [2.1.1](https://www.mindspore.cn/docs/zh-CN/r2.1/api_python/mindspore.html)    [2.0.0](https://www.mindspore.cn/docs/zh-CN/r2.0/api_python/mindspore.html)    [2.0.0-alpha](https://www.mindspore.cn/docs/zh-CN/r2.0.0-alpha/api_python/mindspore.html)    [1.10.1](https://www.mindspore.cn/docs/zh-CN/r1.10/api_python/mindspore.html)    [1.9.0](https://www.mindspore.cn/docs/zh-CN/r1.9/api_python/mindspore.html)    [1.8.1](https://www.mindspore.cn/docs/zh-CN/r1.8/api_python/mindspore.html)    [1.7.1](https://www.mindspore.cn/docs/zh-CN/r1.7/api_python/mindspore.html)   
    [1.6.2](https://www.mindspore.cn/docs/api/zh-CN/r1.6/index.html)    [1.5.2](https://www.mindspore.cn/docs/api/zh-CN/r1.5/index.html)    [1.3.0](https://www.mindspore.cn/docs/api/zh-CN/r1.3/index.html)    [1.2.1](https://www.mindspore.cn/doc/api_python/zh-CN/r1.2/index.html)    [1.1.1](https://www.mindspore.cn/doc/api_python/zh-CN/r1.1/index.html)    [1.0.1](https://www.mindspore.cn/doc/api_python/zh-CN/r1.0/index.html)    [0.7.0-beta](https://www.mindspore.cn/api/zh-CN/r0.7/index.html)   
    [0.6.0-beta](https://www.mindspore.cn/api/zh-CN/r0.6/index.html)    [0.5.2-beta](https://www.mindspore.cn/api/zh-CN/r0.5/index.html)    [0.3.0-alpha](https://www.mindspore.cn/api/zh-CN/0.3.0-alpha/index.html)    [0.2.0-alpha](https://www.mindspore.cn/api/zh-CN/0.2.0-alpha/index.html)   
    [0.1.0-alpha](https://www.mindspore.cn/api/zh-CN/0.1.0-alpha/index.html)   [master](https://www.mindspore.cn/docs/zh-CN/master/api_python/mindspore.html) | | |MindSpore Lite |[2.3.1](https://www.mindspore.cn/lite/api/zh-CN/r2.3.1/index.html)    [2.3.0](https://www.mindspore.cn/lite/api/zh-CN/r2.3.0/index.html)    [2.3.0-rc2](https://www.mindspore.cn/lite/api/zh-CN/r2.3.0rc2/index.html)    [2.3.0-rc1](https://www.mindspore.cn/lite/api/zh-CN/r2.3.0rc1/index.html)    [2.2.14](https://www.mindspore.cn/lite/api/zh-CN/r2.2/index.html)    [2.1.1](https://www.mindspore.cn/lite/api/zh-CN/r2.1/index.html)    [2.0.0](https://www.mindspore.cn/lite/api/zh-CN/r2.0/index.html)    [2.0.0-alpha](https://www.mindspore.cn/lite/api/zh-CN/r2.0.0-alpha/index.html)    [1.10.1](https://www.mindspore.cn/lite/api/zh-CN/r1.10/index.html)    [1.9.0](https://www.mindspore.cn/lite/api/zh-CN/r1.9/index.html)    [1.8.1](https://www.mindspore.cn/lite/api/zh-CN/r1.8/index.html)    [1.7.0](https://www.mindspore.cn/lite/api/zh-CN/r1.7/index.html)   
    [1.6.1](https://www.mindspore.cn/lite/api/zh-CN/r1.6/index.html)    [1.5.0](https://www.mindspore.cn/lite/api/zh-CN/r1.5/index.html)    [1.3.0](https://www.mindspore.cn/lite/api/zh-CN/r1.3/index.html)    [1.2.1-C++](https://www.mindspore.cn/doc/api_cpp/zh-CN/r1.2/index.html)    [1.2.1-Java](https://www.mindspore.cn/doc/api_java/zh-CN/r1.2/index.html)    [1.1.1-C++](https://www.mindspore.cn/doc/api_cpp/zh-CN/r1.1/index.html)   
    [1.1.1-Java](https://www.mindspore.cn/doc/api_java/zh-CN/r1.1/index.html)    [1.0.0](https://www.mindspore.cn/doc/api_cpp/zh-CN/r1.0/index.html)    [master](https://www.mindspore.cn/lite/api/zh-CN/master/index.html) | -| |MindSpore Insight | [2.3.0](https://www.mindspore.cn/mindinsight/docs/zh-CN/r2.3/mindinsight.debugger.html)    [2.2.10](https://www.mindspore.cn/mindinsight/docs/zh-CN/r2.2/mindinsight.debugger.html)    [2.1.0](https://www.mindspore.cn/mindinsight/docs/zh-CN/r2.1/mindinsight.debugger.html)    [2.0.0](https://www.mindspore.cn/mindinsight/docs/zh-CN/r2.0/mindinsight.debugger.html)    [2.0.0-alpha](https://www.mindspore.cn/mindinsight/docs/zh-CN/r2.0.0-alpha/mindinsight.debugger.html)    [1.10.1](https://www.mindspore.cn/mindinsight/docs/zh-CN/r1.10/mindinsight.debugger.html)    [1.9.0](https://www.mindspore.cn/mindinsight/docs/zh-CN/r1.9/mindinsight.debugger.html)    [1.8.0](https://www.mindspore.cn/mindinsight/docs/zh-CN/r1.8/mindinsight.debugger.html)    [1.7.0](https://www.mindspore.cn/mindinsight/docs/zh-CN/r1.7/mindinsight.debugger.html)   
    [1.6.1](https://www.mindspore.cn/mindinsight/docs/zh-CN/r1.6/mindinsight.debugger.html)    [master](https://www.mindspore.cn/mindinsight/docs/zh-CN/master/mindinsight.debugger.html) | +| |MindSpore Insight | [2.3.0](https://www.mindspore.cn/mindinsight/docs/zh-CN/r2.3/mindinsight.debugger.html)    [2.2.10](https://www.mindspore.cn/mindinsight/docs/zh-CN/r2.2/mindinsight.debugger.html)    [2.1.0](https://www.mindspore.cn/mindinsight/docs/zh-CN/r2.1/mindinsight.debugger.html)    [2.0.0](https://www.mindspore.cn/mindinsight/docs/zh-CN/r2.0/mindinsight.debugger.html)    [2.0.0-alpha](https://www.mindspore.cn/mindinsight/docs/zh-CN/r2.0.0-alpha/mindinsight.debugger.html)    [1.10.1](https://www.mindspore.cn/mindinsight/docs/zh-CN/r1.10/mindinsight.debugger.html)    [1.9.0](https://www.mindspore.cn/mindinsight/docs/zh-CN/r1.9/mindinsight.debugger.html)    [1.8.0](https://www.mindspore.cn/mindinsight/docs/zh-CN/r1.8/mindinsight.debugger.html)    [1.7.0](https://www.mindspore.cn/mindinsight/docs/zh-CN/r1.7/mindinsight.debugger.html)   
    [1.6.1](https://www.mindspore.cn/mindinsight/docs/zh-CN/r1.6/mindinsight.debugger.html) | | |MindSpore Hub | [1.9.0](https://www.mindspore.cn/hub/docs/zh-CN/r1.9/hub.html)    [1.6.0](https://www.mindspore.cn/hub/docs/zh-CN/r1.6/hub.html)    [1.5.0](https://www.mindspore.cn/hub/api/zh-CN/r1.5/index.html)    [1.3.0](https://www.mindspore.cn/hub/api/zh-CN/r1.3/index.html)    [1.2.0](https://www.mindspore.cn/doc/api_python/zh-CN/r1.2/mindspore_hub/mindspore_hub.html)    [1.1.1](https://www.mindspore.cn/doc/api_python/zh-CN/r1.1/mindspore_hub/mindspore_hub.html)   
    [1.0.1](https://www.mindspore.cn/doc/api_python/zh-CN/r1.0/mindspore_hub/mindspore_hub.html)    [master](https://www.mindspore.cn/hub/docs/zh-CN/master/hub.html) | | |MindSpore Armour | [2.0.0](https://www.mindspore.cn/mindarmour/docs/zh-CN/r2.0/mindarmour.html)    [1.9.0](https://www.mindspore.cn/mindarmour/docs/zh-CN/r1.9/mindarmour.html)    [1.8.1](https://www.mindspore.cn/mindarmour/docs/zh-CN/r1.8/mindarmour.html)    [1.7.0](https://www.mindspore.cn/mindarmour/docs/zh-CN/r1.7/mindarmour.html)    [1.6.0](https://www.mindspore.cn/mindarmour/docs/zh-CN/r1.6/mindarmour.html)    [1.5.0](https://www.mindspore.cn/mindarmour/api/zh-CN/r1.5/index.html)    [1.3.0](https://www.mindspore.cn/mindarmour/api/zh-CN/r1.3/index.html)   
    [1.2.1](https://www.mindspore.cn/doc/api_python/zh-CN/r1.2/mindarmour/mindarmour.html)    [1.1.1](https://www.mindspore.cn/doc/api_python/zh-CN/r1.1/mindarmour/mindarmour.html)    [1.0.1](https://www.mindspore.cn/doc/api_python/zh-CN/r1.0/mindarmour/mindarmour.html)    [0.7.0-beta](https://www.mindspore.cn/api/zh-CN/r0.7/api/python/mindarmour/mindarmour.html)    [0.6.0-beta](https://www.mindspore.cn/api/zh-CN/r0.6/api/python/mindarmour/mindarmour.html)    [0.5.0-beta](https://www.mindspore.cn/api/zh-CN/r0.5/api/python/mindarmour/mindarmour.html)   
    [0.3.0-alpha](https://www.mindspore.cn/api/zh-CN/0.3.0-alpha/api/python/mindarmour/mindarmour.html)    [0.2.0-alpha](https://www.mindspore.cn/api/zh-CN/0.2.0-alpha/api/python/mindarmour/mindarmour.html)    [0.1.0-alpha](https://www.mindspore.cn/api/zh-CN/0.1.0-alpha/api/python/mindarmour/mindarmour.html)    [master](https://www.mindspore.cn/mindarmour/docs/zh-CN/master/mindarmour.html) | | |MindSpore Federated | [new-0.1.0](https://www.mindspore.cn/federated/docs/zh-CN/r0.1/horizontal/federated_server.html)    [1.7.0](https://www.mindspore.cn/federated/docs/zh-CN/r1.7/federated_server.html)    [1.6.0](https://www.mindspore.cn/federated/docs/zh-CN/r1.6/federated_server.html)    [1.5.0](https://www.mindspore.cn/federated/api/zh-CN/r1.5/index.html)    [1.3.0](https://www.mindspore.cn/federated/api/zh-CN/r1.3/index.html)    [master](https://www.mindspore.cn/federated/docs/zh-CN/master/horizontal/federated_server.html) | -- Gitee From 42ae85ff6aff9a0eff93efcd272da194b2edee8d Mon Sep 17 00:00:00 2001 From: chenjunjie Date: Tue, 6 Aug 2024 23:21:45 +0800 Subject: [PATCH 20/69] Add description of profiler files --- docs/mindinsight/docs/source_zh_cn/index.rst | 1 + .../profiler_files_description.md | 91 +++++++++++++ .../profiling/profiling_offline.txt | 120 +++++++++++++++++- 3 files changed, 211 insertions(+), 1 deletion(-) create mode 100644 docs/mindinsight/docs/source_zh_cn/profiler_files_description.md diff --git a/docs/mindinsight/docs/source_zh_cn/index.rst b/docs/mindinsight/docs/source_zh_cn/index.rst index 2492925d15..6c0d152e02 100644 --- a/docs/mindinsight/docs/source_zh_cn/index.rst +++ b/docs/mindinsight/docs/source_zh_cn/index.rst @@ -85,6 +85,7 @@ MindSpore Insight包括以下内容: graph_visual_design tensor_visual_design profiler_design + profiler_files_description faq .. toctree:: diff --git a/docs/mindinsight/docs/source_zh_cn/profiler_files_description.md b/docs/mindinsight/docs/source_zh_cn/profiler_files_description.md new file mode 100644 index 0000000000..92af0cdbaa --- /dev/null +++ b/docs/mindinsight/docs/source_zh_cn/profiler_files_description.md @@ -0,0 +1,91 @@ +# profiler目录下的性能数据 + +[![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindinsight/docs/source_zh_cn/profiler_files_description.md) + +profiler目录下包括一些csv、json、txt文件,这些文件包含了模型计算过程中算子执行时间、内存占用、通信等性能数据,帮助用户分析性能瓶颈。下面对部分csv、txt文件中的字段进行说明,文件内容主要包括device侧算子(AI Core算子和AI CPU算子)耗时的信息、算子级内存和应用级内存占用的信息。 + +## aicore_intermediate_*_detail.csv文件说明 + +aicore_intermediate_\*_detail.csv文件包含基于output_timeline_data_\*.txt和framework_raw_\*.csv中的内容,统计AI Core算子信息。文件中的字段说明参考下表: + +| 字段名 | 字段说明 | +|----------------------------|----------------------------| +|full_kernel_name |device侧执行kernel算子全名| +|task_duration |算子执行用时| +|execution_frequency |算子执行频次| +|task_type |算子的任务类型| + +## aicore_intermediate_*_type.csv文件说明 + +aicore_intermediate_\*_type.csv文件包括基于output_timeline_data_\*.txt和framework_raw_\*.csv中的内容,统计AI Core算子具体类型的信息。文件中的字段说明参考下表: + +| 字段名 | 字段说明 | +|------------------------------|------------------------| +| kernel_type | AI Core算子类型| +| task_time | 该类型算子总用时| +| execution_frequency | 该类型算子执行频次| +| percent | 该算子类型的用时的占所有算子总用时的百分比| + +## aicpu_intermediate_*.csv文件说明 + +aicpu_intermediate_\*.csv文件包含AI CPU算子的耗时信息。文件中的字段说明参考下表: + +| 字段名 | 字段说明 | +|------------------------------|------------------------| +| serial_num | AI CPU算子序号| +| kernel_type | AI CPU算子类型| +| total_time | 算子耗时,等于下发耗时和执行耗时之和| +| dispatch_time | 下发耗时| +| execution_time | 执行耗时| +| run_start | 算子执行起始时间| +| run_end | 算子执行结束时间| + +## flops_*.txt文件说明 + +flops_\*.txt文件包含device侧算子的浮点计算次数、每秒浮点计算次数等信息。文件中的字段说明参考下表: + +| 字段名 | 字段说明 | +|------------------------------|------------------------| +| full_kernel_name | device侧执行kernel算子全名| +| MFLOPs(10^6 cube) | 浮点计算次数(10^6 cube)| +| GFLOPS(10^9 cube) | 每秒浮点计算次数(10^9 cube)| +| MFLOPs(10^6 vector) | 浮点计算次数(10^6 vector)| +| GFLOPS(10^9 vector) | 每秒浮点计算次数(10^9 vector)| + +## output_timeline_data_*.txt文件说明 + +output_timeline_data_\*.txt文件包括device侧算子的耗时信息。文件中的字段说明参考下表: + +| 字段名 | 字段说明 | +|------------------------------|------------------------| +| kernel_name | device侧执行kernel算子全名| +| stream_id | 算子所处Stream ID| +| start_time | 算子执行开始时间(us)| +| duration | 算子执行用时(ms)| + +## cpu_ms_memory_record_*.txt文件说明 + +cpu_ms_memory_record_\*.txt文件包含应用级内存占用的信息。文件中的字段说明参考下表: + +| 字段名 | 字段说明 | +|------------------------------|------------------------| +| Timestamp | 内存事件发生时刻(ns)| +| Total Allocated | 内存分配总额(Byte)| +| Total Reserved | 内存预留总额(Byte)| +| Total Active | MindSpore中的流申请的总内存(Byte)| + +## operator_memory_*.csv文件说明 + +operator_memory_\*.csv文件包含算子级内存占用的信息。文件中的字段说明参考下表: + +| 字段名 | 字段说明 | +|------------------------------|------------------------| +| Name | 内存占用Tensor名| +| Size | 占用内存大小(KB)| +| Allocation Time | Tensor内存分配时间(us)| +| Duration | Tensor内存占用时间(us)| +| Allocation Total Allocated | 算子内存分配时的内存分配总额(MB)| +| Allocation Total Reserved | 算子内存分配时的内存占用总额(MB)| +| Release Total Allocated | 算子内存释放时的内存分配总额(MB)| +| Release Total Reserved | 算子内存释放时的内存占用总额(MB)| +| Device | device类型| \ No newline at end of file diff --git a/docs/mindinsight/docs/source_zh_cn/profiling/profiling_offline.txt b/docs/mindinsight/docs/source_zh_cn/profiling/profiling_offline.txt index 3cac37bf79..063c4b12e7 100644 --- a/docs/mindinsight/docs/source_zh_cn/profiling/profiling_offline.txt +++ b/docs/mindinsight/docs/source_zh_cn/profiling/profiling_offline.txt @@ -38,4 +38,122 @@ Profiler.offline_analyse(path='/path/to/profiler_data') -离线解析之后,就可以在/path/to/profiler_data/profiler目录查看性能数据了。 \ No newline at end of file +离线解析之后,就可以在/path/to/profiler_data/profiler目录查看性能数据了。 + + +目录结构 +~~~~~~~~~~~~ + +性能数据目录结构示例如下: + +.. code:: + + └──── profiler + ├──── container + ├──── FRAMEWORK // 框架侧采集的原始数据 + │ └──── op_range_* + ├──── host_info // 框架profiling解析生成的结果 + │ ├──── dataset_*.csv + │ ├──── host_info_*.csv + │ ├──── host_memory_*.csv + │ └──── timeline_*.json + ├──── PROF_{数字}_{时间戳}_{字符串} // msprof性能数据 + │ ├──── analyse + │ ├──── device_* + │ ├──── host + │ ├──── mindstudio_profiler_log + │ └──── mindstudio_profiler_output + ├──── rank_* // 内存相关的原始数据 + │ ├──── memory_block.csv + │ └──── task.csv + ├──── rank-*_{时间戳}_ascend_ms // MindStudio Insight可视化交付件 + │ ├──── ASCEND_PROFILER_OUTPUT // MindSpore Profiler接口采集的性能数据 + │ └──── profiler_info_*.json + ├──── aicore_intermediate_*_detail.csv + ├──── aicore_intermediate_*_type.csv + ├──── aicpu_intermediate_*.csv + ├──── ascend_cluster_analyse_model-{mode}_{stage_num}_{rank_size}_*.csv + ├──── ascend_timeline_display_*.json + ├──── ascend_timeline_summary_*.json + ├──── cpu_framework_*.txt // 异构场景生成 + ├──── cpu_ms_memory_record_*.txt + ├──── cpu_op_detail_info_*.csv // 异构场景生成 + ├──── cpu_op_execute_timestamp_*.txt // 异构场景生成 + ├──── cpu_op_type_info_*.csv // 异构场景生成 + ├──── dataset_iterator_profiling_*.txt // 数据非下沉场景生成 + ├──── device_queue_profiling_*.txt // 数据下沉场景生成 + ├──── dynamic_shape_info_*.json + ├──── flops_*.txt + ├──── flops_summary_*.json + ├──── framework_raw_*.csv + ├──── hccl_raw_*.csv // 配置profiler(profiler_communication=True)生成 + ├──── minddata_aicpu_*.json // 数据下沉场景生成 + ├──── minddata_cpu_utilization_*.json + ├──── minddata_pipeline_raw_*.csv + ├──── minddata_pipeline_summary_*.csv + ├──── minddata_pipeline_summary_*.json + ├──── operator_memory_*.csv + ├──── output_timeline_data_*.txt + ├──── parallel_strategy_*.json + ├──── pipeline_profiling_*.json + ├──── profiler_info_*.json + ├──── step_trace_point_info_*.json + └──── step_trace_raw_*_detail_time.csv + +- *代表rank id + +性能数据文件描述 +~~~~~~~~~~~~ + +PROF_{数字}_{时间戳}_{字符串}目录下为CANN Profiling采集的性能数据,主要保存在mindstudio_profiler_output中,数据介绍可参考 `性能数据文件说明 `_。 + +profiler目录下包含csv、json、txt三类文件,覆盖了算子执行时间、内存占用、通信等方面的性能数据,文件说明见下表。部分文件的详细说明参考 `性能数据 `_ + + ============================================== ============================================================================== + 文件名 说明 + ============================================== ============================================================================== + step_trace_point_info_*.json step节点对应的算子信息(仅mode=GRAPH,export GRAPH_OP_RUM=0) + step_trace_raw_*_detail_time.csv 每个step的节点的时间信息(仅mode=GRAPH,export GRAPH_OP_RUM=0) + + dynamic_shape_info_*.json 动态shape下算子信息 + + pipeline_profiling_*.json MindSpore数据处理,采集落盘的中间文件,用于MindInsight可视化 + minddata_pipeline_raw_*.csv MindSpore数据处理,采集落盘的中间文件,用于MindInsight可视化 + minddata_pipeline_summary_*.csv MindSpore数据处理,采集落盘的中间文件,用于MindInsight可视化 + minddata_pipeline_summary_*.json MindSpore数据处理,采集落盘的中间文件,用于MindInsight可视化 + framework_raw_*.csv MindSpore数据处理中AI Core算子的信息 + device_queue_profiling_*.txt MindSpore数据处理,采集落盘的中间文件,用于MindInsight可视化(仅数据下沉场景) + minddata_aicpu_*.txt MindSpore数据处理中AI CPU算子的性能数据(仅数据下沉场景) + dataset_iterator_profiling_*.txt MindSpore数据处理,采集落盘的中间文件,用于MindInsight可视化(仅数据非下沉场景) + + aicore_intermediate_*_detail.csv AI Core算子数据 + aicore_intermediate_*_type.csv AI Core算子调用次数和耗时统计 + aicpu_intermediate_*.csv AI CPU算子信息解析后耗时数据 + flops_*.txt 记录AI Core算子的浮点计算次数(FLOPs)、每秒的浮点计算次数(FLOPS) + flops_summary_*.json 记录所有算子的总的FLOPs、所有算子的平均FLOPs、平均的FLOPS_Utilization + + ascend_timeline_display_*.json timeline可视化文件,用于MindStudio Insight可视化 + ascend_timeline_summary_*.json timeline统计数据 + output_timeline_data_*.txt 算子timeline数据,只有AI Core算子数据存在时才有 + + cpu_ms_memory_record_*.txt 内存profiling的原始文件 + operator_memory_*.csv 算子级内存信息 + + minddata_cpu_utilization_*.json CPU利用率 + + cpu_op_detail_info_*.csv CPU算子耗时数据(仅mode=GRAPH) + cpu_op_type_info_*.csv 具体类别CPU算子耗时统计(仅mode=GRAPH) + cpu_op_execute_timestamp_*.txt CPU算子执行起始时间与耗时(仅mode=GRAPH) + cpu_framework_*.txt 异构场景下CPU算子耗时(仅mode=GRAPH) + + ascend_cluster_analyse_model-xxx.csv 在模型并行或pipeline并行模式下,计算和通信等相关数据(仅mode=GRAPH) + + hccl_raw_*.csv 基于卡的通信时间和通信等待时间(仅mode=GRAPH) + + parallel_strategy_*.json 算子并行策略,采集落盘中间文件,用于MindInsight可视化 + + profiler_info_*.json Profiler配置等info信息 + ============================================== ============================================================================== + +- *表示rank id +- ascend_cluster_analyse_model-xxx_*.csv完整的文件名应该是ascend_cluster_analyse_model-{mode}_{stage_num}_{rank_size}_{rank_id}.csv,比如ascend_cluster_analyse_model-parallel_1_8_0.csv \ No newline at end of file -- Gitee From b088cdca747a0ce656a11691a4cd8586fede5ecb Mon Sep 17 00:00:00 2001 From: huan <3174348550@qq.com> Date: Wed, 7 Aug 2024 17:58:33 +0800 Subject: [PATCH 21/69] update the en files --- docs/mindinsight/docs/source_en/index.rst | 1 + .../source_en/profiler_files_description.md | 91 ++++++++++++++ .../source_en/profiling/profiling_offline.txt | 117 ++++++++++++++++++ .../profiling/profiling_offline.txt | 3 +- 4 files changed, 210 insertions(+), 2 deletions(-) create mode 100644 docs/mindinsight/docs/source_en/profiler_files_description.md diff --git a/docs/mindinsight/docs/source_en/index.rst b/docs/mindinsight/docs/source_en/index.rst index aecf52d87f..cdb38023cc 100644 --- a/docs/mindinsight/docs/source_en/index.rst +++ b/docs/mindinsight/docs/source_en/index.rst @@ -85,6 +85,7 @@ Using MindSpore Insight to Analyze the Model Performance graph_visual_design tensor_visual_design profiler_design + profiler_files_description faq .. toctree:: diff --git a/docs/mindinsight/docs/source_en/profiler_files_description.md b/docs/mindinsight/docs/source_en/profiler_files_description.md new file mode 100644 index 0000000000..9f729f47c4 --- /dev/null +++ b/docs/mindinsight/docs/source_en/profiler_files_description.md @@ -0,0 +1,91 @@ +# Performance Data in the Profiler Directory + +[![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindinsight/docs/source_en/profiler_files_description.md) + +The profiler directory includes some csv, json, and txt files, which contain performance data such as operator execution time, memory usage, and communication during model computation to help users analyze performance bottlenecks. The fields in some of the csv and txt files are explained below. The contents of the files mainly include information about the time consumed by the device-side operators (AI Core operator and AI CPU operator), and the information about the memory occupied at the operator level and the memory occupied at the application level. + +## aicore_intermediate_*_detail.csv File Descriptions + +The aicore_intermediate_\*_detail.csv file contains statistical AI Core operator information based on the contents of output_timeline_data_\*.txt and framework_raw_\*.csv. Refer to the following table for descriptions of the fields in the file: + +| Field Names | Descriptions | +|----------------------------|----------------------------| +|full_kernel_name |Full name of the device-side execution kernel operator| +|task_duration |Operator execution time| +|execution_frequency |Frequency of operator execution| +|task_type |Task types for the operator| + +## aicore_intermediate_*_type.csv File Descriptions + +The aicore_intermediate_\*_type.csv file includes statistical information about the specific types of AI Core operators based on the contents of output_timeline_data_\*.txt and framework_raw_\*.csv. Refer to the following table for descriptions of the fields in the file: + +| Field Names | Descriptions | +|------------------------------|------------------------| +| kernel_type | AI Core operator types| +| task_time | Operator execution time| +| execution_frequency | Frequency of operator execution| +| percent | Percentage of time taken of this operator type over the total time taken of all operators| + +## aicpu_intermediate_*.csv File Descriptions + +The aicpu_intermediate_\*.csv file contains time taken information of the AI CPU operators. Refer to the following table for descriptions of the fields in the file: + +| Field Names | Descriptions | +|------------------------------|------------------------| +| serial_num | AI CPU operator number| +| kernel_type | AI CPU operator type| +| total_time | Operator time taken, which is equal to the sum of the downstream time taken and the execution time taken| +| dispatch_time | downstream time taken| +| execution_time | execution time taken| +| run_start | Start time of operator execution| +| run_end | End time of operator execution| + +## flops_*.txt File Descriptions + +The flops_\*.txt file contains information about the number of floating-point computations for the device-side operator, the number of floating-point computations per second, and so on. Refer to the following table for descriptions of the fields in the file: + +| Field Names | Descriptions | +|------------------------------|------------------------| +| full_kernel_name | Full name of the device-side execution kernel operator| +| MFLOPs(10^6 cube) | The number of floating-point calculations (10^6 cube)| +| GFLOPS(10^9 cube) | The number of floating-point calculations per second(10^9 cube)| +| MFLOPs(10^6 vector) | The number of floating-point calculations(10^6 vector)| +| GFLOPS(10^9 vector) | The number of floating-point calculations per second(10^9 vector)| + +## output_timeline_data_*.txt File Descriptions + +The output_timeline_data_\*.txt file contains information about the time taken of the device-side operator. Refer to the following table for descriptions of the fields in the file: + +| Field Names | Descriptions | +|------------------------------|------------------------| +| kernel_name | Full name of the device-side execution kernel operator| +| stream_id | Stream ID of the operator| +| start_time | Start time of operator execution(us)| +| duration | operator execution time (ms)| + +## cpu_ms_memory_record_*.txt File Descriptions + +The cpu_ms_memory_record_\*.txt file contains information about application-level memory usage. Refer to the following table for descriptions of the fields in the file: + +| Field Names | Descriptions | +|------------------------------|------------------------| +| Timestamp | Moment of memory event(ns)| +| Total Allocated | Total memory allocation(Byte)| +| Total Reserved | Total memory reservation(Byte)| +| Total Active | Total memory requested by streams in MindSpore(Byte)| + +## operator_memory_*.csv File Descriptions + +The operator_memory_\*.csv file contains information about operator-level memory usage. Refer to the following table for descriptions of the fields in the file: + +| Field Names | Descriptions | +|------------------------------|------------------------| +| Name | Memory Consumption Tensor Name| +| Size | Size of memory occupied(KB)| +| Allocation Time | Tensor memory allocation time(us)| +| Duration | Tensor memory occupation time(us)| +| Allocation Total Allocated | Total memory allocation at operator memory allocation(MB)| +| Allocation Total Reserved | Total memory occupation at operator memory allocation(MB)| +| Release Total Allocated | Total memory allocation at operator memory release(MB)| +| Release Total Reserved | Total memory occupation at operator memory release(MB)| +| Device | device type| diff --git a/docs/mindinsight/docs/source_en/profiling/profiling_offline.txt b/docs/mindinsight/docs/source_en/profiling/profiling_offline.txt index aba3b51d26..cd53ab313f 100644 --- a/docs/mindinsight/docs/source_en/profiling/profiling_offline.txt +++ b/docs/mindinsight/docs/source_en/profiling/profiling_offline.txt @@ -40,3 +40,120 @@ If an exception occurs in above code during the training process, resulting in t After offline parsing, you can view the profiling data in the directory `/path/to/profiler_data/profile` . + +Directory Structure +~~~~~~~~~~~~~~~~~~~~ + +An example of the performance data catalog structure is shown below: + +.. code:: + + └──── profiler + ├──── container + ├──── FRAMEWORK // Raw data collected on the frame side + │ └──── op_range_* + ├──── host_info // The results generated by the framework profiling + │ ├──── dataset_*.csv + │ ├──── host_info_*.csv + │ ├──── host_memory_*.csv + │ └──── timeline_*.json + ├──── PROF_{number}_{timestamp}_{string} // msprof performance data + │ ├──── analyse + │ ├──── device_* + │ ├──── host + │ ├──── mindstudio_profiler_log + │ └──── mindstudio_profiler_output + ├──── rank_* // Memory-related raw data + │ ├──── memory_block.csv + │ └──── task.csv + ├──── rank-*_{timestamp}_ascend_ms // MindStudio Insight Visualization Deliverables + │ ├──── ASCEND_PROFILER_OUTPUT // Performance data collected by the MindSpore Profiler interface + │ └──── profiler_info_*.json + ├──── aicore_intermediate_*_detail.csv + ├──── aicore_intermediate_*_type.csv + ├──── aicpu_intermediate_*.csv + ├──── ascend_cluster_analyse_model-{mode}_{stage_num}_{rank_size}_*.csv + ├──── ascend_timeline_display_*.json + ├──── ascend_timeline_summary_*.json + ├──── cpu_framework_*.txt // Heterogeneous scenario generation + ├──── cpu_ms_memory_record_*.txt + ├──── cpu_op_detail_info_*.csv // Heterogeneous scenario generation + ├──── cpu_op_execute_timestamp_*.txt // Heterogeneous scenario generation + ├──── cpu_op_type_info_*.csv // Heterogeneous scenario generation + ├──── dataset_iterator_profiling_*.txt // Data non-sinking scenario generation + ├──── device_queue_profiling_*.txt // Data sinking scenario generation + ├──── dynamic_shape_info_*.json + ├──── flops_*.txt + ├──── flops_summary_*.json + ├──── framework_raw_*.csv + ├──── hccl_raw_*.csv // Configure the profiler (profiler_communication=True) to generate + ├──── minddata_aicpu_*.json // Data sinking scenario generation + ├──── minddata_cpu_utilization_*.json + ├──── minddata_pipeline_raw_*.csv + ├──── minddata_pipeline_summary_*.csv + ├──── minddata_pipeline_summary_*.json + ├──── operator_memory_*.csv + ├──── output_timeline_data_*.txt + ├──── parallel_strategy_*.json + ├──── pipeline_profiling_*.json + ├──── profiler_info_*.json + ├──── step_trace_point_info_*.json + └──── step_trace_raw_*_detail_time.csv + +- *represents rank id + +Performance Data File Description +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +PROF_{number}_{timestamp}_{string} directory is the performance data collected by CANN Profiling, which is mainly stored in mindstudio_profiler_output. The data introduction can be referred to `Performance data file description `_. + +The profiler directory contains three types of files, csv, json, and txt, which cover performance data in terms of operator execution time, memory usage, communication, etc. The file descriptions are shown in the following table. For detailed descriptions of some files, refer to `Performance data `_. + + ============================================== ============================================================================== + File Names Descriptions + ============================================== ============================================================================== + step_trace_point_info_*.json Information about the operator corresponding to the step node (only mode=GRAPH,export GRAPH_OP_RUM=0) + step_trace_raw_*_detail_time.csv Time information for the nodes of each STEP (only mode=GRAPH,export GRAPH_OP_RUM=0) + + dynamic_shape_info_*.json Operator information under dynamic shape + + pipeline_profiling_*.json MindSpore data processing to capture intermediate files of falling disks for MindInsight visualization + minddata_pipeline_raw_*.csv MindSpore data processing to capture intermediate files of falling disks for MindInsight visualization + minddata_pipeline_summary_*.csv MindSpore data processing to capture intermediate files of falling disks for MindInsight visualization + minddata_pipeline_summary_*.json MindSpore data processing to capture intermediate files of falling disks for MindInsight visualization + framework_raw_*.csv Information about AI Core operators in MindSpore data processing + device_queue_profiling_*.txt MindSpore data processing to capture intermediate files of falling disks for MindInsight visualization (data sinking scenarios only) + minddata_aicpu_*.txt Performance data for AI CPU operators in MindSpore data processing (data sinking scenarios only) + dataset_iterator_profiling_*.txt MindSpore data processing to capture intermediate files of falling disks for MindInsight visualization (data non-sinking scenarios only) + + aicore_intermediate_*_detail.csv AI Core operator data + aicore_intermediate_*_type.csv AI Core operator calling counts and time taken statistics + aicpu_intermediate_*.csv Time taken data after AI CPU operator information parsing + flops_*.txt Record the number of floating-point calculations (FLOPs), floating-point calculations per second (FLOPS) for AI Core operators + flops_summary_*.json Record total FLOPs for all operators, average FLOPs for all operators, average FLOPS_Utilization + + ascend_timeline_display_*.json timeline visualization file for MindStudio Insight visualization + ascend_timeline_summary_*.json timeline statistics + output_timeline_data_*.txt Operator timeline data, only if AI Core operator data exists + + cpu_ms_memory_record_*.txt Raw files for memory profiling + operator_memory_*.csv Operator-level memory information + + minddata_cpu_utilization_*.json CPU utilization rate + + cpu_op_detail_info_*.csv CPU operator time taken data (mode=GRAPH only) + cpu_op_type_info_*.csv Class-specific CPU operator time taken statistics (mode=GRAPH only) + cpu_op_execute_timestamp_*.txt CPU operator execution start time and time taken (mode=GRAPH only) + cpu_framework_*.txt CPU operator time taken in heterogeneous scenarios (mode=GRAPH only) + + ascend_cluster_analyse_model-xxx.csv Data related to computation and communication, etc. in model-parallel or pipeline-parallel modes (mode=GRAPH only) + + hccl_raw_*.csv Card-based communication time and communication wait time (mode=GRAPH only) + + parallel_strategy_*.json Operator parallel strategy to capture falling disk intermediate files for MindInsight visualization + + profiler_info_*.json Profiler Configuration and other info + ============================================== ============================================================================== + +- *represents rank id +- The complete name of ascend_cluster_analyse_model-xxx_*.csv should be ascend_cluster_analyse_model-{mode}_{stage_num}_{rank_size}_{rank_id}.csv, such as ascend_cluster_analyse_model-parallel_1_8_0.csv diff --git a/docs/mindinsight/docs/source_zh_cn/profiling/profiling_offline.txt b/docs/mindinsight/docs/source_zh_cn/profiling/profiling_offline.txt index 063c4b12e7..dca94c8fa1 100644 --- a/docs/mindinsight/docs/source_zh_cn/profiling/profiling_offline.txt +++ b/docs/mindinsight/docs/source_zh_cn/profiling/profiling_offline.txt @@ -40,7 +40,6 @@ 离线解析之后,就可以在/path/to/profiler_data/profiler目录查看性能数据了。 - 目录结构 ~~~~~~~~~~~~ @@ -107,7 +106,7 @@ PROF_{数字}_{时间戳}_{字符串}目录下为CANN Profiling采集的性能数据,主要保存在mindstudio_profiler_output中,数据介绍可参考 `性能数据文件说明 `_。 -profiler目录下包含csv、json、txt三类文件,覆盖了算子执行时间、内存占用、通信等方面的性能数据,文件说明见下表。部分文件的详细说明参考 `性能数据 `_ +profiler目录下包含csv、json、txt三类文件,覆盖了算子执行时间、内存占用、通信等方面的性能数据,文件说明见下表。部分文件的详细说明参考 `性能数据 `_。 ============================================== ============================================================================== 文件名 说明 -- Gitee From 75d05a270545dd6d5ee49673c2352fcf19622ef7 Mon Sep 17 00:00:00 2001 From: huan <3174348550@qq.com> Date: Thu, 8 Aug 2024 11:23:30 +0800 Subject: [PATCH 22/69] modify the error abchoes --- .../mindspore/source_en/note/static_graph_syntax_support.md | 6 +++--- tutorials/experts/source_en/debug/dump.md | 4 ++-- tutorials/experts/source_en/operation/op_custom.md | 2 +- tutorials/experts/source_zh_cn/debug/dump.md | 4 ++-- tutorials/experts/source_zh_cn/operation/op_custom.ipynb | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/mindspore/source_en/note/static_graph_syntax_support.md b/docs/mindspore/source_en/note/static_graph_syntax_support.md index 813c2dcdd0..01cb31ff01 100644 --- a/docs/mindspore/source_en/note/static_graph_syntax_support.md +++ b/docs/mindspore/source_en/note/static_graph_syntax_support.md @@ -14,7 +14,7 @@ MindSpore static graph execution process actually consists of two steps, corresp There are two ways to use the Graph mode. The first way is to call the `@jit` decorator to modify a function or a class member method, and then the decorated function or method will be compiled into a static computation graph. For details about how to use `jit`, click [jit API document](https://www.mindspore.cn/docs/en/master/api_python/mindspore/mindspore.jit.html#mindspore.jit). The second way is to set `ms.set_context(mode=ms.GRAPH_MODE)`, then write the code in the `construct` function of the `Cell` so that the code in the `construct` function will be compiled into a static computation graph. For details about the definition of `Cell`, click [Cell API document](https://www.mindspore.cn/docs/en/master/api_python/nn/mindspore.nn.Cell.html). -Due to syntax parsing restrictions, the supported data types, syntax, and related operations during graph building are not completely consistent with the Python syntax. As a result, some usage is restricted. Borrowing the traditional JIT compilation idea, considers the unification of static and dynamic graphs from the perspective of graph mode and extends the syntax capabilities of graph patterns. The static graph provides a syntax experience close to that of the dynamic graph, so as to realize the unity of dynamic and static. In order to facilitate users to choose whether to extend the static graph syntax, the JIT syntax support level option 'jit_syntax_level' is provided, and its value must be in the range of [STRICT,LAX], and selecting 'STRICT' is considered to use the basic syntax and do not extend the static graph syntax. The default value is 'LAX', please refer to the [Extended Syntaxes (LAX level)](#extended-syntaxes-(lAX-level)) section of this article for more information. All backends are supported at all levels. +Due to syntax parsing restrictions, the supported data types, syntax, and related operations during graph building are not completely consistent with the Python syntax. As a result, some usage is restricted. Borrowing the traditional JIT compilation idea, considers the unification of static and dynamic graphs from the perspective of graph mode and extends the syntax capabilities of graph patterns. The static graph provides a syntax experience close to that of the dynamic graph, so as to realize the unity of dynamic and static. In order to facilitate users to choose whether to extend the static graph syntax, the JIT syntax support level option 'jit_syntax_level' is provided, and its value must be in the range of [STRICT,LAX], and selecting 'STRICT' is considered to use the basic syntax and do not extend the static graph syntax. The default value is 'LAX', please refer to the [Extended Syntaxes (LAX level)](#extended-syntaxes-lax-level) section of this article for more information. All backends are supported at all levels. - STRICT: Only basic syntaxes is supported, and execution performance is optimal. Can be used for MindIR load and export. - LAX: Supporting more complex syntaxes, compatible with all Python syntax as much as possible. Cannot be used for MindIR load and export due to some syntax that may not be able to be exported. @@ -1036,11 +1036,11 @@ The execution graph in graph mode is converted from source code, and not all Pyt RuntimeError: Unsupported statement 'Try'. ``` -4. Benchmarking Python built-in data types, except for [Built-in Python Data Types](#built-in-python-data-types) supported in the current graph mode, complex 'complex' and collection 'set' types are not supported. Some high-level uses of the list 'list' and dictionary 'dictionary' are not supported in the basic syntax scenario, and need to be supported when the JIT syntax support level option 'jit_syntax_level' is 'LAX', please refer to the [Extended Syntaxes (LAX level)](#extended-syntaxes-(lAX-level)) section of this article for more information. +4. Benchmarking Python built-in data types, except for [Built-in Python Data Types](#built-in-python-data-types) supported in the current graph mode, complex 'complex' and collection 'set' types are not supported. Some high-level uses of the list 'list' and dictionary 'dictionary' are not supported in the basic syntax scenario, and need to be supported when the JIT syntax support level option 'jit_syntax_level' is 'LAX', please refer to the [Extended Syntaxes (LAX level)](#extended-syntaxes-lax-level) section of this article for more information. 5. In the basic syntax scenario, in addition to the [Python Built-in Functions](https://www.mindspore.cn/docs/en/master/note/static_graph_syntax/python_builtin_functions.html) supported in the current graph mode, there are still some built-in functions that are not supported in graph mode. For example: basestring, bin, bytearray, callable, chr, cmp, compile, delattr, dir, divmod, eval, execfile, file, frozenset, hash, hex, id, input, issubclass, iter, locals, long, memoryview, next, object, oct, open, ord, property, raw_input, reduce, reload, repr, reverse, set, slice, sorted, unichr, unicode, vars, xrange, \_\_import\_\_. -6. Python provides a number of third-party libraries that usually need to be called via import statements. In graph mode, when the JIT syntax support level is 'STRICT', you cannot directly use third-party libraries. If you need to use the data types of third-party libraries in graph mode or call methods of third-party libraries, you need to support them only if the JIT syntax support level option 'jit_syntax_level' is 'LAX', please refer to the [Calling the Third-party Libraries](#calling-the-third-party-libraries) section in [Extended Syntaxes (LAX level)](#extended-syntaxes-(lAX-level)) of this article. +6. Python provides a number of third-party libraries that usually need to be called via import statements. In graph mode, when the JIT syntax support level is 'STRICT', you cannot directly use third-party libraries. If you need to use the data types of third-party libraries in graph mode or call methods of third-party libraries, you need to support them only if the JIT syntax support level option 'jit_syntax_level' is 'LAX', please refer to the [Calling the Third-party Libraries](#calling-the-third-party-libraries) section in [Extended Syntaxes (LAX level)](#extended-syntaxes-lax-level) of this article. 7. In graph mode, the modification of the attributes of the class outside the graph is not perceived, that is, the modification of the attributes of the class outside the graph will not take effect. For example: diff --git a/tutorials/experts/source_en/debug/dump.md b/tutorials/experts/source_en/debug/dump.md index 4730ae0390..d950890a2b 100644 --- a/tutorials/experts/source_en/debug/dump.md +++ b/tutorials/experts/source_en/debug/dump.md @@ -550,7 +550,7 @@ MindSpore provides debugging capabilities for large networks through asynchronou This field is optional, with default values of ["max", "min", "l2norm"]. - - `file_format`: Dump file type. It can be either `npy` and `bin`. `npy`: data will be dumped in npy files as host format. `bin`: data will be dumped in protobuf file as device format and need to be transformed to parse using the provided data analysis tool. Please refer to [Asynchronous Dump Data Analysis Sample](#asynchronous-dump-data-analysis-sample) for details. The default value is `bin`. + - `file_format`: Dump file type. It can be either `npy` and `bin`. `npy`: data will be dumped in npy files as host format. `bin`: data will be dumped in protobuf file as device format and need to be transformed to parse using the provided data analysis tool. Please refer to [Asynchronous Dump Data Analysis Sample](#data-analysis-sample-1) for details. The default value is `bin`. 2. Set Dump environment variable. @@ -573,7 +573,7 @@ MindSpore provides debugging capabilities for large networks through asynchronou You can set `set_context(reserve_class_name_in_scope=False)` in your training script to avoid dump failure because of file name is too long. -4. Refer to [Asynchronous Dump Data Analysis Sample](#asynchronous-dump-data-analysis-sample) to analyze the Dump data file. +4. Refer to [Asynchronous Dump Data Analysis Sample](#data-analysis-sample-1) to analyze the Dump data file. > - If you need to dump all or part of the operator, you can modify the `dump_mode` option in the json configuration file to 0 or 1. > - Due to the slow Dump speed, enabling Dump in large model scenarios can extend the communication interval between different cards, leading to communication operator timeouts. This issue can be resolved by adjusting the timeout duration for the communication operators. For the Ascend backend, you can set the HCCL_EXEC_TIMEOUT environment variable. For detailed instructions, please refer to the [Ascend CANN documentation](https://www.hiascend.com/document/detail/zh/canncommercial/80RC1/apiref/envvar/envref_07_0072.html). diff --git a/tutorials/experts/source_en/operation/op_custom.md b/tutorials/experts/source_en/operation/op_custom.md index ec6bd63cf2..fa12a8ebee 100644 --- a/tutorials/experts/source_en/operation/op_custom.md +++ b/tutorials/experts/source_en/operation/op_custom.md @@ -26,7 +26,7 @@ The difference between these operator development methods are as follows: | Defining Methods | Development Language | Compilation Method | Supported Platforms | Recommended Scenarios | |:----------------:|:--------------------:| :------: | ------ |-------------------------------------------------------------------------------| -| [pyfunc](https://www.mindspore.cn/tutorials/experts/en/master/operation/op_custom.html#the-introduction-to-custom-operator-an-example) | Python | JIT | `CPU` | Fast algorithm verification, need to interact with Python and other scenarios | +| [pyfunc](#the-introduction-to-custom-operator-an-example) | Python | JIT | `CPU` | Fast algorithm verification, need to interact with Python and other scenarios | | [hybrid](#defining-custom-operator-of-hybrid-type) | MindSpore HYBRID DSL | N/A | `GPU` `CPU` | General development and rapid validation for all platforms| | [akg](#defining-custom-operator-of-akg-type) | MindSpore AKG DSL | JIT | `GPU` | GPU platform general scenarios | | [aot](#defining-custom-operator-of-aot-type) | C/C++/CUDA | AOT | `GPU` `CPU` | high-performance scenarios / use third-party operators scenarios | diff --git a/tutorials/experts/source_zh_cn/debug/dump.md b/tutorials/experts/source_zh_cn/debug/dump.md index f187290e50..d3bf0a229a 100644 --- a/tutorials/experts/source_zh_cn/debug/dump.md +++ b/tutorials/experts/source_zh_cn/debug/dump.md @@ -550,7 +550,7 @@ MindSpore通过异步Dump提供了Ascend平台上大型网络的调试能力。 该字段为可选,默认值为["max", "min", "l2norm"]。 - - `file_format`: dump数据的文件类型,只支持`npy`和`bin`两种取值。设置成`npy`,则dump出的算子张量数据将为host侧格式的npy文件;设置成`bin`,则dump出的数据将为device侧格式的protobuf文件,需要借助转换工具进行处理,详细步骤请参考[异步Dump数据分析样例](#异步dump数据分析样例)。默认取值为`bin`。 + - `file_format`: dump数据的文件类型,只支持`npy`和`bin`两种取值。设置成`npy`,则dump出的算子张量数据将为host侧格式的npy文件;设置成`bin`,则dump出的数据将为device侧格式的protobuf文件,需要借助转换工具进行处理,详细步骤请参考[异步Dump数据分析样例](#数据分析样例-1)。默认取值为`bin`。 2. 设置数据Dump的环境变量。 @@ -573,7 +573,7 @@ MindSpore通过异步Dump提供了Ascend平台上大型网络的调试能力。 可以在训练脚本中设置`set_context(reserve_class_name_in_scope=False)`,避免Dump文件名称过长导致Dump数据文件生成失败。 -4. 参考[异步Dump数据分析样例](#异步dump数据分析样例)解析Dump数据文件。 +4. 参考[异步Dump数据分析样例](#数据分析样例-1)解析Dump数据文件。 > - 若需要dump全量或部分算子,则可以修改json配置文件中的`dump_mode`选项为0或1。 > - 由于Dump速度较慢,在大模型场景下开启Dump会延长不同卡之间的通信间隔时间,从而导致通信算子超时。可以通过调整通信算子的超时时间来解决此问题。对于Ascend后端,可以设置HCCL_EXEC_TIMEOUT环境变量,具体设置方法请参考[昇腾CANN文档](https://www.hiascend.com/document/detail/zh/canncommercial/80RC1/apiref/envvar/envref_07_0072.html)。 diff --git a/tutorials/experts/source_zh_cn/operation/op_custom.ipynb b/tutorials/experts/source_zh_cn/operation/op_custom.ipynb index 8248cc256b..1144ae9ce8 100644 --- a/tutorials/experts/source_zh_cn/operation/op_custom.ipynb +++ b/tutorials/experts/source_zh_cn/operation/op_custom.ipynb @@ -190,7 +190,7 @@ "\n", "Hybrid类型的自定义算子是自定义算子的默认定义类型。通过使用Hybrid类型的自定义算子,用户可以用类Python的语法描述算子计算逻辑,且无需关注MindSpore框架对于算子定义的工程细节,让用户专注于算法本身。\n", "\n", - "Hybrid类型的自定义算子使用[MindSpore Hybrid DSL](https://www.mindspore.cn/tutorials/experts/zh-CN/master/operation/ms_kernel.html#语法规则)描述算子内部计算逻辑的实现。用MindSpore Hybrid DSL定义的函数可以被[AKG算子编译器](https://gitee.com/mindspore/akg)解析进行JIT编译生成高效算子,在大规模模型的训练推理中使用。同时,用MindSpore Hybrid DSL定义的函数可以当做一个`numpy`函数直接调用,方便用户调试的同时也可以灵活的切换到[pyfunc 类型的自定义算子](#自定义算子入门一个例子),做到一次开发,多个模式多个平台多个场景复用的自定义算子表达。\n", + "Hybrid类型的自定义算子使用[MindSpore Hybrid DSL](https://www.mindspore.cn/tutorials/experts/zh-CN/master/operation/ms_kernel.html#语法规则)描述算子内部计算逻辑的实现。用MindSpore Hybrid DSL定义的函数可以被[AKG算子编译器](https://gitee.com/mindspore/akg)解析进行JIT编译生成高效算子,在大规模模型的训练推理中使用。同时,用MindSpore Hybrid DSL定义的函数可以当做一个`numpy`函数直接调用,方便用户调试的同时也可以灵活的切换到[pyfunc 类型的自定义算子](#自定义算子入门),做到一次开发,多个模式多个平台多个场景复用的自定义算子表达。\n", "\n", "下面用例(test_custom_hybrid.py)介绍hybrid类型的自定义算子开发流程,其中自定义算子实现两个输入张量相加的功能。\n", "值得注意的是,Hybrid类型的自定义算子采取源码变换的方式打通MindSpore的图编译器和算子编译器,用户可以直接使用MindSpore Hybrid DSL提供的关键词,例如下面的`output_tensor`,而无需引入对应Python函数。更多MindSpore Hybrid DSL关键词的介绍,参见[MindSpore Hybrid DSL关键词](https://www.mindspore.cn/tutorials/experts/zh-CN/master/operation/ms_kernel.html#关键词)。" -- Gitee From 6e296e4ba290dcee8e9f053a5169007a3a65b3c2 Mon Sep 17 00:00:00 2001 From: huan <3174348550@qq.com> Date: Thu, 8 Aug 2024 16:51:54 +0800 Subject: [PATCH 23/69] modify the format in files --- .../use/cloud_infer/converter_python.md | 17 ++++++++++++----- .../use/cloud_infer/converter_python.md | 15 +++++++++++---- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/docs/lite/docs/source_en/use/cloud_infer/converter_python.md b/docs/lite/docs/source_en/use/cloud_infer/converter_python.md index 4461f3cce3..c357991db3 100644 --- a/docs/lite/docs/source_en/use/cloud_infer/converter_python.md +++ b/docs/lite/docs/source_en/use/cloud_infer/converter_python.md @@ -91,12 +91,19 @@ Detailed descriptions of the parameters and their correspondence to the paramete | save_type | ModelType | `--saveType=` | Required | Set the model type needs to be export. | ModelType.MINDIR | The MINDIR model uses the MindSpore Lite cloud-side inference installation package | | weight_fp16 | bool | `--fp16=` | Set whether the weights in float32 data format need to be stored in float16 data format during model serialization. | True, False | - | -> The encryption and decryption function only takes effect when `MSLITE_ENABLE_MODEL_ENCRYPTION=on` is set at [compile](https://www.mindspore.cn/lite/docs/en/master/use/cloud_infer/build.html) time and only supports Linux x86 platforms. `decrypt_key` and `encrypt_key` are string expressed in hexadecimal. For example, if encrypt_key is set as "30313233343637383939414243444546", the corresponding hexadecimal expression is '(b)0123456789ABCDEF' . Linux platform users can use the' xxd 'tool to convert the key expressed in bytes into hexadecimal expressions. -> `input_shape` is a attribute that the user may need to set in the following scenarios: +> - The encryption and decryption function only takes effect when `MSLITE_ENABLE_MODEL_ENCRYPTION=on` is set at [compile](https://www.mindspore.cn/lite/docs/en/master/use/cloud_infer/build.html) time and only supports Linux x86 platforms. `decrypt_key` and `encrypt_key` are string expressed in hexadecimal. For example, if encrypt_key is set as "30313233343637383939414243444546", the corresponding hexadecimal expression is '(b)0123456789ABCDEF' . Linux platform users can use the' xxd 'tool to convert the key expressed in bytes into hexadecimal expressions. > -> - Usage 1: The input of the model to be converted is dynamic shape, and the fixed-shape inference is prepared, then this attribute is set to fixed-shape. After setting, when inference about the model after the Converter, the default input shape is the same as this attribute setting, and no resize operation is needed. -> - Usage 2: Regardless of whether the original input of the model to be converted is a dynamic shape, use fixed-shape inference and want the performance of the model to be optimized as much as possible, then set this attribute to fixed-shape. After setting, the model structure will be further optimized, but the converted model may lose the characteristics of the dynamic shape (some operators strongly related to the shape will be fused). -> `optimize` is an attribute, it used to set the mode of optimization during the offline conversion. If this attribute is set to "none", no relevant graph optimization operations will be performed during the offline conversion phase of the model, and the relevant graph optimization operations will be performed during the execution of the inference phase. The advantage of this attribute is that the converted model can be deployed directly to any CPU/GPU/Ascend hardware backend since it is not optimized in a specific way, while the disadvantage is that the initialization time of the model increases during inference execution. If this attribute is set to "general", general optimization will be performed, such as constant folding and operator fusion (the converted model only supports CPU/GPU hardware backend, not Ascend backend). If this parameter is set to "gpu_oriented", the general optimization and extra optimization for GPU hardware will be performed (the converted model only supports GPU hardware backend). If this attribute is set to "ascend_oriented", the optimization for Ascend hardware will be performed (the converted model only supports Ascend hardware backend). +> - `input_shape` is a attribute that the user may need to set in the following scenarios: +> +> - Usage 1: The input of the model to be converted is dynamic shape, and the fixed-shape inference is prepared, then this attribute is set to fixed-shape. After setting, when inference about the model after the Converter, the default input shape is the same as this attribute setting, and no resize operation is needed. +> - Usage 2: Regardless of whether the original input of the model to be converted is a dynamic shape, use fixed-shape inference and want the performance of the model to be optimized as much as possible, then set this attribute to fixed-shape. After setting, the model structure will be further optimized, but the converted model may lose the characteristics of the dynamic shape (some operators strongly related to the shape will be fused). +> +> - `optimize` is an attribute, it used to set the mode of optimization during the offline conversion. +> +> - If this attribute is set to "none", no relevant graph optimization operations will be performed during the offline conversion phase of the model, and the relevant graph optimization operations will be performed during the execution of the inference phase. The advantage of this attribute is that the converted model can be deployed directly to any CPU/GPU/Ascend hardware backend since it is not optimized in a specific way, while the disadvantage is that the initialization time of the model increases during inference execution. +> - If this attribute is set to "general", general optimization will be performed, such as constant folding and operator fusion (the converted model only supports CPU/GPU hardware backend, not Ascend backend). +> - If this parameter is set to "gpu_oriented", the general optimization and extra optimization for GPU hardware will be performed (the converted model only supports GPU hardware backend). +> - If this attribute is set to "ascend_oriented", the optimization for Ascend hardware will be performed (the converted model only supports Ascend hardware backend). > ### Method of convert diff --git a/docs/lite/docs/source_zh_cn/use/cloud_infer/converter_python.md b/docs/lite/docs/source_zh_cn/use/cloud_infer/converter_python.md index 2884bb886d..b8c567209d 100644 --- a/docs/lite/docs/source_zh_cn/use/cloud_infer/converter_python.md +++ b/docs/lite/docs/source_zh_cn/use/cloud_infer/converter_python.md @@ -92,11 +92,18 @@ MindSpore Lite云侧推理的Python接口模型转换提供了多种属性设置 | weight_fp16 | bool | `--fp16=` | 设置在模型序列化时是否需要将float32数据格式的权重存储为float16数据格式。 | True、False | - | > - 加解密功能仅在[编译](https://www.mindspore.cn/lite/docs/zh-CN/master/use/cloud_infer/build.html) 时设置为 `MSLITE_ENABLE_MODEL_ENCRYPTION=on` 时生效,并且仅支持Linux x86平台。其中密钥为十六进制表示的字符串,如encrypt_key设置为"30313233343536373839414243444546",对应的十六进制表示为 `(b)0123456789ABCDEF` ,Linux平台用户可以使用 `xxd` 工具对字节表示的密钥进行十六进制表达转换。需要注意的是,加解密算法在1.7版本进行了更新,导致新版的Python接口不支持对1.6及其之前版本的MindSpore Lite加密导出的模型进行转换。 -> `input_shape` 在以下场景下,用户可能需要设置该属性: > -> - 用法1:待转换模型的输入是动态shape,准备采用固定shape推理,则设置该属性为固定shape。设置之后,在对Converter后的模型进行推理时,默认输入的shape与该属性设置一样,无需再进行resize操作。 -> - 用法2:无论待转换模型的原始输入是否为动态shape,准备采用固定shape推理,并希望模型的性能尽可能优化,则设置该属性为固定shape。设置之后,将对模型结构进一步优化,但转换后的模型可能会失去动态shape的特征(部分跟shape强相关的算子会被融合)。 -> - `optimize` 该属性是用来设定在离线转换的过程中需要完成哪些特定的优化。如果该属性设置为"none",那么在模型的离线转换阶段将不进行相关的图优化操作,相关的图优化操作将会在执行推理阶段完成。该属性的优点在于转换出来的模型由于没有经过特定的优化,可以直接部署到CPU/GPU/Ascend任意硬件后端;而带来的缺点是推理执行时模型的初始化时间增长。如果设置成"general",表示离线转换过程会完成通用优化,包括常量折叠,算子融合等(转换出的模型只支持CPU/GPU后端,不支持Ascend后端)。如果设置成"gpu_oriented",表示转换过程中会完成通用优化和针对GPU后端的额外优化(转换出来的模型只支持GPU后端)。如果设置成"ascend_oriented",表示转换过程中只完成针对Ascend后端的优化(转换出来的模型只支持Ascend后端)。 +> - `input_shape` 在以下场景下,用户可能需要设置该属性: +> +> - 用法1:待转换模型的输入是动态shape,准备采用固定shape推理,则设置该属性为固定shape。设置之后,在对Converter后的模型进行推理时,默认输入的shape与该属性设置一样,无需再进行resize操作。 +> - 用法2:无论待转换模型的原始输入是否为动态shape,准备采用固定shape推理,并希望模型的性能尽可能优化,则设置该属性为固定shape。设置之后,将对模型结构进一步优化,但转换后的模型可能会失去动态shape的特征(部分跟shape强相关的算子会被融合)。 +> +> - `optimize` 该属性是用来设定在离线转换的过程中需要完成哪些特定的优化。 +> +> - 如果该属性设置为"none",那么在模型的离线转换阶段将不进行相关的图优化操作,相关的图优化操作将会在执行推理阶段完成。该属性的优点在于转换出来的模型由于没有经过特定的优化,可以直接部署到CPU/GPU/Ascend任意硬件后端;而带来的缺点是推理执行时模型的初始化时间增长。 +> - 如果设置成"general",表示离线转换过程会完成通用优化,包括常量折叠,算子融合等(转换出的模型只支持CPU/GPU后端,不支持Ascend后端)。 +> - 如果设置成"gpu_oriented",表示转换过程中会完成通用优化和针对GPU后端的额外优化(转换出来的模型只支持GPU后端)。 +> - 如果设置成"ascend_oriented",表示转换过程中只完成针对Ascend后端的优化(转换出来的模型只支持Ascend后端)。 > ### convert方法 -- Gitee From 3d536e6c2194314e42f8ac7a89f04179653149ca Mon Sep 17 00:00:00 2001 From: huan <3174348550@qq.com> Date: Mon, 12 Aug 2024 17:59:50 +0800 Subject: [PATCH 24/69] modify the error links --- docs/mindspore/source_en/faq/data_processing.md | 8 +++----- docs/mindspore/source_zh_cn/faq/data_processing.md | 8 +++----- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/docs/mindspore/source_en/faq/data_processing.md b/docs/mindspore/source_en/faq/data_processing.md index abf788e9b8..2f1256705c 100644 --- a/docs/mindspore/source_en/faq/data_processing.md +++ b/docs/mindspore/source_en/faq/data_processing.md @@ -38,7 +38,7 @@ A: You can refer to the following steps to reduce CPU consumption (mainly due to ## Q:  Why there is no difference between the parameter `shuffle` in `GeneratorDataset`, and `shuffle=True` and `shuffle=False` when the task is run? -A: If `shuffle` is enabled, the input `Dataset` must support random access (for example, the user-defined `Dataset` has the `getitem` method). If data is returned in `yeild` mode in the user-defined `Dataset`, random access is not supported. For details, see section [Loading Dataset Overview](https://www.mindspore.cn/tutorials/en/master/advanced/dataset.html) in the tutorial. +A: If `shuffle` is enabled, the input `Dataset` must support random access (for example, the user-defined `Dataset` has the `getitem` method). If data is returned in `yeild` mode in the user-defined `Dataset`, random access is not supported. For details, see section [GeneratorDataset example](https://www.mindspore.cn/docs/en/master/api_python/dataset/mindspore.dataset.GeneratorDataset.html).
    @@ -160,9 +160,7 @@ A: You can refer to the usage of YOLOv3 which contains the resizing of different A: [build_seg_data.py](https://gitee.com/mindspore/models/blob/master/research/cv/FCN8s/src/data/build_seg_data.py) is the script of MindRecords generated by the dataset. You can directly use or adapt it to your dataset. Alternatively, you can use `GeneratorDataset` to customize the dataset loading if you want to implement the dataset reading by yourself. -[GenratorDataset example](https://www.mindspore.cn/tutorials/en/master/advanced/dataset.html) - -[GeneratorDataset API description](https://www.mindspore.cn/docs/en/master/api_python/dataset/mindspore.dataset.GeneratorDataset.html#mindspore.dataset.GeneratorDataset) +[GeneratorDataset example](https://www.mindspore.cn/docs/en/master/api_python/dataset/mindspore.dataset.GeneratorDataset.html)
    @@ -314,7 +312,7 @@ dataset3 = dataset2.map(***) ## Q: What is the API corresponding to DataLoader in MindSpore? -A: If the DataLoader is considered as an API for receiving user-defined datasets, the GeneratorDataset in the MindSpore data processing API is similar to that in the DataLoader and can receive user-defined datasets. For details about how to use the GeneratorDataset, see the [Loading Dataset Overview](https://www.mindspore.cn/tutorials/en/master/advanced/dataset.html), and for details about the differences, see the [API Mapping](https://www.mindspore.cn/docs/en/master/note/api_mapping/pytorch_api_mapping.html). +A: If the DataLoader is considered as an API for receiving user-defined datasets, the GeneratorDataset in the MindSpore data processing API is similar to that in the DataLoader and can receive user-defined datasets. For details about how to use the GeneratorDataset, see the [GeneratorDataset example](https://www.mindspore.cn/docs/en/master/api_python/dataset/mindspore.dataset.GeneratorDataset.html), and for details about the differences, see the [API Mapping](https://www.mindspore.cn/docs/en/master/note/api_mapping/pytorch_api_mapping.html).
    diff --git a/docs/mindspore/source_zh_cn/faq/data_processing.md b/docs/mindspore/source_zh_cn/faq/data_processing.md index 8b6bfd5aa4..9f27967ab0 100644 --- a/docs/mindspore/source_zh_cn/faq/data_processing.md +++ b/docs/mindspore/source_zh_cn/faq/data_processing.md @@ -38,7 +38,7 @@ A: 可以参考如下几个步骤来降低CPU占用,进一步提升性能, ## Q: 在`GeneratorDataset`中,看到有参数`shuffle`,在跑任务时发现`shuffle=True`和`shuffle=False`,两者没有区别,这是为什么? -A: 开启`shuffle`,需要传入的`Dataset`是支持随机访问的(例如自定义的`Dataset`有`getitem`方法),如果是在自定义的`Dataset`里面通过`yeild`方式返回回来的数据,是不支持随机访问的,具体可查看教程中的[自定义数据集](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/dataset.html#自定义数据集)章节。 +A: 开启`shuffle`,需要传入的`Dataset`是支持随机访问的(例如自定义的`Dataset`有`getitem`方法),如果是在自定义的`Dataset`里面通过`yeild`方式返回回来的数据,是不支持随机访问的,具体可查看[GeneratorDataset 示例](https://www.mindspore.cn/docs/zh-CN/master/api_python/dataset/mindspore.dataset.GeneratorDataset.html)章节。
    @@ -160,9 +160,7 @@ A: 你可以参考yolov3对于此场景的使用,里面有对于图像的不 A: [build_seg_data.py](https://gitee.com/mindspore/models/blob/master/research/cv/FCN8s/src/data/build_seg_data.py)是将数据集生成MindRecord的脚本,可以直接使用/适配下你的数据集。或者如果你想尝试自己实现数据集的读取,可以使用`GeneratorDataset`自定义数据集加载。 -[GenratorDataset 示例](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/dataset.html#自定义数据集) - -[GenratorDataset API说明](https://www.mindspore.cn/docs/zh-CN/master/api_python/dataset/mindspore.dataset.GeneratorDataset.html#mindspore.dataset.GeneratorDataset) +[GeneratorDataset 示例](https://www.mindspore.cn/docs/zh-CN/master/api_python/dataset/mindspore.dataset.GeneratorDataset.html)
    @@ -315,7 +313,7 @@ dataset3 = dataset2.map(***) ## Q: MindSpore中和DataLoader对应的接口是什么? -A:如果将DataLoader考虑为接收自定义Dataset的API接口,MindSpore数据处理API中和Dataloader较为相似的是GeneratorDataset,可接收用户自定义的Dataset,具体使用方式参考[GeneratorDataset 文档](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/dataset.html#自定义数据集),差异对比也可查看[API算子映射表](https://www.mindspore.cn/docs/zh-CN/master/note/api_mapping/pytorch_api_mapping.html)。 +A:如果将DataLoader考虑为接收自定义Dataset的API接口,MindSpore数据处理API中和Dataloader较为相似的是GeneratorDataset,可接收用户自定义的Dataset,具体使用方式参考[GeneratorDataset 示例](https://www.mindspore.cn/docs/zh-CN/master/api_python/dataset/mindspore.dataset.GeneratorDataset.html),差异对比也可查看[API算子映射表](https://www.mindspore.cn/docs/zh-CN/master/note/api_mapping/pytorch_api_mapping.html)。
    -- Gitee From 27c62b2a4cecbc90a39922890f2fa50a26a9df78 Mon Sep 17 00:00:00 2001 From: huan <3174348550@qq.com> Date: Tue, 13 Aug 2024 10:55:18 +0800 Subject: [PATCH 25/69] modify the format of txt files --- .../source_en/profiling/profiling_offline.txt | 74 +++++++++---------- .../profiling/profiling_offline.txt | 74 +++++++++---------- 2 files changed, 74 insertions(+), 74 deletions(-) diff --git a/docs/mindinsight/docs/source_en/profiling/profiling_offline.txt b/docs/mindinsight/docs/source_en/profiling/profiling_offline.txt index cd53ab313f..28dbdd76b0 100644 --- a/docs/mindinsight/docs/source_en/profiling/profiling_offline.txt +++ b/docs/mindinsight/docs/source_en/profiling/profiling_offline.txt @@ -100,60 +100,60 @@ An example of the performance data catalog structure is shown below: ├──── step_trace_point_info_*.json └──── step_trace_raw_*_detail_time.csv -- *represents rank id +- \* represents rank id Performance Data File Description -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PROF_{number}_{timestamp}_{string} directory is the performance data collected by CANN Profiling, which is mainly stored in mindstudio_profiler_output. The data introduction can be referred to `Performance data file description `_. The profiler directory contains three types of files, csv, json, and txt, which cover performance data in terms of operator execution time, memory usage, communication, etc. The file descriptions are shown in the following table. For detailed descriptions of some files, refer to `Performance data `_. - ============================================== ============================================================================== - File Names Descriptions - ============================================== ============================================================================== - step_trace_point_info_*.json Information about the operator corresponding to the step node (only mode=GRAPH,export GRAPH_OP_RUM=0) - step_trace_raw_*_detail_time.csv Time information for the nodes of each STEP (only mode=GRAPH,export GRAPH_OP_RUM=0) +============================================== ============================================================================== +File Names Descriptions +============================================== ============================================================================== +step_trace_point_info_*.json Information about the operator corresponding to the step node (only mode=GRAPH,export GRAPH_OP_RUM=0) +step_trace_raw_*_detail_time.csv Time information for the nodes of each STEP (only mode=GRAPH,export GRAPH_OP_RUM=0) - dynamic_shape_info_*.json Operator information under dynamic shape +dynamic_shape_info_*.json Operator information under dynamic shape - pipeline_profiling_*.json MindSpore data processing to capture intermediate files of falling disks for MindInsight visualization - minddata_pipeline_raw_*.csv MindSpore data processing to capture intermediate files of falling disks for MindInsight visualization - minddata_pipeline_summary_*.csv MindSpore data processing to capture intermediate files of falling disks for MindInsight visualization - minddata_pipeline_summary_*.json MindSpore data processing to capture intermediate files of falling disks for MindInsight visualization - framework_raw_*.csv Information about AI Core operators in MindSpore data processing - device_queue_profiling_*.txt MindSpore data processing to capture intermediate files of falling disks for MindInsight visualization (data sinking scenarios only) - minddata_aicpu_*.txt Performance data for AI CPU operators in MindSpore data processing (data sinking scenarios only) - dataset_iterator_profiling_*.txt MindSpore data processing to capture intermediate files of falling disks for MindInsight visualization (data non-sinking scenarios only) +pipeline_profiling_*.json MindSpore data processing to capture intermediate files of falling disks for MindInsight visualization +minddata_pipeline_raw_*.csv MindSpore data processing to capture intermediate files of falling disks for MindInsight visualization +minddata_pipeline_summary_*.csv MindSpore data processing to capture intermediate files of falling disks for MindInsight visualization +minddata_pipeline_summary_*.json MindSpore data processing to capture intermediate files of falling disks for MindInsight visualization +framework_raw_*.csv Information about AI Core operators in MindSpore data processing +device_queue_profiling_*.txt MindSpore data processing to capture intermediate files of falling disks for MindInsight visualization (data sinking scenarios only) +minddata_aicpu_*.txt Performance data for AI CPU operators in MindSpore data processing (data sinking scenarios only) +dataset_iterator_profiling_*.txt MindSpore data processing to capture intermediate files of falling disks for MindInsight visualization (data non-sinking scenarios only) - aicore_intermediate_*_detail.csv AI Core operator data - aicore_intermediate_*_type.csv AI Core operator calling counts and time taken statistics - aicpu_intermediate_*.csv Time taken data after AI CPU operator information parsing - flops_*.txt Record the number of floating-point calculations (FLOPs), floating-point calculations per second (FLOPS) for AI Core operators - flops_summary_*.json Record total FLOPs for all operators, average FLOPs for all operators, average FLOPS_Utilization +aicore_intermediate_*_detail.csv AI Core operator data +aicore_intermediate_*_type.csv AI Core operator calling counts and time taken statistics +aicpu_intermediate_*.csv Time taken data after AI CPU operator information parsing +flops_*.txt Record the number of floating-point calculations (FLOPs), floating-point calculations per second (FLOPS) for AI Core operators +flops_summary_*.json Record total FLOPs for all operators, average FLOPs for all operators, average FLOPS_Utilization - ascend_timeline_display_*.json timeline visualization file for MindStudio Insight visualization - ascend_timeline_summary_*.json timeline statistics - output_timeline_data_*.txt Operator timeline data, only if AI Core operator data exists +ascend_timeline_display_*.json timeline visualization file for MindStudio Insight visualization +ascend_timeline_summary_*.json timeline statistics +output_timeline_data_*.txt Operator timeline data, only if AI Core operator data exists - cpu_ms_memory_record_*.txt Raw files for memory profiling - operator_memory_*.csv Operator-level memory information +cpu_ms_memory_record_*.txt Raw files for memory profiling +operator_memory_*.csv Operator-level memory information - minddata_cpu_utilization_*.json CPU utilization rate +minddata_cpu_utilization_*.json CPU utilization rate - cpu_op_detail_info_*.csv CPU operator time taken data (mode=GRAPH only) - cpu_op_type_info_*.csv Class-specific CPU operator time taken statistics (mode=GRAPH only) - cpu_op_execute_timestamp_*.txt CPU operator execution start time and time taken (mode=GRAPH only) - cpu_framework_*.txt CPU operator time taken in heterogeneous scenarios (mode=GRAPH only) +cpu_op_detail_info_*.csv CPU operator time taken data (mode=GRAPH only) +cpu_op_type_info_*.csv Class-specific CPU operator time taken statistics (mode=GRAPH only) +cpu_op_execute_timestamp_*.txt CPU operator execution start time and time taken (mode=GRAPH only) +cpu_framework_*.txt CPU operator time taken in heterogeneous scenarios (mode=GRAPH only) - ascend_cluster_analyse_model-xxx.csv Data related to computation and communication, etc. in model-parallel or pipeline-parallel modes (mode=GRAPH only) +ascend_cluster_analyse_model-xxx.csv Data related to computation and communication, etc. in model-parallel or pipeline-parallel modes (mode=GRAPH only) - hccl_raw_*.csv Card-based communication time and communication wait time (mode=GRAPH only) +hccl_raw_*.csv Card-based communication time and communication wait time (mode=GRAPH only) - parallel_strategy_*.json Operator parallel strategy to capture falling disk intermediate files for MindInsight visualization +parallel_strategy_*.json Operator parallel strategy to capture falling disk intermediate files for MindInsight visualization - profiler_info_*.json Profiler Configuration and other info - ============================================== ============================================================================== +profiler_info_*.json Profiler Configuration and other info +============================================== ============================================================================== -- *represents rank id +- \* represents rank id - The complete name of ascend_cluster_analyse_model-xxx_*.csv should be ascend_cluster_analyse_model-{mode}_{stage_num}_{rank_size}_{rank_id}.csv, such as ascend_cluster_analyse_model-parallel_1_8_0.csv diff --git a/docs/mindinsight/docs/source_zh_cn/profiling/profiling_offline.txt b/docs/mindinsight/docs/source_zh_cn/profiling/profiling_offline.txt index dca94c8fa1..d1f09330b0 100644 --- a/docs/mindinsight/docs/source_zh_cn/profiling/profiling_offline.txt +++ b/docs/mindinsight/docs/source_zh_cn/profiling/profiling_offline.txt @@ -99,60 +99,60 @@ ├──── step_trace_point_info_*.json └──── step_trace_raw_*_detail_time.csv -- *代表rank id +- \* 代表rank id 性能数据文件描述 -~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~ PROF_{数字}_{时间戳}_{字符串}目录下为CANN Profiling采集的性能数据,主要保存在mindstudio_profiler_output中,数据介绍可参考 `性能数据文件说明 `_。 profiler目录下包含csv、json、txt三类文件,覆盖了算子执行时间、内存占用、通信等方面的性能数据,文件说明见下表。部分文件的详细说明参考 `性能数据 `_。 - ============================================== ============================================================================== - 文件名 说明 - ============================================== ============================================================================== - step_trace_point_info_*.json step节点对应的算子信息(仅mode=GRAPH,export GRAPH_OP_RUM=0) - step_trace_raw_*_detail_time.csv 每个step的节点的时间信息(仅mode=GRAPH,export GRAPH_OP_RUM=0) +============================================== ============================================================================== +文件名 说明 +============================================== ============================================================================== +step_trace_point_info_*.json step节点对应的算子信息(仅mode=GRAPH,export GRAPH_OP_RUM=0) +step_trace_raw_*_detail_time.csv 每个step的节点的时间信息(仅mode=GRAPH,export GRAPH_OP_RUM=0) - dynamic_shape_info_*.json 动态shape下算子信息 +dynamic_shape_info_*.json 动态shape下算子信息 - pipeline_profiling_*.json MindSpore数据处理,采集落盘的中间文件,用于MindInsight可视化 - minddata_pipeline_raw_*.csv MindSpore数据处理,采集落盘的中间文件,用于MindInsight可视化 - minddata_pipeline_summary_*.csv MindSpore数据处理,采集落盘的中间文件,用于MindInsight可视化 - minddata_pipeline_summary_*.json MindSpore数据处理,采集落盘的中间文件,用于MindInsight可视化 - framework_raw_*.csv MindSpore数据处理中AI Core算子的信息 - device_queue_profiling_*.txt MindSpore数据处理,采集落盘的中间文件,用于MindInsight可视化(仅数据下沉场景) - minddata_aicpu_*.txt MindSpore数据处理中AI CPU算子的性能数据(仅数据下沉场景) - dataset_iterator_profiling_*.txt MindSpore数据处理,采集落盘的中间文件,用于MindInsight可视化(仅数据非下沉场景) +pipeline_profiling_*.json MindSpore数据处理,采集落盘的中间文件,用于MindInsight可视化 +minddata_pipeline_raw_*.csv MindSpore数据处理,采集落盘的中间文件,用于MindInsight可视化 +minddata_pipeline_summary_*.csv MindSpore数据处理,采集落盘的中间文件,用于MindInsight可视化 +minddata_pipeline_summary_*.json MindSpore数据处理,采集落盘的中间文件,用于MindInsight可视化 +framework_raw_*.csv MindSpore数据处理中AI Core算子的信息 +device_queue_profiling_*.txt MindSpore数据处理,采集落盘的中间文件,用于MindInsight可视化(仅数据下沉场景) +minddata_aicpu_*.txt MindSpore数据处理中AI CPU算子的性能数据(仅数据下沉场景) +dataset_iterator_profiling_*.txt MindSpore数据处理,采集落盘的中间文件,用于MindInsight可视化(仅数据非下沉场景) - aicore_intermediate_*_detail.csv AI Core算子数据 - aicore_intermediate_*_type.csv AI Core算子调用次数和耗时统计 - aicpu_intermediate_*.csv AI CPU算子信息解析后耗时数据 - flops_*.txt 记录AI Core算子的浮点计算次数(FLOPs)、每秒的浮点计算次数(FLOPS) - flops_summary_*.json 记录所有算子的总的FLOPs、所有算子的平均FLOPs、平均的FLOPS_Utilization +aicore_intermediate_*_detail.csv AI Core算子数据 +aicore_intermediate_*_type.csv AI Core算子调用次数和耗时统计 +aicpu_intermediate_*.csv AI CPU算子信息解析后耗时数据 +flops_*.txt 记录AI Core算子的浮点计算次数(FLOPs)、每秒的浮点计算次数(FLOPS) +flops_summary_*.json 记录所有算子的总的FLOPs、所有算子的平均FLOPs、平均的FLOPS_Utilization - ascend_timeline_display_*.json timeline可视化文件,用于MindStudio Insight可视化 - ascend_timeline_summary_*.json timeline统计数据 - output_timeline_data_*.txt 算子timeline数据,只有AI Core算子数据存在时才有 +ascend_timeline_display_*.json timeline可视化文件,用于MindStudio Insight可视化 +ascend_timeline_summary_*.json timeline统计数据 +output_timeline_data_*.txt 算子timeline数据,只有AI Core算子数据存在时才有 - cpu_ms_memory_record_*.txt 内存profiling的原始文件 - operator_memory_*.csv 算子级内存信息 +cpu_ms_memory_record_*.txt 内存profiling的原始文件 +operator_memory_*.csv 算子级内存信息 - minddata_cpu_utilization_*.json CPU利用率 +minddata_cpu_utilization_*.json CPU利用率 - cpu_op_detail_info_*.csv CPU算子耗时数据(仅mode=GRAPH) - cpu_op_type_info_*.csv 具体类别CPU算子耗时统计(仅mode=GRAPH) - cpu_op_execute_timestamp_*.txt CPU算子执行起始时间与耗时(仅mode=GRAPH) - cpu_framework_*.txt 异构场景下CPU算子耗时(仅mode=GRAPH) +cpu_op_detail_info_*.csv CPU算子耗时数据(仅mode=GRAPH) +cpu_op_type_info_*.csv 具体类别CPU算子耗时统计(仅mode=GRAPH) +cpu_op_execute_timestamp_*.txt CPU算子执行起始时间与耗时(仅mode=GRAPH) +cpu_framework_*.txt 异构场景下CPU算子耗时(仅mode=GRAPH) - ascend_cluster_analyse_model-xxx.csv 在模型并行或pipeline并行模式下,计算和通信等相关数据(仅mode=GRAPH) +ascend_cluster_analyse_model-xxx.csv 在模型并行或pipeline并行模式下,计算和通信等相关数据(仅mode=GRAPH) - hccl_raw_*.csv 基于卡的通信时间和通信等待时间(仅mode=GRAPH) +hccl_raw_*.csv 基于卡的通信时间和通信等待时间(仅mode=GRAPH) - parallel_strategy_*.json 算子并行策略,采集落盘中间文件,用于MindInsight可视化 +parallel_strategy_*.json 算子并行策略,采集落盘中间文件,用于MindInsight可视化 - profiler_info_*.json Profiler配置等info信息 - ============================================== ============================================================================== +profiler_info_*.json Profiler配置等info信息 +============================================== ============================================================================== -- *表示rank id +- \* 表示rank id - ascend_cluster_analyse_model-xxx_*.csv完整的文件名应该是ascend_cluster_analyse_model-{mode}_{stage_num}_{rank_size}_{rank_id}.csv,比如ascend_cluster_analyse_model-parallel_1_8_0.csv \ No newline at end of file -- Gitee From d01a6bd797ae6950df11e22d378ec7abb6477d5b Mon Sep 17 00:00:00 2001 From: huan <3174348550@qq.com> Date: Tue, 13 Aug 2024 16:40:06 +0800 Subject: [PATCH 26/69] modify the file structure --- .../design/dynamic_graph_and_static_graph.md | 187 +- .../source_en/model_train/program_form/jit.md | 186 ++ .../model_train/program_form/pynative.md | 41 + .../model_train/program_form/static_graph.rst | 2159 +++++++++++++++++ .../source_en/note/official_models.md | 2 +- docs/mindspore/source_en/orange_pi/debug.md | 3 + docs/mindspore/source_en/orange_pi/index.rst | 11 + .../source_en/orange_pi/model_infer.md | 7 + .../mindspore/source_en/orange_pi/overview.md | 3 + .../source_en/orange_pi/quick_start.md | 9 + .../dynamic_graph_and_static_graph.ipynb | 227 -- .../model_train/program_form/jit.ipynb | 261 ++ .../model_train/program_form/pynative.ipynb | 92 + .../model_train/program_form/static_graph.rst | 1835 ++++++++++++++ .../source_zh_cn/note/official_models.md | 2 +- .../mindspore/source_zh_cn/orange_pi/debug.md | 3 + .../source_zh_cn/orange_pi/index.rst | 11 + .../source_zh_cn/orange_pi/model_infer.md | 7 + .../source_zh_cn/orange_pi/overview.md | 3 + .../source_zh_cn/orange_pi/quick_start.md | 9 + 20 files changed, 4643 insertions(+), 415 deletions(-) create mode 100644 docs/mindspore/source_en/model_train/program_form/jit.md create mode 100644 docs/mindspore/source_en/model_train/program_form/pynative.md create mode 100644 docs/mindspore/source_en/model_train/program_form/static_graph.rst create mode 100644 docs/mindspore/source_en/orange_pi/debug.md create mode 100644 docs/mindspore/source_en/orange_pi/index.rst create mode 100644 docs/mindspore/source_en/orange_pi/model_infer.md create mode 100644 docs/mindspore/source_en/orange_pi/overview.md create mode 100644 docs/mindspore/source_en/orange_pi/quick_start.md create mode 100644 docs/mindspore/source_zh_cn/model_train/program_form/jit.ipynb create mode 100644 docs/mindspore/source_zh_cn/model_train/program_form/pynative.ipynb create mode 100644 docs/mindspore/source_zh_cn/model_train/program_form/static_graph.rst create mode 100644 docs/mindspore/source_zh_cn/orange_pi/debug.md create mode 100644 docs/mindspore/source_zh_cn/orange_pi/index.rst create mode 100644 docs/mindspore/source_zh_cn/orange_pi/model_infer.md create mode 100644 docs/mindspore/source_zh_cn/orange_pi/overview.md create mode 100644 docs/mindspore/source_zh_cn/orange_pi/quick_start.md diff --git a/docs/mindspore/source_en/design/dynamic_graph_and_static_graph.md b/docs/mindspore/source_en/design/dynamic_graph_and_static_graph.md index d5ad99cb2d..e64ca99a76 100644 --- a/docs/mindspore/source_en/design/dynamic_graph_and_static_graph.md +++ b/docs/mindspore/source_en/design/dynamic_graph_and_static_graph.md @@ -163,189 +163,4 @@ Similarly for the input y derivation, the same procedure can be used for the der ### Control Flow in PyNative Mode -In the PyNative mode, scripts are executed according to the Python syntax, so in MindSpore, there is no special treatment for the control flow syntax, which is directly expanded and executed according to the Python syntax, and automatic differentiation is performed on the expanded execution operator. For example, for a for loop, the statements in the for loop are continuously executed under PyNative and automatic differentiation is performed on the operators according to the specific number of loops. - -## Dynamic and Static Unification - -### Overview - -The industry currently supports both dynamic and static graph modes. Dynamic graphs are executed by interpretation, with dynamic syntax affinity and flexible expression, and static graphs are executed by using jit compilation optimization, more inclined to static syntax and more restrictions in syntax. For dynamic and static graph modes, firstly MindSpore unifies the API expression, uses the same API in both modes, secondly, unifies the underlying differential mechanism of dynamic and static graphs. - -### Interconversion of Dynamic and Static Graphs - -In MindSpore, we can switch the execution between using dynamic or static graphs by controlling the mode input parameters. For example: - -```python -ms.set_context(mode=ms.PYNATIVE_MODE) -``` - -Since there are restrictions on Python syntax under static graphs, switching from dynamic to static graphs requires compliance with the syntax restrictions of static graphs in order to execute correctly by using static graphs. For more syntax restrictions for static graphs, refer to [Static Graph Syntax Restrictions](https://www.mindspore.cn/docs/en/master/note/static_graph_syntax_support.html). - -### Combination of Static and Dynamic Graphs - -MindSpore supports mixed execution by using static compilation under dynamic graphs. The function objects that need to be executed with static graphs by using jit modification, and in this way you can achieve mixed execution of dynamic and static graphs. For more use of jit, refer to [jit documentation](https://www.mindspore.cn/tutorials/en/master/beginner/accelerate_with_static_graph.html#decorator-based-startup-method). - -For example: - -```python -import numpy as np -import mindspore as ms -import mindspore.nn as nn - -class AddMulMul(nn.Cell): - def __init__(self): - super(AddMulMul, self).__init__() - self.param = ms.Parameter(ms.Tensor(0.5, ms.float32)) - - @ms.jit - def construct(self, x): - x = x + x - x = x * self.param - x = x * x - return x - -class CellCallSingleCell(nn.Cell): - def __init__(self): - super(CellCallSingleCell, self).__init__() - self.conv = nn.Conv2d(1, 2, kernel_size=2, stride=1, padding=0, weight_init="ones", pad_mode="valid") - self.bn = nn.BatchNorm2d(2, momentum=0.99, eps=0.00001, gamma_init="ones") - self.relu = nn.ReLU() - self.add_mul_mul = AddMulMul() - - def construct(self, x): - x = self.conv(x) - x = self.bn(x) - x = self.add_mul_mul(x) - x = self.relu(x) - return x - -ms.set_context(mode=ms.PYNATIVE_MODE, device_target="CPU") -inputs = ms.Tensor(np.ones([1, 1, 2, 2]).astype(np.float32)) -net = CellCallSingleCell() -out = net(inputs) -print(out) -``` - -```text -[[[[15.99984]] - - [[15.99984]]]] -``` - -### Static Graph Syntax Enhancement - -In the MindSpore static graph mode, users need to follow MindSpore [Static Graph Syntax Support](https://www.mindspore.cn/docs/en/master/note/static_graph_syntax_support.html) when writing programs, and there are constraints on the use of syntax. In dynamic graph mode, Python script code will be executed according to Python syntax, and users can use any Python syntax. It can be seen that the syntax constraints of static and dynamic graphs are different. - -JIT Fallback considers the unification of static and dynamic graphs from the perspective of static graphs. When an unsupported syntax is found during compilation, the syntax is Fallback to the Python interpreter for interpretation execution. Through the JIT Fallback feature, static graphs can support as much dynamic graph syntax as possible, so that static graphs provide a syntax experience close to dynamic graphs, so as to achieve dynamic and static unity. - -In the graph mode scenario, the MindSpore framework will report an error when it encounters unsupported syntax or symbols during graph compilation, mostly in the type inference stage. In the graph compilation stage, the Python source code written by the user is parsed, and then subsequent static analysis, type derivation, optimization and other steps are performed. Therefore, the JIT Fallback feature needs to be pre-detected for unsupported syntax. Common unsupported syntax mainly includes: calling methods of third-party libraries, calling class names to create objects, calling unsupported Python built-in functions, etc. Interpret execution of unsupported syntax Fallback to the Python interpreter. Since the graph mode uses [MindSpore IR (MindIR)](https://www.mindspore.cn/docs/en/master/design/all_scenarios.html#mindspore-ir-mindir), it is necessary to convert the statement executed by the interpretation to the intermediate representation and record the information required by the interpreter. - -The following mainly introduces the static graph syntax supported using the JIT Fallback extension. The default value of the JIT syntax support level option jit_syntax_level is 'LAX', extending the static graph syntax with the ability of JIT Fallback. - -#### Calling the Third-party Libraries - -Complete support for third-party libraries such as NumPy and SciPy. The static graph mode supports many third-party library data types such as np.ndarray and their operation operations, supports obtaining properties and methods that call third-party libraries, and supports interacting with third-party libraries such as NumPy through methods such as Tensor's asnumpy(). In other words, users can call MindSpore's own interface and operator in static graph mode, or directly call the interface of the three-party library, or use them together. - -- Supporting data types of third-party libraries (such as NumPy and SciPy), allowing calling and returning objects of third-party libraries. -- Supporting calling methods of third-party libraries. -- Supporting creating Tensor instances by using the data types of the third-party library NumPy. -- The assignment of subscripts for data types in third-party libraries is not currently supported. - -For more usage, please refer to the [Calling the Third-party Libraries](https://www.mindspore.cn/docs/en/master/note/static_graph_syntax_support.html#calling-the-third-party-libraries) section in [Static Graph Syntax Support](https://www.mindspore.cn/docs/en/master/note/static_graph_syntax_support.html). - -#### Supporting the Use of Custom Classes - -Custom classes that do not use '@jit_class' decorations and do not inherit 'nn. Cell`。 Through the JIT Fallback technical solution, static graph mode allows creating and referencing instances of custom classes, can directly obtain and call properties and methods of custom class instances, and allows modifying properties(Inplace operations). - -For more usage, please refer to the [Supporting the Use of Custom Classes](https://www.mindspore.cn/docs/en/master/note/static_graph_syntax_support.html#supporting-the-use-of-custom-classes) section in [Static Graph Syntax Support](https://www.mindspore.cn/docs/en/master/note/static_graph_syntax_support.html). - -#### Basic Operators Support More Data Types - -In the syntax of graph mode, the following basic operators in the list are overloaded: ['+', '-', '*', '/', '//', '%', '**', '<<', '>>', '&', '|', '^', 'not', '==', '!=', '<', '>', '<=', '>=', 'in', 'not in', 'y=x[0]']. For more details, please refer to [Operators](https://www.mindspore.cn/docs/en/master/note/static_graph_syntax/operators.html). When getting unsupported input type, those operators need to use extended static graph syntax to support, and make the output consistent with the output in the pynative mode. - -For more usage, please refer to the [Basic Operators Support More Data Type](https://www.mindspore.cn/docs/en/master/note/static_graph_syntax_support.html#basic-operators-support-more-data-type) section in [Static Graph Syntax Support](https://www.mindspore.cn/docs/en/master/note/static_graph_syntax_support.html). - -#### Base Type - -Use the JIT Fallback feature to extend support for Python's native data types 'List', 'Dictionary', 'None'. For more usage, please refer to the [Base Type](https://www.mindspore.cn/docs/en/master/note/static_graph_syntax_support.html#base-type) section in [Static Graph Syntax Support](https://www.mindspore.cn/docs/en/master/note/static_graph_syntax_support.html). - -##### Supporting List Inplace Modification Operations - -- Support for getting the original `List` object from a global variable. -- Inplace operations on input `List` objects are not supported. -- Support for in-place modification of some `List` built-in functions. - -##### Supporting the High-Level Usage of Dictionary - -- Supporting Top Graph Return Dictionary. -- Supporting Dictionary Index Value Retrieval and Assignment. - -##### Supporting the Usage of None - -`None` is a special value in Python that represents null and can be assigned to any variable. Functions that do not have a return value statement are considered to return `None`. At the same time, `None` is also supported as the input parameter or return value of the top graph or subgraph. Support `None` as a subscript of a slice as input to `List`, `Tuple`, `Dictionary`. - -#### Built-in Functions Support More Data Types - -Extend the support for built-in functions. Python built-in functions perfectly support more input types, such as third-party library data types. More support for built-in functions can be found in the [Python built-in functions](https://www.mindspore.cn/docs/en/master/note/static_graph_syntax/python_builtin_functions.html) section. - -#### Supporting Control Flow - -In order to improve the support of Python standard syntax, realize dynamic and static unification, and extend the support for more data types in the use of control flow statements. Control flow statements refer to flow control statements such as 'if', 'for', and 'while'. Theoretically, by extending the supported syntax, it is also supported in control flow scenarios. For more usage, please refer to [Supporting Control Flow](https://www.mindspore.cn/docs/en/master/note/static_graph_syntax_support.html#supporting-control-flow) section in [Static Graph Syntax Support](https://www.mindspore.cn/docs/en/master/note/static_graph_syntax_support.html). - -#### Supporting Property Setting and Modification - -More types of inplace operations are supported. The previous version only supported value modification of the Parameter type through the Inplace operator, and in the static graph mode of MindSpore version 2.1, the properties of custom classes, Cell subclasses, and jit_class classes were supported. In addition to supporting changing the properties of class self and global variables, it also supports inplace operations such as extend(), reverse(), insert(), pop() of the List type. For more usage, please refer to the [Supporting Property Setting and Modification](https://www.mindspore.cn/docs/en/master/note/static_graph_syntax_support.html#supporting-property-setting-and-modification) section in [Static Graph Syntax Support](https://www.mindspore.cn/docs/en/master/note/static_graph_syntax_support.html). - -- Set and modify properties of custom class objects and third-party types. -- Make changes to the Cell's self object. -- Set and modify Cell objects and jit_class objects in the static graph. - -#### Supporting Derivation - -The static graph syntax supported by JIT Fallback also supports its use in derivation. For more usage, please refer to the [Supporting Derivation](https://www.mindspore.cn/docs/en/master/note/static_graph_syntax_support.html#supporting-derivation) section in [Static Graph Syntax Support](https://www.mindspore.cn/docs/en/master/note/static_graph_syntax_support.html). - -#### Annotation Type - -For the syntax supported by the runtime extensions, nodes are generated that cannot be derived by type and are called `Any` types. Since the type cannot derive the correct type at compile time, this `Any` will be operated with a default maximum precision 'Float64' to prevent loss of precision. To optimize performance, it is recommended to minimize the generation of `Any` types. When the user knows exactly what type of statement will be generated through the extension, it is recommended to use `Annotation @jit.typing:` to specify the corresponding Python statement type, thereby determining the type of the interpretation node and avoiding the generation of `Any` types. For more usage, please refer to the [Annotation Type](https://www.mindspore.cn/docs/en/master/note/static_graph_syntax_support.html#annotation-type) section in [Static Graph Syntax Support](https://www.mindspore.cn/docs/en/master/note/static_graph_syntax_support.html). - -#### Instructions for Use - -When using the static graph extension support syntax, note the following points: - -1. In order to match the support capability of the dynamic graph. That is, it must be within the scope of dynamic graph syntax, including but not limited to data types. - -2. When extending the static graph syntax, more syntax is supported, but the execution performance may be affected and is not optimal. - -3. When extending the static graph syntax, more syntax is supported, and the ability to import and export cannot be used with MindIR due to use Python. - -4. It is not currently supported that the repeated definition of global variables with the same name across Python files, and these global variables are used in the network. - -### Conversion Technique from Dynamic Graph to Static Graph - -MindSpore provides PIJit, a feature that directly converts a user's dynamic graph code into a static graph without code changes. This feature balances performance and ease of use, removes the cost of switching between static and dynamic modes, and truly unifies static and dynamic modes. It is based on the analysis of Python bytecode, and captures the execution flow of Python graphs. Subgraphs that can be run as static graphs are run as static graphs, and subgraphs that are not supported by Python syntax are run as dynamic graphs, and at the same time, by modifying and adjusting the bytecode to link the static graphs, it achieves the mixed execution of static and dynamic modes. In order to meet the premise of ease of use, improve performance. - -#### PIJit Includes the Following Features - -- 1. Graph Capture: Pre-processing of bytecode, dynamically tracking the execution of the interpretation, recognizing MindSpore accessible graph operations, and providing split graph to ensure the correctness of function (bytecode) functionality. -- 2. Bytecode Support: Currently supports Python 3.7, Python 3.8, Python 3.9 and Python 3.10 version bytecode. -- 3. Graph Optimization: Optimize the bytecode generated in the graph, including branch cropping, bytecode filtering, function bytecode inlining, constant folding and other functions. -- 4. Exception Capture Mechanism: support for with, try-except syntax. -- 5. Support loop processing: implement features such as graph capture and split graph by simulating the operation stack of bytecode. -- 6. UD Analysis: The method of user-def chain analysis of variables solves the problem that some parameter types cannot be used as the return value of static graphs (Function, Bool, None), and reduces the useless parameters, improves the execution efficiency of the graphs, and reduces the copying of data. -- 7. Side effect analysis and processing: to make up for the disadvantage of side effect processing of static graphs. According to different scenarios, collect and record the variables and byte codes that generate side effects, and supplement the processing of side effects outside the static graphs on the basis of guaranteeing the semantics of the program. -- 8. Guard: The Guard records the conditions that need to be met by the inputs for the subgraph/optimization to enter, and checks if the inputs are suitable for the corresponding subgraph optimization. -- 9. Cache:The graph management caches the subgraph/optimization and Guard correspondences. -- 10. Dynamic Shape and Symbolic Shape: Use input_signature to support Dynamic Shape and Symbolic Shape for Tensor/Tensor List/Tensor Tuple as input prompts. Simultaneously supports automatic recognition of Dynamic Shape after multiple runs. -- 11. Compiling by trace: Supports operator and other type derivations during tracking and bytecode analysis processes. -- 12. Automatic mixed precision: Supports the automatic mixed precision capability of the native mindspore.nn.Cell. - -#### Usage - -def jit(fn=None, input_signature=None, hash_args=None, jit_config=None, mode="PIJit"): - -The original Jit function uses mode="PSJit", the new feature PIJit uses mode="PIJit", jit_config passes a dictionary of parameters that can provide some optimization and debugging options. For example: print_after_all can print the bytecode of the graph and split graph information, loop_unrolling can provide loop unrolling function, enable_dynamic_shape apply dynamic shape. - -#### Limitations - -- It is not supported to run a function with decoration @jit(mode=\"PIJit\") in static graph mode, in which case the decoration @jit(mode=\"PIJit\") is considered invalid. -- Calls to functions with decoration @jit(mode=\"PIJit\") inside functions decorated with @jit(mode=\"PIJit\") are not supported, and the decorated @jit(mode=\"PIJit\") is considered invalid. \ No newline at end of file +In the PyNative mode, scripts are executed according to the Python syntax, so in MindSpore, there is no special treatment for the control flow syntax, which is directly expanded and executed according to the Python syntax, and automatic differentiation is performed on the expanded execution operator. For example, for a for loop, the statements in the for loop are continuously executed under PyNative and automatic differentiation is performed on the operators according to the specific number of loops. \ No newline at end of file diff --git a/docs/mindspore/source_en/model_train/program_form/jit.md b/docs/mindspore/source_en/model_train/program_form/jit.md new file mode 100644 index 0000000000..9b2d2d86e4 --- /dev/null +++ b/docs/mindspore/source_en/model_train/program_form/jit.md @@ -0,0 +1,186 @@ +# Dynamic and Static Conversion + +[![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_en/model_train/program_form/jit.md) + +## Overview + +The industry currently supports both dynamic and static graph modes. Dynamic graphs are executed by interpretation, with dynamic syntax affinity and flexible expression, and static graphs are executed by using jit compilation optimization, more inclined to static syntax and more restrictions in syntax. For dynamic and static graph modes, firstly MindSpore unifies the API expression, uses the same API in both modes, secondly, unifies the underlying differential mechanism of dynamic and static graphs. + +## Interconversion of Dynamic and Static Graphs + +In MindSpore, we can switch the execution between using dynamic or static graphs by controlling the mode input parameters. For example: + +```python +ms.set_context(mode=ms.PYNATIVE_MODE) +``` + +Since there are restrictions on Python syntax under static graphs, switching from dynamic to static graphs requires compliance with the syntax restrictions of static graphs in order to execute correctly by using static graphs. For more syntax restrictions for static graphs, refer to [Static Graph Syntax Restrictions](https://www.mindspore.cn/docs/en/master/model_train/program_form/static_graph_syntax/static_graph_syntax_support.html). + +## Combination of Static and Dynamic Graphs + +MindSpore supports mixed execution by using static compilation under dynamic graphs. The function objects that need to be executed with static graphs by using jit modification, and in this way you can achieve mixed execution of dynamic and static graphs. For more use of jit, refer to [jit documentation](https://www.mindspore.cn/tutorials/en/master/beginner/accelerate_with_static_graph.html#decorator-based-startup-method). + +For example: + +```python +import numpy as np +import mindspore as ms +import mindspore.nn as nn + +class AddMulMul(nn.Cell): + def __init__(self): + super(AddMulMul, self).__init__() + self.param = ms.Parameter(ms.Tensor(0.5, ms.float32)) + + @ms.jit + def construct(self, x): + x = x + x + x = x * self.param + x = x * x + return x + +class CellCallSingleCell(nn.Cell): + def __init__(self): + super(CellCallSingleCell, self).__init__() + self.conv = nn.Conv2d(1, 2, kernel_size=2, stride=1, padding=0, weight_init="ones", pad_mode="valid") + self.bn = nn.BatchNorm2d(2, momentum=0.99, eps=0.00001, gamma_init="ones") + self.relu = nn.ReLU() + self.add_mul_mul = AddMulMul() + + def construct(self, x): + x = self.conv(x) + x = self.bn(x) + x = self.add_mul_mul(x) + x = self.relu(x) + return x + +ms.set_context(mode=ms.PYNATIVE_MODE, device_target="CPU") +inputs = ms.Tensor(np.ones([1, 1, 2, 2]).astype(np.float32)) +net = CellCallSingleCell() +out = net(inputs) +print(out) +``` + +```text +[[[[15.99984]] + + [[15.99984]]]] +``` + +## Static Graph Syntax Enhancement + +In the MindSpore static graph mode, users need to follow MindSpore [Static Graph Syntax Support](https://www.mindspore.cn/docs/en/master/model_train/program_form/static_graph_syntax/static_graph_syntax_support.html) when writing programs, and there are constraints on the use of syntax. In dynamic graph mode, Python script code will be executed according to Python syntax, and users can use any Python syntax. It can be seen that the syntax constraints of static and dynamic graphs are different. + +JIT Fallback considers the unification of static and dynamic graphs from the perspective of static graphs. When an unsupported syntax is found during compilation, the syntax is Fallback to the Python interpreter for interpretation execution. Through the JIT Fallback feature, static graphs can support as much dynamic graph syntax as possible, so that static graphs provide a syntax experience close to dynamic graphs, so as to achieve dynamic and static unity. + +In the graph mode scenario, the MindSpore framework will report an error when it encounters unsupported syntax or symbols during graph compilation, mostly in the type inference stage. In the graph compilation stage, the Python source code written by the user is parsed, and then subsequent static analysis, type derivation, optimization and other steps are performed. Therefore, the JIT Fallback feature needs to be pre-detected for unsupported syntax. Common unsupported syntax mainly includes: calling methods of third-party libraries, calling class names to create objects, calling unsupported Python built-in functions, etc. Interpret execution of unsupported syntax Fallback to the Python interpreter. Since the graph mode uses [MindSpore IR (MindIR)](https://www.mindspore.cn/docs/en/master/design/all_scenarios.html#mindspore-ir-mindir), it is necessary to convert the statement executed by the interpretation to the intermediate representation and record the information required by the interpreter. + +The following mainly introduces the static graph syntax supported using the JIT Fallback extension. The default value of the JIT syntax support level option jit_syntax_level is 'LAX', extending the static graph syntax with the ability of JIT Fallback. + +### Calling the Third-party Libraries + +Complete support for third-party libraries such as NumPy and SciPy. The static graph mode supports many third-party library data types such as np.ndarray and their operation operations, supports obtaining properties and methods that call third-party libraries, and supports interacting with third-party libraries such as NumPy through methods such as Tensor's asnumpy(). In other words, users can call MindSpore's own interface and operator in static graph mode, or directly call the interface of the three-party library, or use them together. + +- Supporting data types of third-party libraries (such as NumPy and SciPy), allowing calling and returning objects of third-party libraries. +- Supporting calling methods of third-party libraries. +- Supporting creating Tensor instances by using the data types of the third-party library NumPy. +- The assignment of subscripts for data types in third-party libraries is not currently supported. + +For more usage, please refer to the [Calling the Third-party Libraries](https://www.mindspore.cn/docs/en/master/model_train/program_form/static_graph_syntax/static_graph_syntax_support.html#calling-the-third-party-libraries) section in [Static Graph Syntax Support](https://www.mindspore.cn/docs/en/master/model_train/program_form/static_graph_syntax/static_graph_syntax_support.html). + +### Supporting the Use of Custom Classes + +Custom classes that do not use '@jit_class' decorations and do not inherit 'nn. Cell`. Through the JIT Fallback technical solution, static graph mode allows creating and referencing instances of custom classes, can directly obtain and call properties and methods of custom class instances, and allows modifying properties(Inplace operations). + +For more usage, please refer to the [Supporting the Use of Custom Classes](https://www.mindspore.cn/docs/en/master/model_train/program_form/static_graph_syntax/static_graph_syntax_support.html#supporting-the-use-of-custom-classes) section in [Static Graph Syntax Support](https://www.mindspore.cn/docs/en/master/model_train/program_form/static_graph_syntax/static_graph_syntax_support.html). + +### Basic Operators Support More Data Types + +In the syntax of graph mode, the following basic operators in the list are overloaded: ['+', '-', '*', '/', '//', '%', '**', '<<', '>>', '&', '|', '^', 'not', '==', '!=', '<', '>', '<=', '>=', 'in', 'not in', 'y=x[0]']. For more details, please refer to [Operators](https://www.mindspore.cn/docs/en/master/model_train/program_form/static_graph_syntax/operators.html). When getting unsupported input type, those operators need to use extended static graph syntax to support, and make the output consistent with the output in the pynative mode. + +For more usage, please refer to the [Basic Operators Support More Data Type](https://www.mindspore.cn/docs/en/master/model_train/program_form/static_graph_syntax/static_graph_syntax_support.html#basic-operators-support-more-data-type) section in [Static Graph Syntax Support](https://www.mindspore.cn/docs/en/master/model_train/program_form/static_graph_syntax/static_graph_syntax_support.html). + +### Base Type + +Use the JIT Fallback feature to extend support for Python's native data types 'List', 'Dictionary', 'None'. For more usage, please refer to the [Base Type](https://www.mindspore.cn/docs/en/master/model_train/program_form/static_graph_syntax/static_graph_syntax_support.html#base-type) section in [Static Graph Syntax Support](https://www.mindspore.cn/docs/en/master/model_train/program_form/static_graph_syntax/static_graph_syntax_support.html). + +#### Supporting List Inplace Modification Operations + +- Support for getting the original `List` object from a global variable. +- Inplace operations on input `List` objects are not supported. +- Support for in-place modification of some `List` built-in functions. + +#### Supporting the High-Level Usage of Dictionary + +- Supporting Top Graph Return Dictionary. +- Supporting Dictionary Index Value Retrieval and Assignment. + +#### Supporting the Usage of None + +`None` is a special value in Python that represents null and can be assigned to any variable. Functions that do not have a return value statement are considered to return `None`. At the same time, `None` is also supported as the input parameter or return value of the top graph or subgraph. Support `None` as a subscript of a slice as input to `List`, `Tuple`, `Dictionary`. + +### Built-in Functions Support More Data Types + +Extend the support for built-in functions. Python built-in functions perfectly support more input types, such as third-party library data types. More support for built-in functions can be found in the [Python built-in functions](https://www.mindspore.cn/docs/en/master/model_train/program_form/static_graph_syntax/python_builtin_functions.html) section. + +### Supporting Control Flow + +In order to improve the support of Python standard syntax, realize dynamic and static unification, and extend the support for more data types in the use of control flow statements. Control flow statements refer to flow control statements such as 'if', 'for', and 'while'. Theoretically, by extending the supported syntax, it is also supported in control flow scenarios. For more usage, please refer to [Supporting Control Flow](https://www.mindspore.cn/docs/en/master/model_train/program_form/static_graph_syntax/static_graph_syntax_support.html#supporting-control-flow) section in [Static Graph Syntax Support](https://www.mindspore.cn/docs/en/master/model_train/program_form/static_graph_syntax/static_graph_syntax_support.html). + +### Supporting Property Setting and Modification + +More types of inplace operations are supported. The previous version only supported value modification of the Parameter type through the Inplace operator, and in the static graph mode of MindSpore version 2.1, the properties of custom classes, Cell subclasses, and jit_class classes were supported. In addition to supporting changing the properties of class self and global variables, it also supports inplace operations such as extend(), reverse(), insert(), pop() of the List type. For more usage, please refer to the [Supporting Property Setting and Modification](https://www.mindspore.cn/docs/en/master/model_train/program_form/static_graph_syntax/static_graph_syntax_support.html#supporting-property-setting-and-modification) section in [Static Graph Syntax Support](https://www.mindspore.cn/docs/en/master/model_train/program_form/static_graph_syntax/static_graph_syntax_support.html). + +- Set and modify properties of custom class objects and third-party types. +- Make changes to the Cell's self object. +- Set and modify Cell objects and jit_class objects in the static graph. + +### Supporting Derivation + +The static graph syntax supported by JIT Fallback also supports its use in derivation. For more usage, please refer to the [Supporting Derivation](https://www.mindspore.cn/docs/en/master/model_train/program_form/static_graph_syntax/static_graph_syntax_support.html#supporting-derivation) section in [Static Graph Syntax Support](https://www.mindspore.cn/docs/en/master/model_train/program_form/static_graph_syntax/static_graph_syntax_support.html). + +### Annotation Type + +For the syntax supported by the runtime extensions, nodes are generated that cannot be derived by type and are called `Any` types. Since the type cannot derive the correct type at compile time, this `Any` will be operated with a default maximum precision 'Float64' to prevent loss of precision. To optimize performance, it is recommended to minimize the generation of `Any` types. When the user knows exactly what type of statement will be generated through the extension, it is recommended to use `Annotation @jit.typing:` to specify the corresponding Python statement type, thereby determining the type of the interpretation node and avoiding the generation of `Any` types. For more usage, please refer to the [Annotation Type](https://www.mindspore.cn/docs/en/master/model_train/program_form/static_graph_syntax/static_graph_syntax_support.html#annotation-type) section in [Static Graph Syntax Support](https://www.mindspore.cn/docs/en/master/model_train/program_form/static_graph_syntax/static_graph_syntax_support.html). + +### Instructions for Use + +When using the static graph extension support syntax, note the following points: + +1. In order to match the support capability of the dynamic graph. That is, it must be within the scope of dynamic graph syntax, including but not limited to data types. + +2. When extending the static graph syntax, more syntax is supported, but the execution performance may be affected and is not optimal. + +3. When extending the static graph syntax, more syntax is supported, and the ability to import and export cannot be used with MindIR due to use Python. + +4. It is not currently supported that the repeated definition of global variables with the same name across Python files, and these global variables are used in the network. + +## Conversion Technique from Dynamic Graph to Static Graph + +MindSpore provides PIJit, a feature that directly converts a user's dynamic graph code into a static graph without code changes. This feature balances performance and ease of use, removes the cost of switching between static and dynamic modes, and truly unifies static and dynamic modes. It is based on the analysis of Python bytecode, and captures the execution flow of Python graphs. Subgraphs that can be run as static graphs are run as static graphs, and subgraphs that are not supported by Python syntax are run as dynamic graphs, and at the same time, by modifying and adjusting the bytecode to link the static graphs, it achieves the mixed execution of static and dynamic modes. In order to meet the premise of ease of use, improve performance. + +### PIJit Includes the Following Features + +- 1. Graph Capture: Pre-processing of bytecode, dynamically tracking the execution of the interpretation, recognizing MindSpore accessible graph operations, and providing split graph to ensure the correctness of function (bytecode) functionality. +- 2. Bytecode Support: Currently supports Python 3.7, Python 3.8, Python 3.9 and Python 3.10 version bytecode. +- 3. Graph Optimization: Optimize the bytecode generated in the graph, including branch cropping, bytecode filtering, function bytecode inlining, constant folding and other functions. +- 4. Exception Capture Mechanism: support for with, try-except syntax. +- 5. Support loop processing: implement features such as graph capture and split graph by simulating the operation stack of bytecode. +- 6. UD Analysis: The method of user-def chain analysis of variables solves the problem that some parameter types cannot be used as the return value of static graphs (Function, Bool, None), and reduces the useless parameters, improves the execution efficiency of the graphs, and reduces the copying of data. +- 7. Side effect analysis and processing: to make up for the disadvantage of side effect processing of static graphs. According to different scenarios, collect and record the variables and byte codes that generate side effects, and supplement the processing of side effects outside the static graphs on the basis of guaranteeing the semantics of the program. +- 8. Guard: The Guard records the conditions that need to be met by the inputs for the subgraph/optimization to enter, and checks if the inputs are suitable for the corresponding subgraph optimization. +- 9. Cache:The graph management caches the subgraph/optimization and Guard correspondences. +- 10. Dynamic Shape and Symbolic Shape: Use input_signature to support Dynamic Shape and Symbolic Shape for Tensor/Tensor List/Tensor Tuple as input prompts. Simultaneously supports automatic recognition of Dynamic Shape after multiple runs. +- 11. Compiling by trace: Supports operator and other type derivations during tracking and bytecode analysis processes. +- 12. Automatic mixed precision: Supports the automatic mixed precision capability of the native mindspore.nn.Cell. + +### Usage + +def jit(fn=None, input_signature=None, hash_args=None, jit_config=None, mode="PIJit"): + +The original Jit function uses mode="PSJit", the new feature PIJit uses mode="PIJit", jit_config passes a dictionary of parameters that can provide some optimization and debugging options. For example: print_after_all can print the bytecode of the graph and split graph information, loop_unrolling can provide loop unrolling function, enable_dynamic_shape apply dynamic shape. + +### Limitations + +- It is not supported to run a function with decoration @jit(mode=\"PIJit\") in static graph mode, in which case the decoration @jit(mode=\"PIJit\") is considered invalid. +- Calls to functions with decoration @jit(mode=\"PIJit\") inside functions decorated with @jit(mode=\"PIJit\") are not supported, and the decorated @jit(mode=\"PIJit\") is considered invalid. \ No newline at end of file diff --git a/docs/mindspore/source_en/model_train/program_form/pynative.md b/docs/mindspore/source_en/model_train/program_form/pynative.md new file mode 100644 index 0000000000..bb1a4547c6 --- /dev/null +++ b/docs/mindspore/source_en/model_train/program_form/pynative.md @@ -0,0 +1,41 @@ +# Dynamic Graph Programming + +[![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_en/model_train/program_form/pynative.md) + +In MindSpore, dynamic graph mode is also known as PyNative mode, which can be set to dynamic graph mode by `set_context(mode=PYNATIVE_MODE)`. In script development and network flow debugging, it is recommended to use dynamic graph mode for debugging, which supports the execution of single operators, common functions and networks, and separate gradient solving operations. + +In PyNative mode, users can use the full Python API. In addition, for using the API provided by MindSpore, the framework will execute the operations of the operator API on the corresponding hardware platform according to the hardware platform (Ascend, GPU, CPU) selected by the user and return the corresponding results. The overall execution process of the framework is as follows: + +![process](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/docs/mindspore/source_zh_cn/design/images/framework.png) + +Through the front-end Python API, call to the framework layer, and finally to the corresponding hardware devices to perform calculations. For example, to complete an addition + +```python +import numpy as np +import mindspore as ms +import mindspore.ops as ops + +ms.set_context(mode=ms.PYNATIVE_MODE, device_target="CPU") +x = ms.Tensor(np.ones([1, 3, 3, 4]).astype(np.float32)) +y = ms.Tensor(np.ones([1, 3, 3, 4]).astype(np.float32)) +output = ops.add(x, y) +print(output.asnumpy()) +``` + +```text +[[[[2. 2. 2. 2.] + [2. 2. 2. 2.] + [2. 2. 2. 2.]] + + [[2. 2. 2. 2.] + [2. 2. 2. 2.] + [2. 2. 2. 2.]] + + [[2. 2. 2. 2.] + [2. 2. 2. 2.] + [2. 2. 2. 2.]]]] +``` + +In this example, when the Python interface ops.add(x, y) is called, the Python interface call is called to the C++ layer of the framework via Pybind11, and converted to C++ call. Then the framework will select the corresponding hardware device according to the device_target set by the users, and execute the add operation on that hardware device. + +From the above principle, we can see that in PyNative mode, Python script code will be executed according to Python syntax, and the execution process involves MindSpore's API, which will be accelerated by executing on different hardware according to user settings. Therefore, in PyNative mode, users can use Python syntax and debugging methods at will, for example, you can use common IDEs such as PyCharm and VS Code to debug code. \ No newline at end of file diff --git a/docs/mindspore/source_en/model_train/program_form/static_graph.rst b/docs/mindspore/source_en/model_train/program_form/static_graph.rst new file mode 100644 index 0000000000..5acfcb36b7 --- /dev/null +++ b/docs/mindspore/source_en/model_train/program_form/static_graph.rst @@ -0,0 +1,2159 @@ +Static Graph Programming +========================= + +.. image:: https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_notebook.svg + :target: https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/master/zh_cn/model_train/program_form/static_graph_syntax/mindspore_static_graph_syntax_support.ipynb +.. image:: https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_download_code.svg + :target: https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/master/zh_cn/model_train/program_form/static_graph_syntax/mindspore_static_graph_syntax_support.py +.. image:: https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg + :target: https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_zh_cn/model_train/program_form/static_graph_syntax/static_graph_syntax_support.ipynb + :alt: View Source On Gitee + +.. toctree:: + :maxdepth: 1 + :hidden: + + static_graph_syntax/operators + static_graph_syntax/statements + static_graph_syntax/python_builtin_functions + static_graph_syntax/static_graph_expert_programming.ipynb + +Overview +-------- + +In graph mode, Python code is not executed by the Python interpreter.Instead, the code is compiled into a static computation graph, and then the static computation graph is executed. + +In static graph mode, MindSpore converts Python source code into +Intermediate Representation IR by means of source code conversion and +optimizes IR graphs on this basis, and finally executes the optimized +graphs on hardware devices. MindSpore uses a functional IR based on +graph representations, called MindIR. See `middle representation MindIR `_ for details . + +MindSpore static graph execution process actually consists of two steps, +corresponding to the Define and Run phases of the static graph, but in +practice, the user will not perceive these two phases when the +instantiated Cell object is called. MindSpore encapsulates both phases +in the Cell ``__call__`` method, so the actual calling process is: + +``model(inputs) = model.compile(inputs) + model.construct(inputs)``, +where ``model`` is the instantiated Cell object. + +There are two ways to use the Graph mode. The first way is to call the +``@jit`` decorator to modify a function or a class member method, and +then the decorated function or method will be compiled into a static +computation graph. For details about how to use ``jit``, click `jit API document +`_. +The second way is to set ``ms.set_context(mode=ms.GRAPH_MODE)``, then +write the code in the ``construct`` function of the ``Cell`` so that the +code in the ``construct`` function will be compiled into a static +computation graph. For details about the definition of ``Cell``, click +`Cell API document `_. + +Due to syntax parsing restrictions, the supported data types, syntax, +and related operations during graph building are not completely +consistent with the Python syntax. As a result, some usage is +restricted. Borrowing the traditional JIT compilation idea, considers +the unification of static and dynamic graphs from the perspective of +graph mode and extends the syntax capabilities of graph patterns. The +static graph provides a syntax experience close to that of the dynamic +graph, so as to realize the unity of dynamic and static. In order to +facilitate users to choose whether to extend the static graph syntax, +the JIT syntax support level option 'jit_syntax_level' is provided, and +its value must be in the range of [STRICT,LAX], and selecting 'STRICT' +is considered to use the basic syntax and do not extend the static graph +syntax. The default value is 'LAX', please refer to the `Extended +Syntaxes (LAX level) <#extended-syntaxes-lax-level>`_ section of this +article for more information. All backends are supported at all levels. + +- STRICT: Only basic syntaxes is supported, and execution performance + is optimal. Can be used for MindIR load and export. +- LAX: Supporting more complex syntaxes, compatible with all Python + syntax as much as possible. Cannot be used for MindIR load and export + due to some syntax that may not be able to be exported. + +The following describes the data types, syntax, and related operations +supported during static graph building. These rules apply only to graph +mode. + +Basic Syntaxes (STRICT Level) +----------------------------- + +Constants and Variables Within Static Graphs +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +In static graphs, constants and variables are an important concept for +understanding static graph syntax, and many syntaxes support different +methods and degrees in the case of constant input and variable input. +Therefore, before introducing the specific syntax supported by static +graphs, this section first explains the concepts of constants and +variables in static graphs. + +In static graph mode, the operation of a program is divided into +compilation period and execution period. During compilation, the program +is compiled into an intermediate representation graph, and the program +does not actually execute, but statically parses the intermediate +representation through abstract deduction. This makes it impossible to +guarantee that we will get the values of all intermediate representation +nodes at compile time. Constants and variables are distinguished by +their true values in the compiler. + +- Constant: The amount of value that can be obtained during + compilation. +- Variable: The amount of value that cannot be obtained during + compilation. + +Constants Generate Scenes +^^^^^^^^^^^^^^^^^^^^^^^^^ + +- Scalars, lists, and tuples entered as graph mode are constants + (without using the mutable interface). For example: + + .. code:: python + + from mindspore import Tensor, jit + + a = 1 + b = [Tensor([1]), Tensor([2])] + c = ["a", "b", "c"] + + @jit + def foo(a, b, c): + return a, b, c + + In the above code, enter ``a``, ``b``, ``c`` are constants. + +- The result of the constant operation is constant. For example: + + .. code:: python + + from mindspore import jit, Tensor + + @jit + def foo(): + a = 1 + b = "2" + c = Tensor([1, 2, 3]) + return a, b, c + + In the above code, enter ``a``, ``b``, ``c`` are constants. + +- Constant operations obtain a constant result. For example: + + .. code:: python + + from mindspore import jit, Tensor + + @jit + def foo(): + a = Tensor([1, 2, 3]) + b = Tensor([1, 1, 1]) + c = a + b + return c + + In the above code, ``a`` and ``b`` are constants of Tensor generated + in the graph mode, so the result of their calculation is also + constant. However, if one of them is a variable, its return value + will also be a variable. + +Variables Generate Scenes +^^^^^^^^^^^^^^^^^^^^^^^^^ + +- The return value of all mutable interfaces is a variable (whether + mutable is used outside the graph or inside the graph). For example: + + .. code:: python + + from mindspore import Tensor, jit + from mindspore import mutable + + a = mutable([Tensor([1]), Tensor([2])]) + + @jit + def foo(a): + b = mutable(Tensor([3])) + c = mutable((Tensor([1]), Tensor([2]))) + return a, b, c + + In the above code, ``a`` is generated by calling the mutable + interface outside the graph, ``b`` and ``c`` are generated by calling + the mutable interface inside the graph, and ``a``, ``b``, and ``c`` + are variables. + +- Tensors that are inputs to static graphs are variables. For example: + + .. code:: python + + from mindspore import Tensor, jit + + a = Tensor([1]) + b = (Tensor([1]), Tensor([2])) + + @jit + def foo(a, b): + return a, b + + In the above code, ``a`` is the Tensor input as the graph pattern, so + it is a variable. But ``b`` is a tuple that is input to the graph + schema, not a Tensor type, and even if its internal elements are + Tensor, ``b`` is a constant. + +- What is calculated by variables is the variable + + If a quantity is the output of an operator, then it is in most cases + constant. For example: + + .. code:: python + + from mindspore import Tensor, jit, ops + + a = Tensor([1]) + b = Tensor([2]) + + @jit + def foo(a, b): + c = a + b + return c + + In this case , ``c`` is the result of calculations of ``a`` and ``b`` + , and the inputs ``a`` and ``b`` used for the calculation are + variables , so ``c`` is also a variable. + +Data Types +~~~~~~~~~~ + +Built-in Python Data Types +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Currently, the following built-in ``Python`` data types are supported: +``Number``, ``String``, ``List``, ``Tuple``, and ``Dictionary``. + +Number +'''''' + +Supporting ``int``, ``float``, and ``bool``, but does not support +``complex`` numbers. + +``Number`` can be defined on the network. That is, the syntax ``y = 1``, +``y = 1.2``, and ``y = True`` are supported. + +When the data is a constant, the value of the data can be achieved at +compile time, the forcible conversion to ``Number`` is supported in the +network. The syntax ``y = int(x)``, ``y = float(x)``, and +``y = bool(x)`` are supported. When the data is a variable, i.e., you +can get the value only at runtime. It also supports data type conversion +using built-in functions `Python Built-in Functions `_ such as int(), float() and +bool(). For example: + +.. code:: python + + from mindspore import Tensor, jit + + @jit + def foo(x): + out1 = int(11.1) + out2 = int(Tensor([10])) + out3 = int(x.asnumpy()) + return out1, out2, out3 + + res = foo(Tensor(2)) + print("res[0]:", res[0]) + print("res[1]:", res[1]) + print("res[2]:", res[2]) + +The results are as follows: + +.. code:: text + + res[0]: 11 + res[1]: 10 + res[2]: 2 + +Supporting returning Number. For example: + +.. code:: python + + import mindspore as ms + + @ms.jit + def test_return_scalar(x, y): + return x + y + + res = test_return_scalar(ms.mutable(1), ms.mutable(2)) + print(res) + +The results are as follows: + +.. code:: text + + 3 + +String +'''''' + +``String`` can be constructed on the network, i.e., support for using +quotes (``'`` or ``"``) to create strings such as ``x = 'abcd'`` or +``y = "efgh"``. Convert constants to strings by means of ``str()``. +Support string concatenation, truncation, and the use of membership +operators (``in`` or ``not in``) to determine whether a string contains +the specified character. Support for formatting string output by +inserting a value into a string with the string format ``%s``. Support +for using the format string function ``str.format()`` in constant +scenarios. + +For example: + +.. code:: python + + from mindspore import jit + + @jit + def foo(): + var1 = 'Hello!' + var2 = "MindSpore" + var3 = str(123) + var4 = "{} is {}".format("string", var3) + return var1[0], var2[4:9], var1 + var2, var2 * 2, "H" in var1, "My name is %s!" % var2, var4 + + res = foo() + print("res:", res) + +The results are as follows: + +.. code:: text + + res: ('H', 'Spore', 'Hello!MindSpore', 'MindSporeMindSpore', True, 'My name is MindSpore!', 'string is 123') + +List +'''' + +When 'JIT_SYNTAX_LEVEL' is set to 'LAX', static graph mode can support +the inplace operation of some 'List' objects, see `Supporting List +Inplace Modification +Operations `_. + +The basic usage scenarios of 'List' are as follows: + +- The graph mode supports creating ``Lists`` in graph. + + Support creating ``List`` objects within graph mode, and the elements + of the ``List`` objects can contain any of the types supported by the + graph mode, as well as multiple levels of nesting. For example: + + .. code:: python + + import numpy as np + import mindspore as ms + + @ms.jit + def generate_list(): + a = [1, 2, 3, 4] + b = ["1", "2", "a"] + c = [ms.Tensor([1]), ms.Tensor([2])] + d = [a, b, c, (4, 5)] + return d + + The above sample code, all ``List`` objects can be created normally. + +- The graph mode supports returning ``List`` + + Before MindSpore version 2.0, ``List`` is converted to ``Tuple`` when + the graph mode returns a ``List`` object. In MindSpore version 2.0, + ``List`` objects can be returned. For example: + + .. code:: python + + import mindspore as ms + + @ms.jit + def list_func(): + a = [1, 2, 3, 4] + return a + + output = list_func() # output: [1, 2, 3, 4] + + In the same way that a ``List`` is created within a graph mode, the + graph mode returns a ``List`` object that can include any of the + types supported by the graph mode, as well as multiple levels of + nesting. + +- The graph mode supports obtaining ``List`` objects from global + variables + + .. code:: python + + import mindspore as ms + + global_list = [1, 2, 3, 4] + + @ms.jit + def list_func(): + global_list.reverse() + return global_list + + output = list_func() # output: [4, 3, 2, 1] + + It should be noted that the list returned in the following pattern in + the basic scenario is not the same object as the list of global + variables, and when 'JIT_SYNTAX_LEVEL' is set to 'LAX', the returned + object and the global object are unified objects. + +- Graph mode supports ``List`` as input + + The graph mode supports ``List`` as input to static graphs. The + elements of the ``List`` object used as input must be of an input + type supported by the graph mode, which also supports multiple levels + of nesting. + + .. code:: python + + import mindspore as ms + + list_input = [1, 2, 3, 4] + + @ms.jit + def list_func(x): + return x + + output = list_func(list_input) # output: [1, 2, 3, 4] + + It should be noted that when 'List' is input as a static graph, it is + always treated as a constant, regardless of the type of element + inside it. + +- Graph mode supports built-in methods for List + + The 'List' built-in method is described in detail below: + + - List Index Value + + Basic syntax: ``element = list_object[index]``. + + Basic semantics: Extract the element in the 'List' object in the + 'index' bit ('index' starts at 0). Supporting multi-level index + values. + + Index value 'index' supported types include 'int', 'Tensor', and + 'slice'. Among them, inputs of type 'int' and 'Tensor' can support + constants and variables, and 'slice' internal data must be + constants that can be determined at compile time. + + Examples are as follows: + + .. code:: python + + import mindspore as ms + @ms.jit() + def list_getitem_func(): + x = [[1, 2], 3, 4] + a = x[0] + b = x[0][ms.Tensor([1])] + c = x[1:3:1] + return a, b, c + + a, b, c = list_getitem_func() + print('a:{}'.format(a)) + print('b:{}'.format(b)) + print('c:{}'.format(c)) + + The results are as follows: + + .. code:: text + + a:[1, 2] + b:2 + c:[3, 4] + + - List index assignment + + Basic syntax: ``list_object[index] = target_element``. + + Basic semantics: Assign the element in the 'List' object at bit + 'index' to 'target_element' ('index' starts at 0). Support for + multi-tier index assignment. + + Index value 'index' supported types include 'int', 'Tensor', and + 'slice'. Among them, inputs of type 'int' and 'Tensor' can support + constants and variables, and the internal data of 'slice' must be + constant that can be determined at compile time. + + The index assignment object 'target_element' supports all data + types supported by graph modes. + + Currently, the 'List' index assignment does not support the + inplace operation, and a new object will be generated after the + index is assigned. This operation will support the inplace + operation in the future. + + Examples are as follows: + + .. code:: python + + import mindspore as ms + + @ms.jit() + def test_setitem_func(): + x = [[0, 1], 2, 3, 4] + x[1] = 10 + x[2] = "ok" + x[3] = (1, 2, 3) + x[0][1] = 88 + return x + + output = test_setitem_func() + print('output:{}'.format(output)) + + The results are as follows: + + .. code:: text + + output:[[0, 88], 10, 'ok', (1, 2, 3)] + + - List.append + + Basic syntax: ``list_object.append(target_element)``. + + Basic semantics: Append the element 'target_element' to the last + list_object' of the 'List' object. + + Currently, 'List.append' does not support the inplace operation, + and a new object will be generated after index assignment. This + operation will support the inplace operation in the future. + + Examples are as follows: + + .. code:: python + + import mindspore as ms + + @ms.jit() + def test_list(): + x = [1, 2, 3] + x.append(4) + return x + + x = test_list() + print('x:{}'.format(x)) + + The results are as follows: + + .. code:: text + + x:[1, 2, 3, 4] + + - List.clear + + Basic syntax: ``list_object.clear()``. + + Base semantics: Empty the elements contained in the 'List' object + 'list_object'. + + Currently, 'List.clear' does not support inplace, and a new object + will be generated after index assignment. This operation will + support inplace in the future. + + Examples are as follows: + + .. code:: python + + import mindspore as ms + + @ms.jit() + def test_list_clear(): + x = [1, 3, 4] + x.clear() + return x + + x = test_list_clear() + print('x:{}'.format(x)) + + The results are as follows: + + .. code:: text + + x:[] + + - List.extend + + Basic syntax: ``list_object.extend(target)``. + + Basic semantics: Insert all elements inside the 'target' to the + end of the 'List' object 'list_object'. + + The supported types for 'target' are 'Tuple', 'List', and + 'Tensor'. Among them, if the 'target' type is 'Tensor', the + 'Tensor' will be converted to 'List' before inserting it. + + Examples are as follows: + + .. code:: python + + import mindspore as ms + + @ms.jit() + def test_list_extend(): + x1 = [1, 2, 3] + x1.extend((4, "a")) + x2 = [1, 2, 3] + x2.extend(ms.Tensor([4, 5])) + return x1, x2 + + output1, output2 = test_list_extend() + print('output1:{}'.format(output1)) + print('output2:{}'.format(output2)) + + The results are as follows: + + .. code:: text + + output1:[1, 2, 3, 4, 'a'] + output2:[1, 2, 3, Tensor(shape=[1], dtype=Int64, value= [4]), Tensor(shape=[1], dtype=Int64, value= [5])] + + - List.pop + + Basic syntax: ``pop_element = list_object.pop(index=-1)``. + + Basic semantics: Remove the 'index' element of the 'List' object + 'list_object' from the 'list_object' and return the element. + + The 'index' requires that it must be a constant 'int', and when + 'list_object' has a length of 'list_obj_size', 'index' has a value + range of '[-list_obj_size,list_obj_size-1]'. 'index' is a negative + number representing the number of digits from back to front. When + no 'index' is entered, the default value is -1, i.e. the last + element is removed. + + .. code:: python + + import mindspore as ms + + @ms.jit() + def test_list_pop(): + x = [1, 2, 3] + b = x.pop() + return b, x + + pop_element, res_list = test_list_pop() + print('pop_element:{}'.format(pop_element)) + print('res_list:{}'.format(res_list)) + + The results are as follows: + + .. code:: text + + pop_element:3 + res_list:[1, 2] + + - List.reverse + + Basic syntax: ``list_object.reverse()``. + + Basic semantics: Reverse the order of the elements of the 'List' + object 'list_object'. + + Examples are as follows: + + .. code:: python + + import mindspore as ms + + @ms.jit() + def test_list_reverse(): + x = [1, 2, 3] + x.reverse() + return x + + output = test_list_reverse() + print('output:{}'.format(output)) + + The results are as follows: + + .. code:: text + + output1:[3, 2, 1] + + - List.insert + + Basic syntax: ``list_object.insert(index, target_obj)``. + + Basic semantics: insert 'target_obj' into the 'index' bit of + 'list_object'. + + The 'index' requirement must be a constant 'int'. If the length of + 'list_object' is 'list_obj_size'. When 'index < -list_obj_size', + insert the first place in 'List'. When 'index >= list_obj_size', + insert at the end of 'List'. A negative 'index' represents the + number of digits from back to front. + + Examples are as follows: + + .. code:: python + + import mindspore as ms + + @ms.jit() + def test_list_insert(): + x = [1, 2, 3] + x.insert(3, 4) + return x + + output = test_list_insert() + print('output:{}'.format(output)) + + The results are as follows: + + .. code:: text + + output:[1, 2, 3, 4] + +Tuple +''''' + +``Tuple`` can be constructed on the network, that is, the syntax +``y = (1, 2, 3)`` is supported. The elements of the tuple ``Tuple`` +cannot be modified, but indexed access to elements in the tuple +``Tuple`` is supported, and concatenated combinations of tuples are +supported. + +- Supported index values + + Support accessing elements in the tuple ``Tuple`` using square + brackets plus subscripted indexes. The index value can be ``int``, + ``slice``, ``Tensor``, and multi-level index value. That is, the + syntax ``data = tuple_x[index0][index1]...`` is supported. + + Restrictions on the index value ``Tensor`` are as follows: + + - ``Tuple`` stores ``Cell``. Each ``Cell`` must be defined before a + tuple is defined. The number of input parameters, input parameter + type, and input parameter ``shape`` of each ``Cell`` must be the + same. The number of outputs of each ``Cell`` must be the same. The + output type must be the same as the output ``shape``. + + - The index ``Tensor`` is a scalar ``Tensor`` whose ``dtype`` is + ``int32``. The value range is ``[-tuple_len, tuple_len)``, and + negative index is not supported in ``Ascend`` backend. + + - ``CPU``, ``GPU`` and ``Ascend`` backend is supported. + + An example of the ``int`` and ``slice`` indexes is as follows: + + .. code:: python + + import numpy as np + import mindspore as ms + + t = ms.Tensor(np.array([1, 2, 3])) + + @ms.jit() + def test_index(): + x = (1, (2, 3, 4), 3, 4, t) + y = x[1][1] + z = x[4] + m = x[1:4] + n = x[-4] + return y, z, m, n + + y, z, m, n = test_index() + print('y:{}'.format(y)) + print('z:{}'.format(z)) + print('m:{}'.format(m)) + print('n:{}'.format(n)) + + The results are as follows: + + .. code:: text + + y:3 + z:[1 2 3] + m:((2, 3, 4), 3, 4) + n:(2, 3, 4) + + An example of the ``Tensor`` index is as follows: + + .. code:: python + + import mindspore as ms + from mindspore import nn, set_context + + set_context(mode=ms.GRAPH_MODE) + + class Net(nn.Cell): + def __init__(self): + super(Net, self).__init__() + self.relu = nn.ReLU() + self.softmax = nn.Softmax() + self.layers = (self.relu, self.softmax) + + def construct(self, x, index): + ret = self.layers[index](x) + return ret + + x = ms.Tensor([-1.0], ms.float32) + + net = Net() + ret = net(x, 0) + print('ret:{}'.format(ret)) + + The results are as follows: + + .. code:: text + + ret:[0.] + +- Support connection combinations + + Similar to the string ``String``, tuples support combining using + ``+`` and ``*`` to get a new tuple ``Tuple``, for example: + + .. code:: python + + import mindspore as ms + + @ms.jit() + def test_index(): + x = (1, 2, 3) + y = (4, 5, 6) + return x + y, x * 2 + + out1, out2 = test_index() + print('out1:{}'.format(out1)) + print('out2:{}'.format(out2)) + + The results are as follows: + + .. code:: text + + out1:(1, 2, 3, 4, 5, 6) + out2:(1, 2, 3, 1, 2, 3) + +Dictionary +'''''''''' + +``Dictionary`` can be constructed on the network. Each key value +``key:value`` is separated by a colon ``:``, and each key value pair is +separated by a comma ``,``. The entire dictionary contains the key-value +pairs using curly braces ``{}``. That is, the syntax +``y = {"a": 1, "b": 2}`` is supported. + +The ``key`` is unique, and if there are multiple identical ``keys`` in +the dictionary, the duplicate ``keys`` are finalized with the last one +and the value ``value`` can be non-unique. The key ``key`` needs to be +guaranteed to be immutable. Currently, the ``key`` can be ``String``, +``Number``, constant ``Tensor``, or ``Tuple`` that contains these types. +The ``value`` can be ``Number``, ``Tuple``, ``Tensor``, ``List`` or +``Dictionary``. + +- Supported APIs + + ``keys``: extracts all ``key`` values from ``dict`` to form ``Tuple`` + and return it. + + ``values``: extracts all ``value`` values from ``dict`` to form + ``Tuple`` and return it. + + ``items``: extracts ``Tuple`` composed of each pair of ``value`` + values and ``key`` values in ``dict`` to form ``List`` and return it. + + ``get``: ``dict.get(key[, value])`` returns the ``value`` value + corresponding to the specified ``key``, if the specified ``key`` does + not exist, the default value ``None`` or the set default value + ``value`` is returned . + + ``clear``: removes all elements in ``dict``. + + ``has_key``: ``dict.has_key(key)`` determines whether the specified + ``key`` exists in ``dict``. + + ``update``: ``dict1.update(dict2)`` updates the elements in ``dict2`` + to ``dict1``. + + ``fromkeys``: ``dict.fromkeys(seq([, value]))`` is used to create a + new ``Dictionary``, using the elements in the sequence ``seq`` as the + ``key`` of the ``Dictionary``, and the ``value`` is initial value + corresponding to all ``key``. + + The example is as follows, where the 'x' and 'new_dict' in the return + value are a 'Dictionary', and the support is extended under the JIT + syntax support level option LAX in graph mode, for more advanced use + of Dictionary, please refer to the `Supporting the high-level usage + of Dictionary <#supporting-the-high-level-usage-of-dictionary>`_ + section of this article. + + .. code:: python + + import mindspore as ms + import numpy as np + + x = {"a": ms.Tensor(np.array([1, 2, 3])), "b": ms.Tensor(np.array([4, 5, 6])), "c": ms.Tensor(np.array([7, 8, 9]))} + + @ms.jit() + def test_dict(): + x_keys = x.keys() + x_values = x.values() + x_items = x.items() + value_a = x.get("a") + check_key = x.has_key("a") + y = {"a": ms.Tensor(np.array([0, 0, 0]))} + x.update(y) + new_dict = x.fromkeys("abcd", 123) + return x_keys, x_values, x_items, value_a, check_key, x, new_dict + + x_keys, x_values, x_items, value_a, check_key, new_x, new_dict = test_dict() + print('x_keys:{}'.format(x_keys)) + print('x_values:{}'.format(x_values)) + print('x_items:{}'.format(x_items)) + print('value_a:{}'.format(value_a)) + print('check_key:{}'.format(check_key)) + print('new_x:{}'.format(new_x)) + print('new_dict:{}'.format(new_dict)) + + The results are as follows: + + .. code:: text + + x_keys:('a', 'b', 'c') + x_values:(Tensor(shape=[3], dtype=Int64, value= [1, 2, 3]), Tensor(shape=[3], dtype=Int64, value= [4, 5, 6]), Tensor(shape=[3], dtype=Int64, value= [7, 8, 9])) + x_items:[('a', Tensor(shape=[3], dtype=Int64, value= [1, 2, 3])), ('b', Tensor(shape=[3], dtype=Int64, value= [4, 5, 6])), ('c', Tensor(shape=[3], dtype=Int64, value= [7, 8, 9]))] + value_a:[1 2 3] + check_key:True + new_x:{'a': Tensor(shape=[3], dtype=Int64, value= [0, 0, 0]), 'b': Tensor(shape=[3], dtype=Int64, value= [4, 5, 6]), 'c': Tensor(shape=[3], dtype=Int64, value= [7, 8, 9])} + new_dict:{'a': 123, 'b': 123, 'c': 123, 'd': 123} + +MindSpore User-defined Data Types +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Currently, MindSpore supports the following user-defined data types: +``Tensor``, ``Primitive``, and ``Cell``. + +Tensor +'''''' + +For details of ``Tensor``, click `Tensor API +document `_. + +Supporting creating and using Tensor. The ways to create a ``Tensor`` +include using `tensor function interface `_ +and using the class 'ms.Tensor' interface. It is recommended to use the +former because users can specify the required dtype. The code case is as +follows. + +.. code:: python + + import mindspore as ms + import mindspore.nn as nn + + class Net(nn.Cell): + def __init__(self): + super(Net, self).__init__() + + @ms.jit + def construct(self, x): + return ms.tensor(x.asnumpy(), dtype=ms.float32) + + ms.set_context(mode=ms.GRAPH_MODE) + net = Net() + x = ms.Tensor(1, dtype=ms.int32) + print(net(x)) + +The results are as follows: + +.. code:: text + + 1.0 + +Primitive +''''''''' + +Currently, ``Primitive`` and its subclass instances can be constructed +in construct. + +However, during call, the parameter can be specified only in position +parameter mode, and cannot be specified in the key-value pair mode. + +For example: + +.. code:: python + + import mindspore as ms + from mindspore import nn, ops, Tensor, set_context + import numpy as np + + set_context(mode=ms.GRAPH_MODE) + + class Net(nn.Cell): + def __init__(self): + super().__init__() + + def construct(self, x): + reduce_sum = ops.ReduceSum(True) #`Primitive` and its subclass instances can be constructed in construct. + ret = reduce_sum(x, axis=2) + return ret + + x = Tensor(np.random.randn(3, 4, 5, 6).astype(np.float32)) + net = Net() + ret = net(x) + print('ret.shape:{}'.format(ret.shape)) + +In the network defined above, the parameters of reduce_sum(x, axis=2) +cannot be specified in the key-value pair mode. The parameter can be +specified only in position parameter mode, that is, reduce_sum(x, 2). + +The error is reported as follows: + +.. code:: text + + ValueError: For 'ReduceSum', the second input type should be tensor or scalar, but got invalid abstract type:AbstractKeywordArg. + +Currently, the attributes and APIs related to ``Primitive`` and its +subclasses cannot be called on the network. + +For details about the defined ``Primitive``, click `Primitive API +document `_. + +Cell +'''' + +Currently, ``Cell`` and its subclass instances can be constructed on the +network. That is, the syntax ``cell = Cell(args...)`` is supported. + +However, during call, the parameter can be specified only in position +parameter mode, and cannot be specified in the key-value pair mode. That +is, the syntax ``cell = Cell(arg_name=value)`` is not supported. + +Currently, the attributes and APIs related to ``Cell`` and its +subclasses cannot be called on the network unless they are called +through ``self`` in ``construct`` of ``Cell``. + +For details about the definition of ``Cell``, click `Cell API +document `_. + +Parameter +''''''''' + +``Parameter`` is a variable tensor, indicating the parameters that need +to be updated during network training. + +For details about the definition of ``Parameter``, click `Parameter API +document `_. + +Operators +~~~~~~~~~ + +Arithmetic operators and assignment operators support the ``Number`` and +``Tensor`` operations, as well as the ``Tensor`` operations of different +``dtype``. For more details, please refer to +`Operators `_ + +Primaries +~~~~~~~~~ + +Primaries represent the most tightly bound operations of the language. + +Attribute References and Attribute Modification +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +An attribute reference is a primary followed by a period and a name. + +Using attribute references as l-values in Cell instances of MindSpore +requires the following requirements: + +- The modified attribute belongs to this ``cell`` object, i.e. it must + be ``self.xxx``. +- The attribute is initialized in Cell's '**init**' function and is of + type Parameter. + +When the JIT syntax support level option is 'LAX', can support attribute +modification in more situations, see `Support Attribute Setting and +Modification <#supporting-property-setting-and-modification>`_. + +Examples are as follows: + +.. code:: python + + import mindspore as ms + from mindspore import nn, set_context + + set_context(mode=ms.GRAPH_MODE) + + class Net(nn.Cell): + def __init__(self): + super().__init__() + self.weight = ms.Parameter(ms.Tensor(3, ms.float32), name="w") + self.m = 2 + + def construct(self, x, y): + self.weight = x # The conditions are met, they can be modified + # self.m = 3 # self.m is not of type Parameter and modification is prohibited + # y.weight = x # y is not self, modification is prohibited + return x + + net = Net() + ret = net(1, 2) + print('ret:{}'.format(ret)) + +The results are as follows: + +.. code:: text + + ret:1 + +Index Value +^^^^^^^^^^^ + +Index value of a sequence ``Tuple``, ``List``, ``Dictionary``, +``Tensor`` which called subscription in Python. + +Index value of ``Tuple`` refers to chapter `Tuple <#tuple>`_ of this +page. + +Index value of ``List`` refers to chapter `List <#list>`_ of this page. + +Index value of ``Dictionary`` refers to chapter +`Dictionary <#dictionary>`_ of this page. + +Index value of ``Tensor`` refers to `Tensor index value +document `_. + +Calls +^^^^^ + +A call calls a callable object (e.g., ``Cell`` or ``Primitive``) with a +possibly empty series of arguments. + +For example: + +.. code:: python + + import mindspore as ms + from mindspore import nn, ops, set_context + import numpy as np + + set_context(mode=ms.GRAPH_MODE) + + class Net(nn.Cell): + def __init__(self): + super().__init__() + self.matmul = ops.MatMul() + + def construct(self, x, y): + out = self.matmul(x, y) # A call of Primitive + return out + + x = ms.Tensor(np.ones(shape=[1, 3]), ms.float32) + y = ms.Tensor(np.ones(shape=[3, 4]), ms.float32) + net = Net() + ret = net(x, y) + print('ret:{}'.format(ret)) + +The results are as follows: + +.. code:: text + + ret:[[3. 3. 3. 3.]] + +Statements +~~~~~~~~~~ + +Currently supported Python statements include raise statement, assert +statement, pass statement, return statement, break statement, continue +statement, if statement, for statement, while statement, with statement, +list comprehension, generator expression and function definition +statement. For more details, please refer to +`Statements `_ + +Python Built-in Functions +~~~~~~~~~~~~~~~~~~~~~~~~~ + +Currently supported Python built-in functions include ``int``, +``float``, ``bool``, ``str``, ``list``, ``tuple``, ``getattr``, +``hasattr``, ``len``, ``isinstance``, ``all``, ``any``, ``round``, +``max``, ``min`` , ``sum``, ``abs``, ``partial``, ``map``, ``range``, +``enumerate``, ``super``, ``pow``, ``filter``. The use of built-in +functions in graph mode is similar to the corresponding Python built-in +functions. For more details, please refer to `Python Built-in Functions `_. + +Network Definition +~~~~~~~~~~~~~~~~~~ + +Network Input parameters +^^^^^^^^^^^^^^^^^^^^^^^^ + +While calculating gradient for outermost network, only ``Tensor`` input +could be calculated, input of other type will be ignored. + +The code example is shown below. Among the input parameter +``(x, y, z)`` of outermost network, ``x`` and ``z`` are ``Tensor`` type +but ``y`` is not. While ``grad_net`` calculating gradient of the input +parameters ``(x, y, z)`` for the network, gradient of ``y`` is +automatically ignored. Only gradients of ``x`` and ``z`` are calculated, +and ``(grad_x, grad_y)`` is returned. + +.. code:: python + + import numpy as np + import mindspore as ms + from mindspore import nn + + ms.set_context(mode=ms.GRAPH_MODE) + + class Net(nn.Cell): + def __init__(self): + super(Net, self).__init__() + + def construct(self, x, y, z): + return x + y + z + + class GradNet(nn.Cell): + def __init__(self, net): + super(GradNet, self).__init__() + self.forward_net = net + + def construct(self, x, y, z): + return ms.grad(self.forward_net, grad_position=(0, 1, 2))(x, y, z) + + input_x = ms.Tensor([1]) + input_y = 2 + input_z = ms.Tensor([3]) + + net = Net() + grad_net = GradNet(net) + ret = grad_net(input_x, input_y, input_z) + print('ret:{}'.format(ret)) + +The results are as follows: + +.. code:: text + + ret:(Tensor(shape=[1], dtype=Int64, value= [1]), Tensor(shape=[1], dtype=Int64, value= [1])) + +Syntax Constraints of Basic Syntaxes +------------------------------------ + +The execution graph in graph mode is converted from source code, and not +all Python syntax can support it. The following describes some of the +syntax constraints that exist under the basic syntax. More network +compilation problems can be found in `Network +compilation `_. + +1. When an undefined class member is used in the ``construct`` function, + ``AttributeError`` exception will be thrown. For example: + + .. code:: python + + import mindspore as ms + from mindspore import nn, set_context + + set_context(mode=ms.GRAPH_MODE) + + class Net(nn.Cell): + def __init__(self): + super(Net, self).__init__() + + def construct(self, x): + return x + self.y + + net = Net() + net(1) + + The error is reported as follows: + + .. code:: text + + AttributeError: External object has no attribute y + +2. Class methods modified by ``classmethod`` in ``nn.Cell`` are not + supported. For example: + + .. code:: python + + import mindspore as ms + + ms.set_context(mode=ms.GRAPH_MODE) + + class Net(ms.nn.Cell): + @classmethod + def func(cls, x, y): + return x + y + + def construct(self, x, y): + return self.func(x, y) + + net = Net() + out = net(ms.Tensor(1), ms.Tensor(2)) + print(out) + + The error is reported as follows: + + .. code:: text + + TypeError: The parameters number of the function is 3, but the number of provided arguments is 2. + +3. In graph mode, some Python syntax is difficult to convert to + `intermediate + MindIR `_ + in graph mode. For Python keywords, there are some keywords that are + not supported in graph mode: AsyncFunctionDef, Delete, AnnAssign, + AsyncFor, AsyncWith, Match, Try, Import, ImportFrom, Nonlocal, + NamedExpr, Set, SetComp, Await, Yield, YieldFrom, Starred. If the + relevant syntax is used in graph mode, an error message will alert + the user. + + If you use the Try statement, the following example is used: + + .. code:: python + + import mindspore as ms + + @ms.jit + def test_try_except(x, y): + global_out = 1 + try: + global_out = x / y + except ZeroDivisionError: + print("division by zero, y is zero.") + return global_out + + test_try_except_out = test_try_except(1, 0) + print("out:", test_try_except_out) + + The error is reported as follows: + + .. code:: text + + RuntimeError: Unsupported statement 'Try'. + +4. Benchmarking Python built-in data types, except for `Built-in Python + Data Types <#built-in-python-data-types>`_ supported in the current + graph mode, complex 'complex' and collection 'set' types are not + supported. Some high-level uses of the list 'list' and dictionary + 'dictionary' are not supported in the basic syntax scenario, and need + to be supported when the JIT syntax support level option + 'jit_syntax_level' is 'LAX', please refer to the `Extended Syntaxes + (LAX level) <#extended-syntaxes-lax-level>`_ section of this article + for more information. + +5. In the basic syntax scenario, in addition to the `Python Built-in + Functions `_ + supported in the current graph mode, there are still some built-in + functions that are not supported in graph mode. For example: + basestring, bin, bytearray, callable, chr, cmp, compile, delattr, + dir, divmod, eval, execfile, file, frozenset, hash, hex, id, input, + issubclass, iter, locals, long, memoryview, next, object, oct, open, + ord, property, raw_input, reduce, reload, repr, reverse, set, slice, + sorted, unichr, unicode, vars, xrange, \__import\_\_. + +6. Python provides a number of third-party libraries that usually need + to be called via import statements. In graph mode, when the JIT + syntax support level is 'STRICT', you cannot directly use third-party + libraries. If you need to use the data types of third-party libraries + in graph mode or call methods of third-party libraries, you need to + support them only if the JIT syntax support level option + 'jit_syntax_level' is 'LAX', please refer to the `Calling the + Third-party Libraries <#calling-the-third-party-libraries>`_ section + in `Extended Syntaxes (LAX level) <#extended-syntaxes-lax-level>`_ + of this article. + +7. In graph mode, the modification of the attributes of the class outside the graph is not perceived, that is, the modification of the attributes of the class outside the graph will not take effect. For example: + + .. code:: python + + import mindspore as ms + from mindspore import nn, ops, Tensor, context + + class Net(nn.Cell): + def __init__(self): + super().__init__() + self.len = 1 + + def construct(self, inputs): + x = inputs + self.len + return x + + context.set_context(mode=ms.GRAPH_MODE) + inputs = 2 + net = Net() + print("out1:", net(inputs)) + net.len = 2 + print("out2:", net(inputs)) + + The result of the output will not change: + + .. code:: text + + out1: 3 + out2: 3 + +Extended Syntaxes (LAX level) +----------------------------- + +The following mainly introduces the static graph syntax supported by the +current extension. + +Calling the Third-party Libraries +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +- Third-party libraries. + + 1. Python built-in modules and Python standard libraries, such as + ``os``, ``sys``, ``math``, ``time`` and other modules. + + 2. Third-party code libraries. Their module paths are under the + ``site-packages`` directory of the Python installation directory, + which need to be installed first and then imported, such ``NumPy`` + and ``Scipy``. It should be noted that MindSpore suites such as + ``mindyolo`` and ``mindflow`` are not treated as third-party + libraries. For a detailed list, please refer to the + ``_modules_from_mindspore`` list of the + `parser `_ + file. + + 3. Modules specified by the environment variable + ``MS_JIT_IGNORE_MODULES``. In contrast, there is the environment + variable ``MS_JIT_MODULES``. For more details, please refer to + `Environment + Variables `_. + +- Supporting data types of third-party libraries, allowing calling and + returning objects of third-party libraries. + + The code example is as follows. + + .. code:: python + + import numpy as np + import mindspore as ms + + @ms.jit + def func(): + a = np.array([1, 2, 3]) + b = np.array([4, 5, 6]) + out = a + b + return out + + print(func()) + + The results are as follows: + + .. code:: text + + [5 7 9] + +- Supporting calling methods of third-party libraries. + + The code example is as follows. + + .. code:: python + + from scipy import linalg + import mindspore as ms + + @ms.jit + def func(): + x = [[1, 2], [3, 4]] + return linalg.qr(x) + + out = func() + print(out[0].shape) + + The results are as follows: + + .. code:: text + + (2, 2) + +- Supporting creating Tensor instances by using the data types of the + third-party library NumPy. + + The code example is as follows. + + .. code:: python + + import numpy as np + import mindspore as ms + + @ms.jit + def func(): + x = np.array([1, 2, 3]) + out = ms.Tensor(x) + 1 + return out + + print(func()) + + The results are as follows: + + .. code:: text + + [2, 3, 4] + +- The assignment of subscripts for data types in third-party libraries + is not currently supported. + + The code example is as follows. + + .. code:: python + + import numpy as np + import mindspore as ms + + @ms.jit + def func(): + x = np.array([1, 2, 3]) + x[0] += 1 + return ms.Tensor(x) + + res = func() + print("res: ", res) + + The error message is reported as follows: + + .. code:: text + + RuntimeError: For operation 'setitem', current input arguments types are . The 1-th argument type 'External' is not supported now. + +Supporting the Use of Custom Classes +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Custom classes can be used in graph mode, and classes can be +instantiated and object properties and methods can be used. + +For example, where 'GetattrClass' is a user-defined class that does not +use the '@jit_class' decoration and does not inherit 'nn. Cell\`。 + +.. code:: python + + import mindspore as ms + + ms.set_context(mode=ms.GRAPH_MODE) + + class GetattrClass(): + def __init__(self): + self.attr1 = 99 + self.attr2 = 1 + + def method1(self, x): + return x + self.attr2 + + class GetattrClassNet(ms.nn.Cell): + def __init__(self): + super(GetattrClassNet, self).__init__() + self.cls = GetattrClass() + + def construct(self): + return self.cls.method1(self.cls.attr1) + + net = GetattrClassNet() + out = net() + assert out == 100 + +Basic Operators Support More Data Type +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +In the syntax of graph mode, the following basic operators in the list +is overloaded: ['+', '-', +'\*','/','//','%','\*\*','<<','>>','&','\|','^', 'not', '==', '!=', '<', +'>', '<=', '>=', 'in', 'not in', 'y=x[0]']. For more details, please +refer to +`Operators `_. +When getting unsupported input type, those operators need to use +extended static graph syntax to support, and make the output consistent +with the output in the pynative mode. + +The code example is as follows. + +.. code:: python + + import mindspore as ms + import mindspore.nn as nn + from mindspore import Tensor + ms.set_context(mode=ms.GRAPH_MODE) + + class InnerClass(nn.Cell): + def construct(self, x, y): + return x.asnumpy() + y.asnumpy() + + net = InnerClass() + ret = net(Tensor([4, 5]), Tensor([1, 2])) + print(ret) + +The results are as follows: + +.. code:: text + + [5 7] + +In the example above, since the output of ``x.asnumpy()`` is +``numpy.ndarray`` and is an unsupported input type of ``+`` in the graph +mode, ``x.asnumpy() + y.asnumpy()`` will be supported by static graph +syntax. + +In another example: + +.. code:: python + + class InnerClass(nn.Cell): + def construct(self): + return (None, 1) in ((None, 1), 1, 2, 3) + + net = InnerClass() + print(net()) + +The results are as follows: + +.. code:: text + + True + +``tuple`` in ``tuple`` is an unsupported operation in original graph +mode,and will be supported by static graph syntax. + +Base Type +~~~~~~~~~ + +Use the JIT Fallback feature to extend support for Python's native data +types 'List', 'Dictionary', 'None'. + +Supporting List Inplace Modification Operations +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The list 'List' and tuple 'Tuple' are the most basic sequential built-in +types in Python, and the core difference between 'List' and 'Tuple' is +that 'List' is an object that can be changed, while 'Tuple' cannot be +changed. This means that once 'Tuple' is created, it cannot be changed +without changing the object address. 'List', on the other hand, can +modify an object without changing its address through a series of +inplace operations. For example: + +.. code:: python + + a = [1, 2, 3, 4] + a_id = id(a) + a.append(5) + a_after_id = id(a) + assert a_id == a_after_id + +In the above example code, when you change the 'List' object through the +'append' inplace syntax, the address of the object is not changed. +'Tuple' does not support this kind of inplace. With 'JIT_SYNTAX_LEVEL' +set to 'LAX', static graph mode can support the inplace operation of +some 'List' objects. + +The specific usage scenarios are as follows: + +- Support for getting the original 'List' object from a global variable + + In the following example, the static graph gets the 'List' object, + performs the inplace operation 'list.reverse()' supported by graph + mode on the original object, and returns the original object. It can + be seen that the object returned by the graph mode has the same ID as + the original global variable object, that is, the two are the same + object. If 'JIT_SYNTAX_LEVEL' is set to the 'STRICT' option, the + returned 'List' object and the global object are two different + objects. + + .. code:: python + + import mindspore as ms + + global_list = [1, 2, 3, 4] + + @ms.jit + def list_func(): + global_list.reverse() + return global_list + + output = list_func() # output: [4, 3, 2, 1] + assert id(global_list) == id(output) + +- Inplace operations on input 'List' objects are not supported + + When List' is imported as a static graph, the 'List' object is copied + once, and subsequent calculations are performed using the copied + object, so it is not possible to perform an inplace operation on the + original input object. For example: + + .. code:: python + + import mindspore as ms + + list_input = [1, 2, 3, 4] + + @ms.jit + def list_func(x): + x.reverse() + return x + + output = list_func(list_input) # output: [4, 3, 2, 1] list_input: [1, 2, 3, 4] + assert id(output) != id(list_input) + + As shown in the above use case, the 'List' object cannot be inplaced + on the original object when input as a graph mode. The object + returned by the graph mode is different from the object ID entered. + +- Support for in-place modification of some 'List' built-in functions + + With 'JIT_SYNTAX_LEVEL' set to 'LAX', the graph mode section 'List' + built-in function supports inplace. In cases where 'JIT_SYNTAX_LEVEL' + is 'STRICT', none of the methods support the inplace operation. + + Currently, the built-in methods for 'List' in-place modification + supported by graph mode are 'extend', 'pop', 'reverse', and 'insert'. + The built-in methods 'append', 'clear' and index assignment do not + support in-place modification at the moment, and will be supported in + subsequent versions. + + Examples are as follows: + + .. code:: python + + import mindspore as ms + + list_input = [1, 2, 3, 4] + + @ms.jit + def list_func(): + list_input.reverse() + return list_input + + output = list_func() # output: [4, 3, 2, 1] list_input: [4, 3, 2, 1] + assert id(output) == id(list_input) + +Supporting the High-Level Usage of Dictionary +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- Support Top Graph Return Dictionary + + Examples are as follows: + + .. code:: python + + import mindspore as ms + + @ms.jit() + def test_dict(): + x = {'a': 'a', 'b': 'b'} + y = x.get('a') + z = dict(y=y) + return z + + out = test_dict() + print("out:", out) + + The results are as follows: + + .. code:: text + + out:{'y': 'a'} + +- Support Dictionary Index Value Retrieval and Assignment + + Examples are as follows: + + .. code:: python + + import mindspore as ms + import numpy as np + + x = {"a": ms.Tensor(np.array([1, 2, 3])), "b": ms.Tensor(np.array([4, 5, 6])), "c": ms.Tensor(np.array([7, 8, 9]))} + + @ms.jit() + def test_dict(): + y = x["b"] + x["a"] = (2, 3, 4) + return x, y + + out1, out2 = test_dict() + print('out1:{}'.format(out1)) + print('out2:{}'.format(out2)) + + The results are as follows: + + .. code:: text + + out1:{'a': (2, 3, 4), 'b': Tensor(shape=[3], dtype=Int64, value= [4, 5, 6]), 'c': Tensor(shape=[3], dtype=Int64, value= [7, 8, 9])} + out2:[4 5 6] + +Supporting the Usage of None +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +'None' is a special value in Python that represents null and can be +assigned to any variable. Functions that do not have a return value +statement are considered to return 'None'. At the same time, 'None' is +also supported as the input parameter or return value of the top graph +or subgraph. Support 'None' as a subscript of a slice as input to +'List', 'Tuple', 'Dictionary'. + +Examples are as follows: + +.. code:: python + + import mindspore as ms + + @ms.jit + def test_return_none(): + return 1, "a", None + + res = test_return_none() + print(res) + +The results are as follows: + +.. code:: text + + (1, 'a', None) + +For functions with no return value, the 'None' object is returned by +default. + +.. code:: python + + import mindspore as ms + + @ms.jit + def foo(): + x = 3 + print("x:", x) + + res = foo() + assert res is None + +As in the example below, 'None' is used as the default input parameter +for the top graph. + +.. code:: python + + import mindspore as ms + + @ms.jit + def foo(x, y=None): + if y is not None: + print("y:", y) + else: + print("y is None") + print("x:", x) + return y + + x = [1, 2] + res = foo(x) + assert res is None + +Built-in Functions Support More Data Types +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Extend the support for built-in functions. Python built-in functions +perfectly support more input types, such as third-party library data +types. + +For example, in the following example, 'x.asnumpy()' and 'np.ndarray' +are both types supported by extensions. More support for built-in +functions can be found in the `Python built-in functions `_ +section. + +.. code:: python + + import numpy as np + import mindspore as ms + import mindspore.nn as nn + + ms.set_context(mode=ms.GRAPH_MODE) + + class Net(nn.Cell): + def construct(self, x): + return isinstance(x.asnumpy(), np.ndarray) + + x = ms.Tensor(np.array([-1, 2, 4])) + net = Net() + out = net(x) + assert out + +Supporting Control Flow +~~~~~~~~~~~~~~~~~~~~~~~ + +In order to improve the support of Python standard syntax, realize +dynamic and static unification, and extend the support for more data +types in the use of control flow statements. Control flow statements +refer to flow control statements such as 'if', 'for', and 'while'. +Theoretically, by extending the supported syntax, it is also supported +in control flow scenarios. The code use cases are as follows: + +.. code:: python + + import numpy as np + import mindspore as ms + + @ms.jit + def func(): + x = np.array(1) + if x <= 1: + x += 1 + return ms.Tensor(x) + + res = func() + print("res: ", res) + +The results are as follows: + +.. code:: text + + res: 2 + +Supporting Property Setting and Modification +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The specific usage scenarios are as follows: + +- Set and modify properties of custom class objects and third-party + types + +In graph mode, you can set and modify the properties of custom class +objects, such as: + +.. code:: python + + from mindspore import jit + + class AssignClass(): + def __init__(self): + self.x = 1 + + obj = AssignClass() + + @jit + def foo(): + obj.x = 100 + return + + foo() + print(f"obj.x is: {obj.x}") + +The results are as follows: + +.. code:: text + + obj.x is: 100 + +In graph mode, you can set and modify the properties of third-party +library objects, such as: + +.. code:: python + + from mindspore import jit + import numpy as np + + @jit + def foo(): + a = np.array([1, 2, 3, 4]) + a.shape = (2, 2) + return a.shape + + shape = foo() + print(f"shape is {shape}") + +The results are as follows: + +.. code:: text + + shape is (2, 2) + +- Make changes to the Cell's self object, for example: + + .. code:: python + + import mindspore as ms + from mindspore import nn, set_context + set_context(mode=ms.GRAPH_MODE) + + class Net(nn.Cell): + def __init__(self): + super().__init__() + self.m = 2 + + def construct(self): + self.m = 3 + return + + net = Net() + net() + print(f"net.m is {net.m}") + + The results are as follows: + + .. code:: text + + net.m is 3 + + Note that the self object supports property modification and setting. + If no attribute is defined in '**init**', align the PYNATIVE mode, + and the graph mode also allows this attribute to be set. For example: + + .. code:: python + + import mindspore as ms + from mindspore import nn, set_context + set_context(mode=ms.GRAPH_MODE) + + class Net(nn.Cell): + def __init__(self): + super().__init__() + self.m = 2 + + def construct(self): + self.m2 = 3 + return + + net = Net() + net() + +- Set and modify Cell objects and jit_class objects in the static graph + + Supporting property modification of objects jit_class graph mode, + such as: + + .. code:: python + + import mindspore as ms + from mindspore import nn, set_context, jit_class + set_context(mode=ms.GRAPH_MODE) + + @jit_class + class InnerClass(): + def __init__(self): + self.x = 10 + + class Net(nn.Cell): + def __init__(self): + super(Net, self).__init__() + self.inner = InnerClass() + + def construct(self): + self.inner.x = 100 + return + + net = Net() + net() + print(f"net.inner.x is {net.inner.x}") + + The results are as follows: + + .. code:: text + + net.inner.x is 100 + +Supporting Derivation +~~~~~~~~~~~~~~~~~~~~~ + +The static graph syntax supported by the extension also supports its use +in derivation, such as: + +.. code:: python + + import mindspore as ms + from mindspore import ops, set_context + set_context(mode=ms.GRAPH_MODE) + + @ms.jit + def dict_net(a): + x = {'a': a, 'b': 2} + return a, (x, (1, 2)) + + out = ops.grad(dict_net)(ms.Tensor([1])) + assert out == 2 + +Annotation Type +~~~~~~~~~~~~~~~ + +For syntax supported by the runtime extensions, nodes are generated that +cannot be derived by type, such as dynamically created Tensors, which +are called ``Any`` types. Because this type cannot be inferred correctly +at compile time, the ``Any`` type will be operated on with a default +maximum precision of float64 to prevent loss of precision. In order to +better optimize performance, it is necessary to reduce the generation of +``Any`` type data. When the user can clearly know the specific type that +will be generated by the extended syntax, we recommend using Annotation +to specify the corresponding Python statement type, thereby determining +the type of the interpretation node and avoiding the generation of +``Any`` type. + +For example, the difference between the +`Tensor `_ +class and the +`tensor `_ +interface lies in the use of the Annotation Type mechanism within the +tensor interface. When the dtype of the tensor function is determined, +the function uses Annotation to specify the output type, thereby +avoiding the generation of Any type. The use of ``Annotation Type`` only +requires adding a comment ``# @jit.typing: () -> tensor_type[float32]`` +above or after the corresponding Python statement, where +tensor_type[float32] after -> indicates the output type of the annotated +statement. + +The code example is as follows. + +.. code:: python + + import mindspore as ms + import mindspore.nn as nn + from mindspore import ops, Tensor + + class Net(nn.Cell): + def __init__(self): + super(Net, self).__init__() + self.abs = ops.Abs() + + @ms.jit + def construct(self, x, y): + y1 = ms.tensor(x.asnumpy() + y.asnumpy(), dtype=ms.float32) + y2 = ms.Tensor(x.asnumpy() + y.asnumpy(), dtype=ms.float32) # @jit.typing: () -> tensor_type[float32] + y3 = Tensor(x.asnumpy() + y.asnumpy()) + y4 = Tensor(x.asnumpy() + y.asnumpy(), dtype=ms.float32) + return self.abs(y1), self.abs(y2), self.abs(y3), self.abs(y4) + + ms.set_context(mode=ms.GRAPH_MODE) + net = Net() + x = ms.Tensor(-1, dtype=ms.int32) + y = ms.Tensor(-1, dtype=ms.float32) + y1, y2, y3, y4 = net(x, y) + + print(f"y1 value is {y1}, dtype is {y1.dtype}") + print(f"y2 value is {y2}, dtype is {y2.dtype}") + print(f"y3 value is {y3}, dtype is {y3.dtype}") + print(f"y4 value is {y4}, dtype is {y4.dtype}") + +The results are as follows: + +.. code:: text + + y1 value is 2.0, dtype is Float32 + y2 value is 2.0, dtype is Float32 + y3 value is 2.0, dtype is Float64 + y4 value is 2.0, dtype is Float64 + +In the above example, you can see the difference related to creating +'Tensor'. Due to the lack of Annotation indication in the Tensor class, +y3 and y4 cannot infer the correct type and can only perform operations +in the highest precision float64. For y2, the corresponding type for JIT +Fallback was specified through Annotation during Tensor creation, +allowing it to perform operations according to the specified type. y1 +created the Tensor using the tensor function interface and passed the +dtype parameter as an Annotation indication, avoiding the generation of +``Any`` type. + +Syntax Constraints of Extended Syntaxes +--------------------------------------- + +When using the static graph extension support syntax, note the following +points: + +1. In order to match the support capability of the dynamic graph. That + is, it must be within the scope of dynamic graph syntax, including + but not limited to data types. + +2. When extending the static graph syntax, more syntax is supported, but + the execution performance may be affected and is not optimal. + +3. When extending the static graph syntax, more syntax is supported, and + the ability to import and export cannot be used with MindIR due to + use Python. + +4. It is not currently supported that the repeated definition of global + variables with the same name across Python files, and these global + variables are used in the network. \ No newline at end of file diff --git a/docs/mindspore/source_en/note/official_models.md b/docs/mindspore/source_en/note/official_models.md index b450394111..c6c17af914 100644 --- a/docs/mindspore/source_en/note/official_models.md +++ b/docs/mindspore/source_en/note/official_models.md @@ -334,4 +334,4 @@ | Computational Fluid Dynamics | [PDE-Net](https://arxiv.org/abs/1710.09668) | [Link](https://gitee.com/mindspore/mindscience/blob/master/MindFlow/applications/data_mechanism_fusion/pde_net/README.md#) | ✅ | ✅ | | Computational Fluid Dynamics | [hfm](https://www.science.org/doi/abs/10.1126/science.aaw4741) | [Link](https://gitee.com/mindspore/mindscience/blob/master/SciAI/sciai/model/hfm/README.md) | ✅ | ✅ | | Computational Fluid Dynamics | [label_free_dnn_surrogate](https://www.sciencedirect.com/science/article/pii/S004578251930622X) | [Link](https://gitee.com/mindspore/mindscience/blob/master/SciAI/sciai/model/label_free_dnn_surrogate/README.md) | ✅ | ✅ | -| Computational Fluid Dynamics | [nsf_nets](https://www.sciencedirect.com/science/article/pii/S0021999120307257) | [Link](https://gitee.com/mindspore/mindscience/blob/master/SciAI/sciai/model/nsf_nets/README.md) | ✅ | ✅ | +| Computational Fluid Dynamics | [nsf_nets](https://www.sciencedirect.com/science/article/pii/S0021999120307257) | [Link](https://gitee.com/mindspore/mindscience/blob/master/SciAI/sciai/model/nsf_nets/README.md) | ✅ | ✅ | \ No newline at end of file diff --git a/docs/mindspore/source_en/orange_pi/debug.md b/docs/mindspore/source_en/orange_pi/debug.md new file mode 100644 index 0000000000..0b9380e7f2 --- /dev/null +++ b/docs/mindspore/source_en/orange_pi/debug.md @@ -0,0 +1,3 @@ +# Function Debugging + +[![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_en/orange_pi/debug.md) diff --git a/docs/mindspore/source_en/orange_pi/index.rst b/docs/mindspore/source_en/orange_pi/index.rst new file mode 100644 index 0000000000..ad60a3fc56 --- /dev/null +++ b/docs/mindspore/source_en/orange_pi/index.rst @@ -0,0 +1,11 @@ +Orange Pi Development Guidance +=============================== + +.. toctree:: + :glob: + :maxdepth: 1 + + overview + quick_start + debug + model_infer diff --git a/docs/mindspore/source_en/orange_pi/model_infer.md b/docs/mindspore/source_en/orange_pi/model_infer.md new file mode 100644 index 0000000000..4cd6654ce9 --- /dev/null +++ b/docs/mindspore/source_en/orange_pi/model_infer.md @@ -0,0 +1,7 @@ +# Model Inference + +[![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_en/orange_pi/model_infer.md) + +## Online Inference + +## Offline Inference diff --git a/docs/mindspore/source_en/orange_pi/overview.md b/docs/mindspore/source_en/orange_pi/overview.md new file mode 100644 index 0000000000..0382094319 --- /dev/null +++ b/docs/mindspore/source_en/orange_pi/overview.md @@ -0,0 +1,3 @@ +# Orange Pi Overview + +[![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_en/orange_pi/overview.md) diff --git a/docs/mindspore/source_en/orange_pi/quick_start.md b/docs/mindspore/source_en/orange_pi/quick_start.md new file mode 100644 index 0000000000..f1ac91db2e --- /dev/null +++ b/docs/mindspore/source_en/orange_pi/quick_start.md @@ -0,0 +1,9 @@ +# Quick-start + +[![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_en/orange_pi/quick_start.md) + +## Installation + +## Startup + +## Running diff --git a/docs/mindspore/source_zh_cn/design/dynamic_graph_and_static_graph.ipynb b/docs/mindspore/source_zh_cn/design/dynamic_graph_and_static_graph.ipynb index d66b99eb4f..1dcc5ce01e 100644 --- a/docs/mindspore/source_zh_cn/design/dynamic_graph_and_static_graph.ipynb +++ b/docs/mindspore/source_zh_cn/design/dynamic_graph_and_static_graph.ipynb @@ -243,233 +243,6 @@ "### PyNative模式下的控制流\n", "\n", "在PyNative模式下,脚本按照Python的语法执行,因此在MindSpore中,针对控制流语法并没有做特殊处理,直接按照Python的语法直接展开执行,进而对展开的执行算子进行自动微分的操作。例如,对于for循环,在PyNative下会根据具体的循环次数,不断的执行for循环中的语句,并对其算子进行自动微分的操作。\n", - "\n", - "## 动静统一\n", - "\n", - "### 概述\n", - "\n", - "当前在业界支持动态图和静态图两种模式,动态图通过解释执行,具有动态语法亲和性,表达灵活;静态图使用jit编译优化执行,偏静态语法,在语法上有较多限制。动态图和静态图的编译流程不一致,语法约束不一致。MindSpore针对动态图和静态图模式,首先统一API表达,在两种模式下使用相同的API;其次统一动态图和静态图的底层微分机制。\n", - "\n", - "![dynamic](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/docs/mindspore/source_zh_cn/design/images/dynamic.png)\n", - "\n", - "### 动态图和静态图互相转换\n", - "\n", - "在MindSpore中,我们可以通过控制模式输入参数来切换执行使用动态图还是静态图。例如:" - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 5, - "source": [ - "ms.set_context(mode=ms.PYNATIVE_MODE)" - ], - "outputs": [], - "metadata": { - "ExecuteTime": { - "end_time": "2022-01-04T10:51:23.461198Z", - "start_time": "2022-01-04T10:51:23.447508Z" - } - } - }, - { - "cell_type": "markdown", - "source": [ - "由于在静态图下,对于Python语法有所限制,因此从动态图切换成静态图时,需要符合静态图的语法限制,才能正确使用静态图来进行执行。更多静态图的语法限制可以参考[静态图语法支持](https://www.mindspore.cn/docs/zh-CN/master/note/static_graph_syntax_support.html)。\n", - "\n", - "### 动静结合\n", - "\n", - "MindSpore支持在动态图下使用静态编译的方式来进行混合执行,通过使用jit修饰需要用静态图来执行的函数对象,即可实现动态图和静态图的混合执行,更多jit的使用可参考[jit文档](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/accelerate_with_static_graph.html#基于装饰器的开启方式)。\n", - "\n", - "例如:" - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 6, - "source": [ - "import numpy as np\n", - "import mindspore as ms\n", - "import mindspore.nn as nn\n", - "\n", - "class AddMulMul(nn.Cell):\n", - " def __init__(self):\n", - " super(AddMulMul, self).__init__()\n", - " self.param = ms.Parameter(ms.Tensor(0.5, ms.float32))\n", - "\n", - " @ms.jit\n", - " def construct(self, x):\n", - " x = x + x\n", - " x = x * self.param\n", - " x = x * x\n", - " return x\n", - "\n", - "class CellCallSingleCell(nn.Cell):\n", - " def __init__(self):\n", - " super(CellCallSingleCell, self).__init__()\n", - " self.conv = nn.Conv2d(1, 2, kernel_size=2, stride=1, padding=0, weight_init=\"ones\", pad_mode=\"valid\")\n", - " self.bn = nn.BatchNorm2d(2, momentum=0.99, eps=0.00001, gamma_init=\"ones\")\n", - " self.relu = nn.ReLU()\n", - " self.add_mul_mul = AddMulMul()\n", - "\n", - " def construct(self, x):\n", - " x = self.conv(x)\n", - " x = self.bn(x)\n", - " x = self.add_mul_mul(x)\n", - " x = self.relu(x)\n", - " return x\n", - "\n", - "ms.set_context(mode=ms.PYNATIVE_MODE, device_target=\"CPU\")\n", - "inputs = ms.Tensor(np.ones([1, 1, 2, 2]).astype(np.float32))\n", - "net = CellCallSingleCell()\n", - "out = net(inputs)\n", - "print(out)" - ], - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "[[[[15.99984]]\n", - "\n", - " [[15.99984]]]]\n" - ] - } - ], - "metadata": { - "ExecuteTime": { - "end_time": "2022-01-04T10:51:23.514919Z", - "start_time": "2022-01-04T10:51:23.462207Z" - } - } - }, - { - "cell_type": "markdown", - "source": [ - "### 静态图语法增强技术\n", - "\n", - "在MindSpore静态图模式下,用户编写程序时需要遵循MindSpore[静态图语法支持](https://www.mindspore.cn/docs/zh-CN/master/note/static_graph_syntax_support.html),语法使用存在约束限制。而在动态图模式下,Python脚本代码会根据Python语法进行执行,用户可以使用任意Python语法。可以看出,静态图和动态图的语法约束限制是不同的。\n", - "\n", - "JIT Fallback是从静态图的角度出发考虑静态图和动态图的统一。在编译过程中发现不支持的语法时,将该语法Fallback到Python解释器进行解释执行。通过JIT Fallback特性,静态图可以支持尽量多的动态图语法,使得静态图提供接近动态图的语法使用体验,从而实现动静统一。\n", - "\n", - "在图模式场景下,MindSpore框架在图编译过程中遇到不支持语法或不支持符号时会报错,多数是在类型推导阶段。图编译阶段首先对用户编写的Python源码进行解析,然后执行后续的静态分析、类型推导、优化等步骤。因此,JIT Fallback特性需要预先检测不支持语法。常见的不支持语法主要包括:调用第三方库的方法、调用类名来创建对象、调用未支持的Python内置函数等。对不支持的语法Fallback到Python解释器进行解释执行。由于图模式采用[中间表示MindIR](https://www.mindspore.cn/docs/zh-CN/master/design/all_scenarios.html#中间表示mindir),需要将解释执行的语句转换到中间表示,记录下解释器需要的信息。\n", - "\n", - "下面主要介绍使用JIT Fallback扩展支持的静态图语法。JIT语法支持级别选项jit_syntax_level的默认值为`LAX`,即使用JIT Fallback的能力扩展静态图语法。\n", - "\n", - "#### 调用第三方库\n", - "\n", - "完善支持NumPy、SciPy等第三方库。静态图模式支持np.ndarray等众多第三方库数据类型及其运算操作,支持获取调用第三方库的属性和方法,并支持通过Tensor的asnumpy()等方法与NumPy等三方库进行交互处理。也就是说,用户可以在静态图模式下调用MindSpore自身接口和算子,或者直接调用三方库的接口,也可以把它们融合在一起使用。\n", - "\n", - "- 支持第三方库(如NumPy、SciPy等)的数据类型,允许调用和返回第三方库的对象。\n", - "- 支持调用第三方库的方法。\n", - "- 支持使用NumPy第三方库数据类型创建Tensor对象。\n", - "- 暂不支持对第三方库数据类型的下标索引赋值。\n", - "\n", - "更多使用可见[静态图语法支持](https://www.mindspore.cn/docs/zh-CN/master/note/static_graph_syntax_support.html)中的[调用第三方库](https://www.mindspore.cn/docs/zh-CN/master/note/static_graph_syntax_support.html#调用第三方库)。\n", - "\n", - "#### 支持自定义类的使用\n", - "\n", - "用户自定义的类,没有使用`@jit_class`修饰,也没有继承`nn.Cell`。通过JIT Fallback技术方案,静态图模式下允许创建和引用自定义类的实例,可以支持直接获取和调用自定义类实例的属性和方法,并且允许修改属性(Inplace操作)。\n", - "\n", - "更多使用可见[静态图语法支持](https://www.mindspore.cn/docs/zh-CN/master/note/static_graph_syntax_support.html)中的[支持自定义类的使用](https://www.mindspore.cn/docs/zh-CN/master/note/static_graph_syntax_support.html#支持自定义类的使用)。\n", - "\n", - "#### 基础运算符支持更多数据类型\n", - "\n", - "在静态图语法重载了以下运算符: ['+', '-', '*', '/', '//', '%', '**', '<<', '>>', '&', '|', '^', 'not', '==', '!=', '<', '>', '<=', '>=', 'in', 'not in', 'y=x[0]']。图模式重载的运算符详见[运算符](https://www.mindspore.cn/docs/zh-CN/master/note/static_graph_syntax/operators.html)。列表中的运算符在输入图模式中不支持的输入类型时将使用扩展静态图语法支持,并使输出结果与动态图模式下的输出结果一致。\n", - "\n", - "更多使用可见[静态图语法支持](https://www.mindspore.cn/docs/zh-CN/master/note/static_graph_syntax_support.html)中的[基础运算符支持更多数据类型](https://www.mindspore.cn/docs/zh-CN/master/note/static_graph_syntax_support.html#基础运算符支持更多数据类型)。\n", - "\n", - "#### 基础类型\n", - "\n", - "扩展对Python原生数据类型`List`、`Dictionary`、`None`的支持。更多使用可见[静态图语法支持](https://www.mindspore.cn/docs/zh-CN/master/note/static_graph_syntax_support.html)中的[基础类型](https://www.mindspore.cn/docs/zh-CN/master/note/static_graph_syntax_support.html#基础类型)。\n", - "\n", - "##### 支持列表就地修改操作\n", - "\n", - "- 支持从全局变量中获取原`List`对象。\n", - "- 不支持对输入`List`对象进行inplace操作。\n", - "- 支持部分`List`内置函数的就地修改操作。\n", - "\n", - "##### 支持Dictionary的高阶用法\n", - "\n", - "- 支持顶图返回Dictionary。\n", - "- 支持Dictionary索引取值和赋值。\n", - "\n", - "##### 支持使用None\n", - "\n", - "`None`是Python中的一个特殊值,表示空,可以赋值给任何变量。对于没有返回值语句的函数认为返回`None`。同时也支持`None`作为顶图或者子图的入参或者返回值。支持`None`作为切片的下标,作为`List`、`Tuple`、`Dictionary`的输入。\n", - "\n", - "#### 内置函数支持更多数据类型\n", - "\n", - "扩展内置函数的支持范围。Python内置函数完善支持更多输入类型,例如第三方库数据类型。更多内置函数的支持情况可见[Python内置函数](https://www.mindspore.cn/docs/zh-CN/master/note/static_graph_syntax/python_builtin_functions.html)章节。\n", - "\n", - "#### 支持控制流\n", - "\n", - "为了提高Python标准语法支持度,实现动静统一,扩展支持更多数据类型在控制流语句的使用。控制流语句是指`if`、`for`、`while`等流程控制语句。理论上,通过扩展支持的语法,在控制流场景中也支持。更多使用可见[静态图语法支持](https://www.mindspore.cn/docs/zh-CN/master/note/static_graph_syntax_support.html)中的[支持控制流](https://www.mindspore.cn/docs/zh-CN/master/note/static_graph_syntax_support.html#支持控制流)。\n", - "\n", - "#### 支持属性设置与修改\n", - "\n", - "支持更多类型的Inplace操作。之前版本只支持通过Inplace算子对Parameter类型进行值修改,在MindSpore2.1版本静态图模式下,支持了自定义类,Cell子类,jit_class类的属性修改。除了支持更改类self属性和全局变量的属性以外,也新增支持对List类型的extend()、reverse()、insert()、pop()等Inplace操作。更多使用可见[静态图语法支持](https://www.mindspore.cn/docs/zh-CN/master/note/static_graph_syntax_support.html)中的[支持属性设置与修改](https://www.mindspore.cn/docs/zh-CN/master/note/static_graph_syntax_support.html#支持属性设置与修改)。\n", - "\n", - "- 对自定义类对象以及第三方类型的属性进行设置与修改。\n", - "- 对Cell的self对象进行修改。\n", - "- 对静态图内的Cell对象以及jit_class对象进行设置与修改。\n", - "\n", - "#### 支持求导\n", - "\n", - "使用JIT Fallback支持的静态图语法,同样支持其在求导中使用。更多使用可见[静态图语法支持](https://www.mindspore.cn/docs/zh-CN/master/note/static_graph_syntax_support.html)中的[支持求导](https://www.mindspore.cn/docs/zh-CN/master/note/static_graph_syntax_support.html#支持求导)。\n", - "\n", - "#### Annotation Type\n", - "\n", - "对于运行时的JIT Fallback支持的语法,会产生一些无法被类型推导出的节点,这种类型称为`Any`类型。因为该类型无法在编译时推导出正确的类型,所以这种`Any`将会以一种默认最大精度`float64`进行运算,防止其精度丢失。为了能更好的优化相关性能,需要减少`Any`类型数据的产生。当用户可以明确知道当前通过扩展支持的语句会产生具体类型的时候,我们推荐使用`Annotation @jit.typing:`的方式进行指定对应Python语句类型,从而确定解释节点的类型避免`Any`类型的生成。更多使用可见[静态图语法支持](https://www.mindspore.cn/docs/zh-CN/master/note/static_graph_syntax_support.html)中的[Annotation Type](https://www.mindspore.cn/docs/zh-CN/master/note/static_graph_syntax_support.html#annotation-type)。\n", - "\n", - "#### 使用须知\n", - "\n", - "在使用静态图JIT Fallback扩展支持语法时,请注意以下几点:\n", - "\n", - "1. 对标动态图的支持能力,即:须在动态图语法范围内,包括但不限于数据类型等。\n", - "\n", - "2. 在扩展静态图语法时,支持了更多的语法,但执行性能可能会受影响,不是最佳。\n", - "\n", - "3. 在扩展静态图语法时,支持了更多的语法,由于使用Python的能力,不能使用MindIR导入导出的能力。\n", - "\n", - "4. 暂不支持跨Python文件重复定义同名的全局变量,且这些全局变量在网络中会被用到。" - ], - "metadata": {}, - "attachments": {} - }, - { - "cell_type": "markdown", - "source": [ - "### 动态图转静态图技术\n", - "\n", - "MindSpore提供了一种在代码无需修改的情况下,直接将用户的动态图代码转换成静态图的功能——PIJit。该功能同时兼顾性能和易用性,去除动静模式切换的代价,真正做到动静统一。它基于Python字节码的分析,对Python的执行流进行图捕获,可以以静态图方式运行的子图便以静态图方式运行,Python语法不支持的子图便以动态图方式运行,同时通过修改调整字节码的方式链接静态图,达到动静混合执行。在满足易用性的前提下,尽可能地提高性能。\n", - "\n", - "#### PIJit包含以下功能\n", - "\n", - "- 1. 图捕获:对字节码预处理,动态跟踪解释执行,识别MindSpore可入图操作,提供裂图功能保证函数(字节码)功能的正确性。\n", - "- 2. 字节码支持:当前支持Python3.7、Python3.8、Python3.9和Python3.10的字节码。\n", - "- 3. 图优化:对图中生成的字节码进行优化,包括分支裁剪、字节码筛选、函数字节码内联、常量折叠等功能。\n", - "- 4. 异常捕获机制:支持with、try-except语法。\n", - "- 5. 支持循环处理:通过模拟字节码的操作栈实现图捕获、裂图等特性。\n", - "- 6. UD分析:通过变量的user-def链分析的方法,解决部分参数类型不能作为静态图的返回值问题(函数、Bool、None),同时减少无用的入参,提高图的执行效率,减少数据的拷贝。\n", - "- 7. 副作用分析处理:弥补静态图的副作用处理上的劣势,根据不同场景,收集记录产生副作用的变量及字节码,在保证程序语义的基础上,在静态图外补充副作用的处理。\n", - "- 8. 守护门禁:门禁(Guard)记录了子图/优化进入的输入需要满足的条件,检查输入是否适合对应的子图优化。\n", - "- 9. Cache:图管理(Cache)则缓存了子图/优化和门禁(Guard)对应关系。\n", - "- 10. Dynamic Shape和Symbolic Shape: 使用input_signature支持Tensor/Tensor List/Tensor Tuple的DynamicShape和SymblicShape作为输入提示。同时支持自动多次运行后,识别Dynamic Shape。\n", - "- 11. 即时跟踪编译: 在跟踪和字节码分析过程中,支持算子等类型推导。\n", - "- 12. 自动混合精度: 支持原生mindspore.nn.Cell的自动混合精度能力。\n", - "\n", - "#### 使用方式\n", - "\n", - "def jit(fn=None, input_signature=None, hash_args=None, jit_config=None, mode=\"PIJit\"):\n", - "\n", - "原Jit功能使用mode=\"PSJit\",新特性PIJit使用mode=\"PIJit\",jit_config传递一个参数字典,可以提供一些优化和调试选项。如:print_after_all可以打印入图的字节码和裂图信息,loop_unrolling可以提供循环展开功能,enable_dynamic_shape使能动态Shape。\n", - "\n", - "#### 使用限制\n", - "\n", - "- 不支持在静态图模式下,运行带装饰@jit(mode=\\\"PIJit\\\")的函数,此时该装饰@jit(mode=\\\"PIJit\\\")视为无效。\n", - "- 不支持在@jit(mode=\\\"PSJit\\\")装饰的函数内部调用带装饰@jit(mode=\\\"PIJit\\\")的函数,该装饰 @jit(mode=\\\"PIJit\\\")视为无效。\n", "\n" ], "metadata": {} diff --git a/docs/mindspore/source_zh_cn/model_train/program_form/jit.ipynb b/docs/mindspore/source_zh_cn/model_train/program_form/jit.ipynb new file mode 100644 index 0000000000..957e10ba78 --- /dev/null +++ b/docs/mindspore/source_zh_cn/model_train/program_form/jit.ipynb @@ -0,0 +1,261 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "source": [ + "# 动静转换\n", + "\n", + "[![下载Notebook](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_notebook.svg)](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/master/zh_cn/model_train/program_form/mindspore_jit.ipynb) [![下载样例代码](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_download_code.svg)](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/master/zh_cn/model_train/program_form/mindspore_jit.py) [![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_zh_cn/model_train/program_form/jit.ipynb)\n", + "\n", + "## 概述\n", + "\n", + "当前在业界支持动态图和静态图两种模式,动态图通过解释执行,具有动态语法亲和性,表达灵活;静态图使用jit编译优化执行,偏静态语法,在语法上有较多限制。动态图和静态图的编译流程不一致,语法约束不一致。MindSpore针对动态图和静态图模式,首先统一API表达,在两种模式下使用相同的API;其次统一动态图和静态图的底层微分机制。\n", + "\n", + "![dynamic](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/docs/mindspore/source_zh_cn/model_train/program_form/images/dynamic.png)\n", + "\n", + "## 动态图和静态图互相转换\n", + "\n", + "在MindSpore中,我们可以通过控制模式输入参数来切换执行使用动态图还是静态图。例如:" + ], + "metadata": {} + }, + { + "cell_type": "code", + "execution_count": 5, + "source": [ + "import mindspore as ms\n", + "ms.set_context(mode=ms.PYNATIVE_MODE)" + ], + "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2022-01-04T10:51:23.461198Z", + "start_time": "2022-01-04T10:51:23.447508Z" + } + } + }, + { + "cell_type": "markdown", + "source": [ + "由于在静态图下,对于Python语法有所限制,因此从动态图切换成静态图时,需要符合静态图的语法限制,才能正确使用静态图来进行执行。更多静态图的语法限制可以参考[静态图语法支持](https://www.mindspore.cn/docs/zh-CN/master/model_train/program_form/static_graph_syntax/static_graph_syntax_support.html)。\n", + "\n", + "## 动静结合\n", + "\n", + "MindSpore支持在动态图下使用静态编译的方式来进行混合执行,通过使用jit修饰需要用静态图来执行的函数对象,即可实现动态图和静态图的混合执行,更多jit的使用可参考[jit文档](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/accelerate_with_static_graph.html#基于装饰器的开启方式)。\n", + "\n", + "例如:" + ], + "metadata": {} + }, + { + "cell_type": "code", + "execution_count": 6, + "source": [ + "import numpy as np\n", + "import mindspore as ms\n", + "import mindspore.nn as nn\n", + "\n", + "class AddMulMul(nn.Cell):\n", + " def __init__(self):\n", + " super(AddMulMul, self).__init__()\n", + " self.param = ms.Parameter(ms.Tensor(0.5, ms.float32))\n", + "\n", + " @ms.jit\n", + " def construct(self, x):\n", + " x = x + x\n", + " x = x * self.param\n", + " x = x * x\n", + " return x\n", + "\n", + "class CellCallSingleCell(nn.Cell):\n", + " def __init__(self):\n", + " super(CellCallSingleCell, self).__init__()\n", + " self.conv = nn.Conv2d(1, 2, kernel_size=2, stride=1, padding=0, weight_init=\"ones\", pad_mode=\"valid\")\n", + " self.bn = nn.BatchNorm2d(2, momentum=0.99, eps=0.00001, gamma_init=\"ones\")\n", + " self.relu = nn.ReLU()\n", + " self.add_mul_mul = AddMulMul()\n", + "\n", + " def construct(self, x):\n", + " x = self.conv(x)\n", + " x = self.bn(x)\n", + " x = self.add_mul_mul(x)\n", + " x = self.relu(x)\n", + " return x\n", + "\n", + "ms.set_context(mode=ms.PYNATIVE_MODE, device_target=\"CPU\")\n", + "inputs = ms.Tensor(np.ones([1, 1, 2, 2]).astype(np.float32))\n", + "net = CellCallSingleCell()\n", + "out = net(inputs)\n", + "print(out)" + ], + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "[[[[15.99984]]\n", + "\n", + " [[15.99984]]]]\n" + ] + } + ], + "metadata": { + "ExecuteTime": { + "end_time": "2022-01-04T10:51:23.514919Z", + "start_time": "2022-01-04T10:51:23.462207Z" + } + } + }, + { + "cell_type": "markdown", + "source": [ + "## 静态图语法增强技术\n", + "\n", + "在MindSpore静态图模式下,用户编写程序时需要遵循MindSpore[静态图语法支持](https://www.mindspore.cn/docs/zh-CN/master/model_train/program_form/static_graph_syntax/static_graph_syntax_support.html),语法使用存在约束限制。而在动态图模式下,Python脚本代码会根据Python语法进行执行,用户可以使用任意Python语法。可以看出,静态图和动态图的语法约束限制是不同的。\n", + "\n", + "JIT Fallback是从静态图的角度出发考虑静态图和动态图的统一。在编译过程中发现不支持的语法时,将该语法Fallback到Python解释器进行解释执行。通过JIT Fallback特性,静态图可以支持尽量多的动态图语法,使得静态图提供接近动态图的语法使用体验,从而实现动静统一。\n", + "\n", + "在图模式场景下,MindSpore框架在图编译过程中遇到不支持语法或不支持符号时会报错,多数是在类型推导阶段。图编译阶段首先对用户编写的Python源码进行解析,然后执行后续的静态分析、类型推导、优化等步骤。因此,JIT Fallback特性需要预先检测不支持语法。常见的不支持语法主要包括:调用第三方库的方法、调用类名来创建对象、调用未支持的Python内置函数等。对不支持的语法Fallback到Python解释器进行解释执行。由于图模式采用[中间表示MindIR](https://www.mindspore.cn/docs/zh-CN/master/design/all_scenarios.html#中间表示mindir),需要将解释执行的语句转换到中间表示,记录下解释器需要的信息。\n", + "\n", + "下面主要介绍使用JIT Fallback扩展支持的静态图语法。JIT语法支持级别选项jit_syntax_level的默认值为`LAX`,即使用JIT Fallback的能力扩展静态图语法。\n", + "\n", + "### 调用第三方库\n", + "\n", + "完善支持NumPy、SciPy等第三方库。静态图模式支持np.ndarray等众多第三方库数据类型及其运算操作,支持获取调用第三方库的属性和方法,并支持通过Tensor的asnumpy()等方法与NumPy等三方库进行交互处理。也就是说,用户可以在静态图模式下调用MindSpore自身接口和算子,或者直接调用三方库的接口,也可以把它们融合在一起使用。\n", + "\n", + "- 支持第三方库(如NumPy、SciPy等)的数据类型,允许调用和返回第三方库的对象。\n", + "- 支持调用第三方库的方法。\n", + "- 支持使用NumPy第三方库数据类型创建Tensor对象。\n", + "- 暂不支持对第三方库数据类型的下标索引赋值。\n", + "\n", + "更多使用可见[静态图语法支持](https://www.mindspore.cn/docs/zh-CN/master/model_train/program_form/static_graph_syntax/static_graph_syntax_support.html)中的[调用第三方库](https://www.mindspore.cn/docs/zh-CN/master/model_train/program_form/static_graph_syntax/static_graph_syntax_support.html#调用第三方库)。\n", + "\n", + "### 支持自定义类的使用\n", + "\n", + "用户自定义的类,没有使用`@jit_class`修饰,也没有继承`nn.Cell`。通过JIT Fallback技术方案,静态图模式下允许创建和引用自定义类的实例,可以支持直接获取和调用自定义类实例的属性和方法,并且允许修改属性(Inplace操作)。\n", + "\n", + "更多使用可见[静态图语法支持](https://www.mindspore.cn/docs/zh-CN/master/model_train/program_form/static_graph_syntax/static_graph_syntax_support.html)中的[支持自定义类的使用](https://www.mindspore.cn/docs/zh-CN/master/model_train/program_form/static_graph_syntax/static_graph_syntax_support.html#支持自定义类的使用)。\n", + "\n", + "### 基础运算符支持更多数据类型\n", + "\n", + "在静态图语法重载了以下运算符: ['+', '-', '*', '/', '//', '%', '**', '<<', '>>', '&', '|', '^', 'not', '==', '!=', '<', '>', '<=', '>=', 'in', 'not in', 'y=x[0]']。图模式重载的运算符详见[运算符](https://www.mindspore.cn/docs/zh-CN/master/model_train/program_form/static_graph_syntax/operators.html)。列表中的运算符在输入图模式中不支持的输入类型时将使用扩展静态图语法支持,并使输出结果与动态图模式下的输出结果一致。\n", + "\n", + "更多使用可见[静态图语法支持](https://www.mindspore.cn/docs/zh-CN/master/model_train/program_form/static_graph_syntax/static_graph_syntax_support.html)中的[基础运算符支持更多数据类型](https://www.mindspore.cn/docs/zh-CN/master/model_train/program_form/static_graph_syntax/static_graph_syntax_support.html#基础运算符支持更多数据类型)。\n", + "\n", + "### 基础类型\n", + "\n", + "扩展对Python原生数据类型`List`、`Dictionary`、`None`的支持。更多使用可见[静态图语法支持](https://www.mindspore.cn/docs/zh-CN/master/model_train/program_form/static_graph_syntax/static_graph_syntax_support.html)中的[基础类型](https://www.mindspore.cn/docs/zh-CN/master/model_train/program_form/static_graph_syntax/static_graph_syntax_support.html#基础类型)。\n", + "\n", + "#### 支持列表就地修改操作\n", + "\n", + "- 支持从全局变量中获取原`List`对象。\n", + "- 不支持对输入`List`对象进行inplace操作。\n", + "- 支持部分`List`内置函数的就地修改操作。\n", + "\n", + "#### 支持Dictionary的高阶用法\n", + "\n", + "- 支持顶图返回Dictionary。\n", + "- 支持Dictionary索引取值和赋值。\n", + "\n", + "#### 支持使用None\n", + "\n", + "`None`是Python中的一个特殊值,表示空,可以赋值给任何变量。对于没有返回值语句的函数认为返回`None`。同时也支持`None`作为顶图或者子图的入参或者返回值。支持`None`作为切片的下标,作为`List`、`Tuple`、`Dictionary`的输入。\n", + "\n", + "### 内置函数支持更多数据类型\n", + "\n", + "扩展内置函数的支持范围。Python内置函数完善支持更多输入类型,例如第三方库数据类型。更多内置函数的支持情况可见[Python内置函数](https://www.mindspore.cn/docs/zh-CN/master/model_train/program_form/static_graph_syntax/python_builtin_functions.html)章节。\n", + "\n", + "### 支持控制流\n", + "\n", + "为了提高Python标准语法支持度,实现动静统一,扩展支持更多数据类型在控制流语句的使用。控制流语句是指`if`、`for`、`while`等流程控制语句。理论上,通过扩展支持的语法,在控制流场景中也支持。更多使用可见[静态图语法支持](https://www.mindspore.cn/docs/zh-CN/master/model_train/program_form/static_graph_syntax/static_graph_syntax_support.html)中的[支持控制流](https://www.mindspore.cn/docs/zh-CN/master/model_train/program_form/static_graph_syntax/static_graph_syntax_support.html#支持控制流)。\n", + "\n", + "### 支持属性设置与修改\n", + "\n", + "支持更多类型的Inplace操作。之前版本只支持通过Inplace算子对Parameter类型进行值修改,在MindSpore2.1版本静态图模式下,支持了自定义类,Cell子类,jit_class类的属性修改。除了支持更改类self属性和全局变量的属性以外,也新增支持对List类型的extend()、reverse()、insert()、pop()等Inplace操作。更多使用可见[静态图语法支持](https://www.mindspore.cn/docs/zh-CN/master/model_train/program_form/static_graph_syntax/static_graph_syntax_support.html)中的[支持属性设置与修改](https://www.mindspore.cn/docs/zh-CN/master/model_train/program_form/static_graph_syntax/static_graph_syntax_support.html#支持属性设置与修改)。\n", + "\n", + "- 对自定义类对象以及第三方类型的属性进行设置与修改。\n", + "- 对Cell的self对象进行修改。\n", + "- 对静态图内的Cell对象以及jit_class对象进行设置与修改。\n", + "\n", + "### 支持求导\n", + "\n", + "使用JIT Fallback支持的静态图语法,同样支持其在求导中使用。更多使用可见[静态图语法支持](https://www.mindspore.cn/docs/zh-CN/master/model_train/program_form/static_graph_syntax/static_graph_syntax_support.html)中的[支持求导](https://www.mindspore.cn/docs/zh-CN/master/model_train/program_form/static_graph_syntax/static_graph_syntax_support.html#支持求导)。\n", + "\n", + "### Annotation Type\n", + "\n", + "对于运行时的JIT Fallback支持的语法,会产生一些无法被类型推导出的节点,这种类型称为`Any`类型。因为该类型无法在编译时推导出正确的类型,所以这种`Any`将会以一种默认最大精度`float64`进行运算,防止其精度丢失。为了能更好的优化相关性能,需要减少`Any`类型数据的产生。当用户可以明确知道当前通过扩展支持的语句会产生具体类型的时候,我们推荐使用`Annotation @jit.typing:`的方式进行指定对应Python语句类型,从而确定解释节点的类型避免`Any`类型的生成。更多使用可见[静态图语法支持](https://www.mindspore.cn/docs/zh-CN/master/model_train/program_form/static_graph_syntax/static_graph_syntax_support.html)中的[Annotation Type](https://www.mindspore.cn/docs/zh-CN/master/model_train/program_form/static_graph_syntax/static_graph_syntax_support.html#annotation-type)。\n", + "\n", + "### 使用须知\n", + "\n", + "在使用静态图JIT Fallback扩展支持语法时,请注意以下几点:\n", + "\n", + "1. 对标动态图的支持能力,即:须在动态图语法范围内,包括但不限于数据类型等。\n", + "\n", + "2. 在扩展静态图语法时,支持了更多的语法,但执行性能可能会受影响,不是最佳。\n", + "\n", + "3. 在扩展静态图语法时,支持了更多的语法,由于使用Python的能力,不能使用MindIR导入导出的能力。\n", + "\n", + "4. 暂不支持跨Python文件重复定义同名的全局变量,且这些全局变量在网络中会被用到。" + ], + "metadata": {}, + "attachments": {} + }, + { + "cell_type": "markdown", + "source": [ + "## 动态图转静态图技术\n", + "\n", + "MindSpore提供了一种在代码无需修改的情况下,直接将用户的动态图代码转换成静态图的功能——PIJit。该功能同时兼顾性能和易用性,去除动静模式切换的代价,真正做到动静统一。它基于Python字节码的分析,对Python的执行流进行图捕获,可以以静态图方式运行的子图便以静态图方式运行,Python语法不支持的子图便以动态图方式运行,同时通过修改调整字节码的方式链接静态图,达到动静混合执行。在满足易用性的前提下,尽可能地提高性能。\n", + "\n", + "### PIJit包含以下功能\n", + "\n", + "- 1. 图捕获:对字节码预处理,动态跟踪解释执行,识别MindSpore可入图操作,提供裂图功能保证函数(字节码)功能的正确性。\n", + "- 2. 字节码支持:当前支持Python3.7、Python3.8、Python3.9和Python3.10的字节码。\n", + "- 3. 图优化:对图中生成的字节码进行优化,包括分支裁剪、字节码筛选、函数字节码内联、常量折叠等功能。\n", + "- 4. 异常捕获机制:支持with、try-except语法。\n", + "- 5. 支持循环处理:通过模拟字节码的操作栈实现图捕获、裂图等特性。\n", + "- 6. UD分析:通过变量的user-def链分析的方法,解决部分参数类型不能作为静态图的返回值问题(函数、Bool、None),同时减少无用的入参,提高图的执行效率,减少数据的拷贝。\n", + "- 7. 副作用分析处理:弥补静态图的副作用处理上的劣势,根据不同场景,收集记录产生副作用的变量及字节码,在保证程序语义的基础上,在静态图外补充副作用的处理。\n", + "- 8. 守护门禁:门禁(Guard)记录了子图/优化进入的输入需要满足的条件,检查输入是否适合对应的子图优化。\n", + "- 9. Cache:图管理(Cache)则缓存了子图/优化和门禁(Guard)对应关系。\n", + "- 10. Dynamic Shape和Symbolic Shape: 使用input_signature支持Tensor/Tensor List/Tensor Tuple的DynamicShape和SymblicShape作为输入提示。同时支持自动多次运行后,识别Dynamic Shape。\n", + "- 11. 即时跟踪编译: 在跟踪和字节码分析过程中,支持算子等类型推导。\n", + "- 12. 自动混合精度: 支持原生mindspore.nn.Cell的自动混合精度能力。\n", + "\n", + "### 使用方式\n", + "\n", + "def jit(fn=None, input_signature=None, hash_args=None, jit_config=None, mode=\"PIJit\"):\n", + "\n", + "原Jit功能使用mode=\"PSJit\",新特性PIJit使用mode=\"PIJit\",jit_config传递一个参数字典,可以提供一些优化和调试选项。如:print_after_all可以打印入图的字节码和裂图信息,loop_unrolling可以提供循环展开功能,enable_dynamic_shape使能动态Shape。\n", + "\n", + "### 使用限制\n", + "\n", + "- 不支持在静态图模式下,运行带装饰@jit(mode=\\\"PIJit\\\")的函数,此时该装饰@jit(mode=\\\"PIJit\\\")视为无效。\n", + "- 不支持在@jit(mode=\\\"PSJit\\\")装饰的函数内部调用带装饰@jit(mode=\\\"PIJit\\\")的函数,该装饰 @jit(mode=\\\"PIJit\\\")视为无效。\n", + "\n" + ], + "metadata": {} + } + ], + "metadata": { + "kernelspec": { + "display_name": "MindSpore", + "language": "python", + "name": "mindspore" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 + } \ No newline at end of file diff --git a/docs/mindspore/source_zh_cn/model_train/program_form/pynative.ipynb b/docs/mindspore/source_zh_cn/model_train/program_form/pynative.ipynb new file mode 100644 index 0000000000..3d28da7277 --- /dev/null +++ b/docs/mindspore/source_zh_cn/model_train/program_form/pynative.ipynb @@ -0,0 +1,92 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "source": [ + "# 动态图编程\n", + "\n", + "[![下载Notebook](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_notebook.svg)](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/master/zh_cn/model_train/program_form/mindspore_pynative.ipynb) [![下载样例代码](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_download_code.svg)](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/master/zh_cn/model_train/program_form/mindspore_pynative.py) [![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_zh_cn/model_train/program_form/pynative.ipynb)\n", + "\n", + "在MindSpore中,动态图模式又被称为PyNative模式,可以通过`set_context(mode=PYNATIVE_MODE)`来设置成动态图模式。在脚本开发和网络流程调试中,推荐使用动态图模式进行调试,支持执行单算子、普通函数和网络、以及单独求梯度的操作。\n", + "\n", + "在PyNative模式下,用户可以使用完整的Python API,此外针对使用MindSpore提供的API时,框架会根据用户选择的硬件平台(Ascend,GPU,CPU),将算子API的操作在对应的硬件平台上执行,并返回相应的结果。框架整体的执行过程如下:\n", + "\n", + "![process](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/docs/mindspore/source_zh_cn/design/images/framework.png)\n", + "\n", + "通过前端的Python API,调用到框架层,最终到相应的硬件设备上进行计算。例如:完成一个加法。" + ], + "metadata": {} + }, + { + "cell_type": "code", + "execution_count": 2, + "source": [ + "import numpy as np\n", + "import mindspore as ms\n", + "import mindspore.ops as ops\n", + "\n", + "ms.set_context(mode=ms.PYNATIVE_MODE, device_target=\"CPU\")\n", + "x = ms.Tensor(np.ones([1, 3, 3, 4]).astype(np.float32))\n", + "y = ms.Tensor(np.ones([1, 3, 3, 4]).astype(np.float32))\n", + "output = ops.add(x, y)\n", + "print(output.asnumpy())" + ], + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "[[[[2. 2. 2. 2.]\n", + " [2. 2. 2. 2.]\n", + " [2. 2. 2. 2.]]\n", + "\n", + " [[2. 2. 2. 2.]\n", + " [2. 2. 2. 2.]\n", + " [2. 2. 2. 2.]]\n", + "\n", + " [[2. 2. 2. 2.]\n", + " [2. 2. 2. 2.]\n", + " [2. 2. 2. 2.]]]]\n" + ] + } + ], + "metadata": { + "ExecuteTime": { + "end_time": "2022-01-04T10:51:23.292278Z", + "start_time": "2022-01-04T10:51:23.284465Z" + } + } + }, + { + "cell_type": "markdown", + "source": [ + "此例中,当调用到Python接口ops.add(x, y)时,会将Python的接口调用通过Pybind11调用到框架的C++层,转换成C++的调用,接着框架会根据用户设置的device_target选择对应的硬件设备,在该硬件设备上执行add这个操作。\n", + "\n", + "从上述原理可以看到,在PyNative模式下,Python脚本代码会根据Python的语法进行执行,而执行过程中涉及到MindSpore的API,会根据用户设置在不同的硬件上进行执行,从而进行加速。因此,在PyNative模式下,用户可以随意使用Python的语法以及调试方法。例如可以使用常见的PyCharm、VS Code等IDE进行代码的调试。\n", + "\n" + ], + "metadata": {} + } + ], + "metadata": { + "kernelspec": { + "display_name": "MindSpore", + "language": "python", + "name": "mindspore" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 + } \ No newline at end of file diff --git a/docs/mindspore/source_zh_cn/model_train/program_form/static_graph.rst b/docs/mindspore/source_zh_cn/model_train/program_form/static_graph.rst new file mode 100644 index 0000000000..06aa65c3f1 --- /dev/null +++ b/docs/mindspore/source_zh_cn/model_train/program_form/static_graph.rst @@ -0,0 +1,1835 @@ +静态图编程 +=============== + +.. image:: https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_notebook.svg + :target: https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/master/zh_cn/model_train/program_form/static_graph_syntax/mindspore_static_graph_syntax_support.ipynb +.. image:: https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_download_code.svg + :target: https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/master/zh_cn/model_train/program_form/static_graph_syntax/mindspore_static_graph_syntax_support.py +.. image:: https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg + :target: https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_zh_cn/model_train/program_form/static_graph_syntax/static_graph_syntax_support.ipynb + :alt: 查看源文件 + +.. toctree:: + :maxdepth: 1 + :hidden: + + static_graph_syntax/operators + static_graph_syntax/statements + static_graph_syntax/python_builtin_functions + static_graph_syntax/static_graph_expert_programming.ipynb + +概述 +---- + +在Graph模式下,Python代码并不是由Python解释器去执行,而是将代码编译成静态计算图,然后执行静态计算图。 + +在静态图模式下,MindSpore通过源码转换的方式,将Python的源码转换成中间表达IR(Intermediate +Representation),并在此基础上对IR图进行优化,最终在硬件设备上执行优化后的图。MindSpore使用基于图表示的函数式IR,称为MindIR,详情可参考\ `中间表示MindIR `_\ 。 + +MindSpore的静态图执行过程实际包含两步,对应静态图的Define和Run阶段,但在实际使用中,在实例化的Cell对象被调用时用户并不会分别感知到这两阶段,MindSpore将两阶段均封装在Cell的\ ``__call__``\ 方法中,因此实际调用过程为: + +``model(inputs) = model.compile(inputs) + model.construct(inputs)``\ ,其中\ ``model``\ 为实例化Cell对象。 + +使用Graph模式有两种方式:一是调用\ ``@jit``\ 装饰器修饰函数或者类的成员方法,所修饰的函数或方法将会被编译成静态计算图。\ ``jit``\ 使用规则详见\ `jit +API文档 `_\ 。二是设置\ ``ms.set_context(mode=ms.GRAPH_MODE)``\ ,使用\ ``Cell``\ 类并且在\ ``construct``\ 函数中编写执行代码,此时\ ``construct``\ 函数的代码将会被编译成静态计算图。\ ``Cell``\ 定义详见\ `Cell +API文档 `_\ 。 + +由于语法解析的限制,当前在编译构图时,支持的数据类型、语法以及相关操作并没有完全与Python语法保持一致,部分使用受限。借鉴传统JIT编译的思路,从图模式的角度考虑动静图的统一,扩展图模式的语法能力,使得静态图提供接近动态图的语法使用体验,从而实现动静统一。为了便于用户选择是否扩展静态图语法,提供了JIT语法支持级别选项\ ``jit_syntax_level``\ ,其值必须在[STRICT,LAX]范围内,选择\ ``STRICT``\ 则认为使用基础语法,不扩展静态图语法。默认值为\ ``LAX``\ ,更多请参考本文的\ `扩展语法(LAX级别) <#扩展语法lax级别>`_\ 章节。全部级别都支持所有后端。 + +- STRICT: 仅支持基础语法,且执行性能最佳。可用于MindIR导入导出。 +- LAX: + 支持更多复杂语法,最大程度地兼容Python所有语法。由于存在可能无法导出的语法,不能用于MindIR导入导出。 + +本文主要介绍,在编译静态图时,支持的数据类型、语法以及相关操作,这些规则仅适用于Graph模式。 + +基础语法(STRICT级别) +---------------------- + +静态图内的常量与变量 +~~~~~~~~~~~~~~~~~~~~ + +在静态图中,常量与变量是理解静态图语法的一个重要概念,很多语法在常量输入和变量输入情况下支持的方法与程度是不同的。因此,在介绍静态图具体支持的语法之前,本小节先会对静态图中常量与变量的概念进行说明。 + +在静态图模式下,一段程序的运行会被分为编译期以及执行期。 +在编译期,程序会被编译成一张中间表示图,并且程序不会真正的执行,而是通过抽象推导的方式对中间表示进行静态解析。这使得在编译期时,我们无法保证能获取到所有中间表示中节点的值。 +常量和变量也就是通过能否能在编译器获取到其真实值来区分的。 + +- 常量: 编译期内可以获取到值的量。 +- 变量: 编译期内无法获取到值的量。 + +常量产生场景 +^^^^^^^^^^^^ + +- 作为图模式输入的标量,列表以及元组均为常量(在不使用mutable接口的情况下)。例如: + + .. code:: python + + from mindspore import Tensor, jit + + a = 1 + b = [Tensor([1]), Tensor([2])] + c = ["a", "b", "c"] + + @jit + def foo(a, b, c): + return a, b, c + + 上述代码中,输入\ ``a``\ ,\ ``b``\ ,\ ``c``\ 均为常量。 + +- 图模式内生成的标量或者Tensor为常量。例如: + + .. code:: python + + from mindspore import jit, Tensor + + @jit + def foo(): + a = 1 + b = "2" + c = Tensor([1, 2, 3]) + return a, b, c + + 上述代码中, ``a``\ ,\ ``b``\ ,\ ``c``\ 均为常量。 + +- 常量运算得到的结果为常量。例如: + + .. code:: python + + from mindspore import jit, Tensor + + @jit + def foo(): + a = Tensor([1, 2, 3]) + b = Tensor([1, 1, 1]) + c = a + b + return c + + 上述代码中,\ ``a``\ 、\ ``b``\ 均为图模式内产生的Tensor为常量,因此其计算得到的结果也是常量。但如果其中之一为变量时,其返回值也会为变量。 + +变量产生场景 +^^^^^^^^^^^^ + +- 所有mutable接口的返回值均为变量(无论是在图外使用mutable还是在图内使用)。例如: + + .. code:: python + + from mindspore import Tensor, jit + from mindspore import mutable + + a = mutable([Tensor([1]), Tensor([2])]) + + @jit + def foo(a): + b = mutable(Tensor([3])) + c = mutable((Tensor([1]), Tensor([2]))) + return a, b, c + + 上述代码中,\ ``a``\ 是在图外调用mutable接口的,\ ``b``\ 和\ ``c``\ 是在图内调用mutable接口生成的,\ ``a``\ 、\ ``b``\ 、\ ``c``\ 均为变量。 + +- 作为静态图的输入的Tensor都是变量。例如: + + .. code:: python + + from mindspore import Tensor, jit + + a = Tensor([1]) + b = (Tensor([1]), Tensor([2])) + + @jit + def foo(a, b): + return a, b + + 上述代码中,\ ``a``\ 是作为图模式输入的Tensor,因此其为变量。但\ ``b``\ 是作为图模式输入的元组,非Tensor类型,即使其内部的元素均为Tensor,\ ``b``\ 也是常量。 + +- 通过变量计算得到的是变量。 + + 如果一个量是算子的输出,那么其多数情况下为常量。例如: + + .. code:: python + + from mindspore import Tensor, jit, ops + + a = Tensor([1]) + b = Tensor([2]) + + @jit + def foo(a, b): + c = a + b + return c + + 在这种情况下,\ ``c``\ 是\ ``a``\ 和\ ``b``\ 计算来的结果,且用来计算的输入\ ``a``\ 、\ ``b``\ 均为变量,因此\ ``c``\ 也是变量。 + +数据类型 +~~~~~~~~ + +Python内置数据类型 +^^^^^^^^^^^^^^^^^^ + +当前支持的\ ``Python``\ 内置数据类型包括:\ ``Number``\ 、\ ``String``\ 、\ ``List``\ 、\ ``Tuple``\ 和\ ``Dictionary``\ 。 + +Number +'''''' + +支持\ ``int``\ (整型)、\ ``float``\ (浮点型)、\ ``bool``\ (布尔类型),不支持\ ``complex``\ (复数)。 + +支持在网络里定义\ ``Number``\ ,即支持语法:\ ``y = 1``\ 、\ ``y = 1.2``\ 、\ ``y = True``\ 。 + +当数据为常量时,编译时期可以获取到数值,在网络中可以支持强转\ ``Number``\ 的语法:\ ``y = int(x)``\ 、\ ``y = float(x)``\ 、\ ``y = bool(x)``\ 。 +当数据为变量时,即需要在运行时期才可以获取到数值,也支持使用int(),float(),bool()等内置函数\ `Python内置函数 `_\ 进行数据类型的转换。例如: + +.. code:: python + + from mindspore import Tensor, jit + + @jit + def foo(x): + out1 = int(11.1) + out2 = int(Tensor([10])) + out3 = int(x.asnumpy()) + return out1, out2, out3 + + res = foo(Tensor(2)) + print("res[0]:", res[0]) + print("res[1]:", res[1]) + print("res[2]:", res[2]) + +运行结果如下: + +.. code:: text + + res[0]: 11 + res[1]: 10 + res[2]: 2 + +支持返回Number类型。例如: + +.. code:: python + + import mindspore as ms + + @ms.jit + def test_return_scalar(x, y): + return x + y + + res = test_return_scalar(ms.mutable(1), ms.mutable(2)) + print(res) + +运行结果如下: + +.. code:: text + + 3 + +String +'''''' + +支持在网络里构造\ ``String``\ ,即支持使用引号(\ ``'``\ 或\ ``"``\ )来创建字符串,如\ ``x = 'abcd'``\ 或\ ``y = "efgh"``\ 。可以通过\ ``str()``\ 的方式进行将常量转换成字符串。支持对字符串连接,截取,以及使用成员运算符(\ ``in``\ 或\ ``not in``\ )判断字符串是否包含指定的字符。支持格式化字符串的输出,将一个值插入到一个有字符串格式符\ ``%s``\ 的字符串中。支持在常量场景下使用格式化字符串函数\ ``str.format()``\ 。 + +例如: + +.. code:: python + + from mindspore import jit + + @jit + def foo(): + var1 = 'Hello!' + var2 = "MindSpore" + var3 = str(123) + var4 = "{} is {}".format("string", var3) + return var1[0], var2[4:9], var1 + var2, var2 * 2, "H" in var1, "My name is %s!" % var2, var4 + + res = foo() + print("res:", res) + +运行结果如下: + +.. code:: text + + res: ('H', 'Spore', 'Hello!MindSpore', 'MindSporeMindSpore', True, 'My name is MindSpore!', 'string is 123') + +List +'''' + +在\ ``JIT_SYNTAX_LEVEL``\ 设置为\ ``LAX``\ 的情况下,静态图模式可以支持部分\ ``List``\ 对象的inplace操作,具体介绍详见\ `支持列表就地修改操作 <#支持列表就地修改操作>`_\ 章节。 + +``List``\ 的基础使用场景如下: + +- 图模式支持图内创建\ ``List``\ 。 + + 支持在图模式内创建\ ``List``\ 对象,且\ ``List``\ 内对象的元素可以包含任意图模式支持的类型,也支持多层嵌套。例如: + + .. code:: python + + import numpy as np + import mindspore as ms + + @ms.jit + def generate_list(): + a = [1, 2, 3, 4] + b = ["1", "2", "a"] + c = [ms.Tensor([1]), ms.Tensor([2])] + d = [a, b, c, (4, 5)] + return d + + 上述示例代码中,所有的\ ``List``\ 对象都可以被正常的创建。 + +- 图模式支持返回\ ``List``\ 。 + + 在MindSpore2.0版本之前,当图模式返回\ ``List`` + 对象时,\ ``List``\ 会被转换为\ ``Tuple``\ 。MindSpore2.0版本已经可以支持返回\ ``List``\ 对象。例如: + + .. code:: python + + import mindspore as ms + + @ms.jit + def list_func(): + a = [1, 2, 3, 4] + return a + + output = list_func() # output: [1, 2, 3, 4] + + 与图模式内创建\ ``List`` + 相同,图模式返回\ ``List``\ 对象可以包括任意图模式支持的类型,也支持多层嵌套。 + +- 图模式支持从全局变量中获取\ ``List``\ 对象。 + + .. code:: python + + import mindspore as ms + + global_list = [1, 2, 3, 4] + + @ms.jit + def list_func(): + global_list.reverse() + return global_list + + output = list_func() # output: [4, 3, 2, 1] + + 需要注意的是,在基础场景下图模式返回的列表与全局变量的列表不是同一个对象,当\ ``JIT_SYNTAX_LEVEL``\ 设置为\ ``LAX``\ 时,返回的对象与全局对象为统一对象。 + +- 图模式支持以\ ``List``\ 作为输入。 + + 图模式支持\ ``List``\ 作为静态图的输入,作为输入的\ ``List``\ 对象的元素必须为图模式支持的输入类型,也支持多层嵌套。 + + .. code:: python + + import mindspore as ms + + list_input = [1, 2, 3, 4] + + @ms.jit + def list_func(x): + return x + + output = list_func(list_input) # output: [1, 2, 3, 4] + + 需要注意的是,\ ``List``\ 作为静态图输入时,无论其内部的元素是什么类型,一律被视为常量。 + +- 图模式支持List的内置方法。 + + ``List`` 内置方法的详细介绍如下: + + - List索引取值 + + 基础语法:\ ``element = list_object[index]``\ 。 + + 基础语义:将\ ``List``\ 对象中位于第\ ``index``\ 位的元素提取出来(\ ``index``\ 从0开始)。支持多层索引取值。 + + 索引值\ ``index``\ 支持类型包括\ ``int``\ ,\ ``Tensor``\ 和\ ``slice``\ 。其中,\ ``int``\ 以及\ ``Tensor``\ 类型的输入可以支持常量以及变量,\ ``slice``\ 内部数据必须为编译时能够确定的常量。 + + 示例如下: + + .. code:: python + + import mindspore as ms + @ms.jit() + def list_getitem_func(): + x = [[1, 2], 3, 4] + a = x[0] + b = x[0][ms.Tensor([1])] + c = x[1:3:1] + return a, b, c + + a, b, c = list_getitem_func() + print('a:{}'.format(a)) + print('b:{}'.format(b)) + print('c:{}'.format(c)) + + 运行结果如下: + + .. code:: text + + a:[1, 2] + b:2 + c:[3, 4] + + - List索引赋值 + + 基础语法:\ ``list_object[index] = target_element``\ 。 + + 基础语义:将\ ``List``\ 对象中位于第\ ``index``\ 位的元素赋值为 + ``target_element``\ (\ ``index``\ 从0开始)。支持多层索引赋值。 + + 索引值\ ``index``\ 支持类型包括\ ``int``\ ,\ ``Tensor``\ 和\ ``slice``\ 。其中,\ ``int`` + 以及\ ``Tensor``\ 类型的输入可以支持常量以及变量,\ ``slice``\ 内部数据必须为编译时能够确定的常量。 + + 索引赋值对象\ ``target_element``\ 支持所有图模式支持的数据类型。 + + 目前,\ ``List``\ 索引赋值不支持inplace操作, + 索引赋值后将会生成一个新的对象。该操作后续将会支持inplace操作。 + + 示例如下: + + .. code:: python + + import mindspore as ms + + @ms.jit() + def test_setitem_func(): + x = [[0, 1], 2, 3, 4] + x[1] = 10 + x[2] = "ok" + x[3] = (1, 2, 3) + x[0][1] = 88 + return x + + output = test_setitem_func() + print('output:{}'.format(output)) + + 运行结果如下: + + .. code:: text + + output:[[0, 88], 10, 'ok', (1, 2, 3)] + + - List.append + + 基础语法:\ ``list_object.append(target_element)``\ 。 + + 基础语义:向\ ``List``\ 对象\ ``list_object``\ 的最后追加元素\ ``target_element``\ 。 + + 目前,\ ``List.append``\ 不支持inplace操作, + 索引赋值后将会生成一个新的对象。该操作后续将会支持inplace操作。 + + 示例如下: + + .. code:: python + + import mindspore as ms + + @ms.jit() + def test_list(): + x = [1, 2, 3] + x.append(4) + return x + + x = test_list() + print('x:{}'.format(x)) + + 运行结果如下: + + .. code:: text + + x:[1, 2, 3, 4] + + - List.clear + + 基础语法:\ ``list_object.clear()``\ 。 + + 基础语义:清空\ ``List``\ 对象 ``list_object``\ 中包含的元素。 + + 目前,\ ``List.clear``\ 不支持inplace, + 索引赋值后将会生成一个新的对象。该操作后续将会支持inplace。 + + 示例如下: + + .. code:: python + + import mindspore as ms + + @ms.jit() + def test_list_clear(): + x = [1, 3, 4] + x.clear() + return x + + x = test_list_clear() + print('x:{}'.format(x)) + + 运行结果如下: + + .. code:: text + + x:[] + + - List.extend + + 基础语法:\ ``list_object.extend(target)``\ 。 + + 基础语义:向\ ``List``\ 对象\ ``list_object``\ 的最后依次插入\ ``target``\ 内的所有元素。 + + ``target``\ 支持的类型为\ ``Tuple``\ ,\ ``List``\ 以及\ ``Tensor``\ 。其中,如果\ ``target``\ 类型为\ ``Tensor``\ 的情况下,会先将该\ ``Tensor``\ 转换为\ ``List``\ ,再进行插入操作。 + + 示例如下: + + .. code:: python + + import mindspore as ms + + @ms.jit() + def test_list_extend(): + x1 = [1, 2, 3] + x1.extend((4, "a")) + x2 = [1, 2, 3] + x2.extend(ms.Tensor([4, 5])) + return x1, x2 + + output1, output2 = test_list_extend() + print('output1:{}'.format(output1)) + print('output2:{}'.format(output2)) + + 运行结果如下: + + .. code:: text + + output1:[1, 2, 3, 4, 'a'] + output2:[1, 2, 3, Tensor(shape=[], dtype=Int64, value= 4), Tensor(shape=[], dtype=Int64, value= 5)] + + - List.pop + + 基础语法:\ ``pop_element = list_object.pop(index=-1)``\ 。 + + 基础语义:将\ ``List``\ 对象\ ``list_object`` + 的第\ ``index``\ 个元素从\ ``list_object``\ 中删除,并返回该元素。 + + ``index`` 要求必须为常量\ ``int``, + 当\ ``list_object``\ 的长度为\ ``list_obj_size``\ 时,\ ``index``\ 的取值范围为:\ ``[-list_obj_size,list_obj_size-1]``\ 。\ ``index``\ 为负数,代表从后往前的位数。当没有输入\ ``index``\ 时,默认值为-1,即删除最后一个元素。 + + .. code:: python + + import mindspore as ms + + @ms.jit() + def test_list_pop(): + x = [1, 2, 3] + b = x.pop() + return b, x + + pop_element, res_list = test_list_pop() + print('pop_element:{}'.format(pop_element)) + print('res_list:{}'.format(res_list)) + + 运行结果如下: + + .. code:: text + + pop_element:3 + res_list:[1, 2] + + - List.reverse + + 基础语法:\ ``list_object.reverse()``\ 。 + + 基础语义:将\ ``List``\ 对象\ ``list_object``\ 的元素顺序倒转。 + + 示例如下: + + .. code:: python + + import mindspore as ms + + @ms.jit() + def test_list_reverse(): + x = [1, 2, 3] + x.reverse() + return x + + output = test_list_reverse() + print('output:{}'.format(output)) + + 运行结果如下: + + .. code:: text + + output:[3, 2, 1] + + - List.insert + + 基础语法:\ ``list_object.insert(index, target_obj)``\ 。 + + 基础语义:将\ ``target_obj``\ 插入到\ ``list_object``\ 的第\ ``index``\ 位。 + + ``index``\ 要求必须为常量\ ``int``\ 。如果\ ``list_object``\ 的长度为\ ``list_obj_size``\ 。当\ ``index < -list_obj_size``\ 时,插入到\ ``List``\ 的第一位。当\ ``index >= list_obj_size``\ 时,插入到\ ``List``\ 的最后。\ ``index``\ 为负数代表从后往前的位数。 + + 示例如下: + + .. code:: python + + import mindspore as ms + + @ms.jit() + def test_list_insert(): + x = [1, 2, 3] + x.insert(3, 4) + return x + + output = test_list_insert() + print('output:{}'.format(output)) + + 运行结果如下: + + .. code:: text + + output:[1, 2, 3, 4] + +Tuple +''''' + +支持在网络里构造元组\ ``Tuple``\ ,使用小括号包含元素,即支持语法\ ``y = (1, 2, 3)``\ 。元组\ ``Tuple``\ 的元素不能修改,但支持索引访问元组\ ``Tuple``\ 中的元素,支持对元组进行连接组合。 + +- 支持索引取值。 + + 支持使用方括号加下标索引的形式来访问元组\ ``Tuple``\ 中的元素,索引值支持\ ``int``\ 、\ ``slice``\ 、\ ``Tensor``\ ,也支持多层索引取值,即支持语法\ ``data = tuple_x[index0][index1]...``\ 。 + + 索引值为\ ``Tensor``\ 有如下限制: + + - ``Tuple``\ 里存放的都是\ ``Cell``\ ,每个\ ``Cell``\ 要在\ ``Tuple``\ 定义之前完成定义,每个\ ``Cell``\ 的入参个数、入参类型和入参\ ``shape``\ 要求一致,每个\ ``Cell``\ 的输出个数、输出类型和输出\ ``shape``\ 也要求一致。 + + - 索引\ ``Tensor``\ 是一个\ ``dtype``\ 为\ ``int32``\ 的标量\ ``Tensor``\ ,取值范围在\ ``[-tuple_len, tuple_len)``\ ,\ ``Ascend``\ 后端不支持负数索引。 + + - 支持\ ``CPU``\ 、\ ``GPU``\ 和\ ``Ascend``\ 后端。 + + ``int``\ 、\ ``slice``\ 索引示例如下: + + .. code:: python + + import numpy as np + import mindspore as ms + + t = ms.Tensor(np.array([1, 2, 3])) + + @ms.jit() + def test_index(): + x = (1, (2, 3, 4), 3, 4, t) + y = x[1][1] + z = x[4] + m = x[1:4] + n = x[-4] + return y, z, m, n + + y, z, m, n = test_index() + print('y:{}'.format(y)) + print('z:{}'.format(z)) + print('m:{}'.format(m)) + print('n:{}'.format(n)) + + 运行结果如下: + + .. code:: text + + y:3 + z:[1 2 3] + m:((2, 3, 4), 3, 4) + n:(2, 3, 4) + + ``Tensor``\ 索引示例如下: + + .. code:: python + + import mindspore as ms + from mindspore import nn, set_context + + set_context(mode=ms.GRAPH_MODE) + + class Net(nn.Cell): + def __init__(self): + super(Net, self).__init__() + self.relu = nn.ReLU() + self.softmax = nn.Softmax() + self.layers = (self.relu, self.softmax) + + def construct(self, x, index): + ret = self.layers[index](x) + return ret + + x = ms.Tensor([-1.0], ms.float32) + + net = Net() + ret = net(x, 0) + print('ret:{}'.format(ret)) + + 运行结果如下: + + .. code:: text + + ret:[0.] + +- 支持连接组合。 + + 与字符串\ ``String``\ 类似,元组支持使用\ ``+``\ 和\ ``*``\ 进行组合,得到一个新的元组\ ``Tuple``\ ,例如: + + .. code:: python + + import mindspore as ms + + @ms.jit() + def test_index(): + x = (1, 2, 3) + y = (4, 5, 6) + return x + y, x * 2 + + out1, out2 = test_index() + print('out1:{}'.format(out1)) + print('out2:{}'.format(out2)) + + 运行结果如下: + + .. code:: text + + out1:(1, 2, 3, 4, 5, 6) + out2:(1, 2, 3, 1, 2, 3) + +Dictionary +'''''''''' + +支持在网络里构造字典\ ``Dictionary``\ ,每个键值\ ``key:value``\ 用冒号\ ``:``\ 分割,每个键值对之间用逗号\ ``,``\ 分割,整个字典使用大括号\ ``{}``\ 包含键值对,即支持语法\ ``y = {"a": 1, "b": 2}``\ 。 + +键\ ``key``\ 是唯一的,如果字典中存在多个相同的\ ``key``\ ,则重复的\ ``key``\ 以最后一个作为最终结果;而值\ ``value``\ 可以不是唯一的。键\ ``key``\ 需要保证是不可变的。当前键\ ``key``\ 支持\ ``String``\ 、\ ``Number``\ 、常量\ ``Tensor``\ 以及只包含这些类型对象的\ ``Tuple``\ ;值\ ``value``\ 支持\ ``Number``\ 、\ ``Tuple``\ 、\ ``Tensor``\ 、\ ``List``\ 、\ ``Dictionary``\ 和\ ``None``\ 。 + +- 支持接口。 + + ``keys``\ :取出\ ``dict``\ 里所有的\ ``key``\ 值,组成\ ``Tuple``\ 返回。 + + ``values``\ :取出\ ``dict``\ 里所有的\ ``value``\ 值,组成\ ``Tuple``\ 返回。 + + ``items``\ :取出\ ``dict``\ 里每一对\ ``key``\ 和\ ``value``\ 组成的\ ``Tuple``\ ,最终组成\ ``List``\ 返回。 + + ``get``\ :\ ``dict.get(key[, value])``\ 返回指定\ ``key``\ 对应的\ ``value``\ 值,如果指定\ ``key``\ 不存在,返回默认值\ ``None``\ 或者设置的默认值\ ``value``\ 。 + + ``clear``\ :删除\ ``dict``\ 里所有的元素。 + + ``has_key``\ :\ ``dict.has_key(key)``\ 判断\ ``dict``\ 里是否存在指定\ ``key``\ 。 + + ``update``\ :\ ``dict1.update(dict2)``\ 把\ ``dict2``\ 中的元素更新到\ ``dict1``\ 中。 + + ``fromkeys``\ :\ ``dict.fromkeys(seq([, value]))``\ 用于创建新的\ ``Dictionary``\ ,以序列\ ``seq``\ 中的元素做\ ``Dictionary``\ 的\ ``key``\ ,\ ``value``\ 为所有\ ``key``\ 对应的初始值。 + + 示例如下,其中返回值中的\ ``x``\ 和\ ``new_dict``\ 是一个\ ``Dictionary``\ ,在图模式JIT语法支持级别选项为LAX下扩展支持,更多Dictionary的高阶使用请参考本文的\ `支持Dictionary的高阶用法 <#支持dictionary的高阶用法>`_\ 章节。 + + .. code:: python + + import mindspore as ms + import numpy as np + + x = {"a": ms.Tensor(np.array([1, 2, 3])), "b": ms.Tensor(np.array([4, 5, 6])), "c": ms.Tensor(np.array([7, 8, 9]))} + + @ms.jit() + def test_dict(): + x_keys = x.keys() + x_values = x.values() + x_items = x.items() + value_a = x.get("a") + check_key = x.has_key("a") + y = {"a": ms.Tensor(np.array([0, 0, 0]))} + x.update(y) + new_dict = x.fromkeys("abcd", 123) + return x_keys, x_values, x_items, value_a, check_key, x, new_dict + + x_keys, x_values, x_items, value_a, check_key, new_x, new_dict = test_dict() + print('x_keys:{}'.format(x_keys)) + print('x_values:{}'.format(x_values)) + print('x_items:{}'.format(x_items)) + print('value_a:{}'.format(value_a)) + print('check_key:{}'.format(check_key)) + print('new_x:{}'.format(new_x)) + print('new_dict:{}'.format(new_dict)) + + 运行结果如下: + + .. code:: text + + x_keys:('a', 'b', 'c') + x_values:(Tensor(shape=[3], dtype=Int64, value= [1, 2, 3]), Tensor(shape=[3], dtype=Int64, value= [4, 5, 6]), Tensor(shape=[3], dtype=Int64, value= [7, 8, 9])) + x_items:[('a', Tensor(shape=[3], dtype=Int64, value= [1, 2, 3])), ('b', Tensor(shape=[3], dtype=Int64, value= [4, 5, 6])), ('c', Tensor(shape=[3], dtype=Int64, value= [7, 8, 9]))] + value_a:[1 2 3] + check_key:True + new_x:{'a': Tensor(shape=[3], dtype=Int64, value= [0, 0, 0]), 'b': Tensor(shape=[3], dtype=Int64, value= [4, 5, 6]), 'c': Tensor(shape=[3], dtype=Int64, value= [7, 8, 9])} + new_dict:{'a': 123, 'b': 123, 'c': 123, 'd': 123} + +MindSpore自定义数据类型 +^^^^^^^^^^^^^^^^^^^^^^^ + +当前MindSpore自定义数据类型包括:\ ``Tensor``\ 、\ ``Primitive``\ 、\ ``Cell``\ 和\ ``Parameter``\ 。 + +Tensor +'''''' + +Tensor的属性与接口详见\ `Tensor +API文档 `_\ 。 + +支持在静态图模式下创建和使用Tensor。创建方式有使用\ `tensor函数接口 `_\ 和使用\ ``Tensor``\ 类接口。推荐使用tensor函数接口,用户可以使用指定所需要的dtype类型。代码用例如下。 + +.. code:: python + + import mindspore as ms + import mindspore.nn as nn + + class Net(nn.Cell): + def __init__(self): + super(Net, self).__init__() + + @ms.jit + def construct(self, x): + return ms.tensor(x.asnumpy(), dtype=ms.float32) + + ms.set_context(mode=ms.GRAPH_MODE) + net = Net() + x = ms.Tensor(1, dtype=ms.int32) + print(net(x)) + +运行结果如下: + +.. code:: text + + 1.0 + +Primitive +''''''''' + +当前支持在construct里构造\ ``Primitive``\ 及其子类的实例。 + +但在调用时,参数只能通过位置参数方式传入,不支持通过键值对方式传入。 + +示例如下: + +.. code:: python + + import mindspore as ms + from mindspore import nn, ops, Tensor, set_context + import numpy as np + + set_context(mode=ms.GRAPH_MODE) + + class Net(nn.Cell): + def __init__(self): + super().__init__() + + def construct(self, x): + reduce_sum = ops.ReduceSum(True) #支持在construct里构造`Primitive`及其子类的实例 + ret = reduce_sum(x, axis=2) + return ret + + x = Tensor(np.random.randn(3, 4, 5, 6).astype(np.float32)) + net = Net() + ret = net(x) + print('ret.shape:{}'.format(ret.shape)) + +上面所定义的网络里,reduce_sum(x, +axis=2)的参数不支持通过键值对方式传入,只能通过位置参数方式传入,即reduce_sum(x, +2)。 + +结果报错如下: + +.. code:: text + + ValueError: For 'ReduceSum', the second input type should be tensor or scalar, but got invalid abstract type:AbstractKeywordArg. + +当前不支持在网络调用\ ``Primitive``\ 及其子类相关属性和接口。 + +当前已定义的\ ``Primitive``\ 详见\ `Primitive +API文档 `_\ 。 + +Cell +'''' + +当前支持在网络里构造\ ``Cell``\ 及其子类的实例,即支持语法\ ``cell = Cell(args...)``\ 。 + +但在调用时,参数只能通过位置参数方式传入,不支持通过键值对方式传入,即不支持在语法\ ``cell = Cell(arg_name=value)``\ 。 + +当前不支持在网络调用\ ``Cell``\ 及其子类相关属性和接口,除非是在\ ``Cell``\ 自己的\ ``construct``\ 中通过\ ``self``\ 调用。 + +``Cell``\ 定义详见\ `Cell +API文档 `_\ 。 + +Parameter +''''''''' + +``Parameter``\ 是变量张量,代表在训练网络时,需要被更新的参数。 + +``Parameter``\ 的定义和使用详见\ `Parameter +API文档 `_\ 。 + +运算符 +~~~~~~ + +算术运算符和赋值运算符支持\ ``Number``\ 和\ ``Tensor``\ 运算,也支持不同\ ``dtype``\ 的\ ``Tensor``\ 运算。详见\ `运算符 `_\ 。 + +原型 +~~~~ + +原型代表编程语言中最紧密绑定的操作。 + +属性引用与修改 +^^^^^^^^^^^^^^ + +属性引用是后面带有一个句点加一个名称的原型。 + +在MindSpore的Cell 实例中使用属性引用作为左值需满足如下要求: + +- 被修改的属性属于本\ ``cell``\ 对象,即必须为\ ``self.xxx``\ 。 +- 该属性在Cell的\ ``__init__``\ 函数中完成初始化且其为Parameter类型。 + +在JIT语法支持级别选项为\ ``LAX``\ 时,可以支持更多情况的属性修改,具体详见\ `支持属性设置与修改 <#支持属性设置与修改>`_\ 。 + +示例如下: + +.. code:: python + + import mindspore as ms + from mindspore import nn, set_context + + set_context(mode=ms.GRAPH_MODE) + + class Net(nn.Cell): + def __init__(self): + super().__init__() + self.weight = ms.Parameter(ms.Tensor(3, ms.float32), name="w") + self.m = 2 + + def construct(self, x, y): + self.weight = x # 满足条件可以修改 + # self.m = 3 # self.m 非Parameter类型禁止修改 + # y.weight = x # y不是self,禁止修改 + return x + + net = Net() + ret = net(1, 2) + print('ret:{}'.format(ret)) + +运行结果如下: + +.. code:: text + + ret:1 + +索引取值 +^^^^^^^^ + +对序列\ ``Tuple``\ 、\ ``List``\ 、\ ``Dictionary``\ 、\ ``Tensor``\ 的索引取值操作(Python称为抽取)。 + +``Tuple``\ 的索引取值请参考本文的\ `Tuple <#tuple>`_\ 章节。 + +``List``\ 的索引取值请参考本文的\ `List <#list>`_\ 章节。 + +``Dictionary``\ 的索引取值请参考本文的\ `Dictionary <#dictionary>`_\ 章节。 + +``Tensor``\ 的索引取详见\ `Tensor +索引取值文档 `_\ 。 + +调用 +^^^^ + +所谓调用就是附带可能为空的一系列参数来执行一个可调用对象(例如:\ ``Cell``\ 、\ ``Primitive``)。 + +示例如下: + +.. code:: python + + import mindspore as ms + from mindspore import nn, ops, set_context + import numpy as np + + set_context(mode=ms.GRAPH_MODE) + + class Net(nn.Cell): + def __init__(self): + super().__init__() + self.matmul = ops.MatMul() + + def construct(self, x, y): + out = self.matmul(x, y) # Primitive调用 + return out + + x = ms.Tensor(np.ones(shape=[1, 3]), ms.float32) + y = ms.Tensor(np.ones(shape=[3, 4]), ms.float32) + net = Net() + ret = net(x, y) + print('ret:{}'.format(ret)) + +运行结果如下: + +.. code:: text + + ret:[[3. 3. 3. 3.]] + +语句 +~~~~ + +当前静态图模式支持部分Python语句,包括raise语句、assert语句、pass语句、return语句、break语句、continue语句、if语句、for语句、while语句、with语句、列表生成式、生成器表达式、函数定义语句等,详见\ `Python语句 `_\ 。 + +Python内置函数 +~~~~~~~~~~~~~~ + +当前静态图模式支持部分Python内置函数,其使用方法与对应的Python内置函数类似,详见\ `Python内置函数 `_\ 。 + +网络定义 +~~~~~~~~ + +网络入参 +^^^^^^^^ + +在对整网入参求梯度的时候,会忽略非\ ``Tensor``\ 的入参,只计算\ ``Tensor``\ 入参的梯度。 + +示例如下。整网入参\ ``(x, y, z)``\ 中,\ ``x``\ 和\ ``z``\ 是\ ``Tensor``\ ,\ ``y``\ 是非\ ``Tensor``\ 。因此,\ ``grad_net``\ 在对整网入参\ ``(x, y, z)``\ 求梯度的时候,会自动忽略\ ``y``\ 的梯度,只计算\ ``x``\ 和\ ``z``\ 的梯度,返回\ ``(grad_x, grad_z)``\ 。 + +.. code:: python + + import numpy as np + import mindspore as ms + from mindspore import nn + + ms.set_context(mode=ms.GRAPH_MODE) + + class Net(nn.Cell): + def __init__(self): + super(Net, self).__init__() + + def construct(self, x, y, z): + return x + y + z + + class GradNet(nn.Cell): + def __init__(self, net): + super(GradNet, self).__init__() + self.forward_net = net + + def construct(self, x, y, z): + return ms.grad(self.forward_net, grad_position=(0, 1, 2))(x, y, z) + + input_x = ms.Tensor([1]) + input_y = 2 + input_z = ms.Tensor([3]) + + net = Net() + grad_net = GradNet(net) + ret = grad_net(input_x, input_y, input_z) + print('ret:{}'.format(ret)) + +运行结果如下: + +.. code:: text + + ret:(Tensor(shape=[1], dtype=Int64, value= [1]), Tensor(shape=[1], dtype=Int64, value= [1])) + +基础语法的语法约束 +------------------ + +图模式下的执行图是从源码转换而来,并不是所有的Python语法都能支持。下面介绍在基础语法下存在的一些语法约束。更多网络编译问题可见\ `网络编译 `_\ 。 + +1. 当\ ``construct``\ 函数里,使用未定义的类成员时,将抛出\ ``AttributeError``\ 异常。示例如下: + + .. code:: python + + import mindspore as ms + from mindspore import nn, set_context + + set_context(mode=ms.GRAPH_MODE) + + class Net(nn.Cell): + def __init__(self): + super(Net, self).__init__() + + def construct(self, x): + return x + self.y + + net = Net() + net(1) + + 结果报错如下: + + .. code:: text + + AttributeError: External object has no attribute y + +2. ``nn.Cell``\ 不支持\ ``classmethod``\ 修饰的类方法。示例如下: + + .. code:: python + + import mindspore as ms + + ms.set_context(mode=ms.GRAPH_MODE) + + class Net(ms.nn.Cell): + @classmethod + def func(cls, x, y): + return x + y + + def construct(self, x, y): + return self.func(x, y) + + net = Net() + out = net(ms.Tensor(1), ms.Tensor(2)) + print(out) + + 结果报错如下: + + .. code:: text + + TypeError: The parameters number of the function is 3, but the number + of provided arguments is 2. + +3. 在图模式下,有些Python语法难以转换成图模式下的\ `中间表示MindIR `_\ 。对标Python的关键字,存在部分关键字在图模式下是不支持的:AsyncFunctionDef、Delete、AnnAssign、AsyncFor、AsyncWith、Match、Try、Import、ImportFrom、Nonlocal、NamedExpr、Set、SetComp、Await、Yield、YieldFrom、Starred。如果在图模式下使用相关的语法,将会有相应的报错信息提醒用户。 + + 如果使用Try语句,示例如下: + + .. code:: python + + import mindspore as ms + + @ms.jit + def test_try_except(x, y): + global_out = 1 + try: + global_out = x / y + except ZeroDivisionError: + print("division by zero, y is zero.") + return global_out + + test_try_except_out = test_try_except(1, 0) + print("out:", test_try_except_out) + + 结果报错如下: + + .. code:: text + + RuntimeError: Unsupported statement 'Try'. + +4. 对标Python内置数据类型,除去当前图模式下支持的\ `Python内置数据类型 <#python内置数据类型>`_\ ,复数\ ``complex``\ 和集合\ ``set``\ 类型是不支持的。列表\ ``list``\ 和字典\ ``dictionary``\ 的一些高阶用法在基础语法场景下是不支持的,需要在JIT语法支持级别选项\ ``jit_syntax_level``\ 为\ ``LAX``\ 时才支持,更多请参考本文的\ `扩展语法(LAX级别) <#扩展语法lax级别>`_\ 章节。 + +5. 对标Python的内置函数,在基础语法场景下,除去当前图模式下支持的\ `Python内置函数 `_\ ,仍存在部分内置函数在图模式下是不支持的,例如:basestring、bin、bytearray、callable、chr、cmp、compile、 + delattr、dir、divmod、eval、execfile、file、frozenset、hash、hex、id、input、issubclass、iter、locals、long、memoryview、next、object、oct、open、ord、property、raw_input、reduce、reload、repr、reverse、set、slice、sorted、unichr、unicode、vars、xrange、\__import\_\_。 + +6. Python提供了很多第三方库,通常需要通过import语句调用。在图模式下JIT语法支持级别为STRICT时,不能直接使用第三方库。如果需要在图模式下使用第三方库的数据类型或者调用第三方库的方法,需要在JIT语法支持级别选项\ ``jit_syntax_level``\ 为\ ``LAX``\ 时才支持,更多请参考本文的\ `扩展语法(LAX级别) <#扩展语法lax级别>`_\ 中的\ `调用第三方库 <#调用第三方库>`_\ 章节。 + +7. 在图模式下,不感知在图外对类的属性的修改,即图外对类的属性修改不会生效。例如: + + .. code:: python + + import mindspore as ms + from mindspore import nn, ops, Tensor, context + + class Net(nn.Cell): + def __init__(self): + super().__init__() + self.len = 1 + + def construct(self, inputs): + x = inputs + self.len + return x + + context.set_context(mode=ms.GRAPH_MODE) + inputs = 2 + net = Net() + print("out1:", net(inputs)) + net.len = 2 + print("out2:", net(inputs)) + + 输出的结果将不会发生变化: + + .. code:: text + + out1: 3 + out2: 3 + +扩展语法(LAX级别) +------------------- + +下面主要介绍当前扩展支持的静态图语法。 + +调用第三方库 +~~~~~~~~~~~~ + +- 第三方库 + + 1. Python内置模块和Python标准库。例如\ ``os``\ 、\ ``sys``\ 、\ ``math``\ 、\ ``time``\ 等模块。 + + 2. 第三方代码库。路径在Python安装目录的\ ``site-packages``\ 目录下,需要先安装后导入,例如\ ``NumPy``\ 、\ ``SciPy``\ 等。需要注意的是,\ ``mindyolo``\ 、\ ``mindflow``\ 等MindSpore套件不被视作第三方库,具体列表可以参考\ `parser `_\ 文件的 + ``_modules_from_mindspore`` 列表。 + + 3. 通过环境变量\ ``MS_JIT_IGNORE_MODULES``\ 指定的模块。与之相对的有环境变量\ ``MS_JIT_MODULES``\ ,具体使用方法请参考\ `环境变量 `_\ 。 + +- 支持第三方库的数据类型,允许调用和返回第三方库的对象。 + + 示例如下: + + .. code:: python + + import numpy as np + import mindspore as ms + + @ms.jit + def func(): + a = np.array([1, 2, 3]) + b = np.array([4, 5, 6]) + out = a + b + return out + + print(func()) + + 运行结果如下: + + .. code:: text + + [5 7 9] + +- 支持调用第三方库的方法。 + + 示例如下: + + .. code:: python + + from scipy import linalg + import mindspore as ms + + @ms.jit + def func(): + x = [[1, 2], [3, 4]] + return linalg.qr(x) + + out = func() + print(out[0].shape) + + 运行结果如下: + + .. code:: text + + (2, 2) + +- 支持使用NumPy第三方库数据类型创建Tensor对象。 + + 示例如下: + + .. code:: python + + import numpy as np + import mindspore as ms + + @ms.jit + def func(): + x = np.array([1, 2, 3]) + out = ms.Tensor(x) + 1 + return out + + print(func()) + + 运行结果如下: + + .. code:: text + + [2 3 4] + +- 暂不支持对第三方库数据类型的下标索引赋值。 + + 示例如下: + + .. code:: python + + import numpy as np + import mindspore as ms + + @ms.jit + def func(): + x = np.array([1, 2, 3]) + x[0] += 1 + return ms.Tensor(x) + + res = func() + print("res: ", res) + + 报错信息如下: + + .. code:: text + + RuntimeError: For operation 'setitem', current input arguments types + are . The 1-th argument type 'External' is + not supported now. + +支持自定义类的使用 +~~~~~~~~~~~~~~~~~~ + +支持在图模式下使用用户自定义的类,可以对类进行实例化,使用对象的属性及方法。 + +例如下面的例子,其中\ ``GetattrClass``\ 是用户自定义的类,没有使用\ ``@jit_class``\ 修饰,也没有继承\ ``nn.Cell``\ 。 + +.. code:: python + + import mindspore as ms + + ms.set_context(mode=ms.GRAPH_MODE) + + class GetattrClass(): + def __init__(self): + self.attr1 = 99 + self.attr2 = 1 + + def method1(self, x): + return x + self.attr2 + + class GetattrClassNet(ms.nn.Cell): + def __init__(self): + super(GetattrClassNet, self).__init__() + self.cls = GetattrClass() + + def construct(self): + return self.cls.method1(self.cls.attr1) + + net = GetattrClassNet() + out = net() + assert out == 100 + +基础运算符支持更多数据类型 +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +在静态图语法重载了以下运算符: ['+', '-', +'\*','/','//','%','\*\*','<<','>>','&','\|','^', 'not', '==', '!=', '<', +'>', '<=', '>=', 'in', 'not in', +'y=x[0]']。图模式重载的运算符详见\ `运算符 `_\ 。列表中的运算符在输入图模式中不支持的输入类型时将使用扩展静态图语法支持,并使输出结果与动态图模式下的输出结果一致。 + +代码用例如下。 + +.. code:: python + + import mindspore as ms + import mindspore.nn as nn + from mindspore import Tensor + ms.set_context(mode=ms.GRAPH_MODE) + + class InnerClass(nn.Cell): + def construct(self, x, y): + return x.asnumpy() + y.asnumpy() + + net = InnerClass() + ret = net(Tensor([4, 5]), Tensor([1, 2])) + print(ret) + +运行结果如下: + +.. code:: text + + [5 7] + +上述例子中,\ ``.asnumpy()``\ 输出的数据类型: +``numpy.ndarray``\ 为运算符\ ``+``\ 在图模式中不支持的输入类型。因此\ ``x.asnumpy() + y.asnumpy()``\ 将使用扩展语法支持。 + +在另一个用例中: + +.. code:: python + + class InnerClass(nn.Cell): + def construct(self): + return (None, 1) in ((None, 1), 1, 2, 3) + + net = InnerClass() + print(net()) + +运行结果如下: + +.. code:: text + + True + +``tuple`` in +``tuple``\ 在原本的图模式中是不支持的运算,现已使用扩展静态图语法支持。 + +基础类型 +~~~~~~~~ + +扩展对Python原生数据类型\ ``List``\ 、\ ``Dictionary``\ 、\ ``None``\ 的支持。 + +支持列表就地修改操作 +^^^^^^^^^^^^^^^^^^^^ + +列表\ ``List``\ 以及元组\ ``Tuple``\ 是Python中最基本的序列内置类型,\ ``List``\ 与\ ``Tuple``\ 最核心的区别是\ ``List``\ 是可以改变的对象,而\ ``Tuple``\ 是不可以更改的。这意味着\ ``Tuple``\ 一旦被创建,就不可以在对象地址不变的情况下更改。而\ ``List``\ 则可以通过一系列inplace操作,在不改变对象地址的情况下,对对象进行修改。例如: + +.. code:: python + + a = [1, 2, 3, 4] + a_id = id(a) + a.append(5) + a_after_id = id(a) + assert a_id == a_after_id + +上述示例代码中,通过\ ``append``\ 这个inplace语法更改\ ``List``\ 对象的时候,其对象的地址并没有被修改。而\ ``Tuple``\ 是不支持这种inplace操作的。在\ ``JIT_SYNTAX_LEVEL``\ 设置为\ ``LAX``\ 的情况下,静态图模式可以支持部分\ ``List``\ 对象的inplace操作。 + +具体使用场景如下: + +- 支持从全局变量中获取原\ ``List``\ 对象。 + + 在下面示例中,静态图获取到\ ``List``\ 对象,并在原有对象上进行了图模式支持的inplace操作\ ``list.reverse()``, + 并将原有对象返回。可以看到图模式返回的对象与原有的全局变量对象id相同,即两者为同一对象。若\ ``JIT_SYNTAX_LEVEL``\ 设置为\ ``STRICT``\ 选项,则返回的\ ``List``\ 对象与全局对象为两个不同的对象。 + + .. code:: python + + import mindspore as ms + + global_list = [1, 2, 3, 4] + + @ms.jit + def list_func(): + global_list.reverse() + return global_list + + output = list_func() # output: [4, 3, 2, 1] + assert id(global_list) == id(output) + +- 不支持对输入\ ``List``\ 对象进行inplace操作。 + + ``List``\ 作为静态图输入时,会对该\ ``List``\ 对象进行一次复制,并使用该复制对象进行后续的计算,因此无法对原输入对象进行inplace操作。例如: + + .. code:: python + + import mindspore as ms + + list_input = [1, 2, 3, 4] + + @ms.jit + def list_func(x): + x.reverse() + return x + + output = list_func(list_input) # output: [4, 3, 2, 1] list_input: [1, 2, 3, 4] + assert id(output) != id(list_input) + + 如上述用例所示,\ ``List``\ 对象作为图模式输入时无法在原有对象上进行inplace操作。图模式返回的对象与输入的对象id不同,为不同对象。 + +- 支持部分\ ``List``\ 内置函数的就地修改操作。 + + 在\ ``JIT_SYNTAX_LEVEL``\ 设置为\ ``LAX``\ 的情况下,图模式部分\ ``List``\ 内置函数支持inplace。在 + ``JIT_SYNTAX_LEVEL``\ 为 ``STRICT`` + 的情况下,所有方法均不支持inplace操作。 + + 目前,图模式支持的\ ``List``\ 就地修改内置方法有\ ``extend``\ 、\ ``pop``\ 、\ ``reverse``\ 以及\ ``insert``\ 。内置方法\ ``append``\ 、\ ``clear``\ 以及索引赋值暂不支持就地修改,后续版本将会支持。 + + 示例如下: + + .. code:: python + + import mindspore as ms + + list_input = [1, 2, 3, 4] + + @ms.jit + def list_func(): + list_input.reverse() + return list_input + + output = list_func() # output: [4, 3, 2, 1] list_input: [4, 3, 2, 1] + assert id(output) == id(list_input) + +支持Dictionary的高阶用法 +^^^^^^^^^^^^^^^^^^^^^^^^ + +- 支持顶图返回Dictionary。 + + 示例如下: + + .. code:: python + + import mindspore as ms + + @ms.jit() + def test_dict(): + x = {'a': 'a', 'b': 'b'} + y = x.get('a') + z = dict(y=y) + return z + + out = test_dict() + print("out:", out) + + 运行结果如下: + + .. code:: text + + out: {'y': 'a'} + +- 支持Dictionary索引取值和赋值。 + + 示例如下: + + .. code:: python + + import mindspore as ms + import numpy as np + + x = {"a": ms.Tensor(np.array([1, 2, 3])), "b": ms.Tensor(np.array([4, 5, 6])), "c": ms.Tensor(np.array([7, 8, 9]))} + + @ms.jit() + def test_dict(): + y = x["b"] + x["a"] = (2, 3, 4) + return x, y + + out1, out2 = test_dict() + print('out1:{}'.format(out1)) + print('out2:{}'.format(out2)) + + 运行结果如下: + + .. code:: text + + out1:{'a': (2, 3, 4), 'b': Tensor(shape=[3], dtype=Int64, value= [4, 5, 6]), 'c': Tensor(shape=[3], dtype=Int64, value= [7, 8, 9])} + out2:[4 5 6] + +支持使用None +^^^^^^^^^^^^ + +``None``\ 是Python中的一个特殊值,表示空,可以赋值给任何变量。对于没有返回值语句的函数认为返回\ ``None``\ 。同时也支持\ ``None``\ 作为顶图或者子图的入参或者返回值。支持\ ``None``\ 作为切片的下标,作为\ ``List``\ 、\ ``Tuple``\ 、\ ``Dictionary``\ 的输入。 + +示例如下: + +.. code:: python + + import mindspore as ms + + @ms.jit + def test_return_none(): + return 1, "a", None + + res = test_return_none() + print(res) + +运行结果如下: + +.. code:: text + + (1, 'a', None) + +对于没有返回值的函数,默认返回\ ``None``\ 对象。 + +.. code:: python + + import mindspore as ms + + @ms.jit + def foo(): + x = 3 + print("x:", x) + + res = foo() + assert res is None + +运行结果如下: + +.. code:: text + + x: + 3 + +如下面例子,\ ``None``\ 作为顶图的默认入参。 + +.. code:: python + + import mindspore as ms + + @ms.jit + def foo(x, y=None): + if y is not None: + print("y:", y) + else: + print("y is None") + print("x:", x) + return y + + x = [1, 2] + res = foo(x) + assert res is None + +运行结果如下: + +.. code:: text + + y is None + x: + [1, 2] + +内置函数支持更多数据类型 +~~~~~~~~~~~~~~~~~~~~~~~~ + +扩展内置函数的支持范围。Python内置函数完善支持更多输入类型,例如第三方库数据类型。 + +例如下面的例子,\ ``x.asnumpy()``\ 和\ ``np.ndarray``\ 均是扩展支持的类型。更多内置函数的支持情况可见\ `Python内置函数 `_\ 章节。 + +.. code:: python + + import numpy as np + import mindspore as ms + import mindspore.nn as nn + + ms.set_context(mode=ms.GRAPH_MODE) + + class Net(nn.Cell): + def construct(self, x): + return isinstance(x.asnumpy(), np.ndarray) + + x = ms.Tensor(np.array([-1, 2, 4])) + net = Net() + out = net(x) + assert out + +支持控制流 +~~~~~~~~~~ + +为了提高Python标准语法支持度,实现动静统一,扩展支持更多数据类型在控制流语句的使用。控制流语句是指\ ``if``\ 、\ ``for``\ 、\ ``while``\ 等流程控制语句。理论上,通过扩展支持的语法,在控制流场景中也支持。代码用例如下: + +.. code:: python + + import numpy as np + import mindspore as ms + + @ms.jit + def func(): + x = np.array(1) + if x <= 1: + x += 1 + return ms.Tensor(x) + + res = func() + print("res: ", res) + +运行结果如下: + +.. code:: text + + res: 2 + +支持属性设置与修改 +~~~~~~~~~~~~~~~~~~ + +具体使用场景如下: + +- 对自定义类对象以及第三方类型的属性进行设置与修改。 + + 图模式下支持对自定义类对象的属性进行设置与修改,例如: + + .. code:: python + + from mindspore import jit + + class AssignClass(): + def __init__(self): + self.x = 1 + + obj = AssignClass() + + @jit + def foo(): + obj.x = 100 + + foo() + print(f"obj.x is: {obj.x}") + + 运行结果如下: + + .. code:: text + + obj.x is: 100 + + 图模式下支持对第三方库对象的属性进行设置与修改,例如: + + .. code:: python + + from mindspore import jit + import numpy as np + + @jit + def foo(): + a = np.array([1, 2, 3, 4]) + a.shape = (2, 2) + return a.shape + + shape = foo() + print(f"shape is {shape}") + + 运行结果如下: + + .. code:: text + + shape is (2, 2) + +- 对Cell的self对象进行修改,例如: + + .. code:: python + + import mindspore as ms + from mindspore import nn, set_context + set_context(mode=ms.GRAPH_MODE) + + class Net(nn.Cell): + def __init__(self): + super().__init__() + self.m = 2 + + def construct(self): + self.m = 3 + return 0 + + net = Net() + net() + print(f"net.m is {net.m}") + + 运行结果如下: + + .. code:: text + + net.m is 3 + + 注意,self对象支持属性修改和设置。若\ ``__init__``\ 内没有定义某个属性,对齐PYNATIVE模式,图模式也允许设置此属性。例如: + + .. code:: python + + import mindspore as ms + from mindspore import nn, set_context + set_context(mode=ms.GRAPH_MODE) + + class Net(nn.Cell): + def __init__(self): + super().__init__() + self.m = 2 + + def construct(self): + self.m2 = 3 + return 0 + + net = Net() + net() + print(f"net.m2 is {net.m2}") + + 运行结果如下: + + .. code:: text + + net.m2 is 3 + +- 对静态图内的Cell对象以及jit_class对象进行设置与修改。 + + 支持对图模式jit_class对象进行属性修改,例如: + + .. code:: python + + import mindspore as ms + from mindspore import nn, set_context, jit_class + set_context(mode=ms.GRAPH_MODE) + + @jit_class + class InnerClass(): + def __init__(self): + self.x = 10 + + class Net(nn.Cell): + def __init__(self): + super(Net, self).__init__() + self.inner = InnerClass() + + def construct(self): + self.inner.x = 100 + return 0 + + net = Net() + net() + print(f"net.inner.x is {net.inner.x}") + + 运行结果如下: + + .. code:: text + + net.inner.x is 100 + +支持求导 +~~~~~~~~ + +扩展支持的静态图语法,同样支持其在求导中使用,例如: + +.. code:: python + + import mindspore as ms + from mindspore import ops, set_context + set_context(mode=ms.GRAPH_MODE) + + @ms.jit + def dict_net(a): + x = {'a': a, 'b': 2} + return a, (x, (1, 2)) + + out = ops.grad(dict_net)(ms.Tensor([1])) + assert out == 2 + +Annotation Type +~~~~~~~~~~~~~~~ + +对于运行时的扩展支持的语法,会产生一些无法被类型推导出的节点,比如动态创建Tensor等。这种类型称为\ ``Any``\ 类型。因为该类型无法在编译时推导出正确的类型,所以这种\ ``Any``\ 将会以一种默认最大精度\ ``float64``\ 进行运算,防止其精度丢失。为了能更好的优化相关性能,需要减少\ ``Any``\ 类型数据的产生。当用户可以明确知道当前通过扩展支持的语句会产生具体类型的时候,我们推荐使用\ ``Annotation @jit.typing:``\ 的方式进行指定对应Python语句类型,从而确定解释节点的类型避免\ ``Any``\ 类型的生成。 + +例如,\ `Tensor `_\ 类和\ `tensor `_\ 接口的区别就在于在\ ``tensor``\ 接口内部运用了Annotation +Type机制。当\ ``tensor``\ 函数的\ ``dtype``\ 确定时,函数内部会利用\ ``Annotation``\ 指定输出类型从而避免\ ``Any``\ 类型的产生。\ ``Annotation Type``\ 的使用只需要在对应Python语句上面或者后面加上注释 +``# @jit.typing: () -> tensor_type[float32]`` 即可,其中 ``->`` 后面的 +``tensor_type[float32]`` 指示了被注释的语句输出类型。 + +代码用例如下。 + +.. code:: python + + import mindspore as ms + import mindspore.nn as nn + from mindspore import ops, Tensor + + class Net(nn.Cell): + def __init__(self): + super(Net, self).__init__() + self.abs = ops.Abs() + + @ms.jit + def construct(self, x, y): + y1 = ms.tensor(x.asnumpy() + y.asnumpy(), dtype=ms.float32) + y2 = ms.Tensor(x.asnumpy() + y.asnumpy(), dtype=ms.float32) # @jit.typing: () -> tensor_type[float32] + y3 = Tensor(x.asnumpy() + y.asnumpy()) + y4 = Tensor(x.asnumpy() + y.asnumpy(), dtype=ms.float32) + return self.abs(y1), self.abs(y2), self.abs(y3), self.abs(y4) + + ms.set_context(mode=ms.GRAPH_MODE) + net = Net() + x = ms.Tensor(-1, dtype=ms.int32) + y = ms.Tensor(-1, dtype=ms.float32) + y1, y2, y3, y4 = net(x, y) + + print(f"y1 value is {y1}, dtype is {y1.dtype}") + print(f"y2 value is {y2}, dtype is {y2.dtype}") + print(f"y3 value is {y3}, dtype is {y3.dtype}") + print(f"y4 value is {y4}, dtype is {y4.dtype}") + +运行结果如下: + +.. code:: text + + y1 value is 2.0, dtype is Float32 + y2 value is 2.0, dtype is Float32 + y3 value is 2.0, dtype is Float64 + y4 value is 2.0, dtype is Float32 + +上述例子,可以看到创建了\ ``Tensor``\ 的相关区别。对于\ ``y3``\ 、\ ``y4``\ ,因为\ ``Tensor``\ 类没有增加\ ``Annotation``\ 指示,\ ``y3``\ 、\ ``y4``\ 没有办法推出正确的类型,导致只能按照最高精度\ ``float64``\ 进行运算。 +对于\ ``y2``\ ,由于创建\ ``Tensor``\ 时,通过\ ``Annotation``\ 指定了对应类型,使得其类型可以按照指定类型进行运算。 +对于\ ``y1``\ ,由于使用了\ ``tensor``\ 函数接口创建\ ``Tensor``\ ,传入的\ ``dtype``\ 参数作为\ ``Annotation``\ 的指定类型,所以也避免了\ ``Any``\ 类型的产生。 + +扩展语法的语法约束 +------------------ + +在使用静态图扩展支持语法时,请注意以下几点: + +1. 对标动态图的支持能力,即:须在动态图语法范围内,包括但不限于数据类型等。 + +2. 在扩展静态图语法时,支持了更多的语法,但执行性能可能会受影响,不是最佳。 + +3. 在扩展静态图语法时,支持了更多的语法,由于使用Python的能力,不能使用MindIR导入导出的能力。 + +4. 暂不支持跨Python文件重复定义同名的全局变量,且这些全局变量在网络中会被用到。 \ No newline at end of file diff --git a/docs/mindspore/source_zh_cn/note/official_models.md b/docs/mindspore/source_zh_cn/note/official_models.md index 7d899f3363..0c8364599d 100644 --- a/docs/mindspore/source_zh_cn/note/official_models.md +++ b/docs/mindspore/source_zh_cn/note/official_models.md @@ -334,4 +334,4 @@ | 计算流体 | [PDE-Net](https://arxiv.org/abs/1710.09668) | [Link](https://gitee.com/mindspore/mindscience/blob/master/MindFlow/applications/data_mechanism_fusion/pde_net/README_CN.md#) | ✅ | ✅ | | 计算流体 | [hfm](https://www.science.org/doi/abs/10.1126/science.aaw4741) | [Link](https://gitee.com/mindspore/mindscience/blob/master/SciAI/sciai/model/hfm/README_CN.md) | ✅ | ✅ | | 计算流体 | [label_free_dnn_surrogate](https://www.sciencedirect.com/science/article/pii/S004578251930622X) | [Link](https://gitee.com/mindspore/mindscience/blob/master/SciAI/sciai/model/label_free_dnn_surrogate/README_CN.md) | ✅ | ✅ | -| 计算流体 | [nsf_nets](https://www.sciencedirect.com/science/article/pii/S0021999120307257) | [Link](https://gitee.com/mindspore/mindscience/blob/master/SciAI/sciai/model/nsf_nets/README_CN.md) | ✅ | ✅ | +| 计算流体 | [nsf_nets](https://www.sciencedirect.com/science/article/pii/S0021999120307257) | [Link](https://gitee.com/mindspore/mindscience/blob/master/SciAI/sciai/model/nsf_nets/README_CN.md) | ✅ | ✅ | \ No newline at end of file diff --git a/docs/mindspore/source_zh_cn/orange_pi/debug.md b/docs/mindspore/source_zh_cn/orange_pi/debug.md new file mode 100644 index 0000000000..865838b6c7 --- /dev/null +++ b/docs/mindspore/source_zh_cn/orange_pi/debug.md @@ -0,0 +1,3 @@ +# 功能调试 + +[![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_zh_cn/orange_pi/debug.md) \ No newline at end of file diff --git a/docs/mindspore/source_zh_cn/orange_pi/index.rst b/docs/mindspore/source_zh_cn/orange_pi/index.rst new file mode 100644 index 0000000000..9a875f8958 --- /dev/null +++ b/docs/mindspore/source_zh_cn/orange_pi/index.rst @@ -0,0 +1,11 @@ +香橙派开发指南 +=============== + +.. toctree:: + :glob: + :maxdepth: 1 + + overview + quick_start + debug + model_infer diff --git a/docs/mindspore/source_zh_cn/orange_pi/model_infer.md b/docs/mindspore/source_zh_cn/orange_pi/model_infer.md new file mode 100644 index 0000000000..a61812a2d3 --- /dev/null +++ b/docs/mindspore/source_zh_cn/orange_pi/model_infer.md @@ -0,0 +1,7 @@ +# 模型推理 + +[![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_zh_cn/orange_pi/model_infer.md) + +## 在线推理 + +## 离线推理 diff --git a/docs/mindspore/source_zh_cn/orange_pi/overview.md b/docs/mindspore/source_zh_cn/orange_pi/overview.md new file mode 100644 index 0000000000..ad19dbe45f --- /dev/null +++ b/docs/mindspore/source_zh_cn/orange_pi/overview.md @@ -0,0 +1,3 @@ +# 了解香橙派 + +[![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_zh_cn/orange_pi/overview.md) diff --git a/docs/mindspore/source_zh_cn/orange_pi/quick_start.md b/docs/mindspore/source_zh_cn/orange_pi/quick_start.md new file mode 100644 index 0000000000..a5a172d95a --- /dev/null +++ b/docs/mindspore/source_zh_cn/orange_pi/quick_start.md @@ -0,0 +1,9 @@ +# 快速入门 + +[![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_zh_cn/orange_pi/quick_start.md) + +## 安装 + +## 启动 + +## 运行 -- Gitee From 220a67b7f666e903930d3d587f16effa414dbd3a Mon Sep 17 00:00:00 2001 From: yuhan Date: Tue, 13 Aug 2024 19:19:57 +0800 Subject: [PATCH 27/69] modify frame --- docs/mindspore/Makefile | 5 +- docs/mindspore/source_en/api_python/index.rst | 29 + docs/mindspore/source_en/conf.py | 12 +- docs/mindspore/source_en/design/index.rst | 17 + docs/mindspore/source_en/faq/index.rst | 17 + docs/mindspore/source_en/kits_tools/index.rst | 9 + .../{note => kits_tools}/official_models.md | 0 .../source_en/kits_tools/overview.md | 18 + .../{debug_and_tune.md => acc_debug.md} | 137 +- .../source_en/migration_guide/debug.md | 18 + .../source_en/migration_guide/index.rst | 17 + .../source_en/migration_guide/overview.md | 52 +- .../source_en/migration_guide/perf_debug.md | 109 ++ .../source_en/migration_guide/reference.rst | 9 + .../mindspore/source_en/model_infer/index.rst | 10 + .../source_en/model_infer/llm_infer.rst | 8 + .../source_en/model_infer/llm_lite.md | 3 + .../model_infer}/model_compression.md | 0 .../source_en/model_infer/overview.md | 2 +- .../model_train/custom_program/fusion_pass.md | 3 + .../custom_program/hook_program.md | 306 +-- .../custom_program}/initializer.md | 4 +- .../model_train/custom_program/layer.md | 198 ++ .../model_train/custom_program}/loss.md | 4 +- .../custom_program/network_custom.md | 98 + .../model_train/custom_program/op_custom.rst | 12 + .../custom_program}/operation/ms_kernel.md | 0 .../custom_program}/operation/op_custom.md | 0 .../operation/op_custom_adv.md | 0 .../operation/op_custom_aot.md | 0 .../operation/op_custom_ascendc.md | 0 .../model_train/custom_program}/optimizer.md | 4 +- .../model_train/custom_program/overview.md | 3 + .../source_en/model_train}/dataset/augment.md | 0 .../source_en/model_train}/dataset/cache.md | 0 .../model_train}/dataset/dataset_autotune.md | 0 .../model_train}/dataset/dataset_offload.md | 0 .../source_en/model_train}/dataset/eager.md | 0 .../dataset/images/auto_augmentation.png | Bin .../model_train}/dataset/images/autotune.png | Bin .../dataset/images/cache_dataset.png | Bin .../dataset/images/cache_pipeline_en.eddx | Bin .../dataset/images/cache_processed_data.png | Bin .../model_train}/dataset/images/compose.png | Bin .../images/data_conversion_concept.png | Bin .../images/data_conversion_concept.pptx | Bin .../data_enhancement_performance_scheme.eddx | Bin .../data_enhancement_performance_scheme.png | Bin .../data_loading_performance_scheme.png | Bin .../dataset/images/eager_mode.png | Bin .../dataset/images/eager_mode_en.jpeg | Bin .../model_train}/dataset/images/map.eddx | Bin .../dataset/images/mindrecord.png | Bin .../dataset/images/mindrecord.pptx | Bin .../dataset/images/offload_process.PNG | Bin .../dataset/images/operation_fusion.png | Bin .../dataset/images/output_5_1.png | Bin .../dataset/images/output_7_1.png | Bin .../dataset/images/output_9_1.png | Bin .../model_train}/dataset/images/pipeline.png | Bin .../dataset/images/pipeline_mode_en.jpeg | Bin .../images/shuffle_performance_scheme.png | Bin .../model_train}/dataset/optimize.ipynb | 0 .../source_en/model_train/dataset/overview.md | 3 + .../model_train}/dataset/python_objects.md | 0 .../model_train}/dataset/record.ipynb | 0 .../source_en/model_train}/dataset/sampler.md | 0 .../source_en/model_train}/debug/aoe.md | 0 .../model_train/debug/debug_tools.rst | 10 + .../source_en/model_train}/debug/dump.md | 0 .../model_train/debug}/error_analysis.rst | 0 .../debug}/error_analysis/cann_error_cases.md | 0 .../error_analysis/error_scenario_analysis.md | 0 .../error_analysis/images/dot_to_png.png | Bin .../debug}/error_analysis/minddata_debug.md | 0 .../debug}/error_analysis/mindir.md | 0 .../debug}/error_analysis/mindrt_debug.md | 0 .../model_train}/debug/fault_recover.md | 0 .../model_train/debug}/graph_fusion_engine.md | 0 .../debug}/images/data-and-graph-sink.eddx | Bin .../images/graph_kernel_example_custom_op.png | Bin .../graph_kernel_example_fuse_basic.png | Bin .../source_en/model_train/debug}/mem_reuse.md | 0 .../source_en/model_train/debug/opt_tools.rst | 9 + .../source_en/model_train/debug/overview.md | 3 + .../source_en/model_train}/debug/rdr.md | 0 .../source_en/model_train}/debug/sdc.md | 0 .../source_en/model_train}/index.rst | 118 +- .../parallel/advanced_operator_parallel.md | 0 .../model_train}/parallel/auto_parallel.rst | 0 .../model_train}/parallel/comm_fusion.md | 0 .../model_train}/parallel/comm_subgraph.md | 0 .../model_train}/parallel/data_parallel.md | 0 .../model_train}/parallel/dataset_slice.md | 0 .../model_train}/parallel/disaster_recover.md | 0 .../parallel/distributed_case.rst | 0 .../distributed_gradient_accumulation.md | 0 .../parallel/distributed_graph_partition.md | 0 .../model_train}/parallel/dynamic_cluster.md | 0 .../model_train}/parallel/fault_recover.md | 0 .../parallel/host_device_training.md | 0 .../images/checkpoint_integrate_process.pptx | Bin .../parallel/images/comm_subgraph.png | Bin .../parallel/images/sharding_propagation.png | Bin .../model_train}/parallel/images/sp_case1.png | Bin .../model_train}/parallel/images/sp_case2.png | Bin .../model_train}/parallel/images/sp_case3.png | Bin .../parallel/images/tensor_layout.png | Bin .../model_train}/parallel/manual_parallel.md | 0 .../model_train}/parallel/memory_offload.md | 0 .../model_train}/parallel/model_loading.md | 0 .../model_train}/parallel/model_save_load.rst | 0 .../model_train}/parallel/model_saving.md | 0 .../parallel/model_transformation.md | 0 .../source_en/model_train}/parallel/mpirun.md | 0 .../model_train}/parallel/ms_operator.md | 0 .../model_train}/parallel/msrun_launcher.md | 0 .../model_train}/parallel/multiple_copy.md | 0 .../model_train}/parallel/multiple_mix.md | 0 .../parallel/operator_parallel.md | 0 .../parallel/optimize_technique.rst | 0 .../parallel/optimizer_parallel.md | 0 .../model_train}/parallel/others.rst | 0 .../model_train}/parallel/overview.md | 0 .../model_train}/parallel/pangu_alpha.md | 0 .../parallel/parameter_server_training.md | 0 .../parallel/pipeline_parallel.md | 0 .../model_train}/parallel/rank_table.md | 0 .../model_train}/parallel/recompute.md | 0 .../model_train}/parallel/recover.rst | 0 .../source_en/model_train}/parallel/sapp.md | 0 .../parallel/semi_auto_parallel.rst | 0 .../parallel/shard_function_parallel.md | 0 .../parallel/sharding_propagation.md | 0 .../model_train}/parallel/split_technique.md | 0 .../model_train}/parallel/startup_method.rst | 0 .../model_train}/parallel/strategy_select.md | 0 .../support_dynamic_shape_in_parallel.md | 0 .../program_form/images/dynamic.png | Bin 0 -> 3077 bytes .../program_form}/index_support.md | 0 .../model_train/program_form/interface.md | 3 + .../model_train/program_form/overview.md | 3 + .../static_graph_syntax/operators.md | 0 .../python_builtin_functions.md | 0 .../static_graph_syntax/statements.md | 0 .../static_graph_expert_programming.md | 0 .../static_graph_syntax_support.md | 0 .../train_process/algorithm_optimize.rst | 8 + .../model_train/train_process}/derivation.md | 0 .../train_process}/dynamic_shape.md | 0 .../train_process/func_programming.rst | 9 + .../func_programming/Jacobians_Hessians.md | 0 .../func_programming/per_sample_gradients.md | 0 .../train_process}/images/image-data-sink.png | Bin .../images/image-graph-sink.png | Bin .../train_process}/images/image-loop-sink.png | Bin .../train_process}/images/image-user-view.png | Bin .../images/image-without-sink.png | Bin .../model_train/train_process}/model.rst | 0 .../train_process}/model/callback.md | 0 .../train_process}/model/images/model.png | Bin .../train_process}/model/metric.md | 0 .../optimize/gradient_accumulation.md | 0 .../images/graph_kernel_example_custom_op.png | Bin .../graph_kernel_example_fuse_basic.png | Bin .../optimize/images/image-data-sink.png | Bin 0 -> 20424 bytes .../optimize/images/image-graph-sink.png | Bin 0 -> 19831 bytes .../optimize/images/image-loop-sink.png | Bin 0 -> 21233 bytes .../optimize/images/image-user-view.png | Bin 0 -> 6426 bytes .../optimize/images/image-without-sink.png | Bin 0 -> 21689 bytes .../train_process}/optimize/thor.rst | 0 .../train_process}/optimize/thor/intro.md | 0 .../train_process}/optimize/thor/resnet50.md | 0 .../model_train/train_process/overview.md | 3 + .../train_process/train_optimize.md | 26 +- .../train_process}/vmap/vmap.ipynb | 0 .../source_zh_cn/api_python/index.rst | 29 + docs/mindspore/source_zh_cn/conf.py | 14 +- docs/mindspore/source_zh_cn/design/index.rst | 17 + docs/mindspore/source_zh_cn/faq/index.rst | 17 + docs/mindspore/source_zh_cn/index.rst | 133 +- .../source_zh_cn/kits_tools/index.rst | 9 + .../{note => kits_tools}/official_models.md | 0 .../source_zh_cn/kits_tools/overview.md | 18 + .../{debug_and_tune.md => acc_debug.md} | 131 +- .../source_zh_cn/migration_guide/debug.md | 16 + .../source_zh_cn/migration_guide/index.rst | 17 + .../migration_guide/migration_tools.md | 3 + .../migration_guide/model_infer.md | 3 + .../source_zh_cn/migration_guide/overview.md | 52 +- .../migration_guide/perf_debug.md | 109 ++ .../migration_guide/reference.rst | 9 + .../source_zh_cn/model_infer/index.rst | 10 + .../source_zh_cn/model_infer/llm_infer.rst | 8 + .../source_zh_cn/model_infer/llm_lite.md | 3 + .../model_infer}/model_compression.md | 0 .../source_zh_cn/model_infer/overview.md | 2 +- .../model_train/custom_program/fusion_pass.md | 3 + .../custom_program/hook_program.ipynb | 510 +++++ .../custom_program}/images/AlexNet.ppm | Bin .../custom_program}/images/learning_rate.png | Bin .../custom_program}/images/loss_function.png | Bin .../custom_program}/initializer.ipynb | 4 +- .../model_train/custom_program}/layer.ipynb | 644 +------ .../model_train/custom_program}/loss.ipynb | 6 +- .../custom_program/network_custom.ipynb | 195 ++ .../model_train/custom_program/op_custom.rst | 12 + .../custom_program}/operation/ms_kernel.ipynb | 0 .../custom_program}/operation/op_custom.ipynb | 0 .../operation/op_custom_adv.ipynb | 0 .../operation/op_custom_aot.md | 0 .../operation/op_custom_ascendc.md | 0 .../custom_program}/optimizer.ipynb | 6 +- .../model_train/custom_program/overview.md | 3 + .../model_train}/dataset/augment.ipynb | 0 .../model_train}/dataset/cache.ipynb | 0 .../model_train}/dataset/dataset_autotune.md | 0 .../model_train}/dataset/dataset_offload.md | 0 .../model_train}/dataset/eager.ipynb | 0 .../dataset/images/auto_augmentation.png | Bin .../model_train}/dataset/images/autotune.png | Bin .../dataset/images/basic_graph.graffle | Bin .../dataset/images/cache_dataset.png | Bin .../dataset/images/cache_pipeline_zh.eddx | Bin .../dataset/images/cache_processed_data.png | Bin .../model_train}/dataset/images/cifar10.jpg | Bin .../model_train}/dataset/images/compose.png | Bin .../images/data_conversion_concept.graffle | Bin .../images/data_conversion_concept.png | Bin .../images/data_conversion_concept.pptx | Bin .../data_enhancement_performance_scheme.eddx | Bin .../data_enhancement_performance_scheme.png | Bin .../data_loading_performance_scheme.png | Bin .../dataset/images/dataset_process.eddx | Bin .../dataset/images/dataset_process.graffle | Bin .../dataset/images/eager_mode.jpeg | Bin .../model_train}/dataset/images/map.eddx | Bin .../dataset/images/mindrecord.graffle | Bin .../dataset/images/mindrecord.png | Bin .../dataset/images/mindrecord.pptx | Bin .../dataset/images/offload_process.PNG | Bin .../dataset/images/op_batch.graffle | Bin .../model_train}/dataset/images/op_batch.png | Bin .../dataset/images/op_shuffle.graffle | Bin .../dataset/images/op_shuffle.png | Bin .../dataset/images/operation_fusion.png | Bin .../model_train}/dataset/images/pipeline.png | Bin .../dataset/images/pipeline_mode.jpeg | Bin .../images/shuffle_performance_scheme.png | Bin .../model_train}/dataset/optimize.ipynb | 0 .../model_train/dataset/overview.md | 3 + .../model_train}/dataset/python_objects.ipynb | 0 .../model_train}/dataset/record.ipynb | 0 .../model_train}/dataset/sampler.ipynb | 0 .../source_zh_cn/model_train}/debug/aoe.md | 0 .../model_train/debug/debug_tools.rst | 10 + .../source_zh_cn/model_train}/debug/dump.md | 0 .../model_train/debug}/error_analysis.rst | 0 .../debug}/error_analysis/cann_error_cases.md | 0 .../error_analysis/error_scenario_analysis.md | 0 .../error_analysis/images/dot_to_png.png | Bin .../error_analysis/images/minddata_errmsg.png | Bin .../error_analysis/images/pynative_errmsg.png | Bin .../debug}/error_analysis/minddata_debug.md | 0 .../debug}/error_analysis/mindir.md | 0 .../debug}/error_analysis/mindrt_debug.md | 0 .../model_train}/debug/fault_recover.md | 0 .../debug}/graph_fusion_engine.ipynb | 0 .../debug/images/data-and-graph-sink.eddx | Bin 0 -> 425621 bytes .../model_train/debug}/images/error_debug.png | Bin .../debug}/images/graph_errmsg.png | Bin .../images/graph_kernel_example_custom_op.png | Bin 0 -> 25261 bytes .../graph_kernel_example_fuse_basic.png | Bin 0 -> 11719 bytes .../model_train/debug}/mem_reuse.md | 0 .../model_train/debug/opt_tools.rst | 9 + .../model_train/debug/overview.md | 3 + .../source_zh_cn/model_train}/debug/rdr.md | 0 .../source_zh_cn/model_train}/debug/sdc.md | 0 .../source_zh_cn/model_train}/index.rst | 119 +- .../parallel/advanced_operator_parallel.md | 0 .../model_train}/parallel/auto_parallel.rst | 0 .../model_train}/parallel/comm_fusion.md | 0 .../model_train}/parallel/comm_subgraph.md | 0 .../model_train}/parallel/data_parallel.md | 0 .../model_train}/parallel/dataset_slice.md | 0 .../model_train}/parallel/disaster_recover.md | 0 .../parallel/distributed_case.rst | 0 .../distributed_gradient_accumulation.md | 0 .../parallel/distributed_graph_partition.md | 0 .../model_train}/parallel/dynamic_cluster.md | 0 .../model_train}/parallel/fault_recover.md | 0 .../parallel/host_device_training.md | 0 .../advanced_operator_parallel_view1.PNG | Bin .../advanced_operator_parallel_view2.PNG | Bin .../images/checkpoint_integrate_process.pptx | Bin .../parallel/images/comm_subgraph.png | Bin .../parallel/images/data_parallel.png | Bin .../images/distributed_graph_partition.png | Bin .../images/host_device_image_0_zh.png | Bin .../images/host_device_image_1_zh.png | Bin .../model_train}/parallel/images/megatron.png | Bin .../parallel/images/memory_offload.png | Bin .../parallel/images/mindspore.png | Bin .../images/operator_parallel_image_0_zh.png | Bin .../images/operator_parallel_image_1_zh.png | Bin .../images/operator_parallel_image_2_zh.png | Bin .../images/operator_parallel_image_3_zh.png | Bin .../images/operator_parallel_image_4_zh.png | Bin .../images/optimizer_parallel_image_0_zh.png | Bin .../images/optimizer_parallel_image_1_zh.png | Bin .../parallel/images/pangu_strategy.png | Bin .../images/pipeline_parallel_image_0_zh.png | Bin .../images/pipeline_parallel_image_1_zh.png | Bin .../images/pipeline_parallel_image_2_zh.png | Bin .../parallel/images/pynative_jit.png | Bin .../parallel/images/recompute_image_0_zh.png | Bin .../parallel/images/recompute_image_1_zh.png | Bin .../images/sharding_propagation_zh.png | Bin .../parallel/images/sp_case1_zh.png | Bin .../parallel/images/sp_case2_zh.png | Bin .../parallel/images/sp_case3_zh.png | Bin .../parallel/images/tensor_layout_zh.png | Bin .../images/tensor_redistribution_zh.png | Bin .../model_train}/parallel/manual_parallel.md | 0 .../model_train}/parallel/memory_offload.md | 0 .../model_train}/parallel/model_loading.md | 0 .../model_train}/parallel/model_save_load.rst | 0 .../model_train}/parallel/model_saving.md | 0 .../parallel/model_transformation.md | 0 .../model_train}/parallel/mpirun.md | 0 .../model_train}/parallel/ms_operator.md | 0 .../model_train}/parallel/msrun_launcher.md | 0 .../model_train}/parallel/multiple_copy.md | 0 .../model_train}/parallel/multiple_mix.md | 0 .../parallel/operator_parallel.md | 0 .../parallel/optimize_technique.rst | 0 .../parallel/optimizer_parallel.md | 0 .../model_train}/parallel/others.rst | 0 .../model_train}/parallel/overview.md | 0 .../model_train}/parallel/pangu_alpha.md | 0 .../parallel/parameter_server_training.md | 0 .../parallel/pipeline_parallel.md | 0 .../model_train}/parallel/rank_table.md | 0 .../model_train}/parallel/recompute.md | 0 .../model_train}/parallel/recover.rst | 0 .../model_train}/parallel/sapp.md | 0 .../parallel/semi_auto_parallel.rst | 0 .../parallel/shard_function_parallel.md | 0 .../parallel/sharding_propagation.md | 0 .../model_train}/parallel/split_technique.md | 0 .../model_train}/parallel/startup_method.rst | 0 .../model_train}/parallel/strategy_select.md | 0 .../support_dynamic_shape_in_parallel.md | 0 .../program_form/images/dynamic.png | Bin 0 -> 3077 bytes .../program_form}/index_support.ipynb | 0 .../model_train/program_form/interface.md | 3 + .../model_train/program_form/overview.md | 3 + .../static_graph_syntax/operators.md | 0 .../python_builtin_functions.ipynb | 0 .../static_graph_syntax/statements.ipynb | 0 .../static_graph_expert_programming.ipynb | 0 .../static_graph_syntax_support.ipynb | 0 .../train_process/algorithm_optimize.rst | 8 + .../train_process}/derivation.ipynb | 0 .../train_process}/dynamic_shape.md | 0 .../train_process/func_programming.rst | 9 + .../func_programming/Jacobians_Hessians.ipynb | 0 .../per_sample_gradients.ipynb | 0 .../static_dynamic_shape_diff.png | Bin 0 -> 59949 bytes .../images/dynamic_shape/symbol_engine.png | Bin 0 -> 128968 bytes .../train_process}/images/image-data-sink.png | Bin .../images/image-graph-sink.png | Bin .../train_process}/images/image-loop-sink.png | Bin .../train_process}/images/image-user-view.png | Bin .../images/image-without-sink.png | Bin .../model_train/train_process}/model.rst | 0 .../train_process}/model/callback.ipynb | 0 .../train_process}/model/images/model.graffle | Bin .../train_process}/model/images/model.png | Bin .../train_process}/model/images/save.graffle | Bin .../train_process}/model/metric.ipynb | 0 .../train_process}/model/model.ipynb | 0 .../optimize/gradient_accumulation.ipynb | 0 .../optimize/images/GradientAccumulation1.png | Bin .../optimize/images/data-and-graph-sink.eddx | Bin 0 -> 425621 bytes .../images/graph_kernel_example_custom_op.png | Bin 0 -> 25261 bytes .../graph_kernel_example_fuse_basic.png | Bin 0 -> 11719 bytes .../optimize/images/image-data-sink.png | Bin 0 -> 34887 bytes .../optimize/images/image-graph-sink.png | Bin 0 -> 31464 bytes .../optimize/images/image-loop-sink.png | Bin 0 -> 30998 bytes .../optimize/images/image-user-view.png | Bin 0 -> 8083 bytes .../optimize/images/image-without-sink.png | Bin 0 -> 32485 bytes .../optimize/images/mix_precision_fp16.eddx | Bin .../optimize/images/mix_precision_fp16.png | Bin .../train_process}/optimize/thor.rst | 0 .../images/deeplearning_train_process.png | Bin .../thor/images/different_train_process.png | Bin .../optimize/thor/images/split_dimension.png | Bin .../optimize/thor/images/thor_in_bert.png | Bin .../optimize/thor/images/thor_in_resnet.png | Bin .../thor/images/thor_largebs_in_resnet.png | Bin .../train_process}/optimize/thor/intro.md | 0 .../train_process}/optimize/thor/resnet50.md | 0 .../model_train/train_process/overview.md | 3 + .../train_process/train_optimize.ipynb | 39 +- .../train_process}/vmap/vmap.ipynb | 0 tools/generate_html/base_version.json | 98 +- tools/generate_html/replace_html_menu.py | 199 ++ tools/generate_html/run.py | 28 +- tutorials/application/Makefile | 20 - tutorials/application/requirements.txt | 8 - tutorials/application/source_en/conf.py | 124 -- tutorials/application/source_en/index.rst | 39 - tutorials/application/source_zh_cn/conf.py | 120 -- tutorials/application/source_zh_cn/index.rst | 42 - tutorials/experts/Makefile | 20 - tutorials/experts/requirements.txt | 8 - tutorials/experts/source_en/conf.py | 108 -- tutorials/experts/source_zh_cn/conf.py | 122 -- tutorials/source_en/advanced/dataset.rst | 14 - tutorials/source_en/advanced/modules.rst | 128 -- .../images/fp16_vs_fp32.png | Bin .../{advanced => beginner}/mixed_precision.md | 0 .../{application => }/source_en/cv/fcn8s.md | 0 .../source_en/cv/images/SSD_10.jpg | Bin .../source_en/cv/images/SSD_13.jpg | Bin .../source_en/cv/images/SSD_14.jpg | Bin .../source_en/cv/images/SSD_4.png | Bin .../source_en/cv/images/data_process.png | Bin .../source_en/cv/images/output_161_0.png | Bin .../source_en/cv/images/output_34_0.png | Bin .../source_en/cv/images/output_6_1.png | Bin .../source_en/cv/images/output_9_0.png | Bin .../images/transfer_learning_output_26_0.png | Bin .../source_en/cv/resnet50.md | 0 .../source_en/cv/shufflenet.md | 0 .../{application => }/source_en/cv/ssd.md | 0 .../source_en/cv/transfer_learning.md | 0 .../{application => }/source_en/cv/vit.md | 0 .../source_en/generative/cyclegan.md | 0 .../source_en/generative/dcgan.md | 0 .../source_en/generative/diffusion.md | 0 .../source_en/generative/gan.md | 0 .../generative/images/dcgan_output_26_0.png | Bin .../generative/images/output_22_0.png | Bin .../generative/images/output_8_0.png | Bin .../source_en/generative/pix2pix.md | 0 tutorials/source_en/index.rst | 14 +- .../source_en/nlp/sentiment_analysis.md | 0 .../source_en/nlp/sequence_labeling.md | 0 tutorials/source_zh_cn/advanced/dataset.rst | 14 - tutorials/source_zh_cn/advanced/modules.rst | 113 -- .../source_zh_cn/advanced/modules/cell.ipynb | 185 -- .../images/fp16_vs_fp32.png | Bin .../mixed_precision.ipynb | 0 .../source_zh_cn/cv/fcn8s.ipynb | 1690 ++++++++--------- .../source_zh_cn/cv/images/SSD_1.png | Bin .../source_zh_cn/cv/images/SSD_10.jpg | Bin .../source_zh_cn/cv/images/SSD_11.jpg | Bin .../source_zh_cn/cv/images/SSD_12.jpg | Bin .../source_zh_cn/cv/images/SSD_13.jpg | Bin .../source_zh_cn/cv/images/SSD_14.jpg | Bin .../source_zh_cn/cv/images/SSD_15.jpg | Bin .../source_zh_cn/cv/images/SSD_16.jpg | Bin .../source_zh_cn/cv/images/SSD_2.jpg | Bin .../source_zh_cn/cv/images/SSD_3.jpg | Bin .../source_zh_cn/cv/images/SSD_4.png | Bin .../source_zh_cn/cv/images/SSD_5.png | Bin .../source_zh_cn/cv/images/SSD_6.jpg | Bin .../source_zh_cn/cv/images/SSD_7.jpg | Bin .../source_zh_cn/cv/images/SSD_8.jpg | Bin .../source_zh_cn/cv/images/SSD_9.png | Bin .../source_zh_cn/cv/images/data_process.png | Bin .../source_zh_cn/cv/images/dcgan.gif | Bin .../source_zh_cn/cv/images/dcgan.png | Bin .../cv/images/encoder_decoder.png | Bin .../source_zh_cn/cv/images/fcn_1.png | Bin .../source_zh_cn/cv/images/fcn_2.png | Bin .../source_zh_cn/cv/images/fcn_3.png | Bin .../source_zh_cn/cv/images/fcn_4.png | Bin .../source_zh_cn/cv/images/fcn_5.png | Bin .../source_zh_cn/cv/images/fcn_6.png | Bin .../source_zh_cn/cv/images/gan_image.png | Bin .../source_zh_cn/cv/images/infer_result.jpg | Bin .../cv/images/multi_head_attention.png | Bin .../source_zh_cn/cv/images/resnet_1.png | Bin .../source_zh_cn/cv/images/resnet_2.png | Bin .../source_zh_cn/cv/images/resnet_3.png | Bin .../source_zh_cn/cv/images/resnet_4.png | Bin .../source_zh_cn/cv/images/resnet_5.png | Bin .../source_zh_cn/cv/images/resnet_6.png | Bin .../cv/images/self_attention_1.png | Bin .../cv/images/self_attention_2.png | Bin .../cv/images/self_attention_3.png | Bin .../cv/images/self_attention_process.png | Bin .../source_zh_cn/cv/images/shufflenet_1.png | Bin .../source_zh_cn/cv/images/shufflenet_2.png | Bin .../source_zh_cn/cv/images/shufflenet_3.png | Bin .../source_zh_cn/cv/images/shufflenet_4.png | Bin .../source_zh_cn/cv/images/shufflenet_5.png | Bin .../source_zh_cn/cv/images/shufflenet_6.png | Bin .../cv/images/transformer_architecture.png | Bin .../cv/images/vit_architecture.png | Bin .../source_zh_cn/cv/images/vit_encoder.png | Bin .../source_zh_cn/cv/resnet50.ipynb | 0 .../source_zh_cn/cv/shufflenet.ipynb | 1110 +++++------ .../source_zh_cn/cv/ssd.ipynb | 0 .../source_zh_cn/cv/transfer_learning.ipynb | 0 .../source_zh_cn/cv/vit.ipynb | 0 .../source_zh_cn/generative/cyclegan.ipynb | 0 .../source_zh_cn/generative/dcgan.ipynb | 0 .../source_zh_cn/generative/diffusion.ipynb | 0 .../source_zh_cn/generative/gan.ipynb | 0 .../generative/images/CycleGAN.png | Bin .../generative/images/CycleGAN_1.png | Bin .../generative/images/CycleGAN_2.jpg | Bin .../generative/images/diffusion_1.png | Bin .../generative/images/diffusion_2.png | Bin .../generative/images/diffusion_3.png | Bin .../generative/images/diffusion_4.jpg | Bin .../generative/images/diffusion_5.png | Bin .../generative/images/pix2pix_1.png | Bin .../generative/images/pix2pix_2.png | Bin .../generative/images/pix2pix_3.png | Bin .../generative/images/train_test.gif | Bin .../source_zh_cn/generative/pix2pix.ipynb | 0 tutorials/source_zh_cn/index.rst | 70 +- .../source_zh_cn/nlp/images/0-LSTM.png | Bin .../source_zh_cn/nlp/images/0-RNN-0.png | Bin .../source_zh_cn/nlp/images/0-RNN.png | Bin .../source_zh_cn/nlp/sentiment_analysis.ipynb | 0 .../source_zh_cn/nlp/sequence_labeling.ipynb | 0 532 files changed, 3672 insertions(+), 4093 deletions(-) create mode 100644 docs/mindspore/source_en/api_python/index.rst create mode 100644 docs/mindspore/source_en/design/index.rst create mode 100644 docs/mindspore/source_en/faq/index.rst create mode 100644 docs/mindspore/source_en/kits_tools/index.rst rename docs/mindspore/source_en/{note => kits_tools}/official_models.md (100%) create mode 100644 docs/mindspore/source_en/kits_tools/overview.md rename docs/mindspore/source_en/migration_guide/{debug_and_tune.md => acc_debug.md} (46%) create mode 100644 docs/mindspore/source_en/migration_guide/debug.md create mode 100644 docs/mindspore/source_en/migration_guide/index.rst create mode 100644 docs/mindspore/source_en/migration_guide/perf_debug.md create mode 100644 docs/mindspore/source_en/migration_guide/reference.rst create mode 100644 docs/mindspore/source_en/model_infer/index.rst create mode 100644 docs/mindspore/source_en/model_infer/llm_infer.rst create mode 100644 docs/mindspore/source_en/model_infer/llm_lite.md rename {tutorials/experts/source_en/infer => docs/mindspore/source_en/model_infer}/model_compression.md (100%) rename tutorials/experts/source_en/infer/inference.md => docs/mindspore/source_en/model_infer/overview.md (99%) create mode 100644 docs/mindspore/source_en/model_train/custom_program/fusion_pass.md rename tutorials/source_en/advanced/modules/layer.md => docs/mindspore/source_en/model_train/custom_program/hook_program.md (58%) rename {tutorials/source_en/advanced/modules => docs/mindspore/source_en/model_train/custom_program}/initializer.md (99%) create mode 100644 docs/mindspore/source_en/model_train/custom_program/layer.md rename {tutorials/source_en/advanced/modules => docs/mindspore/source_en/model_train/custom_program}/loss.md (99%) create mode 100644 docs/mindspore/source_en/model_train/custom_program/network_custom.md create mode 100644 docs/mindspore/source_en/model_train/custom_program/op_custom.rst rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train/custom_program}/operation/ms_kernel.md (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train/custom_program}/operation/op_custom.md (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train/custom_program}/operation/op_custom_adv.md (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train/custom_program}/operation/op_custom_aot.md (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train/custom_program}/operation/op_custom_ascendc.md (100%) rename {tutorials/source_en/advanced/modules => docs/mindspore/source_en/model_train/custom_program}/optimizer.md (99%) create mode 100644 docs/mindspore/source_en/model_train/custom_program/overview.md rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/dataset/augment.md (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/dataset/cache.md (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/dataset/dataset_autotune.md (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/dataset/dataset_offload.md (100%) rename {tutorials/source_en/advanced => docs/mindspore/source_en/model_train}/dataset/eager.md (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/dataset/images/auto_augmentation.png (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/dataset/images/autotune.png (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/dataset/images/cache_dataset.png (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/dataset/images/cache_pipeline_en.eddx (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/dataset/images/cache_processed_data.png (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/dataset/images/compose.png (100%) rename {tutorials/source_en/advanced => docs/mindspore/source_en/model_train}/dataset/images/data_conversion_concept.png (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/dataset/images/data_conversion_concept.pptx (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/dataset/images/data_enhancement_performance_scheme.eddx (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/dataset/images/data_enhancement_performance_scheme.png (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/dataset/images/data_loading_performance_scheme.png (100%) rename {tutorials/source_en/advanced => docs/mindspore/source_en/model_train}/dataset/images/eager_mode.png (100%) rename {tutorials/source_en/advanced => docs/mindspore/source_en/model_train}/dataset/images/eager_mode_en.jpeg (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/dataset/images/map.eddx (100%) rename {tutorials/source_en/advanced => docs/mindspore/source_en/model_train}/dataset/images/mindrecord.png (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/dataset/images/mindrecord.pptx (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/dataset/images/offload_process.PNG (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/dataset/images/operation_fusion.png (100%) rename {tutorials/source_en/advanced => docs/mindspore/source_en/model_train}/dataset/images/output_5_1.png (100%) rename {tutorials/source_en/advanced => docs/mindspore/source_en/model_train}/dataset/images/output_7_1.png (100%) rename {tutorials/source_en/advanced => docs/mindspore/source_en/model_train}/dataset/images/output_9_1.png (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/dataset/images/pipeline.png (100%) rename {tutorials/source_en/advanced => docs/mindspore/source_en/model_train}/dataset/images/pipeline_mode_en.jpeg (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/dataset/images/shuffle_performance_scheme.png (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/dataset/optimize.ipynb (100%) create mode 100644 docs/mindspore/source_en/model_train/dataset/overview.md rename {tutorials/source_en/advanced => docs/mindspore/source_en/model_train}/dataset/python_objects.md (100%) rename {tutorials/source_en/advanced => docs/mindspore/source_en/model_train}/dataset/record.ipynb (100%) rename {tutorials/source_en/advanced => docs/mindspore/source_en/model_train}/dataset/sampler.md (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/debug/aoe.md (100%) create mode 100644 docs/mindspore/source_en/model_train/debug/debug_tools.rst rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/debug/dump.md (100%) rename {tutorials/source_en/advanced => docs/mindspore/source_en/model_train/debug}/error_analysis.rst (100%) rename {tutorials/source_en/advanced => docs/mindspore/source_en/model_train/debug}/error_analysis/cann_error_cases.md (100%) rename {tutorials/source_en/advanced => docs/mindspore/source_en/model_train/debug}/error_analysis/error_scenario_analysis.md (100%) rename {tutorials/source_en/advanced => docs/mindspore/source_en/model_train/debug}/error_analysis/images/dot_to_png.png (100%) rename {tutorials/source_en/advanced => docs/mindspore/source_en/model_train/debug}/error_analysis/minddata_debug.md (100%) rename {tutorials/source_en/advanced => docs/mindspore/source_en/model_train/debug}/error_analysis/mindir.md (100%) rename {tutorials/source_en/advanced => docs/mindspore/source_en/model_train/debug}/error_analysis/mindrt_debug.md (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/debug/fault_recover.md (100%) rename {tutorials/experts/source_en/optimize => docs/mindspore/source_en/model_train/debug}/graph_fusion_engine.md (100%) rename {tutorials/experts/source_zh_cn/optimize => docs/mindspore/source_en/model_train/debug}/images/data-and-graph-sink.eddx (100%) rename {tutorials/experts/source_en/optimize => docs/mindspore/source_en/model_train/debug}/images/graph_kernel_example_custom_op.png (100%) rename {tutorials/experts/source_en/optimize => docs/mindspore/source_en/model_train/debug}/images/graph_kernel_example_fuse_basic.png (100%) rename {tutorials/experts/source_en/optimize => docs/mindspore/source_en/model_train/debug}/mem_reuse.md (100%) create mode 100644 docs/mindspore/source_en/model_train/debug/opt_tools.rst create mode 100644 docs/mindspore/source_en/model_train/debug/overview.md rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/debug/rdr.md (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/debug/sdc.md (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/index.rst (34%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/parallel/advanced_operator_parallel.md (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/parallel/auto_parallel.rst (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/parallel/comm_fusion.md (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/parallel/comm_subgraph.md (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/parallel/data_parallel.md (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/parallel/dataset_slice.md (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/parallel/disaster_recover.md (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/parallel/distributed_case.rst (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/parallel/distributed_gradient_accumulation.md (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/parallel/distributed_graph_partition.md (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/parallel/dynamic_cluster.md (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/parallel/fault_recover.md (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/parallel/host_device_training.md (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/parallel/images/checkpoint_integrate_process.pptx (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/parallel/images/comm_subgraph.png (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/parallel/images/sharding_propagation.png (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/parallel/images/sp_case1.png (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/parallel/images/sp_case2.png (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/parallel/images/sp_case3.png (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/parallel/images/tensor_layout.png (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/parallel/manual_parallel.md (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/parallel/memory_offload.md (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/parallel/model_loading.md (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/parallel/model_save_load.rst (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/parallel/model_saving.md (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/parallel/model_transformation.md (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/parallel/mpirun.md (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/parallel/ms_operator.md (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/parallel/msrun_launcher.md (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/parallel/multiple_copy.md (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/parallel/multiple_mix.md (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/parallel/operator_parallel.md (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/parallel/optimize_technique.rst (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/parallel/optimizer_parallel.md (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/parallel/others.rst (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/parallel/overview.md (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/parallel/pangu_alpha.md (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/parallel/parameter_server_training.md (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/parallel/pipeline_parallel.md (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/parallel/rank_table.md (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/parallel/recompute.md (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/parallel/recover.rst (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/parallel/sapp.md (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/parallel/semi_auto_parallel.rst (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/parallel/shard_function_parallel.md (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/parallel/sharding_propagation.md (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/parallel/split_technique.md (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/parallel/startup_method.rst (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/parallel/strategy_select.md (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train}/parallel/support_dynamic_shape_in_parallel.md (100%) create mode 100644 docs/mindspore/source_en/model_train/program_form/images/dynamic.png rename docs/mindspore/source_en/{note => model_train/program_form}/index_support.md (100%) create mode 100644 docs/mindspore/source_en/model_train/program_form/interface.md create mode 100644 docs/mindspore/source_en/model_train/program_form/overview.md rename docs/mindspore/source_en/{note => model_train/program_form}/static_graph_syntax/operators.md (100%) rename docs/mindspore/source_en/{note => model_train/program_form}/static_graph_syntax/python_builtin_functions.md (100%) rename docs/mindspore/source_en/{note => model_train/program_form}/static_graph_syntax/statements.md (100%) rename {tutorials/source_en/advanced => docs/mindspore/source_en/model_train/program_form/static_graph_syntax}/static_graph_expert_programming.md (100%) rename docs/mindspore/source_en/{note => model_train/program_form/static_graph_syntax}/static_graph_syntax_support.md (100%) create mode 100644 docs/mindspore/source_en/model_train/train_process/algorithm_optimize.rst rename {tutorials/source_en/advanced => docs/mindspore/source_en/model_train/train_process}/derivation.md (100%) rename docs/mindspore/source_en/{design => model_train/train_process}/dynamic_shape.md (100%) create mode 100644 docs/mindspore/source_en/model_train/train_process/func_programming.rst rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train/train_process}/func_programming/Jacobians_Hessians.md (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train/train_process}/func_programming/per_sample_gradients.md (100%) rename {tutorials/experts/source_en/optimize => docs/mindspore/source_en/model_train/train_process}/images/image-data-sink.png (100%) rename {tutorials/experts/source_en/optimize => docs/mindspore/source_en/model_train/train_process}/images/image-graph-sink.png (100%) rename {tutorials/experts/source_en/optimize => docs/mindspore/source_en/model_train/train_process}/images/image-loop-sink.png (100%) rename {tutorials/experts/source_en/optimize => docs/mindspore/source_en/model_train/train_process}/images/image-user-view.png (100%) rename {tutorials/experts/source_en/optimize => docs/mindspore/source_en/model_train/train_process}/images/image-without-sink.png (100%) rename {tutorials/source_en/advanced => docs/mindspore/source_en/model_train/train_process}/model.rst (100%) rename {tutorials/source_en/advanced => docs/mindspore/source_en/model_train/train_process}/model/callback.md (100%) rename {tutorials/source_en/advanced => docs/mindspore/source_en/model_train/train_process}/model/images/model.png (100%) rename {tutorials/source_en/advanced => docs/mindspore/source_en/model_train/train_process}/model/metric.md (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train/train_process}/optimize/gradient_accumulation.md (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_en/model_train/train_process}/optimize/images/graph_kernel_example_custom_op.png (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_en/model_train/train_process}/optimize/images/graph_kernel_example_fuse_basic.png (100%) create mode 100644 docs/mindspore/source_en/model_train/train_process/optimize/images/image-data-sink.png create mode 100644 docs/mindspore/source_en/model_train/train_process/optimize/images/image-graph-sink.png create mode 100644 docs/mindspore/source_en/model_train/train_process/optimize/images/image-loop-sink.png create mode 100644 docs/mindspore/source_en/model_train/train_process/optimize/images/image-user-view.png create mode 100644 docs/mindspore/source_en/model_train/train_process/optimize/images/image-without-sink.png rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train/train_process}/optimize/thor.rst (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train/train_process}/optimize/thor/intro.md (100%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train/train_process}/optimize/thor/resnet50.md (100%) create mode 100644 docs/mindspore/source_en/model_train/train_process/overview.md rename tutorials/experts/source_en/optimize/execution_opt.md => docs/mindspore/source_en/model_train/train_process/train_optimize.md (96%) rename {tutorials/experts/source_en => docs/mindspore/source_en/model_train/train_process}/vmap/vmap.ipynb (100%) create mode 100644 docs/mindspore/source_zh_cn/api_python/index.rst create mode 100644 docs/mindspore/source_zh_cn/design/index.rst create mode 100644 docs/mindspore/source_zh_cn/faq/index.rst create mode 100644 docs/mindspore/source_zh_cn/kits_tools/index.rst rename docs/mindspore/source_zh_cn/{note => kits_tools}/official_models.md (100%) create mode 100644 docs/mindspore/source_zh_cn/kits_tools/overview.md rename docs/mindspore/source_zh_cn/migration_guide/{debug_and_tune.md => acc_debug.md} (49%) create mode 100644 docs/mindspore/source_zh_cn/migration_guide/debug.md create mode 100644 docs/mindspore/source_zh_cn/migration_guide/index.rst create mode 100644 docs/mindspore/source_zh_cn/migration_guide/migration_tools.md create mode 100644 docs/mindspore/source_zh_cn/migration_guide/model_infer.md create mode 100644 docs/mindspore/source_zh_cn/migration_guide/perf_debug.md create mode 100644 docs/mindspore/source_zh_cn/migration_guide/reference.rst create mode 100644 docs/mindspore/source_zh_cn/model_infer/index.rst create mode 100644 docs/mindspore/source_zh_cn/model_infer/llm_infer.rst create mode 100644 docs/mindspore/source_zh_cn/model_infer/llm_lite.md rename {tutorials/experts/source_zh_cn/infer => docs/mindspore/source_zh_cn/model_infer}/model_compression.md (100%) rename tutorials/experts/source_zh_cn/infer/inference.md => docs/mindspore/source_zh_cn/model_infer/overview.md (99%) create mode 100644 docs/mindspore/source_zh_cn/model_train/custom_program/fusion_pass.md create mode 100644 docs/mindspore/source_zh_cn/model_train/custom_program/hook_program.ipynb rename {tutorials/source_zh_cn/advanced/modules => docs/mindspore/source_zh_cn/model_train/custom_program}/images/AlexNet.ppm (100%) rename {tutorials/source_zh_cn/advanced/modules => docs/mindspore/source_zh_cn/model_train/custom_program}/images/learning_rate.png (100%) rename {tutorials/source_zh_cn/advanced/modules => docs/mindspore/source_zh_cn/model_train/custom_program}/images/loss_function.png (100%) rename {tutorials/source_zh_cn/advanced/modules => docs/mindspore/source_zh_cn/model_train/custom_program}/initializer.ipynb (99%) rename {tutorials/source_zh_cn/advanced/modules => docs/mindspore/source_zh_cn/model_train/custom_program}/layer.ipynb (30%) rename {tutorials/source_zh_cn/advanced/modules => docs/mindspore/source_zh_cn/model_train/custom_program}/loss.ipynb (99%) create mode 100644 docs/mindspore/source_zh_cn/model_train/custom_program/network_custom.ipynb create mode 100644 docs/mindspore/source_zh_cn/model_train/custom_program/op_custom.rst rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train/custom_program}/operation/ms_kernel.ipynb (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train/custom_program}/operation/op_custom.ipynb (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train/custom_program}/operation/op_custom_adv.ipynb (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train/custom_program}/operation/op_custom_aot.md (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train/custom_program}/operation/op_custom_ascendc.md (100%) rename {tutorials/source_zh_cn/advanced/modules => docs/mindspore/source_zh_cn/model_train/custom_program}/optimizer.ipynb (99%) create mode 100644 docs/mindspore/source_zh_cn/model_train/custom_program/overview.md rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/dataset/augment.ipynb (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/dataset/cache.ipynb (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/dataset/dataset_autotune.md (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/dataset/dataset_offload.md (100%) rename {tutorials/source_zh_cn/advanced => docs/mindspore/source_zh_cn/model_train}/dataset/eager.ipynb (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/dataset/images/auto_augmentation.png (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/dataset/images/autotune.png (100%) rename {tutorials/source_zh_cn/advanced => docs/mindspore/source_zh_cn/model_train}/dataset/images/basic_graph.graffle (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/dataset/images/cache_dataset.png (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/dataset/images/cache_pipeline_zh.eddx (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/dataset/images/cache_processed_data.png (100%) rename {tutorials/source_zh_cn/advanced => docs/mindspore/source_zh_cn/model_train}/dataset/images/cifar10.jpg (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/dataset/images/compose.png (100%) rename {tutorials/source_zh_cn/advanced => docs/mindspore/source_zh_cn/model_train}/dataset/images/data_conversion_concept.graffle (100%) rename {tutorials/source_zh_cn/advanced => docs/mindspore/source_zh_cn/model_train}/dataset/images/data_conversion_concept.png (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/dataset/images/data_conversion_concept.pptx (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/dataset/images/data_enhancement_performance_scheme.eddx (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/dataset/images/data_enhancement_performance_scheme.png (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/dataset/images/data_loading_performance_scheme.png (100%) rename {tutorials/source_zh_cn/advanced => docs/mindspore/source_zh_cn/model_train}/dataset/images/dataset_process.eddx (100%) rename {tutorials/source_zh_cn/advanced => docs/mindspore/source_zh_cn/model_train}/dataset/images/dataset_process.graffle (100%) rename {tutorials/source_zh_cn/advanced => docs/mindspore/source_zh_cn/model_train}/dataset/images/eager_mode.jpeg (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/dataset/images/map.eddx (100%) rename {tutorials/source_zh_cn/advanced => docs/mindspore/source_zh_cn/model_train}/dataset/images/mindrecord.graffle (100%) rename {tutorials/source_zh_cn/advanced => docs/mindspore/source_zh_cn/model_train}/dataset/images/mindrecord.png (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/dataset/images/mindrecord.pptx (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/dataset/images/offload_process.PNG (100%) rename {tutorials/source_zh_cn/advanced => docs/mindspore/source_zh_cn/model_train}/dataset/images/op_batch.graffle (100%) rename {tutorials/source_zh_cn/advanced => docs/mindspore/source_zh_cn/model_train}/dataset/images/op_batch.png (100%) rename {tutorials/source_zh_cn/advanced => docs/mindspore/source_zh_cn/model_train}/dataset/images/op_shuffle.graffle (100%) rename {tutorials/source_zh_cn/advanced => docs/mindspore/source_zh_cn/model_train}/dataset/images/op_shuffle.png (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/dataset/images/operation_fusion.png (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/dataset/images/pipeline.png (100%) rename {tutorials/source_zh_cn/advanced => docs/mindspore/source_zh_cn/model_train}/dataset/images/pipeline_mode.jpeg (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/dataset/images/shuffle_performance_scheme.png (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/dataset/optimize.ipynb (100%) create mode 100644 docs/mindspore/source_zh_cn/model_train/dataset/overview.md rename {tutorials/source_zh_cn/advanced => docs/mindspore/source_zh_cn/model_train}/dataset/python_objects.ipynb (100%) rename {tutorials/source_zh_cn/advanced => docs/mindspore/source_zh_cn/model_train}/dataset/record.ipynb (100%) rename {tutorials/source_zh_cn/advanced => docs/mindspore/source_zh_cn/model_train}/dataset/sampler.ipynb (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/debug/aoe.md (100%) create mode 100644 docs/mindspore/source_zh_cn/model_train/debug/debug_tools.rst rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/debug/dump.md (100%) rename {tutorials/source_zh_cn/advanced => docs/mindspore/source_zh_cn/model_train/debug}/error_analysis.rst (100%) rename {tutorials/source_zh_cn/advanced => docs/mindspore/source_zh_cn/model_train/debug}/error_analysis/cann_error_cases.md (100%) rename {tutorials/source_zh_cn/advanced => docs/mindspore/source_zh_cn/model_train/debug}/error_analysis/error_scenario_analysis.md (100%) rename {tutorials/source_zh_cn/advanced => docs/mindspore/source_zh_cn/model_train/debug}/error_analysis/images/dot_to_png.png (100%) rename {tutorials/source_zh_cn/advanced => docs/mindspore/source_zh_cn/model_train/debug}/error_analysis/images/minddata_errmsg.png (100%) rename {tutorials/source_zh_cn/advanced => docs/mindspore/source_zh_cn/model_train/debug}/error_analysis/images/pynative_errmsg.png (100%) rename {tutorials/source_zh_cn/advanced => docs/mindspore/source_zh_cn/model_train/debug}/error_analysis/minddata_debug.md (100%) rename {tutorials/source_zh_cn/advanced => docs/mindspore/source_zh_cn/model_train/debug}/error_analysis/mindir.md (100%) rename {tutorials/source_zh_cn/advanced => docs/mindspore/source_zh_cn/model_train/debug}/error_analysis/mindrt_debug.md (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/debug/fault_recover.md (100%) rename {tutorials/experts/source_zh_cn/optimize => docs/mindspore/source_zh_cn/model_train/debug}/graph_fusion_engine.ipynb (100%) create mode 100644 docs/mindspore/source_zh_cn/model_train/debug/images/data-and-graph-sink.eddx rename {tutorials/source_zh_cn/advanced => docs/mindspore/source_zh_cn/model_train/debug}/images/error_debug.png (100%) rename {tutorials/source_zh_cn/advanced => docs/mindspore/source_zh_cn/model_train/debug}/images/graph_errmsg.png (100%) create mode 100644 docs/mindspore/source_zh_cn/model_train/debug/images/graph_kernel_example_custom_op.png create mode 100644 docs/mindspore/source_zh_cn/model_train/debug/images/graph_kernel_example_fuse_basic.png rename {tutorials/experts/source_zh_cn/optimize => docs/mindspore/source_zh_cn/model_train/debug}/mem_reuse.md (100%) create mode 100644 docs/mindspore/source_zh_cn/model_train/debug/opt_tools.rst create mode 100644 docs/mindspore/source_zh_cn/model_train/debug/overview.md rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/debug/rdr.md (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/debug/sdc.md (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/index.rst (36%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/advanced_operator_parallel.md (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/auto_parallel.rst (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/comm_fusion.md (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/comm_subgraph.md (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/data_parallel.md (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/dataset_slice.md (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/disaster_recover.md (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/distributed_case.rst (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/distributed_gradient_accumulation.md (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/distributed_graph_partition.md (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/dynamic_cluster.md (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/fault_recover.md (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/host_device_training.md (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/images/advanced_operator_parallel_view1.PNG (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/images/advanced_operator_parallel_view2.PNG (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/images/checkpoint_integrate_process.pptx (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/images/comm_subgraph.png (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/images/data_parallel.png (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/images/distributed_graph_partition.png (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/images/host_device_image_0_zh.png (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/images/host_device_image_1_zh.png (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/images/megatron.png (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/images/memory_offload.png (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/images/mindspore.png (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/images/operator_parallel_image_0_zh.png (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/images/operator_parallel_image_1_zh.png (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/images/operator_parallel_image_2_zh.png (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/images/operator_parallel_image_3_zh.png (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/images/operator_parallel_image_4_zh.png (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/images/optimizer_parallel_image_0_zh.png (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/images/optimizer_parallel_image_1_zh.png (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/images/pangu_strategy.png (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/images/pipeline_parallel_image_0_zh.png (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/images/pipeline_parallel_image_1_zh.png (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/images/pipeline_parallel_image_2_zh.png (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/images/pynative_jit.png (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/images/recompute_image_0_zh.png (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/images/recompute_image_1_zh.png (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/images/sharding_propagation_zh.png (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/images/sp_case1_zh.png (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/images/sp_case2_zh.png (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/images/sp_case3_zh.png (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/images/tensor_layout_zh.png (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/images/tensor_redistribution_zh.png (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/manual_parallel.md (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/memory_offload.md (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/model_loading.md (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/model_save_load.rst (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/model_saving.md (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/model_transformation.md (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/mpirun.md (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/ms_operator.md (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/msrun_launcher.md (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/multiple_copy.md (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/multiple_mix.md (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/operator_parallel.md (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/optimize_technique.rst (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/optimizer_parallel.md (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/others.rst (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/overview.md (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/pangu_alpha.md (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/parameter_server_training.md (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/pipeline_parallel.md (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/rank_table.md (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/recompute.md (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/recover.rst (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/sapp.md (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/semi_auto_parallel.rst (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/shard_function_parallel.md (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/sharding_propagation.md (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/split_technique.md (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/startup_method.rst (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/strategy_select.md (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train}/parallel/support_dynamic_shape_in_parallel.md (100%) create mode 100644 docs/mindspore/source_zh_cn/model_train/program_form/images/dynamic.png rename docs/mindspore/source_zh_cn/{note => model_train/program_form}/index_support.ipynb (100%) create mode 100644 docs/mindspore/source_zh_cn/model_train/program_form/interface.md create mode 100644 docs/mindspore/source_zh_cn/model_train/program_form/overview.md rename docs/mindspore/source_zh_cn/{note => model_train/program_form}/static_graph_syntax/operators.md (100%) rename docs/mindspore/source_zh_cn/{note => model_train/program_form}/static_graph_syntax/python_builtin_functions.ipynb (100%) rename docs/mindspore/source_zh_cn/{note => model_train/program_form}/static_graph_syntax/statements.ipynb (100%) rename {tutorials/source_zh_cn/advanced => docs/mindspore/source_zh_cn/model_train/program_form/static_graph_syntax}/static_graph_expert_programming.ipynb (100%) rename docs/mindspore/source_zh_cn/{note => model_train/program_form/static_graph_syntax}/static_graph_syntax_support.ipynb (100%) create mode 100644 docs/mindspore/source_zh_cn/model_train/train_process/algorithm_optimize.rst rename {tutorials/source_zh_cn/advanced => docs/mindspore/source_zh_cn/model_train/train_process}/derivation.ipynb (100%) rename docs/mindspore/source_zh_cn/{design => model_train/train_process}/dynamic_shape.md (100%) create mode 100644 docs/mindspore/source_zh_cn/model_train/train_process/func_programming.rst rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train/train_process}/func_programming/Jacobians_Hessians.ipynb (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train/train_process}/func_programming/per_sample_gradients.ipynb (100%) create mode 100644 docs/mindspore/source_zh_cn/model_train/train_process/images/dynamic_shape/static_dynamic_shape_diff.png create mode 100644 docs/mindspore/source_zh_cn/model_train/train_process/images/dynamic_shape/symbol_engine.png rename {tutorials/experts/source_zh_cn/optimize => docs/mindspore/source_zh_cn/model_train/train_process}/images/image-data-sink.png (100%) rename {tutorials/experts/source_zh_cn/optimize => docs/mindspore/source_zh_cn/model_train/train_process}/images/image-graph-sink.png (100%) rename {tutorials/experts/source_zh_cn/optimize => docs/mindspore/source_zh_cn/model_train/train_process}/images/image-loop-sink.png (100%) rename {tutorials/experts/source_zh_cn/optimize => docs/mindspore/source_zh_cn/model_train/train_process}/images/image-user-view.png (100%) rename {tutorials/experts/source_zh_cn/optimize => docs/mindspore/source_zh_cn/model_train/train_process}/images/image-without-sink.png (100%) rename {tutorials/source_zh_cn/advanced => docs/mindspore/source_zh_cn/model_train/train_process}/model.rst (100%) rename {tutorials/source_zh_cn/advanced => docs/mindspore/source_zh_cn/model_train/train_process}/model/callback.ipynb (100%) rename {tutorials/source_zh_cn/advanced => docs/mindspore/source_zh_cn/model_train/train_process}/model/images/model.graffle (100%) rename {tutorials/source_zh_cn/advanced => docs/mindspore/source_zh_cn/model_train/train_process}/model/images/model.png (100%) rename {tutorials/source_zh_cn/advanced => docs/mindspore/source_zh_cn/model_train/train_process}/model/images/save.graffle (100%) rename {tutorials/source_zh_cn/advanced => docs/mindspore/source_zh_cn/model_train/train_process}/model/metric.ipynb (100%) rename {tutorials/source_zh_cn/advanced => docs/mindspore/source_zh_cn/model_train/train_process}/model/model.ipynb (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train/train_process}/optimize/gradient_accumulation.ipynb (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train/train_process}/optimize/images/GradientAccumulation1.png (100%) create mode 100644 docs/mindspore/source_zh_cn/model_train/train_process/optimize/images/data-and-graph-sink.eddx create mode 100644 docs/mindspore/source_zh_cn/model_train/train_process/optimize/images/graph_kernel_example_custom_op.png create mode 100644 docs/mindspore/source_zh_cn/model_train/train_process/optimize/images/graph_kernel_example_fuse_basic.png create mode 100644 docs/mindspore/source_zh_cn/model_train/train_process/optimize/images/image-data-sink.png create mode 100644 docs/mindspore/source_zh_cn/model_train/train_process/optimize/images/image-graph-sink.png create mode 100644 docs/mindspore/source_zh_cn/model_train/train_process/optimize/images/image-loop-sink.png create mode 100644 docs/mindspore/source_zh_cn/model_train/train_process/optimize/images/image-user-view.png create mode 100644 docs/mindspore/source_zh_cn/model_train/train_process/optimize/images/image-without-sink.png rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train/train_process}/optimize/images/mix_precision_fp16.eddx (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train/train_process}/optimize/images/mix_precision_fp16.png (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train/train_process}/optimize/thor.rst (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train/train_process}/optimize/thor/images/deeplearning_train_process.png (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train/train_process}/optimize/thor/images/different_train_process.png (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train/train_process}/optimize/thor/images/split_dimension.png (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train/train_process}/optimize/thor/images/thor_in_bert.png (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train/train_process}/optimize/thor/images/thor_in_resnet.png (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train/train_process}/optimize/thor/images/thor_largebs_in_resnet.png (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train/train_process}/optimize/thor/intro.md (100%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train/train_process}/optimize/thor/resnet50.md (100%) create mode 100644 docs/mindspore/source_zh_cn/model_train/train_process/overview.md rename tutorials/experts/source_zh_cn/optimize/execution_opt.ipynb => docs/mindspore/source_zh_cn/model_train/train_process/train_optimize.ipynb (94%) rename {tutorials/experts/source_zh_cn => docs/mindspore/source_zh_cn/model_train/train_process}/vmap/vmap.ipynb (100%) create mode 100644 tools/generate_html/replace_html_menu.py delete mode 100644 tutorials/application/Makefile delete mode 100644 tutorials/application/requirements.txt delete mode 100644 tutorials/application/source_en/conf.py delete mode 100644 tutorials/application/source_en/index.rst delete mode 100644 tutorials/application/source_zh_cn/conf.py delete mode 100644 tutorials/application/source_zh_cn/index.rst delete mode 100644 tutorials/experts/Makefile delete mode 100644 tutorials/experts/requirements.txt delete mode 100644 tutorials/experts/source_en/conf.py delete mode 100644 tutorials/experts/source_zh_cn/conf.py delete mode 100644 tutorials/source_en/advanced/dataset.rst delete mode 100644 tutorials/source_en/advanced/modules.rst rename tutorials/source_en/{advanced => beginner}/images/fp16_vs_fp32.png (100%) rename tutorials/source_en/{advanced => beginner}/mixed_precision.md (100%) rename tutorials/{application => }/source_en/cv/fcn8s.md (100%) rename tutorials/{application => }/source_en/cv/images/SSD_10.jpg (100%) rename tutorials/{application => }/source_en/cv/images/SSD_13.jpg (100%) rename tutorials/{application => }/source_en/cv/images/SSD_14.jpg (100%) rename tutorials/{application => }/source_en/cv/images/SSD_4.png (100%) rename tutorials/{application => }/source_en/cv/images/data_process.png (100%) rename tutorials/{application => }/source_en/cv/images/output_161_0.png (100%) rename tutorials/{application => }/source_en/cv/images/output_34_0.png (100%) rename tutorials/{application => }/source_en/cv/images/output_6_1.png (100%) rename tutorials/{application => }/source_en/cv/images/output_9_0.png (100%) rename tutorials/{application => }/source_en/cv/images/transfer_learning_output_26_0.png (100%) rename tutorials/{application => }/source_en/cv/resnet50.md (100%) rename tutorials/{application => }/source_en/cv/shufflenet.md (100%) rename tutorials/{application => }/source_en/cv/ssd.md (100%) rename tutorials/{application => }/source_en/cv/transfer_learning.md (100%) rename tutorials/{application => }/source_en/cv/vit.md (100%) rename tutorials/{application => }/source_en/generative/cyclegan.md (100%) rename tutorials/{application => }/source_en/generative/dcgan.md (100%) rename tutorials/{application => }/source_en/generative/diffusion.md (100%) rename tutorials/{application => }/source_en/generative/gan.md (100%) rename tutorials/{application => }/source_en/generative/images/dcgan_output_26_0.png (100%) rename tutorials/{application => }/source_en/generative/images/output_22_0.png (100%) rename tutorials/{application => }/source_en/generative/images/output_8_0.png (100%) rename tutorials/{application => }/source_en/generative/pix2pix.md (100%) rename tutorials/{application => }/source_en/nlp/sentiment_analysis.md (100%) rename tutorials/{application => }/source_en/nlp/sequence_labeling.md (100%) delete mode 100644 tutorials/source_zh_cn/advanced/dataset.rst delete mode 100644 tutorials/source_zh_cn/advanced/modules.rst delete mode 100644 tutorials/source_zh_cn/advanced/modules/cell.ipynb rename tutorials/source_zh_cn/{advanced => beginner}/images/fp16_vs_fp32.png (100%) rename tutorials/source_zh_cn/{advanced => beginner}/mixed_precision.ipynb (100%) rename tutorials/{application => }/source_zh_cn/cv/fcn8s.ipynb (99%) rename tutorials/{application => }/source_zh_cn/cv/images/SSD_1.png (100%) rename tutorials/{application => }/source_zh_cn/cv/images/SSD_10.jpg (100%) rename tutorials/{application => }/source_zh_cn/cv/images/SSD_11.jpg (100%) rename tutorials/{application => }/source_zh_cn/cv/images/SSD_12.jpg (100%) rename tutorials/{application => }/source_zh_cn/cv/images/SSD_13.jpg (100%) rename tutorials/{application => }/source_zh_cn/cv/images/SSD_14.jpg (100%) rename tutorials/{application => }/source_zh_cn/cv/images/SSD_15.jpg (100%) rename tutorials/{application => }/source_zh_cn/cv/images/SSD_16.jpg (100%) rename tutorials/{application => }/source_zh_cn/cv/images/SSD_2.jpg (100%) rename tutorials/{application => }/source_zh_cn/cv/images/SSD_3.jpg (100%) rename tutorials/{application => }/source_zh_cn/cv/images/SSD_4.png (100%) rename tutorials/{application => }/source_zh_cn/cv/images/SSD_5.png (100%) rename tutorials/{application => }/source_zh_cn/cv/images/SSD_6.jpg (100%) rename tutorials/{application => }/source_zh_cn/cv/images/SSD_7.jpg (100%) rename tutorials/{application => }/source_zh_cn/cv/images/SSD_8.jpg (100%) rename tutorials/{application => }/source_zh_cn/cv/images/SSD_9.png (100%) rename tutorials/{application => }/source_zh_cn/cv/images/data_process.png (100%) rename tutorials/{application => }/source_zh_cn/cv/images/dcgan.gif (100%) rename tutorials/{application => }/source_zh_cn/cv/images/dcgan.png (100%) rename tutorials/{application => }/source_zh_cn/cv/images/encoder_decoder.png (100%) rename tutorials/{application => }/source_zh_cn/cv/images/fcn_1.png (100%) rename tutorials/{application => }/source_zh_cn/cv/images/fcn_2.png (100%) rename tutorials/{application => }/source_zh_cn/cv/images/fcn_3.png (100%) rename tutorials/{application => }/source_zh_cn/cv/images/fcn_4.png (100%) rename tutorials/{application => }/source_zh_cn/cv/images/fcn_5.png (100%) rename tutorials/{application => }/source_zh_cn/cv/images/fcn_6.png (100%) rename tutorials/{application => }/source_zh_cn/cv/images/gan_image.png (100%) rename tutorials/{application => }/source_zh_cn/cv/images/infer_result.jpg (100%) mode change 100755 => 100644 rename tutorials/{application => }/source_zh_cn/cv/images/multi_head_attention.png (100%) rename tutorials/{application => }/source_zh_cn/cv/images/resnet_1.png (100%) rename tutorials/{application => }/source_zh_cn/cv/images/resnet_2.png (100%) rename tutorials/{application => }/source_zh_cn/cv/images/resnet_3.png (100%) rename tutorials/{application => }/source_zh_cn/cv/images/resnet_4.png (100%) rename tutorials/{application => }/source_zh_cn/cv/images/resnet_5.png (100%) rename tutorials/{application => }/source_zh_cn/cv/images/resnet_6.png (100%) rename tutorials/{application => }/source_zh_cn/cv/images/self_attention_1.png (100%) rename tutorials/{application => }/source_zh_cn/cv/images/self_attention_2.png (100%) rename tutorials/{application => }/source_zh_cn/cv/images/self_attention_3.png (100%) rename tutorials/{application => }/source_zh_cn/cv/images/self_attention_process.png (100%) rename tutorials/{application => }/source_zh_cn/cv/images/shufflenet_1.png (100%) rename tutorials/{application => }/source_zh_cn/cv/images/shufflenet_2.png (100%) rename tutorials/{application => }/source_zh_cn/cv/images/shufflenet_3.png (100%) rename tutorials/{application => }/source_zh_cn/cv/images/shufflenet_4.png (100%) rename tutorials/{application => }/source_zh_cn/cv/images/shufflenet_5.png (100%) rename tutorials/{application => }/source_zh_cn/cv/images/shufflenet_6.png (100%) rename tutorials/{application => }/source_zh_cn/cv/images/transformer_architecture.png (100%) rename tutorials/{application => }/source_zh_cn/cv/images/vit_architecture.png (100%) rename tutorials/{application => }/source_zh_cn/cv/images/vit_encoder.png (100%) rename tutorials/{application => }/source_zh_cn/cv/resnet50.ipynb (100%) rename tutorials/{application => }/source_zh_cn/cv/shufflenet.ipynb (99%) rename tutorials/{application => }/source_zh_cn/cv/ssd.ipynb (100%) rename tutorials/{application => }/source_zh_cn/cv/transfer_learning.ipynb (100%) rename tutorials/{application => }/source_zh_cn/cv/vit.ipynb (100%) rename tutorials/{application => }/source_zh_cn/generative/cyclegan.ipynb (100%) rename tutorials/{application => }/source_zh_cn/generative/dcgan.ipynb (100%) rename tutorials/{application => }/source_zh_cn/generative/diffusion.ipynb (100%) rename tutorials/{application => }/source_zh_cn/generative/gan.ipynb (100%) rename tutorials/{application => }/source_zh_cn/generative/images/CycleGAN.png (100%) rename tutorials/{application => }/source_zh_cn/generative/images/CycleGAN_1.png (100%) rename tutorials/{application => }/source_zh_cn/generative/images/CycleGAN_2.jpg (100%) rename tutorials/{application => }/source_zh_cn/generative/images/diffusion_1.png (100%) rename tutorials/{application => }/source_zh_cn/generative/images/diffusion_2.png (100%) rename tutorials/{application => }/source_zh_cn/generative/images/diffusion_3.png (100%) rename tutorials/{application => }/source_zh_cn/generative/images/diffusion_4.jpg (100%) rename tutorials/{application => }/source_zh_cn/generative/images/diffusion_5.png (100%) rename tutorials/{application => }/source_zh_cn/generative/images/pix2pix_1.png (100%) rename tutorials/{application => }/source_zh_cn/generative/images/pix2pix_2.png (100%) rename tutorials/{application => }/source_zh_cn/generative/images/pix2pix_3.png (100%) rename tutorials/{application => }/source_zh_cn/generative/images/train_test.gif (100%) rename tutorials/{application => }/source_zh_cn/generative/pix2pix.ipynb (100%) rename tutorials/{application => }/source_zh_cn/nlp/images/0-LSTM.png (100%) rename tutorials/{application => }/source_zh_cn/nlp/images/0-RNN-0.png (100%) rename tutorials/{application => }/source_zh_cn/nlp/images/0-RNN.png (100%) rename tutorials/{application => }/source_zh_cn/nlp/sentiment_analysis.ipynb (100%) rename tutorials/{application => }/source_zh_cn/nlp/sequence_labeling.ipynb (100%) diff --git a/docs/mindspore/Makefile b/docs/mindspore/Makefile index 738c74e790..195e0a1b02 100644 --- a/docs/mindspore/Makefile +++ b/docs/mindspore/Makefile @@ -19,9 +19,10 @@ help: %: Makefile @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) -EXTRADIR = $(SOURCEDIR)/api_python +# EXTRADIR = $(SOURCEDIR)/api_python +# -rm -rf $(BUILDDIR)/* $(EXTRADIR)/* .PHONY: clean clean: - -rm -rf $(BUILDDIR)/* $(EXTRADIR)/* + -rm -rf $(BUILDDIR)/* diff --git a/docs/mindspore/source_en/api_python/index.rst b/docs/mindspore/source_en/api_python/index.rst new file mode 100644 index 0000000000..01d63824d1 --- /dev/null +++ b/docs/mindspore/source_en/api_python/index.rst @@ -0,0 +1,29 @@ +API +========================= + +.. toctree:: + :glob: + :maxdepth: 1 + + mindspore + mindspore.nn + mindspore.ops + mindspore.ops.primitive + mindspore.mint + mindspore.amp + mindspore.train + mindspore.communication + mindspore.communication.comm_func + mindspore.common.initializer + mindspore.hal + mindspore.dataset + mindspore.dataset.transforms + mindspore.mindrecord + mindspore.nn.probability + mindspore.rewrite + mindspore.multiprocessing + mindspore.boost + mindspore.numpy + mindspore.scipy + mindspore.experimental + ../note/env_var_list diff --git a/docs/mindspore/source_en/conf.py b/docs/mindspore/source_en/conf.py index 71c4660aa4..542ba98011 100644 --- a/docs/mindspore/source_en/conf.py +++ b/docs/mindspore/source_en/conf.py @@ -256,9 +256,15 @@ src_dir_en = os.path.join(repo_path, copy_path) des_sir = "./api_python" def copy_source(sourcedir, des_sir): - if os.path.exists(des_sir): - shutil.rmtree(des_sir) - shutil.copytree(sourcedir, des_sir) + for i in os.listdir(sourcedir): + if os.path.isfile(os.path.join(sourcedir, i)): + if os.path.exists(os.path.join(des_sir, i)): + os.remove(os.path.join(des_sir, i)) + shutil.copy(os.path.join(sourcedir, i), os.path.join(des_sir, i)) + else: + if os.path.exists(os.path.join(des_sir, i)): + shutil.rmtree(os.path.join(des_sir, i)) + shutil.copytree(os.path.join(sourcedir, i), os.path.join(des_sir, i)) copy_source(src_dir_en, des_sir) diff --git a/docs/mindspore/source_en/design/index.rst b/docs/mindspore/source_en/design/index.rst new file mode 100644 index 0000000000..555e981142 --- /dev/null +++ b/docs/mindspore/source_en/design/index.rst @@ -0,0 +1,17 @@ +Design Concept +========================= + +.. toctree:: + :glob: + :maxdepth: 1 + + overview + tensor_view + programming_paradigm + dynamic_graph_and_static_graph + distributed_training_design + data_engine + all_scenarios + graph_fusion_engine + pluggable_device + glossary diff --git a/docs/mindspore/source_en/faq/index.rst b/docs/mindspore/source_en/faq/index.rst new file mode 100644 index 0000000000..28cebf75fd --- /dev/null +++ b/docs/mindspore/source_en/faq/index.rst @@ -0,0 +1,17 @@ +FAQ +======== + +.. toctree:: + :glob: + :maxdepth: 1 + + installation + data_processing + implement_problem + network_compilation + operators_compile + performance_tuning + precision_tuning + distributed_parallel + inference + feature_advice diff --git a/docs/mindspore/source_en/kits_tools/index.rst b/docs/mindspore/source_en/kits_tools/index.rst new file mode 100644 index 0000000000..34a38adc81 --- /dev/null +++ b/docs/mindspore/source_en/kits_tools/index.rst @@ -0,0 +1,9 @@ +Models and Kits +================= + +.. toctree:: + :glob: + :maxdepth: 1 + + overview + official_models diff --git a/docs/mindspore/source_en/note/official_models.md b/docs/mindspore/source_en/kits_tools/official_models.md similarity index 100% rename from docs/mindspore/source_en/note/official_models.md rename to docs/mindspore/source_en/kits_tools/official_models.md diff --git a/docs/mindspore/source_en/kits_tools/overview.md b/docs/mindspore/source_en/kits_tools/overview.md new file mode 100644 index 0000000000..21ae3c0d85 --- /dev/null +++ b/docs/mindspore/source_en/kits_tools/overview.md @@ -0,0 +1,18 @@ +# Models and Kits + +[![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_en/kits_tools/overview.md) + +| Core Frameworks | Toolset |Domain Suites and Extension Packages | Scientific Computing | Foundation Model | +| ---- | ----- | ------- | --------- | ------------- | +| [MindSpore](https://www.mindspore.cn/docs/en/master/index.html) | [MindSpore Insight](https://www.mindspore.cn/mindinsight/docs/en/r2.3/index.html) | [MindSpore CV](https://mindspore-lab.github.io/mindcv/) | [MindSpore SciAI](https://www.mindspore.cn/sciai/docs/en/r0.1/index.html) | [MindSpore Transformers](https://mindformers.readthedocs.io/en/latest/)| +| [MindSpore Lite](https://www.mindspore.cn/lite) | [MindSpore Armour](https://www.mindspore.cn/mindarmour/docs/en/r2.0/index.html) | [MindSpore NLP](https://mindnlp.cqu.ai/) | [MindSpore Elec](https://www.mindspore.cn/mindelec/docs/en/r0.2/index.html) | [MindSpore Pet](https://github.com/mindspore-lab/mindpet)| +| [MindSpore AKG](https://gitee.com/mindspore/akg) | [MindSpore Serving](https://www.mindspore.cn/serving/docs/en/r2.0/index.html) | [MindSpore Audio](https://github.com/mindspore-lab/mindaudio) | [MindSpore SPONGE](https://www.mindspore.cn/mindsponge/docs/en/r1.0.0-rc2/index.html) | [MindSpore RLHF](https://github.com/mindspore-lab/mindrlhf)| +| | [MindSpore Federated](https://www.mindspore.cn/federated/docs/en/r0.1/index.html) | [MindSpore OCR](https://mindspore-lab.github.io/mindocr/) | [MindSpore Flow](https://www.mindspore.cn/mindflow/docs/en/r0.2/index.html) | [MindSpore One](https://github.com/mindspore-lab/mindone)| +| | [MindSpore Golden Stick](https://www.mindspore.cn/golden_stick/docs/en/r0.4/index.html) | [MindSpore YOLO](https://mindspore-lab.github.io/mindyolo/) | [MindSpore Earth](https://www.mindspore.cn/mindearth/docs/en/r0.2/index.html) | [MindSpore Recommender](https://www.mindspore.cn/recommender/docs/en/r0.3/index.html)| +| | [MindSpore XAI](https://www.mindspore.cn/xai/docs/en/r1.8/index.html) | [MindSpore Face](https://github.com/mindspore-lab/mindface) | [MindSpore Quantum](https://www.mindspore.cn/mindquantum/docs/en/r0.9/index.html)| | +| | [MindSpore Dev Toolkits](https://www.mindspore.cn/devtoolkit/docs/en/r2.2/index.html) | [MindSpore Graph Learning](https://www.mindspore.cn/graphlearning/docs/en/r0.2/index.html)| | | +| | | [MindSpore Reinforcement](https://www.mindspore.cn/reinforcement/docs/en/r0.7/index.html)| | | +| | | [MindSpore Probability](https://www.mindspore.cn/probability/docs/en/r1.7/index.html)| | | +| | | [MindSpore Pandas](https://www.mindspore.cn/mindpandas/docs/en/r0.2/index.html)| | | +| | | [MindSpore ModelZoo](https://gitee.com/mindspore/models)| | | +| | | [MindSpore Hub](https://www.mindspore.cn/hub/docs/en/r1.9/index.html)| | | \ No newline at end of file diff --git a/docs/mindspore/source_en/migration_guide/debug_and_tune.md b/docs/mindspore/source_en/migration_guide/acc_debug.md similarity index 46% rename from docs/mindspore/source_en/migration_guide/debug_and_tune.md rename to docs/mindspore/source_en/migration_guide/acc_debug.md index a29a330787..1138a15e66 100644 --- a/docs/mindspore/source_en/migration_guide/debug_and_tune.md +++ b/docs/mindspore/source_en/migration_guide/acc_debug.md @@ -1,8 +1,8 @@ -# Debugging and Tuning +# Precision Tuning -[![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_en/migration_guide/debug_and_tune.md) +[![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_en/migration_guide/acc_debug.md) -## Debugging Tools +## FAQs and Solutions - The following common problems may be encountered during the accuracy commissioning phase: - The first loss and the benchmark are not aligned: @@ -11,34 +11,13 @@ The problem is mainly caused by the network reverse. This can be done with the help of [TroubleShooter comparing MindSpore to PyTorch ckpt/pth](https://gitee.com/mindspore/toolkits/blob/master/troubleshooter/docs/migrator.md#%E5%BA%94%E7%94%A8%E5%9C%BA%E6%99%AF2%E6%AF%94%E5%AF%B9mindspore%E4%B8%8Epytorch%E7%9A%84ckptpth) to check the results of the network reverse update by comparing the values of the corresponding parameters of ckpt and pth. - Loss appears NAN/INF: [TroubleShooter obtains INF/NAN value throw points](https://gitee.com/mindspore/toolkits/blob/master/troubleshooter/docs/tracker.md#%E5%BA%94%E7%94%A8%E5%9C%BA%E6%99%AF2%E8%8E%B7%E5%8F%96infnan%E5%80%BC%E6%8A%9B%E5%87%BA%E7%82%B9) is used to identify the first location in the network where a NAN or INF appears. - Overflow operator detection is also available via the [Dump](https://www.mindspore.cn/tutorials/experts/en/master/debug/dump.html) tool. -- The following common problems may be encountered during the performance debugging phase: - - The first step is time-consuming - This phase mainly completes operations such as graph conversion, graph fusion, graph optimization, etc, which is the process of generating executable models. Refer to [How to Optimize Compilation Performance](https://www.mindspore.cn/tutorials/en/master/advanced/static_graph_expert_programming.html#how-to-optimize-compilation-performance). - - Iteration gap is time-consuming - Most of the time consumption in this phase comes from data acquisition, see [Data Processing Performance Optimization](https://www.mindspore.cn/tutorials/experts/en/master/dataset/optimize.html). - - Forward and reverse computation is time-consuming - This phase mainly executes the forward and reverse operators in the network and carries the main computational work of an iteration. Information such as operator time consumption during training can be recorded to a file via [Profiler](https://www.mindspore.cn/mindinsight/docs/en/master/performance_profiling.html). The performance data provides the performance data of the framework host execution and operator execution, which can also be viewed and analyzed by users through the [MindInsight](https://www.mindspore.cn/mindinsight/docs/en/master/index.html) visualization interface, helping users to debug neural network performance more efficiently. - - Iteration trailing is time-consuming - This phase is time consuming, which may be caused by the collection communication, and you can set the fusion policy to optimize. Refer to [all_reduce_fusion_config set allreduce fusion policy](https://www.mindspore.cn/docs/en/master/api_python/mindspore/mindspore.set_auto_parallel_context.html). -- The following common problems may be encountered during the graphics debugging phase: - - Malloc device memory failed: - MindSpore failed to request memory on the device side, the original memory is that the device is occupied by other processes, you can check the running processes by ps -ef | grep "python". - - Out of Memory: - The possible reasons for failure to request dynamic memory are: batch size is too large, processing too much data leads to a large memory footprint; communication operators take up too much memory leading to a low overall memory reuse rate. - -## Introduction of MindSpore Debugging - -### Function Debugging - -During network migration, you are advised to use the PyNative mode for debugging. In PyNative mode, you can perform debugging, and log printing is user-friendly. After the debugging is complete, the graph mode is used. The graph mode is more user-friendly in execution performance. You can also find some problems in network compilation. For example, gradient truncation caused by third-party operators. -For details, see [Error Analysis](https://www.mindspore.cn/tutorials/en/master/advanced/error_analysis/error_scenario_analysis.html). - -### Accuracy Debugging + Overflow operator detection is also available via the [Dump](https://www.mindspore.cn/docs/en/master/model_train/debug/dump.html) tool. + +## Accuracy Debugging Process The accuracy debugging process is as follows: -#### 1. Checking Parameters +### 1. Checking Parameters This part includes checking all parameters and the number of trainable parameters, and checking the shape of all parameters. @@ -144,19 +123,19 @@ trainable parameter numbers: 2 -#### 2. Model Verification +### 2. Model Verification The implementation of the model algorithm is irrelevant to the framework. The trained parameters can be converted into the [checkpoint](https://www.mindspore.cn/tutorials/en/master/beginner/save_load.html) file of MindSpore and loaded to the network for inference verification. For details about the model verification process, see [ResNet Network Migration](https://www.mindspore.cn/docs/en/master/migration_guide/sample_code.html#model-validation). -#### 3. Inference Verification +### 3. Inference Verification After confirming that the model structures are the same, you are advised to perform inference verification again. In addition to models, the entire inference process also involves datasets and metrics. When the inference results are inconsistent, you can use the control variable method to gradually rectify the fault. For details about the inference verification process, see [ResNet Network Migration](https://www.mindspore.cn/docs/en/master/migration_guide/sample_code.html#inference-process). -#### 4. Training Accuracy +### 4. Training Accuracy After the inference verification is complete, the basic model, data processing, and metrics calculation are normal. If the training accuracy is still abnormal, how do we locate the fault? @@ -249,98 +228,4 @@ After the inference verification is complete, the basic model, data processing, - Check whether the data processing meets the expectation through visualization. Focus on data shuffle and check whether data mismatch occurs. -For details about more accuracy debugging policies, see [Accuracy Debugging](https://mindspore.cn/mindinsight/docs/en/master/accuracy_problem_preliminary_location.html). - -### Performance Tuning - -Firstly, it is necessary to obtain performance data, as shown in the specific acquisition method: [Performance Profiling (Ascend)](https://www.mindspore.cn/mindinsight/docs/en/master/performance_profiling_ascend.html) and [Performance Profiling (GPU)](https://www.mindspore.cn/mindinsight/docs/en/master/performance_profiling_gpu.html). - -The performance tuning directions are as follows: - -1. Operator performance tuning -2. Framework enabling performance tuning -3. Multi-Node synchronization performance tuning -4. Data processing performance tuning - -For details, see [ResNet Network Migration](https://www.mindspore.cn/docs/en/master/migration_guide/sample_code.html). - -> Some networks are large. In this case, the build is slow in graph mode. During performance tuning, distinguish graph build from network execution. This section describes the performance tuning policies in the network execution phase. - -#### Operator Performance Tuning - -If a single operator takes a long time and the performance of the same operator varies greatly in different shapes or data types, the problem is caused by the operator performance. The solution is as follows: - -1. Use data types with less computational workload. For example, if there is no obvious difference between the precision of the same operator in float16 and float32 modes, you can use the float16 format with less calculation workload. -2. Use other operators with the same algorithm to avoid this problem. -3. Pay attention to 16-alignment in the Ascend environment. Due to the design of the Ascend AI Processors, it is recommended that the calculation on the AI core be 16-alignment (each dimension in the shape is a multiple of 16). - -If you find an operator with poor performance, you are advised to contact [MindSpore community](https://gitee.com/mindspore/mindspore/issues) for feedback. We will optimize the operator in time after confirming that the problem is caused by poor performance. - -#### Framework Enabling Performance Tuning - -- Using the Static Graph Mode - - Generally, MindSpore in static graph mode is much faster than that in PyNative mode. It is recommended that training and inference be performed in static graph mode. For details, see [Combination of Dynamic and Static Graphs](https://mindspore.cn/docs/en/master/design/dynamic_graph_and_static_graph.html). - -- On-device Execution - - MindSpore provides an [on-device execution method](https://www.mindspore.cn/docs/en/master/design/overview.html) to concurrently process data and execute the network on the device. You only need to set `dataset_sink_mode=True` in `model.train`. Note that this configuration is `False` by default. When this configuration is enabled, one epoch returns the result of only one network. You are advised to change the value to `False` during debugging. - -- Using Automatic Mixed Precision - - The mixed precision training method accelerates the deep neural network training process by mixing the single-precision floating-point data format and the half-precision floating-point data format without compromising the network accuracy. Mixed precision training can accelerate the computing process, reduce memory usage and retrieval, and enable a larger model or batch size to be trained on specific hardware. - - For details, see [Mixed Precision Tutorial](https://www.mindspore.cn/tutorials/en/master/advanced/mixed_precision.html). - -- Enabling Graph Kernel Fusion - - Graph kernel fusion is a unique network performance optimization technology of MindSpore. It can automatically analyze and optimize the logic of existing network computational graphs, simplify and replace computational graphs, split and fuse operators, and build operators in a special way based on the target hardware capability to improve the computing resource utilization of devices and optimize the overall network performance. Compared with traditional optimization technologies, the graph kernel fusion technology has unique advantages, such as joint optimization of multiple operators across boundaries, cross-layer collaboration with operator compilation, and real-time compilation of operators based on Polyhedral. In addition, the entire optimization process of graph kernel fusion can be automatically completed after users enable the corresponding configuration. Network developers do not need to perform extra perception, so that users can focus on network algorithm implementation. - - Graph kernel fusion applies to scenarios that have high requirements on network execution time. Basic operators are combined to implement customized combination operators and these basic operators are automatically fused to improve the performance of the customized combination operators. - - For details, see [Graph Kernel Fusion Tutorial](https://mindspore.cn/docs/en/master/design/graph_fusion_engine.html). - -- Others - - If there are too many conversion operators (TransData and Cast operators) and the conversion takes a long time, analyze the necessity of the manually added Cast operator. If the accuracy is not affected, delete the redundant Cast and TransData operators. - - If there are too many conversion operators automatically generated by MindSpore, the MindSpore framework may not be fully optimized for some special cases. In this case, contact [MindSpore community](https://gitee.com/mindspore/mindspore/issues) for feedback. - - In dynamic shape scenario, continuous graph build is required, which may cause a long end-to-end training time. You are advised to [avoid dynamic shape](https://www.mindspore.cn/docs/en/master/migration_guide/dynamic_shape.html). - -#### Multi-Node Synchronization Performance Tuning - -During distributed training, after forward propagation and gradient calculation are complete in a step training process, each machine starts to perform AllReduce gradient synchronization. The AllReduce synchronization time is mainly affected by the number of weights and machines. For a more complex network with a larger machine scale, the AllReduce gradient update time is longer. In this case, you can perform AllReduce segmentation to reduce the time consumption. - -In normal cases, AllReduce gradient synchronization waits until all backward operators are executed. That is, after the gradient of all gradients is calculated, the gradients of all machines are synchronized at a time. After AllReduce segmentation is used, the gradients of some weights can be calculated, gradient synchronization of this part of weights is immediately performed. In this way, gradient synchronization and gradient calculation of remaining operators can be performed concurrently, and this part of AllReduce gradient synchronization time is hidden. The shard strategy is usually manually tried to find an optimal solution (more than two shards are supported). -The [ResNet-50](https://gitee.com/mindspore/models/blob/master/official/cv/ResNet/train.py) is used as an example. The network has 160 weights. [85, 160] indicates that gradient synchronization is performed immediately after the gradients of weights 0 to 85 are calculated, and gradient synchronization is performed after the gradients of weights 86 to 160 are calculated. The network is divided into two shards. Therefore, gradient synchronization needs to be performed twice. The sample code is as follows: - -```python -import os -import mindspore as ms -from mindspore.communication import init - -device_id = int(os.getenv('DEVICE_ID', '0')) -rank_size = int(os.getenv('RANK_SIZE', '1')) -rank_id = int(os.getenv('RANK_ID', '0')) - -# init context -ms.set_context(mode=ms.GRAPH_MODE, device_target='Ascend', device_id=device_id) -if rank_size > 1: - ms.set_auto_parallel_context(device_num=rank_size, parallel_mode=ms.ParallelMode.DATA_PARALLEL, - gradients_mean=True) - ms.set_auto_parallel_context(all_reduce_fusion_config=[85, 160]) - init() -``` - -For details, see [Cluster Performance Profiling](https://www.mindspore.cn/mindinsight/docs/en/master/performance_profiling_of_cluster.html). - -#### Data Processing Performance Tuning - -The performance jitter of a single step and the empty data queue for a period of time are caused by the poor performance of the data preprocessing part. As a result, the data processing speed cannot keep up with the iteration speed of a single step. The two symptoms usually occur in pairs. - -When the data processing speed is slow, the empty queue is gradually consumed from the beginning when the queue is full. The training process starts to wait for the empty queue to fill in data. Once new data is filled in, the network continues single-step training. Because no queue is used as the buffer for data processing, the performance jitter of data processing is directly reflected by the performance of a single step. Therefore, the performance jitter of a single step is also caused. - -For details about data performance problems, see [Data Preparation Performance Analysis](https://www.mindspore.cn/mindinsight/docs/en/master/performance_profiling_ascend.html#data-preparation-performance-analysis) of MindSpore Insight. This describes common data performance problems and solutions. - -For more performance debugging methods, see [Performance Optimization](https://www.mindspore.cn/tutorials/experts/en/master/optimize/execution_opt.html). +For details about more accuracy debugging policies, see [Accuracy Debugging](https://mindspore.cn/mindinsight/docs/en/master/accuracy_problem_preliminary_location.html). \ No newline at end of file diff --git a/docs/mindspore/source_en/migration_guide/debug.md b/docs/mindspore/source_en/migration_guide/debug.md new file mode 100644 index 0000000000..2429646643 --- /dev/null +++ b/docs/mindspore/source_en/migration_guide/debug.md @@ -0,0 +1,18 @@ +# Function Debugging + +[![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_en/migration_guide/debug.md) + +## Debugging Tools + +- The following common problems may be encountered during the graphics debugging phase: + - Malloc device memory failed: + MindSpore failed to request memory on the device side, the original memory is that the device is occupied by other processes, you can check the running processes by ps -ef | grep "python". + - Out of Memory: + The possible reasons for failure to request dynamic memory are: batch size is too large, processing too much data leads to a large memory footprint; communication operators take up too much memory leading to a low overall memory reuse rate. + +## Introduction of MindSpore Debugging + +### Function Debugging + +During network migration, you are advised to use the PyNative mode for debugging. In PyNative mode, you can perform debugging, and log printing is user-friendly. After the debugging is complete, the graph mode is used. The graph mode is more user-friendly in execution performance. You can also find some problems in network compilation. For example, gradient truncation caused by third-party operators. +For details, see [Error Analysis](https://www.mindspore.cn/docs/en/master/model_train/debug/error_analysis/error_scenario_analysis.html). diff --git a/docs/mindspore/source_en/migration_guide/index.rst b/docs/mindspore/source_en/migration_guide/index.rst new file mode 100644 index 0000000000..f1be51f2f3 --- /dev/null +++ b/docs/mindspore/source_en/migration_guide/index.rst @@ -0,0 +1,17 @@ +Model Migration +========================= + +.. toctree:: + :glob: + :maxdepth: 1 + + overview + enveriment_preparation + analysis_and_preparation + model_development/model_development + debug + acc_debug + perf_debug + model_infer + sample_code + reference diff --git a/docs/mindspore/source_en/migration_guide/overview.md b/docs/mindspore/source_en/migration_guide/overview.md index 06b55db12a..3c3cf6ccd0 100644 --- a/docs/mindspore/source_en/migration_guide/overview.md +++ b/docs/mindspore/source_en/migration_guide/overview.md @@ -13,24 +13,28 @@ E-.-text2(AI Platform ModelArts) B-->|Step 2|F(Model Analysis and Preparation) F-.-text3(Reproducing algorithm, analyzing API compliance using MindSpore Dev Toolkit and analyzing function compliance.) B-->|Step 3|G(Network Constructing Comparison) -G-->I(Dataset) -I-.-text4(Aligning the process of dataset loading, augmentation and reading) -G-->J(Network Constructing) -J-.-text5(Aligning the network) -G-->N(Loss Function) -N-.-text6(Aligning the loss function) -G-->K(Learning Rate and Optimizer) -K-.-text7(Aligning the optimizer and learning rate strategy) -G-->L(Gradient) -L-.-text8(Aligning the reverse gradients) -G-->M(Training and Evaluation Process) -M-.-text9(Aligning the process of training and evaluation) -B-->|Step 4|H(Debug and Tuning) -H-.-text10(Aligning from three aspects: function, precision and performance) +G-->K(Dataset) +K-.-text4(Aligning the process of dataset loading, augmentation and reading) +G-->L(Network Constructing) +L-.-text5(Aligning the network) +G-->P(Loss Function) +P-.-text6(Aligning the loss function) +G-->M(Learning Rate and Optimizer) +M-.-text7(Aligning the optimizer and learning rate strategy) +G-->N(Gradient) +N-.-text8(Aligning the reverse gradients) +G-->O(Training and Evaluation Process) +O-.-text9(Aligning the process of training and evaluation) +B-->|Step 4|H(Function Debugging) +H-.-text10(Functional alignment) +B-->|Step 5|I(Precision Tuning) +I-.-text11(Precision alignment) +B-->|Step 6|J(Performance Tuning) +J-.-text12(Performance Alignment) A-->C(A Migration Sample) -C-.-text11(The network migration sample, taking ResNet50 as an example.) +C-.-text13(The network migration sample, taking ResNet50 as an example.) A-->D(FAQs) -D-.-text12(Provides the frequently-asked questions and corresponding solutions in migration process.) +D-.-text14(Provides the frequently-asked questions and corresponding solutions in migration process.) click C "https://www.mindspore.cn/docs/en/master/migration_guide/sample_code.html" click D "https://www.mindspore.cn/docs/en/master/migration_guide/faq.html" @@ -38,12 +42,14 @@ click D "https://www.mindspore.cn/docs/en/master/migration_guide/faq.html" click E "https://www.mindspore.cn/docs/en/master/migration_guide/enveriment_preparation.html" click F "https://www.mindspore.cn/docs/en/master/migration_guide/analysis_and_preparation.html" click G "https://www.mindspore.cn/docs/en/master/migration_guide/model_development/model_development.html" -click H "https://www.mindspore.cn/docs/en/master/migration_guide/debug_and_tune.html" +click H "https://www.mindspore.cn/docs/en/master/migration_guide/debug.html" +click I "https://www.mindspore.cn/docs/en/master/migration_guide/acc_debug.html" +click J "https://www.mindspore.cn/docs/en/master/migration_guide/perf_debug.html" -click I "https://www.mindspore.cn/docs/en/master/migration_guide/model_development/dataset.html" -click J "https://www.mindspore.cn/docs/en/master/migration_guide/model_development/model_and_cell.html" -click K "https://www.mindspore.cn/docs/en/master/migration_guide/model_development/learning_rate_and_optimizer.html" -click L "https://www.mindspore.cn/docs/en/master/migration_guide/model_development/gradient.html" -click M "https://www.mindspore.cn/docs/en/master/migration_guide/model_development/training_and_evaluation.html" -click N "https://www.mindspore.cn/docs/en/master/migration_guide/model_development/loss_function.html" +click K "https://www.mindspore.cn/docs/en/master/migration_guide/model_development/dataset.html" +click L "https://www.mindspore.cn/docs/en/master/migration_guide/model_development/model_and_cell.html" +click M "https://www.mindspore.cn/docs/en/master/migration_guide/model_development/learning_rate_and_optimizer.html" +click N "https://www.mindspore.cn/docs/en/master/migration_guide/model_development/gradient.html" +click O "https://www.mindspore.cn/docs/en/master/migration_guide/model_development/training_and_evaluation.html" +click P "https://www.mindspore.cn/docs/en/master/migration_guide/model_development/loss_function.html" ``` diff --git a/docs/mindspore/source_en/migration_guide/perf_debug.md b/docs/mindspore/source_en/migration_guide/perf_debug.md new file mode 100644 index 0000000000..a0d05be245 --- /dev/null +++ b/docs/mindspore/source_en/migration_guide/perf_debug.md @@ -0,0 +1,109 @@ +# Performance Tuning + +[![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_en/migration_guide/perf_debug.md) + +## FAQs and Solutions + +- The following common problems may be encountered during the performance debugging phase: + - The first step is time-consuming + This phase mainly completes operations such as graph conversion, graph fusion, graph optimization, etc, which is the process of generating executable models. Refer to [How to Optimize Compilation Performance](https://www.mindspore.cn/docs/en/master/model_train/program_form/static_graph_syntax/static_graph_expert_programming.html#how-to-optimize-compilation-performance). + - Iteration gap is time-consuming + Most of the time consumption in this phase comes from data acquisition, see [Data Processing Performance Optimization](https://www.mindspore.cn/docs/en/master/model_train/dataset/optimize.html). + - Forward and reverse computation is time-consuming + This phase mainly executes the forward and reverse operators in the network and carries the main computational work of an iteration. Information such as operator time consumption during training can be recorded to a file via [Profiler](https://www.mindspore.cn/mindinsight/docs/en/master/performance_profiling.html). The performance data provides the performance data of the framework host execution and operator execution, which can also be viewed and analyzed by users through the [MindInsight](https://www.mindspore.cn/mindinsight/docs/en/master/index.html) visualization interface, helping users to debug neural network performance more efficiently. + - Iteration trailing is time-consuming + This phase is time consuming, which may be caused by the collection communication, and you can set the fusion policy to optimize. Refer to [all_reduce_fusion_config set allreduce fusion policy](https://www.mindspore.cn/docs/en/master/api_python/mindspore/mindspore.set_auto_parallel_context.html). + +## Performance Tuning Process + +Firstly, it is necessary to obtain performance data, as shown in the specific acquisition method: [Performance Profiling (Ascend)](https://www.mindspore.cn/mindinsight/docs/en/master/performance_profiling_ascend.html) and [Performance Profiling (GPU)](https://www.mindspore.cn/mindinsight/docs/en/master/performance_profiling_gpu.html). + +The performance tuning directions are as follows: + +1. Operator performance tuning +2. Framework enabling performance tuning +3. Multi-Node synchronization performance tuning +4. Data processing performance tuning + +For details, see [ResNet Network Migration](https://www.mindspore.cn/docs/en/master/migration_guide/sample_code.html). + +> Some networks are large. In this case, the build is slow in graph mode. During performance tuning, distinguish graph build from network execution. This section describes the performance tuning policies in the network execution phase. + +### Operator Performance Tuning + +If a single operator takes a long time and the performance of the same operator varies greatly in different shapes or data types, the problem is caused by the operator performance. The solution is as follows: + +1. Use data types with less computational workload. For example, if there is no obvious difference between the precision of the same operator in float16 and float32 modes, you can use the float16 format with less calculation workload. +2. Use other operators with the same algorithm to avoid this problem. +3. Pay attention to 16-alignment in the Ascend environment. Due to the design of the Ascend AI Processors, it is recommended that the calculation on the AI core be 16-alignment (each dimension in the shape is a multiple of 16). + +If you find an operator with poor performance, you are advised to contact [MindSpore community](https://gitee.com/mindspore/mindspore/issues) for feedback. We will optimize the operator in time after confirming that the problem is caused by poor performance. + +### Framework Enabling Performance Tuning + +- Using the Static Graph Mode + + Generally, MindSpore in static graph mode is much faster than that in PyNative mode. It is recommended that training and inference be performed in static graph mode. For details, see [Combination of Dynamic and Static Graphs](https://mindspore.cn/docs/en/master/design/dynamic_graph_and_static_graph.html). + +- On-device Execution + + MindSpore provides an [on-device execution method](https://www.mindspore.cn/docs/en/master/design/overview.html) to concurrently process data and execute the network on the device. You only need to set `dataset_sink_mode=True` in `model.train`. Note that this configuration is `False` by default. When this configuration is enabled, one epoch returns the result of only one network. You are advised to change the value to `False` during debugging. + +- Using Automatic Mixed Precision + + The mixed precision training method accelerates the deep neural network training process by mixing the single-precision floating-point data format and the half-precision floating-point data format without compromising the network accuracy. Mixed precision training can accelerate the computing process, reduce memory usage and retrieval, and enable a larger model or batch size to be trained on specific hardware. + + For details, see [Mixed Precision Tutorial](https://www.mindspore.cn/tutorials/en/master/advanced/mixed_precision.html). + +- Enabling Graph Kernel Fusion + + Graph kernel fusion is a unique network performance optimization technology of MindSpore. It can automatically analyze and optimize the logic of existing network computational graphs, simplify and replace computational graphs, split and fuse operators, and build operators in a special way based on the target hardware capability to improve the computing resource utilization of devices and optimize the overall network performance. Compared with traditional optimization technologies, the graph kernel fusion technology has unique advantages, such as joint optimization of multiple operators across boundaries, cross-layer collaboration with operator compilation, and real-time compilation of operators based on Polyhedral. In addition, the entire optimization process of graph kernel fusion can be automatically completed after users enable the corresponding configuration. Network developers do not need to perform extra perception, so that users can focus on network algorithm implementation. + + Graph kernel fusion applies to scenarios that have high requirements on network execution time. Basic operators are combined to implement customized combination operators and these basic operators are automatically fused to improve the performance of the customized combination operators. + + For details, see [Graph Kernel Fusion Tutorial](https://mindspore.cn/docs/en/master/design/graph_fusion_engine.html). + +- Others + + If there are too many conversion operators (TransData and Cast operators) and the conversion takes a long time, analyze the necessity of the manually added Cast operator. If the accuracy is not affected, delete the redundant Cast and TransData operators. + + If there are too many conversion operators automatically generated by MindSpore, the MindSpore framework may not be fully optimized for some special cases. In this case, contact [MindSpore community](https://gitee.com/mindspore/mindspore/issues) for feedback. + + In dynamic shape scenario, continuous graph build is required, which may cause a long end-to-end training time. You are advised to [avoid dynamic shape](https://www.mindspore.cn/docs/en/master/migration_guide/dynamic_shape.html). + +### Multi-Node Synchronization Performance Tuning + +During distributed training, after forward propagation and gradient calculation are complete in a step training process, each machine starts to perform AllReduce gradient synchronization. The AllReduce synchronization time is mainly affected by the number of weights and machines. For a more complex network with a larger machine scale, the AllReduce gradient update time is longer. In this case, you can perform AllReduce segmentation to reduce the time consumption. + +In normal cases, AllReduce gradient synchronization waits until all backward operators are executed. That is, after the gradient of all gradients is calculated, the gradients of all machines are synchronized at a time. After AllReduce segmentation is used, the gradients of some weights can be calculated, gradient synchronization of this part of weights is immediately performed. In this way, gradient synchronization and gradient calculation of remaining operators can be performed concurrently, and this part of AllReduce gradient synchronization time is hidden. The shard strategy is usually manually tried to find an optimal solution (more than two shards are supported). +The [ResNet-50](https://gitee.com/mindspore/models/blob/master/official/cv/ResNet/train.py) is used as an example. The network has 160 weights. [85, 160] indicates that gradient synchronization is performed immediately after the gradients of weights 0 to 85 are calculated, and gradient synchronization is performed after the gradients of weights 86 to 160 are calculated. The network is divided into two shards. Therefore, gradient synchronization needs to be performed twice. The sample code is as follows: + +```python +import os +import mindspore as ms +from mindspore.communication import init + +device_id = int(os.getenv('DEVICE_ID', '0')) +rank_size = int(os.getenv('RANK_SIZE', '1')) +rank_id = int(os.getenv('RANK_ID', '0')) + +# init context +ms.set_context(mode=ms.GRAPH_MODE, device_target='Ascend', device_id=device_id) +if rank_size > 1: + ms.set_auto_parallel_context(device_num=rank_size, parallel_mode=ms.ParallelMode.DATA_PARALLEL, + gradients_mean=True) + ms.set_auto_parallel_context(all_reduce_fusion_config=[85, 160]) + init() +``` + +For details, see [Cluster Performance Profiling](https://www.mindspore.cn/mindinsight/docs/en/master/performance_profiling_of_cluster.html). + +### Data Processing Performance Tuning + +The performance jitter of a single step and the empty data queue for a period of time are caused by the poor performance of the data preprocessing part. As a result, the data processing speed cannot keep up with the iteration speed of a single step. The two symptoms usually occur in pairs. + +When the data processing speed is slow, the empty queue is gradually consumed from the beginning when the queue is full. The training process starts to wait for the empty queue to fill in data. Once new data is filled in, the network continues single-step training. Because no queue is used as the buffer for data processing, the performance jitter of data processing is directly reflected by the performance of a single step. Therefore, the performance jitter of a single step is also caused. + +For details about data performance problems, see [Data Preparation Performance Analysis](https://www.mindspore.cn/mindinsight/docs/en/master/performance_profiling_ascend.html#data-preparation-performance-analysis) of MindSpore Insight. This describes common data performance problems and solutions. + +For more performance debugging methods, see [Performance Optimization](https://www.mindspore.cn/tutorials/experts/en/master/optimize/execution_opt.html). diff --git a/docs/mindspore/source_en/migration_guide/reference.rst b/docs/mindspore/source_en/migration_guide/reference.rst new file mode 100644 index 0000000000..241cc8f08a --- /dev/null +++ b/docs/mindspore/source_en/migration_guide/reference.rst @@ -0,0 +1,9 @@ +Reference +========== + +.. toctree:: + :maxdepth: 1 + + ../note/api_mapping/pytorch_api_mapping + migration_tools + faq diff --git a/docs/mindspore/source_en/model_infer/index.rst b/docs/mindspore/source_en/model_infer/index.rst new file mode 100644 index 0000000000..a722140316 --- /dev/null +++ b/docs/mindspore/source_en/model_infer/index.rst @@ -0,0 +1,10 @@ +Model Inference +========================= + +.. toctree:: + :glob: + :maxdepth: 1 + + overview + llm_infer + llm_lite diff --git a/docs/mindspore/source_en/model_infer/llm_infer.rst b/docs/mindspore/source_en/model_infer/llm_infer.rst new file mode 100644 index 0000000000..fc423b2de2 --- /dev/null +++ b/docs/mindspore/source_en/model_infer/llm_infer.rst @@ -0,0 +1,8 @@ +LLM Inference +============== + +.. toctree:: + :glob: + :maxdepth: 1 + + model_compression diff --git a/docs/mindspore/source_en/model_infer/llm_lite.md b/docs/mindspore/source_en/model_infer/llm_lite.md new file mode 100644 index 0000000000..f088b5ce24 --- /dev/null +++ b/docs/mindspore/source_en/model_infer/llm_lite.md @@ -0,0 +1,3 @@ +# Device-side Inference + +[![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_en/model_infer/llm_lite.md) diff --git a/tutorials/experts/source_en/infer/model_compression.md b/docs/mindspore/source_en/model_infer/model_compression.md similarity index 100% rename from tutorials/experts/source_en/infer/model_compression.md rename to docs/mindspore/source_en/model_infer/model_compression.md diff --git a/tutorials/experts/source_en/infer/inference.md b/docs/mindspore/source_en/model_infer/overview.md similarity index 99% rename from tutorials/experts/source_en/infer/inference.md rename to docs/mindspore/source_en/model_infer/overview.md index c98433d103..17e5c457e6 100644 --- a/tutorials/experts/source_en/infer/inference.md +++ b/docs/mindspore/source_en/model_infer/overview.md @@ -1,6 +1,6 @@ # Inference Model Overview -[![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/tutorials/experts/source_en/infer/inference.md) +[![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/tutorials/experts/source_en/infer/overview.md) MindSpore can execute inference tasks on different hardware platforms based on trained models. diff --git a/docs/mindspore/source_en/model_train/custom_program/fusion_pass.md b/docs/mindspore/source_en/model_train/custom_program/fusion_pass.md new file mode 100644 index 0000000000..b4ef800079 --- /dev/null +++ b/docs/mindspore/source_en/model_train/custom_program/fusion_pass.md @@ -0,0 +1,3 @@ +# Custom Fusion Pass + +[![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_en/model_train/custom_program/fusion_pass.md) diff --git a/tutorials/source_en/advanced/modules/layer.md b/docs/mindspore/source_en/model_train/custom_program/hook_program.md similarity index 58% rename from tutorials/source_en/advanced/modules/layer.md rename to docs/mindspore/source_en/model_train/custom_program/hook_program.md index d388741ff7..5fbff3d11c 100644 --- a/tutorials/source_en/advanced/modules/layer.md +++ b/docs/mindspore/source_en/model_train/custom_program/hook_program.md @@ -1,306 +1,12 @@ -[![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/tutorials/source_en/advanced/modules/layer.md) +# Hook Programming -# Cell and Parameter - -Cell, as the basic unit of neural network construction, corresponds to the concept of neural network layer, and the abstract encapsulation of Tensor computation operation can represent the neural network structure more accurately and clearly. In addition to the basic Tensor computation flow definition, the neural network layer contains functions such as parameter management and state management. Parameter is the core of neural network training and is usually used as an internal member variable of the neural network layer. In this section, we systematically introduce parameters, neural network layers and their related usage. - -## Parameter - -Parameter is a special class of Tensor, which is a variable whose value can be updated during model training. MindSpore provides the `mindspore.Parameter` class for Parameter construction. In order to distinguish between Parameter for different purposes, two different categories of Parameter are defined below. In order to distinguish between Parameter for different purposes, two different categories of Parameter are defined below: - -- Trainable parameter. Tensor that is updated after the gradient is obtained according to the backward propagation algorithm during model training, and `required_grad` needs to be set to `True`. -- Untrainable parameters. Tensor that does not participate in backward propagation needs to update values (e.g. `mean` and `var` variables in BatchNorm), when `requires_grad` needs to be set to `False`. - -> Parameter is set to `required_grad=True` by default. - -We construct a simple fully-connected layer as follows: - -```python -import numpy as np -import mindspore -from mindspore import nn -from mindspore import ops -from mindspore import Tensor, Parameter - -class Network(nn.Cell): - def __init__(self): - super().__init__() - self.w = Parameter(Tensor(np.random.randn(5, 3), mindspore.float32), name='w') # weight - self.b = Parameter(Tensor(np.random.randn(3,), mindspore.float32), name='b') # bias - - def construct(self, x): - z = ops.matmul(x, self.w) + self.b - return z - -net = Network() -``` - -In the `__init__` method of `Cell`, we define two parameters `w` and `b` and configure `name` for namespace management. Use `self.attr` in the `construct` method to call directly to participate in Tensor operations. - -### Obtaining Parameter - -After constructing the neural network layer by using Cell+Parameter, we can use various methods to obtain the Parameter managed by Cell. - -#### Obtaining a Single Parameter - -To get a particular parameter individually, just call a member variable of a Python class directly. - -```python -print(net.b.asnumpy()) -``` - -```text -[-1.2192779 -0.36789745 0.0946381 ] -``` - -#### Obtaining a Trainable Parameter - -Trainable parameters can be obtained by using the `Cell.trainable_params` method, and this interface is usually called when configuring the optimizer. - -```python -print(net.trainable_params()) -``` - -```text -[Parameter (name=w, shape=(5, 3), dtype=Float32, requires_grad=True), Parameter (name=b, shape=(3,), dtype=Float32, requires_grad=True)] -``` - -#### Obtaining All Parameters - -Use the `Cell.get_parameters()` method to get all parameters, at which point a Python iterator will be returned. - -```python -print(type(net.get_parameters())) -``` - -```text - -``` - -Or you can call `Cell.parameters_and_names` to return the parameter names and parameters. - -```python -for name, param in net.parameters_and_names(): - print(f"{name}:\n{param.asnumpy()}") -``` - -```text -w: -[[ 4.15680408e-02 -1.20311625e-01 5.02573885e-02] - [ 1.22175144e-04 -1.34980649e-01 1.17642188e+00] - [ 7.57667869e-02 -1.74758151e-01 -5.19092619e-01] - [-1.67846107e+00 3.27240258e-01 -2.06452996e-01] - [ 5.72323874e-02 -8.27963874e-02 5.94243526e-01]] -b: -[-1.2192779 -0.36789745 0.0946381 ] -``` - -### Modifying the Parameter - -#### Modifying Parameter Values Directly - -Parameter is a special kind of Tensor, so its value can be modified by using the Tensor index modification. - -```python -net.b[0] = 1. -print(net.b.asnumpy()) -``` - -```text -[ 1. -0.36789745 0.0946381 ] -``` - -#### Overriding the Modified Parameter Values - -The `Parameter.set_data` method can be called to override the Parameter by using a Tensor with the same Shape. This method is commonly used for [Cell traversal initialization](https://www.mindspore.cn/tutorials/en/master/advanced/modules/initializer.html) by using Initializer. - -```python -net.b.set_data(Tensor([3, 4, 5])) -print(net.b.asnumpy()) -``` - -```text -[3. 4. 5.] -``` - -#### Modifying Parameter Values During Runtime - -The main role of parameters is to update their values during model training, which involves parameter modification during runtime after backward propagation to obtain gradients, or when untrainable parameters need to be updated. Due to the compiled design of MindSpore's [Accelerating with Static Graphs](https://www.mindspore.cn/tutorials/en/master/beginner/accelerate_with_static_graph.html), it is necessary at this point to use the `mindspore.ops.assign` interface to assign parameters. This method is commonly used in [Custom Optimizer](https://www.mindspore.cn/tutorials/en/master/advanced/modules/optimizer.html) scenarios. The following is a simple sample modification of parameter values during runtime: - -```python -import mindspore as ms - -@ms.jit -def modify_parameter(): - b_hat = ms.Tensor([7, 8, 9]) - ops.assign(net.b, b_hat) - return True - -modify_parameter() -print(net.b.asnumpy()) -``` - -```text -[7. 8. 9.] -``` - -### Parameter Tuple - -ParameterTuple, variable tuple, used to store multiple Parameter, is inherited from tuple tuples, and provides cloning function. - -The following example provides the ParameterTuple creation method: - -```python -from mindspore.common.initializer import initializer -from mindspore import ParameterTuple -# Creation -x = Parameter(default_input=ms.Tensor(np.arange(2 * 3).reshape((2, 3))), name="x") -y = Parameter(default_input=initializer('ones', [1, 2, 3], ms.float32), name='y') -z = Parameter(default_input=2.0, name='z') -params = ParameterTuple((x, y, z)) - -# Clone from params and change the name to "params_copy" -params_copy = params.clone("params_copy") - -print(params) -print(params_copy) -``` - -```text -(Parameter (name=x, shape=(2, 3), dtype=Int64, requires_grad=True), Parameter (name=y, shape=(1, 2, 3), dtype=Float32, requires_grad=True), Parameter (name=z, shape=(), dtype=Float32, requires_grad=True)) -(Parameter (name=params_copy.x, shape=(2, 3), dtype=Int64, requires_grad=True), Parameter (name=params_copy.y, shape=(1, 2, 3), dtype=Float32, requires_grad=True), Parameter (name=params_copy.z, shape=(), dtype=Float32, requires_grad=True)) -``` - -## Cell Training State Change - -Some Tensor operations in neural networks do not behave the same during training and inference, e.g., `nn.Dropout` performs random dropout during training but not during inference, and `nn.BatchNorm` requires updating the `mean` and `var` variables during training and fixing their values unchanged during inference. So we can set the state of the neural network through the `Cell.set_train` interface. - -When `set_train` is set to True, the neural network state is `train`, and the default value of `set_train` interface is `True`: - -```python -net.set_train() -print(net.phase) -``` - -```text -train -``` - -When `set_train` is set to False, the neural network state is `predict`: - -```python -net.set_train(False) -print(net.phase) -``` - -```text -predict -``` - -## Custom Neural Network Layers - -Normally, the neural network layer interface and function interface provided by MindSpore can meet the model construction requirements, but since the AI field is constantly updating, it is possible to encounter new network structures without built-in modules. At this point, we can customize the neural network layer through the function interface provided by MindSpore, Primitive operator, and can use the `Cell.bprop` method to customize the reverse. The following are the details of each of the three customization methods. - -### Constructing Neural Network Layers by Using the Function Interface - -MindSpore provides a large number of basic function interfaces, which can be used to construct complex Tensor operations, encapsulated as neural network layers. The following is an example of `Threshold` with the following equation: - -$$ -y =\begin{cases} - x, &\text{ if } x > \text{threshold} \\ - \text{value}, &\text{ otherwise } - \end{cases} -$$ - -It can be seen that `Threshold` determines whether the value of the Tensor is greater than the `threshold` value, keeps the value whose judgment result is `True`, and replaces the value whose judgment result is `False`. Therefore, the corresponding implementation is as follows: - -```python -class Threshold(nn.Cell): - def __init__(self, threshold, value): - super().__init__() - self.threshold = threshold - self.value = value - - def construct(self, inputs): - cond = ops.gt(inputs, self.threshold) - value = ops.fill(inputs.dtype, inputs.shape, self.value) - return ops.select(cond, inputs, value) -``` - -Here `ops.gt`, `ops.fill`, and `ops.select` are used to implement judgment and replacement respectively. The following custom `Threshold` layer is implemented: - -```python -m = Threshold(0.1, 20) -inputs = mindspore.Tensor([0.1, 0.2, 0.3], mindspore.float32) -m(inputs) -``` - -```text -Tensor(shape=[3], dtype=Float32, value= [ 2.00000000e+01, 2.00000003e-01, 3.00000012e-01]) -``` - -It can be seen that `inputs[0] = threshold`, so it is replaced with `20`. - -### Custom Cell Reverse - -In special scenarios, we not only need to customize the forward logic of the neural network layer, but also want to manually control the computation of its reverse, which we can define through the `Cell.bprop` interface. The function will be used in scenarios such as new neural network structure design and backward propagation speed optimization. In the following, we take `Dropout2d` as an example to introduce custom Cell reverse. - -```python -class Dropout2d(nn.Cell): - def __init__(self, keep_prob): - super().__init__() - self.keep_prob = keep_prob - self.dropout2d = ops.Dropout2D(keep_prob) - - def construct(self, x): - return self.dropout2d(x) - - def bprop(self, x, out, dout): - _, mask = out - dy, _ = dout - if self.keep_prob != 0: - dy = dy * (1 / self.keep_prob) - dy = mask.astype(mindspore.float32) * dy - return (dy.astype(x.dtype), ) - -dropout_2d = Dropout2d(0.8) -dropout_2d.bprop_debug = True -``` - -The `bprop` method has three separate input parameters: - -- *x*: Forward input. When there are multiple forward inputs, the same number of inputs are required. -- *out*: Forward input. -- *dout*: When backward propagation is performed, the current Cell executes the previous reverse result. - -Generally we need to calculate the reverse result according to the reverse derivative formula based on the forward output and the reverse result of the front layer, and return it. The reverse calculation of `Dropout2d` requires masking the reverse result of the front layer based on the `mask` matrix of the forward output, and then scaling according to `keep_prob`. The final implementation can get the correct calculation result. - -When customizing the reverse direction of a Cell, it supports extended writing in PyNative mode and can differentiate the weights inside the Cell. The specific columns are as follows: - -```python -class NetWithParam(nn.Cell): - def __init__(self): - super(NetWithParam, self).__init__() - self.w = Parameter(Tensor(np.array([2.0], dtype=np.float32)), name='weight') - self.internal_params = [self.w] - - def construct(self, x): - output = self.w * x - return output - - def bprop(self, *args): - return (self.w * args[-1],), {self.w: args[0] * args[-1]} -``` - -`bprop` method supports *args as an input parameter, and the last data in the args array, `args[-1]` is the gradient returned to the cell. Set the weight of differentiation through `self.internal_params`, and return a tuple and a dictionary in the `bprop` function. Return the tuple corresponding to the input gradient, as well as the dictionary corresponding to the gradient with key as the weight and value as the weight. - -## Hook Function +[![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_en/model_train/custom_program/hook_program.md) Debugging deep learning networks is a big task for every practitioner in the field of deep learning. Since the deep learning network hides the input and output data as well as the inverse gradient of the intermediate layer operators, only the gradient of the network input data (feature quantity and weight) is provided, resulting in the inability to accurately sense the data changes of the intermediate layer operators, which reduces the debugging efficiency. In order to facilitate users to debug the deep learning network accurately and quickly, MindSpore designes Hook function in dynamic graph mode. **Using Hook function can capture the input and output data of intermediate layer operators as well as the reverse gradient**. Currently, four forms of Hook functions are provided in dynamic graph mode: HookBackward operator and register_forward_pre_hook, register_forward_hook, register_backward_hook functions registered on Cell objects. -### HookBackward Operator +## HookBackward Operator HookBackward implements the Hook function in the form of an operator. The user initializes a HookBackward operator and places it at the location in the deep learning network where the gradient needs to be captured. In the forward execution of the network, the HookBackward operator outputs the input data as is without any modification. When the network back propagates the gradient, the Hook function registered on HookBackward will capture the gradient back propagated to this point. The user can customize the operation on the gradient in the Hook function, such as printing the gradient, or returning a new gradient. @@ -337,7 +43,7 @@ output: (Tensor(shape=[], dtype=Float32, value= 4), Tensor(shape=[], dtype=Float For more descriptions of the HookBackward operator, refer to the [API documentation](https://mindspore.cn/docs/en/master/api_python/ops/mindspore.ops.HookBackward.html). -### register_forward_pre_hook Function in Cell Object +## register_forward_pre_hook Function in Cell Object The user can use the `register_forward_pre_hook` function on the Cell object to register a custom Hook function to capture data that is passed to that Cell object. This function does not work in static graph mode and inside functions modified with `@jit`. The `register_forward_pre_hook` function takes the Hook function as an input and returns a `handle` object that corresponds to the Hook function. The user can remove the corresponding Hook function by calling the `remove()` function of the `handle` object. Each call to the `register_forward_pre_hook` function returns a different `handle` object. Hook functions should be defined in the following way. @@ -441,7 +147,7 @@ To avoid running failure when scripts switch to graph mode, it is not recommende For more information about the `register_forward_pre_hook` function of the Cell object, refer to the [API documentation](https://mindspore.cn/docs/en/master/api_python/nn/mindspore.nn.Cell.html#mindspore.nn.Cell.register_forward_pre_hook). -### register_forward_hook Function of Cell Object +## register_forward_hook Function of Cell Object The user can use the `register_forward_hook` function on the Cell object to register a custom Hook function that captures the data passed forward to the Cell object and the output data of the Cell object. This function does not work in static graph mode and inside functions modified with `@jit`. The `register_forward_hook` function takes the Hook function as an input and returns a `handle` object that corresponds to the Hook function. The user can remove the corresponding Hook function by calling the `remove()` function of the `handle` object. Each call to the `register_forward_hook` function returns a different `handle` object. Hook functions should be defined in the following way. @@ -506,7 +212,7 @@ To avoid running failure when the script switches to graph mode, it is not recom For more information about the `register_forward_hook` function of the Cell object, please refer to the [API documentation](https://mindspore.cn/docs/en/master/api_python/nn/mindspore.nn.Cell.html#mindspore.nn.Cell.register_forward_hook). -### register_backward_hook Function of Cell Object +## register_backward_hook Function of Cell Object The user can use the `register_backward_hook` function on the Cell object to register a custom Hook function that captures the gradient associated with the Cell object when the network is back propagated. This function does not work in graph mode or inside functions modified with `@jit`. The `register_backward_hook` function takes the Hook function as an input and returns a `handle` object that corresponds to the Hook function. The user can remove the corresponding Hook function by calling the `remove()` function of the `handle` object. Each call to the `register_backward_hook` function will return a different `handle` object. diff --git a/tutorials/source_en/advanced/modules/initializer.md b/docs/mindspore/source_en/model_train/custom_program/initializer.md similarity index 99% rename from tutorials/source_en/advanced/modules/initializer.md rename to docs/mindspore/source_en/model_train/custom_program/initializer.md index 1f058dad09..0ec552b380 100644 --- a/tutorials/source_en/advanced/modules/initializer.md +++ b/docs/mindspore/source_en/model_train/custom_program/initializer.md @@ -1,6 +1,6 @@ -[![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/tutorials/source_en/advanced/modules/initializer.md) +# Custom Parameter Initialization -# Parameter Initialization +[![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/tutorials/source_en/advanced/modules/initializer.md) ## Initializing with Built-In Parameters diff --git a/docs/mindspore/source_en/model_train/custom_program/layer.md b/docs/mindspore/source_en/model_train/custom_program/layer.md new file mode 100644 index 0000000000..858e35da18 --- /dev/null +++ b/docs/mindspore/source_en/model_train/custom_program/layer.md @@ -0,0 +1,198 @@ +# Cell and Parameter + +[![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/tutorials/source_en/advanced/modules/layer.md) + +Cell, as the basic unit of neural network construction, corresponds to the concept of neural network layer, and the abstract encapsulation of Tensor computation operation can represent the neural network structure more accurately and clearly. In addition to the basic Tensor computation flow definition, the neural network layer contains functions such as parameter management and state management. Parameter is the core of neural network training and is usually used as an internal member variable of the neural network layer. In this section, we systematically introduce parameters, neural network layers and their related usage. + +## Parameter + +Parameter is a special class of Tensor, which is a variable whose value can be updated during model training. MindSpore provides the `mindspore.Parameter` class for Parameter construction. In order to distinguish between Parameter for different purposes, two different categories of Parameter are defined below. In order to distinguish between Parameter for different purposes, two different categories of Parameter are defined below: + +- Trainable parameter. Tensor that is updated after the gradient is obtained according to the backward propagation algorithm during model training, and `required_grad` needs to be set to `True`. +- Untrainable parameters. Tensor that does not participate in backward propagation needs to update values (e.g. `mean` and `var` variables in BatchNorm), when `requires_grad` needs to be set to `False`. + +> Parameter is set to `required_grad=True` by default. + +We construct a simple fully-connected layer as follows: + +```python +import numpy as np +import mindspore +from mindspore import nn +from mindspore import ops +from mindspore import Tensor, Parameter + +class Network(nn.Cell): + def __init__(self): + super().__init__() + self.w = Parameter(Tensor(np.random.randn(5, 3), mindspore.float32), name='w') # weight + self.b = Parameter(Tensor(np.random.randn(3,), mindspore.float32), name='b') # bias + + def construct(self, x): + z = ops.matmul(x, self.w) + self.b + return z + +net = Network() +``` + +In the `__init__` method of `Cell`, we define two parameters `w` and `b` and configure `name` for namespace management. Use `self.attr` in the `construct` method to call directly to participate in Tensor operations. + +### Obtaining Parameter + +After constructing the neural network layer by using Cell+Parameter, we can use various methods to obtain the Parameter managed by Cell. + +#### Obtaining a Single Parameter + +To get a particular parameter individually, just call a member variable of a Python class directly. + +```python +print(net.b.asnumpy()) +``` + +```text +[-1.2192779 -0.36789745 0.0946381 ] +``` + +#### Obtaining a Trainable Parameter + +Trainable parameters can be obtained by using the `Cell.trainable_params` method, and this interface is usually called when configuring the optimizer. + +```python +print(net.trainable_params()) +``` + +```text +[Parameter (name=w, shape=(5, 3), dtype=Float32, requires_grad=True), Parameter (name=b, shape=(3,), dtype=Float32, requires_grad=True)] +``` + +#### Obtaining All Parameters + +Use the `Cell.get_parameters()` method to get all parameters, at which point a Python iterator will be returned. + +```python +print(type(net.get_parameters())) +``` + +```text + +``` + +Or you can call `Cell.parameters_and_names` to return the parameter names and parameters. + +```python +for name, param in net.parameters_and_names(): + print(f"{name}:\n{param.asnumpy()}") +``` + +```text +w: +[[ 4.15680408e-02 -1.20311625e-01 5.02573885e-02] + [ 1.22175144e-04 -1.34980649e-01 1.17642188e+00] + [ 7.57667869e-02 -1.74758151e-01 -5.19092619e-01] + [-1.67846107e+00 3.27240258e-01 -2.06452996e-01] + [ 5.72323874e-02 -8.27963874e-02 5.94243526e-01]] +b: +[-1.2192779 -0.36789745 0.0946381 ] +``` + +### Modifying the Parameter + +#### Modifying Parameter Values Directly + +Parameter is a special kind of Tensor, so its value can be modified by using the Tensor index modification. + +```python +net.b[0] = 1. +print(net.b.asnumpy()) +``` + +```text +[ 1. -0.36789745 0.0946381 ] +``` + +#### Overriding the Modified Parameter Values + +The `Parameter.set_data` method can be called to override the Parameter by using a Tensor with the same Shape. This method is commonly used for [Cell traversal initialization](https://www.mindspore.cn/tutorials/en/master/advanced/modules/initializer.html) by using Initializer. + +```python +net.b.set_data(Tensor([3, 4, 5])) +print(net.b.asnumpy()) +``` + +```text +[3. 4. 5.] +``` + +#### Modifying Parameter Values During Runtime + +The main role of parameters is to update their values during model training, which involves parameter modification during runtime after backward propagation to obtain gradients, or when untrainable parameters need to be updated. Due to the compiled design of MindSpore's [Accelerating with Static Graphs](https://www.mindspore.cn/tutorials/en/master/beginner/accelerate_with_static_graph.html), it is necessary at this point to use the `mindspore.ops.assign` interface to assign parameters. This method is commonly used in [Custom Optimizer](https://www.mindspore.cn/tutorials/en/master/advanced/modules/optimizer.html) scenarios. The following is a simple sample modification of parameter values during runtime: + +```python +import mindspore as ms + +@ms.jit +def modify_parameter(): + b_hat = ms.Tensor([7, 8, 9]) + ops.assign(net.b, b_hat) + return True + +modify_parameter() +print(net.b.asnumpy()) +``` + +```text +[7. 8. 9.] +``` + +### Parameter Tuple + +ParameterTuple, variable tuple, used to store multiple Parameter, is inherited from tuple tuples, and provides cloning function. + +The following example provides the ParameterTuple creation method: + +```python +from mindspore.common.initializer import initializer +from mindspore import ParameterTuple +# Creation +x = Parameter(default_input=ms.Tensor(np.arange(2 * 3).reshape((2, 3))), name="x") +y = Parameter(default_input=initializer('ones', [1, 2, 3], ms.float32), name='y') +z = Parameter(default_input=2.0, name='z') +params = ParameterTuple((x, y, z)) + +# Clone from params and change the name to "params_copy" +params_copy = params.clone("params_copy") + +print(params) +print(params_copy) +``` + +```text +(Parameter (name=x, shape=(2, 3), dtype=Int64, requires_grad=True), Parameter (name=y, shape=(1, 2, 3), dtype=Float32, requires_grad=True), Parameter (name=z, shape=(), dtype=Float32, requires_grad=True)) +(Parameter (name=params_copy.x, shape=(2, 3), dtype=Int64, requires_grad=True), Parameter (name=params_copy.y, shape=(1, 2, 3), dtype=Float32, requires_grad=True), Parameter (name=params_copy.z, shape=(), dtype=Float32, requires_grad=True)) +``` + +## Cell Training State Change + +Some Tensor operations in neural networks do not behave the same during training and inference, e.g., `nn.Dropout` performs random dropout during training but not during inference, and `nn.BatchNorm` requires updating the `mean` and `var` variables during training and fixing their values unchanged during inference. So we can set the state of the neural network through the `Cell.set_train` interface. + +When `set_train` is set to True, the neural network state is `train`, and the default value of `set_train` interface is `True`: + +```python +net.set_train() +print(net.phase) +``` + +```text +train +``` + +When `set_train` is set to False, the neural network state is `predict`: + +```python +net.set_train(False) +print(net.phase) +``` + +```text +predict +``` diff --git a/tutorials/source_en/advanced/modules/loss.md b/docs/mindspore/source_en/model_train/custom_program/loss.md similarity index 99% rename from tutorials/source_en/advanced/modules/loss.md rename to docs/mindspore/source_en/model_train/custom_program/loss.md index 0bb2565e1b..88b029922f 100644 --- a/tutorials/source_en/advanced/modules/loss.md +++ b/docs/mindspore/source_en/model_train/custom_program/loss.md @@ -1,6 +1,6 @@ -[![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/tutorials/source_en/advanced/modules/loss.md) +# Custom Loss Function -# Loss Function +[![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/tutorials/source_en/advanced/modules/loss.md) A loss function is also called objective function and is used to measure the difference between a predicted value and an actual value. diff --git a/docs/mindspore/source_en/model_train/custom_program/network_custom.md b/docs/mindspore/source_en/model_train/custom_program/network_custom.md new file mode 100644 index 0000000000..5ea5ce7432 --- /dev/null +++ b/docs/mindspore/source_en/model_train/custom_program/network_custom.md @@ -0,0 +1,98 @@ +# Custom Neural Network Layers + +[![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_en/model_train/custom_program/network_custom.md) + +Normally, the neural network layer interface and function interface provided by MindSpore can meet the model construction requirements, but since the AI field is constantly updating, it is possible to encounter new network structures without built-in modules. At this point, we can customize the neural network layer through the function interface provided by MindSpore, Primitive operator, and can use the `Cell.bprop` method to customize the reverse. The following are the details of each of the three customization methods. + +## Constructing Neural Network Layers by Using the Function Interface + +MindSpore provides a large number of basic function interfaces, which can be used to construct complex Tensor operations, encapsulated as neural network layers. The following is an example of `Threshold` with the following equation: + +$$ +y =\begin{cases} + x, &\text{ if } x > \text{threshold} \\ + \text{value}, &\text{ otherwise } + \end{cases} +$$ + +It can be seen that `Threshold` determines whether the value of the Tensor is greater than the `threshold` value, keeps the value whose judgment result is `True`, and replaces the value whose judgment result is `False`. Therefore, the corresponding implementation is as follows: + +```python +class Threshold(nn.Cell): + def __init__(self, threshold, value): + super().__init__() + self.threshold = threshold + self.value = value + + def construct(self, inputs): + cond = ops.gt(inputs, self.threshold) + value = ops.fill(inputs.dtype, inputs.shape, self.value) + return ops.select(cond, inputs, value) +``` + +Here `ops.gt`, `ops.fill`, and `ops.select` are used to implement judgment and replacement respectively. The following custom `Threshold` layer is implemented: + +```python +m = Threshold(0.1, 20) +inputs = mindspore.Tensor([0.1, 0.2, 0.3], mindspore.float32) +m(inputs) +``` + +```text +Tensor(shape=[3], dtype=Float32, value= [ 2.00000000e+01, 2.00000003e-01, 3.00000012e-01]) +``` + +It can be seen that `inputs[0] = threshold`, so it is replaced with `20`. + +## Custom Cell Reverse + +In special scenarios, we not only need to customize the forward logic of the neural network layer, but also want to manually control the computation of its reverse, which we can define through the `Cell.bprop` interface. The function will be used in scenarios such as new neural network structure design and backward propagation speed optimization. In the following, we take `Dropout2d` as an example to introduce custom Cell reverse. + +```python +class Dropout2d(nn.Cell): + def __init__(self, keep_prob): + super().__init__() + self.keep_prob = keep_prob + self.dropout2d = ops.Dropout2D(keep_prob) + + def construct(self, x): + return self.dropout2d(x) + + def bprop(self, x, out, dout): + _, mask = out + dy, _ = dout + if self.keep_prob != 0: + dy = dy * (1 / self.keep_prob) + dy = mask.astype(mindspore.float32) * dy + return (dy.astype(x.dtype), ) + +dropout_2d = Dropout2d(0.8) +dropout_2d.bprop_debug = True +``` + +The `bprop` method has three separate input parameters: + +- *x*: Forward input. When there are multiple forward inputs, the same number of inputs are required. +- *out*: Forward input. +- *dout*: When backward propagation is performed, the current Cell executes the previous reverse result. + +Generally we need to calculate the reverse result according to the reverse derivative formula based on the forward output and the reverse result of the front layer, and return it. The reverse calculation of `Dropout2d` requires masking the reverse result of the front layer based on the `mask` matrix of the forward output, and then scaling according to `keep_prob`. The final implementation can get the correct calculation result. + +When customizing the reverse direction of a Cell, it supports extended writing in PyNative mode and can differentiate the weights inside the Cell. The specific columns are as follows: + +```python +class NetWithParam(nn.Cell): + def __init__(self): + super(NetWithParam, self).__init__() + self.w = Parameter(Tensor(np.array([2.0], dtype=np.float32)), name='weight') + self.internal_params = [self.w] + + def construct(self, x): + output = self.w * x + return output + + def bprop(self, *args): + return (self.w * args[-1],), {self.w: args[0] * args[-1]} +``` + +`bprop` method supports *args as an input parameter, and the last data in the args array, `args[-1]` is the gradient returned to the cell. Set the weight of differentiation through `self.internal_params`, and return a tuple and a dictionary in the `bprop` function. Return the tuple corresponding to the input gradient, as well as the dictionary corresponding to the gradient with key as the weight and value as the weight. diff --git a/docs/mindspore/source_en/model_train/custom_program/op_custom.rst b/docs/mindspore/source_en/model_train/custom_program/op_custom.rst new file mode 100644 index 0000000000..8e8529b569 --- /dev/null +++ b/docs/mindspore/source_en/model_train/custom_program/op_custom.rst @@ -0,0 +1,12 @@ +Custom Operators +================= + +.. toctree:: + :glob: + :maxdepth: 1 + + operation/op_custom + operation/ms_kernel + operation/op_custom_adv + operation/op_custom_aot + operation/op_custom_ascendc \ No newline at end of file diff --git a/tutorials/experts/source_en/operation/ms_kernel.md b/docs/mindspore/source_en/model_train/custom_program/operation/ms_kernel.md similarity index 100% rename from tutorials/experts/source_en/operation/ms_kernel.md rename to docs/mindspore/source_en/model_train/custom_program/operation/ms_kernel.md diff --git a/tutorials/experts/source_en/operation/op_custom.md b/docs/mindspore/source_en/model_train/custom_program/operation/op_custom.md similarity index 100% rename from tutorials/experts/source_en/operation/op_custom.md rename to docs/mindspore/source_en/model_train/custom_program/operation/op_custom.md diff --git a/tutorials/experts/source_en/operation/op_custom_adv.md b/docs/mindspore/source_en/model_train/custom_program/operation/op_custom_adv.md similarity index 100% rename from tutorials/experts/source_en/operation/op_custom_adv.md rename to docs/mindspore/source_en/model_train/custom_program/operation/op_custom_adv.md diff --git a/tutorials/experts/source_en/operation/op_custom_aot.md b/docs/mindspore/source_en/model_train/custom_program/operation/op_custom_aot.md similarity index 100% rename from tutorials/experts/source_en/operation/op_custom_aot.md rename to docs/mindspore/source_en/model_train/custom_program/operation/op_custom_aot.md diff --git a/tutorials/experts/source_en/operation/op_custom_ascendc.md b/docs/mindspore/source_en/model_train/custom_program/operation/op_custom_ascendc.md similarity index 100% rename from tutorials/experts/source_en/operation/op_custom_ascendc.md rename to docs/mindspore/source_en/model_train/custom_program/operation/op_custom_ascendc.md diff --git a/tutorials/source_en/advanced/modules/optimizer.md b/docs/mindspore/source_en/model_train/custom_program/optimizer.md similarity index 99% rename from tutorials/source_en/advanced/modules/optimizer.md rename to docs/mindspore/source_en/model_train/custom_program/optimizer.md index 5e085a7c8c..160a8243b1 100644 --- a/tutorials/source_en/advanced/modules/optimizer.md +++ b/docs/mindspore/source_en/model_train/custom_program/optimizer.md @@ -1,6 +1,6 @@ -[![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/tutorials/source_en/advanced/modules/optimizer.md) +# Custom Optimizer -# Optimizer +[![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/tutorials/source_en/advanced/modules/optimizer.md) During model training, the optimizer is used to update network parameters. A proper optimizer can effectively reduce the training time and improve model performance. diff --git a/docs/mindspore/source_en/model_train/custom_program/overview.md b/docs/mindspore/source_en/model_train/custom_program/overview.md new file mode 100644 index 0000000000..66dc2b5b15 --- /dev/null +++ b/docs/mindspore/source_en/model_train/custom_program/overview.md @@ -0,0 +1,3 @@ +# Overview of Custom Higher-Order Programming + +[![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_en/model_train/custom_program/overview.md) diff --git a/tutorials/experts/source_en/dataset/augment.md b/docs/mindspore/source_en/model_train/dataset/augment.md similarity index 100% rename from tutorials/experts/source_en/dataset/augment.md rename to docs/mindspore/source_en/model_train/dataset/augment.md diff --git a/tutorials/experts/source_en/dataset/cache.md b/docs/mindspore/source_en/model_train/dataset/cache.md similarity index 100% rename from tutorials/experts/source_en/dataset/cache.md rename to docs/mindspore/source_en/model_train/dataset/cache.md diff --git a/tutorials/experts/source_en/dataset/dataset_autotune.md b/docs/mindspore/source_en/model_train/dataset/dataset_autotune.md similarity index 100% rename from tutorials/experts/source_en/dataset/dataset_autotune.md rename to docs/mindspore/source_en/model_train/dataset/dataset_autotune.md diff --git a/tutorials/experts/source_en/dataset/dataset_offload.md b/docs/mindspore/source_en/model_train/dataset/dataset_offload.md similarity index 100% rename from tutorials/experts/source_en/dataset/dataset_offload.md rename to docs/mindspore/source_en/model_train/dataset/dataset_offload.md diff --git a/tutorials/source_en/advanced/dataset/eager.md b/docs/mindspore/source_en/model_train/dataset/eager.md similarity index 100% rename from tutorials/source_en/advanced/dataset/eager.md rename to docs/mindspore/source_en/model_train/dataset/eager.md diff --git a/tutorials/experts/source_en/dataset/images/auto_augmentation.png b/docs/mindspore/source_en/model_train/dataset/images/auto_augmentation.png similarity index 100% rename from tutorials/experts/source_en/dataset/images/auto_augmentation.png rename to docs/mindspore/source_en/model_train/dataset/images/auto_augmentation.png diff --git a/tutorials/experts/source_en/dataset/images/autotune.png b/docs/mindspore/source_en/model_train/dataset/images/autotune.png similarity index 100% rename from tutorials/experts/source_en/dataset/images/autotune.png rename to docs/mindspore/source_en/model_train/dataset/images/autotune.png diff --git a/tutorials/experts/source_en/dataset/images/cache_dataset.png b/docs/mindspore/source_en/model_train/dataset/images/cache_dataset.png similarity index 100% rename from tutorials/experts/source_en/dataset/images/cache_dataset.png rename to docs/mindspore/source_en/model_train/dataset/images/cache_dataset.png diff --git a/tutorials/experts/source_en/dataset/images/cache_pipeline_en.eddx b/docs/mindspore/source_en/model_train/dataset/images/cache_pipeline_en.eddx similarity index 100% rename from tutorials/experts/source_en/dataset/images/cache_pipeline_en.eddx rename to docs/mindspore/source_en/model_train/dataset/images/cache_pipeline_en.eddx diff --git a/tutorials/experts/source_en/dataset/images/cache_processed_data.png b/docs/mindspore/source_en/model_train/dataset/images/cache_processed_data.png similarity index 100% rename from tutorials/experts/source_en/dataset/images/cache_processed_data.png rename to docs/mindspore/source_en/model_train/dataset/images/cache_processed_data.png diff --git a/tutorials/experts/source_en/dataset/images/compose.png b/docs/mindspore/source_en/model_train/dataset/images/compose.png similarity index 100% rename from tutorials/experts/source_en/dataset/images/compose.png rename to docs/mindspore/source_en/model_train/dataset/images/compose.png diff --git a/tutorials/source_en/advanced/dataset/images/data_conversion_concept.png b/docs/mindspore/source_en/model_train/dataset/images/data_conversion_concept.png similarity index 100% rename from tutorials/source_en/advanced/dataset/images/data_conversion_concept.png rename to docs/mindspore/source_en/model_train/dataset/images/data_conversion_concept.png diff --git a/tutorials/experts/source_en/dataset/images/data_conversion_concept.pptx b/docs/mindspore/source_en/model_train/dataset/images/data_conversion_concept.pptx similarity index 100% rename from tutorials/experts/source_en/dataset/images/data_conversion_concept.pptx rename to docs/mindspore/source_en/model_train/dataset/images/data_conversion_concept.pptx diff --git a/tutorials/experts/source_en/dataset/images/data_enhancement_performance_scheme.eddx b/docs/mindspore/source_en/model_train/dataset/images/data_enhancement_performance_scheme.eddx similarity index 100% rename from tutorials/experts/source_en/dataset/images/data_enhancement_performance_scheme.eddx rename to docs/mindspore/source_en/model_train/dataset/images/data_enhancement_performance_scheme.eddx diff --git a/tutorials/experts/source_en/dataset/images/data_enhancement_performance_scheme.png b/docs/mindspore/source_en/model_train/dataset/images/data_enhancement_performance_scheme.png similarity index 100% rename from tutorials/experts/source_en/dataset/images/data_enhancement_performance_scheme.png rename to docs/mindspore/source_en/model_train/dataset/images/data_enhancement_performance_scheme.png diff --git a/tutorials/experts/source_en/dataset/images/data_loading_performance_scheme.png b/docs/mindspore/source_en/model_train/dataset/images/data_loading_performance_scheme.png similarity index 100% rename from tutorials/experts/source_en/dataset/images/data_loading_performance_scheme.png rename to docs/mindspore/source_en/model_train/dataset/images/data_loading_performance_scheme.png diff --git a/tutorials/source_en/advanced/dataset/images/eager_mode.png b/docs/mindspore/source_en/model_train/dataset/images/eager_mode.png similarity index 100% rename from tutorials/source_en/advanced/dataset/images/eager_mode.png rename to docs/mindspore/source_en/model_train/dataset/images/eager_mode.png diff --git a/tutorials/source_en/advanced/dataset/images/eager_mode_en.jpeg b/docs/mindspore/source_en/model_train/dataset/images/eager_mode_en.jpeg similarity index 100% rename from tutorials/source_en/advanced/dataset/images/eager_mode_en.jpeg rename to docs/mindspore/source_en/model_train/dataset/images/eager_mode_en.jpeg diff --git a/tutorials/experts/source_en/dataset/images/map.eddx b/docs/mindspore/source_en/model_train/dataset/images/map.eddx similarity index 100% rename from tutorials/experts/source_en/dataset/images/map.eddx rename to docs/mindspore/source_en/model_train/dataset/images/map.eddx diff --git a/tutorials/source_en/advanced/dataset/images/mindrecord.png b/docs/mindspore/source_en/model_train/dataset/images/mindrecord.png similarity index 100% rename from tutorials/source_en/advanced/dataset/images/mindrecord.png rename to docs/mindspore/source_en/model_train/dataset/images/mindrecord.png diff --git a/tutorials/experts/source_en/dataset/images/mindrecord.pptx b/docs/mindspore/source_en/model_train/dataset/images/mindrecord.pptx similarity index 100% rename from tutorials/experts/source_en/dataset/images/mindrecord.pptx rename to docs/mindspore/source_en/model_train/dataset/images/mindrecord.pptx diff --git a/tutorials/experts/source_en/dataset/images/offload_process.PNG b/docs/mindspore/source_en/model_train/dataset/images/offload_process.PNG similarity index 100% rename from tutorials/experts/source_en/dataset/images/offload_process.PNG rename to docs/mindspore/source_en/model_train/dataset/images/offload_process.PNG diff --git a/tutorials/experts/source_en/dataset/images/operation_fusion.png b/docs/mindspore/source_en/model_train/dataset/images/operation_fusion.png similarity index 100% rename from tutorials/experts/source_en/dataset/images/operation_fusion.png rename to docs/mindspore/source_en/model_train/dataset/images/operation_fusion.png diff --git a/tutorials/source_en/advanced/dataset/images/output_5_1.png b/docs/mindspore/source_en/model_train/dataset/images/output_5_1.png similarity index 100% rename from tutorials/source_en/advanced/dataset/images/output_5_1.png rename to docs/mindspore/source_en/model_train/dataset/images/output_5_1.png diff --git a/tutorials/source_en/advanced/dataset/images/output_7_1.png b/docs/mindspore/source_en/model_train/dataset/images/output_7_1.png similarity index 100% rename from tutorials/source_en/advanced/dataset/images/output_7_1.png rename to docs/mindspore/source_en/model_train/dataset/images/output_7_1.png diff --git a/tutorials/source_en/advanced/dataset/images/output_9_1.png b/docs/mindspore/source_en/model_train/dataset/images/output_9_1.png similarity index 100% rename from tutorials/source_en/advanced/dataset/images/output_9_1.png rename to docs/mindspore/source_en/model_train/dataset/images/output_9_1.png diff --git a/tutorials/experts/source_en/dataset/images/pipeline.png b/docs/mindspore/source_en/model_train/dataset/images/pipeline.png similarity index 100% rename from tutorials/experts/source_en/dataset/images/pipeline.png rename to docs/mindspore/source_en/model_train/dataset/images/pipeline.png diff --git a/tutorials/source_en/advanced/dataset/images/pipeline_mode_en.jpeg b/docs/mindspore/source_en/model_train/dataset/images/pipeline_mode_en.jpeg similarity index 100% rename from tutorials/source_en/advanced/dataset/images/pipeline_mode_en.jpeg rename to docs/mindspore/source_en/model_train/dataset/images/pipeline_mode_en.jpeg diff --git a/tutorials/experts/source_en/dataset/images/shuffle_performance_scheme.png b/docs/mindspore/source_en/model_train/dataset/images/shuffle_performance_scheme.png similarity index 100% rename from tutorials/experts/source_en/dataset/images/shuffle_performance_scheme.png rename to docs/mindspore/source_en/model_train/dataset/images/shuffle_performance_scheme.png diff --git a/tutorials/experts/source_en/dataset/optimize.ipynb b/docs/mindspore/source_en/model_train/dataset/optimize.ipynb similarity index 100% rename from tutorials/experts/source_en/dataset/optimize.ipynb rename to docs/mindspore/source_en/model_train/dataset/optimize.ipynb diff --git a/docs/mindspore/source_en/model_train/dataset/overview.md b/docs/mindspore/source_en/model_train/dataset/overview.md new file mode 100644 index 0000000000..4c390ad40a --- /dev/null +++ b/docs/mindspore/source_en/model_train/dataset/overview.md @@ -0,0 +1,3 @@ +# Data Processing Overview + +[![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_en/model_train/dataset/overview.md) diff --git a/tutorials/source_en/advanced/dataset/python_objects.md b/docs/mindspore/source_en/model_train/dataset/python_objects.md similarity index 100% rename from tutorials/source_en/advanced/dataset/python_objects.md rename to docs/mindspore/source_en/model_train/dataset/python_objects.md diff --git a/tutorials/source_en/advanced/dataset/record.ipynb b/docs/mindspore/source_en/model_train/dataset/record.ipynb similarity index 100% rename from tutorials/source_en/advanced/dataset/record.ipynb rename to docs/mindspore/source_en/model_train/dataset/record.ipynb diff --git a/tutorials/source_en/advanced/dataset/sampler.md b/docs/mindspore/source_en/model_train/dataset/sampler.md similarity index 100% rename from tutorials/source_en/advanced/dataset/sampler.md rename to docs/mindspore/source_en/model_train/dataset/sampler.md diff --git a/tutorials/experts/source_en/debug/aoe.md b/docs/mindspore/source_en/model_train/debug/aoe.md similarity index 100% rename from tutorials/experts/source_en/debug/aoe.md rename to docs/mindspore/source_en/model_train/debug/aoe.md diff --git a/docs/mindspore/source_en/model_train/debug/debug_tools.rst b/docs/mindspore/source_en/model_train/debug/debug_tools.rst new file mode 100644 index 0000000000..4e485fa6a9 --- /dev/null +++ b/docs/mindspore/source_en/model_train/debug/debug_tools.rst @@ -0,0 +1,10 @@ +Debugging Toolset +================= + +.. toctree:: + :maxdepth: 1 + + dump + rdr + fault_recover + sdc \ No newline at end of file diff --git a/tutorials/experts/source_en/debug/dump.md b/docs/mindspore/source_en/model_train/debug/dump.md similarity index 100% rename from tutorials/experts/source_en/debug/dump.md rename to docs/mindspore/source_en/model_train/debug/dump.md diff --git a/tutorials/source_en/advanced/error_analysis.rst b/docs/mindspore/source_en/model_train/debug/error_analysis.rst similarity index 100% rename from tutorials/source_en/advanced/error_analysis.rst rename to docs/mindspore/source_en/model_train/debug/error_analysis.rst diff --git a/tutorials/source_en/advanced/error_analysis/cann_error_cases.md b/docs/mindspore/source_en/model_train/debug/error_analysis/cann_error_cases.md similarity index 100% rename from tutorials/source_en/advanced/error_analysis/cann_error_cases.md rename to docs/mindspore/source_en/model_train/debug/error_analysis/cann_error_cases.md diff --git a/tutorials/source_en/advanced/error_analysis/error_scenario_analysis.md b/docs/mindspore/source_en/model_train/debug/error_analysis/error_scenario_analysis.md similarity index 100% rename from tutorials/source_en/advanced/error_analysis/error_scenario_analysis.md rename to docs/mindspore/source_en/model_train/debug/error_analysis/error_scenario_analysis.md diff --git a/tutorials/source_en/advanced/error_analysis/images/dot_to_png.png b/docs/mindspore/source_en/model_train/debug/error_analysis/images/dot_to_png.png similarity index 100% rename from tutorials/source_en/advanced/error_analysis/images/dot_to_png.png rename to docs/mindspore/source_en/model_train/debug/error_analysis/images/dot_to_png.png diff --git a/tutorials/source_en/advanced/error_analysis/minddata_debug.md b/docs/mindspore/source_en/model_train/debug/error_analysis/minddata_debug.md similarity index 100% rename from tutorials/source_en/advanced/error_analysis/minddata_debug.md rename to docs/mindspore/source_en/model_train/debug/error_analysis/minddata_debug.md diff --git a/tutorials/source_en/advanced/error_analysis/mindir.md b/docs/mindspore/source_en/model_train/debug/error_analysis/mindir.md similarity index 100% rename from tutorials/source_en/advanced/error_analysis/mindir.md rename to docs/mindspore/source_en/model_train/debug/error_analysis/mindir.md diff --git a/tutorials/source_en/advanced/error_analysis/mindrt_debug.md b/docs/mindspore/source_en/model_train/debug/error_analysis/mindrt_debug.md similarity index 100% rename from tutorials/source_en/advanced/error_analysis/mindrt_debug.md rename to docs/mindspore/source_en/model_train/debug/error_analysis/mindrt_debug.md diff --git a/tutorials/experts/source_en/debug/fault_recover.md b/docs/mindspore/source_en/model_train/debug/fault_recover.md similarity index 100% rename from tutorials/experts/source_en/debug/fault_recover.md rename to docs/mindspore/source_en/model_train/debug/fault_recover.md diff --git a/tutorials/experts/source_en/optimize/graph_fusion_engine.md b/docs/mindspore/source_en/model_train/debug/graph_fusion_engine.md similarity index 100% rename from tutorials/experts/source_en/optimize/graph_fusion_engine.md rename to docs/mindspore/source_en/model_train/debug/graph_fusion_engine.md diff --git a/tutorials/experts/source_zh_cn/optimize/images/data-and-graph-sink.eddx b/docs/mindspore/source_en/model_train/debug/images/data-and-graph-sink.eddx similarity index 100% rename from tutorials/experts/source_zh_cn/optimize/images/data-and-graph-sink.eddx rename to docs/mindspore/source_en/model_train/debug/images/data-and-graph-sink.eddx diff --git a/tutorials/experts/source_en/optimize/images/graph_kernel_example_custom_op.png b/docs/mindspore/source_en/model_train/debug/images/graph_kernel_example_custom_op.png similarity index 100% rename from tutorials/experts/source_en/optimize/images/graph_kernel_example_custom_op.png rename to docs/mindspore/source_en/model_train/debug/images/graph_kernel_example_custom_op.png diff --git a/tutorials/experts/source_en/optimize/images/graph_kernel_example_fuse_basic.png b/docs/mindspore/source_en/model_train/debug/images/graph_kernel_example_fuse_basic.png similarity index 100% rename from tutorials/experts/source_en/optimize/images/graph_kernel_example_fuse_basic.png rename to docs/mindspore/source_en/model_train/debug/images/graph_kernel_example_fuse_basic.png diff --git a/tutorials/experts/source_en/optimize/mem_reuse.md b/docs/mindspore/source_en/model_train/debug/mem_reuse.md similarity index 100% rename from tutorials/experts/source_en/optimize/mem_reuse.md rename to docs/mindspore/source_en/model_train/debug/mem_reuse.md diff --git a/docs/mindspore/source_en/model_train/debug/opt_tools.rst b/docs/mindspore/source_en/model_train/debug/opt_tools.rst new file mode 100644 index 0000000000..9934ebfe8d --- /dev/null +++ b/docs/mindspore/source_en/model_train/debug/opt_tools.rst @@ -0,0 +1,9 @@ +Tuning Toolset +================== + +.. toctree:: + :maxdepth: 1 + + graph_fusion_engine + mem_reuse + aoe \ No newline at end of file diff --git a/docs/mindspore/source_en/model_train/debug/overview.md b/docs/mindspore/source_en/model_train/debug/overview.md new file mode 100644 index 0000000000..e5f2a02b29 --- /dev/null +++ b/docs/mindspore/source_en/model_train/debug/overview.md @@ -0,0 +1,3 @@ +# Overview of Debugging and Tuning + +[![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_en/model_train/debug/overview.md) diff --git a/tutorials/experts/source_en/debug/rdr.md b/docs/mindspore/source_en/model_train/debug/rdr.md similarity index 100% rename from tutorials/experts/source_en/debug/rdr.md rename to docs/mindspore/source_en/model_train/debug/rdr.md diff --git a/tutorials/experts/source_en/debug/sdc.md b/docs/mindspore/source_en/model_train/debug/sdc.md similarity index 100% rename from tutorials/experts/source_en/debug/sdc.md rename to docs/mindspore/source_en/model_train/debug/sdc.md diff --git a/tutorials/experts/source_en/index.rst b/docs/mindspore/source_en/model_train/index.rst similarity index 34% rename from tutorials/experts/source_en/index.rst rename to docs/mindspore/source_en/model_train/index.rst index 86db53df9a..7fd872592b 100644 --- a/tutorials/experts/source_en/index.rst +++ b/docs/mindspore/source_en/model_train/index.rst @@ -1,92 +1,86 @@ -.. MindSpore documentation master file, created by - sphinx-quickstart on Thu Mar 24 11:00:00 2022. - You can adapt this file completely to your liking, but it should at least - contain the root `toctree` directive. - -For Experts -========================= +Model Building and Training +================================= .. toctree:: :glob: :maxdepth: 1 - :caption: Distributed Parallel - :titlesonly: + :caption: Programming Forms - parallel/overview - parallel/startup_method - parallel/data_parallel - parallel/semi_auto_parallel - parallel/auto_parallel - parallel/manual_parallel - parallel/parameter_server_training - parallel/model_save_load - parallel/recover - parallel/optimize_technique - parallel/others - parallel/distributed_case - -.. toctree:: - :glob: - :maxdepth: 1 - :caption: Custom Operator - - operation/op_custom - operation/ms_kernel - operation/op_custom_adv - operation/op_custom_aot - operation/op_custom_ascendc + program_form/overview + program_form/pynative + program_form/static_graph + program_form/jit + program_form/interface + program_form/index_support .. toctree:: :glob: :maxdepth: 1 - :caption: Performance Optimization - - Profiling↗ - optimize/execution_opt - optimize/graph_fusion_engine - optimize/mem_reuse + :caption: Custom High-order Programming + + custom_program/overview + custom_program/layer + custom_program/op_custom + custom_program/initializer + custom_program/loss + custom_program/optimizer + custom_program/fusion_pass + custom_program/network_custom + custom_program/hook_program .. toctree:: :glob: :maxdepth: 1 - :caption: Algorithm Optimization + :caption: Data Loading and Processing - optimize/gradient_accumulation - optimize/thor + dataset/overview + dataset/sampler + dataset/record + dataset/eager + dataset/python_objects + dataset/augment + dataset/cache + dataset/optimize .. toctree:: :glob: :maxdepth: 1 - :caption: High-level Functional Programming + :caption: Training Process - vmap/vmap - func_programming/Jacobians_Hessians - func_programming/per_sample_gradients + train_process/overview + train_process/model + train_process/dynamic_shape + train_process/train_optimize + train_process/func_programming + train_process/derivation + train_process/algorithm_optimize .. toctree:: :glob: :maxdepth: 1 - :caption: Data Processing + :caption: Distributed Parallelism - dataset/augment - dataset/cache - dataset/optimize + parallel/overview + parallel/startup_method + parallel/data_parallel + parallel/semi_auto_parallel + parallel/auto_parallel + parallel/manual_parallel + parallel/parameter_server_training + parallel/model_save_load + parallel/recover + parallel/optimize_technique + parallel/others + parallel/distributed_case .. toctree:: :glob: :maxdepth: 1 - :caption: Model Inference - - infer/inference - infer/model_compression + :caption: Dubugging and Tuning -.. toctree:: - :glob: - :maxdepth: 1 - :caption: Complex Problem Debugging + debug/overview + debug/error_analysis + debug/debug_tools + debug/opt_tools + Error Map↗ - debug/dump - debug/aoe - debug/rdr - debug/fault_recover - debug/sdc \ No newline at end of file diff --git a/tutorials/experts/source_en/parallel/advanced_operator_parallel.md b/docs/mindspore/source_en/model_train/parallel/advanced_operator_parallel.md similarity index 100% rename from tutorials/experts/source_en/parallel/advanced_operator_parallel.md rename to docs/mindspore/source_en/model_train/parallel/advanced_operator_parallel.md diff --git a/tutorials/experts/source_en/parallel/auto_parallel.rst b/docs/mindspore/source_en/model_train/parallel/auto_parallel.rst similarity index 100% rename from tutorials/experts/source_en/parallel/auto_parallel.rst rename to docs/mindspore/source_en/model_train/parallel/auto_parallel.rst diff --git a/tutorials/experts/source_en/parallel/comm_fusion.md b/docs/mindspore/source_en/model_train/parallel/comm_fusion.md similarity index 100% rename from tutorials/experts/source_en/parallel/comm_fusion.md rename to docs/mindspore/source_en/model_train/parallel/comm_fusion.md diff --git a/tutorials/experts/source_en/parallel/comm_subgraph.md b/docs/mindspore/source_en/model_train/parallel/comm_subgraph.md similarity index 100% rename from tutorials/experts/source_en/parallel/comm_subgraph.md rename to docs/mindspore/source_en/model_train/parallel/comm_subgraph.md diff --git a/tutorials/experts/source_en/parallel/data_parallel.md b/docs/mindspore/source_en/model_train/parallel/data_parallel.md similarity index 100% rename from tutorials/experts/source_en/parallel/data_parallel.md rename to docs/mindspore/source_en/model_train/parallel/data_parallel.md diff --git a/tutorials/experts/source_en/parallel/dataset_slice.md b/docs/mindspore/source_en/model_train/parallel/dataset_slice.md similarity index 100% rename from tutorials/experts/source_en/parallel/dataset_slice.md rename to docs/mindspore/source_en/model_train/parallel/dataset_slice.md diff --git a/tutorials/experts/source_en/parallel/disaster_recover.md b/docs/mindspore/source_en/model_train/parallel/disaster_recover.md similarity index 100% rename from tutorials/experts/source_en/parallel/disaster_recover.md rename to docs/mindspore/source_en/model_train/parallel/disaster_recover.md diff --git a/tutorials/experts/source_en/parallel/distributed_case.rst b/docs/mindspore/source_en/model_train/parallel/distributed_case.rst similarity index 100% rename from tutorials/experts/source_en/parallel/distributed_case.rst rename to docs/mindspore/source_en/model_train/parallel/distributed_case.rst diff --git a/tutorials/experts/source_en/parallel/distributed_gradient_accumulation.md b/docs/mindspore/source_en/model_train/parallel/distributed_gradient_accumulation.md similarity index 100% rename from tutorials/experts/source_en/parallel/distributed_gradient_accumulation.md rename to docs/mindspore/source_en/model_train/parallel/distributed_gradient_accumulation.md diff --git a/tutorials/experts/source_en/parallel/distributed_graph_partition.md b/docs/mindspore/source_en/model_train/parallel/distributed_graph_partition.md similarity index 100% rename from tutorials/experts/source_en/parallel/distributed_graph_partition.md rename to docs/mindspore/source_en/model_train/parallel/distributed_graph_partition.md diff --git a/tutorials/experts/source_en/parallel/dynamic_cluster.md b/docs/mindspore/source_en/model_train/parallel/dynamic_cluster.md similarity index 100% rename from tutorials/experts/source_en/parallel/dynamic_cluster.md rename to docs/mindspore/source_en/model_train/parallel/dynamic_cluster.md diff --git a/tutorials/experts/source_en/parallel/fault_recover.md b/docs/mindspore/source_en/model_train/parallel/fault_recover.md similarity index 100% rename from tutorials/experts/source_en/parallel/fault_recover.md rename to docs/mindspore/source_en/model_train/parallel/fault_recover.md diff --git a/tutorials/experts/source_en/parallel/host_device_training.md b/docs/mindspore/source_en/model_train/parallel/host_device_training.md similarity index 100% rename from tutorials/experts/source_en/parallel/host_device_training.md rename to docs/mindspore/source_en/model_train/parallel/host_device_training.md diff --git a/tutorials/experts/source_en/parallel/images/checkpoint_integrate_process.pptx b/docs/mindspore/source_en/model_train/parallel/images/checkpoint_integrate_process.pptx similarity index 100% rename from tutorials/experts/source_en/parallel/images/checkpoint_integrate_process.pptx rename to docs/mindspore/source_en/model_train/parallel/images/checkpoint_integrate_process.pptx diff --git a/tutorials/experts/source_en/parallel/images/comm_subgraph.png b/docs/mindspore/source_en/model_train/parallel/images/comm_subgraph.png similarity index 100% rename from tutorials/experts/source_en/parallel/images/comm_subgraph.png rename to docs/mindspore/source_en/model_train/parallel/images/comm_subgraph.png diff --git a/tutorials/experts/source_en/parallel/images/sharding_propagation.png b/docs/mindspore/source_en/model_train/parallel/images/sharding_propagation.png similarity index 100% rename from tutorials/experts/source_en/parallel/images/sharding_propagation.png rename to docs/mindspore/source_en/model_train/parallel/images/sharding_propagation.png diff --git a/tutorials/experts/source_en/parallel/images/sp_case1.png b/docs/mindspore/source_en/model_train/parallel/images/sp_case1.png similarity index 100% rename from tutorials/experts/source_en/parallel/images/sp_case1.png rename to docs/mindspore/source_en/model_train/parallel/images/sp_case1.png diff --git a/tutorials/experts/source_en/parallel/images/sp_case2.png b/docs/mindspore/source_en/model_train/parallel/images/sp_case2.png similarity index 100% rename from tutorials/experts/source_en/parallel/images/sp_case2.png rename to docs/mindspore/source_en/model_train/parallel/images/sp_case2.png diff --git a/tutorials/experts/source_en/parallel/images/sp_case3.png b/docs/mindspore/source_en/model_train/parallel/images/sp_case3.png similarity index 100% rename from tutorials/experts/source_en/parallel/images/sp_case3.png rename to docs/mindspore/source_en/model_train/parallel/images/sp_case3.png diff --git a/tutorials/experts/source_en/parallel/images/tensor_layout.png b/docs/mindspore/source_en/model_train/parallel/images/tensor_layout.png similarity index 100% rename from tutorials/experts/source_en/parallel/images/tensor_layout.png rename to docs/mindspore/source_en/model_train/parallel/images/tensor_layout.png diff --git a/tutorials/experts/source_en/parallel/manual_parallel.md b/docs/mindspore/source_en/model_train/parallel/manual_parallel.md similarity index 100% rename from tutorials/experts/source_en/parallel/manual_parallel.md rename to docs/mindspore/source_en/model_train/parallel/manual_parallel.md diff --git a/tutorials/experts/source_en/parallel/memory_offload.md b/docs/mindspore/source_en/model_train/parallel/memory_offload.md similarity index 100% rename from tutorials/experts/source_en/parallel/memory_offload.md rename to docs/mindspore/source_en/model_train/parallel/memory_offload.md diff --git a/tutorials/experts/source_en/parallel/model_loading.md b/docs/mindspore/source_en/model_train/parallel/model_loading.md similarity index 100% rename from tutorials/experts/source_en/parallel/model_loading.md rename to docs/mindspore/source_en/model_train/parallel/model_loading.md diff --git a/tutorials/experts/source_en/parallel/model_save_load.rst b/docs/mindspore/source_en/model_train/parallel/model_save_load.rst similarity index 100% rename from tutorials/experts/source_en/parallel/model_save_load.rst rename to docs/mindspore/source_en/model_train/parallel/model_save_load.rst diff --git a/tutorials/experts/source_en/parallel/model_saving.md b/docs/mindspore/source_en/model_train/parallel/model_saving.md similarity index 100% rename from tutorials/experts/source_en/parallel/model_saving.md rename to docs/mindspore/source_en/model_train/parallel/model_saving.md diff --git a/tutorials/experts/source_en/parallel/model_transformation.md b/docs/mindspore/source_en/model_train/parallel/model_transformation.md similarity index 100% rename from tutorials/experts/source_en/parallel/model_transformation.md rename to docs/mindspore/source_en/model_train/parallel/model_transformation.md diff --git a/tutorials/experts/source_en/parallel/mpirun.md b/docs/mindspore/source_en/model_train/parallel/mpirun.md similarity index 100% rename from tutorials/experts/source_en/parallel/mpirun.md rename to docs/mindspore/source_en/model_train/parallel/mpirun.md diff --git a/tutorials/experts/source_en/parallel/ms_operator.md b/docs/mindspore/source_en/model_train/parallel/ms_operator.md similarity index 100% rename from tutorials/experts/source_en/parallel/ms_operator.md rename to docs/mindspore/source_en/model_train/parallel/ms_operator.md diff --git a/tutorials/experts/source_en/parallel/msrun_launcher.md b/docs/mindspore/source_en/model_train/parallel/msrun_launcher.md similarity index 100% rename from tutorials/experts/source_en/parallel/msrun_launcher.md rename to docs/mindspore/source_en/model_train/parallel/msrun_launcher.md diff --git a/tutorials/experts/source_en/parallel/multiple_copy.md b/docs/mindspore/source_en/model_train/parallel/multiple_copy.md similarity index 100% rename from tutorials/experts/source_en/parallel/multiple_copy.md rename to docs/mindspore/source_en/model_train/parallel/multiple_copy.md diff --git a/tutorials/experts/source_en/parallel/multiple_mix.md b/docs/mindspore/source_en/model_train/parallel/multiple_mix.md similarity index 100% rename from tutorials/experts/source_en/parallel/multiple_mix.md rename to docs/mindspore/source_en/model_train/parallel/multiple_mix.md diff --git a/tutorials/experts/source_en/parallel/operator_parallel.md b/docs/mindspore/source_en/model_train/parallel/operator_parallel.md similarity index 100% rename from tutorials/experts/source_en/parallel/operator_parallel.md rename to docs/mindspore/source_en/model_train/parallel/operator_parallel.md diff --git a/tutorials/experts/source_en/parallel/optimize_technique.rst b/docs/mindspore/source_en/model_train/parallel/optimize_technique.rst similarity index 100% rename from tutorials/experts/source_en/parallel/optimize_technique.rst rename to docs/mindspore/source_en/model_train/parallel/optimize_technique.rst diff --git a/tutorials/experts/source_en/parallel/optimizer_parallel.md b/docs/mindspore/source_en/model_train/parallel/optimizer_parallel.md similarity index 100% rename from tutorials/experts/source_en/parallel/optimizer_parallel.md rename to docs/mindspore/source_en/model_train/parallel/optimizer_parallel.md diff --git a/tutorials/experts/source_en/parallel/others.rst b/docs/mindspore/source_en/model_train/parallel/others.rst similarity index 100% rename from tutorials/experts/source_en/parallel/others.rst rename to docs/mindspore/source_en/model_train/parallel/others.rst diff --git a/tutorials/experts/source_en/parallel/overview.md b/docs/mindspore/source_en/model_train/parallel/overview.md similarity index 100% rename from tutorials/experts/source_en/parallel/overview.md rename to docs/mindspore/source_en/model_train/parallel/overview.md diff --git a/tutorials/experts/source_en/parallel/pangu_alpha.md b/docs/mindspore/source_en/model_train/parallel/pangu_alpha.md similarity index 100% rename from tutorials/experts/source_en/parallel/pangu_alpha.md rename to docs/mindspore/source_en/model_train/parallel/pangu_alpha.md diff --git a/tutorials/experts/source_en/parallel/parameter_server_training.md b/docs/mindspore/source_en/model_train/parallel/parameter_server_training.md similarity index 100% rename from tutorials/experts/source_en/parallel/parameter_server_training.md rename to docs/mindspore/source_en/model_train/parallel/parameter_server_training.md diff --git a/tutorials/experts/source_en/parallel/pipeline_parallel.md b/docs/mindspore/source_en/model_train/parallel/pipeline_parallel.md similarity index 100% rename from tutorials/experts/source_en/parallel/pipeline_parallel.md rename to docs/mindspore/source_en/model_train/parallel/pipeline_parallel.md diff --git a/tutorials/experts/source_en/parallel/rank_table.md b/docs/mindspore/source_en/model_train/parallel/rank_table.md similarity index 100% rename from tutorials/experts/source_en/parallel/rank_table.md rename to docs/mindspore/source_en/model_train/parallel/rank_table.md diff --git a/tutorials/experts/source_en/parallel/recompute.md b/docs/mindspore/source_en/model_train/parallel/recompute.md similarity index 100% rename from tutorials/experts/source_en/parallel/recompute.md rename to docs/mindspore/source_en/model_train/parallel/recompute.md diff --git a/tutorials/experts/source_en/parallel/recover.rst b/docs/mindspore/source_en/model_train/parallel/recover.rst similarity index 100% rename from tutorials/experts/source_en/parallel/recover.rst rename to docs/mindspore/source_en/model_train/parallel/recover.rst diff --git a/tutorials/experts/source_en/parallel/sapp.md b/docs/mindspore/source_en/model_train/parallel/sapp.md similarity index 100% rename from tutorials/experts/source_en/parallel/sapp.md rename to docs/mindspore/source_en/model_train/parallel/sapp.md diff --git a/tutorials/experts/source_en/parallel/semi_auto_parallel.rst b/docs/mindspore/source_en/model_train/parallel/semi_auto_parallel.rst similarity index 100% rename from tutorials/experts/source_en/parallel/semi_auto_parallel.rst rename to docs/mindspore/source_en/model_train/parallel/semi_auto_parallel.rst diff --git a/tutorials/experts/source_en/parallel/shard_function_parallel.md b/docs/mindspore/source_en/model_train/parallel/shard_function_parallel.md similarity index 100% rename from tutorials/experts/source_en/parallel/shard_function_parallel.md rename to docs/mindspore/source_en/model_train/parallel/shard_function_parallel.md diff --git a/tutorials/experts/source_en/parallel/sharding_propagation.md b/docs/mindspore/source_en/model_train/parallel/sharding_propagation.md similarity index 100% rename from tutorials/experts/source_en/parallel/sharding_propagation.md rename to docs/mindspore/source_en/model_train/parallel/sharding_propagation.md diff --git a/tutorials/experts/source_en/parallel/split_technique.md b/docs/mindspore/source_en/model_train/parallel/split_technique.md similarity index 100% rename from tutorials/experts/source_en/parallel/split_technique.md rename to docs/mindspore/source_en/model_train/parallel/split_technique.md diff --git a/tutorials/experts/source_en/parallel/startup_method.rst b/docs/mindspore/source_en/model_train/parallel/startup_method.rst similarity index 100% rename from tutorials/experts/source_en/parallel/startup_method.rst rename to docs/mindspore/source_en/model_train/parallel/startup_method.rst diff --git a/tutorials/experts/source_en/parallel/strategy_select.md b/docs/mindspore/source_en/model_train/parallel/strategy_select.md similarity index 100% rename from tutorials/experts/source_en/parallel/strategy_select.md rename to docs/mindspore/source_en/model_train/parallel/strategy_select.md diff --git a/tutorials/experts/source_en/parallel/support_dynamic_shape_in_parallel.md b/docs/mindspore/source_en/model_train/parallel/support_dynamic_shape_in_parallel.md similarity index 100% rename from tutorials/experts/source_en/parallel/support_dynamic_shape_in_parallel.md rename to docs/mindspore/source_en/model_train/parallel/support_dynamic_shape_in_parallel.md diff --git a/docs/mindspore/source_en/model_train/program_form/images/dynamic.png b/docs/mindspore/source_en/model_train/program_form/images/dynamic.png new file mode 100644 index 0000000000000000000000000000000000000000..219dae25c919ec3bb2a49df919177cb462bc9b94 GIT binary patch literal 3077 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 L+L%-ux!?IG&JOu# literal 0 HcmV?d00001 diff --git a/docs/mindspore/source_en/note/index_support.md b/docs/mindspore/source_en/model_train/program_form/index_support.md similarity index 100% rename from docs/mindspore/source_en/note/index_support.md rename to docs/mindspore/source_en/model_train/program_form/index_support.md diff --git a/docs/mindspore/source_en/model_train/program_form/interface.md b/docs/mindspore/source_en/model_train/program_form/interface.md new file mode 100644 index 0000000000..46882ceead --- /dev/null +++ b/docs/mindspore/source_en/model_train/program_form/interface.md @@ -0,0 +1,3 @@ +# Interface Forms + +[![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_en/model_train/program_form/interface.md) diff --git a/docs/mindspore/source_en/model_train/program_form/overview.md b/docs/mindspore/source_en/model_train/program_form/overview.md new file mode 100644 index 0000000000..de49835c27 --- /dev/null +++ b/docs/mindspore/source_en/model_train/program_form/overview.md @@ -0,0 +1,3 @@ +# Programming Forms Overview + +[![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_en/model_train/program_form/overview.md) \ No newline at end of file diff --git a/docs/mindspore/source_en/note/static_graph_syntax/operators.md b/docs/mindspore/source_en/model_train/program_form/static_graph_syntax/operators.md similarity index 100% rename from docs/mindspore/source_en/note/static_graph_syntax/operators.md rename to docs/mindspore/source_en/model_train/program_form/static_graph_syntax/operators.md diff --git a/docs/mindspore/source_en/note/static_graph_syntax/python_builtin_functions.md b/docs/mindspore/source_en/model_train/program_form/static_graph_syntax/python_builtin_functions.md similarity index 100% rename from docs/mindspore/source_en/note/static_graph_syntax/python_builtin_functions.md rename to docs/mindspore/source_en/model_train/program_form/static_graph_syntax/python_builtin_functions.md diff --git a/docs/mindspore/source_en/note/static_graph_syntax/statements.md b/docs/mindspore/source_en/model_train/program_form/static_graph_syntax/statements.md similarity index 100% rename from docs/mindspore/source_en/note/static_graph_syntax/statements.md rename to docs/mindspore/source_en/model_train/program_form/static_graph_syntax/statements.md diff --git a/tutorials/source_en/advanced/static_graph_expert_programming.md b/docs/mindspore/source_en/model_train/program_form/static_graph_syntax/static_graph_expert_programming.md similarity index 100% rename from tutorials/source_en/advanced/static_graph_expert_programming.md rename to docs/mindspore/source_en/model_train/program_form/static_graph_syntax/static_graph_expert_programming.md diff --git a/docs/mindspore/source_en/note/static_graph_syntax_support.md b/docs/mindspore/source_en/model_train/program_form/static_graph_syntax/static_graph_syntax_support.md similarity index 100% rename from docs/mindspore/source_en/note/static_graph_syntax_support.md rename to docs/mindspore/source_en/model_train/program_form/static_graph_syntax/static_graph_syntax_support.md diff --git a/docs/mindspore/source_en/model_train/train_process/algorithm_optimize.rst b/docs/mindspore/source_en/model_train/train_process/algorithm_optimize.rst new file mode 100644 index 0000000000..697ec25aa9 --- /dev/null +++ b/docs/mindspore/source_en/model_train/train_process/algorithm_optimize.rst @@ -0,0 +1,8 @@ +Algorithm Optimization +====================== + +.. toctree:: + :maxdepth: 1 + + optimize/gradient_accumulation + optimize/thor \ No newline at end of file diff --git a/tutorials/source_en/advanced/derivation.md b/docs/mindspore/source_en/model_train/train_process/derivation.md similarity index 100% rename from tutorials/source_en/advanced/derivation.md rename to docs/mindspore/source_en/model_train/train_process/derivation.md diff --git a/docs/mindspore/source_en/design/dynamic_shape.md b/docs/mindspore/source_en/model_train/train_process/dynamic_shape.md similarity index 100% rename from docs/mindspore/source_en/design/dynamic_shape.md rename to docs/mindspore/source_en/model_train/train_process/dynamic_shape.md diff --git a/docs/mindspore/source_en/model_train/train_process/func_programming.rst b/docs/mindspore/source_en/model_train/train_process/func_programming.rst new file mode 100644 index 0000000000..9fd161e00c --- /dev/null +++ b/docs/mindspore/source_en/model_train/train_process/func_programming.rst @@ -0,0 +1,9 @@ +Higher Order Functional Programming +===================================== + +.. toctree:: + :maxdepth: 1 + + vmap/vmap + func_programming/Jacobians_Hessians + func_programming/per_sample_gradients diff --git a/tutorials/experts/source_en/func_programming/Jacobians_Hessians.md b/docs/mindspore/source_en/model_train/train_process/func_programming/Jacobians_Hessians.md similarity index 100% rename from tutorials/experts/source_en/func_programming/Jacobians_Hessians.md rename to docs/mindspore/source_en/model_train/train_process/func_programming/Jacobians_Hessians.md diff --git a/tutorials/experts/source_en/func_programming/per_sample_gradients.md b/docs/mindspore/source_en/model_train/train_process/func_programming/per_sample_gradients.md similarity index 100% rename from tutorials/experts/source_en/func_programming/per_sample_gradients.md rename to docs/mindspore/source_en/model_train/train_process/func_programming/per_sample_gradients.md diff --git a/tutorials/experts/source_en/optimize/images/image-data-sink.png b/docs/mindspore/source_en/model_train/train_process/images/image-data-sink.png similarity index 100% rename from tutorials/experts/source_en/optimize/images/image-data-sink.png rename to docs/mindspore/source_en/model_train/train_process/images/image-data-sink.png diff --git a/tutorials/experts/source_en/optimize/images/image-graph-sink.png b/docs/mindspore/source_en/model_train/train_process/images/image-graph-sink.png similarity index 100% rename from tutorials/experts/source_en/optimize/images/image-graph-sink.png rename to docs/mindspore/source_en/model_train/train_process/images/image-graph-sink.png diff --git a/tutorials/experts/source_en/optimize/images/image-loop-sink.png b/docs/mindspore/source_en/model_train/train_process/images/image-loop-sink.png similarity index 100% rename from tutorials/experts/source_en/optimize/images/image-loop-sink.png rename to docs/mindspore/source_en/model_train/train_process/images/image-loop-sink.png diff --git a/tutorials/experts/source_en/optimize/images/image-user-view.png b/docs/mindspore/source_en/model_train/train_process/images/image-user-view.png similarity index 100% rename from tutorials/experts/source_en/optimize/images/image-user-view.png rename to docs/mindspore/source_en/model_train/train_process/images/image-user-view.png diff --git a/tutorials/experts/source_en/optimize/images/image-without-sink.png b/docs/mindspore/source_en/model_train/train_process/images/image-without-sink.png similarity index 100% rename from tutorials/experts/source_en/optimize/images/image-without-sink.png rename to docs/mindspore/source_en/model_train/train_process/images/image-without-sink.png diff --git a/tutorials/source_en/advanced/model.rst b/docs/mindspore/source_en/model_train/train_process/model.rst similarity index 100% rename from tutorials/source_en/advanced/model.rst rename to docs/mindspore/source_en/model_train/train_process/model.rst diff --git a/tutorials/source_en/advanced/model/callback.md b/docs/mindspore/source_en/model_train/train_process/model/callback.md similarity index 100% rename from tutorials/source_en/advanced/model/callback.md rename to docs/mindspore/source_en/model_train/train_process/model/callback.md diff --git a/tutorials/source_en/advanced/model/images/model.png b/docs/mindspore/source_en/model_train/train_process/model/images/model.png similarity index 100% rename from tutorials/source_en/advanced/model/images/model.png rename to docs/mindspore/source_en/model_train/train_process/model/images/model.png diff --git a/tutorials/source_en/advanced/model/metric.md b/docs/mindspore/source_en/model_train/train_process/model/metric.md similarity index 100% rename from tutorials/source_en/advanced/model/metric.md rename to docs/mindspore/source_en/model_train/train_process/model/metric.md diff --git a/tutorials/experts/source_en/optimize/gradient_accumulation.md b/docs/mindspore/source_en/model_train/train_process/optimize/gradient_accumulation.md similarity index 100% rename from tutorials/experts/source_en/optimize/gradient_accumulation.md rename to docs/mindspore/source_en/model_train/train_process/optimize/gradient_accumulation.md diff --git a/tutorials/experts/source_zh_cn/optimize/images/graph_kernel_example_custom_op.png b/docs/mindspore/source_en/model_train/train_process/optimize/images/graph_kernel_example_custom_op.png similarity index 100% rename from tutorials/experts/source_zh_cn/optimize/images/graph_kernel_example_custom_op.png rename to docs/mindspore/source_en/model_train/train_process/optimize/images/graph_kernel_example_custom_op.png diff --git a/tutorials/experts/source_zh_cn/optimize/images/graph_kernel_example_fuse_basic.png b/docs/mindspore/source_en/model_train/train_process/optimize/images/graph_kernel_example_fuse_basic.png similarity index 100% rename from tutorials/experts/source_zh_cn/optimize/images/graph_kernel_example_fuse_basic.png rename to docs/mindspore/source_en/model_train/train_process/optimize/images/graph_kernel_example_fuse_basic.png diff --git a/docs/mindspore/source_en/model_train/train_process/optimize/images/image-data-sink.png b/docs/mindspore/source_en/model_train/train_process/optimize/images/image-data-sink.png new file mode 100644 index 0000000000000000000000000000000000000000..65bb95871f275b32e94f0b06d23632116817fdd9 GIT binary patch literal 20424 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 Ced0y{ literal 0 HcmV?d00001 diff --git a/docs/mindspore/source_en/model_train/train_process/optimize/images/image-graph-sink.png b/docs/mindspore/source_en/model_train/train_process/optimize/images/image-graph-sink.png new file mode 100644 index 0000000000000000000000000000000000000000..08d6809a3089a077c2d237e551790a170f82775f GIT binary patch literal 19831 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 literal 0 HcmV?d00001 diff --git a/docs/mindspore/source_en/model_train/train_process/optimize/images/image-loop-sink.png b/docs/mindspore/source_en/model_train/train_process/optimize/images/image-loop-sink.png new file mode 100644 index 0000000000000000000000000000000000000000..657401ab6a3a2489155ed5d38d8599b9b3fc71b2 GIT binary patch literal 21233 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 Wr#s^HF5&+-L||stXNyfd@B9ar#H17e literal 0 HcmV?d00001 diff --git a/docs/mindspore/source_en/model_train/train_process/optimize/images/image-without-sink.png b/docs/mindspore/source_en/model_train/train_process/optimize/images/image-without-sink.png new file mode 100644 index 0000000000000000000000000000000000000000..3d928eb32dfd7211a1feb66868d4b763d741826e GIT binary patch literal 21689 zcmbrmXH-+$+BOU}R1{RUAl*Vy>Ae#hB2q07=|~kwKza`+GXpYuHLJKizAAA7hH=9+7*Iq!1a*L}_SX{aflJy&?5)1CS&ul^^x^2@Py9+0ov!`#*41Tk_ z=A^293&JQLXX81lNu0Zjo5dW!zc@i&%70zic9)GmFvzLgI!>HcHt1t_jN;?U z_tnhVZ6d`N34zw3TM#BGiJ%XhBKRF5KIR1+BxmO$k3TNT)Mxl@~8kD4cH|VF&i34lL!% zXToZm8YP7dFstg_TQud|5H_WfoMGNoaQwhZJK>?ES6I zz384>sOsID@8vBA137ba3ec}sUK8T3&G&y49kDr+e|!omq!V{5t|6dxVD2)^2r>P# zUgy15UgA)B&CjA+^5D|9i*>=mC2IjWv!#ietgkvcymPaSnbXt@DoN7`X3t&L1uyS< zWcoqg1BX1uz;>~DlT1cEu{c|aoYN(Pbg!acJETYk1V0#fk&e7CulBGjtD!IhN(mfH z?CA7K3b0gGRPE=%dQtog(r6DZHCR0LgJKGL)qIOB@gTm+w^G8H$7|`ks$=cnZJqdc zKhCp<3OK^kbh%;4)6m8A3Pm-vq5zAl%w38pst+mlQ_y-34>ox>vLz<4qGpqt=uboY z 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 PKos$7l3TUQp^U!(DLx`S literal 0 HcmV?d00001 diff --git a/tutorials/experts/source_en/optimize/thor.rst b/docs/mindspore/source_en/model_train/train_process/optimize/thor.rst similarity index 100% rename from tutorials/experts/source_en/optimize/thor.rst rename to docs/mindspore/source_en/model_train/train_process/optimize/thor.rst diff --git a/tutorials/experts/source_en/optimize/thor/intro.md b/docs/mindspore/source_en/model_train/train_process/optimize/thor/intro.md similarity index 100% rename from tutorials/experts/source_en/optimize/thor/intro.md rename to docs/mindspore/source_en/model_train/train_process/optimize/thor/intro.md diff --git a/tutorials/experts/source_en/optimize/thor/resnet50.md b/docs/mindspore/source_en/model_train/train_process/optimize/thor/resnet50.md similarity index 100% rename from tutorials/experts/source_en/optimize/thor/resnet50.md rename to docs/mindspore/source_en/model_train/train_process/optimize/thor/resnet50.md diff --git a/docs/mindspore/source_en/model_train/train_process/overview.md b/docs/mindspore/source_en/model_train/train_process/overview.md new file mode 100644 index 0000000000..d1e2d976ea --- /dev/null +++ b/docs/mindspore/source_en/model_train/train_process/overview.md @@ -0,0 +1,3 @@ +# Training Process Overview + +[![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_en/model_train/train_process/overview.md) diff --git a/tutorials/experts/source_en/optimize/execution_opt.md b/docs/mindspore/source_en/model_train/train_process/train_optimize.md similarity index 96% rename from tutorials/experts/source_en/optimize/execution_opt.md rename to docs/mindspore/source_en/model_train/train_process/train_optimize.md index 1d9b22c23d..bb4f6253d4 100644 --- a/tutorials/experts/source_en/optimize/execution_opt.md +++ b/docs/mindspore/source_en/model_train/train_process/train_optimize.md @@ -1,8 +1,10 @@ -# Sinking Mode +# Optimizing Training Performance -[![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/tutorials/experts/source_en/optimize/execution_opt.md) +[![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_en/model_train/train_process/train_optimize.md) -## Overview +## Sinking Mode + +### Overview The Ascend chip integrates computational units such as AICORE and AICPU. The AICORE is responsible for dense Tensor and Vector operations, while the AICPU is responsible for processing complex control logic. @@ -14,7 +16,7 @@ From the user's perspective, the process of network training is as follows: This tutorial introduces the principles and usage of data sink, graph sink and loop sink as an example of the execution flow of training. -## Data Sinking +### Data Sinking To improve the execution performance of the network, a dedicated chip is usually used to execute the operator. A chip corresponds to a Device, and the general interaction flow between Host and Device is as follows: @@ -30,7 +32,7 @@ Both GPU backend and Ascend backend support data sinking, and the Host-Device in Users can control whether to enable data sink through `dataset_sink_mode` of the [train](https://mindspore.cn/docs/en/master/api_python/train/mindspore.train.Model.html#mindspore.train.Model.train) interface. -## Graph Sinking +### Graph Sinking In general, each training iteration needs to issue and trigger the execution of each operator on the device, and Host and Device interact frequently. @@ -40,7 +42,7 @@ In order to reduce the interaction between Host and Device, the operators in the The GPU backend does not support graph sinking currently. When using the Ascend device, data sinking is turned on and the graph sinking is turned on at the same time. -## Loop Sinking +### Loop Sinking When data sinking and graph sinking are enabled, the computed results of each iteration are returned to Host, which determines whether it is necessary to move to the next iteration. To reduce the Device-Host interaction for each iteration, you can sink the loop judgment into the next iteration to the Device, so that the computation result is returned to the Host when all iterations are executed. The loop sinking Host-Device interaction flow is as follows: @@ -48,9 +50,9 @@ When data sinking and graph sinking are enabled, the computed results of each it The users control the number of sink iterations per epoch through the `dataset_sink_mode` and `sink_size` parameters of the [train](https://mindspore.cn/docs/zh-CN/master/api_python/train/mindspore.train.Model.html#mindspore.train.Model.train) interface, and the Device side executes `sink_size` iterations consecutively before returning to the Host. -## Usage +### Usage -### `Model.train` Implements Data Sinking +#### `Model.train` Implements Data Sinking `dataset_sink_mode`, the `train` interface parameter of `Model` can control whether the data is sunk. If `dataset_sink_mode` is True, it means data sinking, otherwise it is non-sunk. The so-called sink means that the data is sent directly to the Device through the channel. @@ -67,7 +69,7 @@ When using `LossMonitor`, `TimeMonitor` or other `Callback` interfaces, if `data > - The current CPU does not support data sinking. > - When set to GRAPH mode, the shape of each batch of data must be the same, while when set to PYNATIVE mode, the size of each batch of data is required to be the same. > - Since the traversal of the dataset by data sinking is continuous, non-continuous traversal is not currently supported. -> - If you get `fault kernel_name=GetNext`, `GetNext... task error` or `outputs = self.get_next()` and other similar errors, it is possible that some samples are too time-consuming to be processed during data processing, causing the network computation side to fail to get the data for a long time to report errors, when using data sinking mode. At this point, you can set `dataset_sink_mode` to False to verify again, or use `create_dict_iterator()` interface to loop the dataset separately. Refer to [data processing performance optimization](https://mindspore.cn/tutorials/experts/en/master/dataset/optimize.html) to tune the data processing to ensure high performance of data processing. +> - If you get `fault kernel_name=GetNext`, `GetNext... task error` or `outputs = self.get_next()` and other similar errors, it is possible that some samples are too time-consuming to be processed during data processing, causing the network computation side to fail to get the data for a long time to report errors, when using data sinking mode. At this point, you can set `dataset_sink_mode` to False to verify again, or use `create_dict_iterator()` interface to loop the dataset separately. Refer to [data processing performance optimization](https://mindspore.cn/docs/en/master/model_train/dataset/optimize.html) to tune the data processing to ensure high performance of data processing. Code samples are as follows: @@ -249,7 +251,7 @@ When dataset_sink_mode is set to True, the results are returned once per epoch. When dataset_sink_mode is False, the sink_size parameter setting is invalid. -### `data_sink` Implements Data Sinking +#### `data_sink` Implements Data Sinking In MindSpore functional programming paradigm, it is also possible to use the [data_sink interface](https://mindspore.cn/docs/en/master/api_python/mindspore/mindspore.data_sink.html) to bind the execution functions and datasets of the modes for data sinking. The meaning of the parameters is as follows: @@ -262,7 +264,7 @@ In MindSpore functional programming paradigm, it is also possible to use the [da > - The current CPU does not support data sinking. > - When set to GRAPH mode, the shape of each batch of data must be the same, while when set to PYNATIVE mode, the size of each batch of data is required to be the same. > - Since the traversal of the dataset by data sinking is continuous, non-continuous traversal is not currently supported. -> - If you get `fault kernel_name=GetNext`, `GetNext... task error` or `outputs = self.get_next()` and other similar errors, it is possible that some samples are too time-consuming to be processed during data processing, causing the network computation side to fail to get the data for a long time to report errors, when using data sinking mode. At this point, you can set `dataset_sink_mode` to False to verify again, or use `create_dict_iterator()` interface to loop the dataset separately. Refer to [data processing performance optimization](https://mindspore.cn/tutorials/experts/en/master/dataset/optimize.html) to tune the data processing to ensure high performance of data processing. +> - If you get `fault kernel_name=GetNext`, `GetNext... task error` or `outputs = self.get_next()` and other similar errors, it is possible that some samples are too time-consuming to be processed during data processing, causing the network computation side to fail to get the data for a long time to report errors, when using data sinking mode. At this point, you can set `dataset_sink_mode` to False to verify again, or use `create_dict_iterator()` interface to loop the dataset separately. Refer to [data processing performance optimization](https://mindspore.cn/docs/en/master/model_train/dataset/optimize.html) to tune the data processing to ensure high performance of data processing. The code samples are as follows: @@ -450,3 +452,5 @@ The code uses 3 calls to train 10 epochs separately. 3. Sink 10 epochs of data at a time, and return loss at the end of 10 epochs. No need to loop on Host side. Among the above methods, method 1 interacts with Device once at the end of each step, which is less efficient. Method 3 does not need to interact with Device during training and has the most efficient execution, but can only return the loss of the last step. + +## Co-optimization with Data Flow diff --git a/tutorials/experts/source_en/vmap/vmap.ipynb b/docs/mindspore/source_en/model_train/train_process/vmap/vmap.ipynb similarity index 100% rename from tutorials/experts/source_en/vmap/vmap.ipynb rename to docs/mindspore/source_en/model_train/train_process/vmap/vmap.ipynb diff --git a/docs/mindspore/source_zh_cn/api_python/index.rst b/docs/mindspore/source_zh_cn/api_python/index.rst new file mode 100644 index 0000000000..30f3c0d4af --- /dev/null +++ b/docs/mindspore/source_zh_cn/api_python/index.rst @@ -0,0 +1,29 @@ +API 文档 +========================= + +.. toctree:: + :glob: + :maxdepth: 1 + + mindspore + mindspore.nn + mindspore.ops + mindspore.ops.primitive + mindspore.mint + mindspore.amp + mindspore.train + mindspore.communication + mindspore.communication.comm_func + mindspore.common.initializer + mindspore.hal + mindspore.dataset + mindspore.dataset.transforms + mindspore.mindrecord + mindspore.nn.probability + mindspore.rewrite + mindspore.multiprocessing + mindspore.boost + mindspore.numpy + mindspore.scipy + mindspore.experimental + ../note/env_var_list diff --git a/docs/mindspore/source_zh_cn/conf.py b/docs/mindspore/source_zh_cn/conf.py index 232ef610ec..de8fd7cb3e 100644 --- a/docs/mindspore/source_zh_cn/conf.py +++ b/docs/mindspore/source_zh_cn/conf.py @@ -241,11 +241,15 @@ src_dir = os.path.join(repo_path, copy_path) des_sir = "./api_python" def copy_source(sourcedir, des_sir): - if not exists(sourcedir): - logger.warning(f"不存在目录:{sourcedir}!") - if os.path.exists(des_sir): - shutil.rmtree(des_sir) - shutil.copytree(sourcedir, des_sir) + for i in os.listdir(sourcedir): + if os.path.isfile(os.path.join(sourcedir,i)): + if os.path.exists(os.path.join(des_sir, i)): + os.remove(os.path.join(des_sir, i)) + shutil.copy(os.path.join(sourcedir, i), os.path.join(des_sir, i)) + else: + if os.path.exists(os.path.join(des_sir, i)): + shutil.rmtree(os.path.join(des_sir, i)) + shutil.copytree(os.path.join(sourcedir, i), os.path.join(des_sir, i)) copy_source(src_dir, des_sir) diff --git a/docs/mindspore/source_zh_cn/design/index.rst b/docs/mindspore/source_zh_cn/design/index.rst new file mode 100644 index 0000000000..88775194a3 --- /dev/null +++ b/docs/mindspore/source_zh_cn/design/index.rst @@ -0,0 +1,17 @@ +设计理念 +========================= + +.. toctree:: + :glob: + :maxdepth: 1 + + overview + tensor_view + programming_paradigm + dynamic_graph_and_static_graph + distributed_training_design + data_engine + all_scenarios + graph_fusion_engine + pluggable_device + glossary diff --git a/docs/mindspore/source_zh_cn/faq/index.rst b/docs/mindspore/source_zh_cn/faq/index.rst new file mode 100644 index 0000000000..28cebf75fd --- /dev/null +++ b/docs/mindspore/source_zh_cn/faq/index.rst @@ -0,0 +1,17 @@ +FAQ +======== + +.. toctree:: + :glob: + :maxdepth: 1 + + installation + data_processing + implement_problem + network_compilation + operators_compile + performance_tuning + precision_tuning + distributed_parallel + inference + feature_advice diff --git a/docs/mindspore/source_zh_cn/index.rst b/docs/mindspore/source_zh_cn/index.rst index da7e541c41..a4ce27eece 100644 --- a/docs/mindspore/source_zh_cn/index.rst +++ b/docs/mindspore/source_zh_cn/index.rst @@ -1,131 +1,20 @@ -.. MindSpore documentation master file, created by - sphinx-quickstart on Thu Mar 24 11:00:00 2022. - You can adapt this file completely to your liking, but it should at least - contain the root `toctree` directive. - MindSpore 文档 ========================= .. toctree:: :glob: :maxdepth: 1 - :caption: 设计 - :hidden: - - design/overview - design/tensor_view - design/programming_paradigm - design/dynamic_graph_and_static_graph - design/dynamic_shape - design/distributed_training_design - design/data_engine - design/all_scenarios - design/graph_fusion_engine - design/pluggable_device - design/glossary - -.. toctree:: - :glob: - :maxdepth: 1 - :caption: 模型库 - :hidden: - - note/official_models - -.. toctree:: - :glob: - :maxdepth: 1 - :caption: API - :hidden: - - api_python/mindspore - api_python/mindspore.nn - api_python/mindspore.ops - api_python/mindspore.ops.primitive - api_python/mindspore.mint - api_python/mindspore.amp - api_python/mindspore.train - api_python/mindspore.communication - api_python/mindspore.communication.comm_func - api_python/mindspore.common.initializer - api_python/mindspore.hal - api_python/mindspore.dataset - api_python/mindspore.dataset.transforms - api_python/mindspore.mindrecord - api_python/mindspore.nn.probability - api_python/mindspore.rewrite - api_python/mindspore.multiprocessing - api_python/mindspore.boost - api_python/mindspore.numpy - api_python/mindspore.scipy - api_python/mindspore.experimental - -.. toctree:: - :glob: - :maxdepth: 1 - :caption: API映射 - :hidden: - - note/api_mapping/pytorch_api_mapping - -.. toctree:: - :glob: - :maxdepth: 1 - :caption: 迁移指南 - :titlesonly: - :hidden: - - migration_guide/overview - migration_guide/enveriment_preparation - migration_guide/analysis_and_preparation - migration_guide/model_development/model_development - migration_guide/debug_and_tune - migration_guide/sample_code - migration_guide/faq - -.. toctree:: - :glob: - :maxdepth: 1 - :caption: 语法支持 - :hidden: - - note/static_graph_syntax_support - note/static_graph_syntax/operators - note/static_graph_syntax/statements - note/static_graph_syntax/python_builtin_functions - note/index_support - -.. toctree:: - :glob: - :maxdepth: 1 - :caption: 环境变量 - :hidden: - - note/env_var_list - -.. toctree:: - :glob: - :maxdepth: 1 - :caption: FAQ - :hidden: - - faq/installation - faq/data_processing - faq/implement_problem - faq/network_compilation - faq/operators_compile - faq/performance_tuning - faq/precision_tuning - faq/distributed_parallel - faq/inference - faq/feature_advice - -.. toctree:: - :glob: - :maxdepth: 1 - :caption: RELEASE NOTES :hidden: + design/index + model_train/index + model_infer/index + migration_guide/index + mindformers/index + api_python/index + orange_pi/index + kits_tools/index + faq/index RELEASE .. raw:: html @@ -151,7 +40,7 @@ MindSpore 文档
    - +
    模型库 @@ -219,7 +108,7 @@ MindSpore 文档
    - +
    语法支持 diff --git a/docs/mindspore/source_zh_cn/kits_tools/index.rst b/docs/mindspore/source_zh_cn/kits_tools/index.rst new file mode 100644 index 0000000000..de76432601 --- /dev/null +++ b/docs/mindspore/source_zh_cn/kits_tools/index.rst @@ -0,0 +1,9 @@ +模型与套件 +========================= + +.. toctree:: + :glob: + :maxdepth: 1 + + overview + official_models diff --git a/docs/mindspore/source_zh_cn/note/official_models.md b/docs/mindspore/source_zh_cn/kits_tools/official_models.md similarity index 100% rename from docs/mindspore/source_zh_cn/note/official_models.md rename to docs/mindspore/source_zh_cn/kits_tools/official_models.md diff --git a/docs/mindspore/source_zh_cn/kits_tools/overview.md b/docs/mindspore/source_zh_cn/kits_tools/overview.md new file mode 100644 index 0000000000..2cc6e4c937 --- /dev/null +++ b/docs/mindspore/source_zh_cn/kits_tools/overview.md @@ -0,0 +1,18 @@ +# 模型与套件 + +[![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_zh_cn/kits_tools/overview.md) + +| 核心框架 | 工具组件 |领域套件与扩展包 | 科学计算套件 | 大模型套件 | +| ---- | ----- | ------- | --------- | ------------- | +| [MindSpore](https://www.mindspore.cn/docs/zh-CN/master/index.html) | [MindSpore Insight](https://www.mindspore.cn/mindinsight/docs/zh-CN/r2.3/index.html) | [MindSpore CV](https://mindspore-lab.github.io/mindcv/) | [MindSpore SciAI](https://www.mindspore.cn/sciai/docs/zh-CN/r0.1/index.html) | [MindSpore Transformers](https://mindformers.readthedocs.io/zh-cn/latest/)| +| [MindSpore Lite](https://www.mindspore.cn/lite) | [MindSpore Armour](https://www.mindspore.cn/mindarmour/docs/zh-CN/r2.0/index.html) | [MindSpore NLP](https://mindnlp.cqu.ai/) | [MindSpore Elec](https://www.mindspore.cn/mindelec/docs/zh-CN/r0.2/index.html) | [MindSpore Pet](https://github.com/mindspore-lab/mindpet)| +| [MindSpore AKG](https://gitee.com/mindspore/akg) | [MindSpore Serving](https://www.mindspore.cn/serving/docs/zh-CN/r2.0/index.html) | [MindSpore Audio](https://github.com/mindspore-lab/mindaudio) | [MindSpore SPONGE](https://www.mindspore.cn/mindsponge/docs/zh-CN/r1.0.0-rc2/index.html) | [MindSpore RLHF](https://github.com/mindspore-lab/mindrlhf)| +| | [MindSpore Federated](https://www.mindspore.cn/federated/docs/zh-CN/r0.1/index.html) | [MindSpore OCR](https://mindspore-lab.github.io/mindocr/) | [MindSpore Flow](https://www.mindspore.cn/mindflow/docs/zh-CN/r0.2/index.html) | [MindSpore One](https://github.com/mindspore-lab/mindone)| +| | [MindSpore Golden Stick](https://www.mindspore.cn/golden_stick/docs/zh-CN/r0.4/index.html) | [MindSpore YOLO](https://mindspore-lab.github.io/mindyolo/) | [MindSpore Earth](https://www.mindspore.cn/mindearth/docs/zh-CN/r0.2/index.html) | [MindSpore Recommender](https://www.mindspore.cn/recommender/docs/zh-CN/r0.3/index.html)| +| | [MindSpore XAI](https://www.mindspore.cn/xai/docs/zh-CN/r1.8/index.html) | [MindSpore Face](https://github.com/mindspore-lab/mindface) | [MindSpore Quantum](https://www.mindspore.cn/mindquantum/docs/zh-CN/r0.9/index.html)| | +| | [MindSpore Dev Toolkits](https://www.mindspore.cn/devtoolkit/docs/zh-CN/r2.2/index.html) | [MindSpore Graph Learning](https://www.mindspore.cn/graphlearning/docs/zh-CN/r0.2/index.html)| | | +| | | [MindSpore Reinforcement](https://www.mindspore.cn/reinforcement/docs/zh-CN/r0.7/index.html)| | | +| | | [MindSpore Probability](https://www.mindspore.cn/probability/docs/zh-CN/r1.7/index.html)| | | +| | | [MindSpore Pandas](https://www.mindspore.cn/mindpandas/docs/zh-CN/r0.2/index.html)| | | +| | | [MindSpore ModelZoo](https://gitee.com/mindspore/models)| | | +| | | [MindSpore Hub](https://www.mindspore.cn/hub/docs/zh-CN/r1.9/index.html)| | | diff --git a/docs/mindspore/source_zh_cn/migration_guide/debug_and_tune.md b/docs/mindspore/source_zh_cn/migration_guide/acc_debug.md similarity index 49% rename from docs/mindspore/source_zh_cn/migration_guide/debug_and_tune.md rename to docs/mindspore/source_zh_cn/migration_guide/acc_debug.md index 16ef1a561a..f4bdb69e15 100644 --- a/docs/mindspore/source_zh_cn/migration_guide/debug_and_tune.md +++ b/docs/mindspore/source_zh_cn/migration_guide/acc_debug.md @@ -1,6 +1,6 @@ -# 调试调优 +# 精度调优 -[![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_zh_cn/migration_guide/debug_and_tune.md) +[![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_zh_cn/migration_guide/acc_debug.md) ## 调优常见问题及解决办法 @@ -12,33 +12,12 @@ - loss出现NAN/INF: 可以通过[TroubleShooter获取INF/NAN值抛出点](https://gitee.com/mindspore/toolkits/blob/master/troubleshooter/docs/tracker.md#%E5%BA%94%E7%94%A8%E5%9C%BA%E6%99%AF2%E8%8E%B7%E5%8F%96infnan%E5%80%BC%E6%8A%9B%E5%87%BA%E7%82%B9)识别网络中第一个出现NAN或INF的位置。 也可通过[Dump](https://www.mindspore.cn/tutorials/experts/zh-CN/master/debug/dump.html)工具进行溢出算子检测。 -- 性能调试阶段,可能会遇到以下常见问题: - - 第一个step耗时长 - 这个阶段主要完成图转换、图融合、图优化等操作,是生成可执行模型的过程,可参考[如何优化编译性能](https://www.mindspore.cn/tutorials/zh-CN/master/advanced/static_graph_expert_programming.html#%E5%A6%82%E4%BD%95%E4%BC%98%E5%8C%96%E7%BC%96%E8%AF%91%E6%80%A7%E8%83%BD)。 - - 迭代间隙耗时长 - 这个阶段的耗时大部分来源于数据获取,可参考[数据处理性能优化](https://www.mindspore.cn/tutorials/experts/zh-CN/master/dataset/optimize.html)。 - - 前反向计算耗时长 - 这个阶段主要执行网络中的前向及反向算子,承载了一个迭代的主要计算工作。可通过[Profiler](https://www.mindspore.cn/mindinsight/docs/zh-CN/master/performance_profiling.html)将训练过程中的算子耗时等信息记录到文件中。该性能数据提供框架的host执行、以及算子执行的性能数据,也可通过[MindInsight](https://www.mindspore.cn/mindinsight/docs/zh-CN/master/index.html)可视化界面供用户查看分析,帮助用户更高效地调试神经网络性能。 - - 迭代拖尾耗时长 - 这个阶段耗时长可能是集合通信耗时长,可设置融合策略进行优化,可参考[all_reduce_fusion_config设置allreduce融合策略](https://www.mindspore.cn/docs/zh-CN/master/api_python/mindspore/mindspore.set_auto_parallel_context.html)。 -- 显存调试阶段,可能遇到以下常见问题: - - Malloc device memory failed: - MindSpore申请device侧内存失败,原始是设备被其他进程占用,可通过ps -ef | grep "python"查看正在跑的进程。 - - Out of Memory: - MindSpore申请动态内存失败,可能的原因有:batch size太大,处理数据太多导致内存占用大;通信算子占用内存太多导致整体内存复用率较低。 - -## MindSpore调优功能介绍 - -### 功能调试 - -在网络的迁移过程,建议优先使用PYNATIVE模式进行调试,在PYNATIVE模式下可以进行debug,日志打印也比较友好。在调试ok后转成图模式运行,图模式在执行性能上会更友好,也可以找到一些在编写网络中的问题,比如使用了三方的算子导致梯度截断。 -详情请参考[错误分析](https://www.mindspore.cn/tutorials/zh-CN/master/advanced/error_analysis/error_scenario_analysis.html)。 - -### 精度调试 + +## 精度调试过程 精度调试的过程基本可以分为以下过程: -#### 1.检查参数 +### 1.检查参数 这部分包含检查所有参数和可训练参数的数量,检查所有参数的shape。 @@ -144,19 +123,19 @@ trainable parameter numbers: 2 -#### 2.模型验证 +### 2.模型验证 由于模型算法的实现是和框架没有关系的,训练好的参数可以先转换成MindSpore的[checkpoint](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/save_load.html)文件加载到网络中进行推理验证。 整个模型验证的流程请参考[resnet网络迁移](https://www.mindspore.cn/docs/zh-CN/master/migration_guide/sample_code.html#%E6%A8%A1%E5%9E%8B%E9%AA%8C%E8%AF%81)。 -#### 3.推理验证 +### 3.推理验证 确认模型结构完全一致后,最好再做一次推理验证。整个推理过程除了模型外还有数据集和metrics,当推理结果不一致时,可以采用控制变量法,逐步排除问题。 整个推理验证的流程请参考[resnet网络迁移](https://www.mindspore.cn/docs/zh-CN/master/migration_guide/sample_code.html#%E6%8E%A8%E7%90%86%E6%B5%81%E7%A8%8B)。 -#### 4.训练精度 +### 4.训练精度 当完成了推理验证后,我们基本可以确定基础模型,数据处理和metrics计算没有问题。此时如果训练的精度还是有问题时怎么进行排查呢? @@ -250,97 +229,3 @@ trainable parameter numbers: 2 - 排查数据处理,通过可视化等方法查看数据处理是否符合预期,重点查看数据shuffle,是否有数据不匹配的情况。 更多精度调试策略请参考[精度调试](https://mindspore.cn/mindinsight/docs/zh-CN/master/accuracy_problem_preliminary_location.html)。 - -### 性能调优 - -首先需要做性能数据获取,具体的获取方式见[性能调试(Ascend)](https://www.mindspore.cn/mindinsight/docs/zh-CN/master/performance_profiling_ascend.html)、[性能调试(GPU)](https://www.mindspore.cn/mindinsight/docs/zh-CN/master/performance_profiling_gpu.html)。 - -性能优化方向主要包含: - -1. 算子性能优化 -2. 框架使能性能优化 -3. 多机同步性能优化 -4. 数据处理性能优化 - -可以参考[resnet网络迁移](https://www.mindspore.cn/docs/zh-CN/master/migration_guide/sample_code.html)串通整个过程。 - -> 有的网络很大,这种情况在图模式下编译会很慢。在性能调优过程请区分图编译和网络执行,本节主要介绍网络执行阶段的性能调优策略。 - -#### 算子性能优化 - -单算子耗时久、对于同一种算子在不同shape或者不同 datatype 下性能差异较大的情况主要是由算子性能问题引起,通常有以下解决思路: - -1. 使用计算量更小的数据类型。例如,同一个算子在 float16 和 float32 下精度无明显差别,可使用计算量更小的 float16 格式。 -2. 使用算法相同的其他算子规避。 -3. Ascend环境上注意16对齐。由于昇腾芯片的设计,在AICore上的计算最好是16对齐的(shape中的每一维都是16的倍数)。 - -如果您发现有性能较差的算子时,建议联系 [MindSpore社区](https://gitee.com/mindspore/mindspore/issues) 反馈,我们确认为性能问题后会及时优化。 - -#### 框架使能性能优化 - -- 使用静态图模式 - - MindSpore一般在静态图模式下比PYNATIVE模式下快很多,最好能在静态图模式下进行训练和推理,具体原理请参考[动静态图结合](https://www.mindspore.cn/docs/zh-CN/master/design/dynamic_graph_and_static_graph.html)。 - -- on-device执行 - - MindSpore提供了一种[on-device执行](https://www.mindspore.cn/docs/zh-CN/master/design/overview.html#面向昇腾硬件的竞争力优化)的方法将数据处理和网络在device上的执行并行起来,只需要在`model.train`中设置`dataset_sink_mode=True`即可,注意这个配置默认是`False`,当打开这个配置时,一个epoch只会返回一个网络的结果,当进行调试时建议先将这个值改成`False`。 - -- 使用自动混合精度 - - 混合精度训练方法是通过混合使用单精度和半精度数据格式来加速深度神经网络训练的过程,同时保持了单精度训练所能达到的网络精度。混合精度训练能够加速计算过程,同时减少内存使用和存取,并使得在特定的硬件上可以训练更大的模型或 batch size。 - - 具体可参考 [混合精度教程](https://www.mindspore.cn/tutorials/zh-CN/master/advanced/mixed_precision.html)。 - -- 使能图算融合 - - 图算融合是 MindSpore 特有的网络性能优化技术。它可以通过自动分析和优化现有网络计算图逻辑,并结合目标硬件能力,对计算图进行计算化简和替代、算子拆分和融合、算子特例化编译等优化,以提升设备计算资源利用率,实现对网络性能的整体优化。相比传统优化技术,图算融合具有多算子跨边界联合优化、与算子编译跨层协同、基于Polyhedral的算子即时编译等独特优势。另外,图算融合只需要用户打开对应配置后,整个优化过程即可自动完成,不需要网络开发人员进行其它额外感知,使得用户可以聚焦网络算法实现。 - - 图算融合的适用场景包括:对网络执行时间具有较高性能要求的场景;通过拼接基本算子实现自定义组合算子,并希望对这些基本算子进行自动融合,以提升自定义组合算子性能的场景。 - - 具体可参考 [图算融合教程](https://www.mindspore.cn/docs/zh-CN/master/design/graph_fusion_engine.html)。 - -- 其他 - - 转换算子过多(TransData、Cast类算子)且耗时明显时,如果是我们手动加入的Cast算子,可分析其必要性,如果对精度没有影响,可去掉冗余的Cast、TransData算子。 - - 如果是MindSpore自动生成的转换算子过多,可能是MindSpore框架针对某些特殊情况没有充分优化,可联系 [MindSpore社区](https://gitee.com/mindspore/mindspore/issues) 反馈。 - - 动态shape场景目前需要不断的编图,可能会造成端到端的训练时间较长,建议优先[规避动态shape](https://www.mindspore.cn/docs/zh-CN/master/migration_guide/dynamic_shape.html)。 - -#### 多机同步性能优化 - -当进行分布式训练时,在一个Step的训练过程中,完成前向传播和梯度计算后,各个机器开始进行AllReduce梯度同步,AllReduce同步时间主要受权重数量、机器数量影响,对于越复杂、机器规模越大的网络,其 AllReduce 梯度更新时间也越久,此时我们可以进行AllReduce 切分来优化这部分耗时。 - -正常情况下,AllReduce 梯度同步会等所有反向算子执行结束,也就是对所有权重都计算出梯度后再一次性同步所有机器的梯度,而使用AllReduce切分后,我们可以在计算出一部分权重的梯度后,就立刻进行这部分权重的梯度同步,这样梯度同步和剩余算子的梯度计算可以并行执行,也就隐藏了这部分 AllReduce 梯度同步时间。切分策略通常是手动尝试,寻找一个最优的方案(支持切分大于两段)。 -以 [ResNet50网络](https://gitee.com/mindspore/models/blob/master/official/cv/ResNet/train.py) 为例,该网络共有 160 个 权重, [85, 160] 表示第 0 至 85个权重计算完梯度后立刻进行梯度同步,第 86 至 160 个 权重计算完后再进行梯度同步,这里共切分两段,因此需要进行两次梯度同步。代码实现如下: - -```python -import os -import mindspore as ms -from mindspore.communication import init - -device_id = int(os.getenv('DEVICE_ID', '0')) -rank_size = int(os.getenv('RANK_SIZE', '1')) -rank_id = int(os.getenv('RANK_ID', '0')) - -# init context -ms.set_context(mode=ms.GRAPH_MODE, device_target='Ascend', device_id=device_id) -if rank_size > 1: - ms.set_auto_parallel_context(device_num=rank_size, parallel_mode=ms.ParallelMode.DATA_PARALLEL, - gradients_mean=True) - ms.set_auto_parallel_context(all_reduce_fusion_config=[85, 160]) - init() -``` - -更多请参考[集群性能调试](https://www.mindspore.cn/mindinsight/docs/zh-CN/master/performance_profiling_of_cluster.html)。 - -#### 数据处理性能优化 - -单Step性能抖动、数据队列一段时间内持续为空的情况都是由于数据预处理部分性能较差,使得数据处理速度跟不上单Step迭代速度导致,这两个现象通常成对出现。 - -当数据处理速度较慢时,队列从最开始的满队列情况逐渐消耗为空队列,训练进程会开始等待空队列填入数据,一旦有新的数据填入,网络才会继续进行单Step训练。由于数据处理没有队列作为缓冲,数据处理的性能抖动直接体现在单Step的性能上,因此还会造成单Step性能抖动。 - -关于数据的性能问题,可以参考 MindSpore Insight 组件的 [数据准备性能分析](https://www.mindspore.cn/mindinsight/docs/zh-CN/master/performance_profiling_ascend.html#数据准备性能分析),其给出了数据性能的常见问题及解决方法。 - -更多性能调试方法请参考[性能优化](https://www.mindspore.cn/tutorials/experts/zh-CN/master/optimize/execution_opt.html)。 diff --git a/docs/mindspore/source_zh_cn/migration_guide/debug.md b/docs/mindspore/source_zh_cn/migration_guide/debug.md new file mode 100644 index 0000000000..0ef55090a1 --- /dev/null +++ b/docs/mindspore/source_zh_cn/migration_guide/debug.md @@ -0,0 +1,16 @@ +# 功能调试 + +[![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_zh_cn/migration_guide/debug.md) + +## 调优常见问题及解决办法 + +- 显存调试阶段,可能遇到以下常见问题: + - Malloc device memory failed: + MindSpore申请device侧内存失败,原始是设备被其他进程占用,可通过ps -ef | grep "python"查看正在跑的进程。 + - Out of Memory: + MindSpore申请动态内存失败,可能的原因有:batch size太大,处理数据太多导致内存占用大;通信算子占用内存太多导致整体内存复用率较低。 + +## MindSpore功能调试介绍 + +在网络的迁移过程,建议优先使用PYNATIVE模式进行调试,在PYNATIVE模式下可以进行debug,日志打印也比较友好。在调试ok后转成图模式运行,图模式在执行性能上会更友好,也可以找到一些在编写网络中的问题,比如使用了三方的算子导致梯度截断。 +详情请参考[错误分析](https://www.mindspore.cn/docs/zh-CN/master/model_train/debug/error_analysis/error_scenario_analysis.html)。 diff --git a/docs/mindspore/source_zh_cn/migration_guide/index.rst b/docs/mindspore/source_zh_cn/migration_guide/index.rst new file mode 100644 index 0000000000..f872b29fd7 --- /dev/null +++ b/docs/mindspore/source_zh_cn/migration_guide/index.rst @@ -0,0 +1,17 @@ +模型迁移 +========================= + +.. toctree:: + :glob: + :maxdepth: 1 + + overview + enveriment_preparation + analysis_and_preparation + model_development/model_development + debug + acc_debug + perf_debug + model_infer + sample_code + reference diff --git a/docs/mindspore/source_zh_cn/migration_guide/migration_tools.md b/docs/mindspore/source_zh_cn/migration_guide/migration_tools.md new file mode 100644 index 0000000000..4e030382cb --- /dev/null +++ b/docs/mindspore/source_zh_cn/migration_guide/migration_tools.md @@ -0,0 +1,3 @@ +# 迁移工具 + +[![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_zh_cn/migration_guide/migration_tools.md) diff --git a/docs/mindspore/source_zh_cn/migration_guide/model_infer.md b/docs/mindspore/source_zh_cn/migration_guide/model_infer.md new file mode 100644 index 0000000000..5353b5642d --- /dev/null +++ b/docs/mindspore/source_zh_cn/migration_guide/model_infer.md @@ -0,0 +1,3 @@ +# 模型推理 + +[![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_zh_cn/migration_guide/model_infer.md) diff --git a/docs/mindspore/source_zh_cn/migration_guide/overview.md b/docs/mindspore/source_zh_cn/migration_guide/overview.md index cac41bc188..bf35b2b123 100644 --- a/docs/mindspore/source_zh_cn/migration_guide/overview.md +++ b/docs/mindspore/source_zh_cn/migration_guide/overview.md @@ -13,24 +13,28 @@ E-.-text2(在线使用ModelArts) B-->|Step 2|F(模型分析与准备) F-.-text3(算法复现/MindSpore Dev Toolkit 工具分析API满足度/分析功能满足度) B-->|Step 3|G(网络搭建对比) -G-->I(数据处理) -I-.-text4(数据集加载/增强/读取对齐) -G-->J(网络搭建) -J-.-text5(网络对齐) -G-->N(损失函数) -N-.-text6(损失函数对齐) -G-->K(学习率与优化器) -K-.-text7(优化器执行和学习率策略对齐) -G-->L(梯度求导) -L-.-text8(反向梯度对齐) -G-->M(训练及推理流程) -M-.-text9(训练与推理对齐) -B-->|Step 4|H(调试调优) -H-.-text10(功能/精度/性能三方面对齐) +G-->K(数据处理) +K-.-text4(数据集加载/增强/读取对齐) +G-->L(网络搭建) +L-.-text5(网络对齐) +G-->P(损失函数) +P-.-text6(损失函数对齐) +G-->M(学习率与优化器) +M-.-text7(优化器执行和学习率策略对齐) +G-->N(梯度求导) +N-.-text8(反向梯度对齐) +G-->O(训练及推理流程) +O-.-text9(训练与推理对齐) +B-->|Step 4|H(功能调试) +H-.-text10(功能方面对齐) +B-->|Step 5|I(精度调优) +I-.-text11(精度方面对齐) +B-->|Step 6|J(性能调优) +J-.-text12(性能方面对齐) A-->C(网络迁移调试实例) -C-.-text11(以ReNet50为例的网络迁移样例) +C-.-text13(以ReNet50为例的网络迁移样例) A-->D(常见问题) -D-.-text12(迁移过程中的常见问题与解决方法) +D-.-text14(迁移过程中的常见问题与解决方法) click C "https://www.mindspore.cn/docs/zh-CN/master/migration_guide/sample_code.html" click D "https://www.mindspore.cn/docs/zh-CN/master/migration_guide/faq.html" @@ -38,12 +42,14 @@ click D "https://www.mindspore.cn/docs/zh-CN/master/migration_guide/faq.html" click E "https://www.mindspore.cn/docs/zh-CN/master/migration_guide/enveriment_preparation.html" click F "https://www.mindspore.cn/docs/zh-CN/master/migration_guide/analysis_and_preparation.html" click G "https://www.mindspore.cn/docs/zh-CN/master/migration_guide/model_development/model_development.html" -click H "https://www.mindspore.cn/docs/zh-CN/master/migration_guide/debug_and_tune.html" +click H "https://www.mindspore.cn/docs/zh-CN/master/migration_guide/debug.html" +click I "https://www.mindspore.cn/docs/zh-CN/master/migration_guide/acc_debug.html" +click J "https://www.mindspore.cn/docs/zh-CN/master/migration_guide/perf_debug.html" -click I "https://www.mindspore.cn/docs/zh-CN/master/migration_guide/model_development/dataset.html" -click J "https://www.mindspore.cn/docs/zh-CN/master/migration_guide/model_development/model_and_cell.html" -click K "https://www.mindspore.cn/docs/zh-CN/master/migration_guide/model_development/learning_rate_and_optimizer.html" -click L "https://www.mindspore.cn/docs/zh-CN/master/migration_guide/model_development/gradient.html" -click M "https://www.mindspore.cn/docs/zh-CN/master/migration_guide/model_development/training_and_evaluation.html" -click N "https://www.mindspore.cn/docs/zh-CN/master/migration_guide/model_development/loss_function.html" +click K "https://www.mindspore.cn/docs/zh-CN/master/migration_guide/model_development/dataset.html" +click L "https://www.mindspore.cn/docs/zh-CN/master/migration_guide/model_development/model_and_cell.html" +click M "https://www.mindspore.cn/docs/zh-CN/master/migration_guide/model_development/learning_rate_and_optimizer.html" +click N "https://www.mindspore.cn/docs/zh-CN/master/migration_guide/model_development/gradient.html" +click O "https://www.mindspore.cn/docs/zh-CN/master/migration_guide/model_development/training_and_evaluation.html" +click P "https://www.mindspore.cn/docs/zh-CN/master/migration_guide/model_development/loss_function.html" ``` diff --git a/docs/mindspore/source_zh_cn/migration_guide/perf_debug.md b/docs/mindspore/source_zh_cn/migration_guide/perf_debug.md new file mode 100644 index 0000000000..850c780423 --- /dev/null +++ b/docs/mindspore/source_zh_cn/migration_guide/perf_debug.md @@ -0,0 +1,109 @@ +# 性能调优 + +[![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_zh_cn/migration_guide/perf_debug.md) + +## 调优常见问题及解决办法 + +- 性能调试阶段,可能会遇到以下常见问题: + - 第一个step耗时长 + 这个阶段主要完成图转换、图融合、图优化等操作,是生成可执行模型的过程,可参考[如何优化编译性能](https://www.mindspore.cn/tutorials/zh-CN/master/advanced/static_graph_expert_programming.html#%E5%A6%82%E4%BD%95%E4%BC%98%E5%8C%96%E7%BC%96%E8%AF%91%E6%80%A7%E8%83%BD)。 + - 迭代间隙耗时长 + 这个阶段的耗时大部分来源于数据获取,可参考[数据处理性能优化](https://www.mindspore.cn/tutorials/experts/zh-CN/master/dataset/optimize.html)。 + - 前反向计算耗时长 + 这个阶段主要执行网络中的前向及反向算子,承载了一个迭代的主要计算工作。可通过[Profiler](https://www.mindspore.cn/mindinsight/docs/zh-CN/master/performance_profiling.html)将训练过程中的算子耗时等信息记录到文件中。该性能数据提供框架的host执行、以及算子执行的性能数据,也可通过[MindInsight](https://www.mindspore.cn/mindinsight/docs/zh-CN/master/index.html)可视化界面供用户查看分析,帮助用户更高效地调试神经网络性能。 + - 迭代拖尾耗时长 + 这个阶段耗时长可能是集合通信耗时长,可设置融合策略进行优化,可参考[all_reduce_fusion_config设置allreduce融合策略](https://www.mindspore.cn/docs/zh-CN/master/api_python/mindspore/mindspore.set_auto_parallel_context.html)。 + +## 性能调优过程 + +首先需要做性能数据获取,具体的获取方式见[性能调试(Ascend)](https://www.mindspore.cn/mindinsight/docs/zh-CN/master/performance_profiling_ascend.html)、[性能调试(GPU)](https://www.mindspore.cn/mindinsight/docs/zh-CN/master/performance_profiling_gpu.html)。 + +性能优化方向主要包含: + +1. 算子性能优化 +2. 框架使能性能优化 +3. 多机同步性能优化 +4. 数据处理性能优化 + +可以参考[resnet网络迁移](https://www.mindspore.cn/docs/zh-CN/master/migration_guide/sample_code.html)串通整个过程。 + +> 有的网络很大,这种情况在图模式下编译会很慢。在性能调优过程请区分图编译和网络执行,本节主要介绍网络执行阶段的性能调优策略。 + +### 算子性能优化 + +单算子耗时久、对于同一种算子在不同shape或者不同 datatype 下性能差异较大的情况主要是由算子性能问题引起,通常有以下解决思路: + +1. 使用计算量更小的数据类型。例如,同一个算子在 float16 和 float32 下精度无明显差别,可使用计算量更小的 float16 格式。 +2. 使用算法相同的其他算子规避。 +3. Ascend环境上注意16对齐。由于昇腾芯片的设计,在AICore上的计算最好是16对齐的(shape中的每一维都是16的倍数)。 + +如果您发现有性能较差的算子时,建议联系 [MindSpore社区](https://gitee.com/mindspore/mindspore/issues) 反馈,我们确认为性能问题后会及时优化。 + +### 框架使能性能优化 + +- 使用静态图模式 + + MindSpore一般在静态图模式下比PYNATIVE模式下快很多,最好能在静态图模式下进行训练和推理,具体原理请参考[动静态图结合](https://www.mindspore.cn/docs/zh-CN/master/design/dynamic_graph_and_static_graph.html)。 + +- on-device执行 + + MindSpore提供了一种[on-device执行](https://www.mindspore.cn/docs/zh-CN/master/design/overview.html#面向昇腾硬件的竞争力优化)的方法将数据处理和网络在device上的执行并行起来,只需要在`model.train`中设置`dataset_sink_mode=True`即可,注意这个配置默认是`False`,当打开这个配置时,一个epoch只会返回一个网络的结果,当进行调试时建议先将这个值改成`False`。 + +- 使用自动混合精度 + + 混合精度训练方法是通过混合使用单精度和半精度数据格式来加速深度神经网络训练的过程,同时保持了单精度训练所能达到的网络精度。混合精度训练能够加速计算过程,同时减少内存使用和存取,并使得在特定的硬件上可以训练更大的模型或 batch size。 + + 具体可参考 [混合精度教程](https://www.mindspore.cn/tutorials/zh-CN/master/advanced/mixed_precision.html)。 + +- 使能图算融合 + + 图算融合是 MindSpore 特有的网络性能优化技术。它可以通过自动分析和优化现有网络计算图逻辑,并结合目标硬件能力,对计算图进行计算化简和替代、算子拆分和融合、算子特例化编译等优化,以提升设备计算资源利用率,实现对网络性能的整体优化。相比传统优化技术,图算融合具有多算子跨边界联合优化、与算子编译跨层协同、基于Polyhedral的算子即时编译等独特优势。另外,图算融合只需要用户打开对应配置后,整个优化过程即可自动完成,不需要网络开发人员进行其它额外感知,使得用户可以聚焦网络算法实现。 + + 图算融合的适用场景包括:对网络执行时间具有较高性能要求的场景;通过拼接基本算子实现自定义组合算子,并希望对这些基本算子进行自动融合,以提升自定义组合算子性能的场景。 + + 具体可参考 [图算融合教程](https://www.mindspore.cn/docs/zh-CN/master/design/graph_fusion_engine.html)。 + +- 其他 + + 转换算子过多(TransData、Cast类算子)且耗时明显时,如果是我们手动加入的Cast算子,可分析其必要性,如果对精度没有影响,可去掉冗余的Cast、TransData算子。 + + 如果是MindSpore自动生成的转换算子过多,可能是MindSpore框架针对某些特殊情况没有充分优化,可联系 [MindSpore社区](https://gitee.com/mindspore/mindspore/issues) 反馈。 + + 动态shape场景目前需要不断的编图,可能会造成端到端的训练时间较长,建议优先[规避动态shape](https://www.mindspore.cn/docs/zh-CN/master/migration_guide/dynamic_shape.html)。 + +### 多机同步性能优化 + +当进行分布式训练时,在一个Step的训练过程中,完成前向传播和梯度计算后,各个机器开始进行AllReduce梯度同步,AllReduce同步时间主要受权重数量、机器数量影响,对于越复杂、机器规模越大的网络,其 AllReduce 梯度更新时间也越久,此时我们可以进行AllReduce 切分来优化这部分耗时。 + +正常情况下,AllReduce 梯度同步会等所有反向算子执行结束,也就是对所有权重都计算出梯度后再一次性同步所有机器的梯度,而使用AllReduce切分后,我们可以在计算出一部分权重的梯度后,就立刻进行这部分权重的梯度同步,这样梯度同步和剩余算子的梯度计算可以并行执行,也就隐藏了这部分 AllReduce 梯度同步时间。切分策略通常是手动尝试,寻找一个最优的方案(支持切分大于两段)。 +以 [ResNet50网络](https://gitee.com/mindspore/models/blob/master/official/cv/ResNet/train.py) 为例,该网络共有 160 个 权重, [85, 160] 表示第 0 至 85个权重计算完梯度后立刻进行梯度同步,第 86 至 160 个 权重计算完后再进行梯度同步,这里共切分两段,因此需要进行两次梯度同步。代码实现如下: + +```python +import os +import mindspore as ms +from mindspore.communication import init + +device_id = int(os.getenv('DEVICE_ID', '0')) +rank_size = int(os.getenv('RANK_SIZE', '1')) +rank_id = int(os.getenv('RANK_ID', '0')) + +# init context +ms.set_context(mode=ms.GRAPH_MODE, device_target='Ascend', device_id=device_id) +if rank_size > 1: + ms.set_auto_parallel_context(device_num=rank_size, parallel_mode=ms.ParallelMode.DATA_PARALLEL, + gradients_mean=True) + ms.set_auto_parallel_context(all_reduce_fusion_config=[85, 160]) + init() +``` + +更多请参考[集群性能调试](https://www.mindspore.cn/mindinsight/docs/zh-CN/master/performance_profiling_of_cluster.html)。 + +### 数据处理性能优化 + +单Step性能抖动、数据队列一段时间内持续为空的情况都是由于数据预处理部分性能较差,使得数据处理速度跟不上单Step迭代速度导致,这两个现象通常成对出现。 + +当数据处理速度较慢时,队列从最开始的满队列情况逐渐消耗为空队列,训练进程会开始等待空队列填入数据,一旦有新的数据填入,网络才会继续进行单Step训练。由于数据处理没有队列作为缓冲,数据处理的性能抖动直接体现在单Step的性能上,因此还会造成单Step性能抖动。 + +关于数据的性能问题,可以参考 MindSpore Insight 组件的 [数据准备性能分析](https://www.mindspore.cn/mindinsight/docs/zh-CN/master/performance_profiling_ascend.html#数据准备性能分析),其给出了数据性能的常见问题及解决方法。 + +更多性能调试方法请参考[性能优化](https://www.mindspore.cn/tutorials/experts/zh-CN/master/optimize/execution_opt.html)。 diff --git a/docs/mindspore/source_zh_cn/migration_guide/reference.rst b/docs/mindspore/source_zh_cn/migration_guide/reference.rst new file mode 100644 index 0000000000..a49e188428 --- /dev/null +++ b/docs/mindspore/source_zh_cn/migration_guide/reference.rst @@ -0,0 +1,9 @@ +参考 +======== + +.. toctree:: + :maxdepth: 1 + + ../note/api_mapping/pytorch_api_mapping + migration_tools + faq diff --git a/docs/mindspore/source_zh_cn/model_infer/index.rst b/docs/mindspore/source_zh_cn/model_infer/index.rst new file mode 100644 index 0000000000..c2233e8af1 --- /dev/null +++ b/docs/mindspore/source_zh_cn/model_infer/index.rst @@ -0,0 +1,10 @@ +模型推理 +========================= + +.. toctree:: + :glob: + :maxdepth: 1 + + overview + llm_infer + llm_lite diff --git a/docs/mindspore/source_zh_cn/model_infer/llm_infer.rst b/docs/mindspore/source_zh_cn/model_infer/llm_infer.rst new file mode 100644 index 0000000000..546a479445 --- /dev/null +++ b/docs/mindspore/source_zh_cn/model_infer/llm_infer.rst @@ -0,0 +1,8 @@ +LLM 推理 +============== + +.. toctree:: + :glob: + :maxdepth: 1 + + model_compression diff --git a/docs/mindspore/source_zh_cn/model_infer/llm_lite.md b/docs/mindspore/source_zh_cn/model_infer/llm_lite.md new file mode 100644 index 0000000000..06898fcc75 --- /dev/null +++ b/docs/mindspore/source_zh_cn/model_infer/llm_lite.md @@ -0,0 +1,3 @@ +# 端侧推理 + +[![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_zh_cn/model_infer/llm_lite.md) diff --git a/tutorials/experts/source_zh_cn/infer/model_compression.md b/docs/mindspore/source_zh_cn/model_infer/model_compression.md similarity index 100% rename from tutorials/experts/source_zh_cn/infer/model_compression.md rename to docs/mindspore/source_zh_cn/model_infer/model_compression.md diff --git a/tutorials/experts/source_zh_cn/infer/inference.md b/docs/mindspore/source_zh_cn/model_infer/overview.md similarity index 99% rename from tutorials/experts/source_zh_cn/infer/inference.md rename to docs/mindspore/source_zh_cn/model_infer/overview.md index 5538f87af4..4c82b261a5 100644 --- a/tutorials/experts/source_zh_cn/infer/inference.md +++ b/docs/mindspore/source_zh_cn/model_infer/overview.md @@ -1,6 +1,6 @@ # 模型推理总览 -[![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/master/tutorials/experts/source_zh_cn/infer/inference.md) +[![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/master/tutorials/experts/source_zh_cn/infer/overview.md) MindSpore可以基于训练好的模型,在不同的硬件平台上执行推理任务。 diff --git a/docs/mindspore/source_zh_cn/model_train/custom_program/fusion_pass.md b/docs/mindspore/source_zh_cn/model_train/custom_program/fusion_pass.md new file mode 100644 index 0000000000..f99786b90d --- /dev/null +++ b/docs/mindspore/source_zh_cn/model_train/custom_program/fusion_pass.md @@ -0,0 +1,3 @@ +# 自定义融合pass + +[![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_zh_cn/model_train/custom_program/fusion_pass.md) diff --git a/docs/mindspore/source_zh_cn/model_train/custom_program/hook_program.ipynb b/docs/mindspore/source_zh_cn/model_train/custom_program/hook_program.ipynb new file mode 100644 index 0000000000..5dafa173d6 --- /dev/null +++ b/docs/mindspore/source_zh_cn/model_train/custom_program/hook_program.ipynb @@ -0,0 +1,510 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Hook编程\n", + "\n", + "[![下载Notebook](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_notebook.svg)](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/master/zh_cn/model_train/custom_program/mindspore_hook_program.ipynb) [![下载样例代码](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_download_code.svg)](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/master/zh_cn/model_train/custom_program/mindspore_hook_program.py) [![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_zh_cn/model_train/custom_program/hook_program.ipynb)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "调试深度学习网络是每一个深度学习领域的从业者需要面对且投入精力较大的工作。由于深度学习网络隐藏了中间层算子的输入、输出数据以及反向梯度,只提供网络输入数据(特征量、权重)的梯度,导致无法准确地感知中间层算子的数据变化,从而降低了调试效率。为了方便用户准确、快速地对深度学习网络进行调试,MindSpore在动态图模式下设计了Hook功能,**使用Hook功能可以捕获中间层算子的输入、输出数据以及反向梯度**。\n", + "\n", + "目前,动态图模式下提供了四种形式的Hook功能,分别是:HookBackward算子和在Cell对象上进行注册的register_forward_pre_hook、register_forward_hook、register_backward_hook功能。\n", + "\n", + "## HookBackward算子\n", + "\n", + "HookBackward将Hook功能以算子的形式实现。用户初始化一个HookBackward算子,将其安插到深度学习网络中需要捕获梯度的位置。在网络正向执行时,HookBackward算子将输入数据不做任何修改后原样输出;在网络反向传播梯度时,在HookBackward上注册的Hook函数将会捕获反向传播至此的梯度。用户可以在Hook函数中自定义对梯度的操作,比如打印梯度,或者返回新的梯度。\n", + "\n", + "示例代码:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "ExecuteTime": { + "end_time": "2022-03-02T09:13:38.660885Z", + "start_time": "2022-03-02T09:13:38.645597Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "hook_fn print grad_out: (Tensor(shape=[], dtype=Float32, value= 2),)\n", + "output: (Tensor(shape=[], dtype=Float32, value= 4), Tensor(shape=[], dtype=Float32, value= 4))\n" + ] + } + ], + "source": [ + "import mindspore as ms\n", + "from mindspore import ops\n", + "\n", + "ms.set_context(mode=ms.PYNATIVE_MODE)\n", + "\n", + "def hook_fn(grad_out):\n", + " \"\"\"打印梯度\"\"\"\n", + " print(\"hook_fn print grad_out:\", grad_out)\n", + "\n", + "hook = ops.HookBackward(hook_fn)\n", + "def hook_test(x, y):\n", + " z = x * y\n", + " z = hook(z)\n", + " z = z * y\n", + " return z\n", + "\n", + "def net(x, y):\n", + " return ms.grad(hook_test, grad_position=(0, 1))(x, y)\n", + "\n", + "output = net(ms.Tensor(1, ms.float32), ms.Tensor(2, ms.float32))\n", + "print(\"output:\", output)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "更多HookBackward算子的说明可以参考[API文档](https://mindspore.cn/docs/zh-CN/master/api_python/ops/mindspore.ops.HookBackward.html)。\n", + "\n", + "## Cell对象的register_forward_pre_hook功能\n", + "\n", + "用户可以在Cell对象上使用`register_forward_pre_hook`函数来注册一个自定义的Hook函数,用来捕获正向传入该Cell对象的数据。该功能在静态图模式下和在使用`@jit`修饰的函数内不起作用。`register_forward_pre_hook`函数接收Hook函数作为入参,并返回一个与Hook函数一一对应的`handle`对象。用户可以通过调用`handle`对象的`remove()`函数来删除与之对应的Hook函数。每一次调用`register_forward_pre_hook`函数,都会返回一个不同的`handle`对象。Hook函数应该按照以下的方式进行定义。" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "def forward_pre_hook_fn(cell, inputs):\n", + " print(\"forward inputs: \", inputs)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "这里的cell是Cell对象,inputs是正向传入到Cell对象的数据。因此,用户可以使用register_forward_pre_hook函数来捕获网络中某一个Cell对象的正向输入数据。用户可以在Hook函数中自定义对输入数据的操作,比如查看、打印数据,或者返回新的输入数据给当前的Cell对象。如果在Hook函数中对Cell对象的原始输入数据进行计算操作后,再作为新的输入数据返回,这些新增的计算操作将会同时作用于梯度的反向传播。\n", + "\n", + "示例代码:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "forward inputs: (Tensor(shape=[1], dtype=Float32, value= [ 2.00000000e+00]),)\n", + "[2.]\n", + "forward inputs: (Tensor(shape=[1], dtype=Float32, value= [ 2.00000000e+00]),)\n", + "(Tensor(shape=[1], dtype=Float32, value= [ 1.00000000e+00]), Tensor(shape=[1], dtype=Float32, value= [ 1.00000000e+00]))\n", + "(Tensor(shape=[1], dtype=Float32, value= [ 1.00000000e+00]), Tensor(shape=[1], dtype=Float32, value= [ 1.00000000e+00]))\n" + ] + } + ], + "source": [ + "import numpy as np\n", + "import mindspore as ms\n", + "import mindspore.nn as nn\n", + "\n", + "ms.set_context(mode=ms.PYNATIVE_MODE)\n", + "\n", + "def forward_pre_hook_fn(cell, inputs):\n", + " print(\"forward inputs: \", inputs)\n", + " input_x = inputs[0]\n", + " return input_x\n", + "\n", + "class Net(nn.Cell):\n", + " def __init__(self):\n", + " super(Net, self).__init__()\n", + " self.relu = nn.ReLU()\n", + " self.handle = self.relu.register_forward_pre_hook(forward_pre_hook_fn)\n", + "\n", + " def construct(self, x, y):\n", + " x = x + y\n", + " x = self.relu(x)\n", + " return x\n", + "\n", + "net = Net()\n", + "grad_net = ms.grad(net, grad_position=(0, 1))\n", + "\n", + "x = ms.Tensor(np.ones([1]).astype(np.float32))\n", + "y = ms.Tensor(np.ones([1]).astype(np.float32))\n", + "\n", + "output = net(x, y)\n", + "print(output)\n", + "gradient = grad_net(x, y)\n", + "print(gradient)\n", + "net.handle.remove()\n", + "gradient = grad_net(x, y)\n", + "print(gradient)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "用户如果在Hook函数中直接返回新创建的数据,而不是返回由原始输入数据经过计算后得到的数据,那么梯度的反向传播将会在该Cell对象上截止。\n", + "\n", + "示例代码:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "forward inputs: (Tensor(shape=[1], dtype=Float32, value= [ 2.00000000e+00]),)\n", + "(Tensor(shape=[1], dtype=Float32, value= [ 0.00000000e+00]), Tensor(shape=[1], dtype=Float32, value= [ 0.00000000e+00]))\n" + ] + } + ], + "source": [ + "import numpy as np\n", + "import mindspore as ms\n", + "import mindspore.nn as nn\n", + "\n", + "ms.set_context(mode=ms.PYNATIVE_MODE)\n", + "\n", + "def forward_pre_hook_fn(cell, inputs):\n", + " print(\"forward inputs: \", inputs)\n", + " return ms.Tensor(np.ones([1]).astype(np.float32))\n", + "\n", + "class Net(nn.Cell):\n", + " def __init__(self):\n", + " super(Net, self).__init__()\n", + " self.relu = nn.ReLU()\n", + " self.handle = self.relu.register_forward_pre_hook(forward_pre_hook_fn)\n", + "\n", + " def construct(self, x, y):\n", + " x = x + y\n", + " x = self.relu(x)\n", + " return x\n", + "\n", + "net = Net()\n", + "grad_net = ms.grad(net, grad_position=(0, 1))\n", + "\n", + "x = ms.Tensor(np.ones([1]).astype(np.float32))\n", + "y = ms.Tensor(np.ones([1]).astype(np.float32))\n", + "\n", + "gradient = grad_net(x, y)\n", + "print(gradient)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "为了避免脚本在切换到图模式时运行失败,不建议在Cell对象的 `construct` 函数中调用 `register_forward_pre_hook` 函数和 `handle` 对象的 `remove()` 函数。在动态图模式下,如果在Cell对象的 `construct` 函数中调用 `register_forward_pre_hook` 函数,那么Cell对象每次运行都将新注册一个Hook函数。\n", + "\n", + "更多关于Cell对象的 `register_forward_pre_hook` 功能的说明可以参考[API文档](https://mindspore.cn/docs/zh-CN/master/api_python/nn/mindspore.nn.Cell.html#mindspore.nn.Cell.register_forward_pre_hook)。\n", + "\n", + "## Cell对象的register_forward_hook功能\n", + "\n", + "用户可以在Cell对象上使用`register_forward_hook`函数来注册一个自定义的Hook函数,用来捕获正向传入Cell对象的数据和Cell对象的输出数据。该功能在静态图模式下和在使用`@jit`修饰的函数内不起作用。`register_forward_hook`函数接收Hook函数作为入参,并返回一个与Hook函数一一对应的`handle`对象。用户可以通过调用`handle`对象的`remove()`函数来删除与之对应的Hook函数。每一次调用`register_forward_hook`函数,都会返回一个不同的`handle`对象。Hook函数应该按照以下的方式进行定义。\n", + "\n", + "示例代码:" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "def forward_hook_fn(cell, inputs, outputs):\n", + " print(\"forward inputs: \", inputs)\n", + " print(\"forward outputs: \", outputs)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "这里的`cell`是Cell对象,`inputs`是正向传入到Cell对象的数据,`outputs`是Cell对象的正向输出数据。因此,用户可以使用`register_forward_hook`函数来捕获网络中某一个Cell对象的正向输入数据和输出数据。用户可以在Hook函数中自定义对输入、输出数据的操作,比如查看、打印数据,或者返回新的输出数据。如果在Hook函数中对Cell对象的原始输出数据进行计算操作后,再作为新的输出数据返回,这些新增的计算操作将会同时作用于梯度的反向传播。\n", + "\n", + "示例代码:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "forward inputs: (Tensor(shape=[1], dtype=Float32, value= [ 2.00000000e+00]),)\n", + "forward outputs: [2.]\n", + "(Tensor(shape=[1], dtype=Float32, value= [ 2.00000000e+00]), Tensor(shape=[1], dtype=Float32, value= [ 2.00000000e+00]))\n", + "(Tensor(shape=[1], dtype=Float32, value= [ 1.00000000e+00]), Tensor(shape=[1], dtype=Float32, value= [ 1.00000000e+00]))\n" + ] + } + ], + "source": [ + "import numpy as np\n", + "import mindspore as ms\n", + "import mindspore.nn as nn\n", + "\n", + "ms.set_context(mode=ms.PYNATIVE_MODE)\n", + "\n", + "def forward_hook_fn(cell, inputs, outputs):\n", + " print(\"forward inputs: \", inputs)\n", + " print(\"forward outputs: \", outputs)\n", + " outputs = outputs + outputs\n", + " return outputs\n", + "\n", + "class Net(nn.Cell):\n", + " def __init__(self):\n", + " super(Net, self).__init__()\n", + " self.relu = nn.ReLU()\n", + " self.handle = self.relu.register_forward_hook(forward_hook_fn)\n", + "\n", + " def construct(self, x, y):\n", + " x = x + y\n", + " x = self.relu(x)\n", + " return x\n", + "\n", + "net = Net()\n", + "grad_net = ms.grad(net, grad_position=(0, 1))\n", + "\n", + "x = ms.Tensor(np.ones([1]).astype(np.float32))\n", + "y = ms.Tensor(np.ones([1]).astype(np.float32))\n", + "\n", + "gradient = grad_net(x, y)\n", + "print(gradient)\n", + "net.handle.remove()\n", + "gradient = grad_net(x, y)\n", + "print(gradient)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "用户如果在Hook函数中直接返回新创建的数据,而不是将原始的输出数据经过计算后,将得到的新输出数据返回,那么梯度的反向传播将会在该Cell对象上截止。该现象可以参考`register_forward_pre_hook`函数的用例说明。\n", + "为了避免脚本在切换到图模式时运行失败,不建议在Cell对象的`construct`函数中调用`register_forward_hook`函数和`handle`对象的`remove()`函数。在动态图模式下,如果在Cell对象的`construct`函数中调用`register_forward_hook`函数,那么Cell对象每次运行都将新注册一个Hook函数。\n", + "\n", + "更多关于Cell对象的`register_forward_hook`功能的说明可以参考[API文档](https://mindspore.cn/docs/zh-CN/master/api_python/nn/mindspore.nn.Cell.html#mindspore.nn.Cell.register_forward_hook)。\n", + "\n", + "## Cell对象的register_backward_hook功能\n", + "\n", + "用户可以在Cell对象上使用`register_backward_hook`函数来注册一个自定义的Hook函数,用来捕获网络反向传播时与Cell对象相关联的梯度。该功能在图模式下或者在使用`@jit`修饰的函数内不起作用。`register_backward_hook`函数接收Hook函数作为入参,并返回一个与Hook函数一一对应的`handle`对象。用户可以通过调用`handle`对象的`remove()`函数来删除与之对应的Hook函数。每一次调用`register_backward_hook`函数,都会返回一个不同的`handle`对象。\n", + "\n", + "与HookBackward算子所使用的自定义Hook函数有所不同,`register_backward_hook`使用的Hook函数的入参中,包含了表示Cell对象名称与id信息的`cell_id`、反向传入到Cell对象的梯度、以及Cell对象的反向输出的梯度。\n", + "\n", + "示例代码:" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "def backward_hook_function(cell_id, grad_input, grad_output):\n", + " print(grad_input)\n", + " print(grad_output)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "这里的`cell_id`是Cell对象的名称以及ID信息,`grad_input`是网络反向传播时,传入到Cell对象的梯度,它对应于正向过程中下一个算子的反向输出梯度;`grad_output`是Cell对象反向输出的梯度。因此,用户可以使用`register_backward_hook`函数来捕获网络中某一个Cell对象的反向传入和反向输出梯度。用户可以在Hook函数中自定义对梯度的操作,比如查看、打印梯度,或者返回新的输出梯度。如果需要在Hook函数中返回新的输出梯度时,返回值必须是`tuple`的形式。\n", + "\n", + "示例代码:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "ExecuteTime": { + "end_time": "2022-03-02T09:14:26.523389Z", + "start_time": "2022-03-02T09:14:26.506784Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(Tensor(shape=[1, 2, 1, 1], dtype=Float32, value=\n", + "[[[[ 1.00000000e+00]],\n", + " [[ 1.00000000e+00]]]]),)\n", + "(Tensor(shape=[1, 2, 1, 1], dtype=Float32, value=\n", + "[[[[ 9.99994993e-01]],\n", + " [[ 9.99994993e-01]]]]),)\n", + "[[[[1.99999 1.99999]\n", + " [1.99999 1.99999]]]]\n", + "-------------\n", + " [[[[1.99999 1.99999]\n", + " [1.99999 1.99999]]]]\n" + ] + } + ], + "source": [ + "import numpy as np\n", + "import mindspore as ms\n", + "import mindspore.nn as nn\n", + "\n", + "ms.set_context(mode=ms.PYNATIVE_MODE)\n", + "\n", + "def backward_hook_function(cell_id, grad_input, grad_output):\n", + " print(grad_input)\n", + " print(grad_output)\n", + "\n", + "class Net(nn.Cell):\n", + " def __init__(self):\n", + " super(Net, self).__init__()\n", + " self.conv = nn.Conv2d(1, 2, kernel_size=2, stride=1, padding=0, weight_init=\"ones\", pad_mode=\"valid\")\n", + " self.bn = nn.BatchNorm2d(2, momentum=0.99, eps=0.00001, gamma_init=\"ones\")\n", + " self.handle = self.bn.register_backward_hook(backward_hook_function)\n", + " self.relu = nn.ReLU()\n", + "\n", + " def construct(self, x):\n", + " x = self.conv(x)\n", + " x = self.bn(x)\n", + " x = self.relu(x)\n", + " return x\n", + "\n", + "net = Net()\n", + "grad_net = ms.grad(net)\n", + "output = grad_net(ms.Tensor(np.ones([1, 1, 2, 2]).astype(np.float32)))\n", + "print(output)\n", + "net.handle.remove()\n", + "output = grad_net(ms.Tensor(np.ones([1, 1, 2, 2]).astype(np.float32)))\n", + "print(\"-------------\\n\", output)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "当 `register_backward_hook` 函数和 `register_forward_pre_hook` 函数、 `register_forward_hook` 函数同时作用于同一Cell对象时,如果 `register_forward_pre_hook` 和 `register_forward_hook` 函数中有添加其他算子进行数据处理,这些新增算子会在Cell对象执行前或者执行后参与数据的正向计算,但是这些新增算子的反向梯度不在 `register_backward_hook` 函数的捕获范围内。 `register_backward_hook` 中注册的Hook函数仅捕获原始Cell对象的输入、输出梯度。\n", + "\n", + "示例代码:" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "forward inputs: (Tensor(shape=[1], dtype=Float32, value= [ 2.00000000e+00]),)\n", + "forward inputs: (Tensor(shape=[1], dtype=Float32, value= [ 2.00000000e+00]),)\n", + "forward outputs: [2.]\n", + "grad input: (Tensor(shape=[1], dtype=Float32, value= [ 2.00000000e+00]),)\n", + "grad output: (Tensor(shape=[1], dtype=Float32, value= [ 2.00000000e+00]),)\n", + "(Tensor(shape=[1], dtype=Float32, value= [ 2.00000000e+00]), Tensor(shape=[1], dtype=Float32, value= [ 2.00000000e+00]))\n" + ] + } + ], + "source": [ + "import numpy as np\n", + "import mindspore as ms\n", + "import mindspore.nn as nn\n", + "\n", + "ms.set_context(mode=ms.PYNATIVE_MODE)\n", + "\n", + "def forward_pre_hook_fn(cell, inputs):\n", + " print(\"forward inputs: \", inputs)\n", + " input_x = inputs[0]\n", + " return input_x\n", + "\n", + "def forward_hook_fn(cell, inputs, outputs):\n", + " print(\"forward inputs: \", inputs)\n", + " print(\"forward outputs: \", outputs)\n", + " outputs = outputs + outputs\n", + " return outputs\n", + "\n", + "def backward_hook_fn(cell_id, grad_input, grad_output):\n", + " print(\"grad input: \", grad_input)\n", + " print(\"grad output: \", grad_output)\n", + "\n", + "class Net(nn.Cell):\n", + " def __init__(self):\n", + " super(Net, self).__init__()\n", + " self.relu = nn.ReLU()\n", + " self.handle = self.relu.register_forward_pre_hook(forward_pre_hook_fn)\n", + " self.handle2 = self.relu.register_forward_hook(forward_hook_fn)\n", + " self.handle3 = self.relu.register_backward_hook(backward_hook_fn)\n", + "\n", + " def construct(self, x, y):\n", + " x = x + y\n", + " x = self.relu(x)\n", + " return x\n", + "\n", + "net = Net()\n", + "grad_net = ms.grad(net, grad_position=(0, 1))\n", + "gradient = grad_net(ms.Tensor(np.ones([1]).astype(np.float32)), ms.Tensor(np.ones([1]).astype(np.float32)))\n", + "print(gradient)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "这里的 `grad_input` 是梯度反向传播时传入`self.relu`的梯度,而不是传入 `forward_hook_fn` 函数中,新增的 `Add` 算子的梯度。这里的 `grad_output` 是梯度反向传播时 `self.relu` 反向输出的梯度,而不是 `forward_pre_hook_fn` 函数中新增 `Add` 算子的反向输出梯度。 `register_forward_pre_hook` 函数和 `register_forward_hook` 函数是在Cell对象执行前后起作用,不会影响Cell对象上反向Hook函数的梯度捕获范围。\n", + "\n", + "为了避免脚本在切换到图模式时运行失败,不建议在Cell对象的 `construct` 函数中调用 `register_backward_hook` 函数和 `handle` 对象的 `remove()` 函数。在PyNative模式下,如果在Cell对象的 `construct` 函数中调用 `register_backward_hook` 函数,那么Cell对象每次运行都将新注册一个Hook函数。\n", + "\n", + "更多关于Cell对象的 `register_backward_hook` 功能的说明可以参考[API文档](https://mindspore.cn/docs/zh-CN/master/api_python/nn/mindspore.nn.Cell.html#mindspore.nn.Cell.register_backward_hook)。\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "MindSpore", + "language": "python", + "name": "mindspore" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 + } + \ No newline at end of file diff --git a/tutorials/source_zh_cn/advanced/modules/images/AlexNet.ppm b/docs/mindspore/source_zh_cn/model_train/custom_program/images/AlexNet.ppm similarity index 100% rename from tutorials/source_zh_cn/advanced/modules/images/AlexNet.ppm rename to docs/mindspore/source_zh_cn/model_train/custom_program/images/AlexNet.ppm diff --git a/tutorials/source_zh_cn/advanced/modules/images/learning_rate.png b/docs/mindspore/source_zh_cn/model_train/custom_program/images/learning_rate.png similarity index 100% rename from tutorials/source_zh_cn/advanced/modules/images/learning_rate.png rename to docs/mindspore/source_zh_cn/model_train/custom_program/images/learning_rate.png diff --git a/tutorials/source_zh_cn/advanced/modules/images/loss_function.png b/docs/mindspore/source_zh_cn/model_train/custom_program/images/loss_function.png similarity index 100% rename from tutorials/source_zh_cn/advanced/modules/images/loss_function.png rename to docs/mindspore/source_zh_cn/model_train/custom_program/images/loss_function.png diff --git a/tutorials/source_zh_cn/advanced/modules/initializer.ipynb b/docs/mindspore/source_zh_cn/model_train/custom_program/initializer.ipynb similarity index 99% rename from tutorials/source_zh_cn/advanced/modules/initializer.ipynb rename to docs/mindspore/source_zh_cn/model_train/custom_program/initializer.ipynb index 6d5570cef7..26513e25e5 100644 --- a/tutorials/source_zh_cn/advanced/modules/initializer.ipynb +++ b/docs/mindspore/source_zh_cn/model_train/custom_program/initializer.ipynb @@ -4,6 +4,8 @@ "cell_type": "markdown", "metadata": {}, "source": [ + "# 自定义参数初始化\n", + "\n", "[![下载Notebook](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_notebook.svg)](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/master/tutorials/zh_cn/advanced/modules/mindspore_initializer.ipynb) [![下载样例代码](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_download_code.svg)](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/master/tutorials/zh_cn/advanced/modules/mindspore_initializer.py) [![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/master/tutorials/source_zh_cn/advanced/modules/initializer.ipynb)" ] }, @@ -11,8 +13,6 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# 参数初始化\n", - "\n", "## 使用内置参数初始化\n", "\n", "MindSpore提供了多种网络参数初始化的方式,并在部分算子中封装了参数初始化的功能。本节以Conv2d为例,分别介绍如何使用Initializer子类,字符串进行参数初始化。" diff --git a/tutorials/source_zh_cn/advanced/modules/layer.ipynb b/docs/mindspore/source_zh_cn/model_train/custom_program/layer.ipynb similarity index 30% rename from tutorials/source_zh_cn/advanced/modules/layer.ipynb rename to docs/mindspore/source_zh_cn/model_train/custom_program/layer.ipynb index 0427728382..0fca513ae5 100644 --- a/tutorials/source_zh_cn/advanced/modules/layer.ipynb +++ b/docs/mindspore/source_zh_cn/model_train/custom_program/layer.ipynb @@ -4,6 +4,8 @@ "cell_type": "markdown", "metadata": {}, "source": [ + "# Cell与参数\n", + "\n", "[![下载Notebook](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_notebook.svg)](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/master/tutorials/zh_cn/advanced/modules/mindspore_layer.ipynb) [![下载样例代码](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_download_code.svg)](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/master/tutorials/zh_cn/advanced/modules/mindspore_layer.py) [![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/master/tutorials/source_zh_cn/advanced/modules/layer.ipynb)" ] }, @@ -13,8 +15,6 @@ "tags": [] }, "source": [ - "# Cell与参数\n", - "\n", "Cell作为神经网络构造的基础单元,与神经网络层(Layer)的概念相对应,对Tensor计算操作的抽象封装,能够更准确清晰地对神经网络结构进行表示。除了基础的Tensor计算流程定义外,神经网络层还包含了参数管理、状态管理等功能。而参数(Parameter)是神经网络训练的核心,通常作为神经网络层的内部成员变量。本节我们将系统介绍参数、神经网络层以及其相关使用方法。" ] }, @@ -227,7 +227,7 @@ "source": [ "#### 覆盖修改参数值\n", "\n", - "可调用`Parameter.set_data`方法,使用相同Shape的Tensor对Parameter进行覆盖。该方法常用于使用Initializer进行[Cell遍历初始化](https://www.mindspore.cn/tutorials/zh-CN/master/advanced/modules/initializer.html#cell%E9%81%8D%E5%8E%86%E5%88%9D%E5%A7%8B%E5%8C%96)。" + "可调用`Parameter.set_data`方法,使用相同Shape的Tensor对Parameter进行覆盖。该方法常用于使用Initializer进行[Cell遍历初始化](https://www.mindspore.cn/docs/zh-CN/master/model_train/custom_program/initializer.html#cell%E9%81%8D%E5%8E%86%E5%88%9D%E5%A7%8B%E5%8C%96)。" ] }, { @@ -254,7 +254,7 @@ "source": [ "#### 运行时修改参数值\n", "\n", - "参数的主要作用为模型训练时对其值进行更新,在反向传播获得梯度后,或不可训练参数需要进行更新,都涉及到运行时参数修改。由于MindSpore的[使用静态图加速](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/accelerate_with_static_graph.html)编译设计,此时需要使用`mindspore.ops.assign`接口对参数进行赋值。该方法常用于[自定义优化器](https://www.mindspore.cn/tutorials/zh-CN/master/advanced/modules/optimizer.html#%E8%87%AA%E5%AE%9A%E4%B9%89%E4%BC%98%E5%8C%96%E5%99%A8)场景。下面是一个简单的运行时修改参数值样例:" + "参数的主要作用为模型训练时对其值进行更新,在反向传播获得梯度后,或不可训练参数需要进行更新,都涉及到运行时参数修改。由于MindSpore的[使用静态图加速](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/accelerate_with_static_graph.html)编译设计,此时需要使用`mindspore.ops.assign`接口对参数进行赋值。该方法常用于[自定义优化器](https://www.mindspore.cn/docs/zh-CN/master/model_train/custom_program/optimizer.html#%E8%87%AA%E5%AE%9A%E4%B9%89%E4%BC%98%E5%8C%96%E5%99%A8)场景。下面是一个简单的运行时修改参数值样例:" ] }, { @@ -379,642 +379,6 @@ "net.set_train(False)\n", "print(net.phase)" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 自定义神经网络层\n", - "\n", - "通常情况下,MindSpore提供的神经网络层接口和function函数接口能够满足模型构造需求,但由于AI领域不断推陈出新,因此有可能遇到新网络结构没有内置模块的情况。此时我们可以根据需要,通过MindSpore提供的function接口、Primitive算子自定义神经网络层,并可以使用`Cell.bprop`方法自定义反向。下面分别详述三种自定义方法。\n", - "\n", - "### 使用function接口构造神经网络层\n", - "\n", - "MindSpore提供大量基础的function接口,可以使用其构造复杂的Tensor操作,封装为神经网络层。下面以`Threshold`为例,其公式如下:\n", - "\n", - "$$\n", - "y =\\begin{cases}\n", - " x, &\\text{ if } x > \\text{threshold} \\\\\n", - " \\text{value}, &\\text{ otherwise }\n", - " \\end{cases}\n", - "$$\n", - "\n", - "可以看到`Threshold`判断Tensor的值是否大于`threshold`值,保留判断结果为`True`的值,替换判断结果为`False`的值。因此,对应实现如下:" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": {}, - "outputs": [], - "source": [ - "class Threshold(nn.Cell):\n", - " def __init__(self, threshold, value):\n", - " super().__init__()\n", - " self.threshold = threshold\n", - " self.value = value\n", - "\n", - " def construct(self, inputs):\n", - " cond = ops.gt(inputs, self.threshold)\n", - " value = ops.fill(inputs.dtype, inputs.shape, self.value)\n", - " return ops.select(cond, inputs, value)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "这里分别使用了`ops.gt`、`ops.fill`、`ops.select`来实现判断和替换。下面执行自定义的`Threshold`层:" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Tensor(shape=[3], dtype=Float32, value= [ 2.00000000e+01, 2.00000003e-01, 3.00000012e-01])" - ] - }, - "execution_count": 45, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "m = Threshold(0.1, 20)\n", - "inputs = mindspore.Tensor([0.1, 0.2, 0.3], mindspore.float32)\n", - "m(inputs)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "可以看到`inputs[0] = threshold`, 因此被替换为`20`。" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 自定义Cell反向\n", - "\n", - "在特殊场景下,我们不但需要自定义神经网络层的正向逻辑,也需要手动控制其反向的计算,此时我们可以通过`Cell.bprop`接口对其反向进行定义。在全新的神经网络结构设计、反向传播速度优化等场景下会用到该功能。下面我们以`Dropout2d`为例,介绍如何自定义Cell反向:" - ] - }, - { - "cell_type": "code", - "execution_count": 55, - "metadata": {}, - "outputs": [], - "source": [ - "class Dropout2d(nn.Cell):\n", - " def __init__(self, keep_prob):\n", - " super().__init__()\n", - " self.keep_prob = keep_prob\n", - " self.dropout2d = ops.Dropout2D(keep_prob)\n", - "\n", - " def construct(self, x):\n", - " return self.dropout2d(x)\n", - "\n", - " def bprop(self, x, out, dout):\n", - " _, mask = out\n", - " dy, _ = dout\n", - " if self.keep_prob != 0:\n", - " dy = dy * (1 / self.keep_prob)\n", - " dy = mask.astype(mindspore.float32) * dy\n", - " return (dy.astype(x.dtype), )\n", - "\n", - "dropout_2d = Dropout2d(0.8)\n", - "dropout_2d.bprop_debug = True" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`bprop`方法分别有三个入参:\n", - "\n", - "- *x*: 正向输入,当正向输入为多个时,需同样数量的入参。\n", - "- *out*: 正向输出。\n", - "- *dout*: 反向传播时,当前Cell执行之前的反向结果。\n", - "\n", - "一般我们需要根据正向输出和前层反向结果配合,根据反向求导公式计算反向结果,并将其返回。`Dropout2d`的反向计算需要根据正向输出的`mask`矩阵对前层反向结果进行mask,然后根据`keep_prob`进行缩放。最终可得到正确的计算结果。" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "自定义Cell反向时,在PyNative模式下支持拓展写法,可以对Cell内部的权重求导,具体列子如下:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "class NetWithParam(nn.Cell):\n", - " def __init__(self):\n", - " super(NetWithParam, self).__init__()\n", - " self.w = Parameter(Tensor(np.array([2.0], dtype=np.float32)), name='weight')\n", - " self.internal_params = [self.w]\n", - "\n", - " def construct(self, x):\n", - " output = self.w * x\n", - " return output\n", - "\n", - " def bprop(self, *args):\n", - " return (self.w * args[-1],), {self.w: args[0] * args[-1]}" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`bprop`方法支持*args入参,args数组中最后一位`args[-1]`为返回给该cell的梯度。通过`self.internal_params`设置求导的权重,同时在`bprop`函数的返回值为一个元组和一个字典,返回输入对应梯度的元组,以及以key为权重,value为权重对应梯度的字典。" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Hook功能\n", - "\n", - "调试深度学习网络是每一个深度学习领域的从业者需要面对且投入精力较大的工作。由于深度学习网络隐藏了中间层算子的输入、输出数据以及反向梯度,只提供网络输入数据(特征量、权重)的梯度,导致无法准确地感知中间层算子的数据变化,从而降低了调试效率。为了方便用户准确、快速地对深度学习网络进行调试,MindSpore在动态图模式下设计了Hook功能,**使用Hook功能可以捕获中间层算子的输入、输出数据以及反向梯度**。\n", - "\n", - "目前,动态图模式下提供了四种形式的Hook功能,分别是:HookBackward算子和在Cell对象上进行注册的register_forward_pre_hook、register_forward_hook、register_backward_hook功能。\n", - "\n", - "### HookBackward算子\n", - "\n", - "HookBackward将Hook功能以算子的形式实现。用户初始化一个HookBackward算子,将其安插到深度学习网络中需要捕获梯度的位置。在网络正向执行时,HookBackward算子将输入数据不做任何修改后原样输出;在网络反向传播梯度时,在HookBackward上注册的Hook函数将会捕获反向传播至此的梯度。用户可以在Hook函数中自定义对梯度的操作,比如打印梯度,或者返回新的梯度。\n", - "\n", - "示例代码:" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "ExecuteTime": { - "end_time": "2022-03-02T09:13:38.660885Z", - "start_time": "2022-03-02T09:13:38.645597Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "hook_fn print grad_out: (Tensor(shape=[], dtype=Float32, value= 2),)\n", - "output: (Tensor(shape=[], dtype=Float32, value= 4), Tensor(shape=[], dtype=Float32, value= 4))\n" - ] - } - ], - "source": [ - "import mindspore as ms\n", - "from mindspore import ops\n", - "\n", - "ms.set_context(mode=ms.PYNATIVE_MODE)\n", - "\n", - "def hook_fn(grad_out):\n", - " \"\"\"打印梯度\"\"\"\n", - " print(\"hook_fn print grad_out:\", grad_out)\n", - "\n", - "hook = ops.HookBackward(hook_fn)\n", - "def hook_test(x, y):\n", - " z = x * y\n", - " z = hook(z)\n", - " z = z * y\n", - " return z\n", - "\n", - "def net(x, y):\n", - " return ms.grad(hook_test, grad_position=(0, 1))(x, y)\n", - "\n", - "output = net(ms.Tensor(1, ms.float32), ms.Tensor(2, ms.float32))\n", - "print(\"output:\", output)" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "更多HookBackward算子的说明可以参考[API文档](https://mindspore.cn/docs/zh-CN/master/api_python/ops/mindspore.ops.HookBackward.html)。\n", - "\n", - "### Cell对象的register_forward_pre_hook功能\n", - "\n", - "用户可以在Cell对象上使用`register_forward_pre_hook`函数来注册一个自定义的Hook函数,用来捕获正向传入该Cell对象的数据。该功能在静态图模式下和在使用`@jit`修饰的函数内不起作用。`register_forward_pre_hook`函数接收Hook函数作为入参,并返回一个与Hook函数一一对应的`handle`对象。用户可以通过调用`handle`对象的`remove()`函数来删除与之对应的Hook函数。每一次调用`register_forward_pre_hook`函数,都会返回一个不同的`handle`对象。Hook函数应该按照以下的方式进行定义。" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "def forward_pre_hook_fn(cell, inputs):\n", - " print(\"forward inputs: \", inputs)" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "这里的cell是Cell对象,inputs是正向传入到Cell对象的数据。因此,用户可以使用register_forward_pre_hook函数来捕获网络中某一个Cell对象的正向输入数据。用户可以在Hook函数中自定义对输入数据的操作,比如查看、打印数据,或者返回新的输入数据给当前的Cell对象。如果在Hook函数中对Cell对象的原始输入数据进行计算操作后,再作为新的输入数据返回,这些新增的计算操作将会同时作用于梯度的反向传播。\n", - "\n", - "示例代码:" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "forward inputs: (Tensor(shape=[1], dtype=Float32, value= [ 2.00000000e+00]),)\n", - "[2.]\n", - "forward inputs: (Tensor(shape=[1], dtype=Float32, value= [ 2.00000000e+00]),)\n", - "(Tensor(shape=[1], dtype=Float32, value= [ 1.00000000e+00]), Tensor(shape=[1], dtype=Float32, value= [ 1.00000000e+00]))\n", - "(Tensor(shape=[1], dtype=Float32, value= [ 1.00000000e+00]), Tensor(shape=[1], dtype=Float32, value= [ 1.00000000e+00]))\n" - ] - } - ], - "source": [ - "import numpy as np\n", - "import mindspore as ms\n", - "import mindspore.nn as nn\n", - "\n", - "ms.set_context(mode=ms.PYNATIVE_MODE)\n", - "\n", - "def forward_pre_hook_fn(cell, inputs):\n", - " print(\"forward inputs: \", inputs)\n", - " input_x = inputs[0]\n", - " return input_x\n", - "\n", - "class Net(nn.Cell):\n", - " def __init__(self):\n", - " super(Net, self).__init__()\n", - " self.relu = nn.ReLU()\n", - " self.handle = self.relu.register_forward_pre_hook(forward_pre_hook_fn)\n", - "\n", - " def construct(self, x, y):\n", - " x = x + y\n", - " x = self.relu(x)\n", - " return x\n", - "\n", - "net = Net()\n", - "grad_net = ms.grad(net, grad_position=(0, 1))\n", - "\n", - "x = ms.Tensor(np.ones([1]).astype(np.float32))\n", - "y = ms.Tensor(np.ones([1]).astype(np.float32))\n", - "\n", - "output = net(x, y)\n", - "print(output)\n", - "gradient = grad_net(x, y)\n", - "print(gradient)\n", - "net.handle.remove()\n", - "gradient = grad_net(x, y)\n", - "print(gradient)" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "用户如果在Hook函数中直接返回新创建的数据,而不是返回由原始输入数据经过计算后得到的数据,那么梯度的反向传播将会在该Cell对象上截止。\n", - "\n", - "示例代码:" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "forward inputs: (Tensor(shape=[1], dtype=Float32, value= [ 2.00000000e+00]),)\n", - "(Tensor(shape=[1], dtype=Float32, value= [ 0.00000000e+00]), Tensor(shape=[1], dtype=Float32, value= [ 0.00000000e+00]))\n" - ] - } - ], - "source": [ - "import numpy as np\n", - "import mindspore as ms\n", - "import mindspore.nn as nn\n", - "\n", - "ms.set_context(mode=ms.PYNATIVE_MODE)\n", - "\n", - "def forward_pre_hook_fn(cell, inputs):\n", - " print(\"forward inputs: \", inputs)\n", - " return ms.Tensor(np.ones([1]).astype(np.float32))\n", - "\n", - "class Net(nn.Cell):\n", - " def __init__(self):\n", - " super(Net, self).__init__()\n", - " self.relu = nn.ReLU()\n", - " self.handle = self.relu.register_forward_pre_hook(forward_pre_hook_fn)\n", - "\n", - " def construct(self, x, y):\n", - " x = x + y\n", - " x = self.relu(x)\n", - " return x\n", - "\n", - "net = Net()\n", - "grad_net = ms.grad(net, grad_position=(0, 1))\n", - "\n", - "x = ms.Tensor(np.ones([1]).astype(np.float32))\n", - "y = ms.Tensor(np.ones([1]).astype(np.float32))\n", - "\n", - "gradient = grad_net(x, y)\n", - "print(gradient)" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "为了避免脚本在切换到图模式时运行失败,不建议在Cell对象的 `construct` 函数中调用 `register_forward_pre_hook` 函数和 `handle` 对象的 `remove()` 函数。在动态图模式下,如果在Cell对象的 `construct` 函数中调用 `register_forward_pre_hook` 函数,那么Cell对象每次运行都将新注册一个Hook函数。\n", - "\n", - "更多关于Cell对象的 `register_forward_pre_hook` 功能的说明可以参考[API文档](https://mindspore.cn/docs/zh-CN/master/api_python/nn/mindspore.nn.Cell.html#mindspore.nn.Cell.register_forward_pre_hook)。\n", - "\n", - "### Cell对象的register_forward_hook功能\n", - "\n", - "用户可以在Cell对象上使用`register_forward_hook`函数来注册一个自定义的Hook函数,用来捕获正向传入Cell对象的数据和Cell对象的输出数据。该功能在静态图模式下和在使用`@jit`修饰的函数内不起作用。`register_forward_hook`函数接收Hook函数作为入参,并返回一个与Hook函数一一对应的`handle`对象。用户可以通过调用`handle`对象的`remove()`函数来删除与之对应的Hook函数。每一次调用`register_forward_hook`函数,都会返回一个不同的`handle`对象。Hook函数应该按照以下的方式进行定义。\n", - "\n", - "示例代码:" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "def forward_hook_fn(cell, inputs, outputs):\n", - " print(\"forward inputs: \", inputs)\n", - " print(\"forward outputs: \", outputs)" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "这里的`cell`是Cell对象,`inputs`是正向传入到Cell对象的数据,`outputs`是Cell对象的正向输出数据。因此,用户可以使用`register_forward_hook`函数来捕获网络中某一个Cell对象的正向输入数据和输出数据。用户可以在Hook函数中自定义对输入、输出数据的操作,比如查看、打印数据,或者返回新的输出数据。如果在Hook函数中对Cell对象的原始输出数据进行计算操作后,再作为新的输出数据返回,这些新增的计算操作将会同时作用于梯度的反向传播。\n", - "\n", - "示例代码:" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "forward inputs: (Tensor(shape=[1], dtype=Float32, value= [ 2.00000000e+00]),)\n", - "forward outputs: [2.]\n", - "(Tensor(shape=[1], dtype=Float32, value= [ 2.00000000e+00]), Tensor(shape=[1], dtype=Float32, value= [ 2.00000000e+00]))\n", - "(Tensor(shape=[1], dtype=Float32, value= [ 1.00000000e+00]), Tensor(shape=[1], dtype=Float32, value= [ 1.00000000e+00]))\n" - ] - } - ], - "source": [ - "import numpy as np\n", - "import mindspore as ms\n", - "import mindspore.nn as nn\n", - "\n", - "ms.set_context(mode=ms.PYNATIVE_MODE)\n", - "\n", - "def forward_hook_fn(cell, inputs, outputs):\n", - " print(\"forward inputs: \", inputs)\n", - " print(\"forward outputs: \", outputs)\n", - " outputs = outputs + outputs\n", - " return outputs\n", - "\n", - "class Net(nn.Cell):\n", - " def __init__(self):\n", - " super(Net, self).__init__()\n", - " self.relu = nn.ReLU()\n", - " self.handle = self.relu.register_forward_hook(forward_hook_fn)\n", - "\n", - " def construct(self, x, y):\n", - " x = x + y\n", - " x = self.relu(x)\n", - " return x\n", - "\n", - "net = Net()\n", - "grad_net = ms.grad(net, grad_position=(0, 1))\n", - "\n", - "x = ms.Tensor(np.ones([1]).astype(np.float32))\n", - "y = ms.Tensor(np.ones([1]).astype(np.float32))\n", - "\n", - "gradient = grad_net(x, y)\n", - "print(gradient)\n", - "net.handle.remove()\n", - "gradient = grad_net(x, y)\n", - "print(gradient)" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "用户如果在Hook函数中直接返回新创建的数据,而不是将原始的输出数据经过计算后,将得到的新输出数据返回,那么梯度的反向传播将会在该Cell对象上截止。该现象可以参考`register_forward_pre_hook`函数的用例说明。\n", - "为了避免脚本在切换到图模式时运行失败,不建议在Cell对象的`construct`函数中调用`register_forward_hook`函数和`handle`对象的`remove()`函数。在动态图模式下,如果在Cell对象的`construct`函数中调用`register_forward_hook`函数,那么Cell对象每次运行都将新注册一个Hook函数。\n", - "\n", - "更多关于Cell对象的`register_forward_hook`功能的说明可以参考[API文档](https://mindspore.cn/docs/zh-CN/master/api_python/nn/mindspore.nn.Cell.html#mindspore.nn.Cell.register_forward_hook)。\n", - "\n", - "### Cell对象的register_backward_hook功能\n", - "\n", - "用户可以在Cell对象上使用`register_backward_hook`函数来注册一个自定义的Hook函数,用来捕获网络反向传播时与Cell对象相关联的梯度。该功能在图模式下或者在使用`@jit`修饰的函数内不起作用。`register_backward_hook`函数接收Hook函数作为入参,并返回一个与Hook函数一一对应的`handle`对象。用户可以通过调用`handle`对象的`remove()`函数来删除与之对应的Hook函数。每一次调用`register_backward_hook`函数,都会返回一个不同的`handle`对象。\n", - "\n", - "与HookBackward算子所使用的自定义Hook函数有所不同,`register_backward_hook`使用的Hook函数的入参中,包含了表示Cell对象名称与id信息的`cell_id`、反向传入到Cell对象的梯度、以及Cell对象的反向输出的梯度。\n", - "\n", - "示例代码:" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "def backward_hook_function(cell_id, grad_input, grad_output):\n", - " print(grad_input)\n", - " print(grad_output)" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "这里的`cell_id`是Cell对象的名称以及ID信息,`grad_input`是网络反向传播时,传入到Cell对象的梯度,它对应于正向过程中下一个算子的反向输出梯度;`grad_output`是Cell对象反向输出的梯度。因此,用户可以使用`register_backward_hook`函数来捕获网络中某一个Cell对象的反向传入和反向输出梯度。用户可以在Hook函数中自定义对梯度的操作,比如查看、打印梯度,或者返回新的输出梯度。如果需要在Hook函数中返回新的输出梯度时,返回值必须是`tuple`的形式。\n", - "\n", - "示例代码:" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "ExecuteTime": { - "end_time": "2022-03-02T09:14:26.523389Z", - "start_time": "2022-03-02T09:14:26.506784Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(Tensor(shape=[1, 2, 1, 1], dtype=Float32, value=\n", - "[[[[ 1.00000000e+00]],\n", - " [[ 1.00000000e+00]]]]),)\n", - "(Tensor(shape=[1, 2, 1, 1], dtype=Float32, value=\n", - "[[[[ 9.99994993e-01]],\n", - " [[ 9.99994993e-01]]]]),)\n", - "[[[[1.99999 1.99999]\n", - " [1.99999 1.99999]]]]\n", - "-------------\n", - " [[[[1.99999 1.99999]\n", - " [1.99999 1.99999]]]]\n" - ] - } - ], - "source": [ - "import numpy as np\n", - "import mindspore as ms\n", - "import mindspore.nn as nn\n", - "\n", - "ms.set_context(mode=ms.PYNATIVE_MODE)\n", - "\n", - "def backward_hook_function(cell_id, grad_input, grad_output):\n", - " print(grad_input)\n", - " print(grad_output)\n", - "\n", - "class Net(nn.Cell):\n", - " def __init__(self):\n", - " super(Net, self).__init__()\n", - " self.conv = nn.Conv2d(1, 2, kernel_size=2, stride=1, padding=0, weight_init=\"ones\", pad_mode=\"valid\")\n", - " self.bn = nn.BatchNorm2d(2, momentum=0.99, eps=0.00001, gamma_init=\"ones\")\n", - " self.handle = self.bn.register_backward_hook(backward_hook_function)\n", - " self.relu = nn.ReLU()\n", - "\n", - " def construct(self, x):\n", - " x = self.conv(x)\n", - " x = self.bn(x)\n", - " x = self.relu(x)\n", - " return x\n", - "\n", - "net = Net()\n", - "grad_net = ms.grad(net)\n", - "output = grad_net(ms.Tensor(np.ones([1, 1, 2, 2]).astype(np.float32)))\n", - "print(output)\n", - "net.handle.remove()\n", - "output = grad_net(ms.Tensor(np.ones([1, 1, 2, 2]).astype(np.float32)))\n", - "print(\"-------------\\n\", output)" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "当 `register_backward_hook` 函数和 `register_forward_pre_hook` 函数、 `register_forward_hook` 函数同时作用于同一Cell对象时,如果 `register_forward_pre_hook` 和 `register_forward_hook` 函数中有添加其他算子进行数据处理,这些新增算子会在Cell对象执行前或者执行后参与数据的正向计算,但是这些新增算子的反向梯度不在 `register_backward_hook` 函数的捕获范围内。 `register_backward_hook` 中注册的Hook函数仅捕获原始Cell对象的输入、输出梯度。\n", - "\n", - "示例代码:" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "forward inputs: (Tensor(shape=[1], dtype=Float32, value= [ 2.00000000e+00]),)\n", - "forward inputs: (Tensor(shape=[1], dtype=Float32, value= [ 2.00000000e+00]),)\n", - "forward outputs: [2.]\n", - "grad input: (Tensor(shape=[1], dtype=Float32, value= [ 2.00000000e+00]),)\n", - "grad output: (Tensor(shape=[1], dtype=Float32, value= [ 2.00000000e+00]),)\n", - "(Tensor(shape=[1], dtype=Float32, value= [ 2.00000000e+00]), Tensor(shape=[1], dtype=Float32, value= [ 2.00000000e+00]))\n" - ] - } - ], - "source": [ - "import numpy as np\n", - "import mindspore as ms\n", - "import mindspore.nn as nn\n", - "\n", - "ms.set_context(mode=ms.PYNATIVE_MODE)\n", - "\n", - "def forward_pre_hook_fn(cell, inputs):\n", - " print(\"forward inputs: \", inputs)\n", - " input_x = inputs[0]\n", - " return input_x\n", - "\n", - "def forward_hook_fn(cell, inputs, outputs):\n", - " print(\"forward inputs: \", inputs)\n", - " print(\"forward outputs: \", outputs)\n", - " outputs = outputs + outputs\n", - " return outputs\n", - "\n", - "def backward_hook_fn(cell_id, grad_input, grad_output):\n", - " print(\"grad input: \", grad_input)\n", - " print(\"grad output: \", grad_output)\n", - "\n", - "class Net(nn.Cell):\n", - " def __init__(self):\n", - " super(Net, self).__init__()\n", - " self.relu = nn.ReLU()\n", - " self.handle = self.relu.register_forward_pre_hook(forward_pre_hook_fn)\n", - " self.handle2 = self.relu.register_forward_hook(forward_hook_fn)\n", - " self.handle3 = self.relu.register_backward_hook(backward_hook_fn)\n", - "\n", - " def construct(self, x, y):\n", - " x = x + y\n", - " x = self.relu(x)\n", - " return x\n", - "\n", - "net = Net()\n", - "grad_net = ms.grad(net, grad_position=(0, 1))\n", - "gradient = grad_net(ms.Tensor(np.ones([1]).astype(np.float32)), ms.Tensor(np.ones([1]).astype(np.float32)))\n", - "print(gradient)" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "这里的 `grad_input` 是梯度反向传播时传入`self.relu`的梯度,而不是传入 `forward_hook_fn` 函数中,新增的 `Add` 算子的梯度。这里的 `grad_output` 是梯度反向传播时 `self.relu` 反向输出的梯度,而不是 `forward_pre_hook_fn` 函数中新增 `Add` 算子的反向输出梯度。 `register_forward_pre_hook` 函数和 `register_forward_hook` 函数是在Cell对象执行前后起作用,不会影响Cell对象上反向Hook函数的梯度捕获范围。\n", - "\n", - "为了避免脚本在切换到图模式时运行失败,不建议在Cell对象的 `construct` 函数中调用 `register_backward_hook` 函数和 `handle` 对象的 `remove()` 函数。在PyNative模式下,如果在Cell对象的 `construct` 函数中调用 `register_backward_hook` 函数,那么Cell对象每次运行都将新注册一个Hook函数。\n", - "\n", - "更多关于Cell对象的 `register_backward_hook` 功能的说明可以参考[API文档](https://mindspore.cn/docs/zh-CN/master/api_python/nn/mindspore.nn.Cell.html#mindspore.nn.Cell.register_backward_hook)。\n" - ] } ], "metadata": { diff --git a/tutorials/source_zh_cn/advanced/modules/loss.ipynb b/docs/mindspore/source_zh_cn/model_train/custom_program/loss.ipynb similarity index 99% rename from tutorials/source_zh_cn/advanced/modules/loss.ipynb rename to docs/mindspore/source_zh_cn/model_train/custom_program/loss.ipynb index e34a6736e6..63d95667b8 100644 --- a/tutorials/source_zh_cn/advanced/modules/loss.ipynb +++ b/docs/mindspore/source_zh_cn/model_train/custom_program/loss.ipynb @@ -4,6 +4,8 @@ "cell_type": "markdown", "metadata": {}, "source": [ + "# 自定义损失函数\n", + "\n", "[![下载Notebook](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_notebook.svg)](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/master/tutorials/zh_cn/advanced/modules/mindspore_loss.ipynb) [![下载样例代码](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_download_code.svg)](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/master/tutorials/zh_cn/advanced/modules/mindspore_loss.py) [![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/master/tutorials/source_zh_cn/advanced/modules/loss.ipynb)" ] }, @@ -11,15 +13,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# 损失函数\n", - "\n", "损失函数,亦称目标函数,用于衡量预测值与真实值差异的程度。\n", "\n", "在深度学习中,模型训练就是通过不断迭代来缩小损失函数值的过程。因此,在模型训练过程中损失函数的选择非常重要,一个好的损失函数能有效提升模型的性能。\n", "\n", "`mindspore.nn`模块中提供了许多[通用损失函数](https://www.mindspore.cn/docs/zh-CN/master/api_python/mindspore.nn.html#损失函数),但这些通用损失函数无法满足所有需求,很多情况需要用户自定义所需的损失函数。因此,本教程介绍如何自定义损失函数。\n", "\n", - "![lossfun.png](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/tutorials/source_zh_cn/advanced/modules/images/loss_function.png)\n", + "![lossfun.png](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/docs/mindspore/source_zh_cn/model_train/custom_program/images/loss_function.png)\n", "\n", "## 内置损失函数\n", "\n", diff --git a/docs/mindspore/source_zh_cn/model_train/custom_program/network_custom.ipynb b/docs/mindspore/source_zh_cn/model_train/custom_program/network_custom.ipynb new file mode 100644 index 0000000000..556e927fb6 --- /dev/null +++ b/docs/mindspore/source_zh_cn/model_train/custom_program/network_custom.ipynb @@ -0,0 +1,195 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 自定义神经网络层\n", + "\n", + "[![下载Notebook](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_notebook.svg)](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/master/zh_cn/model_train/custom_program/mindspore_network_custom.ipynb) [![下载样例代码](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_download_code.svg)](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/master/zh_cn/model_train/custom_program/mindspore_network_custom.py) [![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_zh_cn/model_train/custom_program/network_custom.ipynb)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "通常情况下,MindSpore提供的神经网络层接口和function函数接口能够满足模型构造需求,但由于AI领域不断推陈出新,因此有可能遇到新网络结构没有内置模块的情况。此时我们可以根据需要,通过MindSpore提供的function接口、Primitive算子自定义神经网络层,并可以使用`Cell.bprop`方法自定义反向。下面分别详述三种自定义方法。\n", + "\n", + "## 使用function接口构造神经网络层\n", + "\n", + "MindSpore提供大量基础的function接口,可以使用其构造复杂的Tensor操作,封装为神经网络层。下面以`Threshold`为例,其公式如下:\n", + "\n", + "$$\n", + "y =\\begin{cases}\n", + " x, &\\text{ if } x > \\text{threshold} \\\\\n", + " \\text{value}, &\\text{ otherwise }\n", + " \\end{cases}\n", + "$$\n", + "\n", + "可以看到`Threshold`判断Tensor的值是否大于`threshold`值,保留判断结果为`True`的值,替换判断结果为`False`的值。因此,对应实现如下:" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": {}, + "outputs": [], + "source": [ + "import mindspore\n", + "import numpy as np\n", + "from mindspore import nn, ops, Tensor, Parameter\n", + "class Threshold(nn.Cell):\n", + " def __init__(self, threshold, value):\n", + " super().__init__()\n", + " self.threshold = threshold\n", + " self.value = value\n", + "\n", + " def construct(self, inputs):\n", + " cond = ops.gt(inputs, self.threshold)\n", + " value = ops.fill(inputs.dtype, inputs.shape, self.value)\n", + " return ops.select(cond, inputs, value)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "这里分别使用了`ops.gt`、`ops.fill`、`ops.select`来实现判断和替换。下面执行自定义的`Threshold`层:" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Tensor(shape=[3], dtype=Float32, value= [ 2.00000000e+01, 2.00000003e-01, 3.00000012e-01])" + ] + }, + "execution_count": 45, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "m = Threshold(0.1, 20)\n", + "inputs = mindspore.Tensor([0.1, 0.2, 0.3], mindspore.float32)\n", + "m(inputs)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "可以看到`inputs[0] = threshold`, 因此被替换为`20`。" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 自定义Cell反向\n", + "\n", + "在特殊场景下,我们不但需要自定义神经网络层的正向逻辑,也需要手动控制其反向的计算,此时我们可以通过`Cell.bprop`接口对其反向进行定义。在全新的神经网络结构设计、反向传播速度优化等场景下会用到该功能。下面我们以`Dropout2d`为例,介绍如何自定义Cell反向:" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": {}, + "outputs": [], + "source": [ + "class Dropout2d(nn.Cell):\n", + " def __init__(self, keep_prob):\n", + " super().__init__()\n", + " self.keep_prob = keep_prob\n", + " self.dropout2d = ops.Dropout2D(keep_prob)\n", + "\n", + " def construct(self, x):\n", + " return self.dropout2d(x)\n", + "\n", + " def bprop(self, x, out, dout):\n", + " _, mask = out\n", + " dy, _ = dout\n", + " if self.keep_prob != 0:\n", + " dy = dy * (1 / self.keep_prob)\n", + " dy = mask.astype(mindspore.float32) * dy\n", + " return (dy.astype(x.dtype), )\n", + "\n", + "dropout_2d = Dropout2d(0.8)\n", + "dropout_2d.bprop_debug = True" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`bprop`方法分别有三个入参:\n", + "\n", + "- *x*: 正向输入,当正向输入为多个时,需同样数量的入参。\n", + "- *out*: 正向输出。\n", + "- *dout*: 反向传播时,当前Cell执行之前的反向结果。\n", + "\n", + "一般我们需要根据正向输出和前层反向结果配合,根据反向求导公式计算反向结果,并将其返回。`Dropout2d`的反向计算需要根据正向输出的`mask`矩阵对前层反向结果进行mask,然后根据`keep_prob`进行缩放。最终可得到正确的计算结果。" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "自定义Cell反向时,在PyNative模式下支持拓展写法,可以对Cell内部的权重求导,具体列子如下:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "class NetWithParam(nn.Cell):\n", + " def __init__(self):\n", + " super(NetWithParam, self).__init__()\n", + " self.w = Parameter(Tensor(np.array([2.0], dtype=np.float32)), name='weight')\n", + " self.internal_params = [self.w]\n", + "\n", + " def construct(self, x):\n", + " output = self.w * x\n", + " return output\n", + "\n", + " def bprop(self, *args):\n", + " return (self.w * args[-1],), {self.w: args[0] * args[-1]}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`bprop`方法支持*args入参,args数组中最后一位`args[-1]`为返回给该cell的梯度。通过`self.internal_params`设置求导的权重,同时在`bprop`函数的返回值为一个元组和一个字典,返回输入对应梯度的元组,以及以key为权重,value为权重对应梯度的字典。" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "MindSpore", + "language": "python", + "name": "mindspore" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 + } + \ No newline at end of file diff --git a/docs/mindspore/source_zh_cn/model_train/custom_program/op_custom.rst b/docs/mindspore/source_zh_cn/model_train/custom_program/op_custom.rst new file mode 100644 index 0000000000..76634d0507 --- /dev/null +++ b/docs/mindspore/source_zh_cn/model_train/custom_program/op_custom.rst @@ -0,0 +1,12 @@ +自定义算子 +============ + +.. toctree:: + :glob: + :maxdepth: 1 + + operation/op_custom + operation/ms_kernel + operation/op_custom_adv + operation/op_custom_aot + operation/op_custom_ascendc \ No newline at end of file diff --git a/tutorials/experts/source_zh_cn/operation/ms_kernel.ipynb b/docs/mindspore/source_zh_cn/model_train/custom_program/operation/ms_kernel.ipynb similarity index 100% rename from tutorials/experts/source_zh_cn/operation/ms_kernel.ipynb rename to docs/mindspore/source_zh_cn/model_train/custom_program/operation/ms_kernel.ipynb diff --git a/tutorials/experts/source_zh_cn/operation/op_custom.ipynb b/docs/mindspore/source_zh_cn/model_train/custom_program/operation/op_custom.ipynb similarity index 100% rename from tutorials/experts/source_zh_cn/operation/op_custom.ipynb rename to docs/mindspore/source_zh_cn/model_train/custom_program/operation/op_custom.ipynb diff --git a/tutorials/experts/source_zh_cn/operation/op_custom_adv.ipynb b/docs/mindspore/source_zh_cn/model_train/custom_program/operation/op_custom_adv.ipynb similarity index 100% rename from tutorials/experts/source_zh_cn/operation/op_custom_adv.ipynb rename to docs/mindspore/source_zh_cn/model_train/custom_program/operation/op_custom_adv.ipynb diff --git a/tutorials/experts/source_zh_cn/operation/op_custom_aot.md b/docs/mindspore/source_zh_cn/model_train/custom_program/operation/op_custom_aot.md similarity index 100% rename from tutorials/experts/source_zh_cn/operation/op_custom_aot.md rename to docs/mindspore/source_zh_cn/model_train/custom_program/operation/op_custom_aot.md diff --git a/tutorials/experts/source_zh_cn/operation/op_custom_ascendc.md b/docs/mindspore/source_zh_cn/model_train/custom_program/operation/op_custom_ascendc.md similarity index 100% rename from tutorials/experts/source_zh_cn/operation/op_custom_ascendc.md rename to docs/mindspore/source_zh_cn/model_train/custom_program/operation/op_custom_ascendc.md diff --git a/tutorials/source_zh_cn/advanced/modules/optimizer.ipynb b/docs/mindspore/source_zh_cn/model_train/custom_program/optimizer.ipynb similarity index 99% rename from tutorials/source_zh_cn/advanced/modules/optimizer.ipynb rename to docs/mindspore/source_zh_cn/model_train/custom_program/optimizer.ipynb index 541c5db826..fe638d4dfa 100644 --- a/tutorials/source_zh_cn/advanced/modules/optimizer.ipynb +++ b/docs/mindspore/source_zh_cn/model_train/custom_program/optimizer.ipynb @@ -5,19 +5,19 @@ "id": "487f7a6d-506a-4824-94b1-a96b4866a447", "metadata": {}, "source": [ + "# 自定义优化器\n", + "\n", "[![下载Notebook](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_notebook.svg)](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/master/tutorials/zh_cn/advanced/modules/mindspore_optimizer.ipynb) [![下载样例代码](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_download_code.svg)](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/master/tutorials/zh_cn/advanced/modules/mindspore_optimizer.py) [![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/master/tutorials/source_zh_cn/advanced/modules/optimizer.ipynb)" ] }, { "cell_type": "markdown", "source": [ - "# 优化器\n", - "\n", "模型训练过程中,使用优化器更新网络参数,合适的优化器可以有效减少训练时间,提高模型性能。\n", "\n", "最基本的优化器是随机梯度下降算法(SGD),很多优化器在SGD的基础上进行了改进,以实现目标函数能更快速更有效地收敛到全局最优点。MindSpore中的`nn`模块提供了常用的优化器,如`nn.SGD`、`nn.Adam`、`nn.Momentum`等。本章主要介绍如何配置MindSpore提供的优化器以及如何自定义优化器。\n", "\n", - "![learningrate.png](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/tutorials/source_zh_cn/advanced/modules/images/learning_rate.png)\n", + "![learningrate.png](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/docs/mindspore/source_zh_cn/model_train/custom_program/images/learning_rate.png)\n", "\n", "> MindSpore提供的优化器详细内容参见[优化器API](https://www.mindspore.cn/docs/zh-CN/master/api_python/mindspore.nn.html#优化器)。\n", "\n", diff --git a/docs/mindspore/source_zh_cn/model_train/custom_program/overview.md b/docs/mindspore/source_zh_cn/model_train/custom_program/overview.md new file mode 100644 index 0000000000..801d13671b --- /dev/null +++ b/docs/mindspore/source_zh_cn/model_train/custom_program/overview.md @@ -0,0 +1,3 @@ +# 自定义高阶编程概述 + +[![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_zh_cn/model_train/custom_program/overview.md) diff --git a/tutorials/experts/source_zh_cn/dataset/augment.ipynb b/docs/mindspore/source_zh_cn/model_train/dataset/augment.ipynb similarity index 100% rename from tutorials/experts/source_zh_cn/dataset/augment.ipynb rename to docs/mindspore/source_zh_cn/model_train/dataset/augment.ipynb diff --git a/tutorials/experts/source_zh_cn/dataset/cache.ipynb b/docs/mindspore/source_zh_cn/model_train/dataset/cache.ipynb similarity index 100% rename from tutorials/experts/source_zh_cn/dataset/cache.ipynb rename to docs/mindspore/source_zh_cn/model_train/dataset/cache.ipynb diff --git a/tutorials/experts/source_zh_cn/dataset/dataset_autotune.md b/docs/mindspore/source_zh_cn/model_train/dataset/dataset_autotune.md similarity index 100% rename from tutorials/experts/source_zh_cn/dataset/dataset_autotune.md rename to docs/mindspore/source_zh_cn/model_train/dataset/dataset_autotune.md diff --git a/tutorials/experts/source_zh_cn/dataset/dataset_offload.md b/docs/mindspore/source_zh_cn/model_train/dataset/dataset_offload.md similarity index 100% rename from tutorials/experts/source_zh_cn/dataset/dataset_offload.md rename to docs/mindspore/source_zh_cn/model_train/dataset/dataset_offload.md diff --git a/tutorials/source_zh_cn/advanced/dataset/eager.ipynb b/docs/mindspore/source_zh_cn/model_train/dataset/eager.ipynb similarity index 100% rename from tutorials/source_zh_cn/advanced/dataset/eager.ipynb rename to docs/mindspore/source_zh_cn/model_train/dataset/eager.ipynb diff --git a/tutorials/experts/source_zh_cn/dataset/images/auto_augmentation.png b/docs/mindspore/source_zh_cn/model_train/dataset/images/auto_augmentation.png similarity index 100% rename from tutorials/experts/source_zh_cn/dataset/images/auto_augmentation.png rename to docs/mindspore/source_zh_cn/model_train/dataset/images/auto_augmentation.png diff --git a/tutorials/experts/source_zh_cn/dataset/images/autotune.png b/docs/mindspore/source_zh_cn/model_train/dataset/images/autotune.png similarity index 100% rename from tutorials/experts/source_zh_cn/dataset/images/autotune.png rename to docs/mindspore/source_zh_cn/model_train/dataset/images/autotune.png diff --git a/tutorials/source_zh_cn/advanced/dataset/images/basic_graph.graffle b/docs/mindspore/source_zh_cn/model_train/dataset/images/basic_graph.graffle similarity index 100% rename from tutorials/source_zh_cn/advanced/dataset/images/basic_graph.graffle rename to docs/mindspore/source_zh_cn/model_train/dataset/images/basic_graph.graffle diff --git a/tutorials/experts/source_zh_cn/dataset/images/cache_dataset.png b/docs/mindspore/source_zh_cn/model_train/dataset/images/cache_dataset.png similarity index 100% rename from tutorials/experts/source_zh_cn/dataset/images/cache_dataset.png rename to docs/mindspore/source_zh_cn/model_train/dataset/images/cache_dataset.png diff --git a/tutorials/experts/source_zh_cn/dataset/images/cache_pipeline_zh.eddx b/docs/mindspore/source_zh_cn/model_train/dataset/images/cache_pipeline_zh.eddx similarity index 100% rename from tutorials/experts/source_zh_cn/dataset/images/cache_pipeline_zh.eddx rename to docs/mindspore/source_zh_cn/model_train/dataset/images/cache_pipeline_zh.eddx diff --git a/tutorials/experts/source_zh_cn/dataset/images/cache_processed_data.png b/docs/mindspore/source_zh_cn/model_train/dataset/images/cache_processed_data.png similarity index 100% rename from tutorials/experts/source_zh_cn/dataset/images/cache_processed_data.png rename to docs/mindspore/source_zh_cn/model_train/dataset/images/cache_processed_data.png diff --git a/tutorials/source_zh_cn/advanced/dataset/images/cifar10.jpg b/docs/mindspore/source_zh_cn/model_train/dataset/images/cifar10.jpg similarity index 100% rename from tutorials/source_zh_cn/advanced/dataset/images/cifar10.jpg rename to docs/mindspore/source_zh_cn/model_train/dataset/images/cifar10.jpg diff --git a/tutorials/experts/source_zh_cn/dataset/images/compose.png b/docs/mindspore/source_zh_cn/model_train/dataset/images/compose.png similarity index 100% rename from tutorials/experts/source_zh_cn/dataset/images/compose.png rename to docs/mindspore/source_zh_cn/model_train/dataset/images/compose.png diff --git a/tutorials/source_zh_cn/advanced/dataset/images/data_conversion_concept.graffle b/docs/mindspore/source_zh_cn/model_train/dataset/images/data_conversion_concept.graffle similarity index 100% rename from tutorials/source_zh_cn/advanced/dataset/images/data_conversion_concept.graffle rename to docs/mindspore/source_zh_cn/model_train/dataset/images/data_conversion_concept.graffle diff --git a/tutorials/source_zh_cn/advanced/dataset/images/data_conversion_concept.png b/docs/mindspore/source_zh_cn/model_train/dataset/images/data_conversion_concept.png similarity index 100% rename from tutorials/source_zh_cn/advanced/dataset/images/data_conversion_concept.png rename to docs/mindspore/source_zh_cn/model_train/dataset/images/data_conversion_concept.png diff --git a/tutorials/experts/source_zh_cn/dataset/images/data_conversion_concept.pptx b/docs/mindspore/source_zh_cn/model_train/dataset/images/data_conversion_concept.pptx similarity index 100% rename from tutorials/experts/source_zh_cn/dataset/images/data_conversion_concept.pptx rename to docs/mindspore/source_zh_cn/model_train/dataset/images/data_conversion_concept.pptx diff --git a/tutorials/experts/source_zh_cn/dataset/images/data_enhancement_performance_scheme.eddx b/docs/mindspore/source_zh_cn/model_train/dataset/images/data_enhancement_performance_scheme.eddx similarity index 100% rename from tutorials/experts/source_zh_cn/dataset/images/data_enhancement_performance_scheme.eddx rename to docs/mindspore/source_zh_cn/model_train/dataset/images/data_enhancement_performance_scheme.eddx diff --git a/tutorials/experts/source_zh_cn/dataset/images/data_enhancement_performance_scheme.png b/docs/mindspore/source_zh_cn/model_train/dataset/images/data_enhancement_performance_scheme.png similarity index 100% rename from tutorials/experts/source_zh_cn/dataset/images/data_enhancement_performance_scheme.png rename to docs/mindspore/source_zh_cn/model_train/dataset/images/data_enhancement_performance_scheme.png diff --git a/tutorials/experts/source_zh_cn/dataset/images/data_loading_performance_scheme.png b/docs/mindspore/source_zh_cn/model_train/dataset/images/data_loading_performance_scheme.png similarity index 100% rename from tutorials/experts/source_zh_cn/dataset/images/data_loading_performance_scheme.png rename to docs/mindspore/source_zh_cn/model_train/dataset/images/data_loading_performance_scheme.png diff --git a/tutorials/source_zh_cn/advanced/dataset/images/dataset_process.eddx b/docs/mindspore/source_zh_cn/model_train/dataset/images/dataset_process.eddx similarity index 100% rename from tutorials/source_zh_cn/advanced/dataset/images/dataset_process.eddx rename to docs/mindspore/source_zh_cn/model_train/dataset/images/dataset_process.eddx diff --git a/tutorials/source_zh_cn/advanced/dataset/images/dataset_process.graffle b/docs/mindspore/source_zh_cn/model_train/dataset/images/dataset_process.graffle similarity index 100% rename from tutorials/source_zh_cn/advanced/dataset/images/dataset_process.graffle rename to docs/mindspore/source_zh_cn/model_train/dataset/images/dataset_process.graffle diff --git a/tutorials/source_zh_cn/advanced/dataset/images/eager_mode.jpeg b/docs/mindspore/source_zh_cn/model_train/dataset/images/eager_mode.jpeg similarity index 100% rename from tutorials/source_zh_cn/advanced/dataset/images/eager_mode.jpeg rename to docs/mindspore/source_zh_cn/model_train/dataset/images/eager_mode.jpeg diff --git a/tutorials/experts/source_zh_cn/dataset/images/map.eddx b/docs/mindspore/source_zh_cn/model_train/dataset/images/map.eddx similarity index 100% rename from tutorials/experts/source_zh_cn/dataset/images/map.eddx rename to docs/mindspore/source_zh_cn/model_train/dataset/images/map.eddx diff --git a/tutorials/source_zh_cn/advanced/dataset/images/mindrecord.graffle b/docs/mindspore/source_zh_cn/model_train/dataset/images/mindrecord.graffle similarity index 100% rename from tutorials/source_zh_cn/advanced/dataset/images/mindrecord.graffle rename to docs/mindspore/source_zh_cn/model_train/dataset/images/mindrecord.graffle diff --git a/tutorials/source_zh_cn/advanced/dataset/images/mindrecord.png b/docs/mindspore/source_zh_cn/model_train/dataset/images/mindrecord.png similarity index 100% rename from tutorials/source_zh_cn/advanced/dataset/images/mindrecord.png rename to docs/mindspore/source_zh_cn/model_train/dataset/images/mindrecord.png diff --git a/tutorials/experts/source_zh_cn/dataset/images/mindrecord.pptx b/docs/mindspore/source_zh_cn/model_train/dataset/images/mindrecord.pptx similarity index 100% rename from tutorials/experts/source_zh_cn/dataset/images/mindrecord.pptx rename to docs/mindspore/source_zh_cn/model_train/dataset/images/mindrecord.pptx diff --git a/tutorials/experts/source_zh_cn/dataset/images/offload_process.PNG b/docs/mindspore/source_zh_cn/model_train/dataset/images/offload_process.PNG similarity index 100% rename from tutorials/experts/source_zh_cn/dataset/images/offload_process.PNG rename to docs/mindspore/source_zh_cn/model_train/dataset/images/offload_process.PNG diff --git a/tutorials/source_zh_cn/advanced/dataset/images/op_batch.graffle b/docs/mindspore/source_zh_cn/model_train/dataset/images/op_batch.graffle similarity index 100% rename from tutorials/source_zh_cn/advanced/dataset/images/op_batch.graffle rename to docs/mindspore/source_zh_cn/model_train/dataset/images/op_batch.graffle diff --git a/tutorials/source_zh_cn/advanced/dataset/images/op_batch.png b/docs/mindspore/source_zh_cn/model_train/dataset/images/op_batch.png similarity index 100% rename from tutorials/source_zh_cn/advanced/dataset/images/op_batch.png rename to docs/mindspore/source_zh_cn/model_train/dataset/images/op_batch.png diff --git a/tutorials/source_zh_cn/advanced/dataset/images/op_shuffle.graffle b/docs/mindspore/source_zh_cn/model_train/dataset/images/op_shuffle.graffle similarity index 100% rename from tutorials/source_zh_cn/advanced/dataset/images/op_shuffle.graffle rename to docs/mindspore/source_zh_cn/model_train/dataset/images/op_shuffle.graffle diff --git a/tutorials/source_zh_cn/advanced/dataset/images/op_shuffle.png b/docs/mindspore/source_zh_cn/model_train/dataset/images/op_shuffle.png similarity index 100% rename from tutorials/source_zh_cn/advanced/dataset/images/op_shuffle.png rename to docs/mindspore/source_zh_cn/model_train/dataset/images/op_shuffle.png diff --git a/tutorials/experts/source_zh_cn/dataset/images/operation_fusion.png b/docs/mindspore/source_zh_cn/model_train/dataset/images/operation_fusion.png similarity index 100% rename from tutorials/experts/source_zh_cn/dataset/images/operation_fusion.png rename to docs/mindspore/source_zh_cn/model_train/dataset/images/operation_fusion.png diff --git a/tutorials/experts/source_zh_cn/dataset/images/pipeline.png b/docs/mindspore/source_zh_cn/model_train/dataset/images/pipeline.png similarity index 100% rename from tutorials/experts/source_zh_cn/dataset/images/pipeline.png rename to docs/mindspore/source_zh_cn/model_train/dataset/images/pipeline.png diff --git a/tutorials/source_zh_cn/advanced/dataset/images/pipeline_mode.jpeg b/docs/mindspore/source_zh_cn/model_train/dataset/images/pipeline_mode.jpeg similarity index 100% rename from tutorials/source_zh_cn/advanced/dataset/images/pipeline_mode.jpeg rename to docs/mindspore/source_zh_cn/model_train/dataset/images/pipeline_mode.jpeg diff --git a/tutorials/experts/source_zh_cn/dataset/images/shuffle_performance_scheme.png b/docs/mindspore/source_zh_cn/model_train/dataset/images/shuffle_performance_scheme.png similarity index 100% rename from tutorials/experts/source_zh_cn/dataset/images/shuffle_performance_scheme.png rename to docs/mindspore/source_zh_cn/model_train/dataset/images/shuffle_performance_scheme.png diff --git a/tutorials/experts/source_zh_cn/dataset/optimize.ipynb b/docs/mindspore/source_zh_cn/model_train/dataset/optimize.ipynb similarity index 100% rename from tutorials/experts/source_zh_cn/dataset/optimize.ipynb rename to docs/mindspore/source_zh_cn/model_train/dataset/optimize.ipynb diff --git a/docs/mindspore/source_zh_cn/model_train/dataset/overview.md b/docs/mindspore/source_zh_cn/model_train/dataset/overview.md new file mode 100644 index 0000000000..2f0bdc2554 --- /dev/null +++ b/docs/mindspore/source_zh_cn/model_train/dataset/overview.md @@ -0,0 +1,3 @@ +# 数据处理概述 + +[![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_zh_cn/model_train/dataset/overview.md) diff --git a/tutorials/source_zh_cn/advanced/dataset/python_objects.ipynb b/docs/mindspore/source_zh_cn/model_train/dataset/python_objects.ipynb similarity index 100% rename from tutorials/source_zh_cn/advanced/dataset/python_objects.ipynb rename to docs/mindspore/source_zh_cn/model_train/dataset/python_objects.ipynb diff --git a/tutorials/source_zh_cn/advanced/dataset/record.ipynb b/docs/mindspore/source_zh_cn/model_train/dataset/record.ipynb similarity index 100% rename from tutorials/source_zh_cn/advanced/dataset/record.ipynb rename to docs/mindspore/source_zh_cn/model_train/dataset/record.ipynb diff --git a/tutorials/source_zh_cn/advanced/dataset/sampler.ipynb b/docs/mindspore/source_zh_cn/model_train/dataset/sampler.ipynb similarity index 100% rename from tutorials/source_zh_cn/advanced/dataset/sampler.ipynb rename to docs/mindspore/source_zh_cn/model_train/dataset/sampler.ipynb diff --git a/tutorials/experts/source_zh_cn/debug/aoe.md b/docs/mindspore/source_zh_cn/model_train/debug/aoe.md similarity index 100% rename from tutorials/experts/source_zh_cn/debug/aoe.md rename to docs/mindspore/source_zh_cn/model_train/debug/aoe.md diff --git a/docs/mindspore/source_zh_cn/model_train/debug/debug_tools.rst b/docs/mindspore/source_zh_cn/model_train/debug/debug_tools.rst new file mode 100644 index 0000000000..2c23457d6f --- /dev/null +++ b/docs/mindspore/source_zh_cn/model_train/debug/debug_tools.rst @@ -0,0 +1,10 @@ +调试工具集 +============ + +.. toctree:: + :maxdepth: 1 + + dump + rdr + fault_recover + sdc diff --git a/tutorials/experts/source_zh_cn/debug/dump.md b/docs/mindspore/source_zh_cn/model_train/debug/dump.md similarity index 100% rename from tutorials/experts/source_zh_cn/debug/dump.md rename to docs/mindspore/source_zh_cn/model_train/debug/dump.md diff --git a/tutorials/source_zh_cn/advanced/error_analysis.rst b/docs/mindspore/source_zh_cn/model_train/debug/error_analysis.rst similarity index 100% rename from tutorials/source_zh_cn/advanced/error_analysis.rst rename to docs/mindspore/source_zh_cn/model_train/debug/error_analysis.rst diff --git a/tutorials/source_zh_cn/advanced/error_analysis/cann_error_cases.md b/docs/mindspore/source_zh_cn/model_train/debug/error_analysis/cann_error_cases.md similarity index 100% rename from tutorials/source_zh_cn/advanced/error_analysis/cann_error_cases.md rename to docs/mindspore/source_zh_cn/model_train/debug/error_analysis/cann_error_cases.md diff --git a/tutorials/source_zh_cn/advanced/error_analysis/error_scenario_analysis.md b/docs/mindspore/source_zh_cn/model_train/debug/error_analysis/error_scenario_analysis.md similarity index 100% rename from tutorials/source_zh_cn/advanced/error_analysis/error_scenario_analysis.md rename to docs/mindspore/source_zh_cn/model_train/debug/error_analysis/error_scenario_analysis.md diff --git a/tutorials/source_zh_cn/advanced/error_analysis/images/dot_to_png.png b/docs/mindspore/source_zh_cn/model_train/debug/error_analysis/images/dot_to_png.png similarity index 100% rename from tutorials/source_zh_cn/advanced/error_analysis/images/dot_to_png.png rename to docs/mindspore/source_zh_cn/model_train/debug/error_analysis/images/dot_to_png.png diff --git a/tutorials/source_zh_cn/advanced/error_analysis/images/minddata_errmsg.png b/docs/mindspore/source_zh_cn/model_train/debug/error_analysis/images/minddata_errmsg.png similarity index 100% rename from tutorials/source_zh_cn/advanced/error_analysis/images/minddata_errmsg.png rename to docs/mindspore/source_zh_cn/model_train/debug/error_analysis/images/minddata_errmsg.png diff --git a/tutorials/source_zh_cn/advanced/error_analysis/images/pynative_errmsg.png b/docs/mindspore/source_zh_cn/model_train/debug/error_analysis/images/pynative_errmsg.png similarity index 100% rename from tutorials/source_zh_cn/advanced/error_analysis/images/pynative_errmsg.png rename to docs/mindspore/source_zh_cn/model_train/debug/error_analysis/images/pynative_errmsg.png diff --git a/tutorials/source_zh_cn/advanced/error_analysis/minddata_debug.md b/docs/mindspore/source_zh_cn/model_train/debug/error_analysis/minddata_debug.md similarity index 100% rename from tutorials/source_zh_cn/advanced/error_analysis/minddata_debug.md rename to docs/mindspore/source_zh_cn/model_train/debug/error_analysis/minddata_debug.md diff --git a/tutorials/source_zh_cn/advanced/error_analysis/mindir.md b/docs/mindspore/source_zh_cn/model_train/debug/error_analysis/mindir.md similarity index 100% rename from tutorials/source_zh_cn/advanced/error_analysis/mindir.md rename to docs/mindspore/source_zh_cn/model_train/debug/error_analysis/mindir.md diff --git a/tutorials/source_zh_cn/advanced/error_analysis/mindrt_debug.md b/docs/mindspore/source_zh_cn/model_train/debug/error_analysis/mindrt_debug.md similarity index 100% rename from tutorials/source_zh_cn/advanced/error_analysis/mindrt_debug.md rename to docs/mindspore/source_zh_cn/model_train/debug/error_analysis/mindrt_debug.md diff --git a/tutorials/experts/source_zh_cn/debug/fault_recover.md b/docs/mindspore/source_zh_cn/model_train/debug/fault_recover.md similarity index 100% rename from tutorials/experts/source_zh_cn/debug/fault_recover.md rename to docs/mindspore/source_zh_cn/model_train/debug/fault_recover.md diff --git a/tutorials/experts/source_zh_cn/optimize/graph_fusion_engine.ipynb b/docs/mindspore/source_zh_cn/model_train/debug/graph_fusion_engine.ipynb similarity index 100% rename from tutorials/experts/source_zh_cn/optimize/graph_fusion_engine.ipynb rename to docs/mindspore/source_zh_cn/model_train/debug/graph_fusion_engine.ipynb diff --git a/docs/mindspore/source_zh_cn/model_train/debug/images/data-and-graph-sink.eddx b/docs/mindspore/source_zh_cn/model_train/debug/images/data-and-graph-sink.eddx new file mode 100644 index 0000000000000000000000000000000000000000..ac699504b7016c7bf26787615d0d86fed5d1cd14 GIT binary patch literal 425621 zcmV)tK$pKzO9KQH0000809U4nRkwWFHm(5x0NDco01N;C0Az1tb!}yCbS`*pY=x6i zZ`&Xgh2JObKOo+nf)~4P6tBwcri+xeQ@ys&9$Y&t7%GgrcGLcQ!Q0~1O*S4ZalXUB z+za#5$3~(DFs;xk#dJb20>v~Js!nldt02Lr@87{ND~H%mjIN3l-wB0XEONs~XIfRF{w?%kp=D>? zKIk^Z5ux~K1TV^V>lt}TZti($;Zs?|W!Zo?EEntIY_xo%znvSw|ADVN3C8o!*EjoC zy90w13JzQRKYTDyZueWROugu=UYAe0v->Sg^MA)$vu*aPO0V&%R@y)gRi z?0ieD>;cc21ZIt3rOb?O+g;pH|M}6lk@Ld3yCh`0vn-eu4}E)9io@e5!0WBo;z7&r zg;(e#8nl8L0Cgw0-Sq4vBxCpyM7`xNI3^58fTeAtfw0NaNL01p5F0B~VvWpgiZVP|DA zE_iKh?7iEL97%Q{_`bmYLkYf-PoBQADp~6JpSVDjnDS)-%>aJ z)&KNA{ttH^&AyoLJlHc`5V^6l|JCXI?hX6fjh#U;gy>fBDn@ z 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%0A5%?41@nLkW^~acYSuVY43BZs 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 literal 0 HcmV?d00001 diff --git a/tutorials/source_zh_cn/advanced/images/error_debug.png b/docs/mindspore/source_zh_cn/model_train/debug/images/error_debug.png similarity index 100% rename from tutorials/source_zh_cn/advanced/images/error_debug.png rename to docs/mindspore/source_zh_cn/model_train/debug/images/error_debug.png diff --git a/tutorials/source_zh_cn/advanced/images/graph_errmsg.png b/docs/mindspore/source_zh_cn/model_train/debug/images/graph_errmsg.png similarity index 100% rename from tutorials/source_zh_cn/advanced/images/graph_errmsg.png rename to docs/mindspore/source_zh_cn/model_train/debug/images/graph_errmsg.png diff --git a/docs/mindspore/source_zh_cn/model_train/debug/images/graph_kernel_example_custom_op.png b/docs/mindspore/source_zh_cn/model_train/debug/images/graph_kernel_example_custom_op.png new file mode 100644 index 0000000000000000000000000000000000000000..22dfddef960b7792bfa181a1ad0356c6aed97c53 GIT binary patch literal 25261 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

    7+&p7<~RdT%7sl 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 xQg3~g8Nhhya`f+V9mo# - optimize/execution_opt - optimize/graph_fusion_engine - optimize/mem_reuse + program_form/overview + program_form/pynative + program_form/static_graph + program_form/jit + program_form/interface + program_form/index_support .. toctree:: :glob: :maxdepth: 1 - :caption: 算法优化 - - optimize/gradient_accumulation - optimize/thor + :caption: 自定义高阶编程 + + custom_program/overview + custom_program/layer + custom_program/op_custom + custom_program/initializer + custom_program/loss + custom_program/optimizer + custom_program/fusion_pass + custom_program/network_custom + custom_program/hook_program .. toctree:: :glob: :maxdepth: 1 - :caption: 高阶函数式编程 + :caption: 数据加载与处理 - vmap/vmap - func_programming/Jacobians_Hessians - func_programming/per_sample_gradients + dataset/overview + dataset/sampler + dataset/record + dataset/eager + dataset/python_objects + dataset/augment + dataset/cache + dataset/optimize .. toctree:: :glob: :maxdepth: 1 - :caption: 数据处理 + :caption: 训练流程 - dataset/augment - dataset/cache - dataset/optimize + train_process/overview + train_process/model + train_process/dynamic_shape + train_process/train_optimize + train_process/func_programming + train_process/derivation + train_process/algorithm_optimize .. toctree:: :glob: :maxdepth: 1 - :caption: 模型推理 + :caption: 分布式并行 - infer/inference - infer/model_compression + parallel/overview + parallel/startup_method + parallel/data_parallel + parallel/semi_auto_parallel + parallel/auto_parallel + parallel/manual_parallel + parallel/parameter_server_training + parallel/model_save_load + parallel/recover + parallel/optimize_technique + parallel/others + parallel/distributed_case .. toctree:: :glob: :maxdepth: 1 - :caption: 复杂问题调试 + :caption: 调试调优 - debug/dump - debug/aoe - debug/rdr - debug/fault_recover - debug/sdc + debug/overview + debug/error_analysis + debug/debug_tools + debug/opt_tools + 报错地图↗ diff --git a/tutorials/experts/source_zh_cn/parallel/advanced_operator_parallel.md b/docs/mindspore/source_zh_cn/model_train/parallel/advanced_operator_parallel.md similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/advanced_operator_parallel.md rename to docs/mindspore/source_zh_cn/model_train/parallel/advanced_operator_parallel.md diff --git a/tutorials/experts/source_zh_cn/parallel/auto_parallel.rst b/docs/mindspore/source_zh_cn/model_train/parallel/auto_parallel.rst similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/auto_parallel.rst rename to docs/mindspore/source_zh_cn/model_train/parallel/auto_parallel.rst diff --git a/tutorials/experts/source_zh_cn/parallel/comm_fusion.md b/docs/mindspore/source_zh_cn/model_train/parallel/comm_fusion.md similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/comm_fusion.md rename to docs/mindspore/source_zh_cn/model_train/parallel/comm_fusion.md diff --git a/tutorials/experts/source_zh_cn/parallel/comm_subgraph.md b/docs/mindspore/source_zh_cn/model_train/parallel/comm_subgraph.md similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/comm_subgraph.md rename to docs/mindspore/source_zh_cn/model_train/parallel/comm_subgraph.md diff --git a/tutorials/experts/source_zh_cn/parallel/data_parallel.md b/docs/mindspore/source_zh_cn/model_train/parallel/data_parallel.md similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/data_parallel.md rename to docs/mindspore/source_zh_cn/model_train/parallel/data_parallel.md diff --git a/tutorials/experts/source_zh_cn/parallel/dataset_slice.md b/docs/mindspore/source_zh_cn/model_train/parallel/dataset_slice.md similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/dataset_slice.md rename to docs/mindspore/source_zh_cn/model_train/parallel/dataset_slice.md diff --git a/tutorials/experts/source_zh_cn/parallel/disaster_recover.md b/docs/mindspore/source_zh_cn/model_train/parallel/disaster_recover.md similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/disaster_recover.md rename to docs/mindspore/source_zh_cn/model_train/parallel/disaster_recover.md diff --git a/tutorials/experts/source_zh_cn/parallel/distributed_case.rst b/docs/mindspore/source_zh_cn/model_train/parallel/distributed_case.rst similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/distributed_case.rst rename to docs/mindspore/source_zh_cn/model_train/parallel/distributed_case.rst diff --git a/tutorials/experts/source_zh_cn/parallel/distributed_gradient_accumulation.md b/docs/mindspore/source_zh_cn/model_train/parallel/distributed_gradient_accumulation.md similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/distributed_gradient_accumulation.md rename to docs/mindspore/source_zh_cn/model_train/parallel/distributed_gradient_accumulation.md diff --git a/tutorials/experts/source_zh_cn/parallel/distributed_graph_partition.md b/docs/mindspore/source_zh_cn/model_train/parallel/distributed_graph_partition.md similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/distributed_graph_partition.md rename to docs/mindspore/source_zh_cn/model_train/parallel/distributed_graph_partition.md diff --git a/tutorials/experts/source_zh_cn/parallel/dynamic_cluster.md b/docs/mindspore/source_zh_cn/model_train/parallel/dynamic_cluster.md similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/dynamic_cluster.md rename to docs/mindspore/source_zh_cn/model_train/parallel/dynamic_cluster.md diff --git a/tutorials/experts/source_zh_cn/parallel/fault_recover.md b/docs/mindspore/source_zh_cn/model_train/parallel/fault_recover.md similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/fault_recover.md rename to docs/mindspore/source_zh_cn/model_train/parallel/fault_recover.md diff --git a/tutorials/experts/source_zh_cn/parallel/host_device_training.md b/docs/mindspore/source_zh_cn/model_train/parallel/host_device_training.md similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/host_device_training.md rename to docs/mindspore/source_zh_cn/model_train/parallel/host_device_training.md diff --git a/tutorials/experts/source_zh_cn/parallel/images/advanced_operator_parallel_view1.PNG b/docs/mindspore/source_zh_cn/model_train/parallel/images/advanced_operator_parallel_view1.PNG similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/images/advanced_operator_parallel_view1.PNG rename to docs/mindspore/source_zh_cn/model_train/parallel/images/advanced_operator_parallel_view1.PNG diff --git a/tutorials/experts/source_zh_cn/parallel/images/advanced_operator_parallel_view2.PNG b/docs/mindspore/source_zh_cn/model_train/parallel/images/advanced_operator_parallel_view2.PNG similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/images/advanced_operator_parallel_view2.PNG rename to docs/mindspore/source_zh_cn/model_train/parallel/images/advanced_operator_parallel_view2.PNG diff --git a/tutorials/experts/source_zh_cn/parallel/images/checkpoint_integrate_process.pptx b/docs/mindspore/source_zh_cn/model_train/parallel/images/checkpoint_integrate_process.pptx similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/images/checkpoint_integrate_process.pptx rename to docs/mindspore/source_zh_cn/model_train/parallel/images/checkpoint_integrate_process.pptx diff --git a/tutorials/experts/source_zh_cn/parallel/images/comm_subgraph.png b/docs/mindspore/source_zh_cn/model_train/parallel/images/comm_subgraph.png similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/images/comm_subgraph.png rename to docs/mindspore/source_zh_cn/model_train/parallel/images/comm_subgraph.png diff --git a/tutorials/experts/source_zh_cn/parallel/images/data_parallel.png b/docs/mindspore/source_zh_cn/model_train/parallel/images/data_parallel.png similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/images/data_parallel.png rename to docs/mindspore/source_zh_cn/model_train/parallel/images/data_parallel.png diff --git a/tutorials/experts/source_zh_cn/parallel/images/distributed_graph_partition.png b/docs/mindspore/source_zh_cn/model_train/parallel/images/distributed_graph_partition.png similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/images/distributed_graph_partition.png rename to docs/mindspore/source_zh_cn/model_train/parallel/images/distributed_graph_partition.png diff --git a/tutorials/experts/source_zh_cn/parallel/images/host_device_image_0_zh.png b/docs/mindspore/source_zh_cn/model_train/parallel/images/host_device_image_0_zh.png similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/images/host_device_image_0_zh.png rename to docs/mindspore/source_zh_cn/model_train/parallel/images/host_device_image_0_zh.png diff --git a/tutorials/experts/source_zh_cn/parallel/images/host_device_image_1_zh.png b/docs/mindspore/source_zh_cn/model_train/parallel/images/host_device_image_1_zh.png similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/images/host_device_image_1_zh.png rename to docs/mindspore/source_zh_cn/model_train/parallel/images/host_device_image_1_zh.png diff --git a/tutorials/experts/source_zh_cn/parallel/images/megatron.png b/docs/mindspore/source_zh_cn/model_train/parallel/images/megatron.png similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/images/megatron.png rename to docs/mindspore/source_zh_cn/model_train/parallel/images/megatron.png diff --git a/tutorials/experts/source_zh_cn/parallel/images/memory_offload.png b/docs/mindspore/source_zh_cn/model_train/parallel/images/memory_offload.png similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/images/memory_offload.png rename to docs/mindspore/source_zh_cn/model_train/parallel/images/memory_offload.png diff --git a/tutorials/experts/source_zh_cn/parallel/images/mindspore.png b/docs/mindspore/source_zh_cn/model_train/parallel/images/mindspore.png similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/images/mindspore.png rename to docs/mindspore/source_zh_cn/model_train/parallel/images/mindspore.png diff --git a/tutorials/experts/source_zh_cn/parallel/images/operator_parallel_image_0_zh.png b/docs/mindspore/source_zh_cn/model_train/parallel/images/operator_parallel_image_0_zh.png similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/images/operator_parallel_image_0_zh.png rename to docs/mindspore/source_zh_cn/model_train/parallel/images/operator_parallel_image_0_zh.png diff --git a/tutorials/experts/source_zh_cn/parallel/images/operator_parallel_image_1_zh.png b/docs/mindspore/source_zh_cn/model_train/parallel/images/operator_parallel_image_1_zh.png similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/images/operator_parallel_image_1_zh.png rename to docs/mindspore/source_zh_cn/model_train/parallel/images/operator_parallel_image_1_zh.png diff --git a/tutorials/experts/source_zh_cn/parallel/images/operator_parallel_image_2_zh.png b/docs/mindspore/source_zh_cn/model_train/parallel/images/operator_parallel_image_2_zh.png similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/images/operator_parallel_image_2_zh.png rename to docs/mindspore/source_zh_cn/model_train/parallel/images/operator_parallel_image_2_zh.png diff --git a/tutorials/experts/source_zh_cn/parallel/images/operator_parallel_image_3_zh.png b/docs/mindspore/source_zh_cn/model_train/parallel/images/operator_parallel_image_3_zh.png similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/images/operator_parallel_image_3_zh.png rename to docs/mindspore/source_zh_cn/model_train/parallel/images/operator_parallel_image_3_zh.png diff --git a/tutorials/experts/source_zh_cn/parallel/images/operator_parallel_image_4_zh.png b/docs/mindspore/source_zh_cn/model_train/parallel/images/operator_parallel_image_4_zh.png similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/images/operator_parallel_image_4_zh.png rename to docs/mindspore/source_zh_cn/model_train/parallel/images/operator_parallel_image_4_zh.png diff --git a/tutorials/experts/source_zh_cn/parallel/images/optimizer_parallel_image_0_zh.png b/docs/mindspore/source_zh_cn/model_train/parallel/images/optimizer_parallel_image_0_zh.png similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/images/optimizer_parallel_image_0_zh.png rename to docs/mindspore/source_zh_cn/model_train/parallel/images/optimizer_parallel_image_0_zh.png diff --git a/tutorials/experts/source_zh_cn/parallel/images/optimizer_parallel_image_1_zh.png b/docs/mindspore/source_zh_cn/model_train/parallel/images/optimizer_parallel_image_1_zh.png similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/images/optimizer_parallel_image_1_zh.png rename to docs/mindspore/source_zh_cn/model_train/parallel/images/optimizer_parallel_image_1_zh.png diff --git a/tutorials/experts/source_zh_cn/parallel/images/pangu_strategy.png b/docs/mindspore/source_zh_cn/model_train/parallel/images/pangu_strategy.png similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/images/pangu_strategy.png rename to docs/mindspore/source_zh_cn/model_train/parallel/images/pangu_strategy.png diff --git a/tutorials/experts/source_zh_cn/parallel/images/pipeline_parallel_image_0_zh.png b/docs/mindspore/source_zh_cn/model_train/parallel/images/pipeline_parallel_image_0_zh.png similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/images/pipeline_parallel_image_0_zh.png rename to docs/mindspore/source_zh_cn/model_train/parallel/images/pipeline_parallel_image_0_zh.png diff --git a/tutorials/experts/source_zh_cn/parallel/images/pipeline_parallel_image_1_zh.png b/docs/mindspore/source_zh_cn/model_train/parallel/images/pipeline_parallel_image_1_zh.png similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/images/pipeline_parallel_image_1_zh.png rename to docs/mindspore/source_zh_cn/model_train/parallel/images/pipeline_parallel_image_1_zh.png diff --git a/tutorials/experts/source_zh_cn/parallel/images/pipeline_parallel_image_2_zh.png b/docs/mindspore/source_zh_cn/model_train/parallel/images/pipeline_parallel_image_2_zh.png similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/images/pipeline_parallel_image_2_zh.png rename to docs/mindspore/source_zh_cn/model_train/parallel/images/pipeline_parallel_image_2_zh.png diff --git a/tutorials/experts/source_zh_cn/parallel/images/pynative_jit.png b/docs/mindspore/source_zh_cn/model_train/parallel/images/pynative_jit.png similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/images/pynative_jit.png rename to docs/mindspore/source_zh_cn/model_train/parallel/images/pynative_jit.png diff --git a/tutorials/experts/source_zh_cn/parallel/images/recompute_image_0_zh.png b/docs/mindspore/source_zh_cn/model_train/parallel/images/recompute_image_0_zh.png similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/images/recompute_image_0_zh.png rename to docs/mindspore/source_zh_cn/model_train/parallel/images/recompute_image_0_zh.png diff --git a/tutorials/experts/source_zh_cn/parallel/images/recompute_image_1_zh.png b/docs/mindspore/source_zh_cn/model_train/parallel/images/recompute_image_1_zh.png similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/images/recompute_image_1_zh.png rename to docs/mindspore/source_zh_cn/model_train/parallel/images/recompute_image_1_zh.png diff --git a/tutorials/experts/source_zh_cn/parallel/images/sharding_propagation_zh.png b/docs/mindspore/source_zh_cn/model_train/parallel/images/sharding_propagation_zh.png similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/images/sharding_propagation_zh.png rename to docs/mindspore/source_zh_cn/model_train/parallel/images/sharding_propagation_zh.png diff --git a/tutorials/experts/source_zh_cn/parallel/images/sp_case1_zh.png b/docs/mindspore/source_zh_cn/model_train/parallel/images/sp_case1_zh.png similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/images/sp_case1_zh.png rename to docs/mindspore/source_zh_cn/model_train/parallel/images/sp_case1_zh.png diff --git a/tutorials/experts/source_zh_cn/parallel/images/sp_case2_zh.png b/docs/mindspore/source_zh_cn/model_train/parallel/images/sp_case2_zh.png similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/images/sp_case2_zh.png rename to docs/mindspore/source_zh_cn/model_train/parallel/images/sp_case2_zh.png diff --git a/tutorials/experts/source_zh_cn/parallel/images/sp_case3_zh.png b/docs/mindspore/source_zh_cn/model_train/parallel/images/sp_case3_zh.png similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/images/sp_case3_zh.png rename to docs/mindspore/source_zh_cn/model_train/parallel/images/sp_case3_zh.png diff --git a/tutorials/experts/source_zh_cn/parallel/images/tensor_layout_zh.png b/docs/mindspore/source_zh_cn/model_train/parallel/images/tensor_layout_zh.png similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/images/tensor_layout_zh.png rename to docs/mindspore/source_zh_cn/model_train/parallel/images/tensor_layout_zh.png diff --git a/tutorials/experts/source_zh_cn/parallel/images/tensor_redistribution_zh.png b/docs/mindspore/source_zh_cn/model_train/parallel/images/tensor_redistribution_zh.png similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/images/tensor_redistribution_zh.png rename to docs/mindspore/source_zh_cn/model_train/parallel/images/tensor_redistribution_zh.png diff --git a/tutorials/experts/source_zh_cn/parallel/manual_parallel.md b/docs/mindspore/source_zh_cn/model_train/parallel/manual_parallel.md similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/manual_parallel.md rename to docs/mindspore/source_zh_cn/model_train/parallel/manual_parallel.md diff --git a/tutorials/experts/source_zh_cn/parallel/memory_offload.md b/docs/mindspore/source_zh_cn/model_train/parallel/memory_offload.md similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/memory_offload.md rename to docs/mindspore/source_zh_cn/model_train/parallel/memory_offload.md diff --git a/tutorials/experts/source_zh_cn/parallel/model_loading.md b/docs/mindspore/source_zh_cn/model_train/parallel/model_loading.md similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/model_loading.md rename to docs/mindspore/source_zh_cn/model_train/parallel/model_loading.md diff --git a/tutorials/experts/source_zh_cn/parallel/model_save_load.rst b/docs/mindspore/source_zh_cn/model_train/parallel/model_save_load.rst similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/model_save_load.rst rename to docs/mindspore/source_zh_cn/model_train/parallel/model_save_load.rst diff --git a/tutorials/experts/source_zh_cn/parallel/model_saving.md b/docs/mindspore/source_zh_cn/model_train/parallel/model_saving.md similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/model_saving.md rename to docs/mindspore/source_zh_cn/model_train/parallel/model_saving.md diff --git a/tutorials/experts/source_zh_cn/parallel/model_transformation.md b/docs/mindspore/source_zh_cn/model_train/parallel/model_transformation.md similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/model_transformation.md rename to docs/mindspore/source_zh_cn/model_train/parallel/model_transformation.md diff --git a/tutorials/experts/source_zh_cn/parallel/mpirun.md b/docs/mindspore/source_zh_cn/model_train/parallel/mpirun.md similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/mpirun.md rename to docs/mindspore/source_zh_cn/model_train/parallel/mpirun.md diff --git a/tutorials/experts/source_zh_cn/parallel/ms_operator.md b/docs/mindspore/source_zh_cn/model_train/parallel/ms_operator.md similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/ms_operator.md rename to docs/mindspore/source_zh_cn/model_train/parallel/ms_operator.md diff --git a/tutorials/experts/source_zh_cn/parallel/msrun_launcher.md b/docs/mindspore/source_zh_cn/model_train/parallel/msrun_launcher.md similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/msrun_launcher.md rename to docs/mindspore/source_zh_cn/model_train/parallel/msrun_launcher.md diff --git a/tutorials/experts/source_zh_cn/parallel/multiple_copy.md b/docs/mindspore/source_zh_cn/model_train/parallel/multiple_copy.md similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/multiple_copy.md rename to docs/mindspore/source_zh_cn/model_train/parallel/multiple_copy.md diff --git a/tutorials/experts/source_zh_cn/parallel/multiple_mix.md b/docs/mindspore/source_zh_cn/model_train/parallel/multiple_mix.md similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/multiple_mix.md rename to docs/mindspore/source_zh_cn/model_train/parallel/multiple_mix.md diff --git a/tutorials/experts/source_zh_cn/parallel/operator_parallel.md b/docs/mindspore/source_zh_cn/model_train/parallel/operator_parallel.md similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/operator_parallel.md rename to docs/mindspore/source_zh_cn/model_train/parallel/operator_parallel.md diff --git a/tutorials/experts/source_zh_cn/parallel/optimize_technique.rst b/docs/mindspore/source_zh_cn/model_train/parallel/optimize_technique.rst similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/optimize_technique.rst rename to docs/mindspore/source_zh_cn/model_train/parallel/optimize_technique.rst diff --git a/tutorials/experts/source_zh_cn/parallel/optimizer_parallel.md b/docs/mindspore/source_zh_cn/model_train/parallel/optimizer_parallel.md similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/optimizer_parallel.md rename to docs/mindspore/source_zh_cn/model_train/parallel/optimizer_parallel.md diff --git a/tutorials/experts/source_zh_cn/parallel/others.rst b/docs/mindspore/source_zh_cn/model_train/parallel/others.rst similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/others.rst rename to docs/mindspore/source_zh_cn/model_train/parallel/others.rst diff --git a/tutorials/experts/source_zh_cn/parallel/overview.md b/docs/mindspore/source_zh_cn/model_train/parallel/overview.md similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/overview.md rename to docs/mindspore/source_zh_cn/model_train/parallel/overview.md diff --git a/tutorials/experts/source_zh_cn/parallel/pangu_alpha.md b/docs/mindspore/source_zh_cn/model_train/parallel/pangu_alpha.md similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/pangu_alpha.md rename to docs/mindspore/source_zh_cn/model_train/parallel/pangu_alpha.md diff --git a/tutorials/experts/source_zh_cn/parallel/parameter_server_training.md b/docs/mindspore/source_zh_cn/model_train/parallel/parameter_server_training.md similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/parameter_server_training.md rename to docs/mindspore/source_zh_cn/model_train/parallel/parameter_server_training.md diff --git a/tutorials/experts/source_zh_cn/parallel/pipeline_parallel.md b/docs/mindspore/source_zh_cn/model_train/parallel/pipeline_parallel.md similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/pipeline_parallel.md rename to docs/mindspore/source_zh_cn/model_train/parallel/pipeline_parallel.md diff --git a/tutorials/experts/source_zh_cn/parallel/rank_table.md b/docs/mindspore/source_zh_cn/model_train/parallel/rank_table.md similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/rank_table.md rename to docs/mindspore/source_zh_cn/model_train/parallel/rank_table.md diff --git a/tutorials/experts/source_zh_cn/parallel/recompute.md b/docs/mindspore/source_zh_cn/model_train/parallel/recompute.md similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/recompute.md rename to docs/mindspore/source_zh_cn/model_train/parallel/recompute.md diff --git a/tutorials/experts/source_zh_cn/parallel/recover.rst b/docs/mindspore/source_zh_cn/model_train/parallel/recover.rst similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/recover.rst rename to docs/mindspore/source_zh_cn/model_train/parallel/recover.rst diff --git a/tutorials/experts/source_zh_cn/parallel/sapp.md b/docs/mindspore/source_zh_cn/model_train/parallel/sapp.md similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/sapp.md rename to docs/mindspore/source_zh_cn/model_train/parallel/sapp.md diff --git a/tutorials/experts/source_zh_cn/parallel/semi_auto_parallel.rst b/docs/mindspore/source_zh_cn/model_train/parallel/semi_auto_parallel.rst similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/semi_auto_parallel.rst rename to docs/mindspore/source_zh_cn/model_train/parallel/semi_auto_parallel.rst diff --git a/tutorials/experts/source_zh_cn/parallel/shard_function_parallel.md b/docs/mindspore/source_zh_cn/model_train/parallel/shard_function_parallel.md similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/shard_function_parallel.md rename to docs/mindspore/source_zh_cn/model_train/parallel/shard_function_parallel.md diff --git a/tutorials/experts/source_zh_cn/parallel/sharding_propagation.md b/docs/mindspore/source_zh_cn/model_train/parallel/sharding_propagation.md similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/sharding_propagation.md rename to docs/mindspore/source_zh_cn/model_train/parallel/sharding_propagation.md diff --git a/tutorials/experts/source_zh_cn/parallel/split_technique.md b/docs/mindspore/source_zh_cn/model_train/parallel/split_technique.md similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/split_technique.md rename to docs/mindspore/source_zh_cn/model_train/parallel/split_technique.md diff --git a/tutorials/experts/source_zh_cn/parallel/startup_method.rst b/docs/mindspore/source_zh_cn/model_train/parallel/startup_method.rst similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/startup_method.rst rename to docs/mindspore/source_zh_cn/model_train/parallel/startup_method.rst diff --git a/tutorials/experts/source_zh_cn/parallel/strategy_select.md b/docs/mindspore/source_zh_cn/model_train/parallel/strategy_select.md similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/strategy_select.md rename to docs/mindspore/source_zh_cn/model_train/parallel/strategy_select.md diff --git a/tutorials/experts/source_zh_cn/parallel/support_dynamic_shape_in_parallel.md b/docs/mindspore/source_zh_cn/model_train/parallel/support_dynamic_shape_in_parallel.md similarity index 100% rename from tutorials/experts/source_zh_cn/parallel/support_dynamic_shape_in_parallel.md rename to docs/mindspore/source_zh_cn/model_train/parallel/support_dynamic_shape_in_parallel.md diff --git a/docs/mindspore/source_zh_cn/model_train/program_form/images/dynamic.png b/docs/mindspore/source_zh_cn/model_train/program_form/images/dynamic.png new file mode 100644 index 0000000000000000000000000000000000000000..219dae25c919ec3bb2a49df919177cb462bc9b94 GIT binary patch literal 3077 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 L+L%-ux!?IG&JOu# literal 0 HcmV?d00001 diff --git a/docs/mindspore/source_zh_cn/note/index_support.ipynb b/docs/mindspore/source_zh_cn/model_train/program_form/index_support.ipynb similarity index 100% rename from docs/mindspore/source_zh_cn/note/index_support.ipynb rename to docs/mindspore/source_zh_cn/model_train/program_form/index_support.ipynb diff --git a/docs/mindspore/source_zh_cn/model_train/program_form/interface.md b/docs/mindspore/source_zh_cn/model_train/program_form/interface.md new file mode 100644 index 0000000000..0bbfe47758 --- /dev/null +++ b/docs/mindspore/source_zh_cn/model_train/program_form/interface.md @@ -0,0 +1,3 @@ +# 接口形态 + +[![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_zh_cn/model_train/program_form/interface.md) diff --git a/docs/mindspore/source_zh_cn/model_train/program_form/overview.md b/docs/mindspore/source_zh_cn/model_train/program_form/overview.md new file mode 100644 index 0000000000..62b4b76d99 --- /dev/null +++ b/docs/mindspore/source_zh_cn/model_train/program_form/overview.md @@ -0,0 +1,3 @@ +# 编程形态概述 + +[![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindspore/source_zh_cn/model_train/program_form/overview.md) \ No newline at end of file diff --git a/docs/mindspore/source_zh_cn/note/static_graph_syntax/operators.md b/docs/mindspore/source_zh_cn/model_train/program_form/static_graph_syntax/operators.md similarity index 100% rename from docs/mindspore/source_zh_cn/note/static_graph_syntax/operators.md rename to docs/mindspore/source_zh_cn/model_train/program_form/static_graph_syntax/operators.md diff --git a/docs/mindspore/source_zh_cn/note/static_graph_syntax/python_builtin_functions.ipynb b/docs/mindspore/source_zh_cn/model_train/program_form/static_graph_syntax/python_builtin_functions.ipynb similarity index 100% rename from docs/mindspore/source_zh_cn/note/static_graph_syntax/python_builtin_functions.ipynb rename to docs/mindspore/source_zh_cn/model_train/program_form/static_graph_syntax/python_builtin_functions.ipynb diff --git a/docs/mindspore/source_zh_cn/note/static_graph_syntax/statements.ipynb b/docs/mindspore/source_zh_cn/model_train/program_form/static_graph_syntax/statements.ipynb similarity index 100% rename from docs/mindspore/source_zh_cn/note/static_graph_syntax/statements.ipynb rename to docs/mindspore/source_zh_cn/model_train/program_form/static_graph_syntax/statements.ipynb diff --git a/tutorials/source_zh_cn/advanced/static_graph_expert_programming.ipynb b/docs/mindspore/source_zh_cn/model_train/program_form/static_graph_syntax/static_graph_expert_programming.ipynb similarity index 100% rename from tutorials/source_zh_cn/advanced/static_graph_expert_programming.ipynb rename to docs/mindspore/source_zh_cn/model_train/program_form/static_graph_syntax/static_graph_expert_programming.ipynb diff --git a/docs/mindspore/source_zh_cn/note/static_graph_syntax_support.ipynb b/docs/mindspore/source_zh_cn/model_train/program_form/static_graph_syntax/static_graph_syntax_support.ipynb similarity index 100% rename from docs/mindspore/source_zh_cn/note/static_graph_syntax_support.ipynb rename to docs/mindspore/source_zh_cn/model_train/program_form/static_graph_syntax/static_graph_syntax_support.ipynb diff --git a/docs/mindspore/source_zh_cn/model_train/train_process/algorithm_optimize.rst b/docs/mindspore/source_zh_cn/model_train/train_process/algorithm_optimize.rst new file mode 100644 index 0000000000..9159f04a79 --- /dev/null +++ b/docs/mindspore/source_zh_cn/model_train/train_process/algorithm_optimize.rst @@ -0,0 +1,8 @@ +高阶训练策略 +============== + +.. toctree:: + :maxdepth: 1 + + optimize/gradient_accumulation + optimize/thor \ No newline at end of file diff --git a/tutorials/source_zh_cn/advanced/derivation.ipynb b/docs/mindspore/source_zh_cn/model_train/train_process/derivation.ipynb similarity index 100% rename from tutorials/source_zh_cn/advanced/derivation.ipynb rename to docs/mindspore/source_zh_cn/model_train/train_process/derivation.ipynb diff --git a/docs/mindspore/source_zh_cn/design/dynamic_shape.md b/docs/mindspore/source_zh_cn/model_train/train_process/dynamic_shape.md similarity index 100% rename from docs/mindspore/source_zh_cn/design/dynamic_shape.md rename to docs/mindspore/source_zh_cn/model_train/train_process/dynamic_shape.md diff --git a/docs/mindspore/source_zh_cn/model_train/train_process/func_programming.rst b/docs/mindspore/source_zh_cn/model_train/train_process/func_programming.rst new file mode 100644 index 0000000000..0e5dc6cb86 --- /dev/null +++ b/docs/mindspore/source_zh_cn/model_train/train_process/func_programming.rst @@ -0,0 +1,9 @@ +高阶函数式编程 +============== + +.. toctree:: + :maxdepth: 1 + + vmap/vmap + func_programming/Jacobians_Hessians + func_programming/per_sample_gradients diff --git a/tutorials/experts/source_zh_cn/func_programming/Jacobians_Hessians.ipynb b/docs/mindspore/source_zh_cn/model_train/train_process/func_programming/Jacobians_Hessians.ipynb similarity index 100% rename from tutorials/experts/source_zh_cn/func_programming/Jacobians_Hessians.ipynb rename to docs/mindspore/source_zh_cn/model_train/train_process/func_programming/Jacobians_Hessians.ipynb diff --git a/tutorials/experts/source_zh_cn/func_programming/per_sample_gradients.ipynb b/docs/mindspore/source_zh_cn/model_train/train_process/func_programming/per_sample_gradients.ipynb similarity index 100% rename from tutorials/experts/source_zh_cn/func_programming/per_sample_gradients.ipynb rename to docs/mindspore/source_zh_cn/model_train/train_process/func_programming/per_sample_gradients.ipynb diff --git a/docs/mindspore/source_zh_cn/model_train/train_process/images/dynamic_shape/static_dynamic_shape_diff.png b/docs/mindspore/source_zh_cn/model_train/train_process/images/dynamic_shape/static_dynamic_shape_diff.png new file mode 100644 index 0000000000000000000000000000000000000000..4ab20b1afce03afc975103f5ea6c644c652711b8 GIT binary patch literal 59949 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�Z*|eRbWW9bJ2D%*8NU7%PGn&l?w!dzB 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 z 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%0A5%?41@nLkW^~acYSuVY43BZs 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 literal 0 HcmV?d00001 diff --git a/docs/mindspore/source_zh_cn/model_train/train_process/optimize/images/graph_kernel_example_custom_op.png b/docs/mindspore/source_zh_cn/model_train/train_process/optimize/images/graph_kernel_example_custom_op.png new file mode 100644 index 0000000000000000000000000000000000000000..22dfddef960b7792bfa181a1ad0356c6aed97c53 GIT binary patch literal 25261 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

    7+&p7<~RdT%7sl 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�Ng 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

    3hC2Vlu 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 literal 0 HcmV?d00001 diff --git a/docs/mindspore/source_zh_cn/model_train/train_process/optimize/images/image-loop-sink.png b/docs/mindspore/source_zh_cn/model_train/train_process/optimize/images/image-loop-sink.png new file mode 100644 index 0000000000000000000000000000000000000000..06f95b58ea47341164680d211875d09498c60d08 GIT binary patch literal 30998 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 IglXvi0>T_WV*mgE literal 0 HcmV?d00001 diff --git a/docs/mindspore/source_zh_cn/model_train/train_process/optimize/images/image-user-view.png b/docs/mindspore/source_zh_cn/model_train/train_process/optimize/images/image-user-view.png new file mode 100644 index 0000000000000000000000000000000000000000..e11f40a426d8604ba57969d32e2ba06f11b42b1d GIT binary patch literal 8083 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 literal 0 HcmV?d00001 diff --git a/docs/mindspore/source_zh_cn/model_train/train_process/optimize/images/image-without-sink.png b/docs/mindspore/source_zh_cn/model_train/train_process/optimize/images/image-without-sink.png new file mode 100644 index 0000000000000000000000000000000000000000..392b830124e42f8c9f686563fbca29117b8dc441 GIT binary patch literal 32485 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%0DmC__VH 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\n", "> - 由于数据下沉对数据集的遍历是连续,当前不支持非连续遍历。\n", ">\n", - "> - 如果在使用数据下沉模式时,出现`fault kernel_name=GetNext`、`GetNext... task error`或者`outputs = self.get_next()`等类似的错误,那么有可能是数据处理过程中某些样本处理太耗时,导致网络计算侧长时间拿不到数据报错,此时可以将`dataset_sink_mode`设置为False再次验证,或者对数据集使用`create_dict_iterator()`接口单独循环数据集,并参考[数据处理性能优化](https://mindspore.cn/tutorials/experts/zh-CN/master/dataset/optimize.html)调优数据处理,保证数据处理高性能。\n", + "> - 如果在使用数据下沉模式时,出现`fault kernel_name=GetNext`、`GetNext... task error`或者`outputs = self.get_next()`等类似的错误,那么有可能是数据处理过程中某些样本处理太耗时,导致网络计算侧长时间拿不到数据报错,此时可以将`dataset_sink_mode`设置为False再次验证,或者对数据集使用`create_dict_iterator()`接口单独循环数据集,并参考[数据处理性能优化](https://mindspore.cn/docs/zh-CN/master/model_train/dataset/optimize.html)调优数据处理,保证数据处理高性能。\n", "\n", "代码样例如下:" ] @@ -277,7 +279,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### `data_sink`实现数据下沉\n", + "#### `data_sink`实现数据下沉\n", "\n", "在MindSpore的函数式编程范式中,还可以使用[data_sink接口](https://mindspore.cn/docs/zh-CN/master/api_python/mindspore/mindspore.data_sink.html)将模型的执行函数和数据集绑定,实现数据下沉。参数含义如下:\n", "\n", @@ -293,7 +295,7 @@ ">\n", "> - 由于数据下沉对数据集的遍历是连续,当前不支持非连续遍历。\n", ">\n", - "> - 如果在使用数据下沉模式时,出现`fault kernel_name=GetNext`、`GetNext... task error`或者`outputs = self.get_next()`等类似的错误,那么有可能是数据处理过程中某些样本处理太耗时,导致网络计算侧长时间拿不到数据报错,此时可以将`dataset_sink_mode`设置为False再次验证,或者对数据集使用`create_dict_iterator()`接口单独循环数据集,并参考[数据处理性能优化](https://mindspore.cn/tutorials/experts/zh-CN/master/dataset/optimize.html)调优数据处理,保证数据处理高性能。\n", + "> - 如果在使用数据下沉模式时,出现`fault kernel_name=GetNext`、`GetNext... task error`或者`outputs = self.get_next()`等类似的错误,那么有可能是数据处理过程中某些样本处理太耗时,导致网络计算侧长时间拿不到数据报错,此时可以将`dataset_sink_mode`设置为False再次验证,或者对数据集使用`create_dict_iterator()`接口单独循环数据集,并参考[数据处理性能优化](https://mindspore.cn/docs/zh-CN/master/model_train/dataset/optimize.html)调优数据处理,保证数据处理高性能。\n", "\n", "代码示例如下:" ] @@ -490,7 +492,10 @@ "2. 每次下沉1个epoch的数据,每个epoch执行结束后返回loss,训练10个epoch需要在Host侧循环调用10次;\n", "3. 单次下沉10个epoch的数据,10个epoch执行结束后返回loss,无需在Host侧进行循环。\n", "\n", - "上述方法中,方法1在每个step结束后与Device进行一次交互,效率较低;方法3在训练中不需要与Device进行交互,执行效率最高,但只能返回最后的一个step的loss。" + "上述方法中,方法1在每个step结束后与Device进行一次交互,效率较低;方法3在训练中不需要与Device进行交互,执行效率最高,但只能返回最后的一个step的loss。\n", + "\n", + "## 与数据流水的协同优化\n", + "\n" ] } ], diff --git a/tutorials/experts/source_zh_cn/vmap/vmap.ipynb b/docs/mindspore/source_zh_cn/model_train/train_process/vmap/vmap.ipynb similarity index 100% rename from tutorials/experts/source_zh_cn/vmap/vmap.ipynb rename to docs/mindspore/source_zh_cn/model_train/train_process/vmap/vmap.ipynb diff --git a/tools/generate_html/base_version.json b/tools/generate_html/base_version.json index d0b466e92b..1511516bb7 100644 --- a/tools/generate_html/base_version.json +++ b/tools/generate_html/base_version.json @@ -6,47 +6,103 @@ "en": "MindSpore" }, "repo_name": "mindspore", - "theme": "theme-docs" - }, - { - "version": "master", - "label": { - "zh": "教程", - "en": "Tutorials" - }, - "repo_name": "tutorials", "submenu": { "zh": [ { - "label": "初学入门", - "url": "/tutorials/zh-CN/master/index.html" + "label": "设计理念", + "url": "/docs/zh-CN/master/design/index.html" + }, + { + "label": "模型构建与训练", + "url": "/docs/zh-CN/master/model_train/index.html" + }, + { + "label": "模型推理", + "url": "/docs/zh-CN/master/model_infer/index.html" }, { - "label": "应用实践", - "url": "/tutorials/application/zh-CN/master/index.html" + "label": "模型迁移", + "url": "/docs/zh-CN/master/migration_guide/index.html" }, { - "label": "深度开发", - "url": "/tutorials/experts/zh-CN/master/index.html" + "label": "API文档", + "url": "/docs/zh-CN/master/api_python/index.html" + }, + { + "label": "大模型专项", + "url": "/docs/zh-CN/master/mindformers/index.html" + }, + { + "label": "香橙派专项", + "url": "/docs/zh-CN/master/orange_pi/index.html" + }, + { + "label": "模型与套件", + "url": "/docs/zh-CN/master/kits_tools/overview.html" + }, + { + "label": "FAQ", + "url": "/docs/zh-CN/master/faq/index.html" + }, + { + "label": "RELEASE NOTES", + "url": "/docs/zh-CN/master/RELEASE.html" } ], "en": [ { - "label": "Quickstart", - "url": "/tutorials/en/master/index.html" + "label": "Design Concept", + "url": "/docs/en/master/design/index.html" }, { - "label": "Application", - "url": "/tutorials/application/en/master/index.html" + "label": "Model Building and Training", + "url": "/docs/en/master/model_train/index.html" }, { - "label": "Experts", - "url": "/tutorials/experts/en/master/index.html" + "label": "Model Inference", + "url": "/docs/en/master/model_infer/index.html" + }, + { + "label": "Model Migration", + "url": "/docs/en/master/migration_guide/index.html" + }, + { + "label": "API", + "url": "/docs/en/master/api_python/index.html" + }, + { + "label": "Large Model Specialization", + "url": "/docs/en/master/mindformers/index.html" + }, + { + "label": "Orange Pi Specialization", + "url": "/docs/en/master/orange_pi/index.html" + }, + { + "label": "Models and Kits", + "url": "/docs/en/master/kits_tools/overview.html" + }, + { + "label": "FAQ", + "url": "/docs/en/master/faq/index.html" + }, + { + "label": "RELEASE NOTES", + "url": "/docs/en/master/RELEASE.html" } ] }, "theme": "theme-tutorials" }, + { + "version": "master", + "label": { + "zh": "教程", + "en": "Tutorials" + }, + "repo_name": "tutorials", + "theme": "theme-docs" + }, { "version": "master", "label": { diff --git a/tools/generate_html/replace_html_menu.py b/tools/generate_html/replace_html_menu.py new file mode 100644 index 0000000000..bdf5cdfef0 --- /dev/null +++ b/tools/generate_html/replace_html_menu.py @@ -0,0 +1,199 @@ +"""修改文档页面左侧大纲目录""" +import re +import os + +# pylint: disable=C0301 + +# 为有index的目录生成基础大纲目录 --> dict +def replace_html_menu(html_path, hm_ds_path): + """替换左侧目录内容""" + rp_dict = dict() + # pylint: disable=W0621 + # pylint: disable=R1702 + # pylint: disable=W0612 + for root, dirs, files in os.walk(hm_ds_path): + for file in files: + if file == 'index.rst' and root != hm_ds_path: + with open(os.path.join(root, file), 'r', encoding='utf-8') as f: + content = f.read() + with open(os.path.join(root.replace(hm_ds_path, html_path), 'index.html'), 'r', encoding='utf-8') as g: + h_content = g.read() + rp_str = '' + if len(re.findall('.. toctree::', content)) == 1: + toc_docs = re.findall('.. toctree::(?:.|\n|)+?\n\n((?:.|\n|)+?)\n\n', content+'\n\n')[0] + toc_list = [i.strip() for i in toc_docs.split('\n') if i.strip() != ''] + for i in toc_list: + title_name = re.findall( + f'

  • (.*?)
  • ', + h_content) + if title_name: + rp_str += f'
  • ' +\ + title_name[0]+'
  • \n' + # 特殊页面处理 + if '/migration_guide' in root: + rp_dict[os.path.join(html_path, 'note', 'api_mapping')] = rp_str + elif '/api_python' in root: + rp_dict[os.path.join(html_path, 'note')] = rp_str + else: + toc_docs = re.findall('.. toctree::(?:.|\n|)+?:caption: (.*)\n\n((?:.|\n|)+?)\n\n', content+'\n') + for title, toc_doc in toc_docs: + toc_list = [i.strip() for i in toc_doc.split('\n') if i.strip() != ''] + rp_str += '

    '+\ + title + '

    \n
      \n' + for i in toc_list: + if '.html' in i: + spec_html = re.findall(r'\<(.*?)\>', i)[0] + spec_title = i.split(' ')[0] + rp_str += f'
    • '+\ + spec_title + '
    • \n' + continue + url_title = re.findall( + f'
    • (.*?)
    • ', + h_content) + if url_title: + title_name = url_title[0][1] + rp_str += f'
    • '+\ + title_name + '
    • \n' + rp_str += '
    \n' + + rp_dict[root.replace(hm_ds_path, html_path)] = rp_str + + # 遍历html页面,替换目录部分 + # pylint: disable=W0621 + for root, dirs, files in os.walk(html_path): + for file in files: + if not file.endswith('.html'): + continue + if file == 'RELEASE.html': + with open(os.path.join(root, file), 'r', encoding='utf-8') as f: + h_content = f.read() + release_str = '
  • Release Notes
  • ' + new_content = re.sub( + '
      (?:.|\n|)+?
    \n\n', f'
      \n{release_str}
    \n\n', + h_content) + with open(os.path.join(root, file), 'w', encoding='utf-8') as f: + f.write(new_content) + continue + for p in rp_dict: + if p in root: + p_key = p + if 'note/api_mapping' in root and p_key+'/api_mapping' in rp_dict: + p_key = p+'/api_mapping' + with open(os.path.join(root, file), 'r', encoding='utf-8') as f: + h_content = f.read() + rp_str = rp_dict[p_key] + # 将每个页面的链接修正成正确的相对路径 + for href in re.findall('href="(.*?)"', rp_str): + abs_p1 = os.path.join(p_key, href) + if 'note/api_mapping' in p_key: + abs_p1 = os.path.join(html_path, 'migration_guide', href) + elif '/note' in p_key and 'api_mapping' not in root: + abs_p1 = os.path.join(html_path, 'api_python', href) + rel_p = os.path.relpath(abs_p1, root) + rel_p = rel_p.replace('\\', '/') + rp_str = re.sub(f'href="{href}"', f'href="{rel_p}"', rp_str) + + current_herf = re.findall( + '
  • )', + h_content) + if 'api_python' in root and file.startswith('mindspore.') and current_herf: + rp_str = re.sub( + f'
  • ', + f'
  • (.*?)', rp_str) + if file_title and file != 'index.html': + toctree_lev = re.findall(f'
  • {file_title[0]}\n
  • \n
  • {file_title[0]}(
      (?:.|\n|)+?
    )\n
  • \n\n\n\n\n', h_content) + if extra_re: + extra_ul = '
      \n' + '\n'.join(re.findall('
    • .*?href="[^#].*?
    • ', extra_re[0])) + '\n
    ' + + extra_ul = re.sub('toctree-l[0-9]', 'toctree-l2', extra_ul) + rp_str = rp_str.replace(f'
  • {file_title[0]}
  • ', + f'
  • {file_title[0]}{extra_ul}
  • ') + # 子目录文件的特殊处理 + elif file != 'index.html': + toctree_lev = re.findall( + '
  • .*?
  • Z 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%0AErPNj{v_p~M$@Feq&*&4CzqZlWVt_eJ!uVhuQ zf=$r^E?p6*WSyhxP_iaK`TuKvv8&(T2%~>&Hvb`Z^F*Su!G6Z`AW&%XW7CHl{6vc2CUd@8arH?PlBpZ$0I&u8E~n7!;lUL%9N zl!A?cUN6Y-QoFf`dhIDzenR;C(Xs3p_B^8Aq6*Kep2l2CW;)X^$(xeN9%3{xwK0OW z6GVmaOJv(-l&E&j>bJr1Nmk=vWHnEes6NAWwrH7J9XSIpFHM+3bZCo?YZus6mDsf! z>hZfWx7=%fakSh^{x4Ad&2@2DSw8Ego7x62ytGLE^eD;e3kIkxpN|c^@>{5PJj!;E zgxc+>T9KOV>9Iqa*EcDVi-F}obomO`#X5FrX_K7w<*c8L^<}MtBUx_RHwjDMKRxS% zrKJ7f_kfO%f#qyp68+})V%NK+BXT8K8C^e`Uzj+f^Akp}l#V~RpmI|F{9ZY*jE*1A zh+EfBC6CDccR=0$H=ypz>G<87C*g}_p3-e)^MbkeI4M@0TTR$s_O}<4o2Z>Bq~Sk* zb21wCn)eicirh|kp(K(h>KtI`^rCQTmS76 z6Zd`GDpkmwgw2f$?q3X2y`_7!^g?(;n$P%`+1+JMgtaJkHx_H**GAN=X)P=$nG?H z&@P6>rFo&S1YA3t*W)qvTU}92I?&E}xq^qis>$v|f4;t^&2_XF#|8&|ar+F5x1)o$ zy+tz@dTPBfla4Gja{$J>2z1aK)usgs zF4mS(AWIiF8J5;vCp0YwjmUnFd&xSrKLNdA6|{d0e|;Jam*>B|M_DosI%YpUea^th z23b}t8pNsA*H(=Y^ZSFl_jEqr$1^K-Y+3owM5qZeX=mCD`LNW)>vl%U!Gf}gGW6qY z_=Rn;jL5#Na;)uN8PL2@|4r{jq$)F7r{svxi2+Sw-fdGXQR!ml$xXkFM;`2wt@y%f1>|Fu*rMURl>X+lxHpa2S zXJg!BuD*}QPU5x zgO}PzL7x4aT0S<15`J1kq3=g3pC96p`oA3qEN5BypU~ikIz8H1y7*eTnc4H?-ZFhJ zr?1c0b@p~LBideu&ZE(P`l|fI!u$s~v!?wONpnB@hJN{*vpZg+z7`C6Z+~RzUq~Sg ze>BsJpUNpz@c&)BA5MT{TJtSe&xahK^g(|VygvcR@!_D2K#pi(@qEYuK#=2)Kpue9 z7&n4VIJ(asm+N#*t|^d$5u^?1s*Pnrr`9+!DiFF{LtV~CnxtH3&4v?{W~xlEMk*sC zs-Om0Juh<5<3>YG8@aKZl$O=bEdj6~_Iwi@2?Ri-q2(SeZ~};mjE-|Ex&(m`NzVP! zpMy^$1s*E{p#mk)St*G!3%*Nb$Es#S*tua= z_*ptw!uY+>y7(9u^f8K&OF<4y%-dJmUjH7RE-ucj)C3!J2+C2KZ2-azFk9I)zFm-A@m+iE9w(+YxaP(_CmcijK)Wwd@?S zzgxeBuOVK{=3RiohCH$Z|mBnmAlUlat+o3W4S8^z`!m z)P)K0e^dY-U`%cfA}J6=bhY&IGimARFMK_Gxqbvka&wJr-V!NW&cSI=f|Ij!lPZ~! zBr4p31M9nlifFU2NN5;}&OVO!=T=OJ(YXXhw#x|=O(UXfft|(Jb`~D(KAt9*Hxf@9 zvdz?0#N<f7?60=H!sDJ9hDt66 zlkItMh&0CrpNQUVR8QikQF8 zQ?XzF$N0nl9`25>(}R`$(_dX!=dBOVsz3A>4nyYR_`!AUDaMB2z?ZeZ3lI}QdCaU+ z_ZY>dY-2E^VA@5HGvf5n0lFp6tP^;A|LSHJ@_;o(9;;2YCd;kKFU+ruGofcQ9l@se zRG!L7Ul1u;Yf+|o_ew_YB|PIA%>eCTYX(K_{i;4-Uw__vIjU1~v4NxrA`1@V5jP8r z_AMJEw(Yo0V6FkC7$OL6^#wO54Az@Mba3Pgje;x98%1y)(79Jwu_E_BDZ$ErQUaSF zt7Ud5ur+u^vYt?hnvNS0YrFrVPVKFrt{UbIf9_mOn2RYihbZI%eajXFkFT{LS+;v| zg{ZkwTAdWWt)Li38jwdTezV7(+X_jQ7aiQJ?su=tvgIBf@VlnqbyILYug|;eqo2z_ zFM%6%@k2o0i*NCd{N6LKK0m&k%2V?#{PGywCJ2R_{#~do^&Tmo`0zFVm;Ui+Q&)Iy zpytt42C7HghCPe$1JDxCK`6<1EHMSGg4eIcU1OjoRs$Dhz@WuAV2Igsa$&hQL_(`xd>UCt z=OKkrNA5C8RYU{jgqZ_3f|3spUgLJ)4s47|Av1Y^u%7#o-fvR*9utg8gg3$&k>opOl2m1>kmy zHU|yZf-1MCdu~eDTrVX?ZUKS*o0=>fwZ+GYtjT+^6DuiH-KO<#BAu6Xjf=JIvpg7% zJQGKbw*An-Y3EmDkTQ6d9Q{yT8tWEg^Zv5k>!JE#HIXq}p3jTLOYG)hn;!<=>+blS z`UDjN_xtQA${a>9G2L_K-*63C)J5&#+CjDMg4e(+4iKSB(ycPWU;A6q&wCb&mnUeb zgKw(hsoH+deggn0wR^>G*uiqCmS6nrnu8+{q@YiMHp^61WAUYFyhSX z`ta}MA9z-;^u;6vp+nMw&}^wqV5Nn)U`Y{vBq~&10PQA^1P*5wg8L*Tps|Tbc)ukH zn*$b~m*fzWGHL|-r@^J=W=xwxc24;}Y4jSqc{qUfnVH0q=Ly>4aWQd=>*pG3H|p`{;j;a}6yyF-N;lSP^E$U(jt$qKApEOv(7yo8 z4*0O;(M(u062BQ+12W=fjHquCr}2_>i>k?Ek%$@k^%^9z1y@8yWvfs_gCC6Sljj0{ zdHMO{4Er&kS}s0#uSeX9)NWm5=dBt_+XgMTlANn9uEh6XG|CWDy zTfuzQ;@AnI9CkyYt7!)YlB9hGsDIqIGTbvc#TX?rw`#V+V*+j0S`*9h?RPPNzwK;) zKkrPyRmWFpCR5j+tvEa%?0k1(j24%<%&E4|3q}0Z5^N<}w`vUOIz6?_7&tv`;dD`p z({;StO^f>3LIJ9DS3TD^N|R z#?IFh2~`hoyiCz@4kI1*{(FLT)x!Z?Ofbu=CKqOq2l=LZ?KAoBliLRL?cRO#(HgWf z{0kV@H7i{kTlMK7{xz$v?h9BJU+bqm)LN$^;HRy%)jG$uA0;m5?+iNH``zD;4t^~I z#F-@4EhLOb7{Goy{`3$I|1d9S(IZzt2%bPt)rNYQB4%{#R<8!S z4o=|INmdO0Z+utOzYt#>^~61OpGTvj+Sk{stxME!3LCtA&0Y4BjzdI>hE{$znEpFs z=n_m2(g-8%LKb*q6Wa3U?$jG@wkFIque=C@{d!G=jIscc_$Ij)^M$^w%%y-t&_Y*Y-e1W^IZ@HOk z>VKTsA-AwDGj0<9a+|=X+_{r4a=xy5e-7-wcW232rrmnqZVA^y%huQ>rKpqO$nkb1 zqyS02Ts*sZ-n=-WWzXmqQdC)R=@ui3&j6Co=N`xJFNbMBOuHl$^q}iAA-D*_xIlb; z+&oP&mVdX$$Jfwbj(Hk=&?#xCprSJ=cnA`>QNI5-u0l(S(j}?3LTmwus4!7+yzrT-@eKZaonS3lsNip*W;(+GNfOP9T~PvOe?WE zZhY`lNIkXcf!;Wi&S&SBBEDV33n2}$%92{I8PzL6@eyueW;l(?tti-eYJ^ZPydopL zFcaYy5(B)jNwfv`EzRNX=jHkSrwc=3$M<%J`~mF7=faqVl%03^r4w19brpE&B!<^BnC2Rz9-Zm zDv9Znfrbtmi2}%J+*nLSoW=z;F!m^9_*v$mG*JVEg-*I;2}avDCT3S9Eyytvb6f+8 zjzdf_P*Rab*G3ka1UJi%>Le64r2jhF0-PvWuD>yapi4V8*o1$CnvBRAjX46D+IG^6 zYt)P&>Yxwr3~AEs4kYv>pgO?Zg1(@FbD;KWaLFhz0?(hk$Rs0MiA%>UEkOI+Y zi6C(32{iMh-9zt#g4VbK&<)&_&5ltVN0(qoNy9VZ-GU~fCMlS!-McjBf~*ehMv@!7 z+L9zCarDV$1UwQ$Yu%F+&X1~hRh(|EN4&^e4mYFSGn=w}~$3suTl^`My!dVu% z{@D>zoPabV{AX1Nq&hp1kZcE0c2XoXFo0@9WkFXtcvdpgp``7WFc1ph95f6KOd5F5 zkP1a=lKf?bqyCIdlBqliwR0A>lef|+i*QRZIg@Z+D@hIJQ8<4_LJ#**4HT_B-)~-Y zt60UE)DKvAr&0bxnNxcc`M=nE$6(#Twpno5wr$(C_p-g0ZQHhO+vZ-jZQItY_xon1 zPMxYVH8a1@k0+J7lRHUOlBc?_^wmwN6~KJ0svks(ihxwLrzsU5S%CNn)twwn;zNzW zs0r^tElHTsSOfvu80r;`+4Rx+1R~RajuPX^vJfLy#*#o4S|omrtD1`P>m21I z#9q|rT4Q@8DmjCc;Z7-cGAQ#CRwW#RH%2ss=*ZeCE=S85axThu`FUOTK;UR zJ~0RJ#{$PxCwRcb%q_$>>LzGwm=3&{^UP*_b+KX+L$?Sr9vcD?)gMwd)Nc4-eh0fur){sWxu;#Mpz*fb89r2la zQ$g{DzVtv0629$xu_JD0swV0-z9s@4$#fxia8e``@R;NAA0+EHY(_T1%DR7oeZVg{=r`vr|mLsPim zh5zP(N_~>=$j)RV=5ry8;+d)Gj31Zk(T$tTL%LMO{4F2hz#`l=%+RTcG~aX88vLm1 zuN6_NwZ?ZtRwG z8DFv((R8?DglrFJzd13ICi^)y2S4PFi*3zDnP>GFvWQQ4CBz}#g9@5#=cn*}ETg6q z4M3Zlqu3u#$1@>!+WVj6nH2}`)Sjw&tY@t#A<9BbBSmp=Jq;rgC2w#zI+M&-8xAJQ z`Zdiu^oVdPliAuJZ=ADqY7e-FC0kH(nNf zs0+ZtjAj{%R$X=@HeuOeu<40XNaz%e+uWqe+E}Yo(Q*4pA{s{64w$#a06I|SvN(=9 z0_C{uzIN8HL2cRyV1cr({K`2TRsOzL0bbFirVaf4M^B#$u1CnwR-=SYt%T|pn7sxa zuZl%<6(d#P*@>93cqfeXP%!BS#09!)$m=hgpydjdZ~#Xf@v~t2ByX z*-gjhfO(eQ*jh(AXQgBzY*02aycE(8H}Wq*O-C4f zB2)|yS2iqodeSB(i+GckiPH|77sKzmDW4VLWJ1l52qsg^56|%r6GCQrn4yqA1}Mt~ z&dUM0XH=O8<)ANl$QTek4!jsW!Ejefh$L!^nmg1G82c-ZFG5%4bGsQ7-?A?h%frJ( zyv$;b%{~hoo~NSY^e;1KRRYx^obF+^^f$b_4bfGNEU3`%8j{c$6cSxRz*^?9IGz7I z$RY>I2nMmU9xT=;2_@5^yZrwCn2s)(EebNz=tt2@9}_ww_u*{e z?85Tvl!5w<<}iO2dgg_^+3W%^T?3&BXx2$&MQ1frLvhi~iOzEkGanT>UGj%sGt>hR zu{1ib9u8UnrCAjDu5akDKFh+yf;~RNu-k1$$~FPAmW{xXVD|jE3WRgD0p3lzBw!!&RpPGLT*_|dc$!R}k3fz0NivN673-gCHoVy0a z>yQ5kSXshB0T-TDI1gKIwookPBL*CA#fI|M_ID|E4VJ-gACY=s@vh-aTQn#-cw*I| z-HIVR&b;v@LG8?K6xDIGM2>W|ux3zpo`SVHnO1UD(&Pn|xBnoJyxnEn3-(js-Ep;! zMx=%?g0*r^6k4z^K3R}HNPwv{Ak#8HVuWFlr!+i~@pwZ3l@JM^2|1~?-)3OcHd?anSE%vvA?PZOqnp(m@OnQFZM#)*45newB4JyM$o}4$2#d;{)u%ETc z_F$N7v;h}xbU9Bqz;j{8I5chz6wG1dzJJK<0A{JO&bL>{t#h4(19l(9I*jHh`PVCV zsH_P1B*SKDcE-1hptLHC*@#2IioH3}@udCgf#nXD%6kG}|xk(L5|Ubkvw(x%NeaU{qDcJi!A zKARHU8#2XTv8a?d4YRzwNd_sX2sA=nlBmRJtRa)WIQKjDJH-bspaWw1qV}xfifiFB z6`F8+A2kNV0c9YYlh|lfx+=_q@eUMu_g}%fwAU1I9{%p zJ54T+RN87y_jS8nlGJ2@EjSC5(iGP~FG4R{m5Q51Oy=WUy`s!PCH*~6d(!tLl=b8E~6_k(Mb72V{b?vE7k8qbfz7IwMQp6nU@PtwEYxh7ut*% zE!Xf0BY~)T4awE<>B=VGXGcrnqqkw_XM-FeHzPbnlWM;MT?Z50qM^DZXd3_8e$68! zCSy)32~YCm;dOria$?&xu4S0vDd`_)Gv}b7{vylBu>au9*WY6v#8Eg z`j3ODqDCmiwn^V_y{@ywEFk`r=VkR4LR?I@U#vZqT)}Z~^Sk1VRYn7Fx}iRCu^yPp zIy2P+X`f6mLkNPaYN`fxIH^#!Fggr2nmg}TSIX}|)WumG3e zR6Ixf1AFJ23wc>8N^Hy^gM3-;NpGo?pYRq9(0AUMx1o0};s)N@MG_#{1%U%;nSYsqDDx>y>;7#zfHt6Axz?;ofGU%)LCq%-m+|^WGji=e`=`kY-j_iM zs9z*vBLI?gZaIz4qClxL6F+dO&We2%a+D&ceJ$^+sK$DmLkI@)2SH|;`lj^i6Cm8~ z{p+OajX~zg&1}NVlx_5lxy(AQ_h1y86vwuN0}-Tk`0CL-;^hW69R**C5^7L!kaW;? ztsP(GB$XdNh?){RnK6{0H6k9nEb>#o-PfgA!kMuuvb{lX3bfkLwyG#Vi;vKYx6sYL zGzW`wf{{q@i>eJW6z3n!N`z)Ho8$9k6f3&y>9Z}USccT@!;#u=gCY;wejBCj-APQY zTKUQHpsyS&u$vAEj(>n1YXqjyPj;jeFi}U-U8Sf??4yEAKod7v7xFlhota_(b)$%I zNugw%=u6RA05h)yZ$MR07$B7Vw!N20=0P393HOI5K{clyb2Z5rje93tmb}c@IZo+3 zNRbvPa^P9+CR@oBzoGl%N^=kO4Ele-MN2WL3V4Gpxy(n+XSH|AiV(8A^58CFFgW7k zg2|xcOy->Tly&L%@J7v@H*XKyoZmCKqY+D|Kvr+y95vZ(hzFTQRUA&WZK$I$umvn# z>B(`D1`Ao|O&eK)m4AWE!m?OWWd7|CHp8qA+GY5_6Pj{>R~hleK%d+ZvIc<#PMo#* zYtT|dkQ0<-4@PFt9WAQcjZ|hwafCfouab<4*JBu4#*HB!u;v<<$~1RD6{VCMnA~!z z#ZhD~!~KYPh-R^({Yu1=ecS?sZ(7;jp&9uSe$-jIsy zj8CkQk-eX{oH%**UjMw->Lh=%nKo~+_~Ynz zRi2Wt%TYDg7*#-x%^SIt4bIk;dUQ44AU}1r{~TpKpM$f=xyLrzXXBT=?0*2jE?5wi z_vVU>dX_cTsKiXRY#^gg*`1~z^VNw z|4#-67yo|@4DvdHDR#VPbUa{(hiMTqlC>zD##kw&U*suTZ1RcJJ)z-lyw<$@n+0zd z;b=hOpz@mml(_4Zy*PNOLxZo`-E9a*^nf8}B@Etq2Xx0@=H_9_Oq{I}tEFe*7c<==^yef4Cym}b*J zTxi_t{+_X7PeG^UCKwk+%gAmghUTdRk>;w@_vyQz{|Ba~`pUxWkCTX!F#8-7-s*G+ zDk)J1wyIIssht^MzYg4$nOmtach}ZcoXmxb*$MWU+v=N7osdD@Lq0C(rH}fTQCqs< zJzTRm*^T@?+|%c$_IAGDA3j*m`zsKHrBS#`l~@8BZ|JQ`9Kp>GG^{f0wfdXba!LT1 z9ef340&(w%oW%@6Ikg64fG1LZv|TKy3t1QCyoU%};Hw_RFRQXt=_sChKYOO30HPzQ zW`sDadg1>2q1fTy@QI*!W;_UTOB(gAuKL}2rjbG%Vpkfwpv!tYgtrAO2rgs@PNNZG zBZXin77^GuNf#Uni#a^Z2<_GSv{O-7fLMKX02!3RZ%{XqK|nuRC}@Bfv(>ryFKwF3 zM%_1wxhzD zLAM&S1&Lu{!M2*7Hw2XeuPVv~nX@f_s*vY<=j7^8Ed!0T?eu0*=BMWdW-M%+>?NMX zX8eq7Nj(4J92wbeih2TD!HR5P+db^rtYI@!?P$tIb8xQfC~G}PEDys`*7qMLx}Y=x z8Z(pTK^k}aF@o55u1wwy2_k?Hviq(6+SZ?udaasZHY;_&V@nlYH-7zr-y!kZZC8Ae z6n69Kdp3KDUcppr%4qbFHdgT5sH^H`|Ki`tx9#5Yv3&Zk&%BYbwY}@az!+|kL0HT| z$-xSldS$AOYG1iu#XiX3AK!o<*Mvq6QR$e2B}1Jd0_5VRYTco&-!*b?ueYC{Dg;}D z0W=Xt~(+7o{VgIORLwRic06^8C}8Tu{k|2$F*KR@1N&t zxC2XiFW@oJ*++#(YtEb_tv`3-JD;a7){4W4rMYmi{I3q~pS-1CZBCFcp2m&J5+x$! z7ltGcCwFTrK_x~axZfqDGwt6WuLp!Ekf zK9T{za>|L&{}J+#CfacW%OWutfmp=^a`7X`!b6OKYjOm>noWCT^Y|Bwc&j7uiHd+f zRHkP*iOzV5gU;(dNt)R9U(o?6=(bHLP%jGjhUGRw!1k`^WI^}rg%448^x77^!6GE6 zA3=tw$x@dKVHfyACJ5rj@Z!dBgN-4Gn1hZc(6Po)u_lnA%t85U{r;1?;iN)Yf()MS zaeGYQ)KsG*C#DmAMO|OU+(7I-g#ri!vxg11erBUvRSODC{(^h*K4;JQXb8u8u|9Uq zJe~^qWKl-=THt&HwG+dKpaf)_^K=na6gqnske!t&O4Z^3(foC{O3g#Fv)VHNj?FB{ zHRBD=sLYk_?gx3oqDRidv{M_*taxp=%71+Ap0>yC7su1{j4cWE`(Kb!hsxvOUV1ux zJ?@9n<99=JQmL%pWSz@!6T4p?Pu~)$2M2d32J-Kpm&oZ!skzBrtiwEyU|GPmQ})7+ zq?sF9SOflXy#Dqep04V<-`t%fU->*Pjh(^6D#-PCICvj(U@`72_C9B01@A5vR~|?H zT94^-bO^!>C*wTLVvh;MaeNnw$U;1ty2r{X~AE|qRKdEtQ zL{os_&~8Lif#KBNx}A^w_Qqo4u=--FOXe@}_xZ4OI zzcea=ld##nj1n6-?jVO=?ZNcTwDydx?xbyz0^&zMb|QjQ^r+ zF#<1S6lt4nJvYvQpE+#O#0={wt@{#sBXixWAVS>!o)T@ZH0|xo9AVtrNcOjEYvnjO zq|?@>8Q$n^#|V8&p}UTvn7*{?;dOS3m|B_3zq$ivWkGOuy5HmCx_R~O_Fnio8$V6r zbUpO>UY-K{Q(9ZR0*Ku&dO)eI&>j}IS`vVQWmH|UiV z(Y;r!Y(bWs;jSY!wTezAuBON3Ec3#%R`I$Py`s4V|8XmPNXvkoP|gB1rOaTTr*N!3 zY)+WO$RgM0psk7az$n2T*+V?-c-BYV%zoUQ7r_)Fm?%uyD?YUg%@M*|7iq39Pu z`p}5Ssh-hjM?!41kiXOtHu@kd5wO6DF#pi3q{DwOPeCTBy+SCbe$LzAf}Uu47v0@}L{lD0mTxZ9 zEuMV2fRczYX7VpBV(pr_2JB{mWF(}h#1ARv^GM^#Jj6cYygY|cEWjg4R5EL9J1=O+ z-YgV}kWYJpsWAAa%6n+qm_`<*&_k6lXs~6P1}V~$>?rLY<2cZV zf(!(mDaaIhTV2c~6t3p8NPvAv*GtBiCXnQ^gdZ6n5k?m^B2uL^RjEiuSdI*Er=pcY zldeAVK-kN@>Lcm+OBvQ~gnw{1;^;L{0u5iCnhL=VaS;Rv8ca?yWFgW55< ztbO;5sm8d*s&0Cr2MV-u4hunUSiAoK8To+1@9T*NB)Q8Vo@j^?CZ*rbqc76fcSc#! zXUx3(#uX=lh#u6yELxg|xqv^x zBOP(WZIwwF#34dstB{dMdW5o-BQnN#q;GeMP^u z%D>OX8D&AHteZq;2#K|iMewPF^w@0mo8Bl6VyZI*Fq}6%uAk98>tA!gP`n?jfxKK8 zQlp1I5(iZ9lQG%i1dOC$ST}j)ZJ@8-bAr(wAmn)X>XW5BovMc|3+0F6Xx^H2!>b_x z0J0@eH9NEvrr@@G#X1d!xjwJt0gX(z)IX$fOVLD9Ot}G75d=I4v%rxg@-^_|0SY*( zi0y+oYthN^OeNE5U1_M~9Va=^Aef>IugOPP#iq5#Y0#xMQ+gkK15XFS&c=@GlumNhQ0t~ zD;fb7FzJT%YB2UDbwsVIZ~cxV3CgTfIgR8?-SaAT<=b_)6kP^Sj09H)uoEY6f8tHw zev6#OxvupJhkcey9T?~SD-~pb9Fn$3x^-F@JI1}Ej8)+>y#R95Pw)%15e7`%uM(PEWbDMNBeG}R>HBE`2e}j*y3fpaND#A*TuAne@c@8T)iy`(k5xeZY zo?Bn=WTs8AMO(xbp}p?m`F-#2_$$-K%5Etm@TN7MY7E*6))deX#X84RWs@zHIYi9m zJ}#7!qC_JKSeBFpyAQ~5Mb*hGEAkAov;Yi7K~;9@eC_`o+=AFwfGd1YzusxT=n z#ds{pOj9gBbOS!kG^9H~-o}RdTE5IJDDj&^&Z^9_CwOp7+Hp?Ia*f|U zvLg}D?IW%H>HT>t&7~osV*;~Zf}S_rXL5H)*!Q@9`APo^t!JOFOQ)eqP~%~&Eu&p; z>E!*mm)iUOCR8|a?P)B!Z-@$~Bd+k%j1yS$B!rBDzbiK!`aYL5Y+Dv8Fbot^#xmxdon?sFj z@2)!&sv8li6B4Qu(9#BS`X0cz!|frLodYflCVZL=M*v1JaF_uOzZEtQ*WwL6-)5Umi~UW^ z5KN&Qzb6H<&)tZx`+YCp=61%^&13bW7JPN>2l~(3&GyHq>(1AwYw!DhEWY>m+0Vy< zDgT8YYUlxU_DqyqN=+X;Q%!>lm(EpjYbn^w{7~i>&Y%{i+ZFggo&)8|#D(%Q zQ2s^HuIh47=g5WXvc=$0!_Ixf)_udqeZ$&)!^(ZblEa4i6mGF(cc0Cu9Y?QhGIyf! zsrtnp+YAKvt>p?cohuUhrYnZ2o2mk>)fM%LBMPS->WA~404l5IE=H9tPP~X_Spq!LQb zWDVeE5dixVj~cwqxh#LOTFIRzU8p?@`5UY67`T-NP{LxrtGg<$qxZpa^~wDYsz$9E zZ%?vrEfwlky{J#)Y698~>~m2uPm}e+S~A)Uy0HhO{=JJs-=W_aU}9?caQK+8Kjs)w z4pZ>qR#N0^elgRa-@QU&xut;EOQqoqUhB$h@n3&KJXzQ28(PHFmkRgzZYQHuZlaoQ zW)Duj%B-9@3Nac5=wZD(T8|mNw@8+c=XSj!_i|fg8x*2H#Ao_EFXWRtHJrcscGq)t zx_V>d%0~1ang3MG&c_8aU2Va$JWD-Y%89~`BFxszwH`gnC$VbYQQvU!D3&F8i}P|?5(7P;&MC`EjSK86N;A*L zb<$UD*_!qw;A0H|MgKNWo25JBiLsM#3{Waud)P_v%lKJtkjhhc+6$AIjYUW#dzaQUGBV|?-P+wcEM zW}NcK~hUQR-&cMO54m;cQ=0}9sE%VW>Bj> zbdq|E5=-KNU)_hJ4RuUF>N=J*`7$)zKX)brGoIz2yNwQ6Ne3*Juhl#;P2rabXvaKT zjnjrHulHVyxSZbIV+jH~A4zvP*(=V9o)gUA@c2`N36|?@0 ziOio%eLjK^VRO?p|E>di5q3R$k!>3K_;%76p{rrWsrVO*F~&GQRGLQF3}O4K2+|xi z{ii1K-wO8(Tz&ayLvnjC(x0ko?XJ-)S{-`Nf6i1(``Ub&M|P(zMSDedNJsXK#wmkL z69(*&Lc*+{$sseRA->~@{A$aG!Ck5|mfaI6jY2BajTh9KP%X@T>qssZ)WqQb$L5Izjhtw zI@k`e+u~wW;3l})I=r)X4!&lOG-3&-8O=e}5`?#8*7iI`Zy0Kndol6b!Y;_uAh*+a zc`RZXjI0$pj0d?=yEt3&VmrIj+wSZGek^0bjjpvWu_0_X|66Jv2U{5PaQ93Jda?Sd zLdGg?uE|utj577AdqsS?{&TZ^l3@|cs2@bxmFb_tmKEMiVSX&J$*m7U=EWt5OU0$e zcFzIDr~OzQLsD;s0~vK3!2cPW`2nt1+p1U#fRr}rU5G0%@Eo6KhZw_hG#o}WnH7&y zWQo%vKmehj$o)|a3F?3Cn1FeL^TPLYhR7s@*8Op{1QH*%M1XWx3`=x(_~nbQvkK;j zVTH|lUci^#R4U|-h17N`N4{iU%4xmY;ARUwV_`ylB~z@IzZzokbXb_;#u6Wc%IoU# zeSf&sIKo^Xg@f)ZF>ZHotW|1w{PlE@82VJGW_pA7N2P)=ieoZG4yS}g2<7hkAK|>6 z+o&MUxWI0A_^+Cs)Ly+Macv{qzEk3^Q>o~FQrn0V57V{PVUNfYIW*H^rb-%st^O(6U`>P(aN=rUe(CLcH)Cij2YH-k zITQXi;)&f)4MZ2wZK!gJ+Qvj7!p$)M%A(8a4TmAJk4Bf*5>w9HptHwtr$@$Qvcq z7~4D>)w4UWhn}M!8j%M*8AVw2Hn$fZ_KyxMNH%kpid0!snzSNANt1ICTF2*cohu|U zU9*AcuCZ!YJeJB!;5VJ`yYCu6#^xGQoFEgFwhS_@o>`ldV!0~by;L`b)~ActuQuhq zJ@^&~!aij^B^Hih&gN+Juy5pIEAcy)RY?S5LTmLpU1)dsF73XW!?P*c-QS<*3JW{W z{RLM5dgZ>V7YYk*yR|}x4O?69Rk5^m|KJd5_58egF>!NoS8M6<*Gca_f!lVyzK@Mz zWBYz*kC-<0rt!JidnkUl6UB3AR>+K06xYh&XY=y)vU@ADH@h3!Ug){AjpbDNPK<+R z3tIOa%2Hlri8`5AX_=PlxSRrUQVgyP)M$h2v|i5$=6AZ@7~8fq8wg{jrdt@ADKtUKJ3{{ffzXq0QXoJ0N-mYDQRklR(NmEH_KqMQN{HBS^Z z-}v)B*ZAk>2L0#jfPCj?a3S~e{S2PJ#|b1c{_Bn`Eed4`0)p&EbW)6qGb{E zVxTanRCW_jMlq#h`K)`qjZTi@!lY@@ZD%+`qbuMIg5GT5vXMJEzfB^Etp2iqWG~E6 z%>b=-()c2vvUjKO1P#qDcMcOwGT^9A3$Ic%iM(rrv<7jrl>S9nv$<|GR4XHbhuiz) z%EnHQ%P=z80p^l3k;8k<7@AyL`y@4rVVPloJ!axfNhYa5@qD}JARHZeW-lp?efTVHFfB!R#*?}6_T1k86P;+v{7l_5%ZBwx zsL>gKYTXhxVexoD|38x&4O-K$p|Hlk```9AN} z_+QY_=fkM+0^8I<712@99iwXojtwr>O8I@>Yx%Xz;_4YCqEi(QprxWai=O8`{10Tv z8GR6usC{OxG7CA}zW-0I;)Emi{U4%|vv9J}X7l+!v5=FshrB7hSFblVbFTaUfqI1I z5He?#1nLCeIwJ5bPC?+<-~GYYyr#;M-RbqEkFkEvu*2Ar%Y*e$=m5&zsj;(wwaNqO ztJCvq>zU&^^Zo|4icUrF@w+OtUwH$<2;j<%;koeki>AM7hFp;i#uHzf=>8N~Dzxx0 zkFCh{dgcf9@qX|1y&LNN+Kr6;xmp{+=Xp#0!P_!#rtE_!L&x0}KRQc6+b!)5YX|x~ zMPt|j;MWB)X86!M)RgnXuk~Y#9$$hqL)J_1W7Evi9CyYAUSF-V%>IN5X|C5_C!+mV zSzkEl978cntQ+0IE!dSYfl*s>y;na{iCI=49fg*@!3mgVbq|o1G~-=JYzUBebqGKP zC^k`THNk-n3XkPh{5-G6vY#&$Q&A3lqQXoe?Rk}y@bbF!;Nv8MY z-1TNFckd(2un@=7H5tAmZ0BMsqeL^jKOX7lyB1p^+3%xh!XX5W#ZVakF`p1Toi5b* z=uMp~AJV^Tb=y;YKi=H<71j_fwpYBc^k<{WYKPpO(^SfQv70Yd0p<> zs&Pv+g^ZH6WswQFje-?v*=4)#no<6+lSup15)`Ke7l&C{L3YqBr=X6rk`8^flFLk3 z6^?me;vk|7`{Msb;PfaE2}a7*572_ny5(q&WOQD&00ELvy$htL!Fz7EBDgP8-?^eGJ~IZgf8VPw@9PbpL^w&9^0Sm zP+LVb*FNbYU`38nr3b%~9e3lEN7{(VUo5T<_>0Ati?o!RiJIR-?-b9ZdH)-WH=d-P zOx9o{myZGl0V05%OB28>Cour<1MZUNDRJH+=k+}55mzyLdapoW6+LTXyhV4rGdQ`*-%cGy)5Fz_Gw=Ru|G=_>70k#$2B}e14Dnk3W1r zTb_TuXJVJ>ZQ#QD`Q)b@pDuw3ZQ!)?fIZu|XjcdQd9~BQFZX0rKs?(bPxtRWatI*$ ziZa0aioD?L9WB~{(m)u>yFeJ)bM%q+k0(`7_m9)4T2&LYfs?`kjVs)1@WzAMIJZU+ z*unGMvT^d<$Y}-cq@jlhZKj8i5-sIL!!m*G9SLk=7>WN)rAycG93}hRR~!Q#H9w43 zbO~+Zgk>&#fp<`zmgHr|D6j{&aU!sbD`|ygGIuDELfJb4bgSJE*vJt>{T>Gahk!%i zwmEngfxVQR>-V(5zx)pI_ktV*H*x-|{@0nttA005+cVlbLIgT;vBI0ZXREo$;_n{| zY~m2W_%Q$s=zl=~-y#F}0C6P)^8=nwP~(4r>>u}ynv(~#alT^-Z{j2yt#WhoqJkbr zCo2cidB{gGXTFyW-?fVD^~RVU-4LB@AMre;wZ{A2za z5n?;Q5|dC=HR5QDt2=t}(6!8MImlUlPy2v-{00a6hO%v*SQl2B#2rSS>=XgK&%k=c z_L{BcPVTy2U=E(xiiK8;_vsp8vkcd76XJzq&V*4Qc;qETo$mkC7gSd?=;4GJ`yV{z zLoj;P5{`L!V#mEe&Rh=<2Glgf!yvxD4cE%Jw*Z-O;&*>)9;|ilWhHkLnS`oVWD2s} z&)6F8U1uOnPUmDO1PcGl9_sRt!PgmgTY`(|wm0_q)AO@%hgHzB9I#K-T3SG8X_y5Y zpt`cMp^F@!-N-`j?e9WCl(E@&xOlm9zyAmNuw={up*rXGRyPi8!w_|X0C#=)b2z`CqACQHjLPN5})-x8Fe_WdcU|fJ`{NgTRDD)0#t#3hg>m$ zv$78>tU_7_1!<3owCSLd2L&EL#TWsg3|Iyvzl8d{1gf$`rcb}Nt7XxiM#cZPRj@(~ z#~?0(23HYL%;JNOxJasjtpl-_`&7*RI7k^Yl1WwJNKArNCLc*Lo+jKZ3MY;#`aWle zo8R;C^!c*=wd0k(AUr#6fG4scjXN&!B-Im`M5+LW5iKYVDL!=0xQ`^EE=;vPNk|__ z%06kY30!7CqKQ-zNMCWhu*%QjFR-+sJa|B{6Q(|8%)%;h(&lQPqW&m5fHXh~9jQ7J zmU0T*I6tgr!=_h?e9tBncx~S*Bu9%^lZ0D0{|iw`SqNzX9T1&t0SW0>IpvR#Wz*@L z+=T+wGETAKN4v=+aR?IlRGV3R_nk3L5X}Mwp%W!Y);hBwNLJrZ8T=0#xWKr~X(_Qt z5*V8-9RH25yg(AJ0dPT;CU{uG_kgizQjO42g>N{*5){pl7fqS`hZEz^7Ne;Upm+vF zAtDjnxJ8=K1@Tmp=wfi$yn9NNcI;5fIY)a`VwgR6`sv5f_A3QyZXrdKFR>8OlI&7{ zETu+}22xDIKF7JUl;i;fsXfHka3M%M2`;|6kiTj2+iF0g6h|dU-Qs`lm9zuDoj{2N zbQ=qK3QToSpy8;2*3Q~Z{pyXzWl=_$glMAxjlqWtM4=IBeO<`E24<-=6NQv@%;Mjt zVunJrsebN$Kw3jYvLow3YK|Lnc+X987jN<-OD)37KCIY_Y*#TvJTwJnS3G7gS;Gae z8N>{7c7DBpl)afnC~PrNS?YG45UGG=KiWHa@6}?u2g)=XnfWRGAq|c&1^mYzM;}(P z3`E7}swwUGZ?t(2uyXuA$O<%i2hkCy0=O*NU_V7qvQYq%DPRdhtY(b`Q2Zf;R)Iw^UMBIrv1og+R=`s+WE6$F7@tQ-34It>0Da1+ zB~gQvYe+j@g=?qDPMFL6_}?x&|M=YL+M51Dj0|rAC6QFrmSg<*RB2{nC6{wUG@iJ8 zTiF1vSJ&c*v1}$6!#vit2^+c|mp=lcjzN%ANO^rHqH73wCt5zzET`Z9zgTX#kHc2C z27$EjgKbuBw)%Y7o5Ab*b56>tg02ej!!yj6Mst($-_8T(&goN7Bp{F;mF0hhF>O`E z&sBv#^5*B(12fysB*wVmrnpP(XATJMB4hIn%TD15S1l}M%lGxIY8O5=WsdlE3lHi2 zwKm@^ys~D(HGCOI7e8BP_D_Q((NI-~8wXF8D>Xw3G%b-{l^kwEGy^MSBe6Q$NVYjW z-jAoJHBwd1-doKMUKfvLWux2G!j`Blt@kNfq>6u}h)5g$FS=W-$Zsco{J)~R?tlgN zX5CC%mCLA%O|T^`aO4(J2}qWX3}PFs1rn`oeh)Y8-h&ava@E4M?Tr4d>tT+BlUEikSi<>d*5hFIE=9@zVhZpg2V!>ads;8pm(zFX_Iwe4zg^m<$_UllJcHJn0llyk&&|TY?WM+Yb-F)4P-^cWxGTx{T=C-b)be_& zei$1Bzi+JNn>_LPCcG=Ou!+I?v(sho^lheEgvhU(vt9e+Lwb`!^>DcD(Gq-%&s!ZRyAzB{{Bmvl=`+=>zyM*?>zW zq%;>x{N4uk$Tg5)BJ1m_4nkarO6J*WuUX4+>453dUNJ?7f3YfhT4bJ^x09nky3 zi@zy3(0S}u+92N6H2z7yRW0|%oyD}*6uy>$Z5KylrUpx62hWN^Hj(9t=z@{1)&=d& zECbQf+phw=0zqG;f&QE$ElzHW!1eSn*N4n_{<)4Pv|FiLT z%$e>#6IO~f_$zYsSSxy3b$BHUX{NeiQ8ATb?k!sdmVq^FYl-8Y{<8va#2fd7EwEfk z=~rcI3eezl9r=F`3oKtC0czM*(f;?YdM7{)c%vRV8LR{stlwtHum(3bu`MVu{p8k^ zH^cPRM&s4}!)Mx?w(HJ_l{^cbVb)MKGj^7Jcl}T)-{vZ5Ha7H`)G5x{LsT=5-{!{k z#+DjMB}tr`+#>ZJ{LMqyy$4ycNudVgVGGvQ@zn~5k|K&CNTnC+M47c8>qPdBRe?lO zZMHIgT()b#EJB!f(a`dTDo+1o(ejfVklZ=~iE@T`pn10JJu0i2Uprc9nJ@w~l@cR2 zh<;T<)fk~iV|N^H(=HgfmcDO*Jq;E5$O*Z8;bgtsauPs!ctDB1DdK$!C*X49I4N*QVL-h z+^zzO_34Aai1j%>ff4VX6YGOqrodnT1|r(UqbQ5XV}7ZKF#xd@0Tb`SG5~=Q>oWi? zlK~Oy|F!Oiz=-nehiIDy{m%iaq#IMj`hddy5pNx${4N{;Ej=6C4Vj~zMcKL#ZxM#z z3>N(5@s8-rLBOnXt%0>hiHIfegj-MxEL-lD#5y;8emeZbeurOgNx-`=M%R{mRd!V-){65X&|qN^S(HVfmA#-KJqzNr1IA z27B%`4_s4fRG`wud>k~-L!~}(fl{B*%ycO<_xyl|AVS~3a_O30)-#j zp4hfEv2A-|CllMYZ95a&wr$(i+3){+=ikU z)x0StoUvg(s$#q*g<%5MRue?0RfHdbZCKWiMU1hR#Eo1Qz{l}-!!j!SbOFb`B4r1} z`-F1~)|ov_8ICN;aK}@h&V@0Yb7&QqT{W*w^R#{xm^Dzq6searK-!x8Sttwm^v(oQ z8{2`5NM^E54z`Q27*F2AP*NUutuHPee9US$PczaQg++WHX>+wdN{A|3ZkE?{bCe^0 z^HfIVKKaZ${$GEJ2a*|30tV6 zKiEukZgXI7M2Rql?1)y?^MO{88MhT1NoSyXw+Xo06bLRzHPo?ms9M;37{^BshNA*- z`_dQx&u@9(@|nlS)bTbVl%W{UQ&9BvTbpYa=BSfd-0PeK>KVAwA`~sd1QE?ZEqEZu zIbu)YN=`5pLu!M95oBvbh2m!!sIvYvQMi2kJZc0#Wuu_EpwhxX<+oYHKxK_gLq$&X z5sR1pf!DpHJu9Hn#bw~EiXMB-y`)M7Yplrwab@swG6$7{-7*0X;%g~^HB4pvVvyps zX2FMPaj014O%qD=g#uQpnka255VW?c&_(#@gfL>1y4Gcil`UnRVBWkUN^n;k8@l4R~QjzyD)^KNfTq!uHUE}P6gDT=vZ`@(oM@g3uL zSAZc(p<>DqN}YouY63kXIWk&tP#e}5F=lTOyq_dcqA|9gkzZ43twp|QmPRc$dNs<&dWJ6S4q@YZYIFs-_yNJ&lxF-m?6md{M zc3wl+J(xbN@i{362!R+X1P4L8rdp&Lb*v&?z{Y$|69hxyEm0}Gbw1x=QnC#f-{I#< zw%T^xQt5Ps_AQ1Z5k+O48vdaa-M>^!u1GqOM83_)tQj+gRLr*a3EG=TRzw2ZP5O-v zS8-6=Mt4(0lYI`r8AoRq+k$(Rjmesaxpcvk<%$n9!W~>VeQFJ6XL^;`&V_n)+?7r6 z_>x2=8+$fGq~HmS=6wM<38$b`0i>yeN7! z@YSW0v?l0@oBSLm;HiS@|6Jw`zkXo8*!bW5StkLxQZ$y3NE-e}OcnWulPL&QSOHiN z91Oi~6o#5G3rmkH`v&9G%aVBZt+7_{1Si^&ZQe3k@T5{5yZi+?`sPU;OfB%6dDE=XqRU)^~4cPEa`b|RYgQ}Kg2UW|W7G;u{Y6*Fam^N znOvcVBa?(aGXgLzVeYKPH=Rf=sRngnqQ5c%LTLs!(NbuM8KpWi5{zNlg5B83Y@`fj zf8FUv{1kYRw@Dl6!J25B<}3H;hM9Dyr7+f(%Xb}5Y+B-Ovg9c9vpvBf{}yf?5%}YC z@vXBG1QYFkHGF(*Fo%ob83o*f*9KL!=9}k!J^B|`wrnzC&<Qe*(1Q*-q-bWrTK_rhEsVrR5WnW5`a49Cj+XaV7{(mtJ`WdJW&e-_sG< zgUsy+F=<7I2)2e!ln|+$-o|b#r!)CN@rOV`8Wao-2nYxYNWCOXRRY=tK&=7;>0%)Q zAp)-28=9H?W%zGoqj$5hzU;D!B^_}geBSc=5x#*!8kLrl>m-U&F#MT=c;cz^}+SJ$M^f^dur#K z!}lTc=VQkAqvt0P((~tSXo!d7v2T0jq;!G;al6a2?qz9dzw+&9|9mVk^wD42VdhI- z_yH(D=)$ z4XDB6sR7c=1rT?gMG(SX2A)vIRG+APv%tEw{)sFst;~I~OTiQ`{Tb@_<@0%aS_mO{ zGrD8162R^z(AR19_W32)39p08*r7qsu)PH6$J5r%$@9TZn*%-G#OMsFcLdr>s8;Rs zb9w$aWqr4G_SV7%R1#Zj$@l%eef)Umh|J)_<3fn_)xj0?LgSle1A06v7%4wqm#8H9kzD^^P9O#f#g_h+ML^yld*5%T-z z_o}B0`wzYTkCS_InICYG~dp-uBIrm-}*o2 z96x&uKhL>eA3YzLzB%l#kk@LtH{2E}zLcEnHe#;XoO=xm4Gm_P>Nm#|LeTH?b`0J* z-p_#6hFf!Tlmq&!^6*gZNz~N^`}X zQnyAvM?q%YD})D?zV_ULPq}SjwVz~yN3ZP*Ulpy;zEpCLH{W-@UmHJnb|~`RKHmpt zPiGhRug~4BoNq+i`*nS!zCq8iS38UFRZ237P`1<_$>_Gp8CI+rmsmR_xQfjxu zEn0F`nd%_BgFrt$v$eP(&F_QOJ?z`%rYJZH= z1ov)Ow2Gyp71fWSOX|3)60>D2pP5KMDWcBYS!{|tH#=KzxorDPJNx*n452)RK|gzX zCUvDno$6Z;cWzR@{%uJ<-f$CJcaoCRYYKq?eWK}S{OM~!iKuSPf!T8o;I;O-#zD}g z${c&@dmH2>#ZN}yi}G_ysQ00bu75`YwfoqD&gFW$G-LrUdg4p}{IrxnzL)x!N~xnM zL>i;pkp8mpbA`viNRrg0A8enNEX^4V2qb)@avomEcnqI>9eS=T4D~J}I;NFUWL)+M zLTR`XCchO(pTa5WG)hYEG6a6GKnh~R9LQ0O1-ZT&vcEL3kBylwCQ>Z1sx-b27d@Rl zbRHxRjX80#%BVDZEopELhtF>7P|pGiziqq-t+H&5H%u`^AP5R0Jp7I`JmaFVtB-aN zCU_K`mE4ng^tBXytczf?-zs6_t8I0X&t^g3g+}kFf_UF4hC=?dR9rqb*ZZ-fr?XAt zTkme=lR$36{9BA)PhGS>wo4;x=QY2077p%M9jdYrgcn(4P zi#>yzRvu-cmDDk6Da$p`v|FYs@W`*=y-Rbh7xJ~toT8Ki8wzvT#x)81PA07F?hO5@ znQ06&PX^oRlv2dpTzwvqoZhioglKEbS;`GsK~8M0xKE6pPR%R^`IAE8gc}fI)y(P* z|IrF6ZNkRw@#4Pmt0X#AaUq6IwNyaw{hY;D+5J@S@%FoppX0p~Oo~DS7YYr5f4m+B z?A$wk2^)xr>xYbYc)rf!B5uqPAtZIuQR>KUjjiu@jT{%W4y~vw9Y(G2BSxtTwMKVG z`^FCM2llkrgQ_*FDFgMZWDDvRcb&Czng#Y0hi*gHcril$0){m(TwCVu9^YH$##AmK zrNQySo|;@O_SDFn-c0;G>ACP?1)I>M7#N6GCij~{1ww=lE`Pl}x?8)qJ>CDZXAv&R z?fzr*G-v2I!JuaYN!8b9sDUU{xB-KK4Gew$=VqHfYalW;wsdyn$cQo}M_6BHY0l6< zKD^@J{s;Hk-mTS*$MxA&{)vbFzsCE9y|a24lXRpm(j55h*Bv9r^4S7;sl6 z{hR#;sp}ejy9)%u_$LBr*Fo!}FdxBB|MYG1>!fX}@)(OwCgmYsJ){6_w$$N%y3u>w zKldNs51%`Ce7`~?6HSmnb~X_(fBQIDiRDNEYIeTO0Oxr8o%UHjW1uzF8a(+=faZje z4GSDikm<~aJ|{MJ{D{xvi*4_$C5~?!xn3@wSE-Lrh!{^dY-$jAlLLvdW@Zmh_WIb5 zOI~d{I@y@W8S937Uqj!3zav4gBI)r=#QUE7%uX+4Xf?Nplc5{@#N*Qi>W3-%1bojO z<@e}1GAr@BL(bx=7gS8#b}QYxIMUPMW?k=rI66wz_g1N74LFVP^`VsQS^Y@@Au=ISuTO^q2P4PS*hoc zukl_e-**rjC-A^OI>{u9NwYHE(PWD-+;M=1KQF`RKGBJ}o^R zK6eAlAytjKkOel|{oRkZWK^NZ%C3{0GIoW!;3I4&L%gEj z9t`>_Xz5Sx<7wi6GN8vPTB_^`?1NiDeqq8zsKSc1Ek>1Ps%FaVW?GmHO3h6t%GWVm z`0=Vuy%5y45+BtQMeqdYe;xNJB=qD=()}UqHK;14ktR4~u!i2@X`C-64K+fyvkpAB zpxUArnsKx6Ic@4f)$P|UpmxN}egC+@LfJ^qp83y0Jh*}9Z@Dm`6>c@(VKA7yUPbM(aRt_g4S=<(X8nP;`E}xH-WW4*q6W(qeflq9 zp%>6^2>!A;Wk4Zo2)D$b>KFxFV1i5L)a-X?xh#g$(VqiFXN`G7nNYUuADIauSv6-J z-tvjPp2BwP%%vknhcI~E+PV-;wH*tk{@6HEc|-;zaZ{|eBX~l-z@~_x5hi{ zC$Gh-FB?p#!;{=~FJ%s)cgoe@dIy=ZJAC}!%H5B2CT7vudyOaj-v{eG4Iw=bI_nU9 z8@t)vSKx94b^jP-`p0@0i*w;74egQx4JArxWeN%J8R0`l2U)SmF$e5Bt>G5x?wR~U z;^PgKe7Sy=w2Y09`z@1zk4`co5OO@^UOJk!jLzJCH4F`P4BekQ&5dG4BJ(%-e;kQ& zM%m&&nNZ#Ws@d&b9Pp~|V$i)sQD)^o3K0F!^>sd5IlE7ZOLVYKg?`&dF)+S`#+Ub4 z{>0aTy_zhJSBYoe{`T=W20MB(`Z+&*4cJ-}JH0A3FJpVAaYSXYTmHK(s9?KpK@P|J z2uk1r09cU29(vpJ4uivXi_&Xvp~kpY$StUukuiGz zJo-KKDT^aP`bX*JVSw7%>6%g1uWVt{!y`RuMk60m~t4CtB z&{iHDbZ_WbP0MP>@Fowfq!!5amG7MI*`Ds%yq%rvCo8|3ao-Vhb#*a(GVCm+pq3FB zsur&MXpV4jLiv3bVW>9E#5TN5t-T1aNY)q0f!&*+1$%q!i~uhmk#sKuktJS@EM)% z6_OXo5moP;X)%M-=ABAdv)N|>19BE&^d98$^ya`JJp=*7lhM7QDZdy&2}qhZ)=KPN zY5DIopR|qCJ9Y9GgKtB20iYrWykmt9LMW2;0rX@dg=9<qdyOhX-UD3T}( zgg+|$9Ngp=+a^V^-a-0lVVHh~TE0YSH%-b&A%=v8X<|a)Mj1fp5f&gij3HECL4VTL z#RbS2>xGzQaLFkLP;~qMF_%4@`U|l{fx}FHo)96*a)X&;E&P%!i?NI(4|13d6Jo-` zP=yN2j}JC7(QqO{fDpy%H&93-io(6lL!5YwU=K>)LJnnwJLvl5`zNpf(J(tFC!4XQ z)Rkf~Sd6&eATE(23XI32-#o5?BI*(^9jf7j+q$DG)Ns`vTcoWv#F}byi+XB{CE=n) zS%8%!)VmOj9q9Q(LKDdny3jSK*>4sB4)2mS{ApWB!>BR|B0MT+jz`FXBrHR3F2T!e zi>S4^Y;4@m<983A2TC_9_uA{L9D6lt0&I(io_iFZbqyXyN}0!oTfbwyn4(|R-}sLM zR~GU_&`(=dmc*TE?%TlI4(Af&P{mf2{bZ^*r+rr76s0V?DjwkWSb0VJXeX-XlCNW) z4MTAP(zU&A?)O`O`vB;ZXNAqi^-`$uq-!SzutDW|_pqg+Wdi)1J9OcBH4WT4r67-li^sM|Ft{ay`@6i zw+kMoZlho{mhMrZSoSJgIu_fSw{@mqB`%`7gk~(5G!cM_d{cb9VyaT~Vn*IzoY-x$ zd95yL@^NieWEqh?-5RceJQ)gGjYPc2lJKxv`gPa{cm3MvV%U!T%gE337C5t!&1tWX zG8((Mk7nrz1)L=)&QY7oOH>U%W9cm*`%NI}Y%?-azNg{Zy?)JsJMb2D?K)8Z?53>V z3bT(0@)jWALl}n$b@+4k{3Rm0#)2vVly7Am%2TQhO@qb=?1Cb&XSq_t4!$xTR5QVb z#rw*2O|1i{Inxym(Z5@c3~%4RYI(7(kY(654MXc%bMF1IhuU?IK^?Gw{9X`2^F)OFF=;~qOnE?J>~mo2?1 zzgn7g>VB_g+>Xue0}#EHGoKs}4Vh9i;}Lg>YGo_9k-6G|UBH7QPw<%srK^OQE`1ww zgghX+tfRJ!I|EYng3oq8_Y43kxd(d|hv)k^k-`bn!lWBwA<-BGCKMr@!C4p~z{;HguaG;NL4KxZ z11HgVh~7v8gSuY=%NA*r2FvGv%i!n$rM5^)RW7L|2})I1u9y2`Yg{AM zjxf#aKWec-n()1sD=U2WOdvu}^u&vYP&T%%LBeJJP*sVQ3lm3_lx!V-^S3S7=om;y zX9!MCLk!Eq9Aa3*F@V_GROU*h-qm{swz8LD!yWjmWKj7FcejGGJ??)o5VKeBM~Bl4 zD3=<`OZODyft4lxrM?h1+(k#)}Ua|fj#07J;!cMWSMAV7Y zHoy<`BC2uCptVAP-FK=wrdhQ6)i*2SRR*7X31W1yvZ4U zY5I!g_z#YW!`&OK_6jPI;)A!j1x$Usp7&7_BAyb0fyNkd@Ow+if5GQ|h_-}dXgJ=; z%542&zQ_%2#~2SSwL9HybhIxq@-wOO_!_>7n08yeLM7}3*I!m1bM?=UaAqDM5Ba|b z#0olHiVy8P_QzHYz%~0N^A4WAuMG*!p$1tXV{SiWt}NYpkw2PUTHI2xRXudelM%c z%{~chh;W6Fwk}s#AT4QZeJ{Zuc$A>lEW)FXgqqASXx~jx0E7jdR05YF?-voZ9+44N zS~aK}@G-0EahXKXJ@h0cFcZN5NE>=8)3pnM`~u?u?LF&9A+v9D0+lFjA7z1G5QuLZ4LW6?ln`K`+D+ zYO%FspXjDPYKn}ILY===Icahc(dvLvwXLlb02ml%~D2*@_0uf9>Mq;cGQU7!=M4+C2m2& zaum*p%kaRt^vI2{CUT>GB|&gGOjqU|WWb@njwZ2v=vgC!xCnBxZF{eUo$x3XehEn_ zr6n#i+M{k%ReposzVlK+0h`) z(&L#X)H+(||M>{-M9h=1yz{@-93Yo9-@ryl@B~q0MFM)qqOL}Ha@wX&aQi(6D2K}F zr>pGmiyw8UZ0*@=K>ZZr(~62Cc2zLV3g>s}#+lBrYQ)BQLP7M9gkwOmu+L?9N^M1- zMeS}jTI!7!usaeCNjj;~{YeeWHpK#}rIxWtmG|li+sDm~fF^}NTywMrSDPAIf6NX1u+T(2(R^XZ- zQV6&ekrfLzpuA>uce~OR*j1s(YHdh&(3ZgG>_2iVN0M-$m?%Oiq+8;A7V@5CNq3Fu z5P9J~HmW#8Z(byx4>Uyv!3J+ORLX~U9+2Lea&WKv{g)F6IPQ`>CatjV-QhM(&l=Rj(|kqV~___LYb40^4weufJQ(rnx|d1n1^#s zSiTaXK)6B+v7w}Af1t9B$IU{SfRp>WzavkUfw_?f`!^boj!EDheJRRglR;9Oth_7L z6&PrwXXp}zu2?xgV`Z`{W!N(W3R5>QT+Q%v;* zCTE4>(x||COq&f-YQvn+)UXg&e|m3-^$ry-cV?tz0excGaLTV*+-}I#!s$I^5tC9% zNgBl$pIPVY3W(MhXcfruA;T~T8e!9y8N|7xssfIKIeoK^c za!Mt~K%UgZ2(_yUx&4ES!>$~bZWK1TPl#JpD_TPaKOs`Ad0>{Gfg1Naqb;nUnBO{> zr|Zv#hN1{;gwJHwh_;8h(b(wilD2QxV>T%_0xLINlWFHF)>w?%=cU;U2g|`QP&2wo zOr4OV{6!x>2B1!KlMrdr66Yk8H!VzxIgCUe;17-`I15Q_15jKm?QP9Q)T$-FsbsT> zI>C!~n84`MB34PWP(cwq?K}w5tiWxW^Rk34qL$~?giG!})ZzQds}~`Gp-0lEhBcu~ zYATh;k1K>2kQ&|nT|N$2=gSJT;;LV(LQpkpF-;7)^8^jB)J2xk_NXF7l}w@KOt8f8 znAWezhlEk(bc_EK0mp9k_iJm+o^u{0pa)a%eP4`-j!TRN*mb4)QmL8m}AufP}U~{tGF7 z=A1!>N;J-?|6{MJq7!NQ|5SuXrU%C2|5Svzn;JMM@uxP5q<0t;rZ_+DwCz;W&oa~s zSL!&XN6u(?w?|LOdZHDas9ZthI(#0UOVOHx4%{1oJysHS?zlNSJ!L=_Ky0@Iz#_4f1p?sa@c<10E z{D79U&MiP9hT18}h&nR(6XjyVF2Bl|GJ`!;ycT50n}E|n{nc8;MO%Hv;~E3tLHVeM zKdjtLkN9?|n!Pi`JZK`kZ~X&5=y^ssn(rIf;>CB0jLEJwzVi{%ro{2AXbyY{9Y&f0 zZj^WHvyvtp(i2D2h+~iJ{VemG6Eup8UZ*0%k^|Xq^zV` z3acxfTw;e)IwR#73-O-}3KAtG6Pr{FWDH7GoSbqgGMZ`$#p2pP4ImgftQXC4AA7~_ zriZ39IumGw-yd1ZAi!bnsD4P#ueq_-pjvVed&M@Tx)m)_%-M!_H_hcIpxR zVRC|Ku3+X1YTwo^ZdUQqdmlGF-@+|^J@9)-T0WJs{lC8)6n79koCo)ohR6m}Pw3q@ z0?Y+5$@hYF)0Xvjk9f||JPffUZj0m5_fFUr(DBdnoDKh|7$?aqxaYRwJ3=q(D!Q?B-rfxA+Fg2Plz?@Y;wLl#`2*o z^gkNG2tXs?LjY)mh-5?jXHEc(fC!)w>KX4hHvXd#@JtU1__ns|8Q~6zX#8FG)8-zz z6&Z&}7g;o~^9w%wgk`qy$N4t=jT(ZsR;n?XmmUbaz5Ky?+;=AFuOkZDvj?*cTTOpV zzT2ile|57`zc@J^eXGqwYZPXe}#Q@3MjvYt4d;_7ieF+EH>w7ee zH3HzVhCT^|iNo~yUoFH(6pGW0{-)?bqW8EgJE*}$?Ykn5R#2SY$Z>b61ChTS8lUo+ zk7HO=`B;*$&EyES0k*^4pGPoi6G|fwAF3 zLFek~2aLPN$!Kn}|6yyjP|_;7Z6qg@gZU>X`DqE1h$@Ut8xC8;{iDWz_{gYde&TJ^ zQLv}msgt=I^ruS5_|e#pqO^Yskj<{1mZ4@UCG%H*hm}U7sN`axiIjx3YB4gN-7o>$ zJGfk$2PYCL4v*0V%}9xnRE(&Fz2QOKs2jB!|KRj6VZB>jL^2&ZCFqMjoE6$t+UB;6 zkwij&L~Rf_`$%Q_a(P4ii-Ug$a)_t`-yCCMYrRUDO7E6AjGZDf29=8GA1O&;Dno2C zGK66PpjSmPEcoAIMbg^b&?E`Oq`!_(Zq|-}rB0TZ3aB6hRD`Mjry}s-Y=twhjI1dO zwV-982M70EdzGTW=CpPyyBV=<+->cEYg0)dgeHZuA$;Q#AyX`qKua6IlhO?JW~#3b+$xcPes~$#^=%MDb76!bMu1fM zRi-y_tb@Nd)zpB-ka<-;l)ix6#kW?obtsK~ZkFkM?q~C^cu3;lOSXa^J_FeJ3%UK@ zjeq^UR_C!ao?DpNLDNl-p!|r98egv3OM{W~6srB|hJ&j%Us1slC2z2WJ6h;5X@Ku< zd|&(7kGuPo(wBpUk2^c=o!H9iZi1iteXqHG&ytlb8$faG)|C8V`1NZ%;ssX=7Jx-4 z|Bpp@wY7>UK8_6uG9AEyLRo_1GWU{r9bPZ-0=>=y1ONA4L7Y4`bYo?CiVzygyJ4Nx zee{B=Y<#dS&R(J*<~)fuzG_TaIP!m41iJrNgr{l4T1$kNYxKu1h;MoV-cUg|QwSrj zuC!lK{8un6!b5^-a*`@AIVUZiI@K>~1~0JgP*wX9SBVlG#i&>i&mpfH>`F98!&N3D zBCztRuV8HHTh_Wc@FyLn^b0cBiP)`ylS}oqNBI1|HOK8R?LL3D<)AkomZu7|PA&eG z9VCqv&_l{%Je{|W708iLM7D!JZ#9%vMhtbaNZqjAz7z(ne#s3fvXyf(U{XXb5U3~G zt9`3M&L{b>6z?p0=g!-eJZ1uT1gfu)t)6H2sZ#bQtI<-MCVk-!hgU(9$J6ZbQ%%(Y z*HISDLXAyL7(}6B=)|3o@oHsig_WQ&2hDU&E_#X)vQ-CYtSDEVlGK#eRf=uICeN5j zzK+%3spQXBcO{?xT~HS4ey*mvheWI&&5+2|w6`$5pe`(^y_az*Q^K%kpGyxlb19M)Zk*SsU{ zd<6V$j;P$tbZnIkJe}{+R^C2ixc z6e=pEbnkwfxiOqP`@%Hew7F^xkPmj-Q0FAx z#EfE}D;X)VIPtS+n4Xt{u^{;BStM~PX2USK!9l3_-DitC+GOH8%Bqxgzp*y+T`@{z zXvmoVaD)+l=?pG($_&?aOIrYrU=l)uoN2+>uQDeC>cBvzii|o812TMA#mE>=;t%C# znk1a2rLmhQ;LpyB5{Rrq70oT}ibqY(j7lZ>Tr)FY|Ch$-L5ePUnG^rw*h*EY_=5q4 zWTI}+CrGdeAzI7PHjgjxlT&jTYwylh*+R${XVSsrEDsfr*&cN5N*3QMOk~`$l^eAS1}zApxUr6{nY!BQmeF zokzC^{)RSxM0J`^2cuV$Fq=;6vMQ%!&LI$tkt-ND64@Hbp{1jBP&k#0@j%6IM8b{= z9T2SYek8G3m3CJ@O^EKjINF5pDCc%&^otx%fT7d`Rk z;gk05sA6vK)Fqx>)m=}F=BC($u;7HRn_m||utzOQMP~iBC?L)zad&|k9#qFd)sUKj zNINj}4@7`~cZG(kPVAp4U*Ksz*mhVCtgl$acY9>9>2Jd_y>bP}2!Afmh+tuH;kG{v zeHr%TbOyyDQLTR?^lj5(!zYz4S4A*o-SJ0-AZXi^(m@SFG@)8cuyY0NsyjldXEtd) z+>+q+Zy{=TVQbH7r-!%Nr$!IxD%WcLCnKzD&!jbRujG}kmAMd4|J&|s1#g%~R#kdS zQ{`;$e%%Z9pNv3>pGW^_YqeV+IKaO0gW<(X{6u?F*1K8RuocPUX-p2S~4oK~ykVKEsYLhq7WzsAdli$v2~7DS?wtTZ}-> z+D0`RAieJ0&pxhD+7=zWrw{X7HT%JVa#x^GAjZxHk>aHHTe=|T&Sp`Mg2`UM(Q6&R z5#WPVJVKL{|4U7=#JNyU@n%g9B58p#Ek!(ImnY*iUZTiOG_N#aziufXgMkq?Cr*t@ z<5)p195Lu4<4xiYEXWm=Vd_M=m0f}DC3r`<>13TC&VNNb87odD>bTA$i)tmwPL5$s zq91yDuSK+(ITuq^MlGl;$PLk1Q7$E-;QyHNqWlhs)rMmv__1Qp5rv!8L4(TRG-ab9 zUaMvg63u1AOhGYNXuVMq-IKPZPIMm1uYv(zv{p2ZVU$i2is?zu6ok`ivYK(i&T}i( zNp7jHYt?5jR(4G8!8JTW0#U7`%nc(gy6$%y#gLQ(J7FjU2JoF;0BE5i)R5< zX1mK`94j72-)#}Gq)4`PGY=UBmmwIjw<8d0{4YaZ_jfL8NVjDIcf;?#UK>n3 zpNoNMNhFYLeVzoOvPP)4SIRKduo93wCH8rJQAUe|%X@%2=j(z4l_u{Vx$xA1U! z9(CrST4+XJ<^K0#uEARD;jy_btvS18s&xToVP~RcDtd`- z@U?iwz?xS^sNtRwR@V`Je13rzO&hVnqwaZ}xAWoX8n%i}E_dDESvCzOUzJ?$s<&i+ zU@H(dmfFC?>8POwePGq68_A%HB~3Ul=$DmR3J(w<3eD7PzoI~|^cc@%+l!o9H!65R z+>3_~G6rpMcp^X)3$DpVDsw5SZfNSXn3hyo(NwT&{aiN;=P(WF-Qva>C&2Ea_f?C` z97!Xyc@x>AxgiLk5d@65E&((`dBXU$KjBO1X7GFy3XV1@Wx^=+)X+RhbtzjGaS2vmSQU6 zF{+(T^Be8%>~oW9*RHW!@bKU&|J>@r4P53(!2SLE_6HUO^o0fP?;rVr$A#Y+*u%lg zyS*;#lT34k9fmO>_;?5dBKD~RjM&>}jBvFsJVgWTcp*<(-1s$Kc2x?iYj2EEATIoq zzW+MX_Yd(ZVzN4g6J5)WPe$$$*gWo4TPXNxffS?rd$pdR_LmVGtddE>JozUf&czHb z&1@`TfaYhk(9ogE5$6)AX&x7n`#}V}siMJKL)xE87%K`Nq_6-qLc))=IzuYoJ>bq# zDEF%r>5OrJB+waBYIGOPVf{)ZH$0Td2ufrF9E`i8mb@f$K_ButQpj8rdG_;$eU`(4 z&4CFa1m8hvCIy1PD}ov;VL?V{sffFX()Vk~JQkz@aD*V}G)l2M*jov)ETCq}elU9x zlBnyo8L~-lRhnFXJ{pZW5;$;IF)G)_8mG;*?p<%4=6?)2U&B1B^GN#}LsO3y6B^eN zsq`o+c4C9u+*=Jafm+zutnC&9D`LvRHx=c5%+l5#%g|>#SQx7jO@b^$qSWRv7AIK8 zv6i+~{fuikY@pFdf#NMb#p=a5$<9GX+u_Ubq%s^&{n&QpASITE&eZu zii8?Fho+j(;uL?!&@<^7g6x|90|nJ~YM)LO=n6B&za7a$3$l2(T%9zgRl3x0J~u_X5<4-&#>LkQ116_`WUr~ zeE!~{MNgorPjH?~czgK#99g(nSgCHgh#wG!q}Gg)Vh5rA1(Y0Pd2D7D+0cc_VK%W4 zIx|z7`tXoAWU%>9caUzzVPi8NBSssc_iAoGmE&3}XIgxOeh2(Aq-TjS^tmc84*qd% z$z-q69HTF~a*-T}jZ4m$?mr&Eqx%A$Z_~XnIoUZx4|`s z={s0@uSFrOXg^7z%Ci`yloe3xQU7bO>tCqn|ML<4n8LQ0z_ge`yP81>Hw5x92STPm zg+uh69tmbl;8v9r>g#1OaFZT=F>K5^9H^r~!DO+vT0;_I-}@||-OA)Ca=ymi;lcp# zeP5i_rU1^2xy_s~m)9-3-r-HVehsxDR{MHFHii#_Y$}FnY z{hFvV!e_g!b*Cp`^z^t-6%^ew!~Gu4rHUbIJj)OC>2kB_rvtLi8m$N5G;X&Bn0fxr z8{TAoH7wjrXM?$3u2(jGOUo_Bk6q)<=o8T4A^IA$3m+|2%I{EL^H9{RBYA#9(06)V zv1ScvbNs7g}nAyqB`8teqe7`U=zr*CTM<2r_3@bqRD3XTG?s~pO1?=XDfEd=Bq6C;+K8V+>8SQ$ zpuELFx+;dEpHM^nt9@-I4CZ>IeFZUWA6Hk+Enz?B-(RLbcd6~Rs>0O-`1XyL6I8*P zT1y}CvC^MuARCq+_Br_Ze8O;J8)XnmH9}5b`z$`p+U1c$AL3hM3MEx@P`9?C_AuD@ zQ~o{oLxYT&mH^0KExVXN3%E|o;zwlUsH#}NwLRB4nU6sZo-d6jeX)?YPIfE*@d(Ag zDs%qh5w`So+8rr?h>|;cTD}A}x0|j!uU(z*vp%MYd?Pj5SwU6nKc=Ogg7Ws7XULtf}GO%(t_2|B??s&9w>=OnGa=|4nlaRBS^9cWKrFDM^WT6-%jj{5*uV7&5YP zvZ!EXQO$T$pq>hXB!4)1QN%f5V`z5tak;2pJ}0=?6)vK?MT#F|gPCwP+ZHIFxRYTd zDSY1lNpw-Q*m0r{JddBqV=l*PG`O_vb8ay-b)~2_9Jpy!2!mO0WR;Ys=+bi<(#O58 zs(gP~*r+L&kWD;CLGPJMG@^_jyf=+B%34f2{+sD&cyICNu)k3qIYUWpS>265Ni6{h zyI4t9l~DG`(uL{@d_AXFoEz5Zj4HeMc_3+;*`xJ}Xe=yg{GL~P?I#h6oD;K50(qv@ z`9cJA9!q+pLNO2uJG${#1{0aJ%+B$+##-_~wp|GihzlTpfe$-JQj9G&q=`ApS(RR6 zD|Ca8B%_oJN>K#MR#DVV!n7!l7@tlt!Ms`#-CcsbwLtD=Dm71rC7^P8fSFh&gQ2({ z7pBi}5bVg7gp3?(1;nXrOFV>IHC-__T0$oUJF-wt946=&eiyNb7Pgil;k1fzkX3>K zp%yly$yCT5OO-<$D3LRGEl*I57{BtBvv7`%fR-XBUnEOY z)US-1_Tq#>ITh24RX6MaX`wpEalChp{$lib*IaSj(uLUaf_Um+)zgEdh>JnzaumVj zu8)C7wV(k5;Lv$3D&y$ps0D#ZE)$$SG!d^L@aMl!WoY$(I*oGl3lI{yF*094&A7K| zPZcv{w1i2xXsG%$NkW5PlbGG1+LV%nBrF~S8`IfCMD*)0l%yFYht)EYW}PZ2O*rQ) zSVlH&1`El9v<|u2Ve|K+k#hR>5auCpxO0L`Cza}|xMZ+qn+N@7k{Ave%8GWm`;83XjoE<`0oz6pAO;d*m@N9R?qn@;qr(iv zCUng+5?RtQZ>#78PR+9>52-A*8fmiJjt)VG)Wm<21VTXr7ASD)X7h^vpaG)Ky=8Ty z7iR(r#K^^}Sp&aRh*;W|hQ%;WUTJ~P;PZrsNHGz9E4yM`D^Y|Gz=QvS`lGEAGu8Sq z8$QL!6!V8=(?U+91eGjFn^jfHf~2rvel3S{?M5QP9(ygQ;|}VG1f{q`-T|0`5vl5# zF|@b+4LV$itA9J@HPu8zjYT$&IFM&)h&=t^d%_Qp4--Z_V2&dil4(bU6`+aWzp$l* zs(dl27sFDI3npWp5tPzV$oY0-pO<}T#*oOpeEF|1?R4jSjOagOb19qjVM(7{nm>&av-CAsPczm- zu1xA>(oBIaPe_}c)&hTX0c=s*9Ey?_$M{HMB$-=5Fy3fOB|}*!$0C@FAY4_Kq!x`6 z)RY_SjuMx>D?sfFhw4`4&<4&E1=dTkFb?76(;D8Y<~);gTeip@mFFrx63RHxtEnMn z*ybnvwQFENO+E~VTdA18-Z{1`+|zsr_wC!iTAn)e9n3^AJCuXAd0rDL7ZUIGESa#{T6}hVS3jq`{OKdq6O2V1XH5=QV|N;T8avw0Y`@K1JTYv3HhbV z4c9bccq|wC+HkG&_6Jd>TD6s4=)zN_@JqD%^%DuoC1;K`yvL|`joYT-Y?=m7DJuto zwe)gU)M$skG4O9GXNGzXbx+_G8JX{gl1Bj~$0i=g5 zX;N3@D5I<(=^_HkP!=HhG6YFu4FPHc`VZjxG&k;-a+}CdMeSyVWQ#_?|A)PQ3XU!8 z-v{s5w(VrccCusJwv8Rzws&mX-m%S&Z5xy4`OV2x&B4r6&HsI?-uGm6cU4zcbswx= z>%PCA>vGlP*Ts-8EM73#UF@+1>9(w>Rts?OqXwVvP~##OA?<7L<;LC_N5g8BP_|>z zTAV1{h{k+gh58yT8@vbiQxS=9rv%+Xw=IaKKkA;FyDM!J%_B7+1_Us~N<0oBpT6%| zWT%P6;r>M`zD`T?(m(X#eQ6oGP8()m*zX%0iYujz8i`9ytH!x8T{w3O=&Z5A{8pw6p^=6k=;~ z$3!#yZd6%1tA-dfhtCDe%0NOxM0eaU3rT2`Jg@p*tSS&&wR-H_e$1Yk@1wG`V{(JH z?i51S_yT|?@i;lEK|!y3S(7?(s2c}4R+Z^3szDvFhq@Be|Gt>1;ZpUVU3t-6*9H8KH*EF zuB>CiM1abj-d!kM*lV+3`(y+@L)CO?ud(s9_!+2860x_VgHuySzm;bX=ll}G-z_B%G-|qD(CA`etoC#6Mmjz z%UYlVs}s@dFJF&FPW_)7EK#y;aFGgj>sHVNRpS;xi|!ohpqveAZGZIJtlJK)U~kGR zFQo&H2>mDO^I?WOL4LGGo_>(T%Q?`-xlf4XP2WGW6k!q9FO@tb14){!cmcXbU6Fl- zLn(;mk7WN)!gw6JX;U{G=-i+mX)yHZ-+lijWgiNl+buP=)LZnQ`{sstU~ z-#4c@2{IZm6myQ1(&MP}^X@bb^Fe5(OE7xaMsvQI2FU->V(*(}0aS}T0Rsa&`Q3DX zwW(OK6rG)1J=^i3MH+uTs0wF&qACK}E$<2|j0cZ^err1C6QKMV3ws%Prh&!Slm_k$ z8=+fa3?2b_-`G=7{BOsuEG7i}w^s&ZE8}W0yBg!m!^n`wc9zbMdRr7zTV<$9`*ea0 z(X}!L4gjO5iu3z^B&3&16@v11=Fw?-GU`4x1z%CC;;_Ph zYB3_`YNt=IeEzG&N``!OpbRUM)_*EF#7)0)N0@L;16KZ^$>sZYd3!9M>-Y5Pc;WMS zx;0)H5+`5?FV|N`cXkWTc}XGr+XTAUgRMNRTi=M$2~p3eZ@trCy~8FiXTs~Q%xHB# zcsSXDuj~8;hsENgq5Cf$K-C0l%d6`skVA0JvptIpfw{DU8G1~-Ws3$c-dcB3>UFtw zJ){);oCnh2prNNao=hiA}o#_waK+0Pu_ z?|6UZmu<3-;e6kEu>*GcpzpU;nwttsr+TxrqZ6}Cu2cql;Cp^5b8&+LBHli%%$K3b zS#4ejJTXI|ni;TFHb0+p;GJi^pR1F1|CJ5t!;>=W&uJOGJtBkSoQuK!4U*~{t71do z0_&8X1nIa;sVE#uF7p*84oPBY(vTHB1Il%MTC4@>$TlR@Ej#$86Q}&Z4l(c)`rIc! znH~m;v{iz37N=G9zouuf@@@-%>|tFvy$5|f->j9|oT#$4$EY@Ym?+;>J;wOrz?!C1 zwx?w8{J{F`&^nN9`Ss$g;by^mVP4zZ^p9bV8=|k9>n;5Ym{yp5i@iLXAa@61G_tJ~ zYUyAR8==OZ<~4!}LC>;GO$i)c*A<~>VVDIt;eo&T5R&MHK<4H%(fcR+JjW-v=ElkLu{|jXxNZ*#&*O9A z6yo~(tGdMPV{`8IROg>=54X=Vb1Tl$h7n_PE6Q=_mnW5c)w=EvArBVjR{HFoNU<2^ z(~~J=my4sF3t6uB5wh>uANfoKxHK4nN|+U-%Ai zsN&mNM6U^a2@>ofiYJ6R00nvV>+lg!RDPNSLlHc|S=*gHRU3c-m+{X5Q)pXnu9WR> zX3jr%`f1wojqQY4@praaiQiT4dNeAi`SX6+y+MnhxH=!Lj^E2QO@0kLAIZ}K-{;l< zz6S?_B2qskgcHVe7b)+h^Kye(*?)0Sccn(NId&8s{%%;OsHR!NI%|@Kuhu4a=TUt6 zDEWKg)XU0?jWws%mp1y@*xcdI+sPTr_fNn^$$Vpj(MJ*b8QaL-@v?zE(5<7-;L!^; z`)G;ojT`G|tRN>R{!bT-p3Rb)M011LISBubnq+$Q&ZsV@$riENSWO6 z#KQgc(=eH4eH2zISLosYnb`?hW1^eaf>^cRvfCOchSk%YT(V-alv$+zFLpXo5cKn!c;sviMdY&B>A%p# z%TpvGc_=eA>-Grji|2VY8B;BxDN6RJ;EQR9{gt3;MHy?>WxD^!1Wt421pF+|WhiXk zQI(}P`nBZuC}u*_Pvila;*^GS6P#KQ*$!qjI(Sn3E$zsam06~SQ?e?`o|RK5s+szH>!?EuTxP7SQyHgbPvu3BT!F;+BD?8oIq9-DbAvI zSl>W$iVQm)rH;gb^e-`hz(iCoU4=G|Y`n}ScaG+ckU4*_Xd}>pf+_t}_)GS8;XDCz zK`35sfSDdzO$kX3HOyo{*QpM~BVM7;1{~Z0Lt6r7Sc)=bPsK*m=N?avDTg!rXY3_o zv`A6X%=s7R7uh?B6MLU3I!1V_QWW!(O^A{KgX?9+NIW*zC=pTQ2G}Mp9KbSo}vLR1^T)IN7o_%FAZ{oB@7g)4mvlg zK~k$-8~wL?coH3`-0)n0h?j5Fte?7ma%Yi&&|Yb*=;lj=C<;&0@pf)y zRIh2FgzHX=3%q8Lhm-0E-E2eyxtZp(OAVst->|ePO+LZMu8;@&&*FE}_kpq-l!C*T zHTzG8#o5aX^6CCcNz-SRfp+h=|ETzE6lmRD`&6#7L zbrc|Bvh>V7&CGfEohAxHaad8~>3M30bqZ2V9v*n?D0;%s{J8j&WcrenREHY&s4r#J z3fxrZs0H=xBMT2H6er;=1(PFutMfv_oH5oENeSB0a8mi$H<^oha5=%baYjFZk=*Ad z(c03IAGS`u8srigRH$RhD#}uh6rG}) zZXC#w*s%mQBY)!eXwME#+(pTl9PnNieXR@R!j54b%28AEBo$-bX0+>xW|7*XpmJ=5 zId*fiS;{=fonOQr&{lZE|Gg7f9xgk;#k5oRT=E>yt~P51J5Jp+ZSl*N&4i}cZ;8le zUdjh4-XVLqE$eSG=`=Ed@XXuiZkKSQxT&C6bCHSQB)-c z`)`8=nQ7{dN~qx?av{J@iI;VEQI%T^=VtU17iWX~B-04h!!#?!2=zx10|!&FBacI( zb+`&HLMmAZn<-~Rw7>?4Dy6eljRxD)ATp(-r%TDG@W-hd4Mgi31)@-Q$87!CE)_=g zJy5YQqG4r1&n&|Zr(*4Ic!&luMeu*)0y>iZKC=?hYnNyUMszXw=mkYOZ#5pJTL9YFX4;unI}Y*>>IF>}^ad zpp5GAASSl`0@1&QLWL;J!HPB06VLUcgjl+o{1Dgtd(+v~4dlNcZt<##5N=@0xeQe)I$(~%$tRlqf@ zgA&h?1R_4;4WTr`Kj9nLQv2L6A+5Bch9adzkvt$xmb88?+Fi|~#W$bN`rrB5ecPc9 zP``SYD0csTwUu2%c60CDob93PO*p4@*$Oq~!6w}d(94`N+}!23z;rXhk-f~1M&8`x zSe3p;Bn15AaUlHUahMqXZyO^D-h&OvI4su$w$T49ZX(9&YYw`?@Ga`E7!QC~4^%Ko# zV7*@20)TOr5gHv8bM3A*upsW@Q~G!uCoMd4sM3v4&NAqp73O^Uh)e7cO>-{=>oo_i z&X-{`&ODIxdjtcwyX?&{-9;4va(mN^I*s4V-#W*GaQd0aUUFjUSN7yN{;Hn)W&I_s zN|7)|f*nqXIbW%ba21mq(HbdMV^sPZqa@89RfRPL<5AI!S${*X^JoOh7aixl%9VH` zb6w5?xY@Q=&{ESEk4qGj-lA1M_e8}>>2MHrhSkNj zv&kY9XDyUJ#l3YRjt!aj4Grl{dBe_@F`pzcv0-n2hHOdkHlrx%P$n!Lw831wsa>rV z&{E%S#u^q;LpZXatkDjAGivv+cJm;%Ff5cuWPT@nH@IaO?ugXYN%R*)kVlYPQM0uP zdTJC=?U8fQW(gwMa*o$4lT9m|{?WvlyEXezEY#l#E)N6!@gbxwJx(?>B?lVG5SZ); zQPHJFkH0T$;83Cc@X0+=1Xhw8-UV#h846rp6)RWDK+2F_iXmO0$G9)y@}xP}^F zhp6x@k+{+!QsA30B{vx8h6%!^>?O&p$tWd?N_z%yVE%-r!E>|5A{|Y|NsJ`a!ikFX zw|{N_I*!>`L5QFSr0H!$m-<3RujIJwEzIS-Fgs`Sk-JFuYbt7BT}-=6)$c@1@PtsR zHR5mQ$ZKlwd=nc-ZXqkw_Q)relo!M9b3cLqWU_D$qCw_ zAARi%zyM($qbaqqIl@q@K*$n@{0c)O2%S$N$yDhlj%>xgQDU3~D6sZRx(K1L7KD)o z9XNZnr$HJzV*tK7F4!j9fX&x}MI%>%mGh^h>!D(zh-8Vu2-wY5q|C?b8|K8~KrhAf z41ITf(Nrj$rFh=qHdXoPn9n6uA%j}|IO7Z0v01VHNLQ-Cux8LtZV^T=6#yk(|5iZ> zi4+Oo+RRUOUB&#tQmeL+$&7w}a9T>*~HM%sV8Fp@enH1UG3)Mz{<3+g95mwa6IFiP#8?zZEyoR?MAi z9lW^H?o&D?8LSj+4v-m@#+u_l*;Wn7+w@y6-`zPVZO7GFqRq1lCW<4}Nus(4nRI7M zj!B|9VsaR+uos=?it6Z5UgpVL);rhY(Dm;*k)+m2j(Y#yMXI6Lt@@}&D5Cx}lj<#h z=P%xtIpt7(lU06$@ASLG&6Kx2TZxz7u<8wU+rJ4KKT+gKnQN>Fy^c3;5UX!%L?Z~6 zLZ#@9OVKV>$*X}*+HYWXbkdQFm9E=IVZ^%r>HGfWSTEm2X!VSj;p0~CMK61?u`l}y z>V-UC19UyvG5Xu$$rh1BOLGU^AM(PC!hehSS5_Ft{A=a0u5zPg@f;gfhF{lBZ%*=s zB3v%(MGCPpP$#>;trf`Xf5KyE z=g#jCUHfG6H>pM79-<^S^xfYx#JOyv?o3&Abgu-|kk((sP9|CtA};THCP&*^v} zKVg`Jx!h1+baQ*ac#Xs*!SI*wB*FM@tKLvk{a5Pz0mM^N=~ZUCvG)8E=>nG^uBIxa zWw}!K*9N^dSDjiEM88KEST`1ZvM@Jcplkm&^F39`t;^dhAs9NrA|h8p8sI>O*6Dis z-q2W*1g+$jB_80kt&G!Ed>VSkBDq-PBwnXjU4va_?w8Z6bAw){Gt@H8pQ@9QOc=jF zwTqJ50t&$$`WTG18$ww{tOC-@TdW(Yx9ClzNd-Ajq5{2AYZX8<72ReSkCy5_ZCl=v zDuPr5Z6>+ugP{Oxdezu^knSLCW^TDT8kSI4U{DxjSbV*esSAgs<-;p0Jjht2d$cxJ zVh-e$vR8TO#+0S7u?Pv}luCg9?LtB!77o@bA7x&S79nofya*vPEegsZ93jE!-~w*d z!}+B-A04VC1&m>% z7oCGbo**tkL_btTvRF=WCjvTZMnp21*NXY+YCC$pM{%l@HC~+SeKSq@{3m8ef~kg) zzyOg_nAk5a4uxDH-)uVL=$k*S<*f68r>A-T{+;Jo#5>DSj9xTv1u%okURb3|+MO{A zO<&C97=^qO!OON+hfU!l;-*H?>-T1xwh!RZIR-Ju;^_v97K^~^GOB6{?7x8c1Y04u z@mNp{4Vqv;22aeP*d`XLNWKO`4o)$&C@na#LUyrYc({L~!eC?KMGx#@!H?-fA29xT z9d@u$HK&-GStC6|c>3LcLP^ynBhvwcDT7)!zx>TX$Lc@{M3TH{%G zWgriN^9h#YLJ<&!KA*v2cCAGd8GS4sUzl{_z@_+HPbm#6jfdu$Shy7o`70P=f7b!Y zn($Ks*L9jlSu5x5+MN(nAz11H{j$&`_!Uy|*rcM!s+cNvkehFUx}##T@z0#cPVCJ5 zHhpC@y?q)Kt6SQWN#Qhfs}PPHXjKz?Jm@CasVP{DUuK!avBck;K&D&tVX)NsM&P4A zKZ+_yXiyhK_`K-G`RpO~vdumF$)Jj+8Is^rCd+|7RP!C52J`{T%X4%91TyH^cXeC3 z4HdI~ZVya5?spwWlo;q?Ia{R>ocRZ0Vg8`nh9zuZz0f5XZlWv#@k-<@GVg~( zn8Wj+TJ12#gPIu${if-@!^&c%n*Fbj(5Gb!FN{9Aw{Cps6kmHG2jE}kV7EZ7`R>}Fark&G?O&}s`^e?yT;kwIdez{p zyT>cr1i8(_d3ndj-6-VR2O`oD3$8f(4({ImG>vNH)j}GT2{z5ttZ;nN8BC@c14U}t zI}d-6a48%iF|JwFQ|{coXD%S;XF2Bvxg z+*j`4v=x}$t!OtBQB~+nn0clhRasS%K$xP|uH1RTpJb1wc(9^+3usB+AXzMf^|H&N zKMu8LWC#(EV-5`(q0;id=n-U!$=1h!A$2 zH+R~EZgPQ0Cm-txaP=hsQtvRIdXA_OeTYdee#u5hV3BECL^zv&JJqE7Q(HY^d!h%l z55>7b0UP{yf&x5F?+`aNp8=~`@H@Ic%O&{_&YU6-F_r#+>eZ`Szviw(v1PdDtN2q7 z7uVqjUYuKAt!Vw1bQHs6mJ(bJ{);&l%;m23#}iHVLJ!Xk9hr^k4YN(lkkjkKjicc+ z4DXM5YesegihNCv^bq=X2-8zbjL7ORO+F1TQ-ZBmr)ThGoKpGAz77hRkXahkQa1zT z+uf`F5OMT6=8ikfl}JMy0ez^tE$m5Rg@I@`+6jCh_s%#h?KW#FOzO8$ERLOUX^n$C zSL7W8#DD`Z#yjV{_>sUW92APDf=WgfZY!B_)g>)O2X-$F<514ypdM{rJP9IPp4zV! zsEi?WimT_L?W)T>re|xSdc3DG{f)&n+eF*2jGr;_B29fGF2Rdi2P_|d@4xQKVBSLs zR92aYJv!NRa(+5h4}?0e8xj<>V^D^s5aCEf()CSxuA`~3CgM?D4FE=CRWo#1F8u+k zVfgui6a>EHr(XnDNq1};y8A7KL58kyJyC|~0MrOWJ9*@hfEMi z2_VW89L;AWAdYfU$RoD$mx0+ARE#apkDuW=*Ta>-% z@CYU*W*Yt)ft}bmOIaQxUSO`S-)>~CW>7nD)5tq9iau=pyNY1vc1ng4opQ-9JU%|( zr@8B|yCb7lFXWvM{ap5VS&hS?y^rDA+YP_lQi1Q&+~Dl!!u_<^@r-1J|_ zelyQfA!JfjWV%gcU%Ud}w-0X*uIGoI2RE|;QmKWBG5%5zg2jcIum6V`vh%}_4-+P= zRvS#m3Fl3AjdHRLzN``02#I^1M9WWB^~}ItH+dZ^0K{&lj%Q9{45!4Fxuo%vjM4Sb$646WQc$EY^0x})stS94_U%`)?1|L&MUGjt-;Pq-FEo-; z&O_95y^Md%dTpv2w%p$VZwrK-=1%k zhkGBg2$?R4-L`};f4Uxh#^8y_bmr(~%(^JOSrpxMZ_AgU@}8d2Ez2vgthCP24XPu} zNSbQ3(pVY;)6x*QRTQ?&NOrn9luiTA_0C?@C(KKu8i~xge{C>=Vt75*O-^UKtiGFl zUp#a=Q}*L`KG9TvC!)HVG6QkSe zNC>H(i--=oK32a+g*@E4w|Cy~`MP?zpbSf1a2Mw|PAF7-E`Dj=rWQQWS?{#!>CDvk zB~0V*c%U0$IQmk|8>PmZnc3#$>F&@AWx68Nr`w|64@>*f7!-)5KcAu_O>+L9P9<}Pr zY4)01^6!lL*y^>`{2X*DTS*Ja-LyaT6m~d> z)}@hkQmc;+TQ+Axp{~YT*Wsggi43(}<97-`Llk=p)>?1s${nnjYLbRU8~CeSg+)6pt2x zs1fjT5=LcI?fMyjO1Mr+V#lRrC@L612>bwi9H-FxPgj;RL4=4qr&~4fBAeP$ENXlL zeNn@my=^XsazMf~?tb>~0d3vZ8_%29CtI<{~d9N1%i$@r1C7luSS0!VB zMX>b)yR&_}OlDu4VT#)#=4}dmR(=RmZbb!RW3I5;=V+@Wl#bFXBdD-3p>0>&=8dA-}u>i3cd~k;%`|jb`(v~kaHw5}EUHa+T<1ap|AZt$!>&q8g zQmf0Vi$*^{qC@lcOe7C_urSTlMX$%p>(H2i%9Th!PIan(x#@mRLNN`WfQPVFy#}ss zCe4&giWz^h6w7YFnD?vC;;_b4RCRVPz_Y6PZG`&;$r6@V#Kb9PzzLASp>XEJi#j=4 z*8TEbq$|44ku#C!dB9vILjzHb*{Nj@uuWeBNLsJn@X(_b3^d`%&M!#TV(Q*vhVh

    Z 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%0AErPNj{v_p~M$@Feq&*&4CzqZlWVt_eJ!uVhuQ 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