You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tvm.apache.org by ju...@apache.org on 2021/12/06 19:28:42 UTC
[tvm] 01/01: [Target][TVMC][UX] Avoid creation of dummy Target objects in TVMC
This is an automated email from the ASF dual-hosted git repository.
junrushao pushed a commit to branch bugfix/2021-12-06/no-dummy-target-creation
in repository https://gitbox.apache.org/repos/asf/tvm.git
commit a2cf1baaef3f7398b9222a02ba04a6aa47abf43e
Author: Junru Shao <ju...@gmail.com>
AuthorDate: Mon Dec 6 11:28:10 2021 -0800
[Target][TVMC][UX] Avoid creation of dummy Target objects in TVMC
---
python/tvm/driver/tvmc/target.py | 26 ++++++++++++--------------
python/tvm/target/target.py | 5 +++++
src/target/target_kind.cc | 6 +++++-
3 files changed, 22 insertions(+), 15 deletions(-)
diff --git a/python/tvm/driver/tvmc/target.py b/python/tvm/driver/tvmc/target.py
index a551293..067a361 100644
--- a/python/tvm/driver/tvmc/target.py
+++ b/python/tvm/driver/tvmc/target.py
@@ -19,7 +19,7 @@ This file contains functions for processing target inputs for the TVMC CLI
"""
from tvm.driver import tvmc
-from tvm.target import Target
+from tvm.target import Target, TargetKind
# We can't tell the type inside an Array but all current options are strings so
# it can default to that. Bool is used alongside Integer but aren't distinguished
@@ -33,14 +33,14 @@ def _valid_target_kinds():
return filter(lambda target: target not in codegen_names, Target.list_kinds())
-def _generate_target_kind_args(parser, kind):
- target_group = parser.add_argument_group(f"target {kind.name}")
- for target_option, target_type in kind.options.items():
+def _generate_target_kind_args(parser, kind_name):
+ target_group = parser.add_argument_group(f"target {kind_name}")
+ for target_option, target_type in TargetKind.options_from_name(kind_name).items():
if target_type in INTERNAL_TO_NATIVE_TYPE:
target_group.add_argument(
- f"--target-{kind.name}-{target_option}",
+ f"--target-{kind_name}-{target_option}",
type=INTERNAL_TO_NATIVE_TYPE[target_type],
- help=f"target {kind.name} {target_option}{INTERNAL_TO_HELP[target_type]}",
+ help=f"target {kind_name} {target_option}{INTERNAL_TO_HELP[target_type]}",
)
@@ -52,15 +52,14 @@ def generate_target_args(parser):
required=True,
)
for target_kind in _valid_target_kinds():
- target = Target(target_kind)
- _generate_target_kind_args(parser, target.kind)
+ _generate_target_kind_args(parser, target_kind)
-def _reconstruct_target_kind_args(args, kind):
+def _reconstruct_target_kind_args(args, kind_name):
kind_options = {}
- for target_option, target_type in kind.options.items():
+ for target_option, target_type in TargetKind.options_from_name(kind_name).items():
if target_type in INTERNAL_TO_NATIVE_TYPE:
- var_name = f"target_{kind.name.replace('-', '_')}_{target_option.replace('-', '_')}"
+ var_name = f"target_{kind_name.replace('-', '_')}_{target_option.replace('-', '_')}"
option_value = getattr(args, var_name)
if option_value is not None:
kind_options[target_option] = getattr(args, var_name)
@@ -71,8 +70,7 @@ def reconstruct_target_args(args):
"""Reconstructs the target options from the arguments"""
reconstructed = {}
for target_kind in _valid_target_kinds():
- target = Target(target_kind)
- kind_options = _reconstruct_target_kind_args(args, target.kind)
+ kind_options = _reconstruct_target_kind_args(args, target_kind)
if kind_options:
- reconstructed[target.kind.name] = kind_options
+ reconstructed[target_kind] = kind_options
return reconstructed
diff --git a/python/tvm/target/target.py b/python/tvm/target/target.py
index e49791e..1c418e5 100644
--- a/python/tvm/target/target.py
+++ b/python/tvm/target/target.py
@@ -36,6 +36,11 @@ class TargetKind(Object):
"""Returns the dict of available option names and types"""
return dict(_ffi_api.ListTargetKindOptions(self))
+ @staticmethod
+ def options_from_name(kind_name: str):
+ """Returns the dict of available option names and types from a name of TargetKind"""
+ return dict(_ffi_api.ListTargetKindOptionsFromName(kind_name))
+
@tvm._ffi.register_object
class Target(Object):
diff --git a/src/target/target_kind.cc b/src/target/target_kind.cc
index 5540c35..59efc8c 100644
--- a/src/target/target_kind.cc
+++ b/src/target/target_kind.cc
@@ -402,11 +402,15 @@ TVM_REGISTER_TARGET_KIND("hybrid", kDLCPU) // line break
TVM_REGISTER_TARGET_KIND("composite", kDLCPU).add_attr_option<Array<Target>>("devices");
-
/********** Registry **********/
TVM_REGISTER_GLOBAL("target.ListTargetKinds").set_body_typed(TargetKindRegEntry::ListTargetKinds);
TVM_REGISTER_GLOBAL("target.ListTargetKindOptions")
.set_body_typed(TargetKindRegEntry::ListTargetKindOptions);
+TVM_REGISTER_GLOBAL("target.ListTargetKindOptionsFromName")
+ .set_body_typed([](String target_kind_name) {
+ TargetKind kind = TargetKind::Get(target_kind_name).value();
+ return TargetKindRegEntry::ListTargetKindOptions(kind);
+ });
} // namespace tvm