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

323 lines
12 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 contextlib
from textwrap import dedent
import pytest
from polygraphy import config, mod
from polygraphy.backend.trt import Profile, create_network
from polygraphy.backend.trt import util as trt_util
# Import CreateConfigRTX conditionally for TensorRT-RTX builds
if config.USE_TENSORRT_RTX:
import tensorrt_rtx as trt
from polygraphy.backend.tensorrt_rtx import CreateConfigRTX as CreateConfig
else:
import tensorrt as trt
from polygraphy.backend.trt import CreateConfig
@pytest.fixture(scope="session")
def dummy_network():
builder, network = create_network()
network.add_input("X", dtype=trt.float32, shape=[-1])
with builder, network:
yield builder, network
@pytest.fixture(scope="session")
def layer_class_mapping():
return trt_util.get_layer_class_mapping()
@pytest.mark.parametrize("layer_type", trt.LayerType.__members__.values())
def test_all_layer_types_mapped(layer_class_mapping, layer_type):
waived_layers = [trt.LayerType.PLUGIN]
with contextlib.suppress(AttributeError):
waived_layers.append(trt.LayerType.PLUGIN_V3)
if layer_type in waived_layers:
pytest.skip("PLUGIN has no corresponding ILayer")
assert layer_type in layer_class_mapping
# Can't use pytest.skip because we can't construct the test unless trt.MemoryPoolType exists.
def adjust_memory_pool_limits_after_8_6(limits):
# Adjust tactic DRAM so we can match the output text reliably in update_expected_output.
if mod.version(trt.__version__) >= mod.version("8.6") or config.USE_TENSORRT_RTX:
limits[trt.MemoryPoolType.TACTIC_DRAM] = 1 << 30
return limits
def update_expected_output(expected):
is_trt_10_plus = (
mod.version(trt.__version__) >= mod.version("10.0") or
config.USE_TENSORRT_RTX
)
is_trt_8_6_plus = (
mod.version(trt.__version__) >= mod.version("8.6") or
config.USE_TENSORRT_RTX
)
is_trt_8_7_plus = (
mod.version(trt.__version__) >= mod.version("8.7") or
config.USE_TENSORRT_RTX
)
if is_trt_8_6_plus:
if is_trt_10_plus:
expected = expected.replace(
"MiB]",
"MiB, TACTIC_DRAM: 1024.00 MiB, TACTIC_SHARED_MEMORY: 1024.00 MiB]",
)
else:
expected = expected.replace("MiB]", "MiB, TACTIC_DRAM: 1024.00 MiB]")
if "Preview Features" not in expected:
if not is_trt_10_plus:
expected = (
dedent(expected).strip()
+ "\nPreview Features | [FASTER_DYNAMIC_SHAPES_0805, DISABLE_EXTERNAL_TACTIC_SOURCES_FOR_CORE_0805]"
)
else:
preview_features = "[PROFILE_SHARING_0806"
if config.USE_TENSORRT_RTX:
preview_features += ", RUNTIME_ACTIVATION_RESIZE_10_10"
preview_features += "]"
expected = (
dedent(expected).strip()
+ f"\nPreview Features | {preview_features}"
)
if is_trt_8_7_plus:
# CUBLAS_LT is not longer enabled by default
expected = expected.replace("CUBLAS_LT, ", "")
if is_trt_10_plus:
expected = expected.replace(
"EngineCapability.DEFAULT", "EngineCapability.STANDARD"
)
expected = expected.replace("CUBLAS, ", "")
expected = expected.replace("CUDNN, ", "")
return expected
@pytest.mark.parametrize(
"create_config, expected",
# NOTE: We set workspace sizes here so we can have predictable output
[
(
CreateConfig(
memory_pool_limits=adjust_memory_pool_limits_after_8_6(
{trt.MemoryPoolType.WORKSPACE: 16 << 20}
)
),
update_expected_output(
"""
Flags | [{}]
Engine Capability | EngineCapability.DEFAULT
Memory Pools | [WORKSPACE: 16.00 MiB]
Tactic Sources | [CUBLAS, CUBLAS_LT, CUDNN, EDGE_MASK_CONVOLUTIONS, JIT_CONVOLUTIONS]
Profiling Verbosity | ProfilingVerbosity.DETAILED
""".format("TF32" if config.USE_TENSORRT_RTX else "")
),
),
(
CreateConfig(
memory_pool_limits=adjust_memory_pool_limits_after_8_6(
{trt.MemoryPoolType.WORKSPACE: 16 << 20}
),
tactic_sources=[],
),
update_expected_output(
"""
Flags | [{}]
Engine Capability | EngineCapability.DEFAULT
Memory Pools | [WORKSPACE: 16.00 MiB]
Tactic Sources | []
Profiling Verbosity | ProfilingVerbosity.DETAILED
""".format("TF32" if config.USE_TENSORRT_RTX else "")
),
),
(
CreateConfig(
memory_pool_limits=adjust_memory_pool_limits_after_8_6(
{trt.MemoryPoolType.WORKSPACE: 4 << 20}
)
),
update_expected_output(
"""
Flags | [{}]
Engine Capability | EngineCapability.DEFAULT
Memory Pools | [WORKSPACE: 4.00 MiB]
Tactic Sources | [CUBLAS, CUBLAS_LT, CUDNN, EDGE_MASK_CONVOLUTIONS, JIT_CONVOLUTIONS]
Profiling Verbosity | ProfilingVerbosity.DETAILED
""".format("TF32" if config.USE_TENSORRT_RTX else "")
),
),
(
CreateConfig(
memory_pool_limits=adjust_memory_pool_limits_after_8_6(
{trt.MemoryPoolType.WORKSPACE: 16 << 20}
),
**({} if config.USE_TENSORRT_RTX else {
"fp16": True,
"int8": True,
"tf32": True,
}),
refittable=True,
precision_constraints="obey",
),
update_expected_output(
"""
Flags | [{}REFIT, TF32, OBEY_PRECISION_CONSTRAINTS]
Engine Capability | EngineCapability.DEFAULT
Memory Pools | [WORKSPACE: 16.00 MiB]
Tactic Sources | [CUBLAS, CUBLAS_LT, CUDNN, EDGE_MASK_CONVOLUTIONS, JIT_CONVOLUTIONS]
Profiling Verbosity | ProfilingVerbosity.DETAILED
""".format(
"" if config.USE_TENSORRT_RTX else "FP16, INT8, ",
)
),
),
(
CreateConfig(
memory_pool_limits=adjust_memory_pool_limits_after_8_6(
{trt.MemoryPoolType.WORKSPACE: 16 << 20}
),
profiles=[
Profile().add("X", [1], [1], [1]),
Profile().add("X", [2], [2], [2]),
],
),
update_expected_output(
"""
Flags | [{}]
Engine Capability | EngineCapability.DEFAULT
Memory Pools | [WORKSPACE: 16.00 MiB]
Tactic Sources | [CUBLAS, CUBLAS_LT, CUDNN, EDGE_MASK_CONVOLUTIONS, JIT_CONVOLUTIONS]
Profiling Verbosity | ProfilingVerbosity.DETAILED
Optimization Profiles | 2 profile(s)
""".format("TF32" if config.USE_TENSORRT_RTX else "")
),
),
] + ([] if config.USE_TENSORRT_RTX else [
(
CreateConfig(
memory_pool_limits=adjust_memory_pool_limits_after_8_6(
{trt.MemoryPoolType.WORKSPACE: 16 << 20}
),
use_dla=True,
),
update_expected_output(
"""
Flags | []
Engine Capability | EngineCapability.DEFAULT
Memory Pools | [WORKSPACE: 16.00 MiB, DLA_MANAGED_SRAM: 0.00 MiB, DLA_LOCAL_DRAM: 1024.00 MiB, DLA_GLOBAL_DRAM: 512.00 MiB]
Tactic Sources | [CUBLAS, CUBLAS_LT, CUDNN, EDGE_MASK_CONVOLUTIONS, JIT_CONVOLUTIONS]
DLA | Default Device Type: DeviceType.DLA, Core: -1
Profiling Verbosity | ProfilingVerbosity.DETAILED
"""
),
),
]) + [
(
(
CreateConfig(
memory_pool_limits=adjust_memory_pool_limits_after_8_6(
{trt.MemoryPoolType.WORKSPACE: 16 << 20}
),
preview_features=[trt.PreviewFeature.PROFILE_SHARING_0806],
),
update_expected_output(
"""
Flags | [{}]
Engine Capability | EngineCapability.DEFAULT
Memory Pools | [WORKSPACE: 16.00 MiB]
Tactic Sources | [CUBLAS, CUBLAS_LT, CUDNN, EDGE_MASK_CONVOLUTIONS, JIT_CONVOLUTIONS]
Profiling Verbosity | ProfilingVerbosity.DETAILED
Preview Features | [PROFILE_SHARING_0806]
""".format("TF32" if config.USE_TENSORRT_RTX else "")
),
)
if mod.version(trt.__version__) >= mod.version("10.0") or config.USE_TENSORRT_RTX
else (
CreateConfig(
memory_pool_limits=adjust_memory_pool_limits_after_8_6(
{trt.MemoryPoolType.WORKSPACE: 16 << 20}
),
preview_features=(
[trt.PreviewFeature.ALIASED_PLUGIN_IO_10_03]
if config.USE_TENSORRT_RTX
else [trt.PreviewFeature.FASTER_DYNAMIC_SHAPES_0805]
),
),
update_expected_output(
"""
Flags | [{}]
Engine Capability | EngineCapability.DEFAULT
Memory Pools | [WORKSPACE: 16.00 MiB]
Tactic Sources | [CUBLAS, CUBLAS_LT, CUDNN, EDGE_MASK_CONVOLUTIONS, JIT_CONVOLUTIONS]
Profiling Verbosity | ProfilingVerbosity.DETAILED
Preview Features | [{}]
""".format(
"TF32" if config.USE_TENSORRT_RTX else "",
"ALIASED_PLUGIN_IO_10_03" if config.USE_TENSORRT_RTX else "FASTER_DYNAMIC_SHAPES_0805"
)
),
)
),
],
ids=[
"default",
"tactic-sources",
"memory-pool-limits",
"builder-flags" + ("-rtx" if config.USE_TENSORRT_RTX else ""),
"profiles",
] + ([] if config.USE_TENSORRT_RTX else ["dla"]) + [
"preview-features",
],
)
def test_str_from_config(create_config, expected, dummy_network):
config = create_config(*dummy_network)
actual = trt_util.str_from_config(config, dummy_network)
expected = dedent(expected).strip()
assert actual == expected
def test_get_all_tensors_layer_with_null_inputs():
builder, network = create_network()
with builder, network:
inp = network.add_input("input", shape=(1, 3, 224, 224), dtype=trt.float32)
slice_layer = network.add_slice(
inp, (0, 0, 0, 0), (1, 3, 224, 224), (1, 1, 1, 1)
)
# Set a tensor for `stride` to increment `num_inputs` so we have some inputs
# which are `None` in between.
slice_layer.set_input(3, inp)
assert slice_layer.num_inputs == 4
slice = slice_layer.get_output(0)
slice.name = "Slice"
network.mark_output(slice)
assert trt_util.get_all_tensors(network) == {"input": inp, "Slice": slice}