blob: b1146743eeb8880e516742cbfec2bfa8e8ed490a [file]
# 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.
import pytest
import tvm
import tvm.testing
from tvm import relay
from tvm.target.target import Target
from tvm.relay import testing
from tvm.relay.backend import Runtime, Executor, graph_executor_codegen
@pytest.mark.parametrize(
"test_target,unsupported_config",
[
["c", "-runtime=c"],
["c", "-system-lib=1"],
["c", "-executor=aot"],
["c", "-interface-api=c"],
["c", "-unpacked-api=1"],
["c", "-link-params=1"],
],
)
def test_deprecated_target_parameters(test_target, unsupported_config):
with pytest.raises(ValueError) as e_info:
Target(f"{test_target} {unsupported_config}")
assert f"Cannot recognize '{unsupported_config}" in str(e_info.execption)
def test_build_relay_graph_():
"""Test to build a simple relay graph by using APIs directly"""
def build_graph(mod, target):
target, target_host = tvm.target.Target.canon_target_and_host(target)
mod, _ = relay.optimize(mod, target)
grc = graph_executor_codegen.GraphExecutorCodegen(None, target)
_, lowered_funcs, _ = grc.codegen(mod, mod["main"])
_ = relay.backend._backend.build(lowered_funcs, target)
def add(shape, dtype):
lhs = relay.var("A", shape=shape, dtype=dtype)
rhs = relay.var("B", shape=shape, dtype=dtype)
out = relay.add(lhs, rhs)
expr = relay.Function((lhs, rhs), out)
mod = tvm.IRModule.from_expr(expr)
return mod
build_graph(add((1, 8), "float32"), tvm.target.Target("llvm"))
@tvm.testing.requires_llvm
def test_schedule_record():
"""Test to build a nn model and get schedule_record from build_module"""
def check_schedule(executor):
for func_name, func_meta in executor.function_metadata.items():
# check converted op only
if "main" not in func_name:
primfunc = list(func_meta.relay_primfuncs.values())[0]
# make sure schedule is well-stored in function metadata
assert "schedule" in primfunc.attrs
sch = primfunc.attrs["schedule"]
assert len(sch.schedule_record) == len(sch.primitive_record)
relay_mod, params = testing.mobilenet.get_workload(batch_size=1, dtype="float32")
target_llvm = tvm.target.Target("llvm")
config = {"te.keep_schedule_record": True}
with tvm.transform.PassContext(opt_level=3, config=config):
aot_executor_factory = relay.build(
relay_mod,
target_llvm,
runtime=Runtime("cpp"),
executor=Executor("aot"),
params=params,
)
graph_executor_factory = relay.build(
relay_mod,
target_llvm,
params=params,
)
check_schedule(aot_executor_factory)
check_schedule(graph_executor_factory)
if __name__ == "__main__":
tvm.testing.main()