Files
wehub-resource-sync c8a779b1bb
Docker Image CI / build-ubuntu2004 (push) Waiting to run
chore: import upstream snapshot with attribution
2026-07-13 13:36:55 +08:00

126 lines
4.2 KiB
Python

#
# SPDX-FileCopyrightText: Copyright (c) 1993-2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
#
# Licensed 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 os
import subprocess as sp
import numpy as np
import onnx
import onnx_graphsurgeon as gs
import onnxruntime
import pytest
from onnx_graphsurgeon.logger import G_LOGGER
from onnx_graphsurgeon.util import misc
ROOT_DIR = os.path.realpath(os.path.join(os.path.dirname(__file__), os.path.pardir))
EXAMPLES_ROOT = os.path.join(ROOT_DIR, "examples")
class Artifact(object):
def __init__(self, name, infer=True):
self.name = name
self.infer = infer
EXAMPLES = [
("01_creating_a_model", [Artifact("test_globallppool.onnx")]),
("02_creating_a_model_with_initializer", [Artifact("test_conv.onnx")]),
("03_isolating_a_subgraph", [Artifact("model.onnx"), Artifact("subgraph.onnx")]),
("04_modifying_a_model", [Artifact("model.onnx"), Artifact("modified.onnx")]),
("05_folding_constants", [Artifact("model.onnx"), Artifact("folded.onnx")]),
(
"06_removing_nodes",
[Artifact("model.onnx", infer=False), Artifact("removed.onnx")],
),
("07_creating_a_model_with_the_layer_api", [Artifact("model.onnx")]),
("08_replacing_a_subgraph", [Artifact("model.onnx"), Artifact("replaced.onnx")]),
("09_shape_operations_with_the_layer_api", [Artifact("model.onnx")]),
("10_dynamic_batch_size", [Artifact("model.onnx"), Artifact("dynamic.onnx")]),
("11_creating_a_local_function", [Artifact("model.onnx")]),
# Skipping inference test as bf16 is not supported in ORT yet.
(
"12_using_numpy_unsupported_dtypes",
[Artifact("test_conv_bf16.onnx", infer=False)],
),
]
# Extract any ``` blocks from the README
def load_commands_from_readme(readme):
def ignore_command(cmd):
return "pip" in cmd
commands = []
with open(readme, "r") as f:
in_command_block = False
for line in f.readlines():
if not in_command_block and "```bash" in line:
in_command_block = True
elif in_command_block:
if "```" in line:
in_command_block = False
elif not ignore_command(line):
commands.append(line.strip())
return commands
def infer_model(path):
model = onnx.load(path)
onnx.checker.check_model(model)
graph = gs.import_onnx(model)
feed_dict = {}
for tensor in graph.inputs:
shape = tuple(
dim if not misc.is_dynamic_dimension(dim) else 1 for dim in tensor.shape
)
feed_dict[tensor.name] = np.random.random_sample(size=shape).astype(
tensor.dtype
)
output_names = [out.name for out in graph.outputs]
sess = onnxruntime.InferenceSession(
model.SerializeToString(), providers=["CPUExecutionProvider"]
)
outputs = sess.run(output_names, feed_dict)
G_LOGGER.info("Inference outputs: {:}".format(outputs))
return outputs
@pytest.mark.parametrize("example_dir,artifacts", EXAMPLES)
def test_examples(example_dir, artifacts):
example_dir = os.path.join(EXAMPLES_ROOT, example_dir)
readme = os.path.join(example_dir, "README.md")
commands = load_commands_from_readme(readme)
for command in commands:
G_LOGGER.info(command)
assert (
sp.run(
["bash", "-c", command], cwd=example_dir, env={"PYTHONPATH": ROOT_DIR}
).returncode
== 0
)
for artifact in artifacts:
artifact_path = os.path.join(example_dir, artifact.name)
assert os.path.exists(artifact_path)
if artifact.infer:
assert infer_model(artifact_path)
os.remove(artifact_path)