From aed393d50f38fa33a50cc2359460970a1ff5dd30 Mon Sep 17 00:00:00 2001 From: wangcong Date: Wed, 17 Jun 2020 20:59:08 +0800 Subject: [PATCH] add pre compile process --- .../parallel_compile/tbe_compiler/compiler.py | 11 ++++------- .../parallel_compile/tbe_compiler/tbe_process.py | 6 +++--- .../ccsrc/device/ascend/kernel_build_ascend.cc | 3 ++- mindspore/ccsrc/kernel/kernel.h | 1 + mindspore/ccsrc/kernel/tbe/tbe_convert_utils.cc | 2 +- .../ccsrc/kernel/tbe/tbe_kernel_parallel_build.cc | 14 ++++++++++++++ mindspore/ccsrc/session/ascend_session.cc | 1 + mindspore/ops/_op_impl/tbe/matmul.py | 2 +- 8 files changed, 27 insertions(+), 13 deletions(-) diff --git a/mindspore/_extends/parallel_compile/tbe_compiler/compiler.py b/mindspore/_extends/parallel_compile/tbe_compiler/compiler.py index 68dbebd5b6..a241bf9e10 100755 --- a/mindspore/_extends/parallel_compile/tbe_compiler/compiler.py +++ b/mindspore/_extends/parallel_compile/tbe_compiler/compiler.py @@ -28,8 +28,8 @@ build_in_impl_path = get_build_in_impl_path() # op function list op_build = "compile" op_pre_build = "pre_build" -fusion_type_map = {'Convolution': 0, 'ElemWise': 1, 'CommReduce': 2, - 'Segment': 3, 'Opaque': 4} +fusion_pattern_start_flag = "fusion_pattern_start" +fusion_pattern_end_flag = "fusion_pattern_end" def _initialize(impl_path): """Initialize""" @@ -43,7 +43,6 @@ def _initialize(impl_path): sys.path.insert(0, op_module_name) - def build_op(build_type, json_str): """ call op functions with function name and input args json_str @@ -169,7 +168,5 @@ def compile_with_json(json_str): if __name__ == "__main__": in_args = sys.stdin.readline() result = compile_with_json(in_args) - if result in fusion_type_map: - exit(fusion_type_map[result]) - else: - exit(100) + sys.stdout.write(fusion_pattern_start_flag + str(result) + fusion_pattern_end_flag) + sys.stdout.flush() diff --git a/mindspore/_extends/parallel_compile/tbe_compiler/tbe_process.py b/mindspore/_extends/parallel_compile/tbe_compiler/tbe_process.py index 6dabc6121d..80b50c45a9 100644 --- a/mindspore/_extends/parallel_compile/tbe_compiler/tbe_process.py +++ b/mindspore/_extends/parallel_compile/tbe_compiler/tbe_process.py @@ -88,10 +88,10 @@ def run_compiler(op_json): try: tbe_compiler = os.path.join(os.path.split(os.path.realpath(__file__))[0], "compiler.py") completed_object = subprocess.run([sys.executable, tbe_compiler], input=op_json, timeout=300, - text=True, capture_output=True, check=False) + text=True, capture_output=True, check=True) if completed_object: - code = completed_object.returncode - return "Success", str(code) + out = completed_object.stdout + return "Success", out except subprocess.TimeoutExpired: tb = traceback.format_exc() return "TBEException", "PreCompileTimeOut: " + tb + "\ninput_args: " + op_json diff --git a/mindspore/ccsrc/device/ascend/kernel_build_ascend.cc b/mindspore/ccsrc/device/ascend/kernel_build_ascend.cc index 68be42ab6d..dcc4e6ace0 100644 --- a/mindspore/ccsrc/device/ascend/kernel_build_ascend.cc +++ b/mindspore/ccsrc/device/ascend/kernel_build_ascend.cc @@ -73,7 +73,8 @@ static bool KernelPreBuildParallelCompile(const mindspore::session::KernelGraph KernelType kernel_type = AnfAlgo::GetKernelType(anf_node); switch (kernel_type) { case KernelType::TBE_KERNEL: { - if (AnfAlgo::GetKernelMod(anf_node) == nullptr) { + if (AnfAlgo::GetKernelMod(anf_node) == nullptr && + AnfAlgo::GetFusionType(anf_node) == kernel::FusionType::DYNAMIC) { tbe_nodes.push_back(anf_node); } break; diff --git a/mindspore/ccsrc/kernel/kernel.h b/mindspore/ccsrc/kernel/kernel.h index 211e81c684..4adb3ea025 100644 --- a/mindspore/ccsrc/kernel/kernel.h +++ b/mindspore/ccsrc/kernel/kernel.h @@ -45,6 +45,7 @@ enum FusionType { COMMREDUCE, SEGMENT, OPAQUE, + DYNAMIC, UNKNOWN_FUSION_TYPE = -1, }; enum OpPattern { diff --git a/mindspore/ccsrc/kernel/tbe/tbe_convert_utils.cc b/mindspore/ccsrc/kernel/tbe/tbe_convert_utils.cc index 5212dc9641..ee9be22120 100644 --- a/mindspore/ccsrc/kernel/tbe/tbe_convert_utils.cc +++ b/mindspore/ccsrc/kernel/tbe/tbe_convert_utils.cc @@ -63,7 +63,7 @@ const std::unordered_map type_nbyte_maps = { const std::unordered_map fusion_type_maps = { {"CONVLUTION", FusionType::CONVLUTION}, {"ELEMWISE", FusionType::ELEMWISE}, {"COMMREDUCE", FusionType::COMMREDUCE}, - {"SEGMENT", FusionType::SEGMENT}, {"OPAQUE", FusionType::OPAQUE}, + {"SEGMENT", FusionType::SEGMENT}, {"DYNAMIC", FusionType::DYNAMIC}, {"OPAQUE", FusionType::OPAQUE}, }; TypeId DtypeToTypeId(const std::string &dtypes) { diff --git a/mindspore/ccsrc/kernel/tbe/tbe_kernel_parallel_build.cc b/mindspore/ccsrc/kernel/tbe/tbe_kernel_parallel_build.cc index c2d315d14e..d7e4fcec84 100644 --- a/mindspore/ccsrc/kernel/tbe/tbe_kernel_parallel_build.cc +++ b/mindspore/ccsrc/kernel/tbe/tbe_kernel_parallel_build.cc @@ -205,6 +205,20 @@ void ParallelBuildManager::PreTaskFinishProcess(int32_t task_id, const std::stri if (task_iter == pre_task_map_.end()) { MS_EXCEPTION(ArgumentError) << "can find pre task_id:" << task_id; } + auto node = task_iter->second; + auto builder = + std::make_shared(AnfAlgo::GetSelectKernelBuildInfo(node)); + std::string start_flag = "fusion_pattern_start"; + std::string end_flag = "fusion_pattern_end"; + int start = pre_build_result.find(start_flag); + int end = pre_build_result.find(end_flag); + if (start != -1 && end != -1) { + std::string result = pre_build_result.substr(start + start_flag.size(), end - start - start_flag.size()); + transform(result.begin(), result.end(), result.begin(), ::toupper); + FusionType fusion_type = tbe::GetFusionType(result); + builder->SetFusionType(fusion_type); + AnfAlgo::SetSelectKernelBuildInfo(builder->Build(), node.get()); + } (void)pre_task_map_.erase(task_iter); } diff --git a/mindspore/ccsrc/session/ascend_session.cc b/mindspore/ccsrc/session/ascend_session.cc index bf1fa87530..5e5e10aaa9 100644 --- a/mindspore/ccsrc/session/ascend_session.cc +++ b/mindspore/ccsrc/session/ascend_session.cc @@ -563,6 +563,7 @@ void AscendSession::InitRuntimeResource() { } void AscendSession::HardwareOptimize(const std::shared_ptr &kernel_graph) const { + device::ascend::KernelPreBuild(kernel_graph.get()); MS_LOG(INFO) << "HardwareOptimize start!"; opt::AscendBackendOptimization(kernel_graph); MS_EXCEPTION_IF_NULL(kernel_graph); diff --git a/mindspore/ops/_op_impl/tbe/matmul.py b/mindspore/ops/_op_impl/tbe/matmul.py index c29378f721..560360f759 100644 --- a/mindspore/ops/_op_impl/tbe/matmul.py +++ b/mindspore/ops/_op_impl/tbe/matmul.py @@ -17,7 +17,7 @@ from mindspore.ops.op_info_register import op_info_register, TBERegOp, DataType matmul_op_info = TBERegOp("MatMul") \ - .fusion_type("OPAQUE") \ + .fusion_type("DYNAMIC") \ .async_flag(False) \ .binfile_name("matmul.so") \ .compute_cost(10) \