diff --git a/build.py b/build.py index 716b227c42..ce76ecfc8d 100755 --- a/build.py +++ b/build.py @@ -32,6 +32,7 @@ import os.path import pathlib import platform +import re import stat import subprocess import sys @@ -688,17 +689,17 @@ def onnxruntime_cmake_args(images, library_paths): ) if target_platform() == "windows": - if "base" in images: + if "buildbase" in images: cargs.append( cmake_backend_arg( - "onnxruntime", "TRITON_BUILD_CONTAINER", None, images["base"] + "onnxruntime", "TRITON_BUILD_CONTAINER", None, images["buildbase"] ) ) else: - if "base" in images: + if "buildbase" in images: cargs.append( cmake_backend_arg( - "onnxruntime", "TRITON_BUILD_CONTAINER", None, images["base"] + "onnxruntime", "TRITON_BUILD_CONTAINER", None, images["buildbase"] ) ) else: @@ -754,17 +755,17 @@ def openvino_cmake_args(): ) ] if target_platform() == "windows": - if "base" in images: + if "buildbase" in images: cargs.append( cmake_backend_arg( - "openvino", "TRITON_BUILD_CONTAINER", None, images["base"] + "openvino", "TRITON_BUILD_CONTAINER", None, images["buildbase"] ) ) else: - if "base" in images: + if "buildbase" in images: cargs.append( cmake_backend_arg( - "openvino", "TRITON_BUILD_CONTAINER", None, images["base"] + "openvino", "TRITON_BUILD_CONTAINER", None, images["buildbase"] ) ) else: @@ -801,9 +802,9 @@ def dali_cmake_args(): def fil_cmake_args(images): cargs = [cmake_backend_enable("fil", "TRITON_FIL_DOCKER_BUILD", True)] - if "base" in images: + if "buildbase" in images: cargs.append( - cmake_backend_arg("fil", "TRITON_BUILD_CONTAINER", None, images["base"]) + cmake_backend_arg("fil", "TRITON_BUILD_CONTAINER", None, images["buildbase"]) ) else: cargs.append( @@ -1787,6 +1788,11 @@ def create_docker_build_script(script_name, container_install_dir, container_ci_ "--pull", ] + if FLAGS.no_container_cache: + baseargs += [ + "--no-cache", + ] + # Windows docker runs in a VM and memory needs to be specified # explicitly (at least for some configurations of docker). if target_platform() == "windows": @@ -2057,14 +2063,14 @@ def tensorrtllm_postbuild(cmake_script, repo_install_dir, tensorrtllm_be_dir): def backend_build( be, cmake_script, - tag, + tag_org, build_dir, install_dir, - github_organization, images, components, library_paths, ): + tag, github_organization = tag_org repo_build_dir = os.path.join(build_dir, be, "build") repo_install_dir = os.path.join(build_dir, be, "install") @@ -2077,8 +2083,8 @@ def backend_build( if be == "tensorrtllm": github_organization = ( "https://github.com/NVIDIA" - if "triton-inference-server" in FLAGS.github_organization - else FLAGS.github_organization + if "triton-inference-server" in github_organization + else github_organization ) repository_name = "TensorRT-LLM" cmake_script.gitclone(repository_name, tag, be, github_organization) @@ -2127,11 +2133,11 @@ def backend_build( def backend_clone( be, clone_script, - tag, + tag_org, build_dir, install_dir, - github_organization, ): + tag, github_organization = tag_org clone_script.commentln(8) clone_script.comment(f"'{be}' backend") clone_script.comment("Delete this section to remove backend from build") @@ -2467,6 +2473,12 @@ def enable_all(): required=False, help="Do not use Docker --pull argument when building container.", ) + parser.add_argument( + "--no-container-cache", + action="store_true", + required=False, + help="Use Docker --no-cache argument when building container.", + ) parser.add_argument( "--container-memory", default=None, @@ -2580,6 +2592,12 @@ def enable_all(): required=False, help='Use specified Docker image in build as ,. can be "base", "gpu-base", or "pytorch".', ) + parser.add_argument( + "--use-buildbase", + default=False, + action="store_true", + help='Use local temporary "buildbase" Docker image as "base" image to build backends', + ) parser.add_argument( "--enable-all", @@ -2659,7 +2677,7 @@ def enable_all(): "--backend", action="append", required=False, - help='Include specified backend in build as [:]. If starts with "pull/" then it refers to a pull-request reference, otherwise indicates the git tag/branch to use for the build. If the version is non-development then the default is the release branch matching the container version (e.g. version YY.MM -> branch rYY.MM); otherwise the default is "main" (e.g. version YY.MMdev -> branch main).', + help='Include specified backend in build as [:][:]. If starts with "pull/" then it refers to a pull-request reference, otherwise indicates the git tag/branch to use for the build. If the version is non-development then the default is the release branch matching the container version (e.g. version YY.MM -> branch rYY.MM); otherwise the default is "main" (e.g. version YY.MMdev -> branch main). allows using a forked repository instead of the default --github-organization value.', ) parser.add_argument( "--repo-tag", @@ -2727,6 +2745,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( + "--default-repo-tag", + required=False, + default=None, + help="Override the calculated default-repo-tag value", + ) parser.add_argument( "--ort-version", required=False, @@ -2855,6 +2879,8 @@ def enable_all(): cver = FLAGS.triton_container_version if not cver.endswith("dev"): default_repo_tag = "r" + cver + if FLAGS.default_repo_tag: + default_repo_tag = FLAGS.default_repo_tag log("default repo-tag: {}".format(default_repo_tag)) # For other versions use the TRITON_VERSION_MAP unless explicitly @@ -2874,11 +2900,14 @@ def enable_all(): # Initialize map of backends to build and repo-tag for each. backends = {} for be in FLAGS.backend: - parts = be.split(":") + pattern = r"(https?:\/\/[^\s:]+)|:" + parts = list(filter(None,re.split(pattern, be))) if len(parts) == 1: parts.append(default_repo_tag) - log('backend "{}" at tag/branch "{}"'.format(parts[0], parts[1])) - backends[parts[0]] = parts[1] + if len(parts) == 2: + parts.append(FLAGS.github_organization) + log('backend "{}" at tag/branch "{}" from org "{}"'.format(parts[0], parts[1], parts[2])) + backends[parts[0]] = parts[1:] if "vllm" in backends: if "python" not in backends: @@ -2926,6 +2955,11 @@ def enable_all(): ) log('image "{}": "{}"'.format(parts[0], parts[1])) images[parts[0]] = parts[1] + if FLAGS.use_buildbase: + images["buildbase"] = "tritonserver_buildbase" + else: + if "base" in images: + images["buildbase"] = images["base"] # Initialize map of library paths for each backend. library_paths = {} @@ -3084,7 +3118,6 @@ def enable_all(): backends[be], script_build_dir, script_install_dir, - github_organization, ) else: backend_build( @@ -3093,7 +3126,6 @@ def enable_all(): backends[be], script_build_dir, script_install_dir, - github_organization, images, components, library_paths, diff --git a/docs/customization_guide/build.md b/docs/customization_guide/build.md index 478f804bd4..8bdd1571a2 100644 --- a/docs/customization_guide/build.md +++ b/docs/customization_guide/build.md @@ -113,6 +113,8 @@ building with Docker. build Triton. When building without GPU support, the *min* image is the standard ubuntu:22.04 image. + * The flag `--use-buildbase` can be specified to automate the use of the *tritonserver_buildbase* image to build backends that require a base image. + * Run the cmake_build script within the *tritonserver_buildbase* image to actually build Triton. The cmake_build script performs the following steps. @@ -159,7 +161,7 @@ If you want to enable only certain Triton features, backends and repository agents, do not specify --enable-all. Instead you must specify the individual flags as documented by --help. -#### Building With Specific GitHub Branches +#### Building With Specific GitHub Branches and Organization As described above, the build is performed in the server repo, but source from several other repos is fetched during the build @@ -182,7 +184,12 @@ instead use the corresponding branch/tag in the build. For example, if you have a branch called "mybranch" in the [onnxruntime_backend](https://github.com/triton-inference-server/onnxruntime_backend) repo that you want to use in the build, you would specify ---backend=onnxruntime:mybranch. +`--backend=onnxruntime:mybranch`. + +If you want to build a backend from an alternative organization or user ``, you can extend this syntax as follows: +```bash +$ ./build.py ... --backend=onnxruntime:mybranch:https://github.com/ +``` #### CPU-Only Build