diff --git a/python/tensorrt_model_connect/families/canary/MODEL.toml b/python/tensorrt_model_connect/families/canary/MODEL.toml index 6b5c3265ac..b493ac7a4c 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|true", +] +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..fb50ffe2b6 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|true", +] +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..526eb830c7 --- /dev/null +++ b/python/tensorrt_model_connect/families/qwen_image/python_profile_verify.py @@ -0,0 +1,26 @@ +# 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 +from diffusers.utils import is_torch_available, is_transformers_available + + +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 +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" 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..7de3d421c2 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|true", +] +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/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) diff --git a/tests/tools/test_e2e_python_profiles.py b/tests/tools/test_e2e_python_profiles.py index 6726806c48..ed32434edb 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"] ) @@ -322,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") 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" diff --git a/tests/tools/test_model_e2e_runner.py b/tests/tools/test_model_e2e_runner.py index 3284b949d5..4956276262 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): @@ -246,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, [])) 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="",