Hi @yuchenj, thank you for your kind reply! I want to confirm some follow-up
questions and report some issues.
It seems in your mentioned line (`Optimize` function, `build_module.cc:303`), a
set of (default I think) passes are given. Is that the case: in `BuildRelay` we
will collect some **default passes** (those in `Optimize`) into a `Sequence`,
and apply them if pass-level `opt_level` >= context-level `opt_level` (filtered
in `SequentialNode::operator()`).
I asked about these questions b.c. I think some tutorial did not show good
practice about APIs.
When using `relay.build_module.create_executor` API, it seems the compilation
(`BuildRelay`) might is done in `evaluate()`. (`evaluate()` calls
`interpreter.Executor._make_executor`, `GraphExecutor._make_executor` calls
`build`, and `Interpreter._make_executor` call some extra optimization passes.)
This means we should call `evaluate()` inside `PassContext` otherwise some
**default passes** will be filtered. And I have confirmed this with TVM's debug
logging.
```python
import tvm
import tvm.relay as relay
from tvm.relay import testing
def example():
data = relay.var("data", relay.TensorType((1, 3, 512, 512), "float32"))
weight = relay.var("weight")
bn_gamma = relay.var("bn_gamma")
bn_beta = relay.var("bn_beta")
bn_mmean = relay.var("bn_mean")
bn_mvar = relay.var("bn_var")
simple_net = relay.nn.conv2d(
data=data, weight=weight, kernel_size=(5, 5), channels=32, padding=(1,
1)
)
simple_net = relay.nn.batch_norm(simple_net, bn_gamma, bn_beta, bn_mmean,
bn_mvar)[0]
simple_net = relay.nn.relu(simple_net)
simple_net = relay.Function(relay.analysis.free_vars(simple_net),
simple_net)
return testing.create_workload(simple_net)
if __name__ == '__main__':
mod, params = example()
target = tvm.target.Target('llvm')
dev = tvm.cpu()
with tvm.transform.PassContext(opt_level=4):
executor = relay.build_module.create_executor("graph", mod, dev, target)
# Here `evaluate()` is called outside `PassContext` like the following
tutorial did:
#
https://tvm.apache.org/docs/tutorials/frontend/from_onnx.html#compile-the-model-with-relay
tvm_out = executor.evaluate()(
tvm.nd.empty(shape=(1, 3, 512, 512),
device=dev,
dtype='float32'), **params)
```
Doing so, the `opt_level=4` passes will not be applied. And if we do:
```python
with tvm.transform.PassContext(opt_level=4):
- executor = relay.build_module.create_executor("graph", mod, dev,
target)
+ executor = relay.build_module.create_executor("graph", mod, dev,
target).evaluate()
- tvm_out = executor.evaluate()(
+ tvm_out = executor(
```
We finally see some logging like "... tvm/src/relay/ir/transform.cc:133:
Executing function pass : CombineParallelConv2d with opt level: 4".
Such tutorials are:
-
https://tvm.apache.org/docs/tutorials/frontend/from_keras.html#sphx-glr-tutorials-frontend-from-keras-py
-
https://tvm.apache.org/docs/tutorials/frontend/from_onnx.html#compile-the-model-with-relay
I hope my report might help enhance the tutorial.
---
[Visit
Topic](https://discuss.tvm.apache.org/t/questions-about-tvm-executors-and-its-apis/10289/3)
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/eeba668fa57c775999e8e7f5e0739db07b33ebf7f7b6c60e1a4189839b034ffb).