From 59ce345e82193652deedfa6cfad27003d83f7432 Mon Sep 17 00:00:00 2001 From: "M. Chornyi" <99709299+mc-nv@users.noreply.github.com> Date: Thu, 24 Sep 2026 22:30:13 +0000 Subject: [PATCH 01/10] fix: Use inference image as SDK base Switch Dockerfile.sdk BASE_IMAGE from the tritonserver py3-min image to the cuda-dl-base inference-runtime image, matching the corresponding tritonserver CI change (TRI-1930). --- Dockerfile.sdk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile.sdk b/Dockerfile.sdk index 51e3980bc4..8a3d404283 100644 --- a/Dockerfile.sdk +++ b/Dockerfile.sdk @@ -29,7 +29,7 @@ # # Base image on the minimum Triton container -ARG BASE_IMAGE=nvcr.io/nvidia/tritonserver:26.09-py3-min +ARG BASE_IMAGE=nvcr.io/nvidia/cuda-dl-base:26.08-cuda13.4-inference-runtime-ubuntu24.04 ARG TRITON_CLIENT_REPO_SUBDIR=clientrepo ARG TRITON_REPO_ORGANIZATION=http://github.com/triton-inference-server From 904a72a92c39dbb88cf793cfa5f700b5fd8b82b7 Mon Sep 17 00:00:00 2001 From: "M. Chornyi" <99709299+mc-nv@users.noreply.github.com> Date: Fri, 2 Oct 2026 03:46:39 +0000 Subject: [PATCH 02/10] fix: Build on cuda-dl-base devel and ship on inference-runtime py3-min served as both the build toolchain and the runtime base. build.py already routed the `base` and `inference` --image keys to those two distinct roles, but defaulted both to py3-min, so an invocation without explicit --image overrides built and shipped on the image being retired. Default `base` to the cuda-dl-base devel image and `inference` to the inference-runtime image. The `inference` default is guarded on --enable-gpu, non-RHEL and non-vllm so the CPU-only ubuntu base, the RHEL explicit-base requirement and the existing vLLM runtime image keep their behaviour. Routing the ONNX Runtime and OpenVINO build containers is part of the same change rather than a follow-up, because without it the swap does not reach them: build.py only passed TRITON_BUILD_CONTAINER when --image=base was given, and otherwise passed a bare version that each backend's CMakeLists interpolated back into a py3-min tag. They now always receive the resolved image. Its default stays CUDA-capable regardless of --enable-gpu, since those backends need the CUDA toolchain even when Triton itself is built CPU-only -- which is what the old py3-min fallback was quietly providing. The tag is held as a train plus CUDA version pair because cuda-dl-base publishes exactly one CUDA version per train, so the two cannot be bumped independently. fil is deliberately untouched: its Dockerfile expects a full tritonserver -py3 image rather than a minimal base, so it needs separate assessment. --- build.py | 75 ++++++++++++++++++++++++++++++++------------------------ 1 file changed, 43 insertions(+), 32 deletions(-) diff --git a/build.py b/build.py index 4410b0e818..78a7784c26 100755 --- a/build.py +++ b/build.py @@ -59,6 +59,8 @@ # triton version -> # (triton container version, # upstream container version, +# cuda-dl-base version (container train and its CUDA version, which +# cuda-dl-base publishes as a matched pair and must be bumped together), # ORT version, # ORT OpenVINO version (use None to disable OpenVINO in ORT), # Standalone OpenVINO version, @@ -75,6 +77,7 @@ "release_version": "2.74.0dev", "triton_container_version": "26.10dev", "upstream_container_version": "26.09", + "cuda_dl_base_version": "26.09-cuda13.4", "ort_version": "1.30.0", "ort_openvino_version": "2026.3.1", "standalone_openvino_version": "2026.3.1", @@ -188,6 +191,18 @@ def target_machine(): return platform.machine().lower() +def default_build_container_image(): + """Image the compile toolchain runs in. + + Always CUDA-capable: the ONNX Runtime and OpenVINO backends build in this + container and need the CUDA toolchain even when Triton itself is being + built CPU-only. + """ + return "nvcr.io/nvidia/cuda-dl-base:{}-devel-ubuntu24.04".format( + FLAGS.cuda_dl_base_version + ) + + def container_versions(version, container_version, upstream_container_version): if container_version is None: container_version = FLAGS.triton_container_version @@ -661,21 +676,14 @@ def onnxruntime_cmake_args(images, library_paths): ) ) - if "base" in images: - cargs.append( - cmake_backend_arg( - "onnxruntime", "TRITON_BUILD_CONTAINER", None, images["base"] - ) - ) - else: - cargs.append( - cmake_backend_arg( - "onnxruntime", - "TRITON_BUILD_CONTAINER_VERSION", - None, - FLAGS.upstream_container_version, - ) + cargs.append( + cmake_backend_arg( + "onnxruntime", + "TRITON_BUILD_CONTAINER", + None, + images.get("base", default_build_container_image()), ) + ) # TODO: TPRD-333 OpenVino extension is not currently supported by our manylinux build if ( @@ -719,21 +727,14 @@ def openvino_cmake_args(): FLAGS.standalone_openvino_version, ) ] - if "base" in images: - cargs.append( - cmake_backend_arg( - "openvino", "TRITON_BUILD_CONTAINER", None, images["base"] - ) - ) - else: - cargs.append( - cmake_backend_arg( - "openvino", - "TRITON_BUILD_CONTAINER_VERSION", - None, - FLAGS.upstream_container_version, - ) + cargs.append( + cmake_backend_arg( + "openvino", + "TRITON_BUILD_CONTAINER", + None, + images.get("base", default_build_container_image()), ) + ) return cargs @@ -1693,14 +1694,18 @@ def create_build_dockerfiles( elif target_platform() == "rhel": raise KeyError("A base image must be specified when targeting RHEL") elif FLAGS.enable_gpu: - base_image = "nvcr.io/nvidia/tritonserver:{}-py3-min".format( - FLAGS.upstream_container_version - ) + base_image = default_build_container_image() else: base_image = "ubuntu:24.04" if "inference" in images: inference_image = images["inference"] + elif FLAGS.enable_gpu and target_platform() != "rhel" and "vllm" not in backends: + inference_image = ( + "nvcr.io/nvidia/cuda-dl-base:{}-inference-runtime-ubuntu24.04".format( + FLAGS.cuda_dl_base_version + ) + ) else: inference_image = None @@ -2541,7 +2546,7 @@ def enable_all(): "--image", action="append", required=False, - help='Use specified Docker image in build as ,. can be "base", "gpu-base", or "pytorch".', + help='Use specified Docker image in build as ,. can be "base", "gpu-base", "pytorch", or "inference".', ) parser.add_argument( @@ -2708,6 +2713,12 @@ def enable_all(): default=DEFAULT_TRITON_VERSION_MAP["upstream_container_version"], help="This flag sets the upstream container version for Triton Inference Server to be built. Default: the latest released version.", ) + parser.add_argument( + "--cuda-dl-base-version", + required=False, + default=DEFAULT_TRITON_VERSION_MAP["cuda_dl_base_version"], + help="This flag sets the cuda-dl-base container train and its CUDA version, as a matched pair (e.g. 26.09-cuda13.4), used for the default build and runtime base images. Default: the latest supported version.", + ) parser.add_argument( "--ort-version", required=False, From 2e024c68f3ad569c00e62424dead331c7f2dbea5 Mon Sep 17 00:00:00 2001 From: "M. Chornyi" <99709299+mc-nv@users.noreply.github.com> Date: Fri, 2 Oct 2026 03:47:00 +0000 Subject: [PATCH 03/10] fix: Default the compose min container to the inference-runtime image The `min` container is the base the composed output image is built from, so it takes the same inference-runtime image the server runtime now defaults to. `gpu-min` is deliberately left on py3-min: it is not a runtime base but a scratch donor stage that CPU-only PyTorch builds copy CUDA stubs out of, and is never shipped. The version is read from build.py's map rather than duplicated here, since compose.py already imports build for container_versions(). Verified the replacement image carries CUDA_VERSION in its environment -- create_argmap inspects the min container and fails a GPU compose without it. --- compose.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/compose.py b/compose.py index b5b5e691e8..4b759a970c 100755 --- a/compose.py +++ b/compose.py @@ -467,12 +467,14 @@ def create_argmap(images, skip_pull): else: get_container_version_if_not_specified() if FLAGS.enable_gpu: + import build + images = { "full": "nvcr.io/nvidia/tritonserver:{}-py3".format( FLAGS.container_version ), - "min": "nvcr.io/nvidia/tritonserver:{}-py3-min".format( - FLAGS.container_version + "min": "nvcr.io/nvidia/cuda-dl-base:{}-inference-runtime-ubuntu24.04".format( + build.DEFAULT_TRITON_VERSION_MAP["cuda_dl_base_version"] ), } else: From 41765321512854ee26e77a0c884293e53c2ea2b0 Mon Sep 17 00:00:00 2001 From: "M. Chornyi" <99709299+mc-nv@users.noreply.github.com> Date: Fri, 2 Oct 2026 03:49:33 +0000 Subject: [PATCH 04/10] docs: Describe the cuda-dl-base build and compose base images build.md and compose.md still named py3-min as the image the buildbase is built on and the one compose uses as its `min` container. Point both at cuda-dl-base, and note in compose.md that `min` no longer tracks the branch the way `full` does. Two deliberate edits beyond a string swap: - The "Building Without Docker" section asserted that no Dockerfile is available for the base image. That claim was about py3-min and is not verified for cuda-dl-base, so it is reworded rather than carried over; the practical instruction to install CUDA/cuDNN/TensorRT by hand is unchanged. - The same paragraph said the non-GPU min image is ubuntu:22.04 while the code has used ubuntu:24.04 for some time. Corrected, since leaving a known-wrong statement inside a sentence being rewritten is worse than the small scope increase. build.md's `--image=gpu-base,...py3-min` example is intentionally unchanged: gpu-base is a scratch donor stage for CPU-only PyTorch builds, not a runtime base, and still uses py3-min. --- docs/customization_guide/build.md | 12 +++++------- docs/customization_guide/compose.md | 9 +++++---- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/docs/customization_guide/build.md b/docs/customization_guide/build.md index 0e1ca25908..a52b9d2531 100644 --- a/docs/customization_guide/build.md +++ b/docs/customization_guide/build.md @@ -103,11 +103,11 @@ building with Docker. *tritonserver_buildbase* image is based on a minimal/base image. When building with GPU support (--enable-gpu), the *min* image is the - [\-py3-min](https://catalog.ngc.nvidia.com/orgs/nvidia/containers/tritonserver) + [cuda-dl-base \-cuda\-devel](https://catalog.ngc.nvidia.com/orgs/nvidia/containers/cuda-dl-base) image pulled from [NGC](https://ngc.nvidia.com) that contains the CUDA, cuDNN, TensorRT and other dependencies that are required to build Triton. When building without GPU support, the *min* image - is the standard ubuntu:22.04 image. + is the standard ubuntu:24.04 image. * Run the cmake_build script within the *tritonserver_buildbase* image to actually build Triton. The cmake_build script performs @@ -362,11 +362,9 @@ $ ./build.py -v --enable-all From Dockerfile.buildbase you can see what dependencies you need to install on your host system. Note that when building with --enable-gpu (or --enable-all), Dockerfile.buildbase depends on the -[\-py3-min](https://catalog.ngc.nvidia.com/orgs/nvidia/containers/tritonserver) -image pulled from [NGC](https://ngc.nvidia.com). Unfortunately, a -Dockerfile is not currently available for the -[\-py3-min](https://catalog.ngc.nvidia.com/orgs/nvidia/containers/tritonserver) -image. Instead, you must manually install [CUDA and +[cuda-dl-base \-cuda\-devel](https://catalog.ngc.nvidia.com/orgs/nvidia/containers/cuda-dl-base) +image pulled from [NGC](https://ngc.nvidia.com). Rather than reproducing +that image, you must manually install [CUDA and cuDNN](#cuda-cublas-cudnn) and [TensorRT](#tensorrt) dependencies as described below. diff --git a/docs/customization_guide/compose.md b/docs/customization_guide/compose.md index 8c241843f9..4e85a3e8e5 100644 --- a/docs/customization_guide/compose.md +++ b/docs/customization_guide/compose.md @@ -72,14 +72,15 @@ This may result in different GPU statistic reporting behavior. `compose.py` requires two containers: a `min` container which is the base the compose container is built from and a `full` container from which the -script will extract components. The version of the `min` and `full` container -is determined by the branch of Triton `compose.py` is on. +script will extract components. The version of the `full` container is +determined by the branch of Triton `compose.py` is on, while the `min` +container is the CUDA DL base image that branch builds against. For example, running ``` python3 compose.py --backend pytorch --repoagent checksum ``` on branch [r26.09](https://github.com/triton-inference-server/server/tree/r26.09) pulls: -- `min` container `nvcr.io/nvidia/tritonserver:26.09-py3-min` +- `min` container `nvcr.io/nvidia/cuda-dl-base:26.09-cuda13.4-inference-runtime-ubuntu24.04` - `full` container `nvcr.io/nvidia/tritonserver:26.09-py3` Alternatively, users can specify the version of Triton container to pull from @@ -91,7 +92,7 @@ python3 compose.py --backend pytorch --repoagent checksum --container-version 26 2. Specifying `--image min, --image full,`. The user is responsible for specifying compatible `min` and `full` containers. ``` -python3 compose.py --backend pytorch --repoagent checksum --image min,nvcr.io/nvidia/tritonserver:26.09-py3-min --image full,nvcr.io/nvidia/tritonserver:26.09-py3 +python3 compose.py --backend pytorch --repoagent checksum --image min,nvcr.io/nvidia/cuda-dl-base:26.09-cuda13.4-inference-runtime-ubuntu24.04 --image full,nvcr.io/nvidia/tritonserver:26.09-py3 ``` Method 1 and 2 will result in the same composed container. Furthermore, `--image` flag overrides the `--container-version` flag when both are specified. From 10f7aa76f21f3dee16e153073e90ce77d098e350 Mon Sep 17 00:00:00 2001 From: "M. Chornyi" <99709299+mc-nv@users.noreply.github.com> Date: Fri, 2 Oct 2026 03:52:48 +0000 Subject: [PATCH 05/10] docs: Use YY.MM for container version placeholders The docs used three different placeholders for a container version: xx.yy, yy.mm and YY.MM. xx.yy is the most common but conveys nothing -- it reads as two arbitrary numbers rather than a year and month. Standardise on YY.MM, which is already what build.py's own --backend, --repo-tag, --repoagent and --cache help text uses ("version YY.MM -> branch rYY.MM"), and which matches the release-train naming of both the tritonserver and cuda-dl-base containers on NGC. The CUDA placeholder is uppercased to X.Y to match. deploy/gke-marketplace-app/README.md is left alone: its xx.yy sits next to a `gs://triton_sample_models/xx_yy` bucket path, and changing only the prose would be inconsistent while changing the path risks misstating a real bucket naming convention that could not be verified here. --- docs/README.md | 4 ++-- docs/customization_guide/build.md | 6 +++--- docs/getting_started/quickstart.md | 16 ++++++++-------- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/docs/README.md b/docs/README.md index bb862ae265..ebd2db3447 100644 --- a/docs/README.md +++ b/docs/README.md @@ -46,10 +46,10 @@ Containers](http://docs.nvidia.com/deeplearning/dgx/preparing-containers/index.h Pull the image using the following command. ``` -$ docker pull nvcr.io/nvidia/tritonserver:-py3 +$ docker pull nvcr.io/nvidia/tritonserver:-py3 ``` -Where \ is the version of Triton that you want to pull. For a complete list of all the variants and versions of the Triton Inference Server Container, visit the [NGC Page](https://catalog.ngc.nvidia.com/orgs/nvidia/containers/tritonserver). More information about customizing the Triton Container can be found in [this section](customization_guide/compose.md) of the User Guide. +Where \ is the version of Triton that you want to pull. For a complete list of all the variants and versions of the Triton Inference Server Container, visit the [NGC Page](https://catalog.ngc.nvidia.com/orgs/nvidia/containers/tritonserver). More information about customizing the Triton Container can be found in [this section](customization_guide/compose.md) of the User Guide. ## **Getting Started** diff --git a/docs/customization_guide/build.md b/docs/customization_guide/build.md index a52b9d2531..7806354801 100644 --- a/docs/customization_guide/build.md +++ b/docs/customization_guide/build.md @@ -103,7 +103,7 @@ building with Docker. *tritonserver_buildbase* image is based on a minimal/base image. When building with GPU support (--enable-gpu), the *min* image is the - [cuda-dl-base \-cuda\-devel](https://catalog.ngc.nvidia.com/orgs/nvidia/containers/cuda-dl-base) + [cuda-dl-base \-cuda\-devel](https://catalog.ngc.nvidia.com/orgs/nvidia/containers/cuda-dl-base) image pulled from [NGC](https://ngc.nvidia.com) that contains the CUDA, cuDNN, TensorRT and other dependencies that are required to build Triton. When building without GPU support, the *min* image @@ -339,7 +339,7 @@ available for a non-GPU / CPU-only build: `identity`, `repeat`, `ensemble`, CPU-only builds of the PyTorch backends require some CUDA stubs and runtime dependencies that are not present in the CPU-only base container. These are retrieved from a GPU base container, which can be changed with the -`--image=gpu-base,nvcr.io/nvidia/tritonserver:-py3-min` flag. +`--image=gpu-base,nvcr.io/nvidia/tritonserver:-py3-min` flag. ### Building Without Docker @@ -362,7 +362,7 @@ $ ./build.py -v --enable-all From Dockerfile.buildbase you can see what dependencies you need to install on your host system. Note that when building with --enable-gpu (or --enable-all), Dockerfile.buildbase depends on the -[cuda-dl-base \-cuda\-devel](https://catalog.ngc.nvidia.com/orgs/nvidia/containers/cuda-dl-base) +[cuda-dl-base \-cuda\-devel](https://catalog.ngc.nvidia.com/orgs/nvidia/containers/cuda-dl-base) image pulled from [NGC](https://ngc.nvidia.com). Rather than reproducing that image, you must manually install [CUDA and cuDNN](#cuda-cublas-cudnn) and [TensorRT](#tensorrt) dependencies as diff --git a/docs/getting_started/quickstart.md b/docs/getting_started/quickstart.md index c016572535..373d8e0bde 100644 --- a/docs/getting_started/quickstart.md +++ b/docs/getting_started/quickstart.md @@ -1,5 +1,5 @@