Thank you @Mousius for the RFC! It's great to read about potential user 
experience issues of the current Target system, and happy to discuss about 
potential ways to improve it.

## Proposeds API in the RFC

`CompilationConfig`, as proposed in this RFC, aims to improve UX by wrapping a 
list of targets, runtime and execution information in an extra layer of 
abstraction.

The core API is demonstrated in the RFC as:

```python
config = CompilationConfig(
    target_host=target,
    targets=[target],
    executor=Executor("aot", {"interface-api": "c", "unpacked-api": True}),
    runtime=Runtime("crt", {"system-lib": True})
)
```

To improve the developer experience, a few other APIs are proposed along with 
the data structure:

```C++
CompilationConfigNode::GetExecutor();
CompilationConfigNode::ShouldLinkParams();
```

The compilation workflow changes from building with `Target` to building with 
`CompilationConfig`, as demonstrated below:

```C++
// The current API
void Build(IRModule mod, const Target& target, ...);
// The proposed API
void Build(IRModule mod, const CompilationConfig& config, ...);
```

## Existing Work

As proposed in the [target 
specification](https://discuss.tvm.apache.org/t/rfc-tvm-target-specification/6844)
 and [composite 
target](https://discuss.tvm.apache.org/t/rfc-composite-target/7744) RFCs, the 
existing effort converges to the following items.

First, `host` is folded into the Target object, and the `target_host` parameter 
in existing build APIs, in fact, are left for backward compatibility. The 
`CheckAndUpdateHostConsistency` API developed by @zxybazh, is only used for 
backward compatibility reasons. Right now, the canonical way to specify targets 
with customized host is as easy as:

```python
target = tvm.target.Target("cuda", host="llvm")
```

Second, in terms of multi-target and heterogeneous support, composite target is 
adopted as the current approach. Comparing composite target, which is target 
host plus a list of targets, with the proposed `CompilationConfig`, which is 
also target host plus a list of target, it seems very much following the same 
idea, while `CompilationConfig` is an extra layer of abstraction.

Third, canonical form of a Target is a JSON object, not a pain string. The 
target implementation already supports hierarchical parsing, e.g. target inside 
target inside array, etc. To support executor and runtime with attributes, we 
could extend the parser to support converting a JSON sub-object to an 
Executor/Runtime object, which is very much doable.

## Discussion on the RFC

Overall, the RFC brings a dramatic change to the compilation infrastructure. 
This effort enforces a new assumption that we only have a single executor and a 
single runtime. However, I could see clean alternatives with more 
expressiveness, less effort required, no breaking change, but achieve the same 
goal.

First, under our unified IR efforts, the compilation in TVM is heading towards 
`IRModule` to `runtime::Module` abstraction. The executor, to the best of my 
understanding, is a runtime object that executes some artifacts that some 
BaseFuncs lowers to. For example, VM executor interprets VM bytecode, AOT 
executor may run the binary directly. Right now, there are some leaky 
abstraction, but our goal should be aligned under the direction that we address 
those leaks instead of bringing in more.

Second, the proposed APIs seem to be possible to be implemented with 
straightforward helper functions under the current abstraction. To give a 
line-by-line example:

```C++
ir_mod->GetConfig() -> CompilationConfig; // proposed in the RFC
GetTarget(id_mod) -> Target; // alternative

ir_mod->GetExecutor() -> Executor; // proposed in the RFC
GetExecutor(id_mod) -> Executor; // alternative

ir_mod->GetConfig()->ShouldLinkParams() -> bool; // proposed in the RFC
ShouldLinkParams(id_mod) -> bool; // alternative
```

In short, using accessor pattern here doesn't bring in actual benefits, and can 
be replaced by simple helper functions.

Third, the RFC text doesn't mention how it could improve the UX in TVMC command 
line. However, I would argue that the UX could be improved simply with target 
tags. For example, on CUDA GPUs, our target tag system supports creating CUDA 
targets with a single short string:

```python
target = tvm.target.Target("nvidia/geforce-rtx-3070")
```

This carries all the information needed for a device, as long as we register 
them into our system, including compute version, shared memory size, local 
memory size, etc. This could perfectly solve the UX issue in TVMC by simply 
allowing target tags as arguments:

```python
tvmc --target "nvidia/geforce-rtx-3070"
```

Last, there are cases where multiple executors working together. For example, 
if we want to offload some fragments to TensorRT executor, some to CUDA graph, 
while keep the rest in the VM, then the Relay function could potentially be 
partitioned into 3 Relay functions that targets to different executors. With 
composite target, we are able to attach different executors in the Target 
object in a more explicit way.

## Conclusion

When designing the Target spec, it is intended to be considered as the synonym 
to `CompilationConfig`. I may not have all the context here and my 
understanding could be limited, but as heavily involved in the Target design, 
from my PoV, for now the benefit of the RFC seems to be limited to certain 
issues Target is already able to do. Happy to chat more!





---
[Visit 
Topic](https://discuss.tvm.apache.org/t/pre-rfc-compilation-configuration-representation/11372/10)
 to respond.

You are receiving this because you enabled mailing list mode.

To unsubscribe from these emails, [click 
here](https://discuss.tvm.apache.org/email/unsubscribe/d6662642434755de173b1551b0b1258f45d47352003055952c22fa043ee52323).

Reply via email to