leandron commented on a change in pull request #7304: URL: https://github.com/apache/tvm/pull/7304#discussion_r576770049
########## File path: python/tvm/driver/tvmc/byoc.py ########## @@ -0,0 +1,191 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +""" +Provides support to Bring Your Own Codegen (BYOC) on TVMC. +""" +import logging + +from abc import ABC +from abc import abstractmethod + +import tvm + +from tvm import relay + +from tvm.relay.op.contrib import get_pattern_table + +from .common import TVMCException + + +# pylint: disable=invalid-name +logger = logging.getLogger("TVMC") + +# Global dictionary to map existing custom codegens +# with the names used to use them +REGISTERED_CODEGEN = {} + + +def register_codegen(kind): + """ + Utility function to register a BYOC class for TVMC. + + Classes decorated with `tvm.driver.tvmc.target.register_codegen` will + be added to the codegens dictionary. + + Example + ------- + + @register_codegen(kind="samplebyoc") + class MyCustomTarget(TVMCCodegen): + ... + """ + + def codegen_decorator(cls): + cls.kind = kind + + assert kind not in REGISTERED_CODEGEN, "there is already a codegen '%s': %s" % ( + kind, + REGISTERED_CODEGEN[kind], + ) + assert issubclass(cls, TVMCCodegen), "%s is expected to be a subclass of TVMCCodegen" % cls + + REGISTERED_CODEGEN[kind] = cls + return cls + + return codegen_decorator + + +def get_codegen_kinds(): + """Return a list of all registered codegens. + + Returns + -------- + list of str + all registered codegens + """ + return REGISTERED_CODEGEN.keys() + + +def get_codegen_by_kind(kind): + """Return a custom codegen by kind. + + Returns + -------- + TVMCCodegen + The requested codegen or None in case it is + not valid + """ + try: + return REGISTERED_CODEGEN[kind] + except KeyError: + raise TVMCException("Target %s is not defined." % kind) + + +class TVMCCodegen(ABC): + """Abstract class for command line driver BYOC definition. + + Provide a unified way to create a codegen adapter with a set of + callback functions to be used within TVMC. + + """ + + @staticmethod + @abstractmethod + def get_config_key_name(): + """Return the name of the dictionary key to be used + at compile time (i.e. relay.build) as part of the + "config" argument. + + Returns + ------- + str + Name of the Codegen config dictionary key + to match with the expected name in the relay + implementation of this Codegen. + """ + + @staticmethod + @abstractmethod + def run_custom_passes(mod, params): + """Apply a set of transformations to the module + before compilation happens. + + Parameters + ---------- + mod : tvm.relay.Module + The relay module to convert. + params : dict + The parameters (weights) for the TVM module. + + Returns + ------- + mod: tvm.relay.Module + The converted module. + """ + + +@register_codegen(kind="ethos-n77") +class TVMCEthosNCodegen(TVMCCodegen): Review comment: So in the specific case, we can see that Compute Library and Arm Ethos-N use the same, similar to passes signature, taking only mod and params, whereas TensorRT takes some other optional arguments. If can just call it the way we do for the others, all the others will be used as defaults. If we can do that, I'm happy to add it to the patch. Compute Library: https://github.com/apache/tvm/blob/fc48514f1d8ccffcebd12007cb6c602506975703/python/tvm/relay/op/contrib/arm_compute_lib.py#L46 Arm Ethos-N: https://github.com/apache/tvm/blob/e1ce6234971a5bae0f81d7dc0e947ae9d2e8436b/python/tvm/relay/op/contrib/ethosn.py#L49 TensorRT: https://github.com/apache/tvm/blob/fc48514f1d8ccffcebd12007cb6c602506975703/python/tvm/relay/op/contrib/tensorrt.py#L81-L88 I think that will be a challenge for the partition as whole, if we don't standardise the way to have the `partition_to_*` functions. What do you think? ---------------------------------------------------------------- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. For queries about this service, please contact Infrastructure at: [email protected]
