From 70af6e4138cf4ecde6fbb39c4ab2a85df0ad1aff Mon Sep 17 00:00:00 2001 From: chaofengw-nv Date: Sat, 29 Aug 2026 13:50:52 +0000 Subject: [PATCH 1/6] fix(profiles): add missing family dependency closures Declare build and reference overlays in each owning MODEL.toml and keep package checks beside the family implementation. Respect the existing prebuild policy so large optional references remain lazy. Derive shared test expectations from the canonical registry instead of duplicating the family inventory. Signed-off-by: chaofengw-nv --- .../families/canary/MODEL.toml | 6 + .../canary_reference.lock.txt | 109 ++++++++++++++++++ .../families/canary/python_profile_verify.py | 43 +++++++ .../families/deepseek_v2/MODEL.toml | 7 ++ .../deepseek_v2.lock.txt | 6 + .../deepseek_v2/python_profile_verify.py | 30 +++++ .../families/minimax_h3/MODEL.toml | 6 + .../python_profile_reference_verify.py | 12 ++ .../minimax_h3_reference.lock.txt | 4 + .../nemotron_labs_diffusion/MODEL.toml | 6 + .../python_profile_reference_verify.py | 24 ++++ .../reference.lock.txt | 9 ++ .../nemotron_speech_streaming/MODEL.toml | 6 + ...motron_speech_streaming_reference.lock.txt | 109 ++++++++++++++++++ .../python_profile_verify.py | 43 +++++++ .../families/olmo/MODEL.toml | 7 ++ .../olmo_tokenizer.lock.txt | 6 + .../families/olmo/python_profile_verify.py | 20 ++++ .../families/qwen_image/MODEL.toml | 6 + .../qwen_image_reference.lock.txt | 4 + .../qwen_image/python_profile_verify.py | 19 +++ .../families/timm_vit/MODEL.toml | 6 + .../timm_reference.lock.txt | 1 + .../timm_vit/python_profile_verify.py | 11 ++ .../families/wan2_2_ti2v/MODEL.toml | 6 + .../wan2_2_ti2v_reference.lock.txt | 3 + .../wan2_2_ti2v/python_profile_verify.py | 16 +++ .../families/xglm/MODEL.toml | 7 ++ .../xglm_tokenizer.lock.txt | 7 ++ .../families/xglm/python_profile_verify.py | 16 +++ tests/tools/test_e2e_python_profiles.py | 19 +-- tests/tools/test_ensure_ci_docker_image.py | 7 +- 32 files changed, 561 insertions(+), 20 deletions(-) create mode 100644 python/tensorrt_model_connect/families/canary/python_profile_requirements/canary_reference.lock.txt create mode 100644 python/tensorrt_model_connect/families/canary/python_profile_verify.py create mode 100644 python/tensorrt_model_connect/families/deepseek_v2/python_profile_requirements/deepseek_v2.lock.txt create mode 100644 python/tensorrt_model_connect/families/deepseek_v2/python_profile_verify.py create mode 100644 python/tensorrt_model_connect/families/minimax_h3/python_profile_reference_verify.py create mode 100644 python/tensorrt_model_connect/families/minimax_h3/python_profile_requirements/minimax_h3_reference.lock.txt create mode 100644 python/tensorrt_model_connect/families/nemotron_labs_diffusion/python_profile_reference_verify.py create mode 100644 python/tensorrt_model_connect/families/nemotron_labs_diffusion/python_profile_requirements/reference.lock.txt create mode 100644 python/tensorrt_model_connect/families/nemotron_speech_streaming/python_profile_requirements/nemotron_speech_streaming_reference.lock.txt create mode 100644 python/tensorrt_model_connect/families/nemotron_speech_streaming/python_profile_verify.py create mode 100644 python/tensorrt_model_connect/families/olmo/python_profile_requirements/olmo_tokenizer.lock.txt create mode 100644 python/tensorrt_model_connect/families/olmo/python_profile_verify.py create mode 100644 python/tensorrt_model_connect/families/qwen_image/python_profile_requirements/qwen_image_reference.lock.txt create mode 100644 python/tensorrt_model_connect/families/qwen_image/python_profile_verify.py create mode 100644 python/tensorrt_model_connect/families/timm_vit/python_profile_requirements/timm_reference.lock.txt create mode 100644 python/tensorrt_model_connect/families/timm_vit/python_profile_verify.py create mode 100644 python/tensorrt_model_connect/families/wan2_2_ti2v/python_profile_requirements/wan2_2_ti2v_reference.lock.txt create mode 100644 python/tensorrt_model_connect/families/wan2_2_ti2v/python_profile_verify.py create mode 100644 python/tensorrt_model_connect/families/xglm/python_profile_requirements/xglm_tokenizer.lock.txt create mode 100644 python/tensorrt_model_connect/families/xglm/python_profile_verify.py diff --git a/python/tensorrt_model_connect/families/canary/MODEL.toml b/python/tensorrt_model_connect/families/canary/MODEL.toml index 6b5c3265ac..798d181e89 100644 --- a/python/tensorrt_model_connect/families/canary/MODEL.toml +++ b/python/tensorrt_model_connect/families/canary/MODEL.toml @@ -3,6 +3,12 @@ id = "canary" plugin = "canary" +python_profile_specs = [ + "canary_reference|families/canary/python_profile_requirements/canary_reference.lock.txt|families/canary/python_profile_verify.py|true|false", +] +default_execution_profiles = [ + "reference|canary_reference", +] module = "plugin" model_dir_adapter = "nemo_archive.py|resolve_model_dir" nemo_archive_adapter = "nemo_archive.py|resolve_nemo_archive" diff --git a/python/tensorrt_model_connect/families/canary/python_profile_requirements/canary_reference.lock.txt b/python/tensorrt_model_connect/families/canary/python_profile_requirements/canary_reference.lock.txt new file mode 100644 index 0000000000..353f9193d0 --- /dev/null +++ b/python/tensorrt_model_connect/families/canary/python_profile_requirements/canary_reference.lock.txt @@ -0,0 +1,109 @@ +absl-py==2.5.0 +annotated-types==0.7.0 +antlr4-python3-runtime==4.9.3 +asttokens==3.0.2 +audioread==3.1.0 +braceexpand==0.1.7 +cffi==2.1.1 +cloudpickle==3.1.2 +contourpy==1.3.3 +cycler==0.12.1 +cytoolz==1.1.0 +datasets==3.6.0 +decorator==5.3.1 +dill==0.3.8 +docopt==0.6.2 +editdistance==0.8.1 +einops==0.8.2 +executing==2.2.1 +fiddle==0.3.0 +fonttools==4.63.0 +fsspec==2024.12.0 +graphviz==0.21 +grpcio==1.76.0 +huggingface-hub==0.36.2 +hydra-core==1.3.2 +intervaltree==3.2.1 +ipython-pygments-lexers==1.1.1 +ipython==9.16.1 +jedi==0.20.0 +jiwer==3.1.0 +joblib==1.5.3 +kaldi-python-io==1.2.2 +kaldialign==0.9.1 +kiwisolver==1.5.0 +lazy-loader==0.5 +lhotse==1.33.0 +libcst==1.9.0 +librosa==0.11.0 +lightning-utilities==0.15.3 +lightning==2.4.0 +llvmlite==0.43.0 +markdown==3.10.3 +marshmallow==4.3.1 +matplotlib-inline==0.2.2 +matplotlib==3.11.1 +msgpack==1.2.1 +multiprocess==0.70.16 +nemo_toolkit[asr]==2.7.3 +numba==0.60.0 +numexpr==2.10.0 +numpy==1.26.4 +nv-one-logger-core==2.3.1 +nv-one-logger-pytorch-lightning-integration==2.3.1 +nv-one-logger-training-telemetry==2.3.1 +omegaconf==2.3.0 +overrides==7.7.0 +pandas==2.2.3 +parso==0.8.7 +platformdirs==4.11.2 +pooch==1.9.0 +prompt-toolkit==3.0.53 +protobuf==5.29.5 +pure-eval==0.2.3 +pyannote.core==5.0.0 +pyannote.database==5.1.3 +pyannote.metrics==3.2.1 +pyarrow==20.0.0 +pycparser==3.0 +pydantic-core==2.27.2 +pydantic==2.10.6 +pydub==0.25.1 +pyloudnorm==0.2.0 +pyparsing==3.3.2 +python-dateutil==2.9.0.post0 +pytorch-lightning==2.4.0 +pytz==2026.3.post1 +rapidfuzz==3.14.5 +resampy==0.4.3 +ruamel.yaml.clib==0.2.12 +ruamel.yaml==0.18.10 +scikit-learn==1.4.2 +scipy==1.15.3 +sentencepiece==0.2.2 +silero-vad==6.2.1 +six==1.17.0 +sortedcontainers==2.4.0 +soundfile==0.14.0 +sox==1.5.0 +soxr==0.5.0.post1 +stack-data==0.6.3 +strenum==0.4.15 +tensorboard-data-server==0.7.2 +tensorboard==2.20.0 +text-unidecode==1.3 +threadpoolctl==3.6.0 +tokenizers==0.22.2 +toml==0.10.2 +toolz==1.1.0 +torchmetrics==1.9.0 +traitlets==5.16.1 +transformers==4.57.6 +typing-extensions==4.15.0 +tzdata==2026.3 +webdataset==1.0.2 +werkzeug==3.1.8 +wget==3.2 +whisper-normalizer==0.1.15 +wrapt==2.3.0 +xxhash==3.8.1 diff --git a/python/tensorrt_model_connect/families/canary/python_profile_verify.py b/python/tensorrt_model_connect/families/canary/python_profile_verify.py new file mode 100644 index 0000000000..ab93b1f85e --- /dev/null +++ b/python/tensorrt_model_connect/families/canary/python_profile_verify.py @@ -0,0 +1,43 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +from importlib.metadata import version + +import absl +import cffi +import datasets +import librosa +import nemo.collections.asr as nemo_asr +import numpy +import pandas +import pycparser +import pydantic +import sentencepiece +import soundfile +import transformers +from nemo.collections.asr.models import ASRModel + +assert version("absl-py") == "2.5.0" +assert version("cffi") == "2.1.1" +assert version("datasets") == "3.6.0" +assert version("librosa") == "0.11.0" +assert version("nemo_toolkit") == "2.7.3" +assert version("numpy") == "1.26.4" +assert version("pandas") == "2.2.3" +assert version("soundfile") == "0.14.0" +assert version("pycparser") == "3.0" +assert version("pydantic") == "2.10.6" +assert version("sentencepiece") == "0.2.2" +assert transformers.__version__ == "4.57.6" +assert nemo_asr is not None +assert ASRModel is not None +assert numpy.__version__ == "1.26.4" +assert pandas.__version__ == "2.2.3" +assert soundfile.__version__ == "0.14.0" +assert absl is not None +assert cffi is not None +assert datasets is not None +assert librosa is not None +assert pycparser is not None +assert pydantic is not None +assert sentencepiece is not None diff --git a/python/tensorrt_model_connect/families/deepseek_v2/MODEL.toml b/python/tensorrt_model_connect/families/deepseek_v2/MODEL.toml index b3625ff084..1a9557b733 100644 --- a/python/tensorrt_model_connect/families/deepseek_v2/MODEL.toml +++ b/python/tensorrt_model_connect/families/deepseek_v2/MODEL.toml @@ -4,6 +4,13 @@ id = "deepseek_v2" plugin = "deepseek_v2" module = "plugin" +python_profile_specs = [ + "deepseek_v2|families/deepseek_v2/python_profile_requirements/deepseek_v2.lock.txt|families/deepseek_v2/python_profile_verify.py|true", +] +default_execution_profiles = [ + "build|deepseek_v2", + "reference|deepseek_v2", +] capabilities = ["debug_layer_outputs"] aliases = [ "deepseek_v2", diff --git a/python/tensorrt_model_connect/families/deepseek_v2/python_profile_requirements/deepseek_v2.lock.txt b/python/tensorrt_model_connect/families/deepseek_v2/python_profile_requirements/deepseek_v2.lock.txt new file mode 100644 index 0000000000..b70a64b61c --- /dev/null +++ b/python/tensorrt_model_connect/families/deepseek_v2/python_profile_requirements/deepseek_v2.lock.txt @@ -0,0 +1,6 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +transformers==5.2.0 +tokenizers==0.22.2 +huggingface-hub==1.22.0 diff --git a/python/tensorrt_model_connect/families/deepseek_v2/python_profile_verify.py b/python/tensorrt_model_connect/families/deepseek_v2/python_profile_verify.py new file mode 100644 index 0000000000..dd6c968fde --- /dev/null +++ b/python/tensorrt_model_connect/families/deepseek_v2/python_profile_verify.py @@ -0,0 +1,30 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +"""Verify the DeepSeek-V2 tokenizer-compatible Python environment.""" + +from importlib.metadata import version + +import transformers +from transformers import ( + DeepseekV2Config, + DeepseekV2ForCausalLM, + DeepseekV3Config, + DeepseekV3ForCausalLM, +) + + +assert transformers.__version__ == "5.2.0" +assert version("tokenizers") == "0.22.2" +assert version("huggingface-hub") == "1.22.0" +assert DeepseekV2Config.model_type == "deepseek_v2" +assert DeepseekV2ForCausalLM.config_class is DeepseekV2Config +assert DeepseekV3ForCausalLM.config_class is DeepseekV3Config +deepseek_v3_config = DeepseekV3Config(experts_implementation="batched_mm") +assert deepseek_v3_config._experts_implementation == "batched_mm" +print( + f"transformers={transformers.__version__} " + f"tokenizers={version('tokenizers')} " + f"huggingface-hub={version('huggingface-hub')} " + "deepseek_v2=available experts_implementation=batched_mm" +) diff --git a/python/tensorrt_model_connect/families/minimax_h3/MODEL.toml b/python/tensorrt_model_connect/families/minimax_h3/MODEL.toml index cd55650d0d..2ba32b9166 100644 --- a/python/tensorrt_model_connect/families/minimax_h3/MODEL.toml +++ b/python/tensorrt_model_connect/families/minimax_h3/MODEL.toml @@ -4,6 +4,12 @@ id = "minimax_h3" plugin = "minimax_h3" module = "plugin" +python_profile_specs = [ + "minimax_h3_reference|families/minimax_h3/python_profile_requirements/minimax_h3_reference.lock.txt|families/minimax_h3/python_profile_reference_verify.py|true|false", +] +default_execution_profiles = [ + "reference|minimax_h3_reference", +] aliases = [ "minimax-h3", "minimax_h3", diff --git a/python/tensorrt_model_connect/families/minimax_h3/python_profile_reference_verify.py b/python/tensorrt_model_connect/families/minimax_h3/python_profile_reference_verify.py new file mode 100644 index 0000000000..600aff19d1 --- /dev/null +++ b/python/tensorrt_model_connect/families/minimax_h3/python_profile_reference_verify.py @@ -0,0 +1,12 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +"""Verify the pinned MiniMax-H3 reference execution profile.""" + +from importlib.metadata import version + +from huggingface_hub import get_cached_repo_tree + + +assert version("huggingface-hub") == "1.23.0" +assert callable(get_cached_repo_tree) diff --git a/python/tensorrt_model_connect/families/minimax_h3/python_profile_requirements/minimax_h3_reference.lock.txt b/python/tensorrt_model_connect/families/minimax_h3/python_profile_requirements/minimax_h3_reference.lock.txt new file mode 100644 index 0000000000..3ec21bebaa --- /dev/null +++ b/python/tensorrt_model_connect/families/minimax_h3/python_profile_requirements/minimax_h3_reference.lock.txt @@ -0,0 +1,4 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +huggingface-hub==1.23.0 diff --git a/python/tensorrt_model_connect/families/nemotron_labs_diffusion/MODEL.toml b/python/tensorrt_model_connect/families/nemotron_labs_diffusion/MODEL.toml index 62f176755e..fc9b9cee72 100644 --- a/python/tensorrt_model_connect/families/nemotron_labs_diffusion/MODEL.toml +++ b/python/tensorrt_model_connect/families/nemotron_labs_diffusion/MODEL.toml @@ -3,6 +3,12 @@ id = "nemotron_labs_diffusion" plugin = "nemotron_labs_diffusion" +python_profile_specs = [ + "nemotron_labs_diffusion_reference|families/nemotron_labs_diffusion/python_profile_requirements/reference.lock.txt|families/nemotron_labs_diffusion/python_profile_reference_verify.py|true", +] +default_execution_profiles = [ + "reference|nemotron_labs_diffusion_reference", +] module = "plugin" aliases = [ "nemotron_labs_diffusion", diff --git a/python/tensorrt_model_connect/families/nemotron_labs_diffusion/python_profile_reference_verify.py b/python/tensorrt_model_connect/families/nemotron_labs_diffusion/python_profile_reference_verify.py new file mode 100644 index 0000000000..8d9c8a7a85 --- /dev/null +++ b/python/tensorrt_model_connect/families/nemotron_labs_diffusion/python_profile_reference_verify.py @@ -0,0 +1,24 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +"""Verify the Nemotron Labs Diffusion LoRA reference profile.""" + +from importlib.metadata import version + +import accelerate +import peft +import safetensors +import torch +import transformers + + +assert version("accelerate") == "1.14.0" +assert version("huggingface-hub") == "1.22.0" +assert version("peft") == "0.20.0" +assert version("safetensors") == "0.8.0" +assert version("tokenizers") == "0.22.2" +assert transformers.__version__ == "5.2.0" +assert accelerate is not None +assert peft is not None +assert safetensors is not None +assert callable(torch.cuda.is_available) diff --git a/python/tensorrt_model_connect/families/nemotron_labs_diffusion/python_profile_requirements/reference.lock.txt b/python/tensorrt_model_connect/families/nemotron_labs_diffusion/python_profile_requirements/reference.lock.txt new file mode 100644 index 0000000000..6eaa2f72f2 --- /dev/null +++ b/python/tensorrt_model_connect/families/nemotron_labs_diffusion/python_profile_requirements/reference.lock.txt @@ -0,0 +1,9 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +accelerate==1.14.0 +huggingface-hub==1.22.0 +peft==0.20.0 +safetensors==0.8.0 +tokenizers==0.22.2 +transformers==5.2.0 diff --git a/python/tensorrt_model_connect/families/nemotron_speech_streaming/MODEL.toml b/python/tensorrt_model_connect/families/nemotron_speech_streaming/MODEL.toml index 7dfea0a167..a3ffebd134 100644 --- a/python/tensorrt_model_connect/families/nemotron_speech_streaming/MODEL.toml +++ b/python/tensorrt_model_connect/families/nemotron_speech_streaming/MODEL.toml @@ -3,6 +3,12 @@ id = "nemotron_speech_streaming" plugin = "nemotron_speech_streaming" +python_profile_specs = [ + "nemotron_speech_streaming_reference|families/nemotron_speech_streaming/python_profile_requirements/nemotron_speech_streaming_reference.lock.txt|families/nemotron_speech_streaming/python_profile_verify.py|true|true", +] +default_execution_profiles = [ + "reference|nemotron_speech_streaming_reference", +] module = "plugin" model_dir_adapter = "nemo_archive.py|resolve_model_dir" nemo_archive_adapter = "nemo_archive.py|resolve_nemo_archive" diff --git a/python/tensorrt_model_connect/families/nemotron_speech_streaming/python_profile_requirements/nemotron_speech_streaming_reference.lock.txt b/python/tensorrt_model_connect/families/nemotron_speech_streaming/python_profile_requirements/nemotron_speech_streaming_reference.lock.txt new file mode 100644 index 0000000000..353f9193d0 --- /dev/null +++ b/python/tensorrt_model_connect/families/nemotron_speech_streaming/python_profile_requirements/nemotron_speech_streaming_reference.lock.txt @@ -0,0 +1,109 @@ +absl-py==2.5.0 +annotated-types==0.7.0 +antlr4-python3-runtime==4.9.3 +asttokens==3.0.2 +audioread==3.1.0 +braceexpand==0.1.7 +cffi==2.1.1 +cloudpickle==3.1.2 +contourpy==1.3.3 +cycler==0.12.1 +cytoolz==1.1.0 +datasets==3.6.0 +decorator==5.3.1 +dill==0.3.8 +docopt==0.6.2 +editdistance==0.8.1 +einops==0.8.2 +executing==2.2.1 +fiddle==0.3.0 +fonttools==4.63.0 +fsspec==2024.12.0 +graphviz==0.21 +grpcio==1.76.0 +huggingface-hub==0.36.2 +hydra-core==1.3.2 +intervaltree==3.2.1 +ipython-pygments-lexers==1.1.1 +ipython==9.16.1 +jedi==0.20.0 +jiwer==3.1.0 +joblib==1.5.3 +kaldi-python-io==1.2.2 +kaldialign==0.9.1 +kiwisolver==1.5.0 +lazy-loader==0.5 +lhotse==1.33.0 +libcst==1.9.0 +librosa==0.11.0 +lightning-utilities==0.15.3 +lightning==2.4.0 +llvmlite==0.43.0 +markdown==3.10.3 +marshmallow==4.3.1 +matplotlib-inline==0.2.2 +matplotlib==3.11.1 +msgpack==1.2.1 +multiprocess==0.70.16 +nemo_toolkit[asr]==2.7.3 +numba==0.60.0 +numexpr==2.10.0 +numpy==1.26.4 +nv-one-logger-core==2.3.1 +nv-one-logger-pytorch-lightning-integration==2.3.1 +nv-one-logger-training-telemetry==2.3.1 +omegaconf==2.3.0 +overrides==7.7.0 +pandas==2.2.3 +parso==0.8.7 +platformdirs==4.11.2 +pooch==1.9.0 +prompt-toolkit==3.0.53 +protobuf==5.29.5 +pure-eval==0.2.3 +pyannote.core==5.0.0 +pyannote.database==5.1.3 +pyannote.metrics==3.2.1 +pyarrow==20.0.0 +pycparser==3.0 +pydantic-core==2.27.2 +pydantic==2.10.6 +pydub==0.25.1 +pyloudnorm==0.2.0 +pyparsing==3.3.2 +python-dateutil==2.9.0.post0 +pytorch-lightning==2.4.0 +pytz==2026.3.post1 +rapidfuzz==3.14.5 +resampy==0.4.3 +ruamel.yaml.clib==0.2.12 +ruamel.yaml==0.18.10 +scikit-learn==1.4.2 +scipy==1.15.3 +sentencepiece==0.2.2 +silero-vad==6.2.1 +six==1.17.0 +sortedcontainers==2.4.0 +soundfile==0.14.0 +sox==1.5.0 +soxr==0.5.0.post1 +stack-data==0.6.3 +strenum==0.4.15 +tensorboard-data-server==0.7.2 +tensorboard==2.20.0 +text-unidecode==1.3 +threadpoolctl==3.6.0 +tokenizers==0.22.2 +toml==0.10.2 +toolz==1.1.0 +torchmetrics==1.9.0 +traitlets==5.16.1 +transformers==4.57.6 +typing-extensions==4.15.0 +tzdata==2026.3 +webdataset==1.0.2 +werkzeug==3.1.8 +wget==3.2 +whisper-normalizer==0.1.15 +wrapt==2.3.0 +xxhash==3.8.1 diff --git a/python/tensorrt_model_connect/families/nemotron_speech_streaming/python_profile_verify.py b/python/tensorrt_model_connect/families/nemotron_speech_streaming/python_profile_verify.py new file mode 100644 index 0000000000..bedbc715a6 --- /dev/null +++ b/python/tensorrt_model_connect/families/nemotron_speech_streaming/python_profile_verify.py @@ -0,0 +1,43 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +from importlib.metadata import version + +import absl +import cffi +import datasets +import librosa +import nemo.collections.asr as nemo_asr +import numpy +import pandas +import pycparser +import pydantic +import sentencepiece +import soundfile +import transformers +from nemo.collections.asr.models import EncDecHybridRNNTCTCBPEModelWithPrompt + +assert version("absl-py") == "2.5.0" +assert version("cffi") == "2.1.1" +assert version("datasets") == "3.6.0" +assert version("librosa") == "0.11.0" +assert version("nemo_toolkit") == "2.7.3" +assert version("numpy") == "1.26.4" +assert version("pandas") == "2.2.3" +assert version("soundfile") == "0.14.0" +assert version("pycparser") == "3.0" +assert version("pydantic") == "2.10.6" +assert version("sentencepiece") == "0.2.2" +assert transformers.__version__ == "4.57.6" +assert nemo_asr is not None +assert EncDecHybridRNNTCTCBPEModelWithPrompt is not None +assert numpy.__version__ == "1.26.4" +assert pandas.__version__ == "2.2.3" +assert soundfile.__version__ == "0.14.0" +assert absl is not None +assert cffi is not None +assert datasets is not None +assert librosa is not None +assert pycparser is not None +assert pydantic is not None +assert sentencepiece is not None diff --git a/python/tensorrt_model_connect/families/olmo/MODEL.toml b/python/tensorrt_model_connect/families/olmo/MODEL.toml index eaf6744d13..0f9e93ab5e 100644 --- a/python/tensorrt_model_connect/families/olmo/MODEL.toml +++ b/python/tensorrt_model_connect/families/olmo/MODEL.toml @@ -4,6 +4,13 @@ id = "olmo" plugin = "olmo" module = "plugin" +python_profile_specs = [ + "olmo_tokenizer|families/olmo/python_profile_requirements/olmo_tokenizer.lock.txt|families/olmo/python_profile_verify.py|true", +] +default_execution_profiles = [ + "build|olmo_tokenizer", + "reference|olmo_tokenizer", +] capabilities = ["split_decoder_roles"] aliases = [ "olmo", diff --git a/python/tensorrt_model_connect/families/olmo/python_profile_requirements/olmo_tokenizer.lock.txt b/python/tensorrt_model_connect/families/olmo/python_profile_requirements/olmo_tokenizer.lock.txt new file mode 100644 index 0000000000..b70a64b61c --- /dev/null +++ b/python/tensorrt_model_connect/families/olmo/python_profile_requirements/olmo_tokenizer.lock.txt @@ -0,0 +1,6 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +transformers==5.2.0 +tokenizers==0.22.2 +huggingface-hub==1.22.0 diff --git a/python/tensorrt_model_connect/families/olmo/python_profile_verify.py b/python/tensorrt_model_connect/families/olmo/python_profile_verify.py new file mode 100644 index 0000000000..92208e04bc --- /dev/null +++ b/python/tensorrt_model_connect/families/olmo/python_profile_verify.py @@ -0,0 +1,20 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +"""Verify the OLMo tokenizer-compatible build and reference environment.""" + +from importlib.metadata import version + +import transformers +from transformers import AutoTokenizer + + +assert transformers.__version__ == "5.2.0" +assert version("tokenizers") == "0.22.2" +assert version("huggingface-hub") == "1.22.0" +assert AutoTokenizer is not None +print( + f"transformers={transformers.__version__} " + f"tokenizers={version('tokenizers')} " + f"huggingface-hub={version('huggingface-hub')}" +) diff --git a/python/tensorrt_model_connect/families/qwen_image/MODEL.toml b/python/tensorrt_model_connect/families/qwen_image/MODEL.toml index 6184132d53..1378df82c0 100644 --- a/python/tensorrt_model_connect/families/qwen_image/MODEL.toml +++ b/python/tensorrt_model_connect/families/qwen_image/MODEL.toml @@ -3,6 +3,12 @@ id = "qwen_image" plugin = "qwen_image" +python_profile_specs = [ + "qwen_image_reference|families/qwen_image/python_profile_requirements/qwen_image_reference.lock.txt|families/qwen_image/python_profile_verify.py|true", +] +default_execution_profiles = [ + "reference|qwen_image_reference", +] module = "plugin" aliases = [ "qwen-image", diff --git a/python/tensorrt_model_connect/families/qwen_image/python_profile_requirements/qwen_image_reference.lock.txt b/python/tensorrt_model_connect/families/qwen_image/python_profile_requirements/qwen_image_reference.lock.txt new file mode 100644 index 0000000000..b838a5687f --- /dev/null +++ b/python/tensorrt_model_connect/families/qwen_image/python_profile_requirements/qwen_image_reference.lock.txt @@ -0,0 +1,4 @@ +accelerate==1.14.0 +diffusers==0.39.0 +ftfy==6.3.1 +wcwidth==0.8.2 diff --git a/python/tensorrt_model_connect/families/qwen_image/python_profile_verify.py b/python/tensorrt_model_connect/families/qwen_image/python_profile_verify.py new file mode 100644 index 0000000000..142f3dec4f --- /dev/null +++ b/python/tensorrt_model_connect/families/qwen_image/python_profile_verify.py @@ -0,0 +1,19 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +"""Verify dependencies imported by the Qwen-Image HF reference.""" + +from importlib.metadata import version + +import accelerate +import diffusers +import ftfy + + +assert version("accelerate") == "1.14.0" +assert version("diffusers") == "0.39.0" +assert version("ftfy") == "6.3.1" +assert version("wcwidth") == "0.8.2" +assert accelerate is not None +assert getattr(diffusers, "QwenImagePipeline", None) is not None +assert ftfy.fix_text("Qwen-Image") == "Qwen-Image" diff --git a/python/tensorrt_model_connect/families/timm_vit/MODEL.toml b/python/tensorrt_model_connect/families/timm_vit/MODEL.toml index 809d5dd448..adb9210863 100644 --- a/python/tensorrt_model_connect/families/timm_vit/MODEL.toml +++ b/python/tensorrt_model_connect/families/timm_vit/MODEL.toml @@ -4,6 +4,12 @@ id = "timm_vit" plugin = "timm_vit" module = "plugin" +python_profile_specs = [ + "timm_reference|families/timm_vit/python_profile_requirements/timm_reference.lock.txt|families/timm_vit/python_profile_verify.py|true", +] +default_execution_profiles = [ + "reference|timm_reference", +] aliases = [ "timm_vit", "timmvit", diff --git a/python/tensorrt_model_connect/families/timm_vit/python_profile_requirements/timm_reference.lock.txt b/python/tensorrt_model_connect/families/timm_vit/python_profile_requirements/timm_reference.lock.txt new file mode 100644 index 0000000000..260c4eb606 --- /dev/null +++ b/python/tensorrt_model_connect/families/timm_vit/python_profile_requirements/timm_reference.lock.txt @@ -0,0 +1 @@ +timm==1.0.28 diff --git a/python/tensorrt_model_connect/families/timm_vit/python_profile_verify.py b/python/tensorrt_model_connect/families/timm_vit/python_profile_verify.py new file mode 100644 index 0000000000..03ac67651e --- /dev/null +++ b/python/tensorrt_model_connect/families/timm_vit/python_profile_verify.py @@ -0,0 +1,11 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +from importlib.metadata import version + +import timm + +assert version("timm") == "1.0.28" +assert timm.__version__ == "1.0.28" +assert callable(timm.create_model) +print(f"timm={timm.__version__} create_model=ok") diff --git a/python/tensorrt_model_connect/families/wan2_2_ti2v/MODEL.toml b/python/tensorrt_model_connect/families/wan2_2_ti2v/MODEL.toml index 9f68bcbdd2..ecd54ee67b 100644 --- a/python/tensorrt_model_connect/families/wan2_2_ti2v/MODEL.toml +++ b/python/tensorrt_model_connect/families/wan2_2_ti2v/MODEL.toml @@ -3,6 +3,12 @@ id = "wan2_2_ti2v" plugin = "wan2_2_ti2v" +python_profile_specs = [ + "wan2_2_ti2v_reference|families/wan2_2_ti2v/python_profile_requirements/wan2_2_ti2v_reference.lock.txt|families/wan2_2_ti2v/python_profile_verify.py|true|false", +] +default_execution_profiles = [ + "reference|wan2_2_ti2v_reference", +] module = "plugin" aliases = [ "ti2v", diff --git a/python/tensorrt_model_connect/families/wan2_2_ti2v/python_profile_requirements/wan2_2_ti2v_reference.lock.txt b/python/tensorrt_model_connect/families/wan2_2_ti2v/python_profile_requirements/wan2_2_ti2v_reference.lock.txt new file mode 100644 index 0000000000..9c08b144ff --- /dev/null +++ b/python/tensorrt_model_connect/families/wan2_2_ti2v/python_profile_requirements/wan2_2_ti2v_reference.lock.txt @@ -0,0 +1,3 @@ +einops==0.8.1 +ftfy==6.3.1 +wcwidth==0.8.2 diff --git a/python/tensorrt_model_connect/families/wan2_2_ti2v/python_profile_verify.py b/python/tensorrt_model_connect/families/wan2_2_ti2v/python_profile_verify.py new file mode 100644 index 0000000000..e3c3ab9675 --- /dev/null +++ b/python/tensorrt_model_connect/families/wan2_2_ti2v/python_profile_verify.py @@ -0,0 +1,16 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +"""Verify dependencies imported by the pinned Wan2.2 TI2V reference.""" + +from importlib.metadata import version + +import einops +import ftfy + + +assert version("einops") == "0.8.1" +assert version("ftfy") == "6.3.1" +assert version("wcwidth") == "0.8.2" +assert einops is not None +assert ftfy.fix_text("Wan2.2") == "Wan2.2" diff --git a/python/tensorrt_model_connect/families/xglm/MODEL.toml b/python/tensorrt_model_connect/families/xglm/MODEL.toml index c3b4751f4d..9f7880f322 100644 --- a/python/tensorrt_model_connect/families/xglm/MODEL.toml +++ b/python/tensorrt_model_connect/families/xglm/MODEL.toml @@ -5,6 +5,13 @@ id = "xglm" plugin = "xglm" module = "plugin" capabilities = ["split_decoder_roles"] +python_profile_specs = [ + "xglm_tokenizer|families/xglm/python_profile_requirements/xglm_tokenizer.lock.txt|families/xglm/python_profile_verify.py|true", +] +default_execution_profiles = [ + "build|xglm_tokenizer", + "reference|xglm_tokenizer", +] aliases = [ "xglm", ] diff --git a/python/tensorrt_model_connect/families/xglm/python_profile_requirements/xglm_tokenizer.lock.txt b/python/tensorrt_model_connect/families/xglm/python_profile_requirements/xglm_tokenizer.lock.txt new file mode 100644 index 0000000000..ba4d2b7323 --- /dev/null +++ b/python/tensorrt_model_connect/families/xglm/python_profile_requirements/xglm_tokenizer.lock.txt @@ -0,0 +1,7 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +transformers==5.2.0 +huggingface-hub==1.22.0 +tokenizers==0.22.2 +sentencepiece==0.2.2 diff --git a/python/tensorrt_model_connect/families/xglm/python_profile_verify.py b/python/tensorrt_model_connect/families/xglm/python_profile_verify.py new file mode 100644 index 0000000000..1709c678ab --- /dev/null +++ b/python/tensorrt_model_connect/families/xglm/python_profile_verify.py @@ -0,0 +1,16 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +"""Verify the XGLM tokenizer execution profile.""" + +from importlib.metadata import version + +import sentencepiece +import transformers + + +assert transformers.__version__ == "5.2.0", transformers.__version__ +assert version("huggingface-hub") == "1.22.0" +assert version("tokenizers") == "0.22.2" +assert version("sentencepiece") == "0.2.2" +assert hasattr(sentencepiece, "SentencePieceProcessor") diff --git a/tests/tools/test_e2e_python_profiles.py b/tests/tools/test_e2e_python_profiles.py index 6726806c48..670f21e9ad 100644 --- a/tests/tools/test_e2e_python_profiles.py +++ b/tests/tools/test_e2e_python_profiles.py @@ -251,24 +251,11 @@ def read_text(self, *, encoding): def test_family_profile_registry_is_fully_exact_pinned(): - expected = { - "chronos", - "deepseek_ocr", - "elf_flow", - "elf_flow_reference", - "internlm", - "lance_reference", - "magpie_tts_reference", - "nemotron_h_reference", - "personaplex_full_duplex_evaluator", - "phi4_multimodal", - "sana_wm_reference", - "reference_common", - } profiles = shared_profiles.load_python_profile_registry()["profiles"] + profile_names = set(profiles) - {shared_profiles.DEFAULT_PROFILE} - assert set(profiles) - {shared_profiles.DEFAULT_PROFILE} == expected - for name in expected: + assert profile_names + for name in profile_names: requirements = shared_profiles._read_requirements_text( profiles[name]["requirements"] ) diff --git a/tests/tools/test_ensure_ci_docker_image.py b/tests/tools/test_ensure_ci_docker_image.py index 68d9762bd8..f4d5dfd1f8 100644 --- a/tests/tools/test_ensure_ci_docker_image.py +++ b/tests/tools/test_ensure_ci_docker_image.py @@ -20,9 +20,8 @@ REPO_ROOT = Path(__file__).resolve().parent.parent.parent SCRIPT = REPO_ROOT / "tools" / "ci" / "docker_image.py" -DEFAULT_PROFILES = ( - "chronos,deepseek_ocr,elf_flow,elf_flow_reference,internlm,lance_reference,magpie_tts_reference," - "nemotron_h_reference,phi4_multimodal,reference_common,sana_wm_reference" +DEFAULT_PROFILES = ",".join( + DockerImageManager(REPO_ROOT).source_contract()["python_profiles"] ) TENSORRT_VERSION = "11.1.0.106" TENSORRT_APT_VERSION = "11.1.0.106-1+cuda13.3" @@ -137,7 +136,7 @@ def _write_fake_docker(tmp_path: Path, existing_images: dict[str, str]) -> tuple if [ "${1:-}" = "run" ]; then capability="${FAKE_DOCKER_CAPABILITY:-available}" - profiles="${FAKE_DOCKER_PROFILES-chronos,deepseek_ocr,elf_flow,elf_flow_reference,internlm,lance_reference,magpie_tts_reference,nemotron_h_reference,phi4_multimodal,reference_common,sana_wm_reference}" + profiles="${FAKE_DOCKER_PROFILES-}" if [ -f "$FAKE_DOCKER_REBUILT" ]; then capability="available" profiles="$FAKE_DOCKER_REBUILT_PROFILES" From 424b108d79d5d109e547d17fec9bc8f1b2394325 Mon Sep 17 00:00:00 2001 From: chaofengw-nv Date: Sat, 29 Aug 2026 14:07:24 +0000 Subject: [PATCH 2/6] test(qwen-image): reject lazy dependency placeholders Require the PyTorch and Transformers backends and ensure the exported Qwen pipeline is the real implementation before accepting the reference profile. Signed-off-by: chaofengw-nv --- .../families/qwen_image/python_profile_verify.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/python/tensorrt_model_connect/families/qwen_image/python_profile_verify.py b/python/tensorrt_model_connect/families/qwen_image/python_profile_verify.py index 142f3dec4f..526eb830c7 100644 --- a/python/tensorrt_model_connect/families/qwen_image/python_profile_verify.py +++ b/python/tensorrt_model_connect/families/qwen_image/python_profile_verify.py @@ -8,6 +8,7 @@ import accelerate import diffusers import ftfy +from diffusers.utils import is_torch_available, is_transformers_available assert version("accelerate") == "1.14.0" @@ -15,5 +16,11 @@ assert version("ftfy") == "6.3.1" assert version("wcwidth") == "0.8.2" assert accelerate is not None -assert getattr(diffusers, "QwenImagePipeline", None) is not None +if not is_torch_available() or not is_transformers_available(): + raise RuntimeError("QwenImagePipeline requires PyTorch and Transformers backends") +pipeline = getattr(diffusers, "QwenImagePipeline", None) +if pipeline is None or "dummy" in pipeline.__module__.lower(): + raise RuntimeError( + f"QwenImagePipeline resolved to an unavailable placeholder: {pipeline!r}" + ) assert ftfy.fix_text("Qwen-Image") == "Qwen-Image" From 3c5cb6784952b069f11e0d3d72e3487f71b15e2c Mon Sep 17 00:00:00 2001 From: chaofengw-nv Date: Sat, 29 Aug 2026 14:03:51 +0000 Subject: [PATCH 3/6] test(profiles): isolate canary interpreter fixtures Provide the declared Canary reference interpreter explicitly in tests that mock subprocess execution or model orchestration, so they do not attempt profile materialization through invalid fake executables. Signed-off-by: chaofengw-nv --- tests/tools/test_model_e2e_runner.py | 5 +++++ tests/tools/test_validation_engine.py | 4 ++++ 2 files changed, 9 insertions(+) diff --git a/tests/tools/test_model_e2e_runner.py b/tests/tools/test_model_e2e_runner.py index 3284b949d5..38242e27a6 100644 --- a/tests/tools/test_model_e2e_runner.py +++ b/tests/tools/test_model_e2e_runner.py @@ -5,6 +5,7 @@ from __future__ import annotations +import sys from contextlib import nullcontext from pathlib import Path @@ -190,6 +191,10 @@ def test_model_runner_builds_once_then_runs_all_children(monkeypatch, tmp_path) build_calls = [] run_calls = [] + monkeypatch.setenv( + "TRTMC_PYTHON_PROFILE_CANARY_REFERENCE_PYTHON", + sys.executable, + ) monkeypatch.setattr(model_runner, "get_model_by_name", lambda *_args: model) def resolve_bundle(self, case, ctx): diff --git a/tests/tools/test_validation_engine.py b/tests/tools/test_validation_engine.py index af04197150..637878a4c4 100644 --- a/tests/tools/test_validation_engine.py +++ b/tests/tools/test_validation_engine.py @@ -6355,6 +6355,10 @@ def fake_run(cmd, **_kwargs): captured["cmd"] = cmd return Result() + monkeypatch.setenv( + "TRTMC_PYTHON_PROFILE_CANARY_REFERENCE_PYTHON", + sys.executable, + ) monkeypatch.setattr(validation_engine.subprocess, "run", fake_run) args = argparse.Namespace( hf_python="", From 8cab7166448d9a055171f38f519bc749bce92eb4 Mon Sep 17 00:00:00 2001 From: chaofengw-nv Date: Sat, 29 Aug 2026 14:14:52 +0000 Subject: [PATCH 4/6] test(profiles): isolate skipped canary runner Resolve the declared Canary reference profile in the all-preflights-skip test as well, keeping profile materialization outside this orchestration-only fixture. Signed-off-by: chaofengw-nv --- tests/tools/test_model_e2e_runner.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/tools/test_model_e2e_runner.py b/tests/tools/test_model_e2e_runner.py index 38242e27a6..4956276262 100644 --- a/tests/tools/test_model_e2e_runner.py +++ b/tests/tools/test_model_e2e_runner.py @@ -251,6 +251,10 @@ def test_model_runner_does_not_build_when_all_preflights_skip( build_calls = [] run_calls = [] + monkeypatch.setenv( + "TRTMC_PYTHON_PROFILE_CANARY_REFERENCE_PYTHON", + sys.executable, + ) monkeypatch.setattr(model_runner, "get_model_by_name", lambda *_args: model) monkeypatch.setattr(model_runner, "run_preflight", lambda *_args: (False, [])) From 7d6e08bfcf6737be0f8907801b226b803dd10722 Mon Sep 17 00:00:00 2001 From: chaofengw Date: Sat, 29 Aug 2026 17:03:46 +0000 Subject: [PATCH 5/6] fix(wan2.2): prepare offline reference profile Mark the default Wan2.2 reference profile for per-proof preparation so the network-disabled execution lane can resolve it. Add a family-owned regression test that binds the default profile to the prepared profile inventory. Signed-off-by: chaofengw --- .../families/wan2_2_ti2v/MODEL.toml | 2 +- .../wan2_2_ti2v/test_wan22_python_profile.py | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 tests/e2e/models/wan2_2_ti2v/test_wan22_python_profile.py diff --git a/python/tensorrt_model_connect/families/wan2_2_ti2v/MODEL.toml b/python/tensorrt_model_connect/families/wan2_2_ti2v/MODEL.toml index ecd54ee67b..7de3d421c2 100644 --- a/python/tensorrt_model_connect/families/wan2_2_ti2v/MODEL.toml +++ b/python/tensorrt_model_connect/families/wan2_2_ti2v/MODEL.toml @@ -4,7 +4,7 @@ id = "wan2_2_ti2v" plugin = "wan2_2_ti2v" python_profile_specs = [ - "wan2_2_ti2v_reference|families/wan2_2_ti2v/python_profile_requirements/wan2_2_ti2v_reference.lock.txt|families/wan2_2_ti2v/python_profile_verify.py|true|false", + "wan2_2_ti2v_reference|families/wan2_2_ti2v/python_profile_requirements/wan2_2_ti2v_reference.lock.txt|families/wan2_2_ti2v/python_profile_verify.py|true|true", ] default_execution_profiles = [ "reference|wan2_2_ti2v_reference", diff --git a/tests/e2e/models/wan2_2_ti2v/test_wan22_python_profile.py b/tests/e2e/models/wan2_2_ti2v/test_wan22_python_profile.py new file mode 100644 index 0000000000..e93d42f0a4 --- /dev/null +++ b/tests/e2e/models/wan2_2_ti2v/test_wan22_python_profile.py @@ -0,0 +1,18 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +"""Wan2.2-owned Python profile contracts.""" + +from tensorrt_model_connect.python_profiles import ( + default_execution_profiles, + load_python_profile_registry, + prebuilt_python_profile_names, +) + + +def test_wan22_default_reference_profile_is_prepared_for_offline_proofs() -> None: + profiles = default_execution_profiles(family="wan2_2_ti2v") + registry = load_python_profile_registry() + + assert profiles["reference"] == "wan2_2_ti2v_reference" + assert profiles["reference"] in prebuilt_python_profile_names(registry) From 86392894e6d81e11cc29ce08b5b09a630f5ea909 Mon Sep 17 00:00:00 2001 From: chaofengw Date: Sat, 29 Aug 2026 17:50:36 +0000 Subject: [PATCH 6/6] fix(profiles): prepare selected reference defaults Prepare the Canary and MiniMax-H3 reference profiles because family defaults select them inside network-disabled proofs. Add a registry-wide invariant that keeps every non-base family default in the offline preparation inventory while preserving unselected lazy profiles. Signed-off-by: chaofengw --- .../families/canary/MODEL.toml | 2 +- .../families/minimax_h3/MODEL.toml | 2 +- tests/tools/test_e2e_python_profiles.py | 16 ++++++++++++++++ 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/python/tensorrt_model_connect/families/canary/MODEL.toml b/python/tensorrt_model_connect/families/canary/MODEL.toml index 798d181e89..b493ac7a4c 100644 --- a/python/tensorrt_model_connect/families/canary/MODEL.toml +++ b/python/tensorrt_model_connect/families/canary/MODEL.toml @@ -4,7 +4,7 @@ id = "canary" plugin = "canary" python_profile_specs = [ - "canary_reference|families/canary/python_profile_requirements/canary_reference.lock.txt|families/canary/python_profile_verify.py|true|false", + "canary_reference|families/canary/python_profile_requirements/canary_reference.lock.txt|families/canary/python_profile_verify.py|true|true", ] default_execution_profiles = [ "reference|canary_reference", diff --git a/python/tensorrt_model_connect/families/minimax_h3/MODEL.toml b/python/tensorrt_model_connect/families/minimax_h3/MODEL.toml index 2ba32b9166..fb50ffe2b6 100644 --- a/python/tensorrt_model_connect/families/minimax_h3/MODEL.toml +++ b/python/tensorrt_model_connect/families/minimax_h3/MODEL.toml @@ -5,7 +5,7 @@ id = "minimax_h3" plugin = "minimax_h3" module = "plugin" python_profile_specs = [ - "minimax_h3_reference|families/minimax_h3/python_profile_requirements/minimax_h3_reference.lock.txt|families/minimax_h3/python_profile_reference_verify.py|true|false", + "minimax_h3_reference|families/minimax_h3/python_profile_requirements/minimax_h3_reference.lock.txt|families/minimax_h3/python_profile_reference_verify.py|true|true", ] default_execution_profiles = [ "reference|minimax_h3_reference", diff --git a/tests/tools/test_e2e_python_profiles.py b/tests/tools/test_e2e_python_profiles.py index 670f21e9ad..ed32434edb 100644 --- a/tests/tools/test_e2e_python_profiles.py +++ b/tests/tools/test_e2e_python_profiles.py @@ -309,6 +309,22 @@ def test_lazy_profiles_are_excluded_from_offline_preparation() -> None: assert "reference_common" in prebuilt +def test_family_default_profiles_are_prepared_for_offline_execution() -> None: + package_root = Path(shared_profiles.__file__).resolve().parent + prepared = set( + shared_profiles.prebuilt_python_profile_names( + shared_profiles.load_python_profile_registry() + ) + ) + + for manifest_path in sorted((package_root / "families").glob("*/MODEL.toml")): + with manifest_path.open("rb") as stream: + manifest = shared_profiles.tomllib.load(stream) + for raw_default in manifest.get("default_execution_profiles", []): + _phase, profile = (part.strip() for part in raw_default.split("|", maxsplit=1)) + assert profile == "base" or profile in prepared, manifest["id"] + + def test_profile_lock_rejects_non_exact_or_duplicate_requirements(): with pytest.raises(ValueError, match="exact name==version pins"): shared_profiles._exact_pinned_requirements("transformers>=4.48\n")