From 1064cf6b28e66da38a9acb844725c1c05f52dd30 Mon Sep 17 00:00:00 2001 From: JunYuLiu Date: Fri, 11 Sep 2020 11:36:45 +0800 Subject: [PATCH] Modify the format of markdown --- docs/source_en/FAQ.md | 2 +- docs/source_en/architecture.md | 2 +- docs/source_en/benchmark.md | 2 +- .../constraints_on_network_construction.md | 2 +- .../design/mindinsight/graph_visual_design.md | 2 +- .../mindinsight/tensor_visual_design.md | 2 +- .../mindinsight/training_visual_design.md | 2 +- docs/source_en/glossary.md | 2 +- docs/source_en/help_seeking_path.md | 2 +- docs/source_en/network_list.md | 2 +- docs/source_en/operator_list.md | 2 +- docs/source_en/roadmap.md | 2 +- docs/source_zh_cn/FAQ.md | 2 +- docs/source_zh_cn/architecture.md | 2 +- docs/source_zh_cn/benchmark.md | 2 +- .../constraints_on_network_construction.md | 2 +- .../mindarmour/differential_privacy_design.md | 2 +- .../design/mindarmour/fuzzer_design.md | 3 + .../design/mindinsight/graph_visual_design.md | 2 +- .../design/mindinsight/profiler_design.md | 2 +- .../mindinsight/tensor_visual_design.md | 2 +- .../mindinsight/training_visual_design.md | 2 +- .../mindspore/distributed_training_design.md | 2 +- docs/source_zh_cn/design/mindspore/ir.md | 2 +- docs/source_zh_cn/glossary.md | 2 +- docs/source_zh_cn/help_seeking_path.md | 2 +- docs/source_zh_cn/network_list.md | 2 +- docs/source_zh_cn/operator_list.md | 2 +- docs/source_zh_cn/roadmap.md | 2 +- docs/source_zh_cn/technical_white_paper.md | 2 +- .../checkpoint_for_hybrid_parallel.md | 2 +- .../computer_vision_application.md | 2 +- .../customized_debugging_information.md | 32 +- .../debugging_in_pynative_mode.md | 2 +- .../advanced_use/differential_privacy.md | 2 +- .../distributed_training_ascend.md | 2 +- .../advanced_use/graph_kernel_fusion.md | 2 +- .../advanced_use/host_device_training.md | 2 +- .../images/cifar10_c_transforms.png | Bin 0 -> 46693 bytes .../source_en/advanced_use/images/compose.png | Bin 0 -> 18941 bytes .../data_enhancement_performance_scheme.png | Bin 0 -> 54529 bytes .../data_loading_performance_scheme.png | Bin 0 -> 48509 bytes .../advanced_use/images/operator_fusion.png | Bin 0 -> 13533 bytes .../advanced_use/images/pipeline.png | Bin 0 -> 5954 bytes .../images/shuffle_performance_scheme.png | Bin 0 -> 22805 bytes .../source_en/advanced_use/mixed_precision.md | 2 +- .../source_en/advanced_use/model_security.md | 2 +- .../advanced_use/network_migration.md | 2 +- .../source_en/advanced_use/nlp_application.md | 2 +- ...ize_the_performance_of_data_preparation.md | 389 ++++++++++++++++++ .../advanced_use/parameter_server_training.md | 2 +- .../advanced_use/quantization_aware.md | 2 +- tutorials/source_en/advanced_use/serving.md | 2 +- tutorials/source_en/index.rst | 1 + .../source_en/quick_start/quick_start.md | 2 +- tutorials/source_en/use/custom_operator.md | 2 +- .../data_preparation/converting_datasets.md | 2 +- .../data_processing_and_augmentation.md | 2 +- .../data_preparation/loading_the_datasets.md | 2 +- .../source_en/use/multi_platform_inference.md | 2 +- .../saving_and_loading_model_parameters.md | 2 +- .../source_zh_cn/advanced_use/bert_poetry.md | 150 +++---- .../checkpoint_for_hybrid_parallel.md | 6 +- .../computer_vision_application.md | 25 +- .../customized_debugging_information.md | 85 ++-- .../source_zh_cn/advanced_use/dashboard.md | 5 +- .../debugging_in_pynative_mode.md | 2 +- .../advanced_use/differential_privacy.md | 6 +- .../distributed_training_ascend.md | 7 +- .../advanced_use/distributed_training_gpu.md | 8 +- tutorials/source_zh_cn/advanced_use/fuzzer.md | 32 +- .../advanced_use/gradient_accumulation.md | 18 +- .../advanced_use/graph_kernel_fusion.md | 2 +- .../advanced_use/host_device_training.md | 2 +- .../advanced_use/mixed_precision.md | 4 +- .../mobilenetv2_incremental_learning.md | 2 +- .../advanced_use/model_security.md | 2 +- .../advanced_use/network_migration.md | 2 +- .../advanced_use/nlp_application.md | 2 +- ...ize_the_performance_of_data_preparation.md | 2 +- .../advanced_use/parameter_server_training.md | 2 +- .../advanced_use/quantization_aware.md | 2 +- ...rder_optimizer_for_resnet50_application.md | 2 +- .../source_zh_cn/advanced_use/serving.md | 2 +- ...synchronization_training_and_evaluation.md | 2 +- .../advanced_use/use_on_the_cloud.md | 2 +- .../quick_start/linear_regression.md | 2 +- .../source_zh_cn/quick_start/quick_start.md | 2 +- tutorials/source_zh_cn/use/custom_operator.md | 2 +- .../data_preparation/converting_datasets.md | 2 +- .../data_processing_and_augmentation.md | 2 +- .../data_preparation/loading_the_datasets.md | 2 +- .../use/multi_platform_inference.md | 2 +- .../saving_and_loading_model_parameters.md | 2 +- 94 files changed, 674 insertions(+), 241 deletions(-) create mode 100644 tutorials/source_en/advanced_use/images/cifar10_c_transforms.png create mode 100644 tutorials/source_en/advanced_use/images/compose.png create mode 100644 tutorials/source_en/advanced_use/images/data_enhancement_performance_scheme.png create mode 100644 tutorials/source_en/advanced_use/images/data_loading_performance_scheme.png create mode 100644 tutorials/source_en/advanced_use/images/operator_fusion.png create mode 100644 tutorials/source_en/advanced_use/images/pipeline.png create mode 100644 tutorials/source_en/advanced_use/images/shuffle_performance_scheme.png create mode 100644 tutorials/source_en/advanced_use/optimize_the_performance_of_data_preparation.md diff --git a/docs/source_en/FAQ.md b/docs/source_en/FAQ.md index 8424f899d0..bc9dd1bd6f 100644 --- a/docs/source_en/FAQ.md +++ b/docs/source_en/FAQ.md @@ -1,6 +1,6 @@ # FAQ -`Ascend` `GPU` `CPU` `Environmental Setup` `Model Export` `Model Training` `Beginner` `Intermediate` `Expert` +`Linux` `Windows` `Ascend` `GPU` `CPU` `Environmental Setup` `Model Export` `Model Training` `Beginner` `Intermediate` `Expert` diff --git a/docs/source_en/architecture.md b/docs/source_en/architecture.md index ee7e34332e..43cf28ef2f 100644 --- a/docs/source_en/architecture.md +++ b/docs/source_en/architecture.md @@ -1,6 +1,6 @@ # Overall Architecture -`Ascend` `GPU` `CPU` `On Device` `Model Development` `Model Optimization` `Framework Development` `Intermediate` `Expert` `Contributor` +`Linux` `Windows` `Ascend` `GPU` `CPU` `On Device` `Model Development` `Model Optimization` `Framework Development` `Intermediate` `Expert` `Contributor` diff --git a/docs/source_en/benchmark.md b/docs/source_en/benchmark.md index cc19eeaaad..da19dcb1a4 100644 --- a/docs/source_en/benchmark.md +++ b/docs/source_en/benchmark.md @@ -1,6 +1,6 @@ # Benchmarks -`Ascend` `Model Training` `Intermediae` `Expert` +`Linux` `Ascend` `Model Training` `Intermediae` `Expert` diff --git a/docs/source_en/constraints_on_network_construction.md b/docs/source_en/constraints_on_network_construction.md index c166071953..2da31582ec 100644 --- a/docs/source_en/constraints_on_network_construction.md +++ b/docs/source_en/constraints_on_network_construction.md @@ -1,6 +1,6 @@ # Constraints on Network Construction Using Python -`Ascend` `GPU` `CPU` `Model Development` `Beginner` `Intermediate` `Expert` +`Linux` `Ascend` `GPU` `CPU` `Model Development` `Beginner` `Intermediate` `Expert` diff --git a/docs/source_en/design/mindinsight/graph_visual_design.md b/docs/source_en/design/mindinsight/graph_visual_design.md index 1aa1ab694d..64f6b32d45 100644 --- a/docs/source_en/design/mindinsight/graph_visual_design.md +++ b/docs/source_en/design/mindinsight/graph_visual_design.md @@ -1,6 +1,6 @@ # Computational Graph Visualization Design -`Ascend` `GPU` `CPU` `Model Development` `Model Optimization` `Framework Development` `Intermediate` `Expert` `Contributor` +`Linux` `Ascend` `GPU` `CPU` `Model Development` `Model Optimization` `Framework Development` `Intermediate` `Expert` `Contributor` diff --git a/docs/source_en/design/mindinsight/tensor_visual_design.md b/docs/source_en/design/mindinsight/tensor_visual_design.md index 8117ef8e0e..ce3839d5b9 100644 --- a/docs/source_en/design/mindinsight/tensor_visual_design.md +++ b/docs/source_en/design/mindinsight/tensor_visual_design.md @@ -1,6 +1,6 @@ # Tensor Visualization Design -`Ascend` `GPU` `CPU` `Model Development` `Model Optimization` `Framework Development` `Intermediate` `Expert` `Contributor` +`Linux` `Ascend` `GPU` `CPU` `Model Development` `Model Optimization` `Framework Development` `Intermediate` `Expert` `Contributor` diff --git a/docs/source_en/design/mindinsight/training_visual_design.md b/docs/source_en/design/mindinsight/training_visual_design.md index 0b19c78cff..599a44df3b 100644 --- a/docs/source_en/design/mindinsight/training_visual_design.md +++ b/docs/source_en/design/mindinsight/training_visual_design.md @@ -1,6 +1,6 @@ # Overall Design of Training Visualization -`Ascend` `GPU` `CPU` `Model Development` `Model Optimization` `Framework Development` `Intermediate` `Expert` `Contributor` +`Linux` `Ascend` `GPU` `CPU` `Model Development` `Model Optimization` `Framework Development` `Intermediate` `Expert` `Contributor` diff --git a/docs/source_en/glossary.md b/docs/source_en/glossary.md index 951360de4e..ae1fb21e91 100644 --- a/docs/source_en/glossary.md +++ b/docs/source_en/glossary.md @@ -1,6 +1,6 @@ # Glossary -`Ascend` `GPU` `CPU` `Whole Process` `Beginner` `Intermediate` `Expert` +`Linux` `Windows` `Ascend` `GPU` `CPU` `Whole Process` `Beginner` `Intermediate` `Expert` diff --git a/docs/source_en/help_seeking_path.md b/docs/source_en/help_seeking_path.md index 2b45cad1bb..ac924fcfb0 100644 --- a/docs/source_en/help_seeking_path.md +++ b/docs/source_en/help_seeking_path.md @@ -1,6 +1,6 @@ # Seeking Help and Support -`Ascend` `GPU` `CPU` `Whole Process` `Beginner` `Intermediate` `Expert` +`Linux` `Windows` `Ascend` `GPU` `CPU` `Whole Process` `Beginner` `Intermediate` `Expert` diff --git a/docs/source_en/network_list.md b/docs/source_en/network_list.md index 91b99cd6a3..59f2ad236c 100644 --- a/docs/source_en/network_list.md +++ b/docs/source_en/network_list.md @@ -1,6 +1,6 @@ # Network List -`Ascend` `GPU` `CPU` `Model Development` `Intermediate` `Expert` +`Linux` `Ascend` `GPU` `CPU` `Model Development` `Intermediate` `Expert` diff --git a/docs/source_en/operator_list.md b/docs/source_en/operator_list.md index cf548e1774..064eb717c9 100644 --- a/docs/source_en/operator_list.md +++ b/docs/source_en/operator_list.md @@ -1,6 +1,6 @@ # Operator List -`Ascend` `GPU` `CPU` `Model Development` `Beginner` `Intermediate` `Expert` +`Linux` `Ascend` `GPU` `CPU` `Model Development` `Beginner` `Intermediate` `Expert` diff --git a/docs/source_en/roadmap.md b/docs/source_en/roadmap.md index befe13ad85..774456c99e 100644 --- a/docs/source_en/roadmap.md +++ b/docs/source_en/roadmap.md @@ -1,6 +1,6 @@ # RoadMap -`Ascend` `GPU` `CPU` `Whole Process` `Framework Development` `Intermediate` `Expert` `Contributor` +`Linux` `Windows` `Ascend` `GPU` `CPU` `Whole Process` `Framework Development` `Intermediate` `Expert` `Contributor` diff --git a/docs/source_zh_cn/FAQ.md b/docs/source_zh_cn/FAQ.md index a27a12cbfe..903a3daa4e 100644 --- a/docs/source_zh_cn/FAQ.md +++ b/docs/source_zh_cn/FAQ.md @@ -1,6 +1,6 @@ # FAQ -`Ascend` `GPU` `CPU` `环境准备` `模型导出` `模型训练` `初级` `中级` `高级` +`Linux` `Windows` `Ascend` `GPU` `CPU` `环境准备` `模型导出` `模型训练` `初级` `中级` `高级` diff --git a/docs/source_zh_cn/architecture.md b/docs/source_zh_cn/architecture.md index 34766b7eb6..091f5ca131 100644 --- a/docs/source_zh_cn/architecture.md +++ b/docs/source_zh_cn/architecture.md @@ -1,6 +1,6 @@ # 总体架构 -`Ascend` `GPU` `CPU` `端侧` `模型开发` `模型调优` `框架开发` `中级` `高级` `贡献者` +`Linux` `Windows` `Ascend` `GPU` `CPU` `端侧` `模型开发` `模型调优` `框架开发` `中级` `高级` `贡献者` diff --git a/docs/source_zh_cn/benchmark.md b/docs/source_zh_cn/benchmark.md index e5fb7b4468..ef06735f46 100644 --- a/docs/source_zh_cn/benchmark.md +++ b/docs/source_zh_cn/benchmark.md @@ -1,6 +1,6 @@ # 基准性能 -`Ascend` `模型训练` `中级` `高级` +`Linux` `Ascend` `模型训练` `中级` `高级` diff --git a/docs/source_zh_cn/constraints_on_network_construction.md b/docs/source_zh_cn/constraints_on_network_construction.md index a0c85bb82a..8b352b2625 100644 --- a/docs/source_zh_cn/constraints_on_network_construction.md +++ b/docs/source_zh_cn/constraints_on_network_construction.md @@ -1,6 +1,6 @@ # Python源码构造网络约束 -`Ascend` `GPU` `CPU` `模型开发` `初级` `中级` `高级` +`Linux` `Ascend` `GPU` `CPU` `模型开发` `初级` `中级` `高级` diff --git a/docs/source_zh_cn/design/mindarmour/differential_privacy_design.md b/docs/source_zh_cn/design/mindarmour/differential_privacy_design.md index b4a2b2704f..2762196556 100644 --- a/docs/source_zh_cn/design/mindarmour/differential_privacy_design.md +++ b/docs/source_zh_cn/design/mindarmour/differential_privacy_design.md @@ -1,6 +1,6 @@ # 差分隐私 -`Ascend` `模型开发` `模型调优` `框架开发` `企业` `高级` `贡献者` +`Linux` `Ascend` `模型开发` `模型调优` `框架开发` `企业` `高级` `贡献者` diff --git a/docs/source_zh_cn/design/mindarmour/fuzzer_design.md b/docs/source_zh_cn/design/mindarmour/fuzzer_design.md index 17e0ebc7b1..81a730c30a 100644 --- a/docs/source_zh_cn/design/mindarmour/fuzzer_design.md +++ b/docs/source_zh_cn/design/mindarmour/fuzzer_design.md @@ -1,5 +1,8 @@ # AI模型安全测试 +`Linux` `Ascend` `GPU` `CPU` `数据准备` `模型开发` `模型训练` `模型调优` `企业` `高级` + + - [AI模型安全测试](#ai模型安全测试) - [背景](#背景) diff --git a/docs/source_zh_cn/design/mindinsight/graph_visual_design.md b/docs/source_zh_cn/design/mindinsight/graph_visual_design.md index 9d0b32d6c4..f84aa65eba 100644 --- a/docs/source_zh_cn/design/mindinsight/graph_visual_design.md +++ b/docs/source_zh_cn/design/mindinsight/graph_visual_design.md @@ -1,6 +1,6 @@ # 计算图可视设计 -`Ascend` `GPU` `CPU` `模型开发` `模型调优` `框架开发` `中级` `高级` `贡献者` +`Linux` `Ascend` `GPU` `CPU` `模型开发` `模型调优` `框架开发` `中级` `高级` `贡献者` diff --git a/docs/source_zh_cn/design/mindinsight/profiler_design.md b/docs/source_zh_cn/design/mindinsight/profiler_design.md index 8bfd003978..0171bd3f9b 100644 --- a/docs/source_zh_cn/design/mindinsight/profiler_design.md +++ b/docs/source_zh_cn/design/mindinsight/profiler_design.md @@ -1,6 +1,6 @@ # Profiler设计文档 -`Ascend` `GPU` `模型开发` `模型调优` `框架开发` `中级` `高级` `贡献者` +`Linux` `Ascend` `GPU` `模型开发` `模型调优` `框架开发` `中级` `高级` `贡献者` diff --git a/docs/source_zh_cn/design/mindinsight/tensor_visual_design.md b/docs/source_zh_cn/design/mindinsight/tensor_visual_design.md index eca40e518c..e3af486df5 100644 --- a/docs/source_zh_cn/design/mindinsight/tensor_visual_design.md +++ b/docs/source_zh_cn/design/mindinsight/tensor_visual_design.md @@ -1,6 +1,6 @@ # 张量可视设计 -`Ascend` `GPU` `CPU` `模型开发` `模型调优` `框架开发` `中级` `高级` `贡献者` +`Linux` `Ascend` `GPU` `CPU` `模型开发` `模型调优` `框架开发` `中级` `高级` `贡献者` diff --git a/docs/source_zh_cn/design/mindinsight/training_visual_design.md b/docs/source_zh_cn/design/mindinsight/training_visual_design.md index 8dae35eef0..8e5c5071ab 100644 --- a/docs/source_zh_cn/design/mindinsight/training_visual_design.md +++ b/docs/source_zh_cn/design/mindinsight/training_visual_design.md @@ -1,6 +1,6 @@ # 训练可视总体设计 -`Ascend` `GPU` `CPU` `模型开发` `模型调优` `框架开发` `中级` `高级` `贡献者` +`Linux` `Ascend` `GPU` `CPU` `模型开发` `模型调优` `框架开发` `中级` `高级` `贡献者` diff --git a/docs/source_zh_cn/design/mindspore/distributed_training_design.md b/docs/source_zh_cn/design/mindspore/distributed_training_design.md index ab026a6526..cb9558314b 100644 --- a/docs/source_zh_cn/design/mindspore/distributed_training_design.md +++ b/docs/source_zh_cn/design/mindspore/distributed_training_design.md @@ -1,6 +1,6 @@ # 分布式训练设计 -`Ascend` `GPU` `模型开发` `模型调优` `框架开发` `中级` `高级` `贡献者` +`Linux` `Ascend` `GPU` `模型开发` `模型调优` `框架开发` `中级` `高级` `贡献者` diff --git a/docs/source_zh_cn/design/mindspore/ir.md b/docs/source_zh_cn/design/mindspore/ir.md index be9b62d0a1..362544c7f1 100644 --- a/docs/source_zh_cn/design/mindspore/ir.md +++ b/docs/source_zh_cn/design/mindspore/ir.md @@ -1,6 +1,6 @@ # MindSpore IR(MindIR) -`框架开发` `中级` `高级` `贡献者` +`Linux` `Windows` `框架开发` `中级` `高级` `贡献者` diff --git a/docs/source_zh_cn/glossary.md b/docs/source_zh_cn/glossary.md index f3e5142b6f..647c9076f9 100644 --- a/docs/source_zh_cn/glossary.md +++ b/docs/source_zh_cn/glossary.md @@ -1,6 +1,6 @@ # 术语 -`Ascend` `GPU` `CPU` `全流程` `初级` `中级` `高级` +`Linux` `Windows` `Ascend` `GPU` `CPU` `全流程` `初级` `中级` `高级` diff --git a/docs/source_zh_cn/help_seeking_path.md b/docs/source_zh_cn/help_seeking_path.md index 3c365a8bc4..0c469483bb 100644 --- a/docs/source_zh_cn/help_seeking_path.md +++ b/docs/source_zh_cn/help_seeking_path.md @@ -1,6 +1,6 @@ # 问题求助路径 -`Ascend` `GPU` `CPU` `全流程` `初级` `中级` `高级` +`Linux` `Windows` `Ascend` `GPU` `CPU` `全流程` `初级` `中级` `高级` diff --git a/docs/source_zh_cn/network_list.md b/docs/source_zh_cn/network_list.md index 06c400157e..386ce5e463 100644 --- a/docs/source_zh_cn/network_list.md +++ b/docs/source_zh_cn/network_list.md @@ -1,6 +1,6 @@ # 网络支持 -`Ascend` `GPU` `CPU` `模型开发` `中级` `高级` +`Linux` `Ascend` `GPU` `CPU` `模型开发` `中级` `高级` diff --git a/docs/source_zh_cn/operator_list.md b/docs/source_zh_cn/operator_list.md index 2624cfc47f..4d675ac9f7 100644 --- a/docs/source_zh_cn/operator_list.md +++ b/docs/source_zh_cn/operator_list.md @@ -1,6 +1,6 @@ # 算子支持 -`Ascend` `GPU` `CPU` `模型开发` `初级` `中级` `高级` +`Linux` `Ascend` `GPU` `CPU` `模型开发` `初级` `中级` `高级` diff --git a/docs/source_zh_cn/roadmap.md b/docs/source_zh_cn/roadmap.md index 1dfd7945b1..6b24fdc3e1 100644 --- a/docs/source_zh_cn/roadmap.md +++ b/docs/source_zh_cn/roadmap.md @@ -1,6 +1,6 @@ # RoadMap -`Ascend` `GPU` `CPU` `全流程` `框架开发` `中级` `高级` `贡献者` +`Linux` `Windows` `Ascend` `GPU` `CPU` `全流程` `框架开发` `中级` `高级` `贡献者` diff --git a/docs/source_zh_cn/technical_white_paper.md b/docs/source_zh_cn/technical_white_paper.md index b23cfaf698..29f1d3e4e2 100644 --- a/docs/source_zh_cn/technical_white_paper.md +++ b/docs/source_zh_cn/technical_white_paper.md @@ -1,6 +1,6 @@ # 技术白皮书 -`Ascend` `GPU` `CPU` `全流程` `框架开发` `中级` `高级` `贡献者` +`Linux` `Ascend` `GPU` `CPU` `全流程` `框架开发` `中级` `高级` `贡献者` diff --git a/tutorials/source_en/advanced_use/checkpoint_for_hybrid_parallel.md b/tutorials/source_en/advanced_use/checkpoint_for_hybrid_parallel.md index 29d10dbbbf..f9a96c3bdb 100644 --- a/tutorials/source_en/advanced_use/checkpoint_for_hybrid_parallel.md +++ b/tutorials/source_en/advanced_use/checkpoint_for_hybrid_parallel.md @@ -1,6 +1,6 @@ # Saving and Loading Model Parameters in the Hybrid Parallel Scenario -`Ascend` `GPU` `Model Training` `Intermediate` `Expert` +`Linux` `Ascend` `GPU` `Model Training` `Intermediate` `Expert` diff --git a/tutorials/source_en/advanced_use/computer_vision_application.md b/tutorials/source_en/advanced_use/computer_vision_application.md index f340d98778..8ead2a76fd 100644 --- a/tutorials/source_en/advanced_use/computer_vision_application.md +++ b/tutorials/source_en/advanced_use/computer_vision_application.md @@ -1,6 +1,6 @@ # Computer Vision Applications -`Ascend` `GPU` `Whole Process` `Beginner` `Intermediate` `Expert` +`Linux` `Ascend` `GPU` `Whole Process` `Beginner` `Intermediate` `Expert` diff --git a/tutorials/source_en/advanced_use/customized_debugging_information.md b/tutorials/source_en/advanced_use/customized_debugging_information.md index 8b2fc9ef70..4d2add7d7a 100644 --- a/tutorials/source_en/advanced_use/customized_debugging_information.md +++ b/tutorials/source_en/advanced_use/customized_debugging_information.md @@ -1,6 +1,6 @@ # Customized Debugging Information -`Ascend` `GPU` `CPU` `Model Optimization` `Intermediate` `Expert` +`Linux` `Ascend` `GPU` `CPU` `Model Optimization` `Intermediate` `Expert` @@ -311,12 +311,31 @@ When the training result deviates from the expectation on Ascend, the input and ## Log-related Environment Variables and Configurations MindSpore uses glog to output logs. The following environment variables are commonly used: -1. `GLOG_v` specifies the log level. The default value is 2, indicating the WARNING level. The values are as follows: 0: DEBUG; 1: INFO; 2: WARNING; 3: ERROR. -2. When `GLOG_logtostderr` is set to 1, logs are output to the screen. If the value is set to 0, logs are output to a file. Default value: 1 -3. GLOG_log_dir=*YourPath* specifies the log output path. If `GLOG_logtostderr` is set to 0, value of this variable must be specified. If `GLOG_log_dir is` specified and the value of `GLOG_logtostderr` is 1, logs are output to the screen but not to a file. Logs of C++ and Python will be output to different files. The file name of C++ log complies with the naming rule of GLOG log file. Here, the name is `mindspore.MachineName.UserName.log.LogLevel.Timestamp`. The file name of Python log is `mindspore.log`. -4. `MS_SUBMODULE_LOG_v="{SubModule1:LogLevel1,SubModule2:LogLevel2,...}"` specifies log levels of C++ sub modules of MindSpore. The specified sub module log level will overwrite the global log level. The meaning of submodule log level is same as `GLOG_v`, the sub modules of MindSpore grouped by source directory is as the bellow table. E.g. when set `GLOG_v=1 MS_SUBMODULE_LOG_v="{PARSER:2,ANALYZER:2}"` then log levels of `PARSER` and `ANALYZER` are WARNING, other modules' log levels are INFO. +- `GLOG_v` + + The environment variable specifies the log level. + The default value is 2, indicating the WARNING level. The values are as follows: 0: DEBUG; 1: INFO; 2: WARNING; 3: ERROR. -Sub moudles of MindSpore grouped by source directory: +- `GLOG_logtostderr` + + The environment variable specifies the log output mode. + When `GLOG_logtostderr` is set to 1, logs are output to the screen. If the value is set to 0, logs are output to a file. The default value is 1. + +- `GLOG_log_dir` + + The environment variable specifies the log output path. + If `GLOG_logtostderr` is set to 0, value of this variable must be specified. + If `GLOG_log_dir is` specified and the value of `GLOG_logtostderr` is 1, logs are output to the screen but not to a file. + Logs of C++ and Python will be output to different files. The file name of C++ log complies with the naming rule of `GLOG` log file. Here, the name is `mindspore.MachineName.UserName.log.LogLevel.Timestamp`. The file name of Python log is `mindspore.log`. + +- `MS_SUBMODULE_LOG_v` + + The environment variable specifies log levels of C++ sub modules of MindSpore. + The environment variable is assigned as: `MS_SUBMODULE_LOG_v="{SubModule1:LogLevel1,SubModule2:LogLevel2,...}"`. + The specified sub module log level will overwrite the global log level. The meaning of submodule log level is same as `GLOG_v`, the sub modules of MindSpore grouped by source directory is as the bellow table. + E.g. when set `GLOG_v=1 MS_SUBMODULE_LOG_v="{PARSER:2,ANALYZER:2}"` then log levels of `PARSER` and `ANALYZER` are WARNING, other modules' log levels are INFO. + +Sub modules of MindSpore grouped by source directory: | Source Files | Sub Module Name | | ------------ | --------------- | @@ -345,3 +364,4 @@ Sub moudles of MindSpore grouped by source directory: | mindspore/core/gvar | COMMON | | mindspore/core/ | CORE | +> The glog does not support log rotate. To control the disk space occupied by log files, use the log file management tool provided by the operating system, such as: logrotate of Linux. \ No newline at end of file diff --git a/tutorials/source_en/advanced_use/debugging_in_pynative_mode.md b/tutorials/source_en/advanced_use/debugging_in_pynative_mode.md index 42c3fbe928..98c55656a9 100644 --- a/tutorials/source_en/advanced_use/debugging_in_pynative_mode.md +++ b/tutorials/source_en/advanced_use/debugging_in_pynative_mode.md @@ -1,6 +1,6 @@ # Debugging in PyNative Mode -`Ascend` `GPU` `Model Development` `Beginner` `Intermediate` `Expert` +`Linux` `Ascend` `GPU` `Model Development` `Beginner` `Intermediate` `Expert` diff --git a/tutorials/source_en/advanced_use/differential_privacy.md b/tutorials/source_en/advanced_use/differential_privacy.md index 746f969dbb..17b28a7542 100644 --- a/tutorials/source_en/advanced_use/differential_privacy.md +++ b/tutorials/source_en/advanced_use/differential_privacy.md @@ -1,6 +1,6 @@ # Differential Privacy in Machine Learning -`Ascend` `Model Development` `Model Optimization` `Enterprise` `Expert` +`Linux` `Ascend` `Model Development` `Model Optimization` `Enterprise` `Expert` diff --git a/tutorials/source_en/advanced_use/distributed_training_ascend.md b/tutorials/source_en/advanced_use/distributed_training_ascend.md index 79e37f45fe..720106f612 100644 --- a/tutorials/source_en/advanced_use/distributed_training_ascend.md +++ b/tutorials/source_en/advanced_use/distributed_training_ascend.md @@ -1,6 +1,6 @@ # Parallel Distributed Training (Ascend) -`Ascend` `Model Training` `Intermediate` `Expert` +`Linux` `Ascend` `Model Training` `Intermediate` `Expert` diff --git a/tutorials/source_en/advanced_use/graph_kernel_fusion.md b/tutorials/source_en/advanced_use/graph_kernel_fusion.md index 7475e3a051..25a44a0d46 100644 --- a/tutorials/source_en/advanced_use/graph_kernel_fusion.md +++ b/tutorials/source_en/advanced_use/graph_kernel_fusion.md @@ -1,6 +1,6 @@ # Graph Kernel Fusion -`Ascend` `Model Optimization` `Intermediate` `Expert` +`Linux` `Ascend` `Model Optimization` `Intermediate` `Expert` diff --git a/tutorials/source_en/advanced_use/host_device_training.md b/tutorials/source_en/advanced_use/host_device_training.md index 135518dff1..559954774a 100644 --- a/tutorials/source_en/advanced_use/host_device_training.md +++ b/tutorials/source_en/advanced_use/host_device_training.md @@ -1,6 +1,6 @@ # Host+Device Hybrid Training -`Ascend` `CPU` `Model Training` `Intermediate` `Expert` +`Linux` `Ascend` `CPU` `Model Training` `Intermediate` `Expert` diff --git a/tutorials/source_en/advanced_use/images/cifar10_c_transforms.png b/tutorials/source_en/advanced_use/images/cifar10_c_transforms.png new file mode 100644 index 0000000000000000000000000000000000000000..10dc267dc650764566f6d20b7f090e20c12f8e11 GIT binary patch literal 46693 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 Aa{vGU literal 0 HcmV?d00001 diff --git a/tutorials/source_en/advanced_use/images/data_enhancement_performance_scheme.png b/tutorials/source_en/advanced_use/images/data_enhancement_performance_scheme.png new file mode 100644 index 0000000000000000000000000000000000000000..6417031a63dd2bade4902a83934c05aeee6be195 GIT binary patch literal 54529 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 pzKPt;fIFnd3V!7C&)W!=shU6uUSe{iBeX zb|CZm=|A5aushFa6*BruW}OW$NKsHwE>DMo7n(d+dD~hBOYfiRhWJMfTJ+sV3ToI% zc70G)qXmu-+pr=smCGF57>JL*Bcy!(Pey=Nt^hXd1GOf4Ypf=|leU}WyWY189mf;I ztFp5*Rf&NfogiS~A5q~yCu{A)zp(}W@Am(%m_cDk|849A4(fOX{=YjYG5_0B3Q5v` z0V)+05m|NLly+cbKhiv2753$eW|X>qRNR|27;uY9_(2PO5O!ffZJNJ2VwqLv7T6{v zDGM0>|8Eceq}5We!6Nosh)62>E4kmX2x6g~a(0T)C1HVPpe*1~j$Z#f?vme?uUn%H z<_Dk;5RG^}jDL;e1U+iZM?wFe-R?(W7Z1as+h;PSdi+zx3dW`az{3Cf4Y<5^;0v%9 z?6L9xj(Y0wsH z1N{s5*U!9)_3}GXsi`L))43Ak%O9|wpzB$5S;J_mzXI1h>wg@Qk47Z=UfKRSP_XD7 zFHwWbTWBfCcmeR%@u-ET85BbNgRud2zq8Gco}*m}ukC>~KTd~&LULiTVL^T(%hq)G zf%plti{S3zEeVZci=?NzLYy@n<$rXFcNHUL!2H8xc!!Z8`dhrII}IWfd}CeqZ}-=% zqTA^YH{~dzr~p?!GIfMm^YXO=hIh{yKm6*30728NP5J6{H)G9|Q1gY+!hy-p zL*XPQR^ZDAlzp ztDs+1Or1lmDkhEguhV1Yz9GIRCLn*`A?JjePmf7FnZDaErscvmIMD;=f!Yp$^3Y`= zXe!Iy_pB;@!%L^{6JiEwNjv!39b8mYP!#^hN-l#h_Qz|w9D3QR;zYK`P6C27G~E+O zKVT$$a{IZ-B9@vKd+_xo1@2$M9hvq^_UkDKWt()SFWugPm(n;bO@+BQb+i%TLW5%< z39p?4d`tfNrqpj0uh4!x?~`0ANATI%H{d`x<*CXEBYKSeFI&Wa&u5oMz1~V-7N){S zw-%6#o;SZ>SKnzRaPaY@tz#h5CZ5Z5`(-{7;nx%NG4B4}7pS$<;Ce{RlFT?eh4b=f z(R;TAM^qvrBA|7e*(o9(E6sfR#}T<@yDnefyQXJ}z)dV9+A5gN6I@f`q=;JwD#Uu< zUv2BQ`wGvh;ZOkwI%FOk*w89wWgHZB%MnjANCT6KPzL?22891C3vQla-a`NW>&3I0 zgWxJ!3DA3%`Hmh3ms#vHPXHMGHn{BygtO*4xBX*;s5kgGZCyzuerC@8VWQ*%g6`_^&=ec z(?0;JR}ZOy#TRtnBL#>X5r(S&*PoQQdO>$6q^_Ne;ck-O9rqRcE^8zKD)S}Z6>Ca(rb2& z1P0ZHXTBhXn6k8t`s5(*kHOan*n%t}DN54YxuB02y&pu&(3l%oYC!I}0*QO?B;Vyv z@NW@MDOkh}k)L*oWi3tN9!x5)UmVT@8=`@i4mQ=GVY1SUu6ZX|NE3cAN-KG~+e$#l z=fzcoJn$pW;11+JoeR9;IK4OQBYI8W80sdmw#BmUo8^VRcsN*6am1~w*Dtn5UeiL( z%f|@UYgzC3nylB0cDa3bpkYUU+U5qZvY2HD5X{6)WfN0ViKj$cz-$#;dKkqOtsgI6 zz`Kdo3p;uD+pp54e1OfbBbkqr{j^NCk)tJRPYSCdNjeJE>Zt$;i4hoyDf~1kDoR1% ziOv4(#e6>fkIlI+6KD9aGT)gSCWebPsi93L;8-eEPyb@B5}6P0(L4T#zYQWJKz|GU zJ*~|CW~iFB%cYR}UUfXE;&?OJ;B+@X8xzjLqh1yw?DryLZB%?wv@4L&_G!7>#LVR3 zL)^qoT6H0^3~G&_wx!KAc4)QWn!ZlE^~3(2p~uLdz=MTz;&b24rlD_jN-*c)-FwgN zdwk+hJe#FrU#RuLf{R1{-LMnp_|5^Dlb%m$AnIo)Z~f1i2xfHypYt~g`J86;70Dqk z0l&5FE76hAV)hk|ss`D9#~E5~UvvxGAu-?G-u z=Tz?_MYeTpu)Hx=;L+}P1ok*LGgX05x7HrVqg>RhLlZa6K6@wDS!E(m8Esd- z_v)oz8l6iWFp~f2^o=!{nxC27Xw=|6PlTL~S2iYy+_Sxjh6HOv?u7abHwPQ}?vJfq zr?01*(xa+f51zuL_S)=Yn_c$t7Z?58Kjxu)LjDxvew2srh6|>X^o}$P($D$Gl}-2( zICaI5w3pR*GfjhU`V5a|2&_RI-P$*osQ8p1w<+G%1Lwjd#-25&+cg&Ih!7IgDR}7m z@oqxMro`J@n5NDU+8G!vx@nhJ2AoMD;8AdaH-fQW`81;z9w^$FFE@jEdKT;CYp^cT z>zP&EF)@Ye$YKy3X{UL|S!YY{L=G`p-$I>H^?H@RI6yXdbyvMrOEVPVaJ1ZOq-d5& zU}a#MODVNnzj|t_r@ff7X)Gcpb%gP%3wwvQL263ihPpq_C?aX9{awCjo3n7dNm}c-1BatA>bB0i*Vt zqwKfQTbY-OpO}?RLwP8SjnU6?4Q~0&{&@7nTgZp7-ziKsB7Ww{%ep3Z6CPh}XZJn) zsk?EHF>qdJ%o^|Iwenlb7b1XB+VHO`h8H*9t|UjNMLJuc2^KF0O+{B#ZHT-F*zzr* z{)s7^gNeiUDRSed&Mlc&HCn) zGCQqCsh#{_sAKk$HgsEb(0~UIgY5jw2~s)F?^Qx_EK+?XH?&}|$(H^4x!>T}UE9^( z;UNtb6_We}pm9FnvtsI0QJ&$_OyTRiiUo>h{^!+niy0WKO_R*>2+7`yws(@r(${{4 z%^t0bT`1SLljKjxjTZ>wZV2_U;dl2q9iE1I#QC(;6!(-QSEpa=l~?3<*)*l83bKsv zoK4D*ycI5r5Tc-<7v7pi!p#N&CvbhCtul zh`T~y;GEC}u-@OcL$~()784Klx|5GO8^$r}%YNlq?+xM^pN65Eg z=Rb~+R+@s5`bz|2#DN(mmUTJ8fxijaBuj6+1ZVMPmm%)s{n|y+-$a*eu*`G)L1h#T z8-;Fp4yB4jmN40;vPF8e!G-VBUBlNOeB(^WGmW+eEoQEK+|p_eeaV^-0^|>?qWl+Q z80KZ}F{dsDRE*XvoHh}fh(O#)MIp#p#g&{vc8E{Yb}DUE{T9>1pRqIU`oBoq5MOP{5_!ACv^zTWuU4M;rNfNE;aOG0Jg#s1~r`h*TV8j##7mngb z*yoPi<3gAfUFC7D?{BXFAB%r>Dkj8*>+!{QBoq<>3$QmCzRmY=<#EP%L@|Xm^V~j(*jd^KK_=oaB;9`{WV>YhH3| z3!FYs*4bd8BQicfOU0^op9v&Eq7$K9P>gvSgW%FTnMmgFcskySug5zmQAbz&^H@vr zht~&$pZkqEd}cQye?6=N4Fwq!qTJn?P^}A79?`eh29mUe#hz{^7gpXsQjfYw4GOKF zZ{B1lmUX>-MMl;2_fhbikJAbz+Sl@R8MmYkyd^rsGq-(MsL=%87jEsd@`qI<2bOG9=Z9hY zv=uozq3UYVrKLW>D7%qwTgSsA7BdHS6>ek;kPBK^Yo%ZM936p#8xm_92G*AT8n1k| zxCO6J#jH?>;%xIn`0RCdSK1&(Afnb=9}w=j+s(zHsfLm1>~yv5IgkFFANfNKMYsLv zNZ>)qQr~KI#S6aAWY*d43E>!0IK2ItH}#GS_qZg<=?JguJ_T4*RBZTpljNjX3VPQH zfJ6W+>-hZhTUl*Mu@u3=DR^gmsHK;oLPkh{8KGv_7rd*vAHWQ_Wpvvt<7q#zGlY|~ zp2WX}GhYO_4sU**67fv@-P&HEtIe`jgs*LB z6rNj=-smka{@q&k>kh1iC^eH=&O)lTqmG>pIVacduMa0|TzRwVdBNs=Q5Z)MBDdBi zf@&g5FPH@W!MEi;L`r_f;&J?(LF)OQ2si?AxNUieq8{w258-Uey*guM8B9Ze3hD~s zJ|b)$thZb+9ILSLj12W%H9TZ>J0XDJVOXG@Pn91_v>$>coWFe=U!Cn7tIM)&kEGBO znBK=#P6k{;m++J2Plt?v^r8QxPrz|K>^7LKx>G%J@^kr9o!(3~GmMFV_-+?s8F@59 zwk3Fqle#Wcg>ACXgerp6@J07C^F@MSH~P&f z;OJa&x8hA@<(9>_+eOAn?$YhX&0ot%7OH4bn3mbg;#B+zOsJu+D>e<`Euure9DyEn z^$x}X9cpsq$;>$-95(PE2m145acMt;nG5Bm{fV8viN4=$N<5}bAmW8y@-J8=!fV|} zI%JZO2MK9F(Kex6L#^|hB&EDNaeX9o!(%ffVFY>j-Rg@u6yw1cW|BU$q&yN;ie+N&9g*yNOMBIRCOyo3gbV9<^FO%&PUOoi z=%jS+yM6YjEA|GR_o$G4EY(4Vy`trf8FPpW^TF*&`teY)LiaSj-2s113sSPa4=R5iH$Tr5DwI4#h?j^z7HUtvwsA9{U&ey?Uk8r4UCaIvg z$>us%b=3*f=Akm4F8j#=mTKiGo=dxXQfB+YkTXyA{xjIFd;H;pjYVH}c*U5!&t`Rt z;Dd#Y*R6=`?w0#`wb0>A506(^(`6gNf0-m5hPX0%PX_xl;sc490HVjc%Q_j6Hz6+H za6CmMI&jb>_@xP(Yt8j$Y_Lm*`k-H5EobXiMHyVgs;CFCXBc zL+sr0VRpQtuj{nBBl(>+Ad$6H&zmXktoX5 z1!c8{P(}U~Q%Q-VC@duVbR*Vcx5A5fbHC6%CpMXM@gB}?)7E;-E4FY znc?9>6$*_^CpT0)WGK+G*Gv8bomnzEX`Lm$1n~oBdOsyA5)O8ju!#^|uX{Ph23kJh zm*{gTO!TiqNN^QB3?>2lP-pKfX15k^QJm>#Nb&WAO*PLlRfU&^x-gN;F$rH?G>XjB zN`wR?qrZJM!jS7KL*#KbI=k347P!S$k^N4hLu@~xI%V4$Ox7Hh1qE}WA2dx0*sZ^m z+5@PN-Vgg@4O~S}>9xU}z=lj9P*6QRJN|boO;l!*Go$`~-n$PrcX!)+B2UKj%FlMj z3zFHDTBbOB4>%;ecw(w(kvCXX&QPALs1@D|hh>rq6NL3b-$k1TJwpZ6LBoMS zn2E?I8%`GMT{d8X2&(oNY};qN)W8$AAFJImZ(Ut+%N z3!Hwv<QqrFmc_WWn3E+ua3V&C3^B2%IAQUs=2yRkS9zKN^kRCLo2z|3rI60LHq& z8WUPBa^q|G=Swt^c=6km%nnII7S=>t2C^^(1;1wHP;amgXIX7wwzh(MDcy28G^0y$ zb6;_ax=35pD#9SGS9NgF#TkP zVBq`{zp%@DuL$tvSIy{2HV0}boh7{{!0;T0e>?0}n%$6^^vaOeS0+kFf`A7wuhBg8 zV~(Cv@d3 zblS2ahoC0QwLhQ;QMpe84ErV|P7VU3Olc3tquW)b+o;wp+gFZ{tNzsev|j3O&nQeR zfa}OJNf_?eYw&Du%f>st3r@btN)qm^Z@poY@}V_mIi26JOeiKP>6Scz8m^h!;0`j{G9?{T4pnzZN}D^~LG%S_w1McMHn6sjqBZ zf9fif#d+z=m$}I2_~10|=vdJ<@&{V5UvZ;2|3W?4VL6@ev+E?;cVog{w7>9yvX434 zJb;5KVS$G2M3qeDta+Bl&vc!8gYOk8)$GOhs$}qFH`b0HLrSEp^=RMEZJg9euXf3Y zslRr#Ys_vLTGD=GW3{p~@Og{v__}AqC3}lLVo_LInAFx^O-clSVi^1ps04y2rK%0v zkpb_!{!;pb?n%%y1X(cl#w6vbY>gNO^Uh46lHI9Bgcy9ciBQ8#|XIX~l37x5*hsq2ptOvh}Z+ITk9F`R5CBqoCjMErCJwlss9S+5gG zu%8m%3p*skepJlI1m?ax81h-aaPl7f`gA$VBVUjh5+ZoYf|{ls09kfr{YnZNCh>k~ zfzC1QF7#n=AL8rQNKg*_f(uk{RZ*^jeX%0ShftF`wn}@;||_~Nak&ouN_WgSN9l zJKdMCX=2COA2~oa!jLi%?e1lc4=S67eRWTA=pPPmD6425Z@ z_iZw21z@fGHr=$3^%N}}zd=Nnb`LI&TGHSz0S`&k^VAMLv(nvbUtt1Rx{N=rH`#aP z41<`h#a~DDRK3I#^ib5B+e7AmaZ3+w>{v7HgCAUKgC)z(2Y>@ zVU4m(@c{)%dHC?vFZfEajb#9AroAIzA^H+b{_yJJ<3shytVb-0@AiE(^JHiLT-suW zfqqYP2!N2<*G(>~WIoJM|6ioN1yGzz*DZ{@2McZ?B)Gc|?(P;eKyY`L-~Jode30XqT~$yU5B6BCeX7#sLr+G@e{=gK zQ8o|MaaV#LQTF(5Kekylr0qliJLG%m5Ee_PEH$PSn+miOiOp^_28p$e@A7r0{v7KD zeNTn|P~jhlul4JfLoczb-IXOu+hjqB&3>^#w)Yjov+_puPluW6N4pu_=W}Z!7tiyx z-Q7Ge+U#`oQC$aXMQ=55p)pkxQeck>c%IS++>SAmZTJ>0$;dE{=xYEEumM3F&Ew|1 zQa59KP`yCdg7 zP(QOSeGhOOLL~D{#W7b}Z=jC%OW;WM=2=$dHM-g4wPAbcdpYB0mXBWF1ig;gsSv?) za=8;;!*i1XxzO`Fb$=uYVo__;5spu!mLR^%E4iX*jS>ZHK&Vk=^;k2Mg0+j+;a-bMP$k}=1#;3i>5bfCFYs=+3H!{3A%NFgB z=qsi-m-`KFKhCPFNBwJZl=gqm{S4NsXQ;_Guz?4EQZ3#>AbjRZd*Xd8RNUI~@WuZ$ zcXj#c<};7h(61a8b)3Xh!CrRMl6hvQU+O;}LKoSm)_0t30$hB>loYGa$IS5j2sX+* zKgkY^jF70H9z?M>Rh;-n%oKB0K3S7QOedT|uRI>ULT{y!6Mpw;!pzsK0DX!i?~~Q$ zySaY?d}(Vu_l)ATlamQa-_x_g#SicPhUiF(i1yej*ufP-?jd0O3I zo~MzYjH5bj{`2z&mB8Ptzv(uP*JhAdCs9TG2(22vvAQWV7hW*jx)pOu)nODK7?AYIC|J=O#Jicm8`o9g8s6?9cT{fw1xjZa)o#IJ~Z|Qy~gU7 z+8pBSlUnL`;rUJ+3&-Pl@f!S3=bQbqX&m%(Q(?J8(j0uVcEjJ_V>Uuf4ffh1AY z9pn9~6PMw$?hD)@z|%V0stM@EEv-Z^-N2*``_^?SG0@URAihzy(%!4ztGvc}Vqyv+ zMSA9|HJT6mn?(UBQ!7vchd^8kgf>(r9MHCH6lZ#cG$+ADw?1L+_`hOirKXMrgnuDr z$C-(L0A&c1>W1@$$<~%EZT0GgT^pZs{yy4|xg0xeHHFs~pJuFa>GX!5J4p7d)xA#^ zmW#~EPufy;T!&a(<-8Xb*`0gQM#H{~&6(&JeB0per3CQXE>QnB)nkNifl&MQ5{DfymaeD9?ARc)Ikw6Wq{trFgpkV{3q^0;8kot;^(| z>-zpP;XR(7Pw)BHfmxy)3D>@}^lqPA$u#e2nv##_?%v*~HOTH_5zwt@_P$m9v>%aM zW9NTa4_Z}ukJu+?ylIZ!AJYAuUhdDqylYSHB?lCtfqJZmheu~t`nderu^?~d16xVU zd5SGGq00!Ie3PAi9x*TNPEc#p#2T6Ib?7k3`ZLE6PJ(g5uV0(n+c|lwlDD_tk+5W` z05|SJ!xe92h|fcmh6f1$W*xdR5jDkBAz>~9 zEuo-KK!l`Uv)tr2=7=(SuvExB@acrF_jqCwupzo9ICqn(0oLTk2f!`_*1cZs;>reY zV$Ol!Yfil&|8~W3zs$2UA)PCG+RMxJF@J3weH;2?avn&@wwB~cQSfUWcQeVz>{6T~ zzp*iqrAW5XE*F~d8dE|J>d@MjH@5H$7RlX3_Jv4F5&RS zOaH_yZhO9Q`jjdQ7Y>3dQk6bXl;1M^#S76Mg)}kO(p4>Z=Q#A-y9ndud$79I)2Zrq z_xU2TrHl0CtgYKu79y$biZ-R$KXC8b;q4Rb_H)(=rO_Q!tJB5cEn)D}uY#CdcWm!# z$1i+a%e%W4G6GP_?IF(Z_Efu#40*nS+ntn5RCMle^pb1P#8?|!#}=F3^pKQ_W;+@J zcNK_)UDQ!fvJbbnL-h1$dm3?blvwrIlug`8L*?oMGU0km|>Xp#haV179SQ>l(D}%S+;hMCDLh$km_N85y$Ffys;p znKABVdy|pklw}5O%T?9Bs^H2NxIOrC;T6FFV9*1=Kh@Jt=2?*q?aQidia34i$UQqOYgdy}$p_9JPVWiH8^t9$v>G^<2Ed$lLPu zqb#Xx<1+RpNrLcI^oulq_OeO)%M*TWcoU}T9 zeUCEZi*zr;>2TFKGAH+;fc0ueJl}&MLn{*m!owt-mdiWX7wz=~s-v$DxY88~y|U^n z@ru4oBjt1z(`bPV88q=Zu0yX<%EQYFKPo z7(qwK)!Pl=>4_8Qy8f-URCPHAzaZpUqEh7HpDJKO204Um6$K?JD0pxQr?prAYDj2U zZx;GI?wptPf>X6{vcIf0^Ce{MUO~is-}aLq2;@Y>QNj+a1&WV_tf)W0_tkwR4BP5X zawlppRoSeZ&|`n(?DAD9D2^(PmY}#$WI_2(f6$i#d{(88^LJbsqrF6JNdnjQ@fwsr zVk#jUfg9EA@KeGDoSi!CHW)6qA7w_1Z(I3m68 zZa<%)WH3c~za^f|GR^(IOEhtXnhUvUjZDlHh!ND#h$W8milV{oJ1>nOs)e&$yuii3cEc~BfBz~xtA zVXEyR>_8*TIHcJMYTzC^3S~&b>DLyZkA~pyuPr2Dtu=xBpfE9u{7|i4TTtNGNjY{t zKMT~>)m2v4_&*I(x!g=hnpgD+p&NT3e-K5#>}&rq(P47vmu-%*)Zz_XsS(m)_=m?U zr(k}0x#xNsSDEmn0`Njk)Ddh>`KF@ffkoBOA(@aV9uB6txq(x(m}6q#?=Jz;`O2D} zbze)TW+d~gnM&J)X3h(Db>865Ds)t|p)M`sqCD_Qx;jxV%tbj#aE`-Kx`dXv@jeRZ zU+ak_3&%Wdx81n7@KV(^f1aB{}!dW5$Ovzy%18fiZTSLcoe7}w?xw79dAKF4cEWqQ*j5dw>k3M5S#O^nJ-7L-O9iOsCxpp=-k^RKT zQB&$#Jm~hY{SGBde@bmt9zMyqIZROFC75rD^9frU6sg{u^}#^Gzas|Gv- zelvA;U0rztybuWV{S){;V0Lb*SAQzu_sCc|7q>y(`9H|#4xR3 z@M!B}F+Kr7=V_wVuRH}O+}c`>GY@9}GETv+8d81{3CpL+&o0MQ%$IYdhP%~*Lcd-J zlG-lOD=b^1#|Uv#WT|m-r~$JAhg`u{+;6|D&3eXx6MXW%Y>wij&sv`G4ZqQUd8fYo zVtcB3ueIp$@;)sIFHSot6Zw$;0kUl9MF*dAh3y^s#=T6W_ld!$gLoX;6CX_eIv=cL z27@os`hXb{bCirW;AJtkpI(mIZNa~651kV|U#3a6+_HLozca6R>cY#OIGeMwlp9?a z6qzwcV(`5`8Kr8=th2xLI(cb7-=@;Hen#n8uFjBZ1y(P|>^gU^e(wuX#zkAq8mqM` z9zLgj$N7?{+dcRtz?#Ez`|b_#&Qy%AUuN5*ul-&m!Bn@n4^!v}=@Wc&_{&u4jvNRy z418nmtNT6k-P;4fuKdxqQZ1BwCnQSWXI~Mod(q)fWWP2O!@yiG5BP4+{KKE>feGw9 zoxyDOxlc7?#=wkg1e{&y^m3^P>5BsX<0G$jXh7N34*u=siqYK`>uV%}pjs(wKQ)Gh zR(O#-P-MEjtIK{l^X;5(QUl%vRu~YF&|2KDu$}~;p-aJBz?or!#@r3r&iEh*KhAP} zqt)uLX(OWDmqYZk?L?mHOW>ikx998J-@G1hy={FIXPk_97GNp}#9Z=kCvJXJLu%d< z&8?5N-m~w9+CXW7wjX?h4hMEnyV)-fW6oTh@RLI%2jU0Q=J!1KxD z{#rTs1tY}Qf%Kl7>|*03awrD!iE&Y)mr*|9NJD4lJf@<5&1QVIr^z%$U$AH+4Nx=4 zmS-6nJ2&|A1O4MvzV^Sg)cr@jg>!eO&&LHi#2~%>`9y-&+86!a;1<5U?wMp9IW(&P z?-{}4#(THz9((U(YKGN(QD4~7wr!+7?0c@-pv25JVM&3@L1aW&m^O}Q$>>{A54;Ri zI)}KY=a-P7{1w0Kai_*wgJ6=jh#`@?kkPm(!O)TWnnuqpp1LF>$&*Q9JSEoO)_1dB z(4yY~-X4kx4X8wY4lujnD)TfNnj1a$YE7ClhD*3atVsNwU<8P1Dvonu-4P}NE;)E4@lXX4X!0bbo?IK{5Ek#Xvz}NpG#0#R?r5I7|F25(r*uUyHr5 zCAw}e^@2_vZAB8DLxJZ>Ll0S45iJyOVwpzdY* zmY(TO(hY~hmua@>8PZ4e-8yerXwfVB^hrr#z;T+#*nZ1Uffl7?@;NJZGb3t`5^P1E zT=Ff*oVs~oxSTGpRFb3b<@12m18%qqt|T>Hc}O-V^^*@Z7rX)P0zYERv5Gw*!NAPG z1Lo71`hrG$g>$W!A2O2vx$RH&qaG3(yesNNZml9SFn{=HIeV`#5kQ7&QD z%`>v@!^MjKhg7a_UUeb9P>jz#l@x8Bye#1i-8^!RY)t39*y_)+4C6z~5LJjSP{f|&>LD(c=F*~4Z1 z{HGSc5gff4WnXe^EmT(ryU`>D_>a!|XDGnaHa-#Kk2n1}IU$=c5@`enS%)IN4a97E znyIu(iX~_c|7{Pk#LtgU)EfEhgJz}juzz^iwY6Z-X$sL#n_TH|HOORL3dL)+>+$fm zF+PGRkK@P6iocI9VTi~alhf9KcqnGk^T8}}eR#qhbyWsGlhaMM?=I5){lnN;$9_`S zZnLqRFQl`JOQ+W!)=)A7`L}*Ub94BnCc*HfVdujFfE!O1rbf=I=5aEuttdVT5r*G& z_A3%aZz)3OZ+WVpoC*f6cP&K^m2?gi&BZ4o5c`lj~|gV?ZLlu9%*3QKfr%{u?* zVl12I;WkuJiT5_Zx)6U+llqSqc=vA)fI3s2@`t>M&n7IXfm!M%Pl>)?6AQCC?`dDK z2L}hWLsjDR%Ng&O38I(?qO?QBoXFCKDH5fPY;DW)hUzRE7^l&kg(}bQe*iab0<+AM zA%E~EEbO~@^03(nFTWcGePmYdnczJmx^Oe8Yvwm^q$v^{I>*?w3?(GQ! znH&!&3!9&Bu+}^|JX~FBa@Ew) zF)nvPeg)TmC&NJA38b;iOib;BA2Vi0M$mvP7Z}HEiVf?Y)BS1;d0>a1zds}j8d}wR zpsVo)OU;wx<4^AHZ-GH*hl)7=h3c<4l9H2|Sy%!(I)qC_b2yaiT>#8ogBGkBD_?ka zeWcUu{eauj(t`i?t+1fSdiqLX?`WLm@V$cra9HO2f zIaXkx>*rg8O!z3;p&)uHVD$n+1uoA9hH7qNYz$3ENcakifj%xhMzCZ+rNv(er}vx) zUVAYn-BD#p?b_a^21u2VAU^h{V_>LqjR&@}1$B3K*V?MqsixwvEc%EQE6SVL+M-89 zL}+SjkMm$tgW6USzjNPn3#C)VwhT5mN$gd*UD93P6S_B zGw#kiGBALIi-&iIK!#b9UTdjYUS6K%ZOS7ME)|4XYR8E=#>B)Oeg+r+<_v#5*nkQh zYV9qTeANl;#qkm^pYL;e)B!S8qBMD&B-?WU#o*yt0!Al;?VkPbKkmi7z)WF$?cO*AAHu%1vb)V{3vAH%Mc?i4Jvzb^x+NoBw6PA!>~k1&Y0UZ zVBz}BZrM`HPPM@LAP?eN%O$0&&c91Y)`H}&hnNXcy?&bJvW=QuSO~;`0wUeVLRpX# z%a^eV2DYES_e&G_CQ{NPfD6h#Vh+j4gH^n2v6Nr}$EtSlMN>Y$l-xe3WUDM%<6>Nf zVsyha%hRr_Fw~pI#em`K7@@dIg(yg?R?w0eAtNS`%isBjjYci@Rrnpcbl_DQb{+)J zSV0Ed{Z?!yw&S6f4DvdK$CD?z`i%YDo^xRZP=E?q0{l~b*n`%kEVLLgbA}&mHF6V2 zb({g?1Ku*-_#UP$GB}Da(OY;R5Z-pcl6F>; zY#zsu3`zPeycgx7^E-fqB9ZV(gBiV~g6g0N>V=j`50lUbM2Z z+698^?(R>o>)Dy>t4AevAIqOqgij+JQSPH_ybr<4Rh_Ms zVGv)hhlrCeWIvTtf9qcbt^uvkq-zeZZFu!So}M~es#<2W$y$i&AjQTSs-0Q^TVND! zSNk}C!zuuXV<*U(&A|x3?&%w7!ZuSw=$V2cbh*w&_+wA@5Xq=^R{S(ff;w?plexN6 z_N8u|-PS}Q1lr;wrWq^TsiJ8%!X=+FG5lX4BKn z*{I-sxm~YWhu(**&LdvU$7@kOUAEQhF1^{~NYVHqCJn^w*|Ue`kuB$$fUz+!pW{&d z!&vWaJBHZhTHV=^CW`3D3vt_%l`G_)=;JuN6dxLYSDmpH{{896#?13Fm$(EylZ;sk z`5HLJ7crzac;kFK+G-J{UsqvsxTd8g3W#F@8gn7nH#cWMP`O&p1w3od!H6F)`J~l~E6-rqlouxD@<@qg!xbUIH-E@$vX+BVD(6 z(O>6K8+Vn>&5KwnwOC`_e^^itfUpDvVf6#1pKwv?EaeN=*BqWg3tjvBmR8LY_DMk~ zbvgnw{9UCMwze^hTyMrwKc|K`gIlIVLRP+nF4=@G*n}<}hZv|6G=4^$L)GHGg|%rS zW!FzAC+H2owi2i7HOnE&WUb@9DQ_DgY>8cSoFbh_B~pMrtg-P1TpX})wL|T%f%sC! zzMonf`t zgu9{G%RJ-t2MX2CH!fdQ#n3sJ0N z!`A!F3TZ>&7!{e66rX!M3>E88-w~~p6wPZx#!kal`Cb9tR1gL>qmVnv7+rdL4CG%-P#s6gFr2w zAsGak7!vZ!Q*vC?x(k)XsY+BV6oqFA5DMuAI3CxmJc=Zl~P=^E)_hhS5d|cIS>?IR};_$d=U^M-pIelaGF~y=Ro_A zgCHO5AX-N8)sP9MO%O@eZ4HF4!XRkE9YjOD>I`-EL4%=m{b}G`K+5;8n{|kNHh5l` z$kfgHZY{WEy8%t(6?R(Rzy2MSXOQ1hoHi_qx$i_Xe?)AtK_SmU2enr225v|UBt%eHY4Ch*H)%6aeQnvlzsuSz1!};{ksq_ms+Kx$C^he&> z#{C+P5pbO2wAq#R9CKy?15J{AVS@zT;OQ{i&FtIPAfgwAKlwRMe}jw!l)bC+3~t+ zKR^a2W8`mqkB5#9T*0{w^kdY;KgW3u?wKN#>H+2+SpJ6CDOaj7VrRyd*%tV-tk9v| zS-jCgcg)f$shL6i_`#R%ij9Di0;41E7MQBS%FH&~{^`K6#vTm-Z1g!1cdX*;@+A-?Tskm5@jO?C{0MvEXl z{s}b-g6dd5!2Sp7Ad7D3-wW(z&r5~q3~p0Tl)U;hm^@^r1ISE+Ee#6QHGX3_mh94Rbwb7H= z1w;bCtbucL?n9%a6ss^40(ggaBsCisJp9fvg*?}?HJL|8M?KGBWt;UZda5=tP17K@ z$l1K=OD*$W6f^$lMUG99Qbi;|C?UGYpPRw9Mo2bwq*XaW2#E2ND-}+Yv+8yMR*iZ3 z#XEee6C76rKh*UUtpO$h2-tnyRF;RW}-edKaRjdXbP>1Q5qrknN}l9qM@6aks7k# z3P~z4mm8;xk?82??7tKLrT7rDD>^mkG-Y)Ja`uCrKrdh>mjd=z8M{nJAW~tVHW<0$ znKk{ap;zd_q*b_|yqfRurV z;&wJf0=BK&jBQHcFt`Jr!m0(gdI+-x%m*KaL7>2tYB}Sc4L{KV`T@mVoMN%6Sq$W4 z!O?WV=t^;l2nwPw)du?=k5c(>GjSv}A18S;=K=HbEYObpi25CFz-icu-nYe=T&Yp- z41AOf89|>M0*37EK#!G#z+f>EgNP;L<~to4TKA_nct17og3;MICT>c3r5(5SS~43X9uz`#lJUS|hRVFrVT&=e{ z>T`Mfyb5J4kDf=l0Auok4RyA-(Yt1dAnnslMQ#Gx?pYfUOjEKVB*Q?>-Mz`NJ1Cpk z=R(KJ*XQ+r~LuK2WcUJk#W=Tm>zwH5wuSb5VR#D;p2|V zw)!GM9|X#=euU+CjqbWxGN;M{s1@}@VqZsJU*Kt-zc*=5dPcg&sKbiw??xT^-*_=2aluE7v)mG3jkTVxVX4{1{$Ukw;bU# zGBWb84r;O8MQV8k2DBamz`UHay$I}-et~>VuAUrEz8DlZj((tI(wTl(v|s^tlK!3n zs1V>#gU`fpm>Htq%X zAV6!5LBYmwN$2lZn&qXXYu(5=h5i=EP*CH{w%6ajm+7}4Io>IIIu!t_h*(Lg-)OlY zpS5U^29Ibj^3t z_W`iQO_yxrdTh|9>)U|M;#F4l;q;f!6zZKJyU<%3PwxkIp#Rhj8YE2iKr_^XBwt#c zGw?AI^n?-M#Ee~hNG{esYl2lIl4t}Nh-Xysr}vn)cg)epg^l(MEq^7ojW9qs6EZ;o zkP5lXt06t3`_T)30-=2>23Ut7z8tQ*Ec%QEcSA%BSBiE3ZAmpO1Q=R+NK8!>|c6mB`5 zJZROi0o^kdgxz6?;Ny#(a@rZrRG{nA=YXIDKns}lVEqr6Vs-=YS%N`9-H3&65E>8R zKTi$8BRw*ZQX~NgM_-eoHJ+q8&^trljUEx?b)0m9s8TL0@jg*HUsYBvz?m<^PeHu@ z4O%=jD{J)qfC@9F7?WnJq7;Hk2TgP{B*iQGicSi(H03Zr%T4i{u@dG3K$RC{iux}r zf+F*QXrhbc+QQ zJfypv`k0`P#zoTQ_?cXvm-JmgL;vTYokIFpGbjW+ZAKCC3O55cCQ3+~ER?mM0`JSG z0g4pJ&c?>F=U}+-w5h)-xtmA_m~)^+5Q+RT?^U%X+W5vGi#O`8tKj|%oC5Z5K`^Y| zRM(^X>^+m(Ys8(v#LAE830xKV;cIr{{&$G|a`UeR97;81++YtgUtdx{MCQ>_aF7Qi zb-7Yezj zJ95A)7*H~D-cA}npIP88xXn0|@ASR6>9fX&l(R@Mmk+C}$Ry4po@ zZX!FPM+kZjetR(h3S=1XXFbq#`b#E;Sd_V5{odM>WVDCZ zvE9heOrs?skR_maLFyfXp6z6)e`3KVCkyhUcvy1@HoAb_*N?xo;6XBJBP@ehMc&MM z>-2X}hf=zYW`wwHexE*Xg(lqQ#a7C5jtDQR2s(D535x7n&q|2aVrG ziu2c)ybb$=B^sC@EHN4^c*Ef8ThkIG_pn8HF-GAJKRNar!fe?6qs(7|r?{0| z=t&GRsU&<%MaX|(C*vS0f?AsqVI61!>ZcIPB?4%c%j5XI3KXkrSQyN(DUM1i+jOK; zPqCY;joO*2Qz)lVqaGwC;s7*#hG`O>#F`oBN>DJ}{N(N~O-N{H4e&s1pxTheY5N;3 z@cSCkBs(An+~xx~x{q=suxo$#GT!Oi&aWx**0AVjf$})ysBfnBoU~0mnI%bvMy!ZI zR%=%U#3Ptq(HVh_Av5n^SAceKqLwEXy?}u;d-L*du%P9~qid7_IpIVD;s5WGVHrNZ+{Z^mJ$BiOV+st`xB`xzi z0V%Yda<5`1;>pfe-0>yE^XAx_xP4}nWdbN{m6Vod*x5qP?SN;8T$wg#zEk(ptsP6a zR$TVmQn>6Gd(j}$NMpsuyHTu2?5dUv)dg%vx* zL|Io(^?#1JW{ZhK5M66NBL3$fqMfAr%YuVzdCNDAAD20o*MXyRf}HGpzMf-3 z4SZWPH+ST_A|xUT8nfV2BXD8?M5d@o&PldOCq3oRhzevY=xdd0E}~b#bJk|SANAMx z=BRUEhuwLG81~vMRXPr@A<^l54>O(;#D9m#Qw_p$Y$cdNkp^;cAl%^xtdPP|H``G} zen=**A`-!VbIRj?n?Reae&(}PwFlH` zuwIzXb{wJ7zvzIh_*@HS9N1^FRb;$vx4-BB_y~5%Q&|NHj7X^J%>7ClA6a^AR8J4H z)rwokUQ8N6aYWXMZx!&l7@6lr%7~eBOmq$i!db*BmG+SejZAvY7NW%NQ@Ps>YDaGS zuD=eV2efoDEBogBg5ZG2yAYoO=IbxUs^N1u$m-Y>Nh_6s$NozMvYiJCr zb8R&FT~LPA2|daVL>!vZHqYvj8gg>~D{ntuM3(Q}arW3J89f7py`K4Oc{2xU#LR|w zW_JR8g+Iihn}Nf*&;*R-UXhwQx4nYDNw-@Rp?_F!wEE#Y+*phK-^x%`3!xRXe(^WK zK~QZAQHoIQKt+JH8n~Kjzp*GXdF2ce0$H-zf{G5Z;qZ$`|60e;A+&4{6vBs(+s={I zeYt*7mPhQDD71sF%dm_qg{^4Oy~~yqmLVM0nx0Jj+@XfuJLe`aJ3VU`+b3>YIMtGd z+0DHm)2}PReqRWxGsk6t;so~sn;9P(7ZoBF1STq_i>ya{cZg>FqkHe8eIz@U7WSG@ z-aypH86DT}&C(vRmWn5C`{0n8Yl4pluLdS$Jkx<#36%ebe`tXli;EAs9(c@1+HqYv zj*_!CSB5l91Q*MgtXqY~P7jF!e7Ik(TcPIgAiS2xdrwslm$Ckp{hFf*J*Tz@cL_I( zoKa%eC0<*oeeGTgMu)t8ls?+viry4%uk-s*_re61E##tLRK}F2Z>v8Jql-XBg%|xA z^Td)U2AM=bepy~}Ul1sO_iY6dR z`z}b$Qh8ZfE=4y5c#)6=oL;9{WRPfB7i94Sa*XIld5C{SBt?jR@~y%&C?c^HoCb8X zP?BIMSS%u}ADcIU%BE`pk1`4(G+`kWVPK>}*BldrB1<|U8-j8gkvJ~9igK9E4ZcSb zGy&S^md$kHE(i#9&5SqsJ9*2^L4L|!`tO7=#qKi4&WLvQr;3@<6gc%rGe&^QI950a z{7~st?X^?&%bqwr#|OxAfnpSp=z>%ufOHJdWseFxl(@gewrLKo>)sPtA6D@MIM*zn z`wvxfB_82bUK1aHjA7QAgMma0FvUY9jNGxlyWpZCz-mchfwSZ?qQS?L%CgjN2&X`k z*xy^{Oj%Na0`y#Z*E@8xowRRkHKAo?49k2vAO!{V+S=Mlnb@r~`Ru|%i35zV-SlxM ztkKq1;09$JmPZ@jLl@rHYO)LGqeG%On6!2Q_7X8s&kZ?6&2t=b;dbL)C+_pA@zkB}O+gM(XUT)B)&M4fC{xAteO&Y{( z@E9NUO3#m38k#3Ye+BV{)Qgo)_N*a~X5N?HQvzhaQTkm&QNb30BVJ0si3lK@zrMZ( zHW6$+bKXf2c4hJ&7-nTeAxRFjkwy1rxLxF8XKV(VS&%Y+6@7sPl zM?$SUY50a@``%(6tEbaZw%MNfBS3CRjhTxGxnCk=hoVvi)d2<+vMb z4Kg2N>;x}wS2d?TG2z>74d6_T=T0oFtn^-A*Y+q?cx8p2dlQ&dr{-#bCfUB1@BGp( z&k3U-N(-u9$A(1vJ7x6yPx4ueM@8WFk(`Q7o-0G>kEz6&Me%wacuS^z{j$?aifr9+ zr&c3USjeSmHA0hV?W*&j20|EbF%egiMtNj%`{BAvvw#~%hI6VmMx|G0ptRdnPlzutv89}cHmRCsC)$guT-ocv&nw7#a ztQm6544vmNnu;_oA%^^>4HEOh8k^o0=dAcRh!OB{;@E9v7wl$!7m#MG<6T z`XTZ$uK~b|5)3sU*L6G9#eFaP?w} zejhkD6Og&&PaCOrpD*2SJ+Lw8HRd@ZfSg7?Khq#UIIH)3E5VQHE^eJ-TxV`K<9^uF(>A!L$P6KK932Hf2YY0wP%~pJ4S{ie5ped3{_~TuXqoCyf zg560IcTA>f&@60Z$R($+Jn{WgS?m0hue0P$}$eQ2AD*Vsds_HN}X7jY3$X>|M zgabV+VEz(Ce*Z=MzIRWln|Ek&3pOz6lP+74b#PlvP3?wW7`sqo?U6=B$FWDen9iTr z`~CD{bSFTdla_e$jU{dPF)%Icd)YgJX^$5D#I#c5ZAfb)yhWe4UokL5g#Jn6Ix7gO z`SJivt|FlK{hP%LIDVW?Hk;m_}HjZv4DmeQq*yHQb5GoI1+R1EKIR?fYZ z;Q}E=MMbqkg+X|J3~9s5(5o{%ugr+o^_+R12}_~83=K<89M?KTiTZnLY9cYwY^bkL zTp#&3XBBz=JFqEeHNN`{><}ah#6Zf)Mp&=t+{^G2g~Eo7CBmZ07D5xlsN-3?;vy3k zqEQN>uwPw$fbW>%5{Jx2Xa|^(MS7Tob>n!yMFug)XK~7~9eI@WHzb=J;b1rP^IzD; zcQ*tNzC~NW*>S+vKn1qw8h-vPHG!|$x=`+w^^XLNy+19CAt~vzCUiScLFQo%N)PUg zsyj6k_*@1=Z{;WSZ}A}j-Lihh1u!l(X!$HjCyu#*NUqLyW!snxVY+G$0o;@`>p$t)PL2jmjUh>faPfkJnSkG67ayOuMSliTJY&)-!8P^RUH7| z?&M_A3P*sc$3(An0BA*k>gUh=4EkpE9GEfWHvKOY z?idIfnIDS_z8%j*YFh3<%y9<8YT#c~i&Z1v>e=1Vr(`MJ;FNBYD#)*CXJ4~3G5HM- z%K;*`d)H6IcJV|bro@WzO8@`M|y7+u@n=i$ljfST4Vlz#qe!bf)iH6{znj$l3wrsMn#rtByM9M zB`p$nLV4+i33s6L^EyoUkp5Q%o7fedBkljHg6(jTwbJMu(W1N~1c)F3(6gWZF31_; zz;7SGmiABg&aD-apzjv_62eHp&O#rjFoVBI*hTT>|sWQ`va2(fSg{TKP|lagU4^83ydhdc5?au73Q`I|6>28Yi$CmIZxU6ZO* zZF2t|V{tV6XysJS7S_(+8J>BpfnWrH4X-DQ%;La@X9C=6*vLD0NJQJ;i+)(9<7Q%Y zb@y1!+(0;dHN2tH(RjTzIG2#$-?b;3`2pme+Oj3lz&LVm=20aBG!8+MaKU8 z6^jL3iTuxv|IM0`A|}-TZBU+ROK1;4c+VKhM^TmrlI8GM9bpz<)m%9`}$gZ z75zUKU*pLjF@PZ4oA+MJIxKiF%XElTLiA|xFCMi=vh4jan|tCV*0kMsJ|thmvAdb6 zDOjoakAjZ$?watre|UcA0?7O|2T`6cFhboVnBlZt?h1WbuQNh!TD=}rJhxq;4)aGjJg8b_DRS;Lnh{V-y$F z=XKOR;D+J}z^q=-*2HXZ#lu6cKou-LgYkg~&L7;+Y3JVJF7?Ka+%Hy_3-@idT`->- zUnXRAs_nf26QH!ljerIGoJ1|R8A%0Ny`i&E1CY6B(&4tY%Yx|hx02Y(B>*inpv2G$*NGFUDJ9Bny0@7LL8T&v&Wh}_7%l{5S@RgmGS>dE0g~-t+fC8h%EQN z)5@=9|2wUmH9~i2>_y_o+50|H@HdwtLB zzW;A)nDrcF1L|xJA3j`jzNsTBDB5fdqrzOj$G~h4T(Q0SPwOGy(z<0E<7BfWfuk$H zgX^P?%6adq0IsqA2<)SB72gg&X!YREOJKPHUzq&z<+m)*&JAg4=lXj4xV=@O)m3^~ z*3He$J8FI!EkC!285oKc@ArP+uxC#Xa3$2*!wZegOiWrPP859cHTNrvGO%XLy`3DZ z19ZmO+2*~voj$rJGfY5>tAXo@E?bFYB?1@01J|n^J9ez?+QNXzU%!4$Oi5u;o9y{I zprfPj>NeYJM& zLx9!YT4$xHU%!1zDk+)53(N%C&le@e0ykiSN_t>p9=eF#S#9z~E1gvff$fvD&61$p z{IOZ;+TFXoz(M9D;3|ugDMG-7iZwcGdL?<-fM)_H6ckJVndbc**i^|fn#luNYrkz< z8*q)s;na(s!N7D?TU%=|`|KR8?vSZx(>Ctg*Z1{nDR6n;#))^?fZhNeBmrFi0?M!d z8hu@I-^P56n11>7SD+3c0yg<>+`0u?e-D}s_F8&lb}bvQOAp-Z4qO-uT8w}1-n~=Z zbpk6LfbF7$1O}jc8H&y)1%mc0;Um3y$Tv0dE=h=gHKezSQr~d)&xcTNWd6|z|u;*dj*=OaZ z{C;F~zG(eEudj~4d|bVx^F_>V1K!tOzy{6DYOj(;5x0OJ?DB$wrp)Rrs-RuH#BBV< iy(ff(-NOTB$bb9R^`-t*j=Rq>0D-5gpUXO@geCxn>|#Cu literal 0 HcmV?d00001 diff --git a/tutorials/source_en/advanced_use/images/data_loading_performance_scheme.png b/tutorials/source_en/advanced_use/images/data_loading_performance_scheme.png new file mode 100644 index 0000000000000000000000000000000000000000..44c84c1f14dee40cdd76926994ab670494abc006 GIT binary patch literal 48509 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 Iy4}nF0uV`T!vFvP literal 0 HcmV?d00001 diff --git a/tutorials/source_en/advanced_use/images/shuffle_performance_scheme.png b/tutorials/source_en/advanced_use/images/shuffle_performance_scheme.png new file mode 100644 index 0000000000000000000000000000000000000000..f4c72a99fbade41067f9e6dfe6383634d06433a8 GIT binary patch literal 22805 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 literal 0 HcmV?d00001 diff --git a/tutorials/source_en/advanced_use/mixed_precision.md b/tutorials/source_en/advanced_use/mixed_precision.md index 43bfbbabff..b211b1737c 100644 --- a/tutorials/source_en/advanced_use/mixed_precision.md +++ b/tutorials/source_en/advanced_use/mixed_precision.md @@ -1,6 +1,6 @@ # Mixed Precision -`Ascend` `GPU` `Model Training` `Intermediate` `Expert` +`Linux` `Ascend` `GPU` `Model Training` `Intermediate` `Expert` diff --git a/tutorials/source_en/advanced_use/model_security.md b/tutorials/source_en/advanced_use/model_security.md index 1af2ab0416..5943973af3 100644 --- a/tutorials/source_en/advanced_use/model_security.md +++ b/tutorials/source_en/advanced_use/model_security.md @@ -1,6 +1,6 @@ # Model Security -`Ascend` `GPU` `CPU` `Data Preparation` `Model Development` `Model Training` `Model Optimization` `Enterprise` `Expert` +`Linux` `Ascend` `GPU` `CPU` `Data Preparation` `Model Development` `Model Training` `Model Optimization` `Enterprise` `Expert` diff --git a/tutorials/source_en/advanced_use/network_migration.md b/tutorials/source_en/advanced_use/network_migration.md index 71511c4356..7f9ac4b69c 100644 --- a/tutorials/source_en/advanced_use/network_migration.md +++ b/tutorials/source_en/advanced_use/network_migration.md @@ -1,6 +1,6 @@ # Network Migration -`Ascend` `GPU` `CPU` `Whole Process` `Beginner` `Intermediate` `Expert` +`Linux` `Ascend` `GPU` `CPU` `Whole Process` `Beginner` `Intermediate` `Expert` diff --git a/tutorials/source_en/advanced_use/nlp_application.md b/tutorials/source_en/advanced_use/nlp_application.md index f33da2ffbb..643d816288 100644 --- a/tutorials/source_en/advanced_use/nlp_application.md +++ b/tutorials/source_en/advanced_use/nlp_application.md @@ -1,6 +1,6 @@ # Natural Language Processing (NLP) Application -`GPU` `CPU` `Whole Process` `Beginner` `Intermediate` `Expert` +`Linux` `GPU` `CPU` `Whole Process` `Beginner` `Intermediate` `Expert` diff --git a/tutorials/source_en/advanced_use/optimize_the_performance_of_data_preparation.md b/tutorials/source_en/advanced_use/optimize_the_performance_of_data_preparation.md new file mode 100644 index 0000000000..a37367e9b5 --- /dev/null +++ b/tutorials/source_en/advanced_use/optimize_the_performance_of_data_preparation.md @@ -0,0 +1,389 @@ +# Optimizing the Data Preparation Performance + +`Linux` `Ascend` `GPU` `CPU` `Data Preparation` `Beginner` `Intermediate` `Expert` + + + +- [Optimizing the Data Preparation Performance](#optimizing-the-data-preparation-performance) + - [Overview](#overview) + - [Overall Process](#overall-process) + - [Preparations](#preparations) + - [Importing Modules](#importing-modules) + - [Downloading the Required Dataset](#downloading-the-required-dataset) + - [Optimizing the Data Loading Performance](#optimizing-the-data-loading-performance) + - [Performance Optimization Solution](#performance-optimization-solution) + - [Code Example](#code-example) + - [Optimizing the Shuffle Performance](#optimizing-the-shuffle-performance) + - [Performance Optimization Solution](#performance-optimization-solution-1) + - [Code Example](#code-example-1) + - [Optimizing the Data Augmentation Performance](#optimizing-the-data-augmentation-performance) + - [Performance Optimization Solution](#performance-optimization-solution-2) + - [Code Example](#code-example-2) + - [Performance Optimization Solution Summary](#performance-optimization-solution-summary) + - [Multi-thread Optimization Solution](#multi-thread-optimization-solution) + - [Multi-process Optimization Solution](#multi-process-optimization-solution) + - [Compose Optimization Solution](#compose-optimization-solution) + - [Operator Fusion Optimization Solution](#operator-fusion-optimization-solution) + + + +   + + + +## Overview + +Data is the most important factor of deep learning. Data quality determines the upper limit of deep learning result, whereas model quality enables the result to approach the upper limit.Therefore, high-quality data input is beneficial to the entire deep neural network. During the entire data processing and data augmentation process, data continuously flows through a "pipeline" to the training system, as shown in the following figure: + +![title](./images/pipeline.png) + +MindSpore provides data processing and data augmentation functions for users. In the pipeline process, if each step can be properly used, the data performance will be greatly improved. This section describes how to optimize performance during data loading, data processing, and data augmentation based on the CIFAR-10 dataset. + +## Overall Process +- Prepare data. +- Optimize the data loading performance. +- Optimize the shuffle performance. +- Optimize the data augmentation performance. +- Summarize the performance optimization solution. + +## Preparations + +### Importing Modules + +The `dataset` module provides APIs for loading and processing datasets. + + +```python +import mindspore.dataset as ds +``` + +The `numpy` module is used to generate ndarrays. + + +```python +import numpy as np +``` + +### Downloading the Required Dataset + +1. Create the `./dataset/Cifar10Data` directory in the current working directory. The dataset used for this practice is stored in this directory. +2. Create the `./transform` directory in the current working directory. The dataset generated during the practice is stored in this directory. +3. Download [the CIFAR-10 dataset in binary format](https://www.cs.toronto.edu/~kriz/cifar-10-binary.tar.gz) and decompress the dataset file to the `./dataset/Cifar10Data/cifar-10-batches-bin` directory. The dataset will be used during data loading. +4. Download [the CIFAR-10 Python dataset in file-format](https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz) and decompress the dataset file to the `./dataset/Cifar10Data/cifar-10-batches-py` directory. The dataset will be used for data conversion. + +The directory structure is as follows: + + + dataset/Cifar10Data + ├── cifar-10-batches-bin + │   ├── batches.meta.txt + │   ├── data_batch_1.bin + │   ├── data_batch_2.bin + │   ├── data_batch_3.bin + │   ├── data_batch_4.bin + │   ├── data_batch_5.bin + │   ├── readme.html + │   └── test_batch.bin + └── cifar-10-batches-py + ├── batches.meta + ├── data_batch_1 + ├── data_batch_2 + ├── data_batch_3 + ├── data_batch_4 + ├── data_batch_5 + ├── readme.html + └── test_batch + +In the preceding information: +- The `cifar-10-batches-bin` directory is the directory for storing the CIFAR-10 dataset in binary format. +- The `cifar-10-batches-py` directory is the directory for storing the CIFAR-10 dataset in Python file format. + +## Optimizing the Data Loading Performance + +MindSpore provides multiple data loading methods, including common dataset loading, user-defined dataset loading, and MindSpore data format loading. For details, see [Loading Datasets](https://www.mindspore.cn/tutorial/en/master/use/data_preparation/loading_the_datasets.html). The dataset loading performance varies depending on the underlying implementation method. + +| | Common Dataset | User-defined Dataset | MindRecord Dataset | +| :----: | :----: | :----: | :----: | +| Underlying implementation | C++ | Python | C++ | +| Performance | High | Medium | High | + +### Performance Optimization Solution + +![title](./images/data_loading_performance_scheme.png) + +Suggestions on data loading performance optimization are as follows: +- Built-in loading operators are preferred for supported dataset formats. For details, see [Built-in Loading Operators](https://www.mindspore.cn/api/en/master/api/python/mindspore/mindspore.dataset.html). If the performance cannot meet the requirements, use the multi-thread concurrency solution. For details, see [Multi-thread Optimization Solution](#multi-thread-optimization-solution). +- For a dataset format that is not supported, convert the format to MindSpore data format and then use the `MindDataset` class to load the dataset. For details, see [Converting Datasets into MindSpore Data Format](https://www.mindspore.cn/tutorial/en/r0.7/use/data_preparation/converting_datasets.html). If the performance cannot meet the requirements, use the multi-thread concurrency solution, for details, see [Multi-thread Optimization Solution](#multi-thread-optimization-solution). +- For dataset formats that are not supported, the user-defined `GeneratorDataset` class is preferred for implementing fast algorithm verification. If the performance cannot meet the requirements, the multi-process concurrency solution can be used. For details, see [Multi-process Optimization Solution](#multi-process-optimization-solution). + +### Code Example + +Based on the preceding suggestions of data loading performance optimization, the `Cifar10Dataset` class of built-in loading operators, the `MindDataset` class after data conversion, and the `GeneratorDataset` class are used to load data. The sample code is displayed as follows: + +1. Use the `Cifar10Dataset` class of built-in operators to load the CIFAR-10 dataset in binary format. The multi-thread optimization solution is used for data loading. Four threads are enabled to concurrently complete the task. Finally, a dictionary iterator is created for the data and a data record is read through the iterator. + + + ```python + cifar10_path = "./dataset/Cifar10Data/cifar-10-batches-bin/" + + # create Cifar10Dataset for reading data + cifar10_dataset = ds.Cifar10Dataset(cifar10_path, num_parallel_workers=4) + # create a dictionary iterator and read a data record through the iterator + print(next(cifar10_dataset.create_dict_iterator())) + ``` + + The output is as follows: + ``` + {'image': array([[[235, 235, 235], + [230, 230, 230], + [234, 234, 234], + ..., + [248, 248, 248], + [248, 248, 248], + [249, 249, 249]], + ..., + [120, 120, 119], + [146, 146, 146], + [177, 174, 190]]], dtype=uint8), 'label': array(9, dtype=uint32)} + ``` + +2. Use the `Cifar10ToMR` class to convert the CIFAR-10 dataset into MindSpore data format. In this example, the CIFAR-10 dataset in Python file format is used. Then use the `MindDataset` class to load the dataset in MindSpore data format. The multi-thread optimization solution is used for data loading. Four threads are enabled to concurrently complete the task. Finally, a dictionary iterator is created for data and a data record is read through the iterator. + + + ```python + from mindspore.mindrecord import Cifar10ToMR + + cifar10_path = './dataset/Cifar10Data/cifar-10-batches-py/' + cifar10_mindrecord_path = './transform/cifar10.record' + + cifar10_transformer = Cifar10ToMR(cifar10_path, cifar10_mindrecord_path) + # executes transformation from Cifar10 to MindRecord + cifar10_transformer.transform(['label']) + + # create MindDataset for reading data + cifar10_mind_dataset = ds.MindDataset(dataset_file=cifar10_mindrecord_path, num_parallel_workers=4) + # create a dictionary iterator and read a data record through the iterator + print(next(cifar10_mind_dataset.create_dict_iterator())) + ``` + + The output is as follows: + ``` + {'data': array([255, 216, 255, ..., 63, 255, 217], dtype=uint8), 'id': array(30474, dtype=int64), 'label': array(2, dtype=int64)} + ``` + +3. The `GeneratorDataset` class is used to load the user-defined dataset, and the multi-process optimization solution is used. Four processes are enabled to concurrently complete the task. Finally, a dictionary iterator is created for the data, and a data record is read through the iterator. + + + ```python + def generator_func(num): + for i in range(num): + yield (np.array([i]),) + + # create GeneratorDataset for reading data + dataset = ds.GeneratorDataset(source=generator_func(5), column_names=["data"], num_parallel_workers=4) + # create a dictionary iterator and read a data record through the iterator + print(next(dataset.create_dict_iterator())) + ``` + + The output is as follows: + ``` + {'data': array([0], dtype=int64)} + ``` + +## Optimizing the Shuffle Performance + +The shuffle operation is used to shuffle ordered datasets or repeated datasets. MindSpore provides the `shuffle` function for users. A larger value of `buffer_size` indicates a higher shuffling degree, consuming more time and computing resources. This API allows users to shuffle the data at any time during the entire pipeline process. For details, see [Shuffle Processing](https://www.mindspore.cn/tutorial/en/master/use/data_preparation/data_processing_and_augmentation.html#shuffle). However, because the underlying implementation methods are different, the performance of this method is not as good as that of setting the `shuffle` parameter to directly shuffle data by referring to the [Built-in Loading Operators](https://www.mindspore.cn/api/en/master/api/python/mindspore/mindspore.dataset.html). + +### Performance Optimization Solution + +![title](./images/shuffle_performance_scheme.png) + +Suggestions on shuffle performance optimization are as follows: +- Use the `shuffle` parameter of built-in loading operators to shuffle data. +- If the `shuffle` function is used and the performance still cannot meet the requirements, increase the value of the `buffer_size` parameter to improve the performance. + +### Code Example + +Based on the preceding shuffle performance optimization suggestions, the `shuffle` parameter of the `Cifar10Dataset` class of built-in loading operators and the `Shuffle` function are used to shuffle data. The sample code is displayed as follows: + +1. Use the built-in operator in `Cifar10Dataset` class to load the CIFAR-10 dataset. In this example, the CIFAR-10 dataset in binary format is used, and the `shuffle` parameter is set to True to perform data shuffle. Finally, a dictionary iterator is created for the data and a data record is read through the iterator. + + + ```python + cifar10_path = "./dataset/Cifar10Data/cifar-10-batches-bin/" + + # create Cifar10Dataset for reading data + cifar10_dataset = ds.Cifar10Dataset(cifar10_path, shuffle=True) + # create a dictionary iterator and read a data record through the iterator + print(next(cifar10_dataset.create_dict_iterator())) + ``` + + The output is as follows: + ``` + {'image': array([[[254, 254, 254], + [255, 255, 254], + [255, 255, 254], + ..., + [232, 234, 244], + [226, 230, 242], + [228, 232, 243]], + ..., + [ 64, 61, 63], + [ 63, 58, 60], + [ 61, 56, 58]]], dtype=uint8), 'label': array(9, dtype=uint32)} + ``` + +2. Use the `shuffle` function to shuffle data. Set `buffer_size` to 3 and use the `GeneratorDataset` class to generate data. + + + ```python + def generator_func(): + for i in range(5): + yield (np.array([i, i+1, i+2, i+3, i+4]),) + + ds1 = ds.GeneratorDataset(source=generator_func, column_names=["data"]) + print("before shuffle:") + for data in ds1.create_dict_iterator(): + print(data["data"]) + + ds2 = ds1.shuffle(buffer_size=3) + print("after shuffle:") + for data in ds2.create_dict_iterator(): + print(data["data"]) + ``` + ``` + The output is as follows: + + before shuffle: + [0 1 2 3 4] + [1 2 3 4 5] + [2 3 4 5 6] + [3 4 5 6 7] + [4 5 6 7 8] + after shuffle: + [2 3 4 5 6] + [0 1 2 3 4] + [4 5 6 7 8] + [1 2 3 4 5] + [3 4 5 6 7] + ``` + +## Optimizing the Data Augmentation Performance + +During image classification training, especially when the dataset is small, users can use data augmentation to preprocess images to enrich the dataset. MindSpore provides multiple data augmentation methods, including: +- Use the built-in C operator (`c_transforms` module) to perform data augmentation. +- Use the built-in Python operator (`py_transforms` module) to perform data augmentation. +- Users can define Python functions as needed to perform data augmentation. + +For details, see [Data Augmentation](https://www.mindspore.cn/tutorial/en/master/use/data_preparation/data_processing_and_augmentation.html#id3). The performance varies according to the underlying implementation methods. + +| Module | Underlying API | Description | +| :----: | :----: | :----: | +| c_transforms | C++ (based on OpenCV) | High performance | +| py_transforms | Python (based on PIL) | This module provides multiple image augmentation functions and the method for converting PIL images into NumPy arrays. | + + +### Performance Optimization Solution + +![title](./images/data_enhancement_performance_scheme.png) + + +Suggestions on data augmentation performance optimization are as follows: +- The `c_transforms` module is preferentially used to perform data augmentation for its highest performance. If the performance cannot meet the requirements, refer to [Multi-thread Optimization Solution](#multi-thread-optimization-solution), [Compose Optimization Solution](#compose-optimization-solution), or [Operator Fusion Optimization Solution](#operator-fusion-optimization-solution). +- If the `py_transforms` module is used to perform data augmentation and the performance still cannot meet the requirements, refer to [Multi-thread Optimization Solution](#multi-thread-optimization-solution), [Multi-process Optimization Solution](#multi-process-optimization-solution), [Compose Optimization Solution](#compose-optimization-solution), or [Operator Fusion Optimization Solution](#operator-fusion-optimization-solution). +- The `c_transforms` module maintains buffer management in C++, and the `py_transforms` module maintains buffer management in Python. Because of the performance cost of switching between Python and C++, it is advised not to use different operator types together. +- If the user-defined Python functions are used to perform data augmentation and the performance still cannot meet the requirements, use the [Multi-thread Optimization Solution](#multi-thread-optimization-solution) or [Multi-process Optimization Solution](#multi-process-optimization-solution). If the performance still cannot be improved, in this case, optimize the user-defined Python code. + +### Code Example + +Based on the preceding suggestions of data augmentation performance optimization, the `c_transforms` module and user-defined Python function are used to perform data augmentation. The code is displayed as follows: + +1. The `c_transforms` module is used to perform data augmentation. During data augmentation, the multi-thread optimization solution is used. Four threads are enabled to concurrently complete the task. The operator fusion optimization solution is used and the `RandomResizedCrop` fusion class is used to replace the `RandomResize` and `RandomCrop` classes. + + + ```python + import mindspore.dataset.transforms.c_transforms as c_transforms + import mindspore.dataset.vision.c_transforms as C + import matplotlib.pyplot as plt + cifar10_path = "./dataset/Cifar10Data/cifar-10-batches-bin/" + + # create Cifar10Dataset for reading data + cifar10_dataset = ds.Cifar10Dataset(cifar10_path, num_parallel_workers=4) + transforms = C.RandomResizedCrop((800, 800)) + # apply the transform to the dataset through dataset.map() + cifar10_dataset = cifar10_dataset.map(operations=transforms, input_columns="image", num_parallel_workers=4) + + data = next(cifar10_dataset.create_dict_iterator()) + plt.imshow(data["image"]) + plt.show() + ``` + + The output is as follows: + + ![png](./images/cifar10_c_transforms.png) + + +2. A user-defined Python function is used to perform data augmentation. During data augmentation, the multi-process optimization solution is used, and four processes are enabled to concurrently complete the task. + + + ```python + def generator_func(): + for i in range(5): + yield (np.array([i, i+1, i+2, i+3, i+4]),) + + ds3 = ds.GeneratorDataset(source=generator_func, column_names=["data"]) + print("before map:") + for data in ds3.create_dict_iterator(): + print(data["data"]) + + func = lambda x:x**2 + ds4 = ds3.map(operations=func, input_columns="data", python_multiprocessing=True, num_parallel_workers=4) + print("after map:") + for data in ds4.create_dict_iterator(): + print(data["data"]) + ``` + + The output is as follows: + ``` + before map: + [0 1 2 3 4] + [1 2 3 4 5] + [2 3 4 5 6] + [3 4 5 6 7] + [4 5 6 7 8] + after map: + [ 0 1 4 9 16] + [ 1 4 9 16 25] + [ 4 9 16 25 36] + [ 9 16 25 36 49] + [16 25 36 49 64] + ``` + +## Performance Optimization Solution Summary + +### Multi-thread Optimization Solution + +During the data pipeline process, the number of threads for related operators can be set to improve the concurrency and performance. For example: +- During data loading, the `num_parallel_workers` parameter in the built-in data loading class is used to set the number of threads. +- During data augmentation, the `num_parallel_workers` parameter in the `map` function is used to set the number of threads. +- During batch processing, the `num_parallel_workers` parameter in the `batch` function is used to set the number of threads. + +For details, see [Built-in Loading Operators](https://www.mindspore.cn/api/en/master/api/python/mindspore/mindspore.dataset.html). + +### Multi-process Optimization Solution + +During data processing, operators implemented by Python support the multi-process mode. For example: +- By default, the `GeneratorDataset` class is in multi-process mode. The `num_parallel_workers` parameter indicates the number of enabled processes. The default value is 1. For details, see [Generator Dataset](https://www.mindspore.cn/api/en/master/api/python/mindspore/mindspore.dataset.html#mindspore.dataset.GeneratorDataset) +- If the user-defined Python function or the `py_transforms` module is used to perform data augmentation and the `python_multiprocessing` parameter of the `map` function is set to True, the `num_parallel_workers` parameter indicates the number of processes and the default value of the `python_multiprocessing` parameter is False. In this case, the `num_parallel_workers` parameter indicates the number of threads. For details, see [Built-in Loading Operators](https://www.mindspore.cn/api/en/master/api/python/mindspore/mindspore.dataset.html). + +### Compose Optimization Solution + +Map operators can receive the Tensor operator list and apply all these operators based on a specific sequence. Compared with the Map operator used by each Tensor operator, such Fat Map operators can achieve better performance, as shown in the following figure: + +![title](./images/compose.png) + +### Operator Fusion Optimization Solution + +Some fusion operators are provided to aggregate the functions of two or more operators into one operator. For details, see [Data Augmentation Operators](https://www.mindspore.cn/api/en/master/api/python/mindspore/mindspore.dataset.vision.html). Compared with the pipelines of their components, such fusion operators provide better performance. As shown in the figure: + +![title](./images/operator_fusion.png) diff --git a/tutorials/source_en/advanced_use/parameter_server_training.md b/tutorials/source_en/advanced_use/parameter_server_training.md index c000f7ab30..964659e386 100644 --- a/tutorials/source_en/advanced_use/parameter_server_training.md +++ b/tutorials/source_en/advanced_use/parameter_server_training.md @@ -1,6 +1,6 @@ # Parameter Server Training -`Ascend` `GPU` `Model Training` `Intermediate` `Expert` +`Linux` `Ascend` `GPU` `Model Training` `Intermediate` `Expert` diff --git a/tutorials/source_en/advanced_use/quantization_aware.md b/tutorials/source_en/advanced_use/quantization_aware.md index 25a7027be5..4908573015 100644 --- a/tutorials/source_en/advanced_use/quantization_aware.md +++ b/tutorials/source_en/advanced_use/quantization_aware.md @@ -1,6 +1,6 @@ # Quantization -`Ascend` `GPU` `Model Optimization` `Expert` +`Linux` `Ascend` `GPU` `Model Optimization` `Expert` diff --git a/tutorials/source_en/advanced_use/serving.md b/tutorials/source_en/advanced_use/serving.md index a726e427cb..f892856eb5 100644 --- a/tutorials/source_en/advanced_use/serving.md +++ b/tutorials/source_en/advanced_use/serving.md @@ -1,6 +1,6 @@ # MindSpore-based Inference Service Deployment -`Ascend` `Environmental Setup` `Enterprise` `Expert` +`Linux` `Ascend` `Environmental Setup` `Enterprise` `Expert` diff --git a/tutorials/source_en/index.rst b/tutorials/source_en/index.rst index 402105ab2f..5d8268c3a5 100644 --- a/tutorials/source_en/index.rst +++ b/tutorials/source_en/index.rst @@ -31,6 +31,7 @@ MindSpore Tutorials advanced_use/computer_vision_application advanced_use/nlp_application + advanced_use/optimize_the_performance_of_data_preparation .. toctree:: :glob: diff --git a/tutorials/source_en/quick_start/quick_start.md b/tutorials/source_en/quick_start/quick_start.md index cec82c3d54..1519ace698 100644 --- a/tutorials/source_en/quick_start/quick_start.md +++ b/tutorials/source_en/quick_start/quick_start.md @@ -1,6 +1,6 @@ # Implementing an Image Classification Application -`Ascend` `GPU` `CPU` `Whole Process` `Beginner` `Intermediate` `Expert` +`Linux` `Windows` `Ascend` `GPU` `CPU` `Whole Process` `Beginner` `Intermediate` `Expert` diff --git a/tutorials/source_en/use/custom_operator.md b/tutorials/source_en/use/custom_operator.md index 2a09ea2f6d..eefd452bf8 100644 --- a/tutorials/source_en/use/custom_operator.md +++ b/tutorials/source_en/use/custom_operator.md @@ -1,6 +1,6 @@ # Custom Operators -`Ascend` `Model Development` `Expert` +`Linux` `Ascend` `Model Development` `Expert` diff --git a/tutorials/source_en/use/data_preparation/converting_datasets.md b/tutorials/source_en/use/data_preparation/converting_datasets.md index 1bb405c3d4..b1d8a21224 100644 --- a/tutorials/source_en/use/data_preparation/converting_datasets.md +++ b/tutorials/source_en/use/data_preparation/converting_datasets.md @@ -1,6 +1,6 @@ # Converting Datasets to the Mindspore Data Format -`Ascend` `GPU` `CPU` `Data Preparation` `Beginner` `Intermediate` `Expert` +`Linux` `Ascend` `GPU` `CPU` `Data Preparation` `Beginner` `Intermediate` `Expert` diff --git a/tutorials/source_en/use/data_preparation/data_processing_and_augmentation.md b/tutorials/source_en/use/data_preparation/data_processing_and_augmentation.md index 67852d647c..f00f118ff9 100644 --- a/tutorials/source_en/use/data_preparation/data_processing_and_augmentation.md +++ b/tutorials/source_en/use/data_preparation/data_processing_and_augmentation.md @@ -1,6 +1,6 @@ # Data Processing and Augmentation -`Ascend` `GPU` `CPU` `Data Preparation` `Beginner` `Intermediate` `Expert` +`Linux` `Ascend` `GPU` `CPU` `Data Preparation` `Beginner` `Intermediate` `Expert` diff --git a/tutorials/source_en/use/data_preparation/loading_the_datasets.md b/tutorials/source_en/use/data_preparation/loading_the_datasets.md index 61a0732043..ad339502f6 100644 --- a/tutorials/source_en/use/data_preparation/loading_the_datasets.md +++ b/tutorials/source_en/use/data_preparation/loading_the_datasets.md @@ -1,6 +1,6 @@ # Loading the Dataset -`Ascend` `GPU` `CPU` `Data Preparation` `Beginner` `Intermediate` `Expert` +`Linux` `Ascend` `GPU` `CPU` `Data Preparation` `Beginner` `Intermediate` `Expert` diff --git a/tutorials/source_en/use/multi_platform_inference.md b/tutorials/source_en/use/multi_platform_inference.md index 9b4c526929..15b2ce276e 100644 --- a/tutorials/source_en/use/multi_platform_inference.md +++ b/tutorials/source_en/use/multi_platform_inference.md @@ -1,6 +1,6 @@ # Multi-Platform Inference -`Ascend` `GPU` `CPU` `Inference Application` `Beginner` `Intermediate` `Expert` +`Linux` `Ascend` `GPU` `CPU` `Inference Application` `Beginner` `Intermediate` `Expert` diff --git a/tutorials/source_en/use/saving_and_loading_model_parameters.md b/tutorials/source_en/use/saving_and_loading_model_parameters.md index 70518a0586..c361519ff9 100644 --- a/tutorials/source_en/use/saving_and_loading_model_parameters.md +++ b/tutorials/source_en/use/saving_and_loading_model_parameters.md @@ -1,6 +1,6 @@ # Saving and Loading Model Parameters -`Ascend` `GPU` `CPU` `Model Export` `Beginner` `Intermediate` `Expert` +`Linux` `Ascend` `GPU` `CPU` `Model Export` `Beginner` `Intermediate` `Expert` diff --git a/tutorials/source_zh_cn/advanced_use/bert_poetry.md b/tutorials/source_zh_cn/advanced_use/bert_poetry.md index 6cdb95fe9c..ffe45bb508 100644 --- a/tutorials/source_zh_cn/advanced_use/bert_poetry.md +++ b/tutorials/source_zh_cn/advanced_use/bert_poetry.md @@ -1,6 +1,6 @@ # 智能写诗 -`Ascend` `模型训练` `推理应用` `端侧` `高级` +`Linux` `Ascend` `模型训练` `推理应用` `端侧` `高级` @@ -18,7 +18,7 @@ - [训练](#训练) - [推理验证](#推理验证) - [服务部署](#服务部署) - - [参考资料](#参考资料) + - [参考文献](#参考文献) @@ -49,7 +49,7 @@ ### Pre-training -Pre-training是在无标签数据上进行的自编码训练,因此训练任务的设计尤为重要,BERT中的Pre-training包含两项任务MLM(Masked Language Model)和NSP(Next Sentence Prediction)。 +Pre-training是在无标签数据上进行的自编码训练,因此训练任务的设计尤为重要,BERT中的Pre-training包含两项任务MLM(Masked Language Model)和NSP(Next Sentence Prediction)。 - **MLM任务**是在输入时,随机将部分token置换为[MASK]标记,然后通过注意力机制,由其上下文预测出被遮挡位置的原始token。 @@ -208,97 +208,97 @@ python poetry.py --train=False --ckpt_path=/your/ckpt/path - 模型导出 -在使用Serving部署服务前,需要导出模型文件,在`poetry.py`中提供了`export_net`函数负责导出MINDIR模型,执行命令: + 在使用Serving部署服务前,需要导出模型文件,在`poetry.py`中提供了`export_net`函数负责导出MINDIR模型,执行命令: -``` -python poetry.py --export=True --ckpt_path=/your/ckpt/path -``` + ``` + python poetry.py --export=True --ckpt_path=/your/ckpt/path + ``` -会在当前路径下生成`poetry.pb`文件。 + 会在当前路径下生成`poetry.pb`文件。 - Serving服务 -在服务器侧启动Serving服务,并加载导出的MINDIR文件`poetry.pb`。 + 在服务器侧启动Serving服务,并加载导出的MINDIR文件`poetry.pb`。 -``` -cd serving -./ms_serving --model_path=/path/to/your/MINDIR_file --model_name=your_mindir.pb -``` + ``` + cd serving + ./ms_serving --model_path=/path/to/your/MINDIR_file --model_name=your_mindir.pb + ``` - 预处理及后处理的服务 -预处理及后处理通过Flask框架来快速实现,在服务器侧运行`bert_flask.py`文件,启动Flask服务。 + 预处理及后处理通过Flask框架来快速实现,在服务器侧运行`bert_flask.py`文件,启动Flask服务。 -``` -python bert_flask.py -``` + ``` + python bert_flask.py + ``` -通过以上步骤,服务端部署就已经完成。 + 通过以上步骤,服务端部署就已经完成。 - 客户端 -可用电脑作为客户端,修改`poetry_client.py`中的url请求地址为推理服务启动的服务器IP,并确保端口与服务端`bert_flask.py`中的端口一致,例如: - -``` -url = 'http://10.155.170.71:8080/' -``` - -运行`poetry_client.py`文件 - -``` -python poetry_client.py -``` - -此时在客户端输入指令,即可在远端服务器进行推理,返回生成的诗句。 - -``` -选择模式:0-随机生成,1:续写,2:藏头诗 -0 -``` -``` -一朵黄花叶, -千竿绿树枝。 -含香待夏晚, -澹浩长风时。 -``` - -``` -选择模式:0-随机生成,1:续写,2:藏头诗 -1 -输入首句诗 -明月 -``` -``` -明月照三峡, -长空一片云。 -秋风与雨过, -唯有客舟分。 -寒影出何处, -远林含不闻。 -不知前后事, -何道逐风君。 -``` - -``` -选择模式:0-随机生成,1:续写,2:藏头诗 -2 -输入藏头诗 -人工智能 -``` -``` -人生事太远, -工部与神期。 -智者岂无识, -能文争有疑。 -``` - -细读鉴赏一下,平仄、押韵、意味均有体现,AI诗人已然成形。 + 可用电脑作为客户端,修改`poetry_client.py`中的url请求地址为推理服务启动的服务器IP,并确保端口与服务端`bert_flask.py`中的端口一致,例如: + + ``` + url = 'http://10.155.170.71:8080/' + ``` + + 运行`poetry_client.py`文件 + + ``` + python poetry_client.py + ``` + + 此时在客户端输入指令,即可在远端服务器进行推理,返回生成的诗句。 + + ``` + 选择模式:0-随机生成,1:续写,2:藏头诗 + 0 + ``` + ``` + 一朵黄花叶, + 千竿绿树枝。 + 含香待夏晚, + 澹浩长风时。 + ``` + + ``` + 选择模式:0-随机生成,1:续写,2:藏头诗 + 1 + 输入首句诗 + 明月 + ``` + ``` + 明月照三峡, + 长空一片云。 + 秋风与雨过, + 唯有客舟分。 + 寒影出何处, + 远林含不闻。 + 不知前后事, + 何道逐风君。 + ``` + + ``` + 选择模式:0-随机生成,1:续写,2:藏头诗 + 2 + 输入藏头诗 + 人工智能 + ``` + ``` + 人生事太远, + 工部与神期。 + 智者岂无识, + 能文争有疑。 + ``` + + 细读鉴赏一下,平仄、押韵、意味均有体现,AI诗人已然成形。 > 友情提醒,修改其他类型数据集,也可以完成其他简单的生成类任务,如对春联,简单聊天机器人等,用户可尝试体验实现。 -## 参考资料 +## 参考文献 [1] [BERT:Pre-training of Deep Bidirectional Transformers for Language Understanding](https://arxiv.org/abs/1810.04805) diff --git a/tutorials/source_zh_cn/advanced_use/checkpoint_for_hybrid_parallel.md b/tutorials/source_zh_cn/advanced_use/checkpoint_for_hybrid_parallel.md index 2b51952eab..36f8ef9995 100644 --- a/tutorials/source_zh_cn/advanced_use/checkpoint_for_hybrid_parallel.md +++ b/tutorials/source_zh_cn/advanced_use/checkpoint_for_hybrid_parallel.md @@ -2,7 +2,7 @@ # 手动设置并行场景模型参数的保存和加载 -`Ascend` `GPU` `模型训练` `中级` `高级` +`Linux` `Ascend` `GPU` `模型训练` `中级` `高级` @@ -218,7 +218,7 @@ param_dict = load_checkpoint("./CKP-Integrated_1-4_32.ckpt") slice_list[0] --- [1, 2, 3, 4] 对应device0 slice_list[1] --- [5, 6, 7, 8] 对应device1 - 与slice_list类似,slice_moments_list 也被切分为两个shape为[1, 4]的Tensor。 + 与`slice_list`类似,`slice_moments_list` 也被切分为两个shape为[1, 4]的Tensor。 2. 在每个节点分别加载对应的数据切片。 @@ -253,7 +253,7 @@ load_param_into_net(opt, param_dict) ### 示例场景说明 -整体场景:训练分为两个阶段,两阶段的集群规模不一致, 模拟FC层MatMul算子并行。 +整体场景:训练分为两个阶段,两阶段的集群规模不一致,模拟FC层MatMul算子并行。 用户流程: diff --git a/tutorials/source_zh_cn/advanced_use/computer_vision_application.md b/tutorials/source_zh_cn/advanced_use/computer_vision_application.md index 9d3f271063..10e9d5a0dc 100644 --- a/tutorials/source_zh_cn/advanced_use/computer_vision_application.md +++ b/tutorials/source_zh_cn/advanced_use/computer_vision_application.md @@ -1,6 +1,6 @@ # 计算机视觉应用 -`Ascend` `GPU` `全流程` `初级` `中级` `高级` +`Linux` `Ascend` `GPU` `全流程` `初级` `中级` `高级` @@ -9,11 +9,11 @@ - [图像分类](#图像分类) - [任务描述及准备](#任务描述及准备) - [下载CIFAR-10数据集](#下载cifar-10数据集) - - [数据预加载和预处理](#数据预加载和预处理) - - [定义卷积神经网络](#定义卷积神经网络) - - [定义损失函数和优化器](#定义损失函数和优化器) - - [调用`Model`高阶API进行训练和保存模型文件](#调用model高阶api进行训练和保存模型文件) - - [加载保存的模型,并进行验证](#加载保存的模型并进行验证) + - [数据预加载和预处理](#数据预加载和预处理) + - [定义卷积神经网络](#定义卷积神经网络) + - [定义损失函数和优化器](#定义损失函数和优化器) + - [调用`Model`高阶API进行训练和保存模型文件](#调用model高阶api进行训练和保存模型文件) + - [加载保存的模型,并进行验证](#加载保存的模型并进行验证) - [参考文献](#参考文献) @@ -82,7 +82,7 @@ tar -zvxf cifar-10-binary.tar.gz ``` -### 数据预加载和预处理 +## 数据预加载和预处理 1. 加载数据集 @@ -142,7 +142,7 @@ tar -zvxf cifar-10-binary.tar.gz ``` -### 定义卷积神经网络 +## 定义卷积神经网络 卷积神经网络已经是图像分类任务的标准算法了。卷积神经网络采用分层的结构对图片进行特征提取,由一系列的网络层堆叠而成,比如卷积层、池化层、激活层等等。 @@ -157,12 +157,11 @@ network = resnet50(class_num=10) 更多ResNet的介绍请参考:[ResNet论文](https://arxiv.org/abs/1512.03385) -### 定义损失函数和优化器 - +## 定义损失函数和优化器 接下来需要定义损失函数(Loss)和优化器(Optimizer)。损失函数是深度学习的训练目标,也叫目标函数,可以理解为神经网络的输出(Logits)和标签(Labels)之间的距离,是一个标量数据。 -常见的损失函数包括均方误差、L2损失、Hinge损失、交叉熵等等。图像分类应用通常采用交叉熵损失(CrossEntropy)。 +常见的损失函数包括均方误差、L2损失、Hinge损失、交叉熵等等。图像分类应用通常采用交叉熵损失(`CrossEntropy`)。 优化器用于神经网络求解(训练)。由于神经网络参数规模庞大,无法直接求解,因而深度学习中采用随机梯度下降算法(SGD)及其改进算法进行求解。MindSpore封装了常见的优化器,如`SGD`、`ADAM`、`Momemtum`等等。本例采用`Momentum`优化器,通常需要设定两个参数,动量(`moment`)和权重衰减项(`weight decay`)。 @@ -177,7 +176,7 @@ opt = Momentum(filter(lambda x: x.requires_grad, net.get_parameters()), 0.01, 0. ``` -### 调用`Model`高阶API进行训练和保存模型文件 +## 调用`Model`高阶API进行训练和保存模型文件 完成数据预处理、网络定义、损失函数和优化器定义之后,就可以进行模型训练了。模型训练包含两层迭代,数据集的多轮迭代(`epoch`)和一轮数据集内按分组(`batch`)大小进行的单步迭代。其中,单步迭代指的是按分组从数据集中抽取数据,输入到网络中计算得到损失函数,然后通过优化器计算和更新训练参数的梯度。 @@ -201,7 +200,7 @@ loss_cb = LossMonitor() model.train(epoch_size, dataset, callbacks=[ckpoint_cb, loss_cb]) ``` -### 加载保存的模型,并进行验证 +## 加载保存的模型,并进行验证 训练得到的模型文件(如`resnet.ckpt`)可以用来预测新图像的类别。首先通过`load_checkpoint`加载模型文件。然后调用`Model`的`eval`接口预测新图像类别。 diff --git a/tutorials/source_zh_cn/advanced_use/customized_debugging_information.md b/tutorials/source_zh_cn/advanced_use/customized_debugging_information.md index 8d54f10ae6..2099dded63 100644 --- a/tutorials/source_zh_cn/advanced_use/customized_debugging_information.md +++ b/tutorials/source_zh_cn/advanced_use/customized_debugging_information.md @@ -1,6 +1,6 @@ # 自定义调试信息 -`Ascend` `GPU` `CPU` `模型调优` `中级` `高级` +`Linux` `Ascend` `GPU` `CPU` `模型调优` `中级` `高级` @@ -26,17 +26,17 @@ ## Callback介绍 -Callback是回调函数的意思,但它其实不是一个函数而是一个类,用户可以使用回调函数来观察训练过程中网络内部的状态和相关信息,或在特定时期执行特定动作。 +`Callback`是回调函数的意思,但它其实不是一个函数而是一个类,用户可以使用回调函数来观察训练过程中网络内部的状态和相关信息,或在特定时期执行特定动作。 例如监控loss、保存模型参数、动态调整参数、提前终止训练任务等。 ### MindSpore的Callback能力 -MindSpore提供Callback能力,支持用户在训练/推理的特定阶段,插入自定义的操作。包括: +MindSpore提供`Callback`能力,支持用户在训练/推理的特定阶段,插入自定义的操作。包括: -- MindSpore框架提供的`ModelCheckpoint`、`LossMonitor`、`SummaryCollector`等Callback函数。 -- MindSpore支持用户自定义Callback。 +- MindSpore框架提供的`ModelCheckpoint`、`LossMonitor`、`SummaryCollector`等`Callback`函数。 +- MindSpore支持用户自定义`Callback`。 -使用方法:在`model.train`方法中传入Callback对象,它可以是一个Callback列表,例: +使用方法:在`model.train`方法中传入`Callback`对象,它可以是一个`Callback`列表,例: ```python ckpt_cb = ModelCheckpoint() @@ -45,16 +45,16 @@ summary_cb = SummaryCollector(summary_dir='./summary_dir') model.train(epoch, dataset, callbacks=[ckpt_cb, loss_cb, summary_cb]) ``` -`ModelCheckpoint`可以保存模型参数,以便进行再训练或推理。 -`LossMonitor`可以在日志中输出loss,方便用户查看,同时它还会监控训练过程中的loss值变化情况,当loss值为`Nan`或`Inf`时终止训练。 -`SummaryCollector` 可以把训练过程中的信息存储到文件中,以便后续进行查看或可视化展示。 -在训练过程中,Callback列表会按照定义的顺序执行Callback函数。因此在定义过程中,需考虑Callback之间的依赖关系。 +`ModelCheckpoint`可以保存模型参数,以便进行再训练或推理。 +`LossMonitor`可以在日志中输出loss,方便用户查看,同时它还会监控训练过程中的loss值变化情况,当loss值为`Nan`或`Inf`时终止训练。 +`SummaryCollector` 可以把训练过程中的信息存储到文件中,以便后续进行查看或可视化展示。 +在训练过程中,`Callback`列表会按照定义的顺序执行`Callback`函数。因此在定义过程中,需考虑`Callback`之间的依赖关系。 ### 自定义Callback 用户可以基于`Callback`基类,根据自身的需求,实现自定义`Callback`。 -Callback基类定义如下所示: +`Callback`基类定义如下所示: ```python class Callback(): @@ -84,22 +84,22 @@ class Callback(): pass ``` -Callback可以把训练过程中的重要信息记录下来,通过一个字典类型变量`cb_params`传递给Callback对象, -用户可以在各个自定义的Callback中获取到相关属性,执行自定义操作。也可以自定义其他变量传递给`cb_params`对象。 +`Callback`可以把训练过程中的重要信息记录下来,通过一个字典类型变量`cb_params`传递给`Callback`对象, +用户可以在各个自定义的`Callback`中获取到相关属性,执行自定义操作。也可以自定义其他变量传递给`cb_params`对象。 `cb_params`中的主要属性包括: -- loss_fn:损失函数 -- optimizer:优化器 -- train_dataset:训练的数据集 -- cur_epoch_num:当前的epoch数 -- cur_step_num:当前的step数 -- batch_num:一个epoch中step的数量 +- `loss_fn`:损失函数 +- `optimizer`:优化器 +- `train_dataset`:训练的数据集 +- `cur_epoch_num`:当前的epoch数 +- `cur_step_num`:当前的step数 +- `batch_num`:一个epoch中step的数量 - ... -用户可以继承Callback基类自定义Callback对象。 +用户可以继承`Callback`基类自定义`Callback`对象。 -下面通过两个例子,进一步了解自定义Callback的用法。 +下面通过两个例子,进一步了解自定义`Callback`的用法。 - 在规定时间内终止训练。 @@ -168,7 +168,7 @@ Callback可以把训练过程中的重要信息记录下来,通过一个字典 model.train(epoch_size, train_dataset=ds_train, callback=SaveCallback(model, ds_eval)) ``` - 具体实现逻辑为:定义一个callback对象,初始化对象接收model对象和ds_eval(验证数据集)。在step_end阶段验证模型的精度,当精度为当前最高时,手动触发保存checkpoint方法,保存当前的参数。 + 具体实现逻辑为:定义一个`Callback`对象,初始化对象接收`model`对象和`ds_eval`(验证数据集)。在`step_end`阶段验证模型的精度,当精度为当前最高时,手动触发保存checkpoint方法,保存当前的参数。 ## MindSpore metrics功能介绍 @@ -203,11 +203,11 @@ output = model.eval(ds_eval) 以`accuracy`算子举例说明其内部实现原理: -`accuracy`继承了`EvaluationBase`基类,重写了上述三个方法。 -`clear`方法会把类中相关计算参数初始化。 -`update`方法接受预测值和标签值,更新accuracy内部变量。 -`eval`方法会计算相关指标,返回计算结果。 -调用`accuracy`的`eval`方法,即可得到计算结果。 +`accuracy`继承了`EvaluationBase`基类,重写了上述三个方法。 +`clear`方法会把类中相关计算参数初始化。 +`update`方法接受预测值和标签值,更新accuracy内部变量。 +`eval`方法会计算相关指标,返回计算结果。 +调用`accuracy`的`eval`方法,即可得到计算结果。 通过如下代码可以更清楚了解到`accuracy`是如何运行的: @@ -315,12 +315,29 @@ val:[[1 1] ## 日志相关的环境变量和配置 MindSpore采用glog来输出日志,常用的几个环境变量如下: -1. `GLOG_v` 控制日志的级别,默认值为2,即WARNING级别,对应关系如下:0-DEBUG、1-INFO、2-WARNING、3-ERROR。 -2. `GLOG_logtostderr` 值设置为1时,日志输出到屏幕;值设置为0时,日志输出到文件。默认值为1。 -3. GLOG_log_dir=*YourPath* 指定日志输出的路径。若`GLOG_logtostderr`的值为0,则必须设置此变量。若指定了`GLOG_log_dir`且`GLOG_logtostderr`的值为1时,则日志输出到屏幕,不输出到文件。C++和Python的日志会被输出到不同的文件中,C++日志的文件名遵从GLOG日志文件的命名规则,这里是`mindspore.机器名.用户名.log.日志级别.时间戳`,Python日志的文件名为`mindspore.log`。 -4. `MS_SUBMODULE_LOG_v="{SubModule1:LogLevel1,SubModule2:LogLevel2,...}"` 指定MindSpore C++各子模块的日志级别,被指定的子模块的日志级别将覆盖GLOG_v在此模块内的设置,此处子模块的日志级别LogLevel与`GLOG_v`的日志级别含义相同,MindSpore子模块的划分如下表。如可以通过`GLOG_v=1 MS_SUBMODULE_LOG_v="{PARSER:2,ANALYZER:2}"`把`PARSER`和`ANALYZER`模块的日志级别设为WARNING,其他模块的日志级别设为INFO。 +- `GLOG_v` -> glog不支持日志文件的绕接,如果需要控制日志文件对磁盘空间的占用,可选用操作系统提供的日志文件管理工具,例如:Linux的logrotate。 + 该环境变量控制日志的级别。 + 该环境变量默认值为2,即WARNING级别,对应关系如下:0-DEBUG、1-INFO、2-WARNING、3-ERROR。 + +- `GLOG_logtostderr` + + 该坏境变量控制日志的输出方式。 + 该环境变量的值设置为1时,日志输出到屏幕;值设置为0时,日志输出到文件。默认值为1。 + +- `GLOG_log_dir` + + 该环境变量指定日志输出的路径。 + 若`GLOG_logtostderr`的值为0,则必须设置此变量。 + 若指定了`GLOG_log_dir`且`GLOG_logtostderr`的值为1时,则日志输出到屏幕,不输出到文件。 + C++和Python的日志会被输出到不同的文件中,C++日志的文件名遵从`GLOG`日志文件的命名规则,这里是`mindspore.机器名.用户名.log.日志级别.时间戳`,Python日志的文件名为`mindspore.log`。 + +- `MS_SUBMODULE_LOG_v` + + 该环境变量指定MindSpore C++各子模块的日志级别。 + 该环境变量赋值方式为:`MS_SUBMODULE_LOG_v="{SubModule1:LogLevel1,SubModule2:LogLevel2,...}"`。 + 其中被指定子模块的日志级别将覆盖`GLOG_v`在此模块内的设置,此处子模块的日志级别`LogLevel`与`GLOG_v`的日志级别含义相同,MindSpore子模块的划分如下表。 + 例如可以通过`GLOG_v=1 MS_SUBMODULE_LOG_v="{PARSER:2,ANALYZER:2}"`把`PARSER`和`ANALYZER`模块的日志级别设为WARNING,其他模块的日志级别设为INFO。 MindSpore子模块按照目录划分如下: @@ -351,3 +368,7 @@ MindSpore子模块按照目录划分如下: | mindspore/core/gvar | COMMON | | mindspore/core/ | CORE | +> glog不支持日志文件的绕接,如果需要控制日志文件对磁盘空间的占用,可选用操作系统提供的日志文件管理工具,例如:Linux的logrotate。 + + + diff --git a/tutorials/source_zh_cn/advanced_use/dashboard.md b/tutorials/source_zh_cn/advanced_use/dashboard.md index 0d46d1a545..898695dfe2 100644 --- a/tutorials/source_zh_cn/advanced_use/dashboard.md +++ b/tutorials/source_zh_cn/advanced_use/dashboard.md @@ -185,7 +185,8 @@ - Tensor加载后,在张量可视的表格视图下,最大支持查看10万个数值,如果所选择的维度查询得到的数值超过这一限制,则无法显示。 5. 由于张量可视(`TensorSummary`)会记录原始张量数据,需要的存储空间较大。使用`TensorSummary`前和训练过程中请注意检查系统存储空间充足。 - 通过以下方法可以降低张量可视功能的存储空间占用: + + 通过以下方法可以降低张量可视功能的存储空间占用: 1)避免使用`TensorSummary`记录较大的Tensor。 @@ -195,5 +196,5 @@ 备注:估算`TensorSummary`空间使用量的方法如下: - 一个`TensorSummary`数据的大小 = Tensor中的数值个数 * 4 bytes。假设使用`TensorSummary`记录的Tensor大小为32 * 1 * 256 * 256,则一个`TensorSummary`数据大约需要32 * 1 * 256 * 256 * 4 bytes = 8,388,608 bytes = 8MiB。`TensorSummary`默认会记录20个步骤的数据,则记录这20组数据需要的空间约为20 * 8 MiB = 160MiB。需要注意的是,由于数据结构等因素的开销,实际使用的存储空间会略大于160MiB。 + 一个`TensorSummary数据的大小 = Tensor中的数值个数 * 4 bytes`。假设使用`TensorSummary`记录的Tensor大小为`32 * 1 * 256 * 256`,则一个`TensorSummary`数据大约需要`32 * 1 * 256 * 256 * 4 bytes = 8,388,608 bytes = 8MiB`。`TensorSummary`默认会记录20个步骤的数据,则记录这20组数据需要的空间约为`20 * 8 MiB = 160MiB`。需要注意的是,由于数据结构等因素的开销,实际使用的存储空间会略大于160MiB。 6. 当使用`TensorSummary`时,由于记录完整Tensor数据,训练日志文件较大,MindInsight需要更多时间解析训练日志文件,请耐心等待。 \ No newline at end of file diff --git a/tutorials/source_zh_cn/advanced_use/debugging_in_pynative_mode.md b/tutorials/source_zh_cn/advanced_use/debugging_in_pynative_mode.md index fd4a8fed7e..ef1deef9f8 100644 --- a/tutorials/source_zh_cn/advanced_use/debugging_in_pynative_mode.md +++ b/tutorials/source_zh_cn/advanced_use/debugging_in_pynative_mode.md @@ -1,6 +1,6 @@ # 使用PyNative模式调试 -`Ascend` `GPU` `模型开发` `初级` `中级` `高级` +`Linux` `Ascend` `GPU` `模型开发` `初级` `中级` `高级` diff --git a/tutorials/source_zh_cn/advanced_use/differential_privacy.md b/tutorials/source_zh_cn/advanced_use/differential_privacy.md index 7e9dac091d..3aabb9761d 100644 --- a/tutorials/source_zh_cn/advanced_use/differential_privacy.md +++ b/tutorials/source_zh_cn/advanced_use/differential_privacy.md @@ -1,6 +1,6 @@ # 机器学习中的差分隐私 -`Ascend` `模型开发` `模型调优` `企业` `高级` +`Linux` `Ascend` `模型开发` `模型调优` `企业` `高级` @@ -12,7 +12,7 @@ - [预处理数据集](#预处理数据集) - [建立模型](#建立模型) - [引入差分隐私](#引入差分隐私) - - [引用](#引用) + - [参考文献](#参考文献) @@ -346,7 +346,7 @@ ds_train = generate_mnist_dataset(os.path.join(cfg.data_path, "train"), ============== Accuracy: 0.9698 ============== ``` -### 引用 +## 参考文献 [1] C. Dwork and J. Lei. Differential privacy and robust statistics. In STOC, pages 371–380. ACM, 2009. diff --git a/tutorials/source_zh_cn/advanced_use/distributed_training_ascend.md b/tutorials/source_zh_cn/advanced_use/distributed_training_ascend.md index a0e4e8864f..b162e4bd8b 100644 --- a/tutorials/source_zh_cn/advanced_use/distributed_training_ascend.md +++ b/tutorials/source_zh_cn/advanced_use/distributed_training_ascend.md @@ -1,6 +1,6 @@ # 分布式并行训练 (Ascend) -`Ascend` `模型训练` `中级` `高级` +`Linux` `Ascend` `模型训练` `中级` `高级` @@ -33,9 +33,9 @@ ### 下载数据集 -本样例采用`CIFAR-10`数据集,由10类32*32的彩色图片组成,每类包含6000张图片。其中训练集共50000张图片,测试集共10000张图片。 +本样例采用CIFAR-10数据集,由10类32*32的彩色图片组成,每类包含6000张图片。其中训练集共50000张图片,测试集共10000张图片。 -> `CIFAR-10`数据集下载链接:。 +> CIFAR-10数据集下载链接:。 将数据集下载并解压到本地路径下,解压后的文件夹为`cifar-10-batches-bin`。 @@ -321,6 +321,7 @@ cd ../ - `RANK_TABLE_FILE`:组网信息文件的路径。 - `DEVICE_ID`:当前卡在机器上的实际序号。 - `RANK_ID`: 当前卡的逻辑序号。 + 其余环境变量请参考安装教程中的配置项。 运行时间大约在5分钟内,主要时间是用于算子的编译,实际训练时间在20秒内。用户可以通过`ps -ef | grep pytest`来监控任务进程。 diff --git a/tutorials/source_zh_cn/advanced_use/distributed_training_gpu.md b/tutorials/source_zh_cn/advanced_use/distributed_training_gpu.md index 93318259a8..918e0b5030 100644 --- a/tutorials/source_zh_cn/advanced_use/distributed_training_gpu.md +++ b/tutorials/source_zh_cn/advanced_use/distributed_training_gpu.md @@ -1,6 +1,6 @@ # 分布式并行训练 (GPU) -`GPU` `模型训练` `中级` `高级` +`Linux` `GPU` `模型训练` `中级` `高级` @@ -27,7 +27,7 @@ ### 下载数据集 -本样例采用`CIFAR-10`数据集,数据集的下载以及加载方式和Ascend 910 AI处理器一致。 +本样例采`CIFAR-10数据集,数据集的下载以及加载方式和Ascend 910 AI处理器一致。 > 数据集的下载和加载方式参考: > @@ -109,7 +109,7 @@ echo "start training" mpirun -n 8 pytest -s -v ./resnet50_distributed_training.py > train.log 2>&1 & ``` -脚本需要传入变量`DATA_PATH`,表示数据集的路径。此外,我们需要修改下`resnet50_distributed_training.py`文件,由于在GPU上,我们无需设置`DEVICE_ID`环境变量,因此,在脚本中不需要调用`int(os.getenv('DEVICE_ID'))`来获取卡的物理序号,同时`context`中也无需传入`device_id`。我们需要将`device_target`设置为`GPU`,并调用`init("nccl")`来使能NCCL。日志文件保存到device目录下,关于Loss部分结果保存在train.log中。将loss值grep出来后,示例如下: +脚本需要传入变量`DATA_PATH`,表示数据集的路径。此外,我们需要修改下`resnet50_distributed_training.py`文件,由于在GPU上,我们无需设置`DEVICE_ID`环境变量,因此,在脚本中不需要调用`int(os.getenv('DEVICE_ID'))`来获取卡的物理序号,同时`context`中也无需传入`device_id`。我们需要将`device_target`设置为`GPU`,并调用`init("nccl")`来使能NCCL。日志文件保存到`device`目录下,关于Loss部分结果保存在`train.log`中。将loss值grep出来后,示例如下: ``` epoch: 1 step: 1, loss is 2.3025854 @@ -124,7 +124,7 @@ epoch: 1 step: 1, loss is 2.3025854 ## 运行多机脚本 -若训练涉及多机,则需要额外在`mpirun`命令中设置多机配置。你可以直接在`mpirun`命令中用`-H`选项进行设置,比如`mpirun -n 16 -H DEVICE1_IP:8,DEVICE2_IP:8 python hello.py`,表示在ip为DEVICE1_IP和DEVICE2_IP的机器上分别起8个进程运行程序;或者也可以构造一个如下这样的hostfile文件,并将其路径传给`mpirun`的`--hostfile`的选项。hostfile文件每一行格式为`[hostname] slots=[slotnum]`,hostname可以是ip或者主机名。 +若训练涉及多机,则需要额外在`mpirun`命令中设置多机配置。你可以直接在`mpirun`命令中用`-H`选项进行设置,比如`mpirun -n 16 -H DEVICE1_IP:8,DEVICE2_IP:8 python hello.py`,表示在ip为DEVICE1_IP和DEVICE2_IP的机器上分别起8个进程运行程序;或者也可以构造一个如下这样的`hostfile`文件,并将其路径传给`mpirun`的`--hostfile`的选项。`hostfile`文件每一行格式为`[hostname] slots=[slotnum]`,`hostname`可以是ip或者主机名。 ```bash DEVICE1 slots=8 DEVICE2 slots=8 diff --git a/tutorials/source_zh_cn/advanced_use/fuzzer.md b/tutorials/source_zh_cn/advanced_use/fuzzer.md index 9ab97020ac..9bf85defe5 100644 --- a/tutorials/source_zh_cn/advanced_use/fuzzer.md +++ b/tutorials/source_zh_cn/advanced_use/fuzzer.md @@ -1,6 +1,6 @@ # AI模型安全测试 -`Ascend` `GPU` `CPU` `数据准备` `模型开发` `模型训练` `模型调优` `企业` `高级` +`Linux` `Ascend` `GPU` `CPU` `数据准备` `模型开发` `模型训练` `模型调优` `企业` `高级` @@ -60,7 +60,7 @@ context.set_context(mode=context.GRAPH_MODE, device_target=cfg.device_target) ### 运用Fuzzer -1. 建立LeNet模型,加载MNIST数据集,操作同[模型安全]() +1. 建立LeNet模型,加载MNIST数据集,操作同[模型安全]()。 ```python ... @@ -72,10 +72,10 @@ context.set_context(mode=context.GRAPH_MODE, device_target=cfg.device_target) ds = generate_mnist_dataset(data_list, batch_size, sparse=False) train_images = [] for data in ds.create_tuple_iterator(): - images = data[0].astype(np.float32) - train_images.append(images) - train_images = np.concatenate(train_images, axis=0) - + images = data[0].astype(np.float32) + train_images.append(images) + train_images = np.concatenate(train_images, axis=0) + # get test data data_list = "./MNIST_unzip/test" batch_size = 32 @@ -83,10 +83,10 @@ context.set_context(mode=context.GRAPH_MODE, device_target=cfg.device_target) test_images = [] test_labels = [] for data in ds.create_tuple_iterator(): - images = data[0].astype(np.float32) - labels = data[1] - test_images.append(images) - test_labels.append(labels) + images = data[0].astype(np.float32) + labels = data[1] + test_images.append(images) + test_labels.append(labels) test_images = np.concatenate(test_images, axis=0) test_labels = np.concatenate(test_labels, axis=0) ``` @@ -95,9 +95,9 @@ context.set_context(mode=context.GRAPH_MODE, device_target=cfg.device_target) 设置数据变异方法及参数。目前支持的数据变异方法包含三类: - - 图像仿射变换方法:Translate、Scale、Shear、Rotate。 - - 基于图像像素值变化的方法: Contrast、Brightness、Blur、Noise。 - - 基于对抗攻击的白盒、黑盒对抗样本生成方法:FGSM、PGD、MDIIM。 + - 图像仿射变换方法:`Translate`、`Scale`、`Shear`、`Rotate`。 + - 基于图像像素值变化的方法: `Contrast`、`Brightness`、`Blur`、`Noise`。 + - 基于对抗攻击的白盒、黑盒对抗样本生成方法:`FGSM`、`PGD`、`MDIIM`。 数据变异方法一定要包含基于图像像素值变化的方法。 @@ -172,8 +172,8 @@ context.set_context(mode=context.GRAPH_MODE, device_target=cfg.device_target) ```python if metrics: - for key in metrics: - LOGGER.info(TAG, key + ': %s', metrics[key]) + for key in metrics: + LOGGER.info(TAG, key + ': %s', metrics[key]) ``` Fuzz测试后结果如下: @@ -190,6 +190,6 @@ context.set_context(mode=context.GRAPH_MODE, device_target=cfg.device_target) ![fuzz_seed](./images/fuzz_seed.png) -​ Fuzz生成的变异图片: + Fuzz生成的变异图片: ![fuzz_res](./images/fuzz_res.png) \ No newline at end of file diff --git a/tutorials/source_zh_cn/advanced_use/gradient_accumulation.md b/tutorials/source_zh_cn/advanced_use/gradient_accumulation.md index f982312405..73924f9669 100644 --- a/tutorials/source_zh_cn/advanced_use/gradient_accumulation.md +++ b/tutorials/source_zh_cn/advanced_use/gradient_accumulation.md @@ -1,12 +1,12 @@ # 梯度累积 -`Ascend` `GPU` `模型调优` `中级` `高级` +`Linux` `Ascend` `GPU` `模型调优` `中级` `高级` - [梯度累积](#梯度累积) - [概述](#概述) - - [建立梯度累积模型](#建立梯度累积模型) + - [创建梯度累积模型](#创建梯度累积模型) - [导入需要的库文件](#导入需要的库文件) - [加载数据集](#加载数据集) - [定义网络](#定义网络) @@ -14,7 +14,6 @@ - [定义训练过程](#定义训练过程) - [训练并保存模型](#训练并保存模型) - [实验结果](#实验结果) - @@ -59,17 +58,17 @@ from model_zoo.official.cv.lenet.src.lenet import LeNet5 ### 加载数据集 -利用MindSpore的dataset提供的`MnistDataset`接口加载MNIST数据集,此部分代码由model_zoo中lenet目录下的[dataset.py]()导入。 +利用MindSpore的`dataset`提供的`MnistDataset`接口加载MNIST数据集,此部分代码由`model_zoo`中`lenet`目录下的[dataset.py]()导入。 ### 定义网络 -这里以LeNet网络为例进行介绍,当然也可以使用其它的网络,如ResNet-50、BERT等, 此部分代码由model_zoo中lenet目录下的[lenet.py]()导入。 +这里以LeNet网络为例进行介绍,当然也可以使用其它的网络,如ResNet-50、BERT等, 此部分代码由`model_zoo`中`lenet`目录下的[lenet.py]()导入。 ### 定义训练模型 将训练流程拆分为正向反向训练、参数更新和累积梯度清理三个部分: -- `TrainForwardBackward`计算loss和梯度,利用grad_sum实现梯度累加。 +- `TrainForwardBackward`计算loss和梯度,利用`grad_sum`实现梯度累加。 - `TrainOptim`实现参数更新。 -- `TrainClear`实现对梯度累加变量grad_sum清零。 +- `TrainClear`实现对梯度累加变量`grad_sum`清零。 ```python _sum_op = C.MultitypeFuncGraph("grad_sum_op") @@ -135,8 +134,7 @@ class TrainClear(Cell): ``` ### 定义训练过程 -每个Mini-batch通过正反向训练计算loss和梯度,通过mini_steps控制每次更新参数前的累加次数。达到累加次数后进行参数更新和 -累加梯度变量清零。 +每个Mini-batch通过正反向训练计算loss和梯度,通过`mini_steps`控制每次更新参数前的累加次数。达到累加次数后进行参数更新和累加梯度变量清零。 ```python class GradientAccumulation: @@ -253,7 +251,7 @@ if __name__ == "__main__": **验证模型** -通过model_zoo中lenet目录下的[eval.py](),使用保存的CheckPoint文件,加载验证数据集,进行验证。 +通过`model_zoo`中`lenet`目录下的[eval.py](),使用保存的CheckPoint文件,加载验证数据集,进行验证。 ```shell $ python eval.py --data_path=./MNIST_Data --ckpt_path=./gradient_accumulation.ckpt diff --git a/tutorials/source_zh_cn/advanced_use/graph_kernel_fusion.md b/tutorials/source_zh_cn/advanced_use/graph_kernel_fusion.md index 279e7ea4f6..b6a81aefae 100644 --- a/tutorials/source_zh_cn/advanced_use/graph_kernel_fusion.md +++ b/tutorials/source_zh_cn/advanced_use/graph_kernel_fusion.md @@ -1,6 +1,6 @@ # 图算融合 -`Ascend` `模型调优` `中级` `高级` +`Linux` `Ascend` `模型调优` `中级` `高级` diff --git a/tutorials/source_zh_cn/advanced_use/host_device_training.md b/tutorials/source_zh_cn/advanced_use/host_device_training.md index 6ef3c35f91..801e1eb4ba 100644 --- a/tutorials/source_zh_cn/advanced_use/host_device_training.md +++ b/tutorials/source_zh_cn/advanced_use/host_device_training.md @@ -1,6 +1,6 @@ # Host+Device混合训练 -`Ascend` `CPU` `模型训练` `中级` `高级` +`Linux` `Ascend` `CPU` `模型训练` `中级` `高级` diff --git a/tutorials/source_zh_cn/advanced_use/mixed_precision.md b/tutorials/source_zh_cn/advanced_use/mixed_precision.md index c59cdca7c3..82d5a35d2b 100644 --- a/tutorials/source_zh_cn/advanced_use/mixed_precision.md +++ b/tutorials/source_zh_cn/advanced_use/mixed_precision.md @@ -1,6 +1,6 @@ # 混合精度 -`Ascend` `GPU` `模型训练` `中级` `高级` +`Linux` `Ascend` `GPU` `模型训练` `中级` `高级` @@ -102,7 +102,7 @@ MindSpore还支持手动混合精度。假定在网络中只有一个Dense Layer 2. 配置混合精度: 通过`net.to_float(mstype.float16)`,把该Cell及其子Cell中所有的算子都配置成FP16;然后,将模型中的dense算子手动配置成FP32; -3. 使用TrainOneStepCell封装网络模型和优化器。 +3. 使用`TrainOneStepCell`封装网络模型和优化器。 代码样例如下: diff --git a/tutorials/source_zh_cn/advanced_use/mobilenetv2_incremental_learning.md b/tutorials/source_zh_cn/advanced_use/mobilenetv2_incremental_learning.md index db88e9d539..3822551830 100644 --- a/tutorials/source_zh_cn/advanced_use/mobilenetv2_incremental_learning.md +++ b/tutorials/source_zh_cn/advanced_use/mobilenetv2_incremental_learning.md @@ -1,5 +1,5 @@ # MobileNetV2 增量学习 -`CPU` `Ascend` `GPU` `模型开发` `中级` `高级` +`Linux` `CPU` `Ascend` `GPU` `模型开发` `中级` `高级` diff --git a/tutorials/source_zh_cn/advanced_use/model_security.md b/tutorials/source_zh_cn/advanced_use/model_security.md index 1d445b489b..c7e159b233 100644 --- a/tutorials/source_zh_cn/advanced_use/model_security.md +++ b/tutorials/source_zh_cn/advanced_use/model_security.md @@ -1,6 +1,6 @@ # 模型安全 -`Ascend` `GPU` `CPU` `数据准备` `模型开发` `模型训练` `模型调优` `企业` `高级` +`Linux` `Ascend` `GPU` `CPU` `数据准备` `模型开发` `模型训练` `模型调优` `企业` `高级` diff --git a/tutorials/source_zh_cn/advanced_use/network_migration.md b/tutorials/source_zh_cn/advanced_use/network_migration.md index 0ffe505585..663c24616e 100644 --- a/tutorials/source_zh_cn/advanced_use/network_migration.md +++ b/tutorials/source_zh_cn/advanced_use/network_migration.md @@ -1,6 +1,6 @@ # 网络迁移 -`Ascend` `GPU` `CPU` `全流程` `初级` `中级` `高级` +`Linux` `Ascend` `GPU` `CPU` `全流程` `初级` `中级` `高级` diff --git a/tutorials/source_zh_cn/advanced_use/nlp_application.md b/tutorials/source_zh_cn/advanced_use/nlp_application.md index dd6df6a34b..5a336c1843 100644 --- a/tutorials/source_zh_cn/advanced_use/nlp_application.md +++ b/tutorials/source_zh_cn/advanced_use/nlp_application.md @@ -1,6 +1,6 @@ # 自然语言处理应用 -`GPU` `CPU` `全流程` `初级` `中级` `高级` +`Linux` `GPU` `CPU` `全流程` `初级` `中级` `高级` diff --git a/tutorials/source_zh_cn/advanced_use/optimize_the_performance_of_data_preparation.md b/tutorials/source_zh_cn/advanced_use/optimize_the_performance_of_data_preparation.md index 05ea6013c2..ffb7b073c8 100644 --- a/tutorials/source_zh_cn/advanced_use/optimize_the_performance_of_data_preparation.md +++ b/tutorials/source_zh_cn/advanced_use/optimize_the_performance_of_data_preparation.md @@ -1,6 +1,6 @@ # 优化数据准备的性能 -`Ascend` `GPU` `CPU` `数据准备` `初级` `中级` `高级` +`Linux` `Ascend` `GPU` `CPU` `数据准备` `初级` `中级` `高级` diff --git a/tutorials/source_zh_cn/advanced_use/parameter_server_training.md b/tutorials/source_zh_cn/advanced_use/parameter_server_training.md index 86a8ce0ae3..4d60d053c4 100644 --- a/tutorials/source_zh_cn/advanced_use/parameter_server_training.md +++ b/tutorials/source_zh_cn/advanced_use/parameter_server_training.md @@ -1,6 +1,6 @@ # Parameter Server训练 -`Ascend` `GPU` `模型训练` `中级` `高级` +`Linux` `Ascend` `GPU` `模型训练` `中级` `高级` diff --git a/tutorials/source_zh_cn/advanced_use/quantization_aware.md b/tutorials/source_zh_cn/advanced_use/quantization_aware.md index 72782ed785..4d72f7f6a7 100644 --- a/tutorials/source_zh_cn/advanced_use/quantization_aware.md +++ b/tutorials/source_zh_cn/advanced_use/quantization_aware.md @@ -1,6 +1,6 @@ # 量化 -`Ascend` `GPU` `模型调优` `高级` +`Linux` `Ascend` `GPU` `模型调优` `高级` diff --git a/tutorials/source_zh_cn/advanced_use/second_order_optimizer_for_resnet50_application.md b/tutorials/source_zh_cn/advanced_use/second_order_optimizer_for_resnet50_application.md index 5aff6381f4..f43267dae6 100644 --- a/tutorials/source_zh_cn/advanced_use/second_order_optimizer_for_resnet50_application.md +++ b/tutorials/source_zh_cn/advanced_use/second_order_optimizer_for_resnet50_application.md @@ -1,6 +1,6 @@ # ResNet-50二阶优化实践 -`Ascend` `GPU` `模型开发` `模型调优` `高级` +`Linux` `Ascend` `GPU` `模型开发` `模型调优` `高级` diff --git a/tutorials/source_zh_cn/advanced_use/serving.md b/tutorials/source_zh_cn/advanced_use/serving.md index 43dc1c5589..b7a7b58ef2 100644 --- a/tutorials/source_zh_cn/advanced_use/serving.md +++ b/tutorials/source_zh_cn/advanced_use/serving.md @@ -1,6 +1,6 @@ # 基于MindSpore部署推理服务 -`Ascend` `环境准备` `企业` `高级` +`Linux` `Ascend` `环境准备` `企业` `高级` diff --git a/tutorials/source_zh_cn/advanced_use/synchronization_training_and_evaluation.md b/tutorials/source_zh_cn/advanced_use/synchronization_training_and_evaluation.md index 773b4c4535..df6dad7351 100644 --- a/tutorials/source_zh_cn/advanced_use/synchronization_training_and_evaluation.md +++ b/tutorials/source_zh_cn/advanced_use/synchronization_training_and_evaluation.md @@ -1,6 +1,6 @@ # 同步训练和验证模型 -`Ascend` `GPU` `CPU` `初级` `中级` `高级` `模型导出` `模型训练` +`Linux` `Ascend` `GPU` `CPU` `初级` `中级` `高级` `模型导出` `模型训练` diff --git a/tutorials/source_zh_cn/advanced_use/use_on_the_cloud.md b/tutorials/source_zh_cn/advanced_use/use_on_the_cloud.md index 4f88abb2f4..c1830d7e16 100644 --- a/tutorials/source_zh_cn/advanced_use/use_on_the_cloud.md +++ b/tutorials/source_zh_cn/advanced_use/use_on_the_cloud.md @@ -1,6 +1,6 @@ # 在云上使用MindSpore -`Ascend` `全流程` `初级` `中级` `高级` +`Linux` `Ascend` `全流程` `初级` `中级` `高级` diff --git a/tutorials/source_zh_cn/quick_start/linear_regression.md b/tutorials/source_zh_cn/quick_start/linear_regression.md index 9a042225ba..4d6a041baa 100644 --- a/tutorials/source_zh_cn/quick_start/linear_regression.md +++ b/tutorials/source_zh_cn/quick_start/linear_regression.md @@ -1,6 +1,6 @@ # 实现简单线性函数拟合 -`GPU` `全流程` `初级` `中级` `高级` +`Linux` `GPU` `全流程` `初级` `中级` `高级` 作者:[杨奕](https://github.com/helloyesterday)    编辑:[吕明赋](https://gitee.com/lvmingfu) diff --git a/tutorials/source_zh_cn/quick_start/quick_start.md b/tutorials/source_zh_cn/quick_start/quick_start.md index ac26e962ae..34de261fed 100644 --- a/tutorials/source_zh_cn/quick_start/quick_start.md +++ b/tutorials/source_zh_cn/quick_start/quick_start.md @@ -1,6 +1,6 @@ # 实现一个图片分类应用 -`Ascend` `GPU` `CPU` `全流程` `初级` `中级` `高级` +`Linux` `Windows` `Ascend` `GPU` `CPU` `全流程` `初级` `中级` `高级` diff --git a/tutorials/source_zh_cn/use/custom_operator.md b/tutorials/source_zh_cn/use/custom_operator.md index 4916ebc1a6..1d90e904aa 100644 --- a/tutorials/source_zh_cn/use/custom_operator.md +++ b/tutorials/source_zh_cn/use/custom_operator.md @@ -1,6 +1,6 @@ # 自定义算子 -`Ascend` `模型开发` `高级` +`Linux` `Ascend` `模型开发` `高级` diff --git a/tutorials/source_zh_cn/use/data_preparation/converting_datasets.md b/tutorials/source_zh_cn/use/data_preparation/converting_datasets.md index 83f9652da3..f152de92b1 100644 --- a/tutorials/source_zh_cn/use/data_preparation/converting_datasets.md +++ b/tutorials/source_zh_cn/use/data_preparation/converting_datasets.md @@ -1,6 +1,6 @@ # 将数据集转换为MindSpore数据格式 -`Ascend` `GPU` `CPU` `数据准备` `初级` `中级` `高级` +`Linux` `Ascend` `GPU` `CPU` `数据准备` `初级` `中级` `高级` diff --git a/tutorials/source_zh_cn/use/data_preparation/data_processing_and_augmentation.md b/tutorials/source_zh_cn/use/data_preparation/data_processing_and_augmentation.md index 88cf85f0a8..5df486f35b 100644 --- a/tutorials/source_zh_cn/use/data_preparation/data_processing_and_augmentation.md +++ b/tutorials/source_zh_cn/use/data_preparation/data_processing_and_augmentation.md @@ -1,6 +1,6 @@ # 数据处理与数据增强 -`Ascend` `GPU` `CPU` `数据准备` `初级` `中级` `高级` +`Linux` `Ascend` `GPU` `CPU` `数据准备` `初级` `中级` `高级` diff --git a/tutorials/source_zh_cn/use/data_preparation/loading_the_datasets.md b/tutorials/source_zh_cn/use/data_preparation/loading_the_datasets.md index 581feb4833..68f38bc46a 100644 --- a/tutorials/source_zh_cn/use/data_preparation/loading_the_datasets.md +++ b/tutorials/source_zh_cn/use/data_preparation/loading_the_datasets.md @@ -1,6 +1,6 @@ # 加载数据集 -`Ascend` `GPU` `CPU` `数据准备` `初级` `中级` `高级` +`Linux` `Ascend` `GPU` `CPU` `数据准备` `初级` `中级` `高级` diff --git a/tutorials/source_zh_cn/use/multi_platform_inference.md b/tutorials/source_zh_cn/use/multi_platform_inference.md index 83b588e41a..5628bdc5c1 100644 --- a/tutorials/source_zh_cn/use/multi_platform_inference.md +++ b/tutorials/source_zh_cn/use/multi_platform_inference.md @@ -1,6 +1,6 @@ # 多平台推理 -`Ascend` `GPU` `CPU` `推理应用` `初级` `中级` `高级` + `Linux` `Ascend` `GPU` `CPU` `推理应用` `初级` `中级` `高级` diff --git a/tutorials/source_zh_cn/use/saving_and_loading_model_parameters.md b/tutorials/source_zh_cn/use/saving_and_loading_model_parameters.md index e1d5f8b246..f624b8712c 100644 --- a/tutorials/source_zh_cn/use/saving_and_loading_model_parameters.md +++ b/tutorials/source_zh_cn/use/saving_and_loading_model_parameters.md @@ -1,6 +1,6 @@ # 模型参数的保存和加载 -`Ascend` `GPU` `CPU` `模型导出` `初级` `中级` `高级` +`Linux` `Ascend` `GPU` `CPU` `模型导出` `初级` `中级` `高级` -- Gitee