You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tvm.apache.org by le...@apache.org on 2021/12/07 09:53:53 UTC
[tvm] branch main updated: [Target][TVMC][UX] Avoid creation of dummy Target objects in TVMC (#9662)
This is an automated email from the ASF dual-hosted git repository.
leandron pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tvm.git
The following commit(s) were added to refs/heads/main by this push:
new 00b0bee [Target][TVMC][UX] Avoid creation of dummy Target objects in TVMC (#9662)
00b0bee is described below
commit 00b0bee77289320db86ece4fb1caae3d9bf3658e
Author: Junru Shao <ju...@gmail.com>
AuthorDate: Tue Dec 7 01:53:31 2021 -0800
[Target][TVMC][UX] Avoid creation of dummy Target objects in TVMC (#9662)
* [Target][TVMC][UX] Avoid creation of dummy Target objects in TVMC
* nit fix
---
python/tvm/driver/tvmc/target.py | 26 ++++++++++++--------------
python/tvm/target/__init__.py | 2 +-
python/tvm/target/target.py | 5 +++++
src/target/target_kind.cc | 6 +++++-
4 files changed, 23 insertions(+), 16 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/__init__.py b/python/tvm/target/__init__.py
index 5dc95c3..1b90a50 100644
--- a/python/tvm/target/__init__.py
+++ b/python/tvm/target/__init__.py
@@ -58,7 +58,7 @@ The list of options include:
We can use :py:func:`tvm.target.Target` to create a tvm.target.Target from the target string.
We can also use other specific function in this module to create specific targets.
"""
-from .target import Target, create
+from .target import Target, create, TargetKind
from .target import (
cuda,
rocm,
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