From 10ac7b65bcf06fee77d6ab45327f946c9c33fbaa Mon Sep 17 00:00:00 2001 From: i-robot Date: Wed, 23 Jun 2021 12:50:12 +0000 Subject: [PATCH] !465 add option op_precision_mode Merge pull request !465 from lianghuikang/feature --- inc/graphengine/inc/external/ge/ge_api_types.h | 5 +++++ tf_adapter/interface_spec/api_npu_config.pyh | 2 +- .../optimizers/om_partition_subgraphs_pass.cc | 2 -- .../python/npu_bridge/estimator/npu/npu_config.py | 5 ++++- .../npu_bridge/estimator/npu/npu_estimator.py | 2 ++ tf_adapter/util/npu_attrs.cc | 13 +++++++++++++ 6 files changed, 25 insertions(+), 4 deletions(-) diff --git a/inc/graphengine/inc/external/ge/ge_api_types.h b/inc/graphengine/inc/external/ge/ge_api_types.h index fbd6c020e..6f5bbfbfe 100644 --- a/inc/graphengine/inc/external/ge/ge_api_types.h +++ b/inc/graphengine/inc/external/ge/ge_api_types.h @@ -113,6 +113,7 @@ const char *const INPUT_FP16_NODES = "ge.INPUT_NODES_SET_FP16"; const char *const OP_DEBUG_LEVEL = "ge.opDebugLevel"; const char *const PERFORMANCE_MODE = "ge.performance_mode"; const char *const MODIFY_MIXLIST = "ge.exec.modify_mixlist"; +const char *const OP_PRECISION_MODE = "ge.exec.op_precision_mode"; } // namespace configure_option // Configure stream num by Session constructor options param, // its value should be int32_t type, default value is "1" @@ -326,6 +327,8 @@ const std::string PERFORMANCE_MODE = "ge.performance_mode"; const std::string MODIFY_MIXLIST = "ge.exec.modify_mixlist"; +const std::string OP_PRECISION_MODE = "ge.exec.op_precision_mode"; + // Graph run mode enum GraphRunMode { PREDICTION = 0, TRAIN }; @@ -405,6 +408,7 @@ static const char *const OP_BANK_UPDATE = ge::OP_BANK_UPDATE_FLAG.c_str(); static const char *const OP_DEBUG_LEVEL = ge::OP_DEBUG_LEVEL.c_str(); static const char *const PERFORMANCE_MODE = ge::PERFORMANCE_MODE.c_str(); static const char *const MODIFY_MIXLIST = ge::MODIFY_MIXLIST.c_str(); +static const char *const OP_PRECISION_MODE = ge::OP_PRECISION_MODE.c_str(); // for interface: aclgrphBuildModel #ifdef __GNUC__ @@ -416,6 +420,7 @@ const std::set ir_builder_suppported_options = {INPUT_FORMAT, DYNAMIC_IMAGE_SIZE, DYNAMIC_DIMS, INSERT_OP_FILE, + OP_PRECISION_MODE, PRECISION_MODE, TUNE_DEVICE_IDS, EXEC_DISABLE_REUSED_MEMORY, diff --git a/tf_adapter/interface_spec/api_npu_config.pyh b/tf_adapter/interface_spec/api_npu_config.pyh index 614a5a858..1674c3508 100644 --- a/tf_adapter/interface_spec/api_npu_config.pyh +++ b/tf_adapter/interface_spec/api_npu_config.pyh @@ -15,7 +15,7 @@ class NPURunConfig(run_config_lib.RunConfig): op_compiler_cache_mode=None, op_compiler_cache_dir=None, debug_dir=None, hcom_multi_mode=False, dynamic_input=False, dynamic_graph_execute_mode="dynamic_execute", dynamic_inputs_shape_range=None, train_distribute=None, eval_distribute=None, local_rank_id=None, local_device_list=None, session_device_id=None, - distribute_config=None, modify_mixlist=None): + distribute_config=None, modify_mixlist=None, op_precision_mode=None): class ProfilingConfig(): def __init__(self, enable_profiling=False, profiling_options=None): diff --git a/tf_adapter/optimizers/om_partition_subgraphs_pass.cc b/tf_adapter/optimizers/om_partition_subgraphs_pass.cc index e32965a09..634958502 100644 --- a/tf_adapter/optimizers/om_partition_subgraphs_pass.cc +++ b/tf_adapter/optimizers/om_partition_subgraphs_pass.cc @@ -2085,8 +2085,6 @@ Status OMPartitionSubgraphsPass::ProcessGraph(std::unique_ptr *graph, Fun break; } } - ADP_LOG(INFO) << "pass options:"; - NpuAttrs::LogOptions(pass_options); ADP_LOG(INFO) << "all options:"; NpuAttrs::LogOptions(all_options); diff --git a/tf_adapter/python/npu_bridge/estimator/npu/npu_config.py b/tf_adapter/python/npu_bridge/estimator/npu/npu_config.py index bab6797c5..68dd28e12 100644 --- a/tf_adapter/python/npu_bridge/estimator/npu/npu_config.py +++ b/tf_adapter/python/npu_bridge/estimator/npu/npu_config.py @@ -87,7 +87,8 @@ class NPURunConfig(run_config_lib.RunConfig): local_device_list=None, session_device_id=None, distribute_config=None, - modify_mixlist=None + modify_mixlist=None, + op_precision_mode=None ): """ Constructs a NPUConfig. @@ -155,6 +156,7 @@ class NPURunConfig(run_config_lib.RunConfig): local_device_list: Available devices. distribute_config: Specify the NCA configuration file path modify_mixlist: Set the path of operator mixed precision configuration file. + op_precision_mode: Set the path of operator precision mode configuration file (.ini) """ # Check iterations_per_loop. @@ -236,6 +238,7 @@ class NPURunConfig(run_config_lib.RunConfig): self._session_device_id = session_device_id self._distribute_config = distribute_config self._modify_mixlist = modify_mixlist + self._op_precision_mode = op_precision_mode super(NPURunConfig, self).__init__( model_dir=model_dir, diff --git a/tf_adapter/python/npu_bridge/estimator/npu/npu_estimator.py b/tf_adapter/python/npu_bridge/estimator/npu/npu_estimator.py index eed5a44e4..2bbf1adc5 100644 --- a/tf_adapter/python/npu_bridge/estimator/npu/npu_estimator.py +++ b/tf_adapter/python/npu_bridge/estimator/npu/npu_estimator.py @@ -758,6 +758,8 @@ class NPUEstimator(estimator_lib.Estimator): custom_op.parameter_map["session_device_id"].i = config._session_device_id if config._modify_mixlist is not None: custom_op.parameter_map["modify_mixlist"].s = tf.compat.as_bytes(config._modify_mixlist) + if config._op_precision_mode is not None: + custom_op.parameter_map["op_precision_mode"].s = tf.compat.as_bytes(config._op_precision_mode) # add profiling options to custom_op self.__load_profiling_options(config, custom_op) diff --git a/tf_adapter/util/npu_attrs.cc b/tf_adapter/util/npu_attrs.cc index 0e87e5d47..4fca7f5f0 100644 --- a/tf_adapter/util/npu_attrs.cc +++ b/tf_adapter/util/npu_attrs.cc @@ -317,6 +317,7 @@ std::map NpuAttrs::GetSessOptions(OpKernelConstruction std::string dynamic_node_type; std::string session_device_id; std::string modify_mixlist; + std::string op_precision_mode; if (ctx != nullptr && ctx->GetAttr("_NpuOptimizer", &npuOptimizer) == Status::OK()) { ctx->GetAttr("_variable_format_optimize", &variable_format_optimize); @@ -367,6 +368,7 @@ std::map NpuAttrs::GetSessOptions(OpKernelConstruction ctx->GetAttr("_dynamic_node_type", &dynamic_node_type); ctx->GetAttr("_session_device_id", &session_device_id); ctx->GetAttr("_modify_mixlist", &modify_mixlist); + ctx->GetAttr("_op_precision_mode", &op_precision_mode); } // session options @@ -396,6 +398,7 @@ std::map NpuAttrs::GetSessOptions(OpKernelConstruction sess_options["ge.session_device_id"] = session_device_id; } sess_options[ge::MODIFY_MIXLIST] = modify_mixlist; + sess_options["ge.exec.op_precision_mode"] = op_precision_mode; return sess_options; } @@ -768,6 +771,7 @@ std::map NpuAttrs::GetAllAttrOptions(AttrSlice attrs) std::string hcom_multi_mode; std::string session_device_id; std::string modify_mixlist; + std::string op_precision_mode; if (attrs.Find("_NpuOptimizer") != nullptr) { do_npu_optimizer = std::to_string(true); @@ -904,6 +908,9 @@ std::map NpuAttrs::GetAllAttrOptions(AttrSlice attrs) if (attrs.Find("_modify_mixlist") != nullptr) { modify_mixlist = attrs.Find("_modify_mixlist")->s(); } + if (attrs.Find("_op_precision_mode") != nullptr) { + op_precision_mode = attrs.Find("_op_precision_mode")->s(); + } } all_options["variable_format_optimize"] = variable_format_optimize; @@ -960,6 +967,7 @@ std::map NpuAttrs::GetAllAttrOptions(AttrSlice attrs) all_options["hcom_multi_mode"] = hcom_multi_mode; all_options["session_device_id"] = session_device_id; all_options["modify_mixlist"] = modify_mixlist; + all_options["op_precision_mode"] = op_precision_mode; return all_options; } @@ -1037,6 +1045,7 @@ Status NpuAttrs::SetNpuOptimizerAttr(const GraphOptimizationPassOptions &options bool hcom_multi_mode = false; int session_device_id = -1; std::string modify_mixlist; + std::string op_precision_mode; const RewriterConfig &rewrite_options = options.session_options->config.graph_options().rewrite_options(); for (const auto &custom_optimizer : rewrite_options.custom_optimizers()) { @@ -1293,6 +1302,9 @@ Status NpuAttrs::SetNpuOptimizerAttr(const GraphOptimizationPassOptions &options return errors::Internal("modify_mixlist is assigned, please ensure that precision_mode is assigned to 'allow_mix_precision'."); } } + if (params.count("op_precision_mode")) { + op_precision_mode = params.at("op_precision_mode").s(); + } } } @@ -1323,6 +1335,7 @@ Status NpuAttrs::SetNpuOptimizerAttr(const GraphOptimizationPassOptions &options sess_options["hcom_multi_mode"] = std::to_string(hcom_multi_mode); sess_options["session_device_id"] = std::to_string(session_device_id); sess_options["modify_mixlist"] = modify_mixlist; + sess_options["op_precision_mode"] = op_precision_mode; init_options["precision_mode"] = precision_mode; init_options["profiling_mode"] = std::to_string(profiling_mode); -- Gitee