mirror of
				https://github.com/pytorch/pytorch.git
				synced 2025-11-01 04:54:55 +08:00 
			
		
		
		
	Compare commits
	
		
			15 Commits
		
	
	
		
			flash_deco
			...
			gh/rec/153
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 6a0c329f7c | |||
| 0c69b96ca0 | |||
| f3752272af | |||
| e72e8316a8 | |||
| ed6dcb67c4 | |||
| 627056e0dc | |||
| 4087612eb3 | |||
| 81315fb513 | |||
| ac21fa04ee | |||
| 4472e0efd6 | |||
| f56a1ab8a8 | |||
| 8dc0a55198 | |||
| eb2bd8f2a7 | |||
| 38d11892bf | |||
| a893d140af | 
| @ -3,18 +3,8 @@ set -eux -o pipefail | ||||
|  | ||||
| GPU_ARCH_VERSION=${GPU_ARCH_VERSION:-} | ||||
|  | ||||
| # Set CUDA architecture lists to match x86 build_cuda.sh | ||||
| if [[ "$GPU_ARCH_VERSION" == *"12.6"* ]]; then | ||||
|     export TORCH_CUDA_ARCH_LIST="8.0;9.0" | ||||
| elif [[ "$GPU_ARCH_VERSION" == *"12.8"* ]]; then | ||||
| if [[ "$GPU_ARCH_VERSION" == *"12.9"* ]]; then | ||||
|     export TORCH_CUDA_ARCH_LIST="8.0;9.0;10.0;12.0" | ||||
| elif [[ "$GPU_ARCH_VERSION" == *"13.0"* ]]; then | ||||
|     export TORCH_CUDA_ARCH_LIST="8.0;9.0;10.0;11.0;12.0+PTX" | ||||
| fi | ||||
|  | ||||
| # Compress the fatbin with -compress-mode=size for CUDA 13 | ||||
| if [[ "$DESIRED_CUDA" == *"13"* ]]; then | ||||
|     export TORCH_NVCC_FLAGS="-compress-mode=size" | ||||
| fi | ||||
|  | ||||
| SCRIPTPATH="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" | ||||
| @ -28,22 +18,14 @@ cd / | ||||
| # on the mounted pytorch repo | ||||
| git config --global --add safe.directory /pytorch | ||||
| pip install -r /pytorch/requirements.txt | ||||
| pip install auditwheel==6.2.0 wheel | ||||
| pip install auditwheel==6.2.0 | ||||
| if [ "$DESIRED_CUDA" = "cpu" ]; then | ||||
|     echo "BASE_CUDA_VERSION is not set. Building cpu wheel." | ||||
|     python /pytorch/.ci/aarch64_linux/aarch64_wheel_ci_build.py --enable-mkldnn | ||||
|     #USE_PRIORITIZED_TEXT_FOR_LD for enable linker script optimization https://github.com/pytorch/pytorch/pull/121975/files | ||||
|     USE_PRIORITIZED_TEXT_FOR_LD=1 python /pytorch/.ci/aarch64_linux/aarch64_wheel_ci_build.py --enable-mkldnn | ||||
| else | ||||
|     echo "BASE_CUDA_VERSION is set to: $DESIRED_CUDA" | ||||
|     export USE_SYSTEM_NCCL=1 | ||||
|  | ||||
|     # Check if we should use NVIDIA libs from PyPI (similar to x86 build_cuda.sh logic) | ||||
|     if [[ -z "$PYTORCH_EXTRA_INSTALL_REQUIREMENTS" ]]; then | ||||
|         echo "Bundling CUDA libraries with wheel for aarch64." | ||||
|     else | ||||
|         echo "Using nvidia libs from pypi for aarch64." | ||||
|         echo "Updated PYTORCH_EXTRA_INSTALL_REQUIREMENTS for aarch64: $PYTORCH_EXTRA_INSTALL_REQUIREMENTS" | ||||
|         export USE_NVIDIA_PYPI_LIBS=1 | ||||
|     fi | ||||
|  | ||||
|     python /pytorch/.ci/aarch64_linux/aarch64_wheel_ci_build.py --enable-mkldnn --enable-cuda | ||||
|     #USE_PRIORITIZED_TEXT_FOR_LD for enable linker script optimization https://github.com/pytorch/pytorch/pull/121975/files | ||||
|     USE_PRIORITIZED_TEXT_FOR_LD=1 python /pytorch/.ci/aarch64_linux/aarch64_wheel_ci_build.py --enable-mkldnn --enable-cuda | ||||
| fi | ||||
|  | ||||
| @ -69,186 +69,62 @@ def replace_tag(filename) -> None: | ||||
|         f.writelines(lines) | ||||
|  | ||||
|  | ||||
| def patch_library_rpath( | ||||
|     folder: str, | ||||
|     lib_name: str, | ||||
|     use_nvidia_pypi_libs: bool = False, | ||||
|     desired_cuda: str = "", | ||||
| ) -> None: | ||||
|     """Apply patchelf to set RPATH for a library in torch/lib""" | ||||
|     lib_path = f"{folder}/tmp/torch/lib/{lib_name}" | ||||
|  | ||||
|     if use_nvidia_pypi_libs: | ||||
|         # For PyPI NVIDIA libraries, construct CUDA RPATH | ||||
|         cuda_rpaths = [ | ||||
|             "$ORIGIN/../../nvidia/cudnn/lib", | ||||
|             "$ORIGIN/../../nvidia/nvshmem/lib", | ||||
|             "$ORIGIN/../../nvidia/nccl/lib", | ||||
|             "$ORIGIN/../../nvidia/cusparselt/lib", | ||||
|         ] | ||||
|  | ||||
|         if "130" in desired_cuda: | ||||
|             cuda_rpaths.append("$ORIGIN/../../nvidia/cu13/lib") | ||||
|         else: | ||||
|             cuda_rpaths.extend( | ||||
|                 [ | ||||
|                     "$ORIGIN/../../nvidia/cublas/lib", | ||||
|                     "$ORIGIN/../../nvidia/cuda_cupti/lib", | ||||
|                     "$ORIGIN/../../nvidia/cuda_nvrtc/lib", | ||||
|                     "$ORIGIN/../../nvidia/cuda_runtime/lib", | ||||
|                     "$ORIGIN/../../nvidia/cufft/lib", | ||||
|                     "$ORIGIN/../../nvidia/curand/lib", | ||||
|                     "$ORIGIN/../../nvidia/cusolver/lib", | ||||
|                     "$ORIGIN/../../nvidia/cusparse/lib", | ||||
|                     "$ORIGIN/../../nvidia/nvtx/lib", | ||||
|                     "$ORIGIN/../../nvidia/cufile/lib", | ||||
|                 ] | ||||
|             ) | ||||
|  | ||||
|         # Add $ORIGIN for local torch libs | ||||
|         rpath = ":".join(cuda_rpaths) + ":$ORIGIN" | ||||
|     else: | ||||
|         # For bundled libraries, just use $ORIGIN | ||||
|         rpath = "$ORIGIN" | ||||
|  | ||||
|     if os.path.exists(lib_path): | ||||
|         os.system( | ||||
|             f"cd {folder}/tmp/torch/lib/; " | ||||
|             f"patchelf --set-rpath '{rpath}' --force-rpath {lib_name}" | ||||
|         ) | ||||
|  | ||||
|  | ||||
| def copy_and_patch_library( | ||||
|     src_path: str, | ||||
|     folder: str, | ||||
|     use_nvidia_pypi_libs: bool = False, | ||||
|     desired_cuda: str = "", | ||||
| ) -> None: | ||||
|     """Copy a library to torch/lib and patch its RPATH""" | ||||
|     if os.path.exists(src_path): | ||||
|         lib_name = os.path.basename(src_path) | ||||
|         shutil.copy2(src_path, f"{folder}/tmp/torch/lib/{lib_name}") | ||||
|         patch_library_rpath(folder, lib_name, use_nvidia_pypi_libs, desired_cuda) | ||||
|  | ||||
|  | ||||
| def package_cuda_wheel(wheel_path, desired_cuda) -> None: | ||||
|     """ | ||||
|     Package the cuda wheel libraries | ||||
|     """ | ||||
|     folder = os.path.dirname(wheel_path) | ||||
|     wheelname = os.path.basename(wheel_path) | ||||
|     os.mkdir(f"{folder}/tmp") | ||||
|     os.system(f"unzip {wheel_path} -d {folder}/tmp") | ||||
|     # Delete original wheel since it will be repackaged | ||||
|     os.system(f"rm {wheel_path}") | ||||
|     libs_to_copy = [ | ||||
|         "/usr/local/cuda/extras/CUPTI/lib64/libcupti.so.12", | ||||
|         "/usr/local/cuda/extras/CUPTI/lib64/libnvperf_host.so", | ||||
|         "/usr/local/cuda/lib64/libcudnn.so.9", | ||||
|         "/usr/local/cuda/lib64/libcublas.so.12", | ||||
|         "/usr/local/cuda/lib64/libcublasLt.so.12", | ||||
|         "/usr/local/cuda/lib64/libcudart.so.12", | ||||
|         "/usr/local/cuda/lib64/libcufft.so.11", | ||||
|         "/usr/local/cuda/lib64/libcusparse.so.12", | ||||
|         "/usr/local/cuda/lib64/libcusparseLt.so.0", | ||||
|         "/usr/local/cuda/lib64/libcusolver.so.11", | ||||
|         "/usr/local/cuda/lib64/libcurand.so.10", | ||||
|         "/usr/local/cuda/lib64/libnccl.so.2", | ||||
|         "/usr/local/cuda/lib64/libnvJitLink.so.12", | ||||
|         "/usr/local/cuda/lib64/libnvrtc.so.12", | ||||
|         "/usr/local/cuda/lib64/libnvshmem_host.so.3", | ||||
|         "/usr/local/cuda/lib64/libcudnn_adv.so.9", | ||||
|         "/usr/local/cuda/lib64/libcudnn_cnn.so.9", | ||||
|         "/usr/local/cuda/lib64/libcudnn_graph.so.9", | ||||
|         "/usr/local/cuda/lib64/libcudnn_ops.so.9", | ||||
|         "/usr/local/cuda/lib64/libcudnn_engines_runtime_compiled.so.9", | ||||
|         "/usr/local/cuda/lib64/libcudnn_engines_precompiled.so.9", | ||||
|         "/usr/local/cuda/lib64/libcudnn_heuristic.so.9", | ||||
|         "/lib64/libgomp.so.1", | ||||
|         "/usr/lib64/libgfortran.so.5", | ||||
|         "/acl/build/libarm_compute.so", | ||||
|         "/acl/build/libarm_compute_graph.so", | ||||
|         "/usr/local/lib/libnvpl_lapack_lp64_gomp.so.0", | ||||
|         "/usr/local/lib/libnvpl_blas_lp64_gomp.so.0", | ||||
|         "/usr/local/lib/libnvpl_lapack_core.so.0", | ||||
|         "/usr/local/lib/libnvpl_blas_core.so.0", | ||||
|     ] | ||||
|  | ||||
|     # Check if we should use PyPI NVIDIA libraries or bundle system libraries | ||||
|     use_nvidia_pypi_libs = os.getenv("USE_NVIDIA_PYPI_LIBS", "0") == "1" | ||||
|  | ||||
|     if use_nvidia_pypi_libs: | ||||
|         print("Using nvidia libs from pypi - skipping CUDA library bundling") | ||||
|         # For PyPI approach, we don't bundle CUDA libraries - they come from PyPI packages | ||||
|         # We only need to bundle non-NVIDIA libraries | ||||
|         minimal_libs_to_copy = [ | ||||
|             "/lib64/libgomp.so.1", | ||||
|             "/usr/lib64/libgfortran.so.5", | ||||
|             "/acl/build/libarm_compute.so", | ||||
|             "/acl/build/libarm_compute_graph.so", | ||||
|             "/usr/local/lib/libnvpl_lapack_lp64_gomp.so.0", | ||||
|             "/usr/local/lib/libnvpl_blas_lp64_gomp.so.0", | ||||
|             "/usr/local/lib/libnvpl_lapack_core.so.0", | ||||
|             "/usr/local/lib/libnvpl_blas_core.so.0", | ||||
|         ] | ||||
|  | ||||
|         # Copy minimal libraries to unzipped_folder/torch/lib | ||||
|         for lib_path in minimal_libs_to_copy: | ||||
|             copy_and_patch_library(lib_path, folder, use_nvidia_pypi_libs, desired_cuda) | ||||
|  | ||||
|         # Patch torch libraries used for searching libraries | ||||
|         torch_libs_to_patch = [ | ||||
|             "libtorch.so", | ||||
|             "libtorch_cpu.so", | ||||
|             "libtorch_cuda.so", | ||||
|             "libtorch_cuda_linalg.so", | ||||
|             "libtorch_global_deps.so", | ||||
|             "libtorch_python.so", | ||||
|             "libtorch_nvshmem.so", | ||||
|             "libc10.so", | ||||
|             "libc10_cuda.so", | ||||
|             "libcaffe2_nvrtc.so", | ||||
|             "libshm.so", | ||||
|         ] | ||||
|         for lib_name in torch_libs_to_patch: | ||||
|             patch_library_rpath(folder, lib_name, use_nvidia_pypi_libs, desired_cuda) | ||||
|     else: | ||||
|         print("Bundling CUDA libraries with wheel") | ||||
|         # Original logic for bundling system CUDA libraries | ||||
|         # Common libraries for all CUDA versions | ||||
|         common_libs = [ | ||||
|             # Non-NVIDIA system libraries | ||||
|             "/lib64/libgomp.so.1", | ||||
|             "/usr/lib64/libgfortran.so.5", | ||||
|             "/acl/build/libarm_compute.so", | ||||
|             "/acl/build/libarm_compute_graph.so", | ||||
|             # Common CUDA libraries (same for all versions) | ||||
|             "/usr/local/lib/libnvpl_lapack_lp64_gomp.so.0", | ||||
|             "/usr/local/lib/libnvpl_blas_lp64_gomp.so.0", | ||||
|             "/usr/local/lib/libnvpl_lapack_core.so.0", | ||||
|             "/usr/local/lib/libnvpl_blas_core.so.0", | ||||
|             "/usr/local/cuda/extras/CUPTI/lib64/libnvperf_host.so", | ||||
|             "/usr/local/cuda/lib64/libcudnn.so.9", | ||||
|             "/usr/local/cuda/lib64/libcusparseLt.so.0", | ||||
|             "/usr/local/cuda/lib64/libcurand.so.10", | ||||
|             "/usr/local/cuda/lib64/libnccl.so.2", | ||||
|             "/usr/local/cuda/lib64/libnvshmem_host.so.3", | ||||
|             "/usr/local/cuda/lib64/libcudnn_adv.so.9", | ||||
|             "/usr/local/cuda/lib64/libcudnn_cnn.so.9", | ||||
|             "/usr/local/cuda/lib64/libcudnn_graph.so.9", | ||||
|             "/usr/local/cuda/lib64/libcudnn_ops.so.9", | ||||
|             "/usr/local/cuda/lib64/libcudnn_engines_runtime_compiled.so.9", | ||||
|             "/usr/local/cuda/lib64/libcudnn_engines_precompiled.so.9", | ||||
|             "/usr/local/cuda/lib64/libcudnn_heuristic.so.9", | ||||
|     if "129" in desired_cuda: | ||||
|         libs_to_copy += [ | ||||
|             "/usr/local/cuda/lib64/libnvrtc-builtins.so.12.9", | ||||
|             "/usr/local/cuda/lib64/libcufile.so.0", | ||||
|             "/usr/local/cuda/lib64/libcufile_rdma.so.1", | ||||
|             "/usr/local/cuda/lib64/libcusparse.so.12", | ||||
|         ] | ||||
|  | ||||
|         # CUDA version-specific libraries | ||||
|         if "13" in desired_cuda: | ||||
|             minor_version = desired_cuda[-1] | ||||
|             version_specific_libs = [ | ||||
|                 "/usr/local/cuda/extras/CUPTI/lib64/libcupti.so.13", | ||||
|                 "/usr/local/cuda/lib64/libcublas.so.13", | ||||
|                 "/usr/local/cuda/lib64/libcublasLt.so.13", | ||||
|                 "/usr/local/cuda/lib64/libcudart.so.13", | ||||
|                 "/usr/local/cuda/lib64/libcufft.so.12", | ||||
|                 "/usr/local/cuda/lib64/libcusolver.so.12", | ||||
|                 "/usr/local/cuda/lib64/libnvJitLink.so.13", | ||||
|                 "/usr/local/cuda/lib64/libnvrtc.so.13", | ||||
|                 f"/usr/local/cuda/lib64/libnvrtc-builtins.so.13.{minor_version}", | ||||
|             ] | ||||
|         elif "12" in desired_cuda: | ||||
|             # Get the last character for libnvrtc-builtins version (e.g., "129" -> "9") | ||||
|             minor_version = desired_cuda[-1] | ||||
|             version_specific_libs = [ | ||||
|                 "/usr/local/cuda/extras/CUPTI/lib64/libcupti.so.12", | ||||
|                 "/usr/local/cuda/lib64/libcublas.so.12", | ||||
|                 "/usr/local/cuda/lib64/libcublasLt.so.12", | ||||
|                 "/usr/local/cuda/lib64/libcudart.so.12", | ||||
|                 "/usr/local/cuda/lib64/libcufft.so.11", | ||||
|                 "/usr/local/cuda/lib64/libcusolver.so.11", | ||||
|                 "/usr/local/cuda/lib64/libnvJitLink.so.12", | ||||
|                 "/usr/local/cuda/lib64/libnvrtc.so.12", | ||||
|                 f"/usr/local/cuda/lib64/libnvrtc-builtins.so.12.{minor_version}", | ||||
|             ] | ||||
|         else: | ||||
|             raise ValueError(f"Unsupported CUDA version: {desired_cuda}.") | ||||
|  | ||||
|         # Combine all libraries | ||||
|         libs_to_copy = common_libs + version_specific_libs | ||||
|  | ||||
|         # Copy libraries to unzipped_folder/torch/lib | ||||
|         for lib_path in libs_to_copy: | ||||
|             copy_and_patch_library(lib_path, folder, use_nvidia_pypi_libs, desired_cuda) | ||||
|     # Copy libraries to unzipped_folder/a/lib | ||||
|     for lib_path in libs_to_copy: | ||||
|         lib_name = os.path.basename(lib_path) | ||||
|         shutil.copy2(lib_path, f"{folder}/tmp/torch/lib/{lib_name}") | ||||
|         os.system( | ||||
|             f"cd {folder}/tmp/torch/lib/; " | ||||
|             f"patchelf --set-rpath '$ORIGIN' --force-rpath {folder}/tmp/torch/lib/{lib_name}" | ||||
|         ) | ||||
|  | ||||
|     # Make sure the wheel is tagged with manylinux_2_28 | ||||
|     for f in os.scandir(f"{folder}/tmp/"): | ||||
| @ -256,8 +132,14 @@ def package_cuda_wheel(wheel_path, desired_cuda) -> None: | ||||
|             replace_tag(f"{f.path}/WHEEL") | ||||
|             break | ||||
|  | ||||
|     os.system(f"wheel pack {folder}/tmp/ -d {folder}") | ||||
|     os.system(f"rm -rf {folder}/tmp/") | ||||
|     os.mkdir(f"{folder}/cuda_wheel") | ||||
|     os.system(f"cd {folder}/tmp/; zip -r {folder}/cuda_wheel/{wheelname} *") | ||||
|     shutil.move( | ||||
|         f"{folder}/cuda_wheel/{wheelname}", | ||||
|         f"{folder}/{wheelname}", | ||||
|         copy_function=shutil.copy2, | ||||
|     ) | ||||
|     os.system(f"rm -rf {folder}/tmp/ {folder}/cuda_wheel/") | ||||
|  | ||||
|  | ||||
| def complete_wheel(folder: str) -> str: | ||||
| @ -280,7 +162,14 @@ def complete_wheel(folder: str) -> str: | ||||
|             f"/{folder}/dist/{repaired_wheel_name}", | ||||
|         ) | ||||
|     else: | ||||
|         repaired_wheel_name = list_dir(f"/{folder}/dist")[0] | ||||
|         repaired_wheel_name = wheel_name.replace( | ||||
|             "linux_aarch64", "manylinux_2_28_aarch64" | ||||
|         ) | ||||
|         print(f"Renaming {wheel_name} wheel to {repaired_wheel_name}") | ||||
|         os.rename( | ||||
|             f"/{folder}/dist/{wheel_name}", | ||||
|             f"/{folder}/dist/{repaired_wheel_name}", | ||||
|         ) | ||||
|  | ||||
|     print(f"Copying {repaired_wheel_name} to artifacts") | ||||
|     shutil.copy2( | ||||
| @ -317,21 +206,11 @@ if __name__ == "__main__": | ||||
|     ).decode() | ||||
|  | ||||
|     print("Building PyTorch wheel") | ||||
|     build_vars = "" | ||||
|     build_vars = "CMAKE_SHARED_LINKER_FLAGS=-Wl,-z,max-page-size=0x10000 " | ||||
|     # MAX_JOB=5 is not required for CPU backend (see commit 465d98b) | ||||
|     if enable_cuda: | ||||
|         build_vars += "MAX_JOBS=5 " | ||||
|  | ||||
|         # Handle PyPI NVIDIA libraries vs bundled libraries | ||||
|         use_nvidia_pypi_libs = os.getenv("USE_NVIDIA_PYPI_LIBS", "0") == "1" | ||||
|         if use_nvidia_pypi_libs: | ||||
|             print("Configuring build for PyPI NVIDIA libraries") | ||||
|             # Configure for dynamic linking (matching x86 logic) | ||||
|             build_vars += "ATEN_STATIC_CUDA=0 USE_CUDA_STATIC_LINK=0 USE_CUPTI_SO=1 " | ||||
|         else: | ||||
|             print("Configuring build for bundled NVIDIA libraries") | ||||
|             # Keep existing static linking approach - already configured above | ||||
|  | ||||
|     override_package_version = os.getenv("OVERRIDE_PACKAGE_VERSION") | ||||
|     desired_cuda = os.getenv("DESIRED_CUDA") | ||||
|     if override_package_version is not None: | ||||
|  | ||||
| @ -241,7 +241,7 @@ def wait_for_connection(addr, port, timeout=15, attempt_cnt=5): | ||||
|         try: | ||||
|             with socket.create_connection((addr, port), timeout=timeout): | ||||
|                 return | ||||
|         except (ConnectionRefusedError, TimeoutError):  # noqa: PERF203 | ||||
|         except (ConnectionRefusedError, socket.timeout):  # noqa: PERF203 | ||||
|             if i == attempt_cnt - 1: | ||||
|                 raise | ||||
|             time.sleep(timeout) | ||||
|  | ||||
| @ -120,8 +120,8 @@ If your new Docker image needs a library installed from a specific pinned commit | ||||
|    If you're introducing a new argument to the Docker build, make sure to add it in the Docker build step in `.ci/docker/build.sh`: | ||||
|    ```bash | ||||
|    docker build \ | ||||
|      .... | ||||
|      --build-arg "NEW_ARG_1=${NEW_ARG_1}" | ||||
|       .... | ||||
|       --build-arg "NEW_ARG_1=${NEW_ARG_1}" | ||||
|    ``` | ||||
|  | ||||
| 3. **Update Dockerfile logic**: | ||||
|  | ||||
| @ -81,8 +81,8 @@ elif [[ "$image" == *riscv* ]]; then | ||||
|   DOCKERFILE="ubuntu-cross-riscv/Dockerfile" | ||||
| fi | ||||
|  | ||||
| _UCX_COMMIT=7836b165abdbe468a2f607e7254011c07d788152 | ||||
| _UCC_COMMIT=430e241bf5d38cbc73fc7a6b89155397232e3f96 | ||||
| _UCX_COMMIT=7bb2722ff2187a0cad557ae4a6afa090569f83fb | ||||
| _UCC_COMMIT=20eae37090a4ce1b32bcce6144ccad0b49943e0b | ||||
| if [[ "$image" == *rocm* ]]; then | ||||
|   _UCX_COMMIT=cc312eaa4655c0cc5c2bcd796db938f90563bcf6 | ||||
|   _UCC_COMMIT=0c0fc21559835044ab107199e334f7157d6a0d3d | ||||
| @ -114,19 +114,31 @@ case "$tag" in | ||||
|     UCC_COMMIT=${_UCC_COMMIT} | ||||
|     TRITON=yes | ||||
|     ;; | ||||
|   pytorch-linux-jammy-cuda13.0-cudnn9-py3-gcc11) | ||||
|     CUDA_VERSION=13.0.0 | ||||
|   pytorch-linux-jammy-cuda12.8-cudnn9-py3-gcc9-inductor-benchmarks) | ||||
|     CUDA_VERSION=12.8.1 | ||||
|     ANACONDA_PYTHON_VERSION=3.10 | ||||
|     GCC_VERSION=11 | ||||
|     GCC_VERSION=9 | ||||
|     VISION=yes | ||||
|     KATEX=yes | ||||
|     UCX_COMMIT=${_UCX_COMMIT} | ||||
|     UCC_COMMIT=${_UCC_COMMIT} | ||||
|     TRITON=yes | ||||
|     INDUCTOR_BENCHMARKS=yes | ||||
|     ;; | ||||
|   pytorch-linux-jammy-cuda12.8-cudnn9-py3-gcc9-inductor-benchmarks) | ||||
|   pytorch-linux-jammy-cuda12.8-cudnn9-py3.12-gcc9-inductor-benchmarks) | ||||
|     CUDA_VERSION=12.8.1 | ||||
|     ANACONDA_PYTHON_VERSION=3.10 | ||||
|     ANACONDA_PYTHON_VERSION=3.12 | ||||
|     GCC_VERSION=9 | ||||
|     VISION=yes | ||||
|     KATEX=yes | ||||
|     UCX_COMMIT=${_UCX_COMMIT} | ||||
|     UCC_COMMIT=${_UCC_COMMIT} | ||||
|     TRITON=yes | ||||
|     INDUCTOR_BENCHMARKS=yes | ||||
|     ;; | ||||
|   pytorch-linux-jammy-cuda12.8-cudnn9-py3.13-gcc9-inductor-benchmarks) | ||||
|     CUDA_VERSION=12.8.1 | ||||
|     ANACONDA_PYTHON_VERSION=3.13 | ||||
|     GCC_VERSION=9 | ||||
|     VISION=yes | ||||
|     KATEX=yes | ||||
| @ -161,8 +173,8 @@ case "$tag" in | ||||
|     VISION=yes | ||||
|     ONNX=yes | ||||
|     ;; | ||||
|   pytorch-linux-jammy-py3.10-clang12) | ||||
|     ANACONDA_PYTHON_VERSION=3.10 | ||||
|   pytorch-linux-jammy-py3.9-clang12) | ||||
|     ANACONDA_PYTHON_VERSION=3.9 | ||||
|     CLANG_VERSION=12 | ||||
|     VISION=yes | ||||
|     TRITON=yes | ||||
| @ -197,24 +209,24 @@ case "$tag" in | ||||
|     UCC_COMMIT=${_UCC_COMMIT} | ||||
|     PYTORCH_ROCM_ARCH="gfx90a;gfx942;gfx950" | ||||
|     ;; | ||||
|   pytorch-linux-jammy-xpu-n-1-py3) | ||||
|     ANACONDA_PYTHON_VERSION=3.10 | ||||
|   pytorch-linux-jammy-xpu-2025.0-py3) | ||||
|     ANACONDA_PYTHON_VERSION=3.9 | ||||
|     GCC_VERSION=11 | ||||
|     VISION=yes | ||||
|     XPU_VERSION=2025.0 | ||||
|     NINJA_VERSION=1.9.0 | ||||
|     TRITON=yes | ||||
|     ;; | ||||
|   pytorch-linux-jammy-xpu-2025.1-py3) | ||||
|     ANACONDA_PYTHON_VERSION=3.9 | ||||
|     GCC_VERSION=11 | ||||
|     VISION=yes | ||||
|     XPU_VERSION=2025.1 | ||||
|     NINJA_VERSION=1.9.0 | ||||
|     TRITON=yes | ||||
|     ;; | ||||
|   pytorch-linux-jammy-xpu-n-py3) | ||||
|     ANACONDA_PYTHON_VERSION=3.10 | ||||
|     GCC_VERSION=11 | ||||
|     VISION=yes | ||||
|     XPU_VERSION=2025.2 | ||||
|     NINJA_VERSION=1.9.0 | ||||
|     TRITON=yes | ||||
|     ;; | ||||
|   pytorch-linux-jammy-py3-gcc11-inductor-benchmarks) | ||||
|     ANACONDA_PYTHON_VERSION=3.10 | ||||
|   pytorch-linux-jammy-py3.9-gcc11-inductor-benchmarks) | ||||
|     ANACONDA_PYTHON_VERSION=3.9 | ||||
|     GCC_VERSION=11 | ||||
|     VISION=yes | ||||
|     KATEX=yes | ||||
| @ -222,8 +234,8 @@ case "$tag" in | ||||
|     DOCS=yes | ||||
|     INDUCTOR_BENCHMARKS=yes | ||||
|     ;; | ||||
|   pytorch-linux-jammy-cuda12.8-cudnn9-py3.10-clang12) | ||||
|     ANACONDA_PYTHON_VERSION=3.10 | ||||
|   pytorch-linux-jammy-cuda12.8-cudnn9-py3.9-clang12) | ||||
|     ANACONDA_PYTHON_VERSION=3.9 | ||||
|     CUDA_VERSION=12.8.1 | ||||
|     CLANG_VERSION=12 | ||||
|     VISION=yes | ||||
| @ -234,8 +246,8 @@ case "$tag" in | ||||
|     CLANG_VERSION=18 | ||||
|     VISION=yes | ||||
|     ;; | ||||
|   pytorch-linux-jammy-py3.10-gcc11) | ||||
|     ANACONDA_PYTHON_VERSION=3.10 | ||||
|   pytorch-linux-jammy-py3.9-gcc11) | ||||
|     ANACONDA_PYTHON_VERSION=3.9 | ||||
|     GCC_VERSION=11 | ||||
|     VISION=yes | ||||
|     KATEX=yes | ||||
| @ -262,10 +274,13 @@ case "$tag" in | ||||
|     TRITON_CPU=yes | ||||
|     ;; | ||||
|   pytorch-linux-jammy-linter) | ||||
|     PYTHON_VERSION=3.10 | ||||
|     # TODO: Use 3.9 here because of this issue https://github.com/python/mypy/issues/13627. | ||||
|     # We will need to update mypy version eventually, but that's for another day. The task | ||||
|     # would be to upgrade mypy to 1.0.0 with Python 3.11 | ||||
|     PYTHON_VERSION=3.9 | ||||
|     ;; | ||||
|   pytorch-linux-jammy-cuda12.8-cudnn9-py3.10-linter) | ||||
|     PYTHON_VERSION=3.10 | ||||
|   pytorch-linux-jammy-cuda12.8-cudnn9-py3.9-linter) | ||||
|     PYTHON_VERSION=3.9 | ||||
|     CUDA_VERSION=12.8.1 | ||||
|     ;; | ||||
|   pytorch-linux-jammy-aarch64-py3.10-gcc11) | ||||
|  | ||||
| @ -56,13 +56,9 @@ ENV INSTALLED_VISION ${VISION} | ||||
|  | ||||
| # Install rocm | ||||
| ARG ROCM_VERSION | ||||
| RUN mkdir ci_commit_pins | ||||
| COPY ./common/common_utils.sh common_utils.sh | ||||
| COPY ./ci_commit_pins/rocm-composable-kernel.txt ci_commit_pins/rocm-composable-kernel.txt | ||||
| COPY ./common/install_rocm.sh install_rocm.sh | ||||
| RUN bash ./install_rocm.sh | ||||
| RUN rm install_rocm.sh common_utils.sh | ||||
| RUN rm -r ci_commit_pins | ||||
| RUN rm install_rocm.sh | ||||
| COPY ./common/install_rocm_magma.sh install_rocm_magma.sh | ||||
| RUN bash ./install_rocm_magma.sh ${ROCM_VERSION} | ||||
| RUN rm install_rocm_magma.sh | ||||
|  | ||||
| @ -1 +1 @@ | ||||
| e0dda9059d082537cee36be6c5e4fe3b18c880c0 | ||||
| 56392aa978594cc155fa8af48cd949f5b5f1823a | ||||
|  | ||||
| @ -1,2 +1,2 @@ | ||||
| transformers==4.56.0 | ||||
| transformers==4.54.0 | ||||
| soxr==0.5.0 | ||||
|  | ||||
| @ -1 +0,0 @@ | ||||
| 7fe50dc3da2069d6645d9deb8c017a876472a977 | ||||
| @ -1 +1 @@ | ||||
| 74a23feff57432129df84d8099e622773cf77925 | ||||
| e03a63be43e33596f7f0a43b0f530353785e4a59 | ||||
|  | ||||
| @ -1 +1 @@ | ||||
| 1b0418a9a454b2b93ab8d71f40e59d2297157fae | ||||
| 0958dc9b2bb815e428f721f9da599dab0dc1c5d7 | ||||
|  | ||||
| @ -1 +1 @@ | ||||
| bbb06c0334a6772b92d24bde54956e675c8c6604 | ||||
| f7888497a1eb9e98d4c07537f0d0bcfe180d1363 | ||||
|  | ||||
| @ -83,9 +83,9 @@ function build_cpython { | ||||
|         py_suffix=${py_ver::-1} | ||||
|         py_folder=$py_suffix | ||||
|     fi | ||||
|     # Update to rc2 due to https://github.com/python/cpython/commit/c72699086fe4 | ||||
|     # Only b3 is available now | ||||
|     if [ "$py_suffix" == "3.14.0" ]; then | ||||
|         py_suffix="3.14.0rc2" | ||||
|         py_suffix="3.14.0b3" | ||||
|     fi | ||||
|     wget -q $PYTHON_DOWNLOAD_URL/$py_folder/Python-$py_suffix.tgz -O Python-$py_ver.tgz | ||||
|     do_cpython_build $py_ver Python-$py_suffix | ||||
|  | ||||
| @ -10,7 +10,7 @@ else | ||||
|   arch_path='sbsa' | ||||
| fi | ||||
|  | ||||
| NVSHMEM_VERSION=3.3.24 | ||||
| NVSHMEM_VERSION=3.3.20 | ||||
|  | ||||
| function install_cuda { | ||||
|   version=$1 | ||||
| @ -65,7 +65,7 @@ function install_nvshmem { | ||||
|   # This pattern is a lie as it is not consistent across versions, for 3.3.9 it was cuda_ver-arch-nvshhem-ver | ||||
|   filename="libnvshmem-linux-${arch_path}-${nvshmem_version}_cuda${cuda_major_version}-archive" | ||||
|   suffix=".tar.xz" | ||||
|   url="https://developer.download.nvidia.com/compute/nvshmem/redist/libnvshmem/linux-${arch_path}/${filename}${suffix}" | ||||
|   url="https://developer.download.nvidia.com/compute/redist/nvshmem/${nvshmem_version}/builds/cuda${cuda_major_version}/txz/agnostic/${dl_arch}/${filename}${suffix}" | ||||
|  | ||||
|   # download, unpack, install | ||||
|   wget -q "${url}" | ||||
| @ -147,7 +147,8 @@ function install_128 { | ||||
| } | ||||
|  | ||||
| function install_130 { | ||||
|   CUDNN_VERSION=9.13.0.50 | ||||
|   CUDNN_VERSION=9.12.0.46 | ||||
|   NVSHMEM_VERSION=3.3.20 | ||||
|   echo "Installing CUDA 13.0 and cuDNN ${CUDNN_VERSION} and NVSHMEM and NCCL and cuSparseLt-0.7.1" | ||||
|   # install CUDA 13.0 in the same container | ||||
|   install_cuda 13.0.0 cuda_13.0.0_580.65.06_linux | ||||
|  | ||||
| @ -42,27 +42,22 @@ install_pip_dependencies() { | ||||
|   # A workaround, ExecuTorch has moved to numpy 2.0 which is not compatible with the current | ||||
|   # numba and scipy version used in PyTorch CI | ||||
|   conda_run pip uninstall -y numba scipy | ||||
|   # Yaspin is needed for running CI test (get_benchmark_analysis_data.py) | ||||
|   pip_install yaspin==3.1.0 | ||||
|  | ||||
|   popd | ||||
| } | ||||
|  | ||||
| setup_executorch() { | ||||
|   pushd executorch | ||||
|  | ||||
|   export PYTHON_EXECUTABLE=python | ||||
|   export CMAKE_ARGS="-DEXECUTORCH_BUILD_PYBIND=ON -DEXECUTORCH_BUILD_XNNPACK=ON -DEXECUTORCH_BUILD_KERNELS_QUANTIZED=ON -DEXECUTORCH_BUILD_TESTS=ON" | ||||
|   export CMAKE_ARGS="-DEXECUTORCH_BUILD_PYBIND=ON -DEXECUTORCH_BUILD_XNNPACK=ON -DEXECUTORCH_BUILD_KERNELS_QUANTIZED=ON" | ||||
|  | ||||
|   as_jenkins .ci/scripts/setup-linux.sh --build-tool cmake || true | ||||
|   popd | ||||
| } | ||||
|  | ||||
| if [ $# -eq 0 ]; then | ||||
|   clone_executorch | ||||
|   install_buck2 | ||||
|   install_conda_dependencies | ||||
|   install_pip_dependencies | ||||
|   pushd executorch | ||||
|   setup_executorch | ||||
|   popd | ||||
| else | ||||
|   "$@" | ||||
| fi | ||||
| clone_executorch | ||||
| install_buck2 | ||||
| install_conda_dependencies | ||||
| install_pip_dependencies | ||||
| setup_executorch | ||||
|  | ||||
| @ -2,11 +2,6 @@ | ||||
|  | ||||
| set -ex | ||||
|  | ||||
| # for pip_install function | ||||
| source "$(dirname "${BASH_SOURCE[0]}")/common_utils.sh" | ||||
|  | ||||
| ROCM_COMPOSABLE_KERNEL_VERSION="$(cat $(dirname $0)/../ci_commit_pins/rocm-composable-kernel.txt)" | ||||
|  | ||||
| ver() { | ||||
|     printf "%3d%03d%03d%03d" $(echo "$1" | tr '.' ' '); | ||||
| } | ||||
| @ -118,8 +113,6 @@ EOF | ||||
|         rm -rf HIP clr | ||||
|     fi | ||||
|  | ||||
|     pip_install "git+https://github.com/rocm/composable_kernel@$ROCM_COMPOSABLE_KERNEL_VERSION" | ||||
|  | ||||
|     # Cleanup | ||||
|     apt-get autoclean && apt-get clean | ||||
|     rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* | ||||
| @ -183,8 +176,6 @@ install_centos() { | ||||
|       sqlite3 $kdb "PRAGMA journal_mode=off; PRAGMA VACUUM;" | ||||
|   done | ||||
|  | ||||
|   pip_install "git+https://github.com/rocm/composable_kernel@$ROCM_COMPOSABLE_KERNEL_VERSION" | ||||
|  | ||||
|   # Cleanup | ||||
|   yum clean all | ||||
|   rm -rf /var/cache/yum | ||||
|  | ||||
| @ -57,7 +57,7 @@ if [ ! -f setup.py ]; then | ||||
|   cd python | ||||
| fi | ||||
|  | ||||
| pip_install pybind11==3.0.1 | ||||
| pip_install pybind11==2.13.6 | ||||
|  | ||||
| # TODO: remove patch setup.py once we have a proper fix for https://github.com/triton-lang/triton/issues/4527 | ||||
| as_jenkins sed -i -e 's/https:\/\/tritonlang.blob.core.windows.net\/llvm-builds/https:\/\/oaitriton.blob.core.windows.net\/public\/llvm-builds/g' setup.py | ||||
|  | ||||
| @ -44,12 +44,8 @@ function install_ucc() { | ||||
|  | ||||
|   ./autogen.sh | ||||
|  | ||||
|   if [[ -n "$CUDA_VERSION"  && $CUDA_VERSION == 13* ]]; then | ||||
|     NVCC_GENCODE="-gencode=arch=compute_86,code=compute_86" | ||||
|   else | ||||
|     # We only run distributed tests on Tesla M60 and A10G | ||||
|     NVCC_GENCODE="-gencode=arch=compute_52,code=sm_52 -gencode=arch=compute_86,code=compute_86" | ||||
|   fi | ||||
|   # We only run distributed tests on Tesla M60 and A10G | ||||
|   NVCC_GENCODE="-gencode=arch=compute_52,code=sm_52 -gencode=arch=compute_86,code=compute_86" | ||||
|  | ||||
|   if [[ -n "$ROCM_VERSION" ]]; then | ||||
|     if [[ -n "$PYTORCH_ROCM_ARCH" ]]; then | ||||
|  | ||||
| @ -65,14 +65,10 @@ function install_ubuntu() { | ||||
|  | ||||
| function install_rhel() { | ||||
|     . /etc/os-release | ||||
|     if [[ "${ID}" == "rhel" ]]; then | ||||
|         if [[ ! " 8.8 8.9 9.0 9.2 9.3 " =~ " ${VERSION_ID} " ]]; then | ||||
|             echo "RHEL version ${VERSION_ID} not supported" | ||||
|             exit | ||||
|         fi | ||||
|     elif [[ "${ID}" == "almalinux" ]]; then | ||||
|         # Workaround for almalinux8 which used by quay.io/pypa/manylinux_2_28_x86_64 | ||||
|         VERSION_ID="8.8" | ||||
|  | ||||
|     if [[ ! " 8.8 8.10 9.0 9.2 9.3 " =~ " ${VERSION_ID} " ]]; then | ||||
|         echo "RHEL version ${VERSION_ID} not supported" | ||||
|         exit | ||||
|     fi | ||||
|  | ||||
|     dnf install -y 'dnf-command(config-manager)' | ||||
| @ -150,11 +146,11 @@ if [[ "${XPU_DRIVER_TYPE,,}" == "lts" ]]; then | ||||
|     XPU_DRIVER_VERSION="/lts/2350" | ||||
| fi | ||||
|  | ||||
| # Default use Intel® oneAPI Deep Learning Essentials 2025.1 | ||||
| if [[ "$XPU_VERSION" == "2025.2" ]]; then | ||||
|     XPU_PACKAGES="intel-deep-learning-essentials-2025.2" | ||||
| else | ||||
| # Default use Intel® oneAPI Deep Learning Essentials 2025.0 | ||||
| if [[ "$XPU_VERSION" == "2025.1" ]]; then | ||||
|     XPU_PACKAGES="intel-deep-learning-essentials-2025.1" | ||||
| else | ||||
|     XPU_PACKAGES="intel-deep-learning-essentials-2025.0" | ||||
| fi | ||||
|  | ||||
| # The installation depends on the base OS | ||||
|  | ||||
| @ -74,14 +74,6 @@ RUN bash ./install_cuda.sh 13.0 | ||||
| RUN bash ./install_magma.sh 13.0 | ||||
| RUN ln -sf /usr/local/cuda-13.0 /usr/local/cuda | ||||
|  | ||||
| # Install libibverbs for libtorch and copy to CUDA directory | ||||
| RUN apt-get update -y && \ | ||||
|     apt-get install -y libibverbs-dev librdmacm-dev && \ | ||||
|     cp /usr/lib/x86_64-linux-gnu/libmlx5.so* /usr/local/cuda/lib64/ && \ | ||||
|     cp /usr/lib/x86_64-linux-gnu/librdmacm.so* /usr/local/cuda/lib64/ && \ | ||||
|     cp /usr/lib/x86_64-linux-gnu/libibverbs.so* /usr/local/cuda/lib64/ && \ | ||||
|     cp /usr/lib/x86_64-linux-gnu/libnl* /usr/local/cuda/lib64/ | ||||
|  | ||||
| FROM cpu as rocm | ||||
| ARG ROCM_VERSION | ||||
| ARG PYTORCH_ROCM_ARCH | ||||
|  | ||||
| @ -175,6 +175,6 @@ ENV XPU_DRIVER_TYPE ROLLING | ||||
| RUN python3 -m pip install --upgrade pip && \ | ||||
|     python3 -mpip install cmake==3.28.4 | ||||
| ADD ./common/install_xpu.sh install_xpu.sh | ||||
| ENV XPU_VERSION 2025.2 | ||||
| ENV XPU_VERSION 2025.1 | ||||
| RUN bash ./install_xpu.sh && rm install_xpu.sh | ||||
| RUN pushd /opt/_internal && tar -xJf static-libs-for-embedding-only.tar.xz && popd | ||||
|  | ||||
| @ -93,9 +93,8 @@ librosa==0.10.2 ; python_version == "3.12" and platform_machine != "s390x" | ||||
| #Pinned versions: | ||||
| #test that import: | ||||
|  | ||||
| mypy==1.16.0 ; platform_system != "Windows" | ||||
| mypy==1.16.0 | ||||
| # Pin MyPy version because new errors are likely to appear with each release | ||||
| # Skip on Windows as lots of type annotations are POSIX specific | ||||
| #Description: linter | ||||
| #Pinned versions: 1.16.0 | ||||
| #test that import: test_typing.py, test_type_hints.py | ||||
| @ -380,7 +379,7 @@ dataclasses_json==0.6.7 | ||||
| cmake==4.0.0 | ||||
| #Description: required for building | ||||
|  | ||||
| tlparse==0.4.0 | ||||
| tlparse==0.3.30 | ||||
| #Description: required for log parsing | ||||
|  | ||||
| cuda-bindings>=12.0,<13.0 ; platform_machine != "s390x" | ||||
|  | ||||
| @ -1,7 +1,7 @@ | ||||
| sphinx==5.3.0 | ||||
| #Description: This is used to generate PyTorch docs | ||||
| #Pinned versions: 5.3.0 | ||||
| -e git+https://github.com/pytorch/pytorch_sphinx_theme.git@d53b0ffb9b1cda68260693ea98f3483823c88d8e#egg=pytorch_sphinx_theme2 | ||||
| -e git+https://github.com/pytorch/pytorch_sphinx_theme.git@722b7e6f9ca512fcc526ad07d62b3d28c50bb6cd#egg=pytorch_sphinx_theme2 | ||||
|  | ||||
| # TODO: sphinxcontrib.katex 0.9.0 adds a local KaTeX server to speed up pre-rendering | ||||
| # but it doesn't seem to work and hangs around idly. The initial thought that it is probably | ||||
|  | ||||
| @ -1 +1 @@ | ||||
| 3.5.0 | ||||
| 3.4.0 | ||||
|  | ||||
| @ -1 +1 @@ | ||||
| 3.5.0 | ||||
| 3.4.0 | ||||
|  | ||||
| @ -52,13 +52,9 @@ ENV INSTALLED_VISION ${VISION} | ||||
|  | ||||
| # Install rocm | ||||
| ARG ROCM_VERSION | ||||
| RUN mkdir ci_commit_pins | ||||
| COPY ./common/common_utils.sh common_utils.sh | ||||
| COPY ./ci_commit_pins/rocm-composable-kernel.txt ci_commit_pins/rocm-composable-kernel.txt | ||||
| COPY ./common/install_rocm.sh install_rocm.sh | ||||
| RUN bash ./install_rocm.sh | ||||
| RUN rm install_rocm.sh common_utils.sh | ||||
| RUN rm -r ci_commit_pins | ||||
| RUN rm install_rocm.sh | ||||
| COPY ./common/install_rocm_magma.sh install_rocm_magma.sh | ||||
| RUN bash ./install_rocm_magma.sh ${ROCM_VERSION} | ||||
| RUN rm install_rocm_magma.sh | ||||
|  | ||||
| @ -66,7 +66,6 @@ ENV NCCL_LIB_DIR="/usr/local/cuda/lib64/" | ||||
| # (optional) Install UCC | ||||
| ARG UCX_COMMIT | ||||
| ARG UCC_COMMIT | ||||
| ARG CUDA_VERSION | ||||
| ENV UCX_COMMIT $UCX_COMMIT | ||||
| ENV UCC_COMMIT $UCC_COMMIT | ||||
| ENV UCX_HOME /usr | ||||
|  | ||||
| @ -7,4 +7,4 @@ set -ex | ||||
|  | ||||
| SCRIPTPATH="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" | ||||
|  | ||||
| USE_NVSHMEM=0 USE_CUSPARSELT=0 BUILD_PYTHONLESS=1 DESIRED_PYTHON="3.10" ${SCRIPTPATH}/../manywheel/build.sh | ||||
| USE_NVSHMEM=0 USE_CUSPARSELT=0 BUILD_PYTHONLESS=1 DESIRED_PYTHON="3.9" ${SCRIPTPATH}/../manywheel/build.sh | ||||
|  | ||||
| @ -1,143 +0,0 @@ | ||||
| from __future__ import annotations | ||||
|  | ||||
| import logging | ||||
| import os | ||||
| import textwrap | ||||
| from pathlib import Path | ||||
| from typing import TYPE_CHECKING | ||||
|  | ||||
| from cli.lib.common.utils import get_wheels | ||||
| from jinja2 import Template | ||||
|  | ||||
|  | ||||
| if TYPE_CHECKING: | ||||
|     from collections.abc import Iterable, Mapping | ||||
|  | ||||
|  | ||||
| logger = logging.getLogger(__name__) | ||||
|  | ||||
| _TPL_CONTENT = Template( | ||||
|     textwrap.dedent("""\ | ||||
|     ## {{ title }} | ||||
|  | ||||
|     ```{{ lang }} | ||||
|     {{ content }} | ||||
|     ``` | ||||
| """) | ||||
| ) | ||||
|  | ||||
| _TPL_LIST_ITEMS = Template( | ||||
|     textwrap.dedent("""\ | ||||
|     ## {{ title }} | ||||
|     {% for it in items %} | ||||
|     - {{ it.pkg }}: {{ it.relpath }} | ||||
|     {% else %} | ||||
|     _(no item found)_ | ||||
|     {% endfor %} | ||||
|     """) | ||||
| ) | ||||
|  | ||||
| _TPL_TABLE = Template( | ||||
|     textwrap.dedent("""\ | ||||
|     {%- if rows %} | ||||
|     | {{ cols | join(' | ') }} | | ||||
|     |{%- for _ in cols %} --- |{%- endfor %} | ||||
|     {%- for r in rows %} | ||||
|     | {%- for c in cols %} {{ r.get(c, "") }} |{%- endfor %} | ||||
|     {%- endfor %} | ||||
|     {%- else %} | ||||
|     _(no data)_ | ||||
|     {%- endif %} | ||||
| """) | ||||
| ) | ||||
|  | ||||
|  | ||||
| def gh_summary_path() -> Path | None: | ||||
|     """Return the Path to the GitHub step summary file, or None if not set.""" | ||||
|     p = os.environ.get("GITHUB_STEP_SUMMARY") | ||||
|     return Path(p) if p else None | ||||
|  | ||||
|  | ||||
| def write_gh_step_summary(md: str, *, append_content: bool = True) -> bool: | ||||
|     """ | ||||
|     Write Markdown content to the GitHub Step Summary file if GITHUB_STEP_SUMMARY is set. | ||||
|     append_content: default true, if True, append to the end of the file, else overwrite the whole file | ||||
|  | ||||
|     Returns: | ||||
|         True if written successfully (in GitHub Actions environment), | ||||
|         False if skipped (e.g., running locally where the variable is not set). | ||||
|     """ | ||||
|     sp = gh_summary_path() | ||||
|     if not sp: | ||||
|         logger.info("[gh-summary] GITHUB_STEP_SUMMARY not set, skipping write.") | ||||
|         return False | ||||
|  | ||||
|     md_clean = textwrap.dedent(md).strip() + "\n" | ||||
|  | ||||
|     mode = "a" if append_content else "w" | ||||
|     with sp.open(mode, encoding="utf-8") as f: | ||||
|         f.write(md_clean) | ||||
|     return True | ||||
|  | ||||
|  | ||||
| def md_heading(text: str, level: int = 2) -> str: | ||||
|     """Generate a Markdown heading string with the given level (1-6).""" | ||||
|     return f"{'#' * max(1, min(level, 6))} {text}\n" | ||||
|  | ||||
|  | ||||
| def md_details(summary: str, content: str) -> str: | ||||
|     """Generate a collapsible <details> block with a summary and inner content.""" | ||||
|     return f"<details>\n<summary>{summary}</summary>\n\n{content}\n\n</details>\n" | ||||
|  | ||||
|  | ||||
| def summarize_content_from_file( | ||||
|     output_dir: Path, | ||||
|     freeze_file: str, | ||||
|     title: str = "Content from file", | ||||
|     code_lang: str = "",  # e.g. "text" or "ini" | ||||
| ) -> bool: | ||||
|     f = Path(output_dir) / freeze_file | ||||
|     if not f.exists(): | ||||
|         return False | ||||
|     content = f.read_text(encoding="utf-8").strip() | ||||
|     md = render_content(content, title=title, lang=code_lang) | ||||
|     return write_gh_step_summary(md) | ||||
|  | ||||
|  | ||||
| def summarize_wheels(path: Path, title: str = "Wheels", max_depth: int = 3): | ||||
|     items = get_wheels(path, max_depth=max_depth) | ||||
|     if not items: | ||||
|         return False | ||||
|     md = render_list(items, title=title) | ||||
|     return write_gh_step_summary(md) | ||||
|  | ||||
|  | ||||
| def md_kv_table(rows: Iterable[Mapping[str, str | int | float]]) -> str: | ||||
|     """ | ||||
|     Render a list of dicts as a Markdown table using Jinja template. | ||||
|     """ | ||||
|     rows = list(rows) | ||||
|     cols = list({k for r in rows for k in r.keys()}) | ||||
|     md = _TPL_TABLE.render(cols=cols, rows=rows).strip() + "\n" | ||||
|     return md | ||||
|  | ||||
|  | ||||
| def render_list( | ||||
|     items: Iterable[str], | ||||
|     *, | ||||
|     title: str = "List", | ||||
| ) -> str: | ||||
|     tpl = _TPL_LIST_ITEMS | ||||
|     md = tpl.render(title=title, items=items) | ||||
|     return md | ||||
|  | ||||
|  | ||||
| def render_content( | ||||
|     content: str, | ||||
|     *, | ||||
|     title: str = "Content", | ||||
|     lang: str = "text", | ||||
| ) -> str: | ||||
|     tpl = _TPL_CONTENT | ||||
|     md = tpl.render(title=title, content=content, lang=lang) | ||||
|     return md | ||||
| @ -45,7 +45,7 @@ def clone_external_repo(target: str, repo: str, dst: str = "", update_submodules | ||||
|  | ||||
|         # Checkout pinned commit | ||||
|         commit = get_post_build_pinned_commit(target) | ||||
|         logger.info("Checking out pinned %s commit %s", target, commit) | ||||
|         logger.info("Checking out pinned commit %s", commit) | ||||
|         r.git.checkout(commit) | ||||
|  | ||||
|         # Update submodules if requested | ||||
| @ -55,7 +55,7 @@ def clone_external_repo(target: str, repo: str, dst: str = "", update_submodules | ||||
|                 sm.update(init=True, recursive=True, progress=PrintProgress()) | ||||
|  | ||||
|         logger.info("Successfully cloned %s", target) | ||||
|         return r, commit | ||||
|         return r | ||||
|  | ||||
|     except GitCommandError as e: | ||||
|         logger.error("Git operation failed: %s", e) | ||||
|  | ||||
| @ -4,7 +4,7 @@ import shlex | ||||
| import shutil | ||||
| import sys | ||||
| from collections.abc import Iterable | ||||
| from importlib.metadata import PackageNotFoundError, version  # noqa: UP035 | ||||
| from importlib.metadata import PackageNotFoundError, version | ||||
| from typing import Optional, Union | ||||
|  | ||||
| from cli.lib.common.utils import run_command | ||||
|  | ||||
| @ -8,7 +8,6 @@ import shlex | ||||
| import subprocess | ||||
| import sys | ||||
| from contextlib import contextmanager | ||||
| from pathlib import Path | ||||
| from typing import Optional | ||||
|  | ||||
|  | ||||
| @ -116,24 +115,3 @@ def working_directory(path: str): | ||||
|         yield | ||||
|     finally: | ||||
|         os.chdir(prev_cwd) | ||||
|  | ||||
|  | ||||
| def get_wheels( | ||||
|     output_dir: Path, | ||||
|     max_depth: Optional[int] = None, | ||||
| ) -> list[str]: | ||||
|     """Return a list of wheels found in the given output directory.""" | ||||
|     root = Path(output_dir) | ||||
|     if not root.exists(): | ||||
|         return [] | ||||
|     items = [] | ||||
|     for dirpath, _, filenames in os.walk(root): | ||||
|         depth = Path(dirpath).relative_to(root).parts | ||||
|         if max_depth is not None and len(depth) > max_depth: | ||||
|             continue | ||||
|         for fname in sorted(filenames): | ||||
|             if fname.endswith(".whl"): | ||||
|                 pkg = fname.split("-")[0] | ||||
|                 relpath = str((Path(dirpath) / fname).relative_to(root)) | ||||
|                 items.append({"pkg": pkg, "relpath": relpath}) | ||||
|     return items | ||||
|  | ||||
| @ -1,27 +1,13 @@ | ||||
| import logging | ||||
| import os | ||||
| import textwrap | ||||
| from typing import Any | ||||
|  | ||||
| from cli.lib.common.gh_summary import write_gh_step_summary | ||||
| from cli.lib.common.git_helper import clone_external_repo | ||||
| from cli.lib.common.pip_helper import pip_install_packages | ||||
| from cli.lib.common.utils import run_command, temp_environ, working_directory | ||||
| from jinja2 import Template | ||||
|  | ||||
|  | ||||
| logger = logging.getLogger(__name__) | ||||
|  | ||||
| _TPL_VLLM_INFO = Template( | ||||
|     textwrap.dedent("""\ | ||||
|     ##  Vllm against Pytorch CI Test Summary | ||||
|     **Vllm Commit**: [{{ vllm_commit }}](https://github.com/vllm-project/vllm/commit/{{ vllm_commit }}) | ||||
|     {%- if torch_sha %} | ||||
|     **Pytorch Commit**: [{{ torch_sha }}](https://github.com/pytorch/pytorch/commit/{{ torch_sha }}) | ||||
|     {%- endif %} | ||||
| """) | ||||
| ) | ||||
|  | ||||
|  | ||||
| def sample_vllm_test_library(): | ||||
|     """ | ||||
| @ -41,6 +27,7 @@ def sample_vllm_test_library(): | ||||
|                 "pytest -v -s basic_correctness/test_cumem.py", | ||||
|                 "pytest -v -s basic_correctness/test_basic_correctness.py", | ||||
|                 "pytest -v -s basic_correctness/test_cpu_offload.py", | ||||
|                 "VLLM_TEST_ENABLE_ARTIFICIAL_PREEMPT=1 pytest -v -s basic_correctness/test_preemption.py", | ||||
|             ], | ||||
|         }, | ||||
|         "vllm_basic_models_test": { | ||||
| @ -67,12 +54,16 @@ def sample_vllm_test_library(): | ||||
|                         "-v", | ||||
|                         "-s", | ||||
|                         "entrypoints/llm", | ||||
|                         "--ignore=entrypoints/llm/test_lazy_outlines.py", | ||||
|                         "--ignore=entrypoints/llm/test_generate.py", | ||||
|                         "--ignore=entrypoints/llm/test_generate_multiple_loras.py", | ||||
|                         "--ignore=entrypoints/llm/test_collective_rpc.py", | ||||
|                     ] | ||||
|                 ), | ||||
|                 "pytest -v -s entrypoints/llm/test_generate.py", | ||||
|                 "pytest -v -s entrypoints/offline_mode", | ||||
|                 "pytest -v -s entrypoints/llm/test_lazy_outlines.py", | ||||
|                 "pytest -v -s entrypoints/llm/test_generate.py ", | ||||
|                 "pytest -v -s entrypoints/llm/test_generate_multiple_loras.py", | ||||
|                 "VLLM_USE_V1=0 pytest -v -s entrypoints/offline_mode", | ||||
|             ], | ||||
|         }, | ||||
|         "vllm_regression_test": { | ||||
| @ -92,24 +83,14 @@ def sample_vllm_test_library(): | ||||
|             "num_gpus": 4, | ||||
|             "steps": [ | ||||
|                 "pytest -v -s -x lora/test_chatglm3_tp.py", | ||||
|                 "echo $VLLM_WORKER_MULTIPROC_METHOD", | ||||
|                 "pytest -v -s -x lora/test_llama_tp.py", | ||||
|                 "pytest -v -s -x lora/test_llm_with_multi_loras.py", | ||||
|                 "pytest -v -s -x lora/test_multi_loras_with_tp.py", | ||||
|             ], | ||||
|         }, | ||||
|         "vllm_distributed_test_28_failure_test": { | ||||
|             "title": "Distributed Tests (2 GPUs) pytorch 2.8 release failure", | ||||
|             "id": "vllm_distributed_test_28_failure_test", | ||||
|             "env_vars": { | ||||
|                 "VLLM_WORKER_MULTIPROC_METHOD": "spawn", | ||||
|             }, | ||||
|             "num_gpus": 4, | ||||
|             "steps": [ | ||||
|                 "pytest -v -s distributed/test_sequence_parallel.py", | ||||
|             ], | ||||
|         }, | ||||
|         "vllm_lora_28_failure_test": { | ||||
|             "title": "LoRA pytorch 2.8 failure test", | ||||
|             "id": "vllm_lora_28_failure_test", | ||||
|         "vllm_lora_280_failure_test": { | ||||
|             "title": "LoRA 280 failure test", | ||||
|             "id": "vllm_lora_280_failure_test", | ||||
|             "steps": ["pytest -v lora/test_quant_model.py"], | ||||
|         }, | ||||
|         "vllm_multi_model_processor_test": { | ||||
| @ -120,15 +101,6 @@ def sample_vllm_test_library(): | ||||
|                 "pytest -v -s models/multimodal/processing --ignore models/multimodal/processing/test_tensor_schema.py", | ||||
|             ], | ||||
|         }, | ||||
|         "vllm_multi_model_test_28_failure_test": { | ||||
|             "title": "Multi-Model Test (Failed 2.8 release)", | ||||
|             "id": "vllm_multi_model_test_28_failure_test", | ||||
|             "package_install": ["git+https://github.com/TIGER-AI-Lab/Mantis.git"], | ||||
|             "steps": [ | ||||
|                 "pytest -v -s models/multimodal/generation/test_voxtral.py", | ||||
|                 "pytest -v -s models/multimodal/pooling", | ||||
|             ], | ||||
|         }, | ||||
|         "vllm_pytorch_compilation_unit_tests": { | ||||
|             "title": "PyTorch Compilation Unit Tests", | ||||
|             "id": "vllm_pytorch_compilation_unit_tests", | ||||
| @ -143,28 +115,6 @@ def sample_vllm_test_library(): | ||||
|                 "pytest -v -s compile/test_decorator.py", | ||||
|             ], | ||||
|         }, | ||||
|         "vllm_languagde_model_test_extended_generation_28_failure_test": { | ||||
|             "title": "Language Models Test (Extended Generation) 2.8 release failure", | ||||
|             "id": "vllm_languagde_model_test_extended_generation_28_failure_test", | ||||
|             "package_install": [ | ||||
|                 "--no-build-isolation", | ||||
|                 "git+https://github.com/Dao-AILab/causal-conv1d@v1.5.0.post8", | ||||
|             ], | ||||
|             "steps": [ | ||||
|                 "pytest -v -s models/language/generation/test_mistral.py", | ||||
|             ], | ||||
|         }, | ||||
|         "vllm_distributed_test_2_gpu_28_failure_test": { | ||||
|             "title": "Distributed Tests (2 GPUs) pytorch 2.8 release failure", | ||||
|             "id": "vllm_distributed_test_2_gpu_28_failure_test", | ||||
|             "env_vars": { | ||||
|                 "VLLM_WORKER_MULTIPROC_METHOD": "spawn", | ||||
|             }, | ||||
|             "num_gpus": 4, | ||||
|             "steps": [ | ||||
|                 "pytest -v -s distributed/test_sequence_parallel.py", | ||||
|             ], | ||||
|         }, | ||||
|         # TODO(elainewy):need to add g6 with 4 gpus to run this test | ||||
|         "vllm_lora_test": { | ||||
|             "title": "LoRA Test %N", | ||||
| @ -264,13 +214,12 @@ def run_test_plan( | ||||
|  | ||||
|  | ||||
| def clone_vllm(dst: str = "vllm"): | ||||
|     _, commit = clone_external_repo( | ||||
|     clone_external_repo( | ||||
|         target="vllm", | ||||
|         repo="https://github.com/vllm-project/vllm.git", | ||||
|         dst=dst, | ||||
|         update_submodules=True, | ||||
|     ) | ||||
|     return commit | ||||
|  | ||||
|  | ||||
| def replace_buildkite_placeholders(step: str, shard_id: int, num_shards: int) -> str: | ||||
| @ -281,12 +230,3 @@ def replace_buildkite_placeholders(step: str, shard_id: int, num_shards: int) -> | ||||
|     for k in sorted(mapping, key=len, reverse=True): | ||||
|         step = step.replace(k, mapping[k]) | ||||
|     return step | ||||
|  | ||||
|  | ||||
| def summarize_build_info(vllm_commit: str) -> bool: | ||||
|     torch_sha = os.getenv("GITHUB_SHA") | ||||
|     md = ( | ||||
|         _TPL_VLLM_INFO.render(vllm_commit=vllm_commit, torch_sha=torch_sha).strip() | ||||
|         + "\n" | ||||
|     ) | ||||
|     return write_gh_step_summary(md) | ||||
|  | ||||
| @ -13,11 +13,6 @@ from cli.lib.common.envs_helper import ( | ||||
|     env_str_field, | ||||
|     with_params_help, | ||||
| ) | ||||
| from cli.lib.common.gh_summary import ( | ||||
|     gh_summary_path, | ||||
|     summarize_content_from_file, | ||||
|     summarize_wheels, | ||||
| ) | ||||
| from cli.lib.common.path_helper import ( | ||||
|     copy, | ||||
|     ensure_dir_exists, | ||||
| @ -26,7 +21,7 @@ from cli.lib.common.path_helper import ( | ||||
|     is_path_exist, | ||||
| ) | ||||
| from cli.lib.common.utils import run_command | ||||
| from cli.lib.core.vllm.lib import clone_vllm, summarize_build_info | ||||
| from cli.lib.core.vllm.lib import clone_vllm | ||||
|  | ||||
|  | ||||
| logger = logging.getLogger(__name__) | ||||
| @ -66,11 +61,6 @@ class VllmBuildParameters: | ||||
|         "DOCKERFILE_PATH", ".github/ci_configs/vllm/Dockerfile.tmp_vllm" | ||||
|     ) | ||||
|  | ||||
|     # the cleaning script to remove torch dependencies from pip | ||||
|     cleaning_script: Path = env_path_field( | ||||
|         "cleaning_script", ".github/ci_configs/vllm/use_existing_torch.py" | ||||
|     ) | ||||
|  | ||||
|     # OUTPUT_DIR: where docker buildx (local exporter) will write artifacts | ||||
|     output_dir: Path = env_path_field("OUTPUT_DIR", "external/vllm") | ||||
|  | ||||
| @ -163,44 +153,18 @@ class VllmBuildRunner(BaseRunner): | ||||
|         """ | ||||
|         inputs = VllmBuildParameters() | ||||
|         logger.info("Running vllm build with inputs: %s", inputs) | ||||
|         vllm_commit = clone_vllm() | ||||
|         clone_vllm() | ||||
|  | ||||
|         self.cp_torch_cleaning_script(inputs) | ||||
|         self.cp_dockerfile_if_exist(inputs) | ||||
|  | ||||
|         # cp torch wheels from root direct to vllm workspace if exist | ||||
|         self.cp_torch_whls_if_exist(inputs) | ||||
|  | ||||
|         # make sure the output dir to store the build artifacts exist | ||||
|         ensure_dir_exists(Path(inputs.output_dir)) | ||||
|         ensure_dir_exists(inputs.output_dir) | ||||
|  | ||||
|         cmd = self._generate_docker_build_cmd(inputs) | ||||
|         logger.info("Running docker build: \n %s", cmd) | ||||
|  | ||||
|         try: | ||||
|             run_command(cmd, cwd="vllm", env=os.environ.copy()) | ||||
|         finally: | ||||
|             self.genearte_vllm_build_summary(vllm_commit, inputs) | ||||
|  | ||||
|     def genearte_vllm_build_summary( | ||||
|         self, vllm_commit: str, inputs: VllmBuildParameters | ||||
|     ): | ||||
|         if not gh_summary_path(): | ||||
|             return logger.info("Skipping, not detect GH Summary env var....") | ||||
|         logger.info("Generate GH Summary ...") | ||||
|         # summarize vllm build info | ||||
|         summarize_build_info(vllm_commit) | ||||
|  | ||||
|         # summarize vllm build artifacts | ||||
|         vllm_artifact_dir = inputs.output_dir / "wheels" | ||||
|         summarize_content_from_file( | ||||
|             vllm_artifact_dir, | ||||
|             "build_summary.txt", | ||||
|             title="Vllm build env pip package summary", | ||||
|         ) | ||||
|         summarize_wheels( | ||||
|             inputs.torch_whls_path, max_depth=3, title="Torch Wheels Artifacts" | ||||
|         ) | ||||
|         summarize_wheels(vllm_artifact_dir, max_depth=3, title="Vllm Wheels Artifacts") | ||||
|         run_command(cmd, cwd="vllm", env=os.environ.copy()) | ||||
|  | ||||
|     def cp_torch_whls_if_exist(self, inputs: VllmBuildParameters) -> str: | ||||
|         if not inputs.use_torch_whl: | ||||
| @ -211,11 +175,6 @@ class VllmBuildRunner(BaseRunner): | ||||
|         copy(inputs.torch_whls_path, tmp_dir) | ||||
|         return tmp_dir | ||||
|  | ||||
|     def cp_torch_cleaning_script(self, inputs: VllmBuildParameters): | ||||
|         script = get_path(inputs.cleaning_script, resolve=True) | ||||
|         vllm_script = Path(f"./{self.work_directory}/use_existing_torch.py") | ||||
|         copy(script, vllm_script) | ||||
|  | ||||
|     def cp_dockerfile_if_exist(self, inputs: VllmBuildParameters): | ||||
|         if not inputs.use_local_dockerfile: | ||||
|             logger.info("using vllm default dockerfile.torch_nightly for build") | ||||
|  | ||||
| @ -11,7 +11,7 @@ from typing import Any | ||||
|  | ||||
| from cli.lib.common.cli_helper import BaseRunner | ||||
| from cli.lib.common.envs_helper import env_path_field, env_str_field, get_env | ||||
| from cli.lib.common.path_helper import copy, get_path, remove_dir | ||||
| from cli.lib.common.path_helper import copy, remove_dir | ||||
| from cli.lib.common.pip_helper import ( | ||||
|     pip_install_first_match, | ||||
|     pip_install_packages, | ||||
| @ -43,10 +43,6 @@ class VllmTestParameters: | ||||
|  | ||||
|     torch_cuda_arch_list: str = env_str_field("TORCH_CUDA_ARCH_LIST", "8.9") | ||||
|  | ||||
|     cleaning_script: Path = env_path_field( | ||||
|         "cleaning_script", ".github/ci_configs/vllm/use_existing_torch.py" | ||||
|     ) | ||||
|  | ||||
|     def __post_init__(self): | ||||
|         if not self.torch_whls_path.exists(): | ||||
|             raise ValueError("missing torch_whls_path") | ||||
| @ -96,13 +92,11 @@ class VllmTestRunner(BaseRunner): | ||||
|         self._set_envs(params) | ||||
|  | ||||
|         clone_vllm(dst=self.work_directory) | ||||
|         self.cp_torch_cleaning_script(params) | ||||
|         with working_directory(self.work_directory): | ||||
|             remove_dir(Path("vllm")) | ||||
|             self._install_wheels(params) | ||||
|             self._install_dependencies() | ||||
|         # verify the torches are not overridden by test dependencies | ||||
|  | ||||
|         check_versions() | ||||
|  | ||||
|     def run(self): | ||||
| @ -110,31 +104,20 @@ class VllmTestRunner(BaseRunner): | ||||
|         main function to run vllm test | ||||
|         """ | ||||
|         self.prepare() | ||||
|         try: | ||||
|             with working_directory(self.work_directory): | ||||
|                 if self.test_type == TestInpuType.TEST_PLAN: | ||||
|                     if self.num_shards > 1: | ||||
|                         run_test_plan( | ||||
|                             self.test_plan, | ||||
|                             "vllm", | ||||
|                             sample_vllm_test_library(), | ||||
|                             self.shard_id, | ||||
|                             self.num_shards, | ||||
|                         ) | ||||
|                     else: | ||||
|                         run_test_plan( | ||||
|                             self.test_plan, "vllm", sample_vllm_test_library() | ||||
|                         ) | ||||
|         with working_directory(self.work_directory): | ||||
|             if self.test_type == TestInpuType.TEST_PLAN: | ||||
|                 if self.num_shards > 1: | ||||
|                     run_test_plan( | ||||
|                         self.test_plan, | ||||
|                         "vllm", | ||||
|                         sample_vllm_test_library(), | ||||
|                         self.shard_id, | ||||
|                         self.num_shards, | ||||
|                     ) | ||||
|                 else: | ||||
|                     raise ValueError(f"Unknown test type {self.test_type}") | ||||
|         finally: | ||||
|             # double check the torches are not overridden by other packages | ||||
|             check_versions() | ||||
|  | ||||
|     def cp_torch_cleaning_script(self, params: VllmTestParameters): | ||||
|         script = get_path(params.cleaning_script, resolve=True) | ||||
|         vllm_script = Path(f"./{self.work_directory}/use_existing_torch.py") | ||||
|         copy(script, vllm_script) | ||||
|                     run_test_plan(self.test_plan, "vllm", sample_vllm_test_library()) | ||||
|             else: | ||||
|                 raise ValueError(f"Unknown test type {self.test_type}") | ||||
|  | ||||
|     def _install_wheels(self, params: VllmTestParameters): | ||||
|         logger.info("Running vllm test with inputs: %s", params) | ||||
| @ -237,8 +220,6 @@ def preprocess_test_in( | ||||
|     target_path = Path(target_file) | ||||
|     lines = target_path.read_text().splitlines() | ||||
|  | ||||
|     pkgs_to_add = [] | ||||
|  | ||||
|     # Remove lines starting with the package names (==, @, >=) — case-insensitive | ||||
|     pattern = re.compile(rf"^({'|'.join(pkgs_to_remove)})\s*(==|@|>=)", re.IGNORECASE) | ||||
|     kept_lines = [line for line in lines if not pattern.match(line)] | ||||
| @ -255,11 +236,7 @@ def preprocess_test_in( | ||||
|     ] | ||||
|  | ||||
|     # Write back: header_lines + blank + kept_lines | ||||
|     out_lines = header_lines + [""] + kept_lines | ||||
|     if pkgs_to_add: | ||||
|         out_lines += [""] + pkgs_to_add | ||||
|  | ||||
|     out = "\n".join(out_lines) + "\n" | ||||
|     out = "\n".join(header_lines + [""] + kept_lines) + "\n" | ||||
|     target_path.write_text(out) | ||||
|     logger.info("[INFO] Updated %s", target_file) | ||||
|  | ||||
|  | ||||
| @ -124,7 +124,6 @@ if [[ $CUDA_VERSION == 12* || $CUDA_VERSION == 13* ]]; then | ||||
|     fi | ||||
|     if [[ -z "$PYTORCH_EXTRA_INSTALL_REQUIREMENTS" ]]; then | ||||
|         echo "Bundling with cudnn and cublas." | ||||
|  | ||||
|         DEPS_LIST+=( | ||||
|             "/usr/local/cuda/lib64/libcudnn_adv.so.9" | ||||
|             "/usr/local/cuda/lib64/libcudnn_cnn.so.9" | ||||
| @ -134,11 +133,16 @@ if [[ $CUDA_VERSION == 12* || $CUDA_VERSION == 13* ]]; then | ||||
|             "/usr/local/cuda/lib64/libcudnn_engines_precompiled.so.9" | ||||
|             "/usr/local/cuda/lib64/libcudnn_heuristic.so.9" | ||||
|             "/usr/local/cuda/lib64/libcudnn.so.9" | ||||
|             "/usr/local/cuda/lib64/libcublas.so.12" | ||||
|             "/usr/local/cuda/lib64/libcublasLt.so.12" | ||||
|             "/usr/local/cuda/lib64/libcusparseLt.so.0" | ||||
|             "/usr/local/cuda/lib64/libcudart.so.12" | ||||
|             "/usr/local/cuda/lib64/libnvrtc.so.12" | ||||
|             "/usr/local/cuda/lib64/libnvrtc-builtins.so" | ||||
|             "/usr/local/cuda/lib64/libcufile.so.0" | ||||
|             "/usr/local/cuda/lib64/libcufile_rdma.so.1" | ||||
|             "/usr/local/cuda/lib64/libnvshmem_host.so.3" | ||||
|             "/usr/local/cuda/extras/CUPTI/lib64/libcupti.so.12" | ||||
|             "/usr/local/cuda/extras/CUPTI/lib64/libnvperf_host.so" | ||||
|         ) | ||||
|         DEPS_SONAME+=( | ||||
| @ -150,56 +154,22 @@ if [[ $CUDA_VERSION == 12* || $CUDA_VERSION == 13* ]]; then | ||||
|             "libcudnn_engines_precompiled.so.9" | ||||
|             "libcudnn_heuristic.so.9" | ||||
|             "libcudnn.so.9" | ||||
|             "libcublas.so.12" | ||||
|             "libcublasLt.so.12" | ||||
|             "libcusparseLt.so.0" | ||||
|             "libcudart.so.12" | ||||
|             "libnvrtc.so.12" | ||||
|             "libnvrtc-builtins.so" | ||||
|             "libnvshmem_host.so.3" | ||||
|             "libcufile.so.0" | ||||
|             "libcufile_rdma.so.1" | ||||
|             "libcupti.so.12" | ||||
|             "libnvperf_host.so" | ||||
|         ) | ||||
|         # Add libnvToolsExt only if CUDA version is not 12.9 | ||||
|         if [[ $CUDA_VERSION == 13* ]]; then | ||||
|             DEPS_LIST+=( | ||||
|                 "/usr/local/cuda/lib64/libcublas.so.13" | ||||
|                 "/usr/local/cuda/lib64/libcublasLt.so.13" | ||||
|                 "/usr/local/cuda/lib64/libcudart.so.13" | ||||
|                 "/usr/local/cuda/lib64/libnvrtc.so.13" | ||||
|                 "/usr/local/cuda/extras/CUPTI/lib64/libcupti.so.13" | ||||
|                 "/usr/local/cuda/lib64/libibverbs.so.1" | ||||
|                 "/usr/local/cuda/lib64/librdmacm.so.1" | ||||
|                 "/usr/local/cuda/lib64/libmlx5.so.1" | ||||
|                 "/usr/local/cuda/lib64/libnl-3.so.200" | ||||
|                 "/usr/local/cuda/lib64/libnl-route-3.so.200") | ||||
|             DEPS_SONAME+=( | ||||
|                 "libcublas.so.13" | ||||
|                 "libcublasLt.so.13" | ||||
|                 "libcudart.so.13" | ||||
|                 "libnvrtc.so.13" | ||||
|                 "libcupti.so.13" | ||||
|                 "libibverbs.so.1" | ||||
|                 "librdmacm.so.1" | ||||
|                 "libmlx5.so.1" | ||||
|                 "libnl-3.so.200" | ||||
|                 "libnl-route-3.so.200") | ||||
|             export USE_CUPTI_SO=1 | ||||
|             export ATEN_STATIC_CUDA=0 | ||||
|             export USE_CUDA_STATIC_LINK=0 | ||||
|             export USE_CUFILE=0 | ||||
|         else | ||||
|             DEPS_LIST+=( | ||||
|                 "/usr/local/cuda/lib64/libnvToolsExt.so.1" | ||||
|                 "/usr/local/cuda/lib64/libcublas.so.12" | ||||
|                 "/usr/local/cuda/lib64/libcublasLt.so.12" | ||||
|                 "/usr/local/cuda/lib64/libcudart.so.12" | ||||
|                 "/usr/local/cuda/lib64/libnvrtc.so.12" | ||||
|                 "/usr/local/cuda/extras/CUPTI/lib64/libcupti.so.12") | ||||
|             DEPS_SONAME+=( | ||||
|                 "libnvToolsExt.so.1" | ||||
|                 "libcublas.so.12" | ||||
|                 "libcublasLt.so.12" | ||||
|                 "libcudart.so.12" | ||||
|                 "libnvrtc.so.12" | ||||
|                 "libcupti.so.12") | ||||
|         if [[ $CUDA_VERSION != 12.9* ]]; then | ||||
|             DEPS_LIST+=("/usr/local/cuda/lib64/libnvToolsExt.so.1") | ||||
|             DEPS_SONAME+=("libnvToolsExt.so.1") | ||||
|         fi | ||||
|     else | ||||
|         echo "Using nvidia libs from pypi." | ||||
|  | ||||
| @ -300,3 +300,24 @@ except RuntimeError as e: | ||||
|     exit 1 | ||||
|   fi | ||||
| fi | ||||
|  | ||||
| ############################################################################### | ||||
| # Check for C++ ABI compatibility to GCC-11 - GCC 13 | ||||
| ############################################################################### | ||||
| if [[ "$(uname)" == 'Linux' &&  "$PACKAGE_TYPE" == 'manywheel' ]]; then | ||||
|   pushd /tmp | ||||
|   # Per https://gcc.gnu.org/onlinedocs/gcc/C_002b_002b-Dialect-Options.html | ||||
|   # gcc-11 is ABI16, gcc-13 is ABI18, gcc-14 is ABI19 | ||||
|   # gcc 11 - CUDA 11.8, xpu, rocm | ||||
|   # gcc 13 - CUDA 12.6, 12.8 and cpu | ||||
|   # Please see issue for reference: https://github.com/pytorch/pytorch/issues/152426 | ||||
|   if [[ "$(uname -m)" == "s390x" ]]; then | ||||
|     cxx_abi="19" | ||||
|   elif [[ "$DESIRED_CUDA" != 'xpu' && "$DESIRED_CUDA" != 'rocm'* ]]; then | ||||
|     cxx_abi="18" | ||||
|   else | ||||
|     cxx_abi="16" | ||||
|   fi | ||||
|   python -c "import torch; exit(0 if torch._C._PYBIND11_BUILD_ABI == '_cxxabi10${cxx_abi}' else 1)" | ||||
|   popd | ||||
| fi | ||||
|  | ||||
| @ -149,22 +149,13 @@ function get_pinned_commit() { | ||||
|   cat .github/ci_commit_pins/"${1}".txt | ||||
| } | ||||
|  | ||||
| function detect_cuda_arch() { | ||||
|   if [[ "${BUILD_ENVIRONMENT}" == *cuda* ]]; then | ||||
|     if command -v nvidia-smi; then | ||||
|       TORCH_CUDA_ARCH_LIST=$(nvidia-smi --query-gpu=compute_cap --format=csv | tail -n 1) | ||||
|     elif [[ "${TEST_CONFIG}" == *nogpu* ]]; then | ||||
|       # There won't be nvidia-smi in nogpu tests, so just set TORCH_CUDA_ARCH_LIST to the default | ||||
|       # minimum supported value here | ||||
|       TORCH_CUDA_ARCH_LIST=8.0 | ||||
|     fi | ||||
|     export TORCH_CUDA_ARCH_LIST | ||||
|   fi | ||||
| } | ||||
|  | ||||
| function install_torchaudio() { | ||||
|   local commit | ||||
|   commit=$(get_pinned_commit audio) | ||||
|   if [[ "${BUILD_ENVIRONMENT}" == *cuda* ]] && command -v nvidia-smi; then | ||||
|     TORCH_CUDA_ARCH_LIST=$(nvidia-smi --query-gpu=compute_cap --format=csv | tail -n 1) | ||||
|     export TORCH_CUDA_ARCH_LIST | ||||
|   fi | ||||
|   pip_build_and_install "git+https://github.com/pytorch/audio.git@${commit}" dist/audio | ||||
| } | ||||
|  | ||||
| @ -258,19 +249,11 @@ function install_torchrec_and_fbgemm() { | ||||
|       git clone --recursive https://github.com/pytorch/fbgemm | ||||
|       pushd fbgemm/fbgemm_gpu | ||||
|       git checkout "${fbgemm_commit}" --recurse-submodules | ||||
|       # until the fbgemm_commit includes the tbb patch | ||||
|       patch <<'EOF' | ||||
| --- a/FbgemmGpu.cmake | ||||
| +++ b/FbgemmGpu.cmake | ||||
| @@ -184,5 +184,6 @@ gpu_cpp_library( | ||||
|      fbgemm_gpu_tbe_cache | ||||
|      fbgemm_gpu_tbe_optimizers | ||||
|      fbgemm_gpu_tbe_utils | ||||
| +    tbb | ||||
|    DESTINATION | ||||
|      fbgemm_gpu) | ||||
| EOF | ||||
|       python setup.py bdist_wheel --build-variant=rocm | ||||
|       python setup.py bdist_wheel \ | ||||
|         --build-variant=rocm \ | ||||
|         -DHIP_ROOT_DIR="${ROCM_PATH}" \ | ||||
|         -DCMAKE_C_FLAGS="-DTORCH_USE_HIP_DSA" \ | ||||
|         -DCMAKE_CXX_FLAGS="-DTORCH_USE_HIP_DSA" | ||||
|       popd | ||||
|  | ||||
|       # Save the wheel before cleaning up | ||||
|  | ||||
							
								
								
									
										40
									
								
								.ci/pytorch/functorch_doc_push_script.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										40
									
								
								.ci/pytorch/functorch_doc_push_script.sh
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,40 @@ | ||||
| #!/bin/bash | ||||
|  | ||||
| # This is where the local pytorch install in the docker image is located | ||||
| pt_checkout="/var/lib/jenkins/workspace" | ||||
| source "$pt_checkout/.ci/pytorch/common_utils.sh" | ||||
| echo "functorch_doc_push_script.sh: Invoked with $*" | ||||
|  | ||||
| set -ex -o pipefail | ||||
|  | ||||
| version=${DOCS_VERSION:-nightly} | ||||
| echo "version: $version" | ||||
|  | ||||
| # Build functorch docs | ||||
| pushd $pt_checkout/functorch/docs | ||||
| make html | ||||
| popd | ||||
|  | ||||
| git clone https://github.com/pytorch/functorch -b gh-pages --depth 1 functorch_ghpages | ||||
| pushd functorch_ghpages | ||||
|  | ||||
| if [ "$version" == "main" ]; then | ||||
|   version=nightly | ||||
| fi | ||||
|  | ||||
| git rm -rf "$version" || true | ||||
| mv "$pt_checkout/functorch/docs/build/html" "$version" | ||||
|  | ||||
| git add "$version" || true | ||||
| git status | ||||
| git config user.email "soumith+bot@pytorch.org" | ||||
| git config user.name "pytorchbot" | ||||
| # If there aren't changes, don't make a commit; push is no-op | ||||
| git commit -m "Generate Python docs from pytorch/pytorch@${GITHUB_SHA}" || true | ||||
| git status | ||||
|  | ||||
| if [[ "${WITH_PUSH:-}" == true ]]; then | ||||
|   git push -u origin gh-pages | ||||
| fi | ||||
|  | ||||
| popd | ||||
| @ -35,10 +35,11 @@ fi | ||||
|  | ||||
| print_cmake_info | ||||
| if [[ ${BUILD_ENVIRONMENT} == *"distributed"* ]]; then | ||||
|   USE_OPENMP=1 WERROR=1 python setup.py bdist_wheel | ||||
|   # Needed for inductor benchmarks, as lots of HF networks make `torch.distribtued` calls | ||||
|   USE_DISTRIBUTED=1 USE_OPENMP=1 WERROR=1 python setup.py bdist_wheel | ||||
| else | ||||
|   # NB: we always build with distributed; USE_DISTRIBUTED turns off all | ||||
|   # backends (specifically the gloo backend), so test that this case works too | ||||
|   # Explicitly set USE_DISTRIBUTED=0 to align with the default build config on mac. This also serves as the sole CI config that tests | ||||
|   # that building with USE_DISTRIBUTED=0 works at all. See https://github.com/pytorch/pytorch/issues/86448 | ||||
|   USE_DISTRIBUTED=0 USE_OPENMP=1 MACOSX_DEPLOYMENT_TARGET=11.0 WERROR=1 BUILD_TEST=OFF USE_PYTORCH_METAL=1 python setup.py bdist_wheel --plat-name macosx_11_0_arm64 | ||||
| fi | ||||
| if which sccache > /dev/null; then | ||||
|  | ||||
| @ -13,13 +13,9 @@ if [[ ! $(python -c "import torch; print(int(torch.backends.openmp.is_available( | ||||
| fi | ||||
| popd | ||||
|  | ||||
| python -mpip install -r requirements.txt | ||||
|  | ||||
| # enable debug asserts in serialization | ||||
| export TORCH_SERIALIZATION_DEBUG=1 | ||||
|  | ||||
| python -mpip install --no-input -r requirements.txt | ||||
|  | ||||
| setup_test_python() { | ||||
|   # The CircleCI worker hostname doesn't resolve to an address. | ||||
|   # This environment variable makes ProcessGroupGloo default to | ||||
| @ -199,7 +195,7 @@ torchbench_setup_macos() { | ||||
|   git checkout "$(cat ../.github/ci_commit_pins/vision.txt)" | ||||
|   git submodule update --init --recursive | ||||
|   python setup.py clean | ||||
|   python -m pip install -e . -v --no-build-isolation | ||||
|   python setup.py develop | ||||
|   popd | ||||
|  | ||||
|   pushd torchaudio | ||||
| @ -208,7 +204,7 @@ torchbench_setup_macos() { | ||||
|   git submodule update --init --recursive | ||||
|   python setup.py clean | ||||
|   #TODO: Remove me, when figure out how to make TorchAudio find brew installed openmp | ||||
|   USE_OPENMP=0 python -m pip install -e . -v --no-build-isolation | ||||
|   USE_OPENMP=0 python setup.py develop | ||||
|   popd | ||||
|  | ||||
|   checkout_install_torchbench | ||||
| @ -306,47 +302,6 @@ test_torchbench_smoketest() { | ||||
|     fi | ||||
|  | ||||
|   done | ||||
|   echo "Pytorch benchmark on mps device completed" | ||||
| } | ||||
|  | ||||
| test_aoti_torchbench_smoketest() { | ||||
|   print_cmake_info | ||||
|  | ||||
|   echo "Launching AOTInductor torchbench setup" | ||||
|   pip_benchmark_deps | ||||
|   # shellcheck disable=SC2119,SC2120 | ||||
|   torchbench_setup_macos | ||||
|  | ||||
|   TEST_REPORTS_DIR=$(pwd)/test/test-reports | ||||
|   mkdir -p "$TEST_REPORTS_DIR" | ||||
|  | ||||
|   local device=mps | ||||
|   local dtypes=(undefined float16 bfloat16 notset) | ||||
|   local dtype=${dtypes[$1]} | ||||
|   local models=(hf_T5 llama BERT_pytorch dcgan hf_GPT2 yolov3 resnet152 sam sam_fast pytorch_unet stable_diffusion_text_encoder speech_transformer Super_SloMo doctr_det_predictor doctr_reco_predictor timm_resnet timm_vovnet vgg16) | ||||
|  | ||||
|   echo "Launching torchbench inference performance run for AOT Inductor and dtype ${dtype}" | ||||
|   local dtype_arg="--${dtype}" | ||||
|   if [ "$dtype" == notset ]; then | ||||
|       dtype_arg="--float32" | ||||
|   fi | ||||
|   touch "$TEST_REPORTS_DIR/aot_inductor_torchbench_${dtype}_inference_${device}_performance.csv" | ||||
|   for model in "${models[@]}"; do | ||||
|     PYTHONPATH="$(pwd)"/torchbench python benchmarks/dynamo/torchbench.py \ | ||||
|       --performance --only "$model" --export-aot-inductor --inference --devices "$device" "$dtype_arg" \ | ||||
|       --output "$TEST_REPORTS_DIR/aot_inductor_torchbench_${dtype}_inference_${device}_performance.csv" || true | ||||
|     PYTHONPATH="$(pwd)"/torchbench python benchmarks/dynamo/torchbench.py \ | ||||
|       --accuracy --only "$model" --export-aot-inductor --inference --devices "$device" "$dtype_arg" \ | ||||
|       --output "$TEST_REPORTS_DIR/aot_inductor_torchbench_${dtype}_inference_${device}_accuracy.csv" || true | ||||
|   done | ||||
|  | ||||
|   echo "Launching HuggingFace inference performance run for AOT Inductor and dtype ${dtype}" | ||||
|   PYTHONPATH="$(pwd)"/torchbench python benchmarks/dynamo/huggingface.py \ | ||||
|     --performance --export-aot-inductor --inference --devices "$device" "$dtype_arg" \ | ||||
|     --output "$TEST_REPORTS_DIR/aot_inductor_huggingface_${dtype}_inference_${device}_performance.csv" || true | ||||
|   PYTHONPATH="$(pwd)"/torchbench python benchmarks/dynamo/huggingface.py \ | ||||
|     --accuracy --export-aot-inductor --inference --devices "$device" "$dtype_arg" \ | ||||
|     --output "$TEST_REPORTS_DIR/aot_inductor_huggingface_${dtype}_inference_${device}_accuracy.csv" || true | ||||
|  | ||||
|   echo "Pytorch benchmark on mps device completed" | ||||
| } | ||||
| @ -395,8 +350,6 @@ elif [[ $TEST_CONFIG == *"perf_timm"* ]]; then | ||||
|   test_timm_perf | ||||
| elif [[ $TEST_CONFIG == *"perf_smoketest"* ]]; then | ||||
|   test_torchbench_smoketest "${SHARD_NUMBER}" | ||||
| elif [[ $TEST_CONFIG == *"aot_inductor_perf_smoketest"* ]]; then | ||||
|   test_aoti_torchbench_smoketest "${SHARD_NUMBER}" | ||||
| elif [[ $TEST_CONFIG == *"mps"* ]]; then | ||||
|   test_python_mps | ||||
| elif [[ $NUM_TEST_SHARDS -gt 1 ]]; then | ||||
|  | ||||
| @ -45,7 +45,6 @@ if [[ "${SHARD_NUMBER:-2}" == "2" ]]; then | ||||
|     # DTensor tests | ||||
|     time python test/run_test.py --verbose -i distributed/tensor/test_random_ops | ||||
|     time python test/run_test.py --verbose -i distributed/tensor/test_dtensor_compile | ||||
|     time python test/run_test.py --verbose -i distributed/tensor/test_utils.py | ||||
|  | ||||
|     # DeviceMesh test | ||||
|     time python test/run_test.py --verbose -i distributed/test_device_mesh | ||||
|  | ||||
| @ -1,25 +0,0 @@ | ||||
| From 6e08c9d08e9de59c7af28b720289debbbd384764 Mon Sep 17 00:00:00 2001 | ||||
| From: Michael Wang <13521008+isVoid@users.noreply.github.com> | ||||
| Date: Tue, 1 Apr 2025 17:28:05 -0700 | ||||
| Subject: [PATCH] Avoid bumping certain driver API to avoid future breakage | ||||
|  (#185) | ||||
|  | ||||
| Co-authored-by: isVoid <isVoid@users.noreply.github.com> | ||||
| --- | ||||
|  numba_cuda/numba/cuda/cudadrv/driver.py | 3 +++ | ||||
|  1 file changed, 3 insertions(+) | ||||
|  | ||||
| diff --git a/numba_cuda/numba/cuda/cudadrv/driver.py b/numba_cuda/numba/cuda/cudadrv/driver.py | ||||
| index 1641bf77..233e9ed7 100644 | ||||
| --- a/numba_cuda/numba/cuda/cudadrv/driver.py | ||||
| +++ b/numba_cuda/numba/cuda/cudadrv/driver.py | ||||
| @@ -365,6 +365,9 @@ def _find_api(self, fname): | ||||
|          else: | ||||
|              variants = ('_v2', '') | ||||
|   | ||||
| +        if fname in ("cuCtxGetDevice", "cuCtxSynchronize"): | ||||
| +            return getattr(self.lib, fname) | ||||
| + | ||||
|          for variant in variants: | ||||
|              try: | ||||
|                  return getattr(self.lib, f'{fname}{variant}') | ||||
| @ -386,8 +386,8 @@ def smoke_test_compile(device: str = "cpu") -> None: | ||||
|  | ||||
|  | ||||
| def smoke_test_nvshmem() -> None: | ||||
|     if not torch.cuda.is_available() or target_os == "windows": | ||||
|         print("Windows platform or CUDA is not available, skipping NVSHMEM test") | ||||
|     if not torch.cuda.is_available(): | ||||
|         print("CUDA is not available, skipping NVSHMEM test") | ||||
|         return | ||||
|  | ||||
|     # Check if NVSHMEM is compiled in current build | ||||
| @ -396,9 +396,7 @@ def smoke_test_nvshmem() -> None: | ||||
|     except ImportError: | ||||
|         # Not built with NVSHMEM support. | ||||
|         # torch is not compiled with NVSHMEM prior to 2.9 | ||||
|         from torch.torch_version import TorchVersion | ||||
|  | ||||
|         if TorchVersion(torch.__version__) < (2, 9): | ||||
|         if torch.__version__ < "2.9": | ||||
|             return | ||||
|         else: | ||||
|             # After 2.9: NVSHMEM is expected to be compiled in current build | ||||
|  | ||||
| @ -32,16 +32,6 @@ if [[ "$BUILD_ENVIRONMENT" != *rocm* && "$BUILD_ENVIRONMENT" != *s390x* && -d /v | ||||
|   git config --global --add safe.directory /var/lib/jenkins/workspace | ||||
| fi | ||||
|  | ||||
|  | ||||
| # Patch numba to avoid CUDA-13 crash, see https://github.com/pytorch/pytorch/issues/162878 | ||||
| NUMBA_CUDA_DIR=$(python -c "import os;import numba.cuda; print(os.path.dirname(numba.cuda.__file__))" 2>/dev/null || true) | ||||
| if [ -n "$NUMBA_CUDA_DIR" ]; then | ||||
|   NUMBA_PATCH="$(dirname "$(realpath "${BASH_SOURCE[0]}")")/numba-cuda-13.patch" | ||||
|   pushd "$NUMBA_CUDA_DIR" | ||||
|   patch -p4 <"$NUMBA_PATCH" | ||||
|   popd | ||||
| fi | ||||
|  | ||||
| echo "Environment variables:" | ||||
| env | ||||
|  | ||||
| @ -101,7 +91,6 @@ if [[ "$BUILD_ENVIRONMENT" == *clang9* || "$BUILD_ENVIRONMENT" == *xpu* ]]; then | ||||
|   export VALGRIND=OFF | ||||
| fi | ||||
|  | ||||
| detect_cuda_arch | ||||
|  | ||||
| if [[ "$BUILD_ENVIRONMENT" == *s390x* ]]; then | ||||
|   # There are additional warnings on s390x, maybe due to newer gcc. | ||||
| @ -334,17 +323,11 @@ test_python() { | ||||
| } | ||||
|  | ||||
| test_python_smoke() { | ||||
|   # Smoke tests for H100/B200 | ||||
|   # Smoke tests for H100 | ||||
|   time python test/run_test.py --include test_matmul_cuda inductor/test_fp8 inductor/test_max_autotune $PYTHON_TEST_EXTRA_OPTION --upload-artifacts-while-running | ||||
|   assert_git_not_dirty | ||||
| } | ||||
|  | ||||
| test_python_smoke_b200() { | ||||
|   # Targeted smoke tests for B200 - staged approach to avoid too many failures | ||||
|   time python test/run_test.py --include test_matmul_cuda inductor/test_fp8 $PYTHON_TEST_EXTRA_OPTION --upload-artifacts-while-running | ||||
|   assert_git_not_dirty | ||||
| } | ||||
|  | ||||
| test_h100_distributed() { | ||||
|   # Distributed tests at H100 | ||||
|   time python test/run_test.py --include distributed/_composable/test_composability/test_pp_composability.py  $PYTHON_TEST_EXTRA_OPTION --upload-artifacts-while-running | ||||
| @ -512,14 +495,6 @@ test_inductor_cpp_wrapper_shard() { | ||||
|     -k 'take' \ | ||||
|     --shard "$1" "$NUM_TEST_SHARDS" \ | ||||
|     --verbose | ||||
|  | ||||
|   if [[ "${BUILD_ENVIRONMENT}" == *xpu* ]]; then | ||||
|     python test/run_test.py \ | ||||
|       --include inductor/test_mkldnn_pattern_matcher \ | ||||
|       -k 'xpu' \ | ||||
|       --shard "$1" "$NUM_TEST_SHARDS" \ | ||||
|       --verbose | ||||
|   fi | ||||
| } | ||||
|  | ||||
| # "Global" flags for inductor benchmarking controlled by TEST_CONFIG | ||||
| @ -1556,10 +1531,14 @@ test_executorch() { | ||||
|   install_torchvision | ||||
|   install_torchaudio | ||||
|  | ||||
|   INSTALL_SCRIPT="$(pwd)/.ci/docker/common/install_executorch.sh" | ||||
|  | ||||
|   pushd /executorch | ||||
|   "${INSTALL_SCRIPT}" setup_executorch | ||||
|  | ||||
|   export PYTHON_EXECUTABLE=python | ||||
|   export CMAKE_ARGS="-DEXECUTORCH_BUILD_PYBIND=ON -DEXECUTORCH_BUILD_XNNPACK=ON -DEXECUTORCH_BUILD_KERNELS_QUANTIZED=ON" | ||||
|  | ||||
|   # NB: We need to rebuild ExecuTorch runner here because it depends on PyTorch | ||||
|   # from the PR | ||||
|   bash .ci/scripts/setup-linux.sh --build-tool cmake | ||||
|  | ||||
|   echo "Run ExecuTorch unit tests" | ||||
|   pytest -v -n auto | ||||
| @ -1573,6 +1552,10 @@ test_executorch() { | ||||
|  | ||||
|   popd | ||||
|  | ||||
|   # Test torchgen generated code for Executorch. | ||||
|   echo "Testing ExecuTorch op registration" | ||||
|   "$BUILD_BIN_DIR"/test_edge_op_registration | ||||
|  | ||||
|   assert_git_not_dirty | ||||
| } | ||||
|  | ||||
| @ -1580,7 +1563,6 @@ test_linux_aarch64() { | ||||
|   python test/run_test.py --include test_modules test_mkldnn test_mkldnn_fusion test_openmp test_torch test_dynamic_shapes \ | ||||
|         test_transformers test_multiprocessing test_numpy_interop test_autograd test_binary_ufuncs test_complex test_spectral_ops \ | ||||
|         test_foreach test_reductions test_unary_ufuncs test_tensor_creation_ops test_ops \ | ||||
|         distributed/elastic/timer/api_test distributed/elastic/timer/local_timer_example distributed/elastic/timer/local_timer_test \ | ||||
|         --shard "$SHARD_NUMBER" "$NUM_TEST_SHARDS" --verbose | ||||
|  | ||||
|   # Dynamo tests | ||||
| @ -1648,7 +1630,11 @@ elif [[ "${TEST_CONFIG}" == *xla* ]]; then | ||||
|   build_xla | ||||
|   test_xla | ||||
| elif [[ "$TEST_CONFIG" == *vllm* ]]; then | ||||
|     echo "vLLM CI uses TORCH_CUDA_ARCH_LIST: $TORCH_CUDA_ARCH_LIST" | ||||
|     if [[ "${BUILD_ENVIRONMENT}" == *cuda* ]]; then | ||||
|       TORCH_CUDA_ARCH_LIST=$(nvidia-smi --query-gpu=compute_cap --format=csv | tail -n 1) | ||||
|       export TORCH_CUDA_ARCH_LIST | ||||
|     fi | ||||
|     echo "VLLM CI TORCH_CUDA_ARCH_LIST: $TORCH_CUDA_ARCH_LIST" | ||||
|     (cd .ci/lumen_cli && python -m pip install -e .) | ||||
|     python -m cli.run test external vllm --test-plan "$TEST_CONFIG" --shard-id "$SHARD_NUMBER" --num-shards "$NUM_TEST_SHARDS" | ||||
| elif [[ "${TEST_CONFIG}" == *executorch* ]]; then | ||||
| @ -1730,6 +1716,11 @@ elif [[ "${TEST_CONFIG}" == *inductor_cpp_wrapper* ]]; then | ||||
| elif [[ "${TEST_CONFIG}" == *inductor* ]]; then | ||||
|   install_torchvision | ||||
|   test_inductor_shard "${SHARD_NUMBER}" | ||||
|   if [[ "${SHARD_NUMBER}" == 1 ]]; then | ||||
|     if [[ "${BUILD_ENVIRONMENT}" != linux-jammy-py3.9-gcc11-build ]]; then | ||||
|       test_inductor_distributed | ||||
|     fi | ||||
|   fi | ||||
| elif [[ "${TEST_CONFIG}" == *einops* ]]; then | ||||
|   test_einops | ||||
| elif [[ "${TEST_CONFIG}" == *dynamo_wrapped* ]]; then | ||||
| @ -1779,8 +1770,6 @@ elif [[ "${BUILD_ENVIRONMENT}" == *xpu* ]]; then | ||||
|   test_xpu_bin | ||||
| elif [[ "${TEST_CONFIG}" == smoke ]]; then | ||||
|   test_python_smoke | ||||
| elif [[ "${TEST_CONFIG}" == smoke_b200 ]]; then | ||||
|   test_python_smoke_b200 | ||||
| elif [[ "${TEST_CONFIG}" == h100_distributed ]]; then | ||||
|   test_h100_distributed | ||||
| elif [[ "${TEST_CONFIG}" == "h100-symm-mem" ]]; then | ||||
|  | ||||
| @ -137,7 +137,7 @@ sccache --show-stats | ||||
| python -c "import os, glob; os.system('python -mpip install --no-index --no-deps ' + glob.glob('dist/*.whl')[0])" | ||||
| ( | ||||
|   if "%BUILD_ENVIRONMENT%"=="" ( | ||||
|     echo NOTE: To run `import torch`, please make sure to activate the conda environment by running `call %CONDA_ROOT_DIR%\Scripts\activate.bat %CONDA_ROOT_DIR%\envs\py_tmp` in Command Prompt before running Git Bash. | ||||
|     echo NOTE: To run `import torch`, please make sure to activate the conda environment by running `call %CONDA_PARENT_DIR%\Miniconda3\Scripts\activate.bat %CONDA_PARENT_DIR%\Miniconda3` in Command Prompt before running Git Bash. | ||||
|   ) else ( | ||||
|     copy /Y "dist\*.whl" "%PYTORCH_FINAL_PACKAGE_DIR%" | ||||
|  | ||||
|  | ||||
| @ -3,12 +3,12 @@ if "%BUILD_ENVIRONMENT%"=="" ( | ||||
| ) else ( | ||||
|   set CONDA_PARENT_DIR=C:\Jenkins | ||||
| ) | ||||
| set CONDA_ROOT_DIR=%CONDA_PARENT_DIR%\Miniconda3 | ||||
|  | ||||
|  | ||||
| :: Be conservative here when rolling out the new AMI with conda. This will try | ||||
| :: to install conda as before if it couldn't find the conda installation. This | ||||
| :: can be removed eventually after we gain enough confidence in the AMI | ||||
| if not exist %CONDA_ROOT_DIR% ( | ||||
| if not exist %CONDA_PARENT_DIR%\Miniconda3 ( | ||||
|   set INSTALL_FRESH_CONDA=1 | ||||
| ) | ||||
|  | ||||
| @ -17,14 +17,10 @@ if "%INSTALL_FRESH_CONDA%"=="1" ( | ||||
|   if errorlevel 1 exit /b | ||||
|   if not errorlevel 0 exit /b | ||||
|  | ||||
|   %TMP_DIR_WIN%\Miniconda3-latest-Windows-x86_64.exe /InstallationType=JustMe /RegisterPython=0 /S /AddToPath=0 /D=%CONDA_ROOT_DIR% | ||||
|   %TMP_DIR_WIN%\Miniconda3-latest-Windows-x86_64.exe /InstallationType=JustMe /RegisterPython=0 /S /AddToPath=0 /D=%CONDA_PARENT_DIR%\Miniconda3 | ||||
|   if errorlevel 1 exit /b | ||||
|   if not errorlevel 0 exit /b | ||||
| ) | ||||
|  | ||||
| :: Activate conda so that we can use its commands, i.e. conda, python, pip | ||||
| call %CONDA_ROOT_DIR%\Scripts\activate.bat %CONDA_ROOT_DIR% | ||||
| :: Activate conda so that we can use its commands, i.e. conda, python, pip | ||||
| call conda activate py_tmp | ||||
|  | ||||
| call pip install -r .ci/docker/requirements-ci.txt | ||||
| call %CONDA_PARENT_DIR%\Miniconda3\Scripts\activate.bat %CONDA_PARENT_DIR%\Miniconda3 | ||||
|  | ||||
| @ -14,7 +14,7 @@ if not errorlevel 0 exit /b | ||||
| :: build\torch. Rather than changing all these references, making a copy of torch folder | ||||
| :: from conda to the current workspace is easier. The workspace will be cleaned up after | ||||
| :: the job anyway | ||||
| xcopy /s %CONDA_ROOT_DIR%\envs\py_tmp\Lib\site-packages\torch %TMP_DIR_WIN%\build\torch\ | ||||
| xcopy /s %CONDA_PARENT_DIR%\Miniconda3\Lib\site-packages\torch %TMP_DIR_WIN%\build\torch\ | ||||
|  | ||||
| pushd . | ||||
| if "%VC_VERSION%" == "" ( | ||||
|  | ||||
| @ -38,20 +38,13 @@ if [[ "$BUILD_ENVIRONMENT" == *cuda* ]]; then | ||||
| fi | ||||
|  | ||||
| # TODO: Move both of them to Windows AMI | ||||
| python -m pip install tensorboard==2.13.0 protobuf==5.29.4 pytest-subtests==0.13.1 | ||||
|  | ||||
| # Copied from https://github.com/pytorch/test-infra/blob/be01a40157c36cd5a48391fdf44a7bc3ebd4c7e3/aws/ami/windows/scripts/Installers/Install-Pip-Dependencies.ps1#L16 with some adjustments | ||||
| # pytest-rerunfailures==10.3 as 10.2 fails with INTERNALERROR> pluggy._manager.PluginValidationError: unknown hook 'pytest_configure_node' | ||||
| # scipy from 1.6.3 to 1.10 | ||||
| # expecttest from 0.1.3 to 0.3.0 | ||||
| # xdoctest from 1.0.2 to 1.3.0 | ||||
| python -m pip install "future==0.18.2" "hypothesis==5.35.1" "expecttest==0.3.0" "librosa>=0.6.2" "scipy==1.10.1" "psutil==5.9.1" "pynvml==11.4.1" "pillow==9.2.0" "unittest-xml-reporting<=3.2.0,>=2.0.0" "pytest==7.1.3" "pytest-xdist==2.5.0" "pytest-flakefinder==1.1.0" "pytest-rerunfailures==10.3" "pytest-shard==0.1.2" "sympy==1.11.1" "xdoctest==1.3.0" "pygments==2.12.0" "opt-einsum>=3.3" "networkx==2.8.8" "mpmath==1.2.1" "pytest-cpp==2.3.0" "boto3==1.35.42" | ||||
| python -m pip install pytest-rerunfailures==10.3 pytest-cpp==2.3.0 tensorboard==2.13.0 protobuf==5.29.4 pytest-subtests==0.13.1 | ||||
|  | ||||
| # Install Z3 optional dependency for Windows builds. | ||||
| python -m pip install z3-solver==4.15.1.0 | ||||
|  | ||||
| # Install tlparse for test\dynamo\test_structured_trace.py UTs. | ||||
| python -m pip install tlparse==0.4.0 | ||||
| python -m pip install tlparse==0.3.30 | ||||
|  | ||||
| # Install parameterized | ||||
| python -m pip install parameterized==0.8.1 | ||||
| @ -59,6 +52,12 @@ python -m pip install parameterized==0.8.1 | ||||
| # Install pulp for testing ilps under torch\distributed\_tools | ||||
| python -m pip install pulp==2.9.0 | ||||
|  | ||||
| # Install expecttest to merge https://github.com/pytorch/pytorch/pull/155308 | ||||
| python -m pip install expecttest==0.3.0 | ||||
|  | ||||
| # Install intel-openmp | ||||
| python -m pip install intel-openmp==2025.1.1 | ||||
|  | ||||
| run_tests() { | ||||
|     # Run nvidia-smi if available | ||||
|     for path in '/c/Program Files/NVIDIA Corporation/NVSMI/nvidia-smi.exe' /c/Windows/System32/nvidia-smi.exe; do | ||||
|  | ||||
| @ -1,20 +1,12 @@ | ||||
|  | ||||
| if %CUDA_VERSION% geq 130 ( | ||||
|     set "dll_path=bin\x64" | ||||
| ) else ( | ||||
|     set "dll_path=bin" | ||||
| ) | ||||
|  | ||||
| copy "%CUDA_PATH%\%dll_path%\cusparse*64_*.dll*" pytorch\torch\lib | ||||
| copy "%CUDA_PATH%\%dll_path%\cublas*64_*.dll*" pytorch\torch\lib | ||||
| copy "%CUDA_PATH%\%dll_path%\cudart*64_*.dll*" pytorch\torch\lib | ||||
| copy "%CUDA_PATH%\%dll_path%\curand*64_*.dll*" pytorch\torch\lib | ||||
| copy "%CUDA_PATH%\%dll_path%\cufft*64_*.dll*" pytorch\torch\lib | ||||
| copy "%CUDA_PATH%\%dll_path%\cusolver*64_*.dll*" pytorch\torch\lib | ||||
| copy "%CUDA_PATH%\%dll_path%\nvrtc*64_*.dll*" pytorch\torch\lib | ||||
| copy "%CUDA_PATH%\%dll_path%\nvJitLink_*.dll*"  pytorch\torch\lib | ||||
| copy "%CUDA_PATH%\bin\cusparse*64_*.dll*" pytorch\torch\lib | ||||
| copy "%CUDA_PATH%\bin\cublas*64_*.dll*" pytorch\torch\lib | ||||
| copy "%CUDA_PATH%\bin\cudart*64_*.dll*" pytorch\torch\lib | ||||
| copy "%CUDA_PATH%\bin\curand*64_*.dll*" pytorch\torch\lib | ||||
| copy "%CUDA_PATH%\bin\cufft*64_*.dll*" pytorch\torch\lib | ||||
| copy "%CUDA_PATH%\bin\cusolver*64_*.dll*" pytorch\torch\lib | ||||
|  | ||||
| copy "%CUDA_PATH%\bin\cudnn*64_*.dll*" pytorch\torch\lib | ||||
| copy "%CUDA_PATH%\bin\nvrtc*64_*.dll*" pytorch\torch\lib | ||||
| copy "%CUDA_PATH%\extras\CUPTI\lib64\cupti64_*.dll*" pytorch\torch\lib | ||||
| copy "%CUDA_PATH%\extras\CUPTI\lib64\nvperf_host*.dll*" pytorch\torch\lib | ||||
|  | ||||
| @ -28,3 +20,8 @@ copy "%libuv_ROOT%\bin\uv.dll" pytorch\torch\lib | ||||
| if exist "C:\Windows\System32\zlibwapi.dll" ( | ||||
|     copy "C:\Windows\System32\zlibwapi.dll"  pytorch\torch\lib | ||||
| ) | ||||
|  | ||||
| ::copy nvJitLink dll is requires for cuda 12+ | ||||
| if exist "%CUDA_PATH%\bin\nvJitLink_*.dll*" ( | ||||
|     copy "%CUDA_PATH%\bin\nvJitLink_*.dll*"  pytorch\torch\lib | ||||
| ) | ||||
|  | ||||
| @ -1,9 +1,9 @@ | ||||
| set WIN_DRIVER_VN=580.88 | ||||
| set "DRIVER_DOWNLOAD_LINK=https://ossci-windows.s3.amazonaws.com/%WIN_DRIVER_VN%-data-center-tesla-desktop-win10-win11-64bit-dch-international.exe" & REM @lint-ignore | ||||
| curl --retry 3 -kL %DRIVER_DOWNLOAD_LINK% --output %WIN_DRIVER_VN%-data-center-tesla-desktop-win10-win11-64bit-dch-international.exe | ||||
| set WIN_DRIVER_VN=528.89 | ||||
| set "DRIVER_DOWNLOAD_LINK=https://ossci-windows.s3.amazonaws.com/%WIN_DRIVER_VN%-data-center-tesla-desktop-winserver-2016-2019-2022-dch-international.exe" & REM @lint-ignore | ||||
| curl --retry 3 -kL %DRIVER_DOWNLOAD_LINK% --output %WIN_DRIVER_VN%-data-center-tesla-desktop-winserver-2016-2019-2022-dch-international.exe | ||||
| if errorlevel 1 exit /b 1 | ||||
|  | ||||
| start /wait %WIN_DRIVER_VN%-data-center-tesla-desktop-win10-win11-64bit-dch-international.exe -s -noreboot | ||||
| start /wait %WIN_DRIVER_VN%-data-center-tesla-desktop-winserver-2016-2019-2022-dch-international.exe -s -noreboot | ||||
| if errorlevel 1 exit /b 1 | ||||
|  | ||||
| del %WIN_DRIVER_VN%-data-center-tesla-desktop-win10-win11-64bit-dch-international.exe || ver > NUL | ||||
| del %WIN_DRIVER_VN%-data-center-tesla-desktop-winserver-2016-2019-2022-dch-international.exe || ver > NUL | ||||
|  | ||||
| @ -13,9 +13,9 @@ if not exist "%SRC_DIR%\temp_build" mkdir "%SRC_DIR%\temp_build" | ||||
| :xpu_bundle_install_start | ||||
|  | ||||
| set XPU_BUNDLE_PARENT_DIR=C:\Program Files (x86)\Intel\oneAPI | ||||
| set XPU_BUNDLE_URL=https://registrationcenter-download.intel.com/akdlm/IRC_NAS/75d4eb97-914a-4a95-852c-7b9733d80f74/intel-deep-learning-essentials-2025.1.3.8_offline.exe | ||||
| set XPU_BUNDLE_URL=https://registrationcenter-download.intel.com/akdlm/IRC_NAS/9d6d6c17-ca2d-4735-9331-99447e4a1280/intel-deep-learning-essentials-2025.0.1.28_offline.exe | ||||
| set XPU_BUNDLE_PRODUCT_NAME=intel.oneapi.win.deep-learning-essentials.product | ||||
| set XPU_BUNDLE_VERSION=2025.1.3+5 | ||||
| set XPU_BUNDLE_VERSION=2025.0.1+20 | ||||
| set XPU_BUNDLE_INSTALLED=0 | ||||
| set XPU_BUNDLE_UNINSTALL=0 | ||||
| set XPU_EXTRA_URL=NULL | ||||
| @ -24,9 +24,9 @@ set XPU_EXTRA_VERSION=2025.0.1+1226 | ||||
| set XPU_EXTRA_INSTALLED=0 | ||||
| set XPU_EXTRA_UNINSTALL=0 | ||||
|  | ||||
| if not [%XPU_VERSION%]==[] if [%XPU_VERSION%]==[2025.2] ( | ||||
|     set XPU_BUNDLE_URL=https://registrationcenter-download.intel.com/akdlm/IRC_NAS/24751ead-ddc5-4479-b9e6-f9fe2ff8b9f2/intel-deep-learning-essentials-2025.2.1.25_offline.exe | ||||
|     set XPU_BUNDLE_VERSION=2025.2.1+20 | ||||
| if not [%XPU_VERSION%]==[] if [%XPU_VERSION%]==[2025.1] ( | ||||
|     set XPU_BUNDLE_URL=https://registrationcenter-download.intel.com/akdlm/IRC_NAS/75d4eb97-914a-4a95-852c-7b9733d80f74/intel-deep-learning-essentials-2025.1.3.8_offline.exe | ||||
|     set XPU_BUNDLE_VERSION=2025.1.3+5 | ||||
| ) | ||||
|  | ||||
| :: Check if XPU bundle is target version or already installed | ||||
| @ -90,3 +90,14 @@ if errorlevel 1 exit /b 1 | ||||
| del xpu_extra.exe | ||||
|  | ||||
| :xpu_install_end | ||||
|  | ||||
| if not "%XPU_ENABLE_KINETO%"=="1" goto install_end | ||||
| :: Install Level Zero SDK | ||||
| set XPU_EXTRA_LZ_URL=https://github.com/oneapi-src/level-zero/releases/download/v1.14.0/level-zero-sdk_1.14.0.zip | ||||
| curl -k -L %XPU_EXTRA_LZ_URL% --output "%SRC_DIR%\temp_build\level_zero_sdk.zip" | ||||
| echo "Installing level zero SDK..." | ||||
| 7z x "%SRC_DIR%\temp_build\level_zero_sdk.zip" -o"%SRC_DIR%\temp_build\level_zero" | ||||
| set "INCLUDE=%SRC_DIR%\temp_build\level_zero\include;%INCLUDE%" | ||||
| del "%SRC_DIR%\temp_build\level_zero_sdk.zip" | ||||
|  | ||||
| :install_end | ||||
|  | ||||
| @ -85,7 +85,7 @@ mkdir -p "$PYTORCH_FINAL_PACKAGE_DIR" || true | ||||
| # Create an isolated directory to store this builds pytorch checkout and conda | ||||
| # installation | ||||
| if [[ -z "$MAC_PACKAGE_WORK_DIR" ]]; then | ||||
|     MAC_PACKAGE_WORK_DIR="$(pwd)/tmp_wheel_${DESIRED_PYTHON}_$(date +%H%M%S)" | ||||
|     MAC_PACKAGE_WORK_DIR="$(pwd)/tmp_wheel_conda_${DESIRED_PYTHON}_$(date +%H%M%S)" | ||||
| fi | ||||
| mkdir -p "$MAC_PACKAGE_WORK_DIR" || true | ||||
| if [[ -n ${GITHUB_ACTIONS} ]]; then | ||||
| @ -96,11 +96,11 @@ fi | ||||
| whl_tmp_dir="${MAC_PACKAGE_WORK_DIR}/dist" | ||||
| mkdir -p "$whl_tmp_dir" | ||||
|  | ||||
| mac_version='macosx-11_0-arm64' | ||||
| mac_version='macosx_11_0_arm64' | ||||
| libtorch_arch='arm64' | ||||
|  | ||||
| # Create a consistent wheel package name to rename the wheel to | ||||
| wheel_filename_new="${TORCH_PACKAGE_NAME}-${build_version}${build_number_prefix}-cp${python_nodot}-none-${mac_version//[-,]/_}.whl" | ||||
| wheel_filename_new="${TORCH_PACKAGE_NAME}-${build_version}${build_number_prefix}-cp${python_nodot}-none-${mac_version}.whl" | ||||
|  | ||||
| ########################################################### | ||||
|  | ||||
| @ -124,61 +124,91 @@ popd | ||||
|  | ||||
| export TH_BINARY_BUILD=1 | ||||
| export INSTALL_TEST=0 # dont install test binaries into site-packages | ||||
| export MACOSX_DEPLOYMENT_TARGET=11.0 | ||||
| export MACOSX_DEPLOYMENT_TARGET=10.15 | ||||
| export CMAKE_PREFIX_PATH=${CONDA_PREFIX:-"$(dirname $(which conda))/../"} | ||||
|  | ||||
| SETUPTOOLS_PINNED_VERSION="==70.1.0" | ||||
| PYYAML_PINNED_VERSION="=5.3" | ||||
| EXTRA_CONDA_INSTALL_FLAGS="" | ||||
| CONDA_ENV_CREATE_FLAGS="" | ||||
| RENAME_WHEEL=true | ||||
| case $desired_python in | ||||
|     3.14t) | ||||
|         echo "Using 3.14 deps" | ||||
|         mac_version='macosx-11.0-arm64' | ||||
|         NUMPY_PINNED_VERSION="==2.1.0" | ||||
|         SETUPTOOLS_PINNED_VERSION=">=70.1.0" | ||||
|         PYYAML_PINNED_VERSION=">=6.0.1" | ||||
|         NUMPY_PINNED_VERSION="=2.1.0" | ||||
|         CONDA_ENV_CREATE_FLAGS="python-freethreading" | ||||
|         EXTRA_CONDA_INSTALL_FLAGS="-c conda-forge/label/python_rc -c conda-forge" | ||||
|         desired_python="3.14.0rc1" | ||||
|         RENAME_WHEEL=false | ||||
|         ;; | ||||
|     3.14) | ||||
|         echo "Using 3.14t deps" | ||||
|         mac_version='macosx-11.0-arm64' | ||||
|         NUMPY_PINNED_VERSION="==2.1.0" | ||||
|         SETUPTOOLS_PINNED_VERSION=">=70.1.0" | ||||
|         PYYAML_PINNED_VERSION=">=6.0.1" | ||||
|         NUMPY_PINNED_VERSION="=2.1.0" | ||||
|         EXTRA_CONDA_INSTALL_FLAGS="-c conda-forge/label/python_rc -c conda-forge" | ||||
|         desired_python="3.14.0rc1" | ||||
|         RENAME_WHEEL=false | ||||
|         ;; | ||||
|     3.13t) | ||||
|         echo "Using 3.13 deps" | ||||
|         NUMPY_PINNED_VERSION="==2.1.0" | ||||
|         SETUPTOOLS_PINNED_VERSION=">=70.1.0" | ||||
|         PYYAML_PINNED_VERSION=">=6.0.1" | ||||
|         NUMPY_PINNED_VERSION="=2.1.0" | ||||
|         CONDA_ENV_CREATE_FLAGS="python-freethreading" | ||||
|         EXTRA_CONDA_INSTALL_FLAGS="-c conda-forge" | ||||
|         desired_python="3.13" | ||||
|         RENAME_WHEEL=false | ||||
|         ;; | ||||
|     3.13) | ||||
|         echo "Using 3.13 deps" | ||||
|         NUMPY_PINNED_VERSION="==2.1.0" | ||||
|         SETUPTOOLS_PINNED_VERSION=">=70.1.0" | ||||
|         PYYAML_PINNED_VERSION=">=6.0.1" | ||||
|         NUMPY_PINNED_VERSION="=2.1.0" | ||||
|         ;; | ||||
|     3.12) | ||||
|         echo "Using 3.12 deps" | ||||
|         NUMPY_PINNED_VERSION="==2.0.2" | ||||
|         SETUPTOOLS_PINNED_VERSION=">=70.1.0" | ||||
|         PYYAML_PINNED_VERSION=">=6.0.1" | ||||
|         NUMPY_PINNED_VERSION="=2.0.2" | ||||
|         ;; | ||||
|     3.11) | ||||
|         echo "Using 3.11 deps" | ||||
|         NUMPY_PINNED_VERSION="==2.0.2" | ||||
|         SETUPTOOLS_PINNED_VERSION=">=70.1.0" | ||||
|         PYYAML_PINNED_VERSION=">=5.3" | ||||
|         NUMPY_PINNED_VERSION="=2.0.2" | ||||
|         ;; | ||||
|     3.10) | ||||
|         echo "Using 3.10 deps" | ||||
|         NUMPY_PINNED_VERSION="==2.0.2" | ||||
|         SETUPTOOLS_PINNED_VERSION=">=70.1.0" | ||||
|         PYYAML_PINNED_VERSION=">=5.3" | ||||
|         NUMPY_PINNED_VERSION="=2.0.2" | ||||
|         ;; | ||||
|     3.9) | ||||
|         echo "Using 3.9 deps" | ||||
|         SETUPTOOLS_PINNED_VERSION=">=70.1.0" | ||||
|         PYYAML_PINNED_VERSION=">=5.3" | ||||
|         NUMPY_PINNED_VERSION="=2.0.2" | ||||
|         ;; | ||||
|     *) | ||||
|         echo "Unsupported version $desired_python" | ||||
|         exit 1 | ||||
|         echo "Using default deps" | ||||
|         NUMPY_PINNED_VERSION="=1.11.3" | ||||
|         ;; | ||||
| esac | ||||
|  | ||||
| PINNED_PACKAGES=( | ||||
|     "numpy${NUMPY_PINNED_VERSION}" | ||||
| ) | ||||
| python -mvenv ~/${desired_python}-build | ||||
| source ~/${desired_python}-build/bin/activate | ||||
| retry pip install "${PINNED_PACKAGES[@]}" -r "${pytorch_rootdir}/requirements.txt" | ||||
| # Install into a fresh env | ||||
| tmp_env_name="wheel_py$python_nodot" | ||||
| conda create ${EXTRA_CONDA_INSTALL_FLAGS} -yn "$tmp_env_name" python="$desired_python" ${CONDA_ENV_CREATE_FLAGS} | ||||
| source activate "$tmp_env_name" | ||||
|  | ||||
| retry pip install -r "${pytorch_rootdir}/requirements-build.txt" | ||||
| pip install "numpy=${NUMPY_PINNED_VERSION}"  "pyyaml${PYYAML_PINNED_VERSION}" requests ninja "setuptools${SETUPTOOLS_PINNED_VERSION}" typing-extensions | ||||
| retry pip install -r "${pytorch_rootdir}/requirements.txt" || true | ||||
| retry brew install libomp | ||||
|  | ||||
| # For USE_DISTRIBUTED=1 on macOS, this enables gloo, which needs libuv, which | ||||
| # is build as part of tensorpipe submodule | ||||
| # For USE_DISTRIBUTED=1 on macOS, need libuv, which is build as part of tensorpipe submodule | ||||
| export USE_DISTRIBUTED=1 | ||||
|  | ||||
| export USE_MKLDNN=OFF | ||||
| @ -188,7 +218,7 @@ export BUILD_TEST=OFF | ||||
| pushd "$pytorch_rootdir" | ||||
| echo "Calling setup.py bdist_wheel at $(date)" | ||||
|  | ||||
| _PYTHON_HOST_PLATFORM=${mac_version} ARCHFLAGS="-arch arm64" python setup.py bdist_wheel -d "$whl_tmp_dir" --plat-name "${mac_version//[-.]/_}" | ||||
| python setup.py bdist_wheel -d "$whl_tmp_dir" | ||||
|  | ||||
| echo "Finished setup.py bdist_wheel at $(date)" | ||||
|  | ||||
|  | ||||
| @ -75,8 +75,8 @@ TRITON_VERSION=$(cat $PYTORCH_ROOT/.ci/docker/triton_version.txt) | ||||
| # Here PYTORCH_EXTRA_INSTALL_REQUIREMENTS is already set for the all the wheel builds hence append TRITON_CONSTRAINT | ||||
| TRITON_CONSTRAINT="platform_system == 'Linux' and platform_machine == 'x86_64'" | ||||
|  | ||||
| # CUDA 12.9/13.0 builds have triton for Linux and Linux aarch64 binaries. | ||||
| if [[ "$DESIRED_CUDA" == "cu129" ]] || [[ "$DESIRED_CUDA" == "cu130" ]]; then | ||||
| # CUDA 12.9 builds have triton for Linux and Linux aarch64 binaries. | ||||
| if [[ "$DESIRED_CUDA" == "cu129" ]]; then | ||||
|   TRITON_CONSTRAINT="platform_system == 'Linux'" | ||||
| fi | ||||
|  | ||||
|  | ||||
| @ -15,7 +15,8 @@ fi | ||||
| if [[ "$DESIRED_CUDA" == 'xpu' ]]; then | ||||
|     export VC_YEAR=2022 | ||||
|     export USE_SCCACHE=0 | ||||
|     export XPU_VERSION=2025.2 | ||||
|     export XPU_VERSION=2025.1 | ||||
|     export XPU_ENABLE_KINETO=1 | ||||
| fi | ||||
|  | ||||
| echo "Free space on filesystem before build:" | ||||
|  | ||||
| @ -8,7 +8,7 @@ export VC_YEAR=2022 | ||||
|  | ||||
| if [[ "$DESIRED_CUDA" == 'xpu' ]]; then | ||||
|     export VC_YEAR=2022 | ||||
|     export XPU_VERSION=2025.2 | ||||
|     export XPU_VERSION=2025.1 | ||||
| fi | ||||
|  | ||||
| pushd "$PYTORCH_ROOT/.ci/pytorch/" | ||||
|  | ||||
							
								
								
									
										2
									
								
								.flake8
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								.flake8
									
									
									
									
									
								
							| @ -73,7 +73,7 @@ exclude = | ||||
|     ./docs/src, | ||||
|     ./functorch/docs, | ||||
|     ./functorch/examples, | ||||
|     ./functorch/docs/source/tutorials, | ||||
|     ./functorch/notebooks, | ||||
|     ./scripts, | ||||
|     ./test/generated_type_hints_smoketest.py, | ||||
|     ./third_party, | ||||
|  | ||||
							
								
								
									
										3
									
								
								.github/actionlint.yaml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.github/actionlint.yaml
									
									
									
									
										vendored
									
									
								
							| @ -12,16 +12,13 @@ self-hosted-runner: | ||||
|     - linux.9xlarge.ephemeral | ||||
|     - am2.linux.9xlarge.ephemeral | ||||
|     - linux.12xlarge | ||||
|     - linux.12xlarge.memory | ||||
|     - linux.24xlarge | ||||
|     - linux.24xlarge.memory | ||||
|     - linux.24xlarge.ephemeral | ||||
|     - linux.24xlarge.amd | ||||
|     - linux.arm64.2xlarge | ||||
|     - linux.arm64.2xlarge.ephemeral | ||||
|     - linux.arm64.m7g.4xlarge | ||||
|     - linux.arm64.m7g.4xlarge.ephemeral | ||||
|     - linux.arm64.r7g.12xlarge.memory | ||||
|     - linux.4xlarge.nvidia.gpu | ||||
|     - linux.8xlarge.nvidia.gpu | ||||
|     - linux.16xlarge.nvidia.gpu | ||||
|  | ||||
| @ -4,11 +4,6 @@ name: Build External packages | ||||
| description: build external packages for PyTorch | ||||
|  | ||||
| inputs: | ||||
|   cuda-version: | ||||
|     description: CUDA version to use | ||||
|     type: string | ||||
|     required: true | ||||
|     default: '12.8.1' | ||||
|   cuda-arch-list: | ||||
|     description: TORCH_CUDA_ARCH_LIST (e.g., "8.0;8.9;9.0") | ||||
|     type: string | ||||
| @ -49,12 +44,10 @@ runs: | ||||
|       env: | ||||
|         SCCACHE_BUCKET: ossci-compiler-cache-circleci-v2 | ||||
|         SCCACHE_REGION: us-east-1 | ||||
|         CUDA_VERSION: ${{ inputs.cuda-version }} | ||||
|         TORCH_CUDA_ARCH_LIST: ${{ inputs.cuda-arch-list }} | ||||
|         BASE_IMAGE: ${{ inputs.docker-image }} | ||||
|         BUILD_TARGETS: ${{ inputs.build-targets }} | ||||
|         PARENT_OUTPUT_DIR: ${{ inputs.output-dir }} | ||||
|         TORCH_WHEELS_PATH: ${{ inputs.torch-wheel-dir }} | ||||
|         PARENT_OUTPUT_DIR: ${{ inputs.output-dir}} | ||||
|       shell: bash | ||||
|       run: | | ||||
|         set -euo pipefail | ||||
| @ -75,6 +68,7 @@ runs: | ||||
|           export OUTPUT_DIR | ||||
|           echo "Building external package: $target in directory $OUTPUT_DIR" | ||||
|           python3 -m cli.run build external "$target" | ||||
|  | ||||
|         done | ||||
|  | ||||
|         END_TIME=$(date +%s) | ||||
|  | ||||
							
								
								
									
										15
									
								
								.github/actions/checkout-pytorch/action.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										15
									
								
								.github/actions/checkout-pytorch/action.yml
									
									
									
									
										vendored
									
									
								
							| @ -57,21 +57,6 @@ runs: | ||||
|         submodules: ${{ inputs.submodules }} | ||||
|         show-progress: false | ||||
|  | ||||
|     - name: Clean submodules post checkout | ||||
|       id: clean-submodules | ||||
|       if: ${{ steps.check_container_runner.outputs.IN_CONTAINER_RUNNER == 'false' }} | ||||
|       shell: bash | ||||
|       env: | ||||
|         NO_SUDO: ${{ inputs.no-sudo }} | ||||
|       run: | | ||||
|         cd "${GITHUB_WORKSPACE}" | ||||
|         # Clean stale submodule dirs | ||||
|         if [ -z "${NO_SUDO}" ]; then | ||||
|           sudo git submodule foreach --recursive git clean -ffdx | ||||
|         else | ||||
|           git submodule foreach --recursive git clean -ffdx | ||||
|         fi | ||||
|  | ||||
|     - name: Clean workspace (try again) | ||||
|       if: ${{ steps.check_container_runner.outputs.IN_CONTAINER_RUNNER == 'false' && | ||||
|         (steps.first-clean.outcome != 'success' || steps.first-checkout-attempt.outcome != 'success') }} | ||||
|  | ||||
| @ -264,7 +264,7 @@ def unzip_artifact_and_replace_files() -> None: | ||||
|         change_content_to_new_version(f"artifacts/dist/{old_stem}/torch/version.py") | ||||
|  | ||||
|         for file in Path(f"artifacts/dist/{old_stem}").glob( | ||||
|             "*.dist-info/*", | ||||
|             "*.dist-info/**", | ||||
|         ): | ||||
|             change_content_to_new_version(file) | ||||
|  | ||||
|  | ||||
							
								
								
									
										16
									
								
								.github/actions/setup-win/action.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								.github/actions/setup-win/action.yml
									
									
									
									
										vendored
									
									
								
							| @ -6,12 +6,6 @@ inputs: | ||||
|   cuda-version: | ||||
|     description: which cuda version to install, 'cpu' for none | ||||
|     required: true | ||||
|   python-version: | ||||
|     required: false | ||||
|     type: string | ||||
|     default: "3.10" | ||||
|     description: | | ||||
|       The python version to be used. Will be 3.10 by default | ||||
|  | ||||
| runs: | ||||
|   using: composite | ||||
| @ -44,24 +38,18 @@ runs: | ||||
|         CONDA="C:\Jenkins\Miniconda3\condabin\conda.bat" | ||||
|  | ||||
|         { | ||||
|           echo "CONDA=${CONDA}"; | ||||
|           echo "CONDA_RUN=${CONDA} run --no-capture-output"; | ||||
|           echo "CONDA_BUILD=${CONDA} run conda-build"; | ||||
|           echo "CONDA_INSTALL=${CONDA} install"; | ||||
|         } >> "${GITHUB_ENV}" | ||||
|  | ||||
|     - name: Setup Python3 | ||||
|       env: | ||||
|           PYTHON_VERSION: ${{ inputs.python-version }} | ||||
|       shell: bash | ||||
|       run: | | ||||
|         set +e | ||||
|         set -x | ||||
|  | ||||
|         # Create new py_tmp env with python-version | ||||
|         ${CONDA} create -y -n py_tmp python=${PYTHON_VERSION} intel-openmp | ||||
|  | ||||
|         PYTHON3=$(${CONDA_RUN} -n py_tmp which python3) | ||||
|         PYTHON3=$(${CONDA_RUN} which python3) | ||||
|         EXIT_CODE=$? | ||||
|  | ||||
|         if [[ "${EXIT_CODE}" == "0" ]]; then | ||||
| @ -74,7 +62,7 @@ runs: | ||||
|           # installation, which is Python 3 based. Its Python is default to Python 3. Further, there | ||||
|           # is also the Miniconda installation that is Python 2 based, and both can be installed if | ||||
|           # needed. In both cases, Python binary is just called python | ||||
|           PYTHON=$(${CONDA_RUN} -n py_tmp which python) | ||||
|           PYTHON=$(${CONDA_RUN} which python) | ||||
|           EXIT_CODE=$? | ||||
|  | ||||
|           if [[ "${EXIT_CODE}" == "0" ]]; then | ||||
|  | ||||
							
								
								
									
										2
									
								
								.github/ci_commit_pins/audio.txt
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/ci_commit_pins/audio.txt
									
									
									
									
										vendored
									
									
								
							| @ -1 +1 @@ | ||||
| 87ff22e49ed0e92576c4935ccb8c143daac4a3cd | ||||
| 10a5002c6195bd95e34df8fe28ff8a2d55a2a922 | ||||
|  | ||||
							
								
								
									
										2
									
								
								.github/ci_commit_pins/fbgemm_rocm.txt
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/ci_commit_pins/fbgemm_rocm.txt
									
									
									
									
										vendored
									
									
								
							| @ -1 +1 @@ | ||||
| 08ae0af1395c8d8471f4025deb6af9aef90b342f | ||||
| 7f1de94a4c2d14f59ad4ca84538c36084ea6b2c8 | ||||
|  | ||||
							
								
								
									
										2
									
								
								.github/ci_commit_pins/vllm.txt
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/ci_commit_pins/vllm.txt
									
									
									
									
										vendored
									
									
								
							| @ -1 +1 @@ | ||||
| 090197034faf3b193c4467cedeb9281e3078892d | ||||
| add1adfec742dfb13e614dab3372b5aafd1ff046 | ||||
|  | ||||
							
								
								
									
										2
									
								
								.github/ci_commit_pins/xla.txt
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/ci_commit_pins/xla.txt
									
									
									
									
										vendored
									
									
								
							| @ -1 +1 @@ | ||||
| c77852e117bdf056c8e9a087e51d6f65cf6ba53d | ||||
| a1c6ee92c85e8b0955c20892ed68f032a6015c09 | ||||
|  | ||||
							
								
								
									
										216
									
								
								.github/ci_configs/vllm/Dockerfile.tmp_vllm
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										216
									
								
								.github/ci_configs/vllm/Dockerfile.tmp_vllm
									
									
									
									
										vendored
									
									
								
							| @ -12,46 +12,54 @@ ARG BUILD_BASE_IMAGE=torch-nightly-base | ||||
| # by default, it uses devel-ubuntu22.04 official image. | ||||
| ARG FINAL_BASE_IMAGE=nvidia/cuda:${CUDA_VERSION}-devel-ubuntu22.04 | ||||
|  | ||||
| # The logic is copied from https://github.com/vllm-project/vllm/blob/main/docker/Dockerfile | ||||
| ARG GET_PIP_URL="https://bootstrap.pypa.io/get-pip.py" | ||||
|  | ||||
|  | ||||
| #################### TORCH NIGHTLY BASE IMAGE #################### | ||||
| #################### TORCH NIGHTLY  BASE IMAGE #################### | ||||
| # A base image for building vLLM with devel ubuntu 22.04, this is mainly used to build vllm in vllm builtkite ci | ||||
| FROM nvidia/cuda:${CUDA_VERSION}-devel-ubuntu22.04 as torch-nightly-base | ||||
| From nvidia/cuda:${CUDA_VERSION}-devel-ubuntu22.04 as torch-nightly-base | ||||
| ARG CUDA_VERSION=12.8.1 | ||||
| ARG PYTHON_VERSION=3.12 | ||||
| ARG TARGETPLATFORM | ||||
| ENV DEBIAN_FRONTEND=noninteractive | ||||
|  | ||||
| ARG CUDA_VERSION | ||||
| ARG PYTHON_VERSION | ||||
| ARG GET_PIP_URL | ||||
| RUN PYTHON_VERSION_STR=$(echo ${PYTHON_VERSION} | sed 's/\.//g') && \ | ||||
|     echo "export PYTHON_VERSION_STR=${PYTHON_VERSION_STR}" >> /etc/environment | ||||
|  | ||||
| # Install Python and other dependencies | ||||
| RUN apt-get update -y \ | ||||
|     && apt-get install -y ccache software-properties-common git curl wget sudo vim \ | ||||
|     && add-apt-repository -y ppa:deadsnakes/ppa \ | ||||
|     && apt-get update -y \ | ||||
|     && apt-get install -y python${PYTHON_VERSION} python${PYTHON_VERSION}-dev python${PYTHON_VERSION}-venv \ | ||||
|     && update-alternatives --install /usr/bin/python3 python3 /usr/bin/python${PYTHON_VERSION} 1 \ | ||||
|     && update-alternatives --set python3 /usr/bin/python${PYTHON_VERSION} \ | ||||
|     && ln -sf /usr/bin/python${PYTHON_VERSION}-config /usr/bin/python3-config \ | ||||
|     && curl -sS ${GET_PIP_URL} | python${PYTHON_VERSION} \ | ||||
|     && python3 --version && python3 -m pip --version | ||||
| # Install Python and other dependencies if it does not existed | ||||
| RUN if ! command -v python3 >/dev/null || ! python3 --version | grep -q "${PYTHON_VERSION}"; then \ | ||||
|       echo "Installing Python ${PYTHON_VERSION}..." && \ | ||||
|       echo 'tzdata tzdata/Areas select America' | debconf-set-selections && \ | ||||
|       echo 'tzdata tzdata/Zones/America select Los_Angeles' | debconf-set-selections && \ | ||||
|       apt-get update -y && \ | ||||
|       apt-get install -y ccache software-properties-common git curl sudo && \ | ||||
|       for i in 1 2 3; do \ | ||||
|         add-apt-repository -y ppa:deadsnakes/ppa && break || \ | ||||
|         { echo "Attempt $i failed, retrying in 5s..."; sleep 5; }; \ | ||||
|       done && \ | ||||
|       apt-get update -y && \ | ||||
|       apt-get install -y python${PYTHON_VERSION} python${PYTHON_VERSION}-dev python${PYTHON_VERSION}-venv && \ | ||||
|       update-alternatives --install /usr/bin/python3 python3 /usr/bin/python${PYTHON_VERSION} 1 && \ | ||||
|       update-alternatives --set python3 /usr/bin/python${PYTHON_VERSION} && \ | ||||
|       ln -sf /usr/bin/python${PYTHON_VERSION}-config /usr/bin/python3-config && \ | ||||
|       curl -sS https://bootstrap.pypa.io/get-pip.py | python${PYTHON_VERSION}; \ | ||||
|    else \ | ||||
|       echo "Python ${PYTHON_VERSION} already present, skipping setup."; \ | ||||
|    fi \ | ||||
|    && python3 --version && python3 -m pip --version | ||||
|  | ||||
| # Upgrade to GCC 10 to avoid https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92519 | ||||
| # as it was causing spam when compiling the CUTLASS kernels | ||||
| # Ensure gcc >= 10 to avoid CUTLASS issues (bug 92519) | ||||
| RUN current_gcc_version=$(gcc -dumpversion | cut -f1 -d.) && \ | ||||
|     if command -v apt-get >/dev/null; then \ | ||||
|         if [ "$current_gcc_version" -lt 10 ]; then \ | ||||
|             echo "GCC version is $current_gcc_version, installing gcc-10..."; \ | ||||
|             apt-get update \ | ||||
|             && apt-get install -y gcc-10 g++-10 \ | ||||
|             && update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 100 \ | ||||
|             && update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-10 100; \ | ||||
|         else \ | ||||
|             echo "GCC version is $current_gcc_version, no need to install gcc-10."; \ | ||||
|         fi \ | ||||
|     fi \ | ||||
|     && gcc --version && g++ --version | ||||
|     if [ "$current_gcc_version" -lt 10 ]; then \ | ||||
|       echo "GCC version is $current_gcc_version, installing gcc-10..."; \ | ||||
|       apt-get update && \ | ||||
|       apt-get install -y gcc-10 g++-10 && \ | ||||
|       update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 100 && \ | ||||
|       update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-10 100; \ | ||||
|     else \ | ||||
|       echo "GCC version is $current_gcc_version, no need to install gcc-10."; \ | ||||
|     fi && \ | ||||
|     gcc --version && g++ --version | ||||
|  | ||||
| # install uv for faster pip installs | ||||
| RUN --mount=type=cache,target=/root/.cache/uv \ | ||||
| @ -71,20 +79,11 @@ ENV UV_LINK_MODE=copy | ||||
| FROM ${BUILD_BASE_IMAGE} AS base | ||||
| USER root | ||||
|  | ||||
| ARG CUDA_VERSION | ||||
| ARG PYTHON_VERSION | ||||
|  | ||||
| # TODO (huydhn): Only work with PyTorch manylinux builder | ||||
| ENV PATH="/opt/python/cp312-cp312/bin:${PATH}" | ||||
|  | ||||
| # Install some system dependencies and double check python version | ||||
| RUN if command -v apt-get >/dev/null; then \ | ||||
|         apt-get update -y \ | ||||
|         && apt-get install -y ccache software-properties-common git curl wget sudo vim; \ | ||||
|     else \ | ||||
|         dnf install -y git curl wget sudo; \ | ||||
|     fi \ | ||||
|     && python3 --version && python3 -m pip --version | ||||
| # Workaround for https://github.com/openai/triton/issues/2507 and | ||||
| # https://github.com/pytorch/pytorch/issues/107960 -- hopefully | ||||
| # this won't be needed for future versions of this docker image | ||||
| # or future versions of triton. | ||||
| RUN ldconfig /usr/local/cuda-$(echo $CUDA_VERSION | cut -d. -f1,2)/compat/ | ||||
|  | ||||
| # Install uv for faster pip installs if not existed | ||||
| RUN --mount=type=cache,target=/root/.cache/uv \ | ||||
| @ -119,15 +118,17 @@ RUN --mount=type=bind,source=${TORCH_WHEELS_PATH},target=/dist \ | ||||
|     if [ -n "$TORCH_WHEELS_PATH" ] && [ "$TORCH_WHEELS_PATH" != "./requirements" ] && [ -d "/dist" ] && ls /dist/torch*.whl >/dev/null 2>&1; then \ | ||||
|         echo "[INFO] Installing torch wheels to build vllm"; \ | ||||
|         torch_whl=$(find /dist -maxdepth 1 -name 'torch-*.whl' -print -quit); \ | ||||
|         vision_whl=$(find /dist -name 'torchvision*.whl' | head -n1 | xargs); \ | ||||
|         audio_whl=$(find /dist -name 'torchaudio*.whl' | head -n1 | xargs); \ | ||||
|         uv pip install --system "${torch_whl}[opt-einsum]" "${vision_whl}" "${audio_whl}" /dist/*.whl; \ | ||||
|         vision_whl=$(find /dist/vision -name 'torchvision*.whl' | head -n1 | xargs); \ | ||||
|         audio_whl=$(find /dist/audio -name 'torchaudio*.whl' | head -n1 | xargs); \ | ||||
|         uv pip install --system "${torch_whl}[opt-einsum]"; \ | ||||
|         uv pip install --system "${vision_whl}"; \ | ||||
|         uv pip install --system "${audio_whl}"; \ | ||||
|     elif [ -n "$PINNED_TORCH_VERSION" ]; then \ | ||||
|         echo "[INFO] Installing pinned torch nightly version to build vllm: $PINNED_TORCH_VERSION"; \ | ||||
|         uv pip install --system "$PINNED_TORCH_VERSION" --index-url https://download.pytorch.org/whl/nightly/cu$(echo $CUDA_VERSION | cut -d. -f1,2 | tr -d '.'); \ | ||||
|         uv pip install --system "$PINNED_TORCH_VERSION" --index-url https://download.pytorch.org/whl/nightly/cu128; \ | ||||
|     else \ | ||||
|         echo "[INFO] Installing torch nightly with latest one to build vllm"; \ | ||||
|         uv pip install --system torch torchvision torchaudio --index-url https://download.pytorch.org/whl/nightly/cu$(echo $CUDA_VERSION | cut -d. -f1,2 | tr -d '.'); \ | ||||
|         uv pip install --system torch torchvision torchaudio --index-url https://download.pytorch.org/whl/nightly/cu128; \ | ||||
|     fi | ||||
|  | ||||
| # Install numba 0.61.2 for cuda environment | ||||
| @ -136,11 +137,12 @@ RUN --mount=type=cache,target=/root/.cache/uv \ | ||||
|  | ||||
| # Install common dependencies from vllm common.txt | ||||
| RUN --mount=type=cache,target=/root/.cache/uv \ | ||||
|     uv pip install --system -r requirements/common.txt | ||||
| uv pip install --system -r requirements/common.txt | ||||
|  | ||||
|  | ||||
| # Must put before installing xformers, so it can install the correct version of xfomrers. | ||||
| ARG xformers_cuda_arch_list='7.5;8.0+PTX;9.0a' | ||||
| ENV TORCH_CUDA_ARCH_LIST=${xformers_cuda_arch_list} | ||||
| ARG exformer_cuda_arch_list='7.5;8.0+PTX;9.0a' | ||||
| ENV TORCH_CUDA_ARCH_LIST=${exformer_cuda_arch_list} | ||||
|  | ||||
| ARG max_jobs=16 | ||||
| ENV MAX_JOBS=${max_jobs} | ||||
| @ -151,8 +153,8 @@ RUN pip freeze | grep -E 'ninja' | ||||
|  | ||||
| # Build xformers with cuda and torch nightly/wheel | ||||
| # following official xformers guidance: https://github.com/facebookresearch/xformers#build | ||||
| # sha for https://github.com/facebookresearch/xformers/tree/v0.0.32.post2 | ||||
| ARG XFORMERS_COMMIT=5d4b92a5e5a9c6c6d4878283f47d82e17995b468 | ||||
| # sha for https://github.com/facebookresearch/xformers/tree/v0.0.31 | ||||
| ARG XFORMERS_COMMIT=eb0946a363464da96ea40afd1a7f72a907c25497 | ||||
| ENV CCACHE_DIR=/root/.cache/ccache | ||||
|  | ||||
| RUN --mount=type=cache,target=/root/.cache/ccache \ | ||||
| @ -174,7 +176,6 @@ RUN --mount=type=cache,target=/root/.cache/uv \ | ||||
| # Build can take a long time, and the torch nightly version fetched from url can be different in next docker stage. | ||||
| # track the nightly torch version used in the build, when we set up runtime environment we can make sure the version is the same | ||||
| RUN uv pip freeze | grep -i '^torch\|^torchvision\|^torchaudio' > torch_build_versions.txt | ||||
|  | ||||
| RUN cat torch_build_versions.txt | ||||
| RUN pip freeze | grep -E 'torch|xformers|torchvision|torchaudio' | ||||
|  | ||||
| @ -186,6 +187,11 @@ RUN pip freeze | grep -E 'torch|xformers|torchvision|torchaudio' | ||||
| FROM base AS build | ||||
| ARG TARGETPLATFORM | ||||
|  | ||||
| ENV UV_HTTP_TIMEOUT=500 | ||||
| ENV UV_INDEX_STRATEGY="unsafe-best-match" | ||||
| # Use copy mode to avoid hardlink failures with Docker cache mounts | ||||
| ENV UV_LINK_MODE=copy | ||||
|  | ||||
| COPY . . | ||||
|  | ||||
| RUN python3 use_existing_torch.py | ||||
| @ -214,16 +220,11 @@ ARG SCCACHE_S3_NO_CREDENTIALS=0 | ||||
| RUN --mount=type=cache,target=/root/.cache/uv \ | ||||
|     --mount=type=bind,source=.git,target=.git \ | ||||
|     if [ "$USE_SCCACHE" = "1" ]; then \ | ||||
|         echo "Installing sccache..."; \ | ||||
|         if [ "$TARGETPLATFORM" = "linux/arm64" ]; then \ | ||||
|             SCCACHE_ARCHIVE="sccache-v0.8.1-aarch64-unknown-linux-musl"; \ | ||||
|         else \ | ||||
|             SCCACHE_ARCHIVE="sccache-v0.8.1-x86_64-unknown-linux-musl"; \ | ||||
|         fi; \ | ||||
|         curl -L -o sccache.tar.gz "https://github.com/mozilla/sccache/releases/download/v0.8.1/${SCCACHE_ARCHIVE}.tar.gz" \ | ||||
|         echo "Installing sccache..." \ | ||||
|         && curl -L -o sccache.tar.gz https://github.com/mozilla/sccache/releases/download/v0.8.1/sccache-v0.8.1-x86_64-unknown-linux-musl.tar.gz \ | ||||
|         && tar -xzf sccache.tar.gz \ | ||||
|         && sudo mv "${SCCACHE_ARCHIVE}"/sccache /usr/bin/sccache \ | ||||
|         && rm -rf sccache.tar.gz "${SCCACHE_ARCHIVE}" \ | ||||
|         && sudo mv sccache-v0.8.1-x86_64-unknown-linux-musl/sccache /usr/bin/sccache \ | ||||
|         && rm -rf sccache.tar.gz sccache-v0.8.1-x86_64-unknown-linux-musl \ | ||||
|         && export SCCACHE_BUCKET=${SCCACHE_BUCKET_NAME} \ | ||||
|         && export SCCACHE_REGION=${SCCACHE_REGION_NAME} \ | ||||
|         && export SCCACHE_S3_NO_CREDENTIALS=${SCCACHE_S3_NO_CREDENTIALS} \ | ||||
| @ -249,9 +250,9 @@ RUN --mount=type=cache,target=/root/.cache/ccache \ | ||||
|         python3 setup.py bdist_wheel --dist-dir=vllm-dist --py-limited-api=cp38; \ | ||||
|     fi | ||||
|  | ||||
| RUN echo "[INFO] Listing current directory:" && \ | ||||
| RUN echo "[DEBUG] Listing  current directory:" && \ | ||||
|     ls -al && \ | ||||
|     echo "[INFO] Showing torch_build_versions.txt content:" && \ | ||||
|     echo "[DEBUG] Showing torch_build_versions.txt content:" && \ | ||||
|     cat torch_build_versions.txt | ||||
|  | ||||
| #################### WHEEL BUILD IMAGE #################### | ||||
| @ -261,42 +262,51 @@ RUN echo "[INFO] Listing current directory:" && \ | ||||
| # Setup clean environment for vLLM for test and api server using ubuntu22.04 with AOT flashinfer | ||||
| FROM ${FINAL_BASE_IMAGE} AS vllm-base | ||||
| USER root | ||||
|  | ||||
| ARG CUDA_VERSION | ||||
| ARG PYTHON_VERSION | ||||
| ARG GET_PIP_URL | ||||
|  | ||||
| # TODO (huydhn): Only work with PyTorch manylinux builder | ||||
| ENV PATH="/opt/python/cp312-cp312/bin:${PATH}" | ||||
|  | ||||
| # prepare for environment starts | ||||
| WORKDIR /workspace | ||||
|  | ||||
| # Install Python and other dependencies | ||||
| RUN if command -v apt-get >/dev/null; then \ | ||||
|         apt-get update -y \ | ||||
|         && apt-get install -y ccache software-properties-common git curl wget sudo vim \ | ||||
|         && add-apt-repository -y ppa:deadsnakes/ppa \ | ||||
|         && apt-get update -y \ | ||||
|         && apt-get install -y python${PYTHON_VERSION} python${PYTHON_VERSION}-dev python${PYTHON_VERSION}-venv \ | ||||
|         && update-alternatives --install /usr/bin/python3 python3 /usr/bin/python${PYTHON_VERSION} 1 \ | ||||
|         && update-alternatives --set python3 /usr/bin/python${PYTHON_VERSION} \ | ||||
|         && ln -sf /usr/bin/python${PYTHON_VERSION}-config /usr/bin/python3-config \ | ||||
|         && curl -sS ${GET_PIP_URL} | python${PYTHON_VERSION}; \ | ||||
|     else \ | ||||
|         dnf install -y git curl wget sudo; \ | ||||
|     fi \ | ||||
|     && python3 --version && python3 -m pip --version | ||||
| RUN PYTHON_VERSION_STR=$(echo ${PYTHON_VERSION} | sed 's/\.//g') && \ | ||||
|     echo "export PYTHON_VERSION_STR=${PYTHON_VERSION_STR}" >> /etc/environment | ||||
|  | ||||
| # Install Python and other dependencies if it does not existed | ||||
| RUN if ! command -v python3 >/dev/null || ! python3 --version | grep -q "${PYTHON_VERSION}"; then \ | ||||
|       echo "Installing Python ${PYTHON_VERSION}..." && \ | ||||
|       echo 'tzdata tzdata/Areas select America' | debconf-set-selections && \ | ||||
|       echo 'tzdata tzdata/Zones/America select Los_Angeles' | debconf-set-selections && \ | ||||
|       apt-get update -y && \ | ||||
|       apt-get install -y ccache software-properties-common git curl sudo && \ | ||||
|       for i in 1 2 3; do \ | ||||
|         add-apt-repository -y ppa:deadsnakes/ppa && break || \ | ||||
|         { echo "Attempt $i failed, retrying in 5s..."; sleep 5; }; \ | ||||
|       done && \ | ||||
|       apt-get update -y && \ | ||||
|       apt-get install -y python${PYTHON_VERSION} python${PYTHON_VERSION}-dev python${PYTHON_VERSION}-venv && \ | ||||
|       update-alternatives --install /usr/bin/python3 python3 /usr/bin/python${PYTHON_VERSION} 1 && \ | ||||
|       update-alternatives --set python3 /usr/bin/python${PYTHON_VERSION} && \ | ||||
|       ln -sf /usr/bin/python${PYTHON_VERSION}-config /usr/bin/python3-config && \ | ||||
|       curl -sS https://bootstrap.pypa.io/get-pip.py | python${PYTHON_VERSION}; \ | ||||
|    else \ | ||||
|       echo "Python ${PYTHON_VERSION} already present, skipping setup."; \ | ||||
|    fi \ | ||||
|    && python3 --version && python3 -m pip --version | ||||
|  | ||||
|  | ||||
| # Get the torch versions, and whls used in previous stagtes for consistency | ||||
| COPY --from=base /workspace/torch_build_versions.txt ./torch_build_versions.txt | ||||
| COPY --from=base /workspace/xformers-dist /wheels/xformers | ||||
| COPY --from=build /workspace/vllm-dist /wheels/vllm | ||||
| RUN echo "[INFO] Listing current directory before torch install step:" && \ | ||||
| RUN echo "[DEBUG] Listing current directory before torch install step:" && \ | ||||
|     ls -al && \ | ||||
|     echo "[INFO] Showing torch_build_versions.txt content:" && \ | ||||
|     echo "[DEBUG] Showing torch_build_versions.txt content:" && \ | ||||
|     cat torch_build_versions.txt | ||||
|  | ||||
| # Workaround for https://github.com/openai/triton/issues/2507 and | ||||
| # https://github.com/pytorch/pytorch/issues/107960 -- hopefully | ||||
| # this won't be needed for future versions of this docker image | ||||
| # or future versions of triton. | ||||
| RUN ldconfig /usr/local/cuda-$(echo $CUDA_VERSION | cut -d. -f1,2)/compat/ | ||||
|  | ||||
|  | ||||
| # Install uv for faster pip installs if not existed | ||||
| RUN --mount=type=cache,target=/root/.cache/uv \ | ||||
|     if ! python3 -m uv --version > /dev/null 2>&1; then \ | ||||
| @ -316,13 +326,15 @@ RUN --mount=type=bind,source=${TORCH_WHEELS_PATH},target=/dist \ | ||||
|     --mount=type=cache,target=/root/.cache/uv \ | ||||
|     if [ -n "$TORCH_WHEELS_PATH" ] && [ "$TORCH_WHEELS_PATH" != "./requirements" ] && [ -d "/dist" ] && ls /dist/torch*.whl >/dev/null 2>&1; then \ | ||||
|         torch_whl=$(find /dist -maxdepth 1 -name 'torch-*.whl' -print -quit); \ | ||||
|         vision_whl=$(find /dist -name 'torchvision*.whl' | head -n1 | xargs); \ | ||||
|         audio_whl=$(find /dist -name 'torchaudio*.whl' | head -n1 | xargs); \ | ||||
|         vision_whl=$(find /dist/vision -name 'torchvision*.whl' | head -n1 | xargs); \ | ||||
|         audio_whl=$(find /dist/audio -name 'torchaudio*.whl' | head -n1 | xargs); \ | ||||
|         echo "[INFO] Use wheels to build : '${torch_whl}' '${audio_whl}' '${vision_whl}'"; \ | ||||
|         uv pip install --system "${torch_whl}[opt-einsum]" "${vision_whl}" "${audio_whl}" /dist/*.whl; \ | ||||
|         uv pip install --system "${torch_whl}[opt-einsum]"; \ | ||||
|         uv pip install --system "${vision_whl}"; \ | ||||
|         uv pip install --system "${audio_whl}"; \ | ||||
|     else \ | ||||
|         echo "[INFO] Installing torch versions from torch_build_versions.txt"; \ | ||||
|         uv pip install --system $(cat torch_build_versions.txt | xargs) --index-url https://download.pytorch.org/whl/nightly/cu$(echo $CUDA_VERSION | cut -d. -f1,2 | tr -d '.'); \ | ||||
|         uv pip install --system $(cat torch_build_versions.txt | xargs) --index-url https://download.pytorch.org/whl/nightly/cu128; \ | ||||
|     fi | ||||
|  | ||||
| # Install the vllm wheel from previous stage | ||||
| @ -333,8 +345,9 @@ RUN --mount=type=cache,target=/root/.cache/uv \ | ||||
| RUN --mount=type=cache,target=/root/.cache/uv \ | ||||
|     uv pip install --system /wheels/xformers/*.whl --verbose | ||||
|  | ||||
|  | ||||
| # Build flashinfer from source. | ||||
| ARG torch_cuda_arch_list='8.0;8.9;9.0a;10.0a;12.0' | ||||
| ARG torch_cuda_arch_list='8.0;8.9;9.0a' | ||||
| # install package for build flashinfer | ||||
| # see issue: https://github.com/flashinfer-ai/flashinfer/issues/738 | ||||
|  | ||||
| @ -345,7 +358,7 @@ ENV TORCH_CUDA_ARCH_LIST=${torch_cuda_arch_list} | ||||
| # Build flashinfer for torch nightly from source around 10 mins | ||||
| ARG FLASHINFER_GIT_REPO="https://github.com/flashinfer-ai/flashinfer.git" | ||||
| # Keep this in sync with https://github.com/vllm-project/vllm/blob/main/requirements/cuda.txt | ||||
| ARG FLASHINFER_GIT_REF="v0.2.14.post1" | ||||
| ARG FLASHINFER_GIT_REF="v0.2.9rc2" | ||||
| RUN --mount=type=cache,target=/root/.cache/uv \ | ||||
|     git clone --depth 1 --recursive --shallow-submodules \ | ||||
|         --branch ${FLASHINFER_GIT_REF} \ | ||||
| @ -363,7 +376,6 @@ RUN --mount=type=cache,target=/root/.cache/uv \ | ||||
|  | ||||
| # Logging to confirm the torch versions | ||||
| RUN pip freeze | grep -E 'torch|xformers|vllm|flashinfer' | ||||
| RUN uv pip freeze | grep -i '^torch\|^torchvision\|^torchaudio\|^xformers\|^vllm\|^flashinfer' > build_summary.txt | ||||
| ################### VLLM INSTALLED IMAGE #################### | ||||
|  | ||||
|  | ||||
| @ -402,6 +414,11 @@ RUN --mount=type=cache,target=/root/.cache/uv \ | ||||
| RUN --mount=type=cache,target=/root/.cache/uv \ | ||||
|     uv pip install --system -r requirements/nightly_torch_test.txt | ||||
|  | ||||
| # Workaround for #17068 | ||||
| # pinned commit for v2.2.4 | ||||
| RUN --mount=type=cache,target=/root/.cache/uv \ | ||||
|     uv pip install --system --no-build-isolation "git+https://github.com/state-spaces/mamba@95d8aba8a8c75aedcaa6143713b11e745e7cd0d9#egg=mamba-ssm" | ||||
|  | ||||
| # Logging to confirm the torch versions | ||||
| RUN pip freeze | grep -E 'torch|xformers|vllm|flashinfer' | ||||
|  | ||||
| @ -416,5 +433,4 @@ FROM scratch as export-wheels | ||||
| # Just copy the wheels we prepared in previous stages | ||||
| COPY --from=base /workspace/xformers-dist /wheels/xformers | ||||
| COPY --from=build /workspace/vllm-dist /wheels/vllm | ||||
| COPY --from=vllm-base /workspace/build_summary.txt /wheels/build_summary.txt | ||||
| COPY --from=vllm-base /workspace/wheels/flashinfer /wheels/flashinfer-python | ||||
|  | ||||
							
								
								
									
										17
									
								
								.github/ci_configs/vllm/use_existing_torch.py
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										17
									
								
								.github/ci_configs/vllm/use_existing_torch.py
									
									
									
									
										vendored
									
									
								
							| @ -1,17 +0,0 @@ | ||||
| import glob | ||||
|  | ||||
|  | ||||
| requires_files = glob.glob("requirements/*.txt") | ||||
| requires_files += ["pyproject.toml"] | ||||
| for file in requires_files: | ||||
|     print(f">>> cleaning {file}") | ||||
|     with open(file) as f: | ||||
|         lines = f.readlines() | ||||
|     if "torch" in "".join(lines).lower(): | ||||
|         print("removed:") | ||||
|         with open(file, "w") as f: | ||||
|             for line in lines: | ||||
|                 if "torch" not in line.lower(): | ||||
|                     f.write(line) | ||||
|     print(f"<<< done cleaning {file}") | ||||
|     print() | ||||
							
								
								
									
										3
									
								
								.github/labeler.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.github/labeler.yml
									
									
									
									
										vendored
									
									
								
							| @ -130,6 +130,3 @@ | ||||
| - torch/csrc/inductor/aoti_include/** | ||||
| - torchgen/aoti/** | ||||
| - torchgen/gen_aoti_c_shim.py | ||||
|  | ||||
| "ciflow/vllm": | ||||
| - .github/ci_commit_pins/vllm.txt | ||||
|  | ||||
							
								
								
									
										1
									
								
								.github/pytorch-probot.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.github/pytorch-probot.yml
									
									
									
									
										vendored
									
									
								
							| @ -36,7 +36,6 @@ ciflow_push_tags: | ||||
| - ciflow/win-arm64 | ||||
| - ciflow/h100-symm-mem | ||||
| - ciflow/h100-cutlass-backend | ||||
| - ciflow/b200 | ||||
| retryable_workflows: | ||||
| - pull | ||||
| - trunk | ||||
|  | ||||
| @ -15,7 +15,7 @@ optree==0.13.0 | ||||
| packaging==23.1 | ||||
| parameterized==0.8.1 | ||||
| pillow==10.3.0 | ||||
| protobuf==5.29.5 | ||||
| protobuf==5.29.4 | ||||
| psutil==5.9.8 | ||||
| pygments==2.15.0 | ||||
| pytest-cpp==2.3.0 | ||||
| @ -26,9 +26,9 @@ pytest-xdist==3.3.1 | ||||
| pytest==7.3.2 | ||||
| pyyaml==6.0.2 | ||||
| scipy==1.12.0 | ||||
| setuptools==78.1.1 | ||||
| setuptools==72.1.0 | ||||
| sympy==1.13.3 | ||||
| tlparse==0.4.0 | ||||
| tlparse==0.3.30 | ||||
| tensorboard==2.13.0 | ||||
| typing-extensions==4.12.2 | ||||
| unittest-xml-reporting<=3.2.0,>=2.0.0 | ||||
|  | ||||
							
								
								
									
										1
									
								
								.github/scripts/build_triton_wheel.py
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.github/scripts/build_triton_wheel.py
									
									
									
									
										vendored
									
									
								
							| @ -84,7 +84,6 @@ def build_triton( | ||||
|                 ["git", "checkout", f"release/{ver}.{rev}.x"], cwd=triton_basedir | ||||
|             ) | ||||
|         else: | ||||
|             check_call(["git", "fetch", "origin", commit_hash], cwd=triton_basedir) | ||||
|             check_call(["git", "checkout", commit_hash], cwd=triton_basedir) | ||||
|  | ||||
|         # change built wheel name and version | ||||
|  | ||||
							
								
								
									
										4
									
								
								.github/scripts/docathon-label-sync.py
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.github/scripts/docathon-label-sync.py
									
									
									
									
										vendored
									
									
								
							| @ -39,9 +39,7 @@ def main() -> None: | ||||
|     pull_request_label_names = [label.name for label in pull_request_labels] | ||||
|     issue_label_names = [label.name for label in issue_labels] | ||||
|     labels_to_add = [ | ||||
|         label | ||||
|         for label in issue_label_names | ||||
|         if label not in pull_request_label_names and label != "actionable" | ||||
|         label for label in issue_label_names if label not in pull_request_label_names | ||||
|     ] | ||||
|     if not labels_to_add: | ||||
|         print("The pull request already has the same labels.") | ||||
|  | ||||
							
								
								
									
										177
									
								
								.github/scripts/generate_binary_build_matrix.py
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										177
									
								
								.github/scripts/generate_binary_build_matrix.py
									
									
									
									
										vendored
									
									
								
							| @ -16,16 +16,18 @@ from typing import Optional | ||||
|  | ||||
|  | ||||
| # NOTE: Please also update the CUDA sources in `PIP_SOURCES` in tools/nightly.py when changing this | ||||
| CUDA_ARCHES = ["12.6", "12.8", "13.0"] | ||||
| CUDA_ARCHES = ["12.6", "12.8", "12.9", "13.0"] | ||||
| CUDA_STABLE = "12.8" | ||||
| CUDA_ARCHES_FULL_VERSION = { | ||||
|     "12.6": "12.6.3", | ||||
|     "12.8": "12.8.1", | ||||
|     "12.9": "12.9.1", | ||||
|     "13.0": "13.0.0", | ||||
| } | ||||
| CUDA_ARCHES_CUDNN_VERSION = { | ||||
|     "12.6": "9", | ||||
|     "12.8": "9", | ||||
|     "12.9": "9", | ||||
|     "13.0": "9", | ||||
| } | ||||
|  | ||||
| @ -38,82 +40,99 @@ CPU_AARCH64_ARCH = ["cpu-aarch64"] | ||||
|  | ||||
| CPU_S390X_ARCH = ["cpu-s390x"] | ||||
|  | ||||
| CUDA_AARCH64_ARCHES = ["12.6-aarch64", "12.8-aarch64", "13.0-aarch64"] | ||||
| CUDA_AARCH64_ARCHES = ["12.9-aarch64"] | ||||
|  | ||||
|  | ||||
| PYTORCH_EXTRA_INSTALL_REQUIREMENTS = { | ||||
|     "12.6": ( | ||||
|         "nvidia-cuda-nvrtc-cu12==12.6.77; platform_system == 'Linux' | " | ||||
|         "nvidia-cuda-runtime-cu12==12.6.77; platform_system == 'Linux' | " | ||||
|         "nvidia-cuda-cupti-cu12==12.6.80; platform_system == 'Linux' | " | ||||
|         "nvidia-cudnn-cu12==9.10.2.21; platform_system == 'Linux' | " | ||||
|         "nvidia-cublas-cu12==12.6.4.1; platform_system == 'Linux' | " | ||||
|         "nvidia-cufft-cu12==11.3.0.4; platform_system == 'Linux' | " | ||||
|         "nvidia-curand-cu12==10.3.7.77; platform_system == 'Linux' | " | ||||
|         "nvidia-cusolver-cu12==11.7.1.2; platform_system == 'Linux' | " | ||||
|         "nvidia-cusparse-cu12==12.5.4.2; platform_system == 'Linux' | " | ||||
|         "nvidia-cusparselt-cu12==0.7.1; platform_system == 'Linux' | " | ||||
|         "nvidia-nccl-cu12==2.27.5; platform_system == 'Linux' | " | ||||
|         "nvidia-nvshmem-cu12==3.3.24; platform_system == 'Linux' | " | ||||
|         "nvidia-nvtx-cu12==12.6.77; platform_system == 'Linux' | " | ||||
|         "nvidia-nvjitlink-cu12==12.6.85; platform_system == 'Linux' | " | ||||
|         "nvidia-cufile-cu12==1.11.1.6; platform_system == 'Linux'" | ||||
|         "nvidia-cuda-nvrtc-cu12==12.6.77; platform_system == 'Linux' and platform_machine == 'x86_64' | " | ||||
|         "nvidia-cuda-runtime-cu12==12.6.77; platform_system == 'Linux' and platform_machine == 'x86_64' | " | ||||
|         "nvidia-cuda-cupti-cu12==12.6.80; platform_system == 'Linux' and platform_machine == 'x86_64' | " | ||||
|         "nvidia-cudnn-cu12==9.10.2.21; platform_system == 'Linux' and platform_machine == 'x86_64' | " | ||||
|         "nvidia-cublas-cu12==12.6.4.1; platform_system == 'Linux' and platform_machine == 'x86_64' | " | ||||
|         "nvidia-cufft-cu12==11.3.0.4; platform_system == 'Linux' and platform_machine == 'x86_64' | " | ||||
|         "nvidia-curand-cu12==10.3.7.77; platform_system == 'Linux' and platform_machine == 'x86_64' | " | ||||
|         "nvidia-cusolver-cu12==11.7.1.2; platform_system == 'Linux' and platform_machine == 'x86_64' | " | ||||
|         "nvidia-cusparse-cu12==12.5.4.2; platform_system == 'Linux' and platform_machine == 'x86_64' | " | ||||
|         "nvidia-cusparselt-cu12==0.7.1; platform_system == 'Linux' and platform_machine == 'x86_64' | " | ||||
|         "nvidia-nccl-cu12==2.27.5; platform_system == 'Linux' and platform_machine == 'x86_64' | " | ||||
|         "nvidia-nvshmem-cu12==3.3.20; platform_system == 'Linux' and platform_machine == 'x86_64' | " | ||||
|         "nvidia-nvtx-cu12==12.6.77; platform_system == 'Linux' and platform_machine == 'x86_64' | " | ||||
|         "nvidia-nvjitlink-cu12==12.6.85; platform_system == 'Linux' and platform_machine == 'x86_64' | " | ||||
|         "nvidia-cufile-cu12==1.11.1.6; platform_system == 'Linux' and platform_machine == 'x86_64'" | ||||
|     ), | ||||
|     "12.8": ( | ||||
|         "nvidia-cuda-nvrtc-cu12==12.8.93; platform_system == 'Linux' | " | ||||
|         "nvidia-cuda-runtime-cu12==12.8.90; platform_system == 'Linux' | " | ||||
|         "nvidia-cuda-cupti-cu12==12.8.90; platform_system == 'Linux' | " | ||||
|         "nvidia-cudnn-cu12==9.10.2.21; platform_system == 'Linux' | " | ||||
|         "nvidia-cublas-cu12==12.8.4.1; platform_system == 'Linux' | " | ||||
|         "nvidia-cufft-cu12==11.3.3.83; platform_system == 'Linux' | " | ||||
|         "nvidia-curand-cu12==10.3.9.90; platform_system == 'Linux' | " | ||||
|         "nvidia-cusolver-cu12==11.7.3.90; platform_system == 'Linux' | " | ||||
|         "nvidia-cusparse-cu12==12.5.8.93; platform_system == 'Linux' | " | ||||
|         "nvidia-cusparselt-cu12==0.7.1; platform_system == 'Linux' | " | ||||
|         "nvidia-nccl-cu12==2.27.5; platform_system == 'Linux' | " | ||||
|         "nvidia-nvshmem-cu12==3.3.24; platform_system == 'Linux' | " | ||||
|         "nvidia-nvtx-cu12==12.8.90; platform_system == 'Linux' | " | ||||
|         "nvidia-nvjitlink-cu12==12.8.93; platform_system == 'Linux' | " | ||||
|         "nvidia-cufile-cu12==1.13.1.3; platform_system == 'Linux'" | ||||
|         "nvidia-cuda-nvrtc-cu12==12.8.93; platform_system == 'Linux' and platform_machine == 'x86_64' | " | ||||
|         "nvidia-cuda-runtime-cu12==12.8.90; platform_system == 'Linux' and platform_machine == 'x86_64' | " | ||||
|         "nvidia-cuda-cupti-cu12==12.8.90; platform_system == 'Linux' and platform_machine == 'x86_64' | " | ||||
|         "nvidia-cudnn-cu12==9.10.2.21; platform_system == 'Linux' and platform_machine == 'x86_64' | " | ||||
|         "nvidia-cublas-cu12==12.8.4.1; platform_system == 'Linux' and platform_machine == 'x86_64' | " | ||||
|         "nvidia-cufft-cu12==11.3.3.83; platform_system == 'Linux' and platform_machine == 'x86_64' | " | ||||
|         "nvidia-curand-cu12==10.3.9.90; platform_system == 'Linux' and platform_machine == 'x86_64' | " | ||||
|         "nvidia-cusolver-cu12==11.7.3.90; platform_system == 'Linux' and platform_machine == 'x86_64' | " | ||||
|         "nvidia-cusparse-cu12==12.5.8.93; platform_system == 'Linux' and platform_machine == 'x86_64' | " | ||||
|         "nvidia-cusparselt-cu12==0.7.1; platform_system == 'Linux' and platform_machine == 'x86_64' | " | ||||
|         "nvidia-nccl-cu12==2.27.5; platform_system == 'Linux' and platform_machine == 'x86_64' | " | ||||
|         "nvidia-nvshmem-cu12==3.3.20; platform_system == 'Linux' and platform_machine == 'x86_64' | " | ||||
|         "nvidia-nvtx-cu12==12.8.90; platform_system == 'Linux' and platform_machine == 'x86_64' | " | ||||
|         "nvidia-nvjitlink-cu12==12.8.93; platform_system == 'Linux' and platform_machine == 'x86_64' | " | ||||
|         "nvidia-cufile-cu12==1.13.1.3; platform_system == 'Linux' and platform_machine == 'x86_64'" | ||||
|     ), | ||||
|     "12.9": ( | ||||
|         "nvidia-cuda-nvrtc-cu12==12.9.86; platform_system == 'Linux' and platform_machine == 'x86_64' | " | ||||
|         "nvidia-cuda-runtime-cu12==12.9.79; platform_system == 'Linux' and platform_machine == 'x86_64' | " | ||||
|         "nvidia-cuda-cupti-cu12==12.9.79; platform_system == 'Linux' and platform_machine == 'x86_64' | " | ||||
|         "nvidia-cudnn-cu12==9.10.2.21; platform_system == 'Linux' and platform_machine == 'x86_64' | " | ||||
|         "nvidia-cublas-cu12==12.9.1.4; platform_system == 'Linux' and platform_machine == 'x86_64' | " | ||||
|         "nvidia-cufft-cu12==11.4.1.4; platform_system == 'Linux' and platform_machine == 'x86_64' | " | ||||
|         "nvidia-curand-cu12==10.3.10.19; platform_system == 'Linux' and platform_machine == 'x86_64' | " | ||||
|         "nvidia-cusolver-cu12==11.7.5.82; platform_system == 'Linux' and platform_machine == 'x86_64' | " | ||||
|         "nvidia-cusparse-cu12==12.5.10.65; platform_system == 'Linux' and platform_machine == 'x86_64' | " | ||||
|         "nvidia-cusparselt-cu12==0.7.1; platform_system == 'Linux' and platform_machine == 'x86_64' | " | ||||
|         "nvidia-nccl-cu12==2.27.5; platform_system == 'Linux' and platform_machine == 'x86_64' | " | ||||
|         "nvidia-nvshmem-cu12==3.3.20; platform_system == 'Linux' and platform_machine == 'x86_64' | " | ||||
|         "nvidia-nvtx-cu12==12.9.79; platform_system == 'Linux' and platform_machine == 'x86_64' | " | ||||
|         "nvidia-nvjitlink-cu12==12.9.86; platform_system == 'Linux' and platform_machine == 'x86_64' | " | ||||
|         "nvidia-cufile-cu12==1.14.1.1; platform_system == 'Linux' and platform_machine == 'x86_64'" | ||||
|     ), | ||||
|     "13.0": ( | ||||
|         "nvidia-cuda-nvrtc==13.0.48; platform_system == 'Linux' | " | ||||
|         "nvidia-cuda-runtime==13.0.48; platform_system == 'Linux' | " | ||||
|         "nvidia-cuda-cupti==13.0.48; platform_system == 'Linux' | " | ||||
|         "nvidia-cudnn-cu13==9.13.0.50; platform_system == 'Linux' | " | ||||
|         "nvidia-cublas==13.0.0.19; platform_system == 'Linux' | " | ||||
|         "nvidia-cufft==12.0.0.15; platform_system == 'Linux' | " | ||||
|         "nvidia-curand==10.4.0.35; platform_system == 'Linux' | " | ||||
|         "nvidia-cusolver==12.0.3.29; platform_system == 'Linux' | " | ||||
|         "nvidia-cusparse==12.6.2.49; platform_system == 'Linux' | " | ||||
|         "nvidia-cusparselt-cu13==0.8.0; platform_system == 'Linux' | " | ||||
|         "nvidia-nccl-cu13==2.27.7; platform_system == 'Linux' | " | ||||
|         "nvidia-nvshmem-cu13==3.3.24; platform_system == 'Linux' | " | ||||
|         "nvidia-nvtx==13.0.39; platform_system == 'Linux' | " | ||||
|         "nvidia-nvjitlink==13.0.39; platform_system == 'Linux' | " | ||||
|         "nvidia-cufile==1.15.0.42; platform_system == 'Linux'" | ||||
|         "nvidia-cuda-nvrtc==13.0.48; platform_system == 'Linux' and platform_machine == 'x86_64' | " | ||||
|         "nvidia-cuda-runtime==13.0.48; platform_system == 'Linux' and platform_machine == 'x86_64' | " | ||||
|         "nvidia-cuda-cupti==13.0.48; platform_system == 'Linux' and platform_machine == 'x86_64' | " | ||||
|         "nvidia-cudnn-cu13==9.12.0.46; platform_system == 'Linux' and platform_machine == 'x86_64' | " | ||||
|         "nvidia-cublas==13.0.0.19; platform_system == 'Linux' and platform_machine == 'x86_64' | " | ||||
|         "nvidia-cufft==12.0.0.15; platform_system == 'Linux' and platform_machine == 'x86_64' | " | ||||
|         "nvidia-curand==10.4.0.35; platform_system == 'Linux' and platform_machine == 'x86_64' | " | ||||
|         "nvidia-cusolver==12.0.3.29; platform_system == 'Linux' and platform_machine == 'x86_64' | " | ||||
|         "nvidia-cusparse==12.6.2.49; platform_system == 'Linux' and platform_machine == 'x86_64' | " | ||||
|         "nvidia-cusparselt-cu13==0.8.0; platform_system == 'Linux' and platform_machine == 'x86_64' | " | ||||
|         "nvidia-nccl-cu13==2.27.7; platform_system == 'Linux' and platform_machine == 'x86_64' | " | ||||
|         "nvidia-nvshmem-cu13==3.3.20; platform_system == 'Linux' and platform_machine == 'x86_64' | " | ||||
|         "nvidia-nvtx==13.0.39; platform_system == 'Linux' and platform_machine == 'x86_64' | " | ||||
|         "nvidia-nvjitlink==13.0.39; platform_system == 'Linux' and platform_machine == 'x86_64' | " | ||||
|         "nvidia-cufile==1.15.0.42; platform_system == 'Linux' and platform_machine == 'x86_64'" | ||||
|     ), | ||||
|     "xpu": ( | ||||
|         "intel-cmplr-lib-rt==2025.2.1 | " | ||||
|         "intel-cmplr-lib-ur==2025.2.1 | " | ||||
|         "intel-cmplr-lic-rt==2025.2.1 | " | ||||
|         "intel-sycl-rt==2025.2.1 | " | ||||
|         "oneccl-devel==2021.16.1; platform_system == 'Linux' and platform_machine == 'x86_64' | " | ||||
|         "oneccl==2021.16.1; platform_system == 'Linux' and platform_machine == 'x86_64' | " | ||||
|         "impi-rt==2021.16.1; platform_system == 'Linux' and platform_machine == 'x86_64' | " | ||||
|         "onemkl-sycl-blas==2025.2.0 | " | ||||
|         "onemkl-sycl-dft==2025.2.0 | " | ||||
|         "onemkl-sycl-lapack==2025.2.0 | " | ||||
|         "onemkl-sycl-rng==2025.2.0 | " | ||||
|         "onemkl-sycl-sparse==2025.2.0 | " | ||||
|         "dpcpp-cpp-rt==2025.2.1 | " | ||||
|         "intel-opencl-rt==2025.2.1 | " | ||||
|         "mkl==2025.2.0 | " | ||||
|         "intel-openmp==2025.2.1 | " | ||||
|         "tbb==2022.2.0 | " | ||||
|         "tcmlib==1.4.0 | " | ||||
|         "umf==0.11.0 | " | ||||
|         "intel-pti==0.13.1" | ||||
|         "intel-cmplr-lib-rt==2025.1.1 | " | ||||
|         "intel-cmplr-lib-ur==2025.1.1 | " | ||||
|         "intel-cmplr-lic-rt==2025.1.1 | " | ||||
|         "intel-sycl-rt==2025.1.1 | " | ||||
|         "oneccl-devel==2021.15.2; platform_system == 'Linux' and platform_machine == 'x86_64' | " | ||||
|         "oneccl==2021.15.2; platform_system == 'Linux' and platform_machine == 'x86_64' | " | ||||
|         "impi-rt==2021.15.0; platform_system == 'Linux' and platform_machine == 'x86_64' | " | ||||
|         "onemkl-sycl-blas==2025.1.0 | " | ||||
|         "onemkl-sycl-dft==2025.1.0 | " | ||||
|         "onemkl-sycl-lapack==2025.1.0 | " | ||||
|         "onemkl-sycl-rng==2025.1.0 | " | ||||
|         "onemkl-sycl-sparse==2025.1.0 | " | ||||
|         "dpcpp-cpp-rt==2025.1.1 | " | ||||
|         "intel-opencl-rt==2025.1.1 | " | ||||
|         "mkl==2025.1.0 | " | ||||
|         "intel-openmp==2025.1.1 | " | ||||
|         "tbb==2022.1.0 | " | ||||
|         "tcmlib==1.3.0 | " | ||||
|         "umf==0.10.0 | " | ||||
|         "intel-pti==0.12.3" | ||||
|     ), | ||||
| } | ||||
|  | ||||
| @ -191,7 +210,7 @@ LIBTORCH_CONTAINER_IMAGES: dict[str, str] = { | ||||
|     "cpu": "libtorch-cxx11-builder:cpu", | ||||
| } | ||||
|  | ||||
| FULL_PYTHON_VERSIONS = ["3.10", "3.11", "3.12", "3.13", "3.13t", "3.14", "3.14t"] | ||||
| FULL_PYTHON_VERSIONS = ["3.9", "3.10", "3.11", "3.12", "3.13", "3.13t", "3.14", "3.14t"] | ||||
|  | ||||
|  | ||||
| def translate_desired_cuda(gpu_arch_type: str, gpu_arch_version: str) -> str: | ||||
| @ -221,8 +240,12 @@ def generate_libtorch_matrix( | ||||
|         if os == "linux": | ||||
|             arches += CUDA_ARCHES | ||||
|             arches += ROCM_ARCHES | ||||
|             if "13.0" in arches: | ||||
|                 arches.remove("13.0") | ||||
|         elif os == "windows": | ||||
|             arches += CUDA_ARCHES | ||||
|             if "13.0" in arches: | ||||
|                 arches.remove("13.0") | ||||
|     if libtorch_variants is None: | ||||
|         libtorch_variants = [ | ||||
|             "shared-with-deps", | ||||
| @ -287,6 +310,8 @@ def generate_wheels_matrix( | ||||
|             arches += CUDA_ARCHES + ROCM_ARCHES + XPU_ARCHES | ||||
|         elif os == "windows": | ||||
|             arches += CUDA_ARCHES + XPU_ARCHES | ||||
|             if "13.0" in arches: | ||||
|                 arches.remove("13.0") | ||||
|         elif os == "linux-aarch64": | ||||
|             # Separate new if as the CPU type is different and | ||||
|             # uses different build/test scripts | ||||
| @ -309,20 +334,19 @@ def generate_wheels_matrix( | ||||
|                 else arch_version | ||||
|             ) | ||||
|  | ||||
|             # TODO: Enable python 3.13t on cpu-s390x | ||||
|             if gpu_arch_type == "cpu-s390x" and python_version == "3.13t": | ||||
|                 continue | ||||
|             # TODO: Enable python 3.14 for rest | ||||
|             if os not in [ | ||||
|                 "linux", | ||||
|                 "linux-aarch64", | ||||
|                 "linux-s390x", | ||||
|                 "macos-arm64", | ||||
|                 "windows", | ||||
|             ] and (python_version == "3.14" or python_version == "3.14t"): | ||||
|             if os not in ["linux", "linux-aarch64", "macos-arm64", "windows"] and ( | ||||
|                 python_version == "3.14" or python_version == "3.14t" | ||||
|             ): | ||||
|                 continue | ||||
|  | ||||
|             # cuda linux wheels require PYTORCH_EXTRA_INSTALL_REQUIREMENTS to install | ||||
|  | ||||
|             if ( | ||||
|                 arch_version in ["13.0", "12.8", "12.6"] | ||||
|                 arch_version in ["13.0", "12.9", "12.8", "12.6"] | ||||
|                 and os == "linux" | ||||
|                 or arch_version in CUDA_AARCH64_ARCHES | ||||
|             ): | ||||
| @ -386,5 +410,6 @@ def generate_wheels_matrix( | ||||
|  | ||||
|  | ||||
| validate_nccl_dep_consistency("13.0") | ||||
| validate_nccl_dep_consistency("12.9") | ||||
| validate_nccl_dep_consistency("12.8") | ||||
| validate_nccl_dep_consistency("12.6") | ||||
|  | ||||
							
								
								
									
										2
									
								
								.github/scripts/generate_ci_workflows.py
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/scripts/generate_ci_workflows.py
									
									
									
									
										vendored
									
									
								
							| @ -135,7 +135,7 @@ ROCM_SMOKE_WORKFLOWS = [ | ||||
|         build_configs=generate_binary_build_matrix.generate_wheels_matrix( | ||||
|             OperatingSystem.LINUX, | ||||
|             arches=["6.4"], | ||||
|             python_versions=["3.10"], | ||||
|             python_versions=["3.9"], | ||||
|         ), | ||||
|         ciflow_config=CIFlowConfig( | ||||
|             labels={ | ||||
|  | ||||
							
								
								
									
										94
									
								
								.github/scripts/prepare_vllm_wheels.sh
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										94
									
								
								.github/scripts/prepare_vllm_wheels.sh
									
									
									
									
										vendored
									
									
								
							| @ -1,94 +0,0 @@ | ||||
| #!/usr/bin/env bash | ||||
|  | ||||
| set -eux | ||||
|  | ||||
| torch_version=$(unzip -p torch-* '**/METADATA' | grep '^Version: ' | cut -d' ' -f2) | ||||
| nightly=$(echo ${torch_version} | cut -d'.' -f4) | ||||
|  | ||||
| # Copied from .ci/manywheel/build_common.sh | ||||
| make_wheel_record() { | ||||
|   fpath=$1 | ||||
|   if echo $fpath | grep RECORD >/dev/null 2>&1; then | ||||
|     echo "$fpath,," | ||||
|   else | ||||
|     fhash=$(openssl dgst -sha256 -binary $fpath | openssl base64 | sed -e 's/+/-/g' | sed -e 's/\//_/g' | sed -e 's/=//g') | ||||
|     fsize=$(ls -nl $fpath | awk '{print $5}') | ||||
|     echo "$fpath,sha256=$fhash,$fsize" | ||||
|   fi | ||||
| } | ||||
|  | ||||
| change_wheel_version() { | ||||
|   local package=$1 | ||||
|   local wheel=$2 | ||||
|   local f_version=$3 | ||||
|   local t_version=$4 | ||||
|  | ||||
|   # Extract the wheel | ||||
|   ${PYTHON_EXECUTABLE} -mwheel unpack $wheel | ||||
|  | ||||
|   mv "${package}-${f_version}" "${package}-${t_version}" | ||||
|   # Change the version from f_version to t_version in the dist-info dir | ||||
|   pushd "${package}-${t_version}" | ||||
|   mv "${package}-${f_version}.dist-info" "${package}-${t_version}.dist-info" | ||||
|  | ||||
|   pushd "${package}-${t_version}.dist-info" | ||||
|   sed -i "s/${package}-${f_version}.dist-info/${package}-${t_version}.dist-info/g" RECORD | ||||
|  | ||||
|   # Update the version in METADATA and its SHA256 hash | ||||
|   sed -i "s/Version: ${f_version}/Version: ${t_version}/g" METADATA | ||||
|   # then add PyTorch nightly dependency of vLLM | ||||
|   if [[ "${package}" == vllm ]] || [[ "${package}" == xformers ]]; then | ||||
|     sed -i "/License-File/a\Requires-Dist: torch==${torch_version}" METADATA | ||||
|   fi | ||||
|   sed -i '/METADATA,sha256/d' RECORD | ||||
|   popd | ||||
|  | ||||
|   make_wheel_record "${package}-${t_version}.dist-info/METADATA" >> "${package}-${t_version}.dist-info/RECORD" | ||||
|   popd | ||||
|  | ||||
|   # Repack the wheel | ||||
|   ${PYTHON_EXECUTABLE} -mwheel pack "${package}-${t_version}" | ||||
|  | ||||
|   # Clean up | ||||
|   rm -rf "${package}-${t_version}" | ||||
| } | ||||
|  | ||||
| repackage_wheel() { | ||||
|   local package=$1 | ||||
|   pushd $package | ||||
|  | ||||
|   local orig_wheel=$(find . -name *${package//-/_}*) | ||||
|   local orig_version=$(unzip -p $orig_wheel '**/METADATA' | grep '^Version: ' | cut -d' ' -f2) | ||||
|  | ||||
|   local version="" | ||||
|   if [[ "${package}" == vllm ]]; then | ||||
|     # Copied from vllm/.buildkite/scripts/upload-wheels.sh | ||||
|     version=1.0.0 | ||||
|   else | ||||
|     version=$(echo $orig_version | tr '.+' '.' | cut -d'.' -f1-3) | ||||
|   fi | ||||
|   local nightly_version=$version.$nightly | ||||
|  | ||||
|   # Use nightly version | ||||
|   change_wheel_version ${package//-/_} $orig_wheel $orig_version $nightly_version | ||||
|   # Clean up | ||||
|   rm "${orig_wheel}" | ||||
|  | ||||
|   auditwheel repair --plat $PLATFORM *.whl \ | ||||
|     --exclude libc10* --exclude libtorch* --exclude libcu* --exclude libnv* | ||||
|   local repair_wheel=$(find wheelhouse -name *${PLATFORM}*) | ||||
|   local repair_wheel=$(basename ${repair_wheel}) | ||||
|   popd | ||||
|  | ||||
|   cp ${package}/wheelhouse/${repair_wheel} . | ||||
|   rm -rf $package | ||||
| } | ||||
|  | ||||
| # Require to re-package the wheel | ||||
| ${PYTHON_EXECUTABLE} -mpip install wheel==0.45.1 | ||||
|  | ||||
| pushd externals/vllm/wheels | ||||
| for package in xformers flashinfer-python vllm; do | ||||
|   repackage_wheel $package | ||||
| done | ||||
| popd | ||||
							
								
								
									
										182
									
								
								.github/scripts/test_trymerge.py
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										182
									
								
								.github/scripts/test_trymerge.py
									
									
									
									
										vendored
									
									
								
							| @ -27,7 +27,6 @@ from trymerge import ( | ||||
|     get_drci_classifications, | ||||
|     gh_get_team_members, | ||||
|     GitHubPR, | ||||
|     iter_issue_timeline_until_comment, | ||||
|     JobCheckState, | ||||
|     main as trymerge_main, | ||||
|     MandatoryChecksMissingError, | ||||
| @ -35,8 +34,6 @@ from trymerge import ( | ||||
|     RE_GHSTACK_DESC, | ||||
|     read_merge_rules, | ||||
|     remove_job_name_suffix, | ||||
|     sha_from_committed_event, | ||||
|     sha_from_force_push_after, | ||||
|     validate_revert, | ||||
| ) | ||||
|  | ||||
| @ -127,7 +124,7 @@ def mock_parse_args(revert: bool = False, force: bool = False) -> Any: | ||||
|             self.force = force | ||||
|             self.pr_num = 76123 | ||||
|             self.dry_run = True | ||||
|             self.comment_id = 12345  # Set to non-zero value | ||||
|             self.comment_id = 0 | ||||
|             self.reason = "this is for testing" | ||||
|             self.ignore_current = False | ||||
|             self.check_mergeability = False | ||||
| @ -155,9 +152,9 @@ def mock_revert( | ||||
| def mock_merge( | ||||
|     pr: GitHubPR, | ||||
|     repo: GitRepo, | ||||
|     comment_id: int, | ||||
|     dry_run: bool = False, | ||||
|     skip_mandatory_checks: bool = False, | ||||
|     comment_id: Optional[int] = None, | ||||
|     timeout_minutes: int = 400, | ||||
|     stale_pr_days: int = 3, | ||||
|     ignore_current: bool = False, | ||||
| @ -473,9 +470,9 @@ class TestTryMerge(TestCase): | ||||
|         mock_merge.assert_called_once_with( | ||||
|             mock.ANY, | ||||
|             mock.ANY, | ||||
|             comment_id=mock.ANY, | ||||
|             dry_run=mock.ANY, | ||||
|             skip_mandatory_checks=True, | ||||
|             comment_id=mock.ANY, | ||||
|             ignore_current=False, | ||||
|         ) | ||||
|  | ||||
| @ -488,9 +485,9 @@ class TestTryMerge(TestCase): | ||||
|         mock_merge.assert_called_once_with( | ||||
|             mock.ANY, | ||||
|             mock.ANY, | ||||
|             comment_id=mock.ANY, | ||||
|             dry_run=mock.ANY, | ||||
|             skip_mandatory_checks=False, | ||||
|             comment_id=mock.ANY, | ||||
|             ignore_current=False, | ||||
|         ) | ||||
|  | ||||
| @ -1141,176 +1138,5 @@ Pull Request resolved: https://github.com/pytorch/pytorch/pull/154394""" | ||||
|         ) | ||||
|  | ||||
|  | ||||
| @mock.patch("trymerge.gh_graphql", side_effect=mocked_gh_graphql) | ||||
| @mock.patch("trymerge.gh_fetch_merge_base", return_value="") | ||||
| @mock.patch( | ||||
|     "trymerge.get_drci_classifications", side_effect=mocked_drci_classifications | ||||
| ) | ||||
| class TestTimelineFunctions(TestCase): | ||||
|     """Tests for the new timeline-related functions""" | ||||
|  | ||||
|     def test_sha_from_committed_event(self, *args: Any) -> None: | ||||
|         """Test extracting SHA from committed event""" | ||||
|         # Based on actual GitHub API format - committed events have "sha" at top level | ||||
|         event = { | ||||
|             "event": "committed", | ||||
|             "sha": "fb21ce932ded6670c918804a0d9151b773770a7c", | ||||
|         } | ||||
|         self.assertEqual( | ||||
|             sha_from_committed_event(event), "fb21ce932ded6670c918804a0d9151b773770a7c" | ||||
|         ) | ||||
|  | ||||
|         # Test with missing SHA | ||||
|         event_no_sha = {"event": "committed"} | ||||
|         self.assertIsNone(sha_from_committed_event(event_no_sha)) | ||||
|  | ||||
|     def test_sha_from_force_push_after(self, *args: Any) -> None: | ||||
|         """Test extracting SHA from force push event""" | ||||
|         # NOTE: The current function doesn't handle the actual GitHub API format | ||||
|         # Real force push events have "commit_id" at top level, but this function | ||||
|         # looks for "after", "after_commit", "after_sha", or "head_sha" fields | ||||
|  | ||||
|         # Test with the legacy format the current function handles | ||||
|         event_legacy = { | ||||
|             "event": "head_ref_force_pushed", | ||||
|             "after": {"sha": "ef22bcbc54bb0f787e1e4ffd3d83df18fc407f5e"}, | ||||
|         } | ||||
|         self.assertEqual( | ||||
|             sha_from_force_push_after(event_legacy), | ||||
|             "ef22bcbc54bb0f787e1e4ffd3d83df18fc407f5e", | ||||
|         ) | ||||
|  | ||||
|         # Test with current GitHub API format (should return None with current implementation) | ||||
|         event_real_api = { | ||||
|             "event": "head_ref_force_pushed", | ||||
|             "commit_id": "ef22bcbc54bb0f787e1e4ffd3d83df18fc407f5e", | ||||
|         } | ||||
|         self.assertEqual( | ||||
|             sha_from_force_push_after(event_real_api), | ||||
|             "ef22bcbc54bb0f787e1e4ffd3d83df18fc407f5e", | ||||
|         )  # Current function doesn't handle commit_id | ||||
|  | ||||
|         # Test with missing SHA | ||||
|         event_no_sha = {"event": "head_ref_force_pushed"} | ||||
|         self.assertIsNone(sha_from_force_push_after(event_no_sha)) | ||||
|  | ||||
|     @mock.patch("trymerge.gh_fetch_json_list") | ||||
|     def test_iter_issue_timeline_until_comment( | ||||
|         self, mock_gh_fetch_json_list: Any, *args: Any | ||||
|     ) -> None: | ||||
|         """Test timeline iteration until target comment""" | ||||
|         # Mock timeline data based on actual GitHub API format | ||||
|         timeline_data = [ | ||||
|             {"event": "commented", "id": 100, "body": "first comment"}, | ||||
|             {"event": "committed", "sha": "fb21ce932ded6670c918804a0d9151b773770a7c"}, | ||||
|             {"event": "commented", "id": 200, "body": "target comment"}, | ||||
|             {"event": "commented", "id": 300, "body": "after target"}, | ||||
|         ] | ||||
|         mock_gh_fetch_json_list.return_value = timeline_data | ||||
|  | ||||
|         # Test iteration stops at target comment | ||||
|         events = list(iter_issue_timeline_until_comment("pytorch", "pytorch", 123, 200)) | ||||
|         self.assertEqual(len(events), 3)  # Should stop at target comment | ||||
|         self.assertEqual(events[0]["event"], "commented") | ||||
|         self.assertEqual(events[0]["id"], 100) | ||||
|         self.assertEqual(events[1]["event"], "committed") | ||||
|         self.assertEqual(events[1]["sha"], "fb21ce932ded6670c918804a0d9151b773770a7c") | ||||
|         self.assertEqual(events[2]["event"], "commented") | ||||
|         self.assertEqual(events[2]["id"], 200) | ||||
|  | ||||
|     @mock.patch("trymerge.gh_fetch_json_list") | ||||
|     def test_iter_issue_timeline_until_comment_not_found( | ||||
|         self, mock_gh_fetch_json_list: Any, *args: Any | ||||
|     ) -> None: | ||||
|         """Test timeline iteration when target comment is not found""" | ||||
|         # Mock empty timeline | ||||
|         mock_gh_fetch_json_list.return_value = [] | ||||
|  | ||||
|         events = list(iter_issue_timeline_until_comment("pytorch", "pytorch", 123, 999)) | ||||
|         self.assertEqual(len(events), 0) | ||||
|  | ||||
|     @mock.patch("trymerge.iter_issue_timeline_until_comment") | ||||
|     def test_get_commit_sha_at_comment_commit_after_comment( | ||||
|         self, mock_iter_timeline: Any, *args: Any | ||||
|     ) -> None: | ||||
|         """Test get_commit_sha_at_comment returns correct SHA after comment""" | ||||
|         mock_iter_timeline.return_value = [ | ||||
|             {"event": "committed", "sha": "commit1"}, | ||||
|             {"event": "committed", "sha": "commit2"}, | ||||
|             {"event": "commented", "id": 100}, | ||||
|             {"event": "head_ref_force_pushed", "after": {"sha": "commit3"}}, | ||||
|         ] | ||||
|         pr = GitHubPR("pytorch", "pytorch", 77700) | ||||
|         sha = pr.get_commit_sha_at_comment(100) | ||||
|         self.assertEqual(sha, "commit2") | ||||
|  | ||||
|     @mock.patch("trymerge.iter_issue_timeline_until_comment") | ||||
|     def test_get_commit_sha_at_comment_force_push_before_comment( | ||||
|         self, mock_iter_timeline: Any, *args: Any | ||||
|     ) -> None: | ||||
|         mock_iter_timeline.return_value = [ | ||||
|             {"event": "committed", "sha": "commit1"}, | ||||
|             {"event": "committed", "sha": "commit2"}, | ||||
|             {"event": "head_ref_force_pushed", "commit_id": "commit3"}, | ||||
|             {"event": "commented", "id": 100}, | ||||
|         ] | ||||
|         pr = GitHubPR("pytorch", "pytorch", 77700) | ||||
|         sha = pr.get_commit_sha_at_comment(100) | ||||
|         self.assertEqual(sha, "commit3") | ||||
|  | ||||
|     @mock.patch("trymerge.iter_issue_timeline_until_comment") | ||||
|     def test_get_commit_sha_at_comment_force_push_before_comment_legacy_mode( | ||||
|         self, mock_iter_timeline: Any, *args: Any | ||||
|     ) -> None: | ||||
|         mock_iter_timeline.return_value = [ | ||||
|             {"event": "committed", "sha": "commit1"}, | ||||
|             {"event": "committed", "sha": "commit2"}, | ||||
|             {"event": "head_ref_force_pushed", "after": {"sha": "commit3"}}, | ||||
|             {"event": "commented", "id": 100}, | ||||
|         ] | ||||
|         pr = GitHubPR("pytorch", "pytorch", 77700) | ||||
|         sha = pr.get_commit_sha_at_comment(100) | ||||
|         self.assertEqual(sha, "commit3") | ||||
|  | ||||
|     @mock.patch("trymerge.iter_issue_timeline_until_comment") | ||||
|     def test_get_commit_sha_at_comment_multiple_comments( | ||||
|         self, mock_iter_timeline: Any, *args: Any | ||||
|     ) -> None: | ||||
|         mock_iter_timeline.return_value = [ | ||||
|             {"event": "committed", "sha": "commit1"}, | ||||
|             {"event": "commented", "id": 100}, | ||||
|             {"event": "committed", "sha": "commit2"}, | ||||
|             {"event": "commented", "id": 200}, | ||||
|             {"event": "head_ref_force_pushed", "after": {"sha": "commit3"}}, | ||||
|             {"event": "commented", "id": 300}, | ||||
|         ] | ||||
|         pr = GitHubPR("pytorch", "pytorch", 77700) | ||||
|         sha = pr.get_commit_sha_at_comment(200) | ||||
|         self.assertEqual(sha, "commit2") | ||||
|         sha = pr.get_commit_sha_at_comment(300) | ||||
|         self.assertEqual(sha, "commit3") | ||||
|  | ||||
|     @mock.patch("trymerge.iter_issue_timeline_until_comment") | ||||
|     def test_get_commit_sha_at_comment_no_events( | ||||
|         self, mock_iter_timeline: Any, *args: Any | ||||
|     ) -> None: | ||||
|         mock_iter_timeline.return_value = [ | ||||
|             {"event": "commented", "id": 100}, | ||||
|             {"event": "labeled", "label": {"name": "test"}}, | ||||
|         ] | ||||
|         pr = GitHubPR("pytorch", "pytorch", 77700) | ||||
|         sha = pr.get_commit_sha_at_comment(100) | ||||
|         self.assertIsNone(sha) | ||||
|  | ||||
|     @mock.patch("trymerge.iter_issue_timeline_until_comment") | ||||
|     def test_get_commit_sha_at_comment_exception( | ||||
|         self, mock_iter_timeline: Any, *args: Any | ||||
|     ) -> None: | ||||
|         mock_iter_timeline.side_effect = Exception("API error") | ||||
|         pr = GitHubPR("pytorch", "pytorch", 77700) | ||||
|         sha = pr.get_commit_sha_at_comment(100) | ||||
|         self.assertIsNone(sha) | ||||
|  | ||||
|  | ||||
| if __name__ == "__main__": | ||||
|     main() | ||||
|  | ||||
							
								
								
									
										197
									
								
								.github/scripts/trymerge.py
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										197
									
								
								.github/scripts/trymerge.py
									
									
									
									
										vendored
									
									
								
							| @ -450,63 +450,6 @@ HAS_NO_CONNECTED_DIFF_TITLE = ( | ||||
| IGNORABLE_FAILED_CHECKS_THESHOLD = 10 | ||||
|  | ||||
|  | ||||
| def iter_issue_timeline_until_comment( | ||||
|     org: str, repo: str, issue_number: int, target_comment_id: int, max_pages: int = 200 | ||||
| ) -> Any: | ||||
|     """ | ||||
|     Yield timeline entries in order until (and including) the entry whose id == target_comment_id | ||||
|     for a 'commented' event. Stops once the target comment is encountered. | ||||
|     """ | ||||
|     page = 1 | ||||
|  | ||||
|     while page <= max_pages: | ||||
|         url = ( | ||||
|             f"https://api.github.com/repos/{org}/{repo}/issues/{issue_number}/timeline" | ||||
|         ) | ||||
|         params = {"per_page": 100, "page": page} | ||||
|  | ||||
|         batch = gh_fetch_json_list(url, params) | ||||
|  | ||||
|         if not batch: | ||||
|             return | ||||
|         for ev in batch: | ||||
|             # The target is the issue comment row with event == "commented" and id == issue_comment_id | ||||
|             if ev.get("event") == "commented" and ev.get("id") == target_comment_id: | ||||
|                 yield ev  # nothing in the timeline after this matters, so stop early | ||||
|                 return | ||||
|             yield ev | ||||
|         if len(batch) < 100: | ||||
|             return | ||||
|         page += 1 | ||||
|  | ||||
|     # If we got here without finding the comment, then we either hit a bug or some github PR | ||||
|     # has a _really_ long timeline. | ||||
|     # The max # of pages found on any pytorch/pytorch PR at the time of this change was 41 | ||||
|     raise RuntimeError( | ||||
|         f"Could not find a merge commit in the first {max_pages} pages of the timeline at url {url}." | ||||
|         f"This is most likely a bug, please report it to the @pytorch/pytorch-dev-infra team." | ||||
|     ) | ||||
|  | ||||
|  | ||||
| def sha_from_committed_event(ev: dict[str, Any]) -> Optional[str]: | ||||
|     """Extract SHA from committed event in timeline""" | ||||
|     return ev.get("sha") | ||||
|  | ||||
|  | ||||
| def sha_from_force_push_after(ev: dict[str, Any]) -> Optional[str]: | ||||
|     """Extract SHA from force push event in timeline""" | ||||
|     # The current GitHub API format | ||||
|     commit_id = ev.get("commit_id") | ||||
|     if commit_id: | ||||
|         return str(commit_id) | ||||
|  | ||||
|     # Legacy format | ||||
|     after = ev.get("after") or ev.get("after_commit") or {} | ||||
|     if isinstance(after, dict): | ||||
|         return after.get("sha") or after.get("oid") | ||||
|     return ev.get("after_sha") or ev.get("head_sha") | ||||
|  | ||||
|  | ||||
| def gh_get_pr_info(org: str, proj: str, pr_no: int) -> Any: | ||||
|     rc = gh_graphql(GH_GET_PR_INFO_QUERY, name=proj, owner=org, number=pr_no) | ||||
|     return rc["data"]["repository"]["pullRequest"] | ||||
| @ -794,24 +737,16 @@ class GitHubPR: | ||||
|     def last_commit(self) -> Any: | ||||
|         return self.info["commits"]["nodes"][-1]["commit"] | ||||
|  | ||||
|     def last_commit_sha(self, default: Optional[str] = None) -> str: | ||||
|         # for commits, the oid is the sha | ||||
|  | ||||
|         if default is None: | ||||
|             return str(self.last_commit()["oid"]) | ||||
|  | ||||
|         return str(self.last_commit().get("oid", default)) | ||||
|  | ||||
|     def get_merge_base(self) -> str: | ||||
|         if self.merge_base: | ||||
|             return self.merge_base | ||||
|  | ||||
|         last_commit_sha = self.last_commit_sha() | ||||
|         last_commit_oid = self.last_commit()["oid"] | ||||
|         # NB: We could use self.base_ref() here for regular PR, however, that doesn't | ||||
|         # work for ghstack where the base is the custom branch, i.e. gh/USER/ID/base, | ||||
|         # so let's just use main instead | ||||
|         self.merge_base = gh_fetch_merge_base( | ||||
|             self.org, self.project, last_commit_sha, self.default_branch() | ||||
|             self.org, self.project, last_commit_oid, self.default_branch() | ||||
|         ) | ||||
|  | ||||
|         # Fallback to baseRefOid if the API call fails, i.e. rate limit. Note that baseRefOid | ||||
| @ -900,44 +835,6 @@ class GitHubPR: | ||||
|     def get_commit_count(self) -> int: | ||||
|         return int(self.info["commits_with_authors"]["totalCount"]) | ||||
|  | ||||
|     def get_commit_sha_at_comment(self, comment_id: int) -> Optional[str]: | ||||
|         """ | ||||
|         Get the PR head commit SHA that was present when a specific comment was posted. | ||||
|         This ensures we only merge the state of the PR at the time the merge command was issued, | ||||
|         not any subsequent commits that may have been pushed after. | ||||
|  | ||||
|         Returns None if no head-changing events found before the comment or if the comment was not found. | ||||
|         """ | ||||
|         head = None | ||||
|  | ||||
|         try: | ||||
|             for event in iter_issue_timeline_until_comment( | ||||
|                 self.org, self.project, self.pr_num, comment_id | ||||
|             ): | ||||
|                 etype = event.get("event") | ||||
|                 if etype == "committed": | ||||
|                     sha = sha_from_committed_event(event) | ||||
|                     if sha: | ||||
|                         head = sha | ||||
|                         print(f"Timeline: Found commit event for SHA {sha}") | ||||
|                 elif etype == "head_ref_force_pushed": | ||||
|                     sha = sha_from_force_push_after(event) | ||||
|                     if sha: | ||||
|                         head = sha | ||||
|                         print(f"Timeline: Found force push event for SHA {sha}") | ||||
|                 elif etype == "commented": | ||||
|                     if event.get("id") == comment_id: | ||||
|                         print(f"Timeline: Found final comment with sha {sha}") | ||||
|                         return head | ||||
|         except Exception as e: | ||||
|             print( | ||||
|                 f"Warning: Failed to reconstruct timeline for comment {comment_id}: {e}" | ||||
|             ) | ||||
|             return None | ||||
|  | ||||
|         print(f"Did not find comment with id {comment_id} in the PR timeline") | ||||
|         return None | ||||
|  | ||||
|     def get_pr_creator_login(self) -> str: | ||||
|         return cast(str, self.info["author"]["login"]) | ||||
|  | ||||
| @ -1254,7 +1151,7 @@ class GitHubPR: | ||||
|         *, | ||||
|         skip_mandatory_checks: bool = False, | ||||
|         dry_run: bool = False, | ||||
|         comment_id: int, | ||||
|         comment_id: Optional[int] = None, | ||||
|         ignore_current_checks: Optional[list[str]] = None, | ||||
|     ) -> None: | ||||
|         # Raises exception if matching rule is not found | ||||
| @ -1270,7 +1167,7 @@ class GitHubPR: | ||||
|             skip_internal_checks=can_skip_internal_checks(self, comment_id), | ||||
|             ignore_current_checks=ignore_current_checks, | ||||
|         ) | ||||
|         additional_merged_prs = self.merge_changes_locally( | ||||
|         additional_merged_prs = self.merge_changes( | ||||
|             repo, skip_mandatory_checks, comment_id | ||||
|         ) | ||||
|  | ||||
| @ -1299,7 +1196,7 @@ class GitHubPR: | ||||
|                 broken_trunk_checks=ignorable_checks.get("BROKEN_TRUNK", []), | ||||
|                 flaky_checks=ignorable_checks.get("FLAKY", []), | ||||
|                 unstable_checks=ignorable_checks.get("UNSTABLE", []), | ||||
|                 last_commit_sha=self.last_commit_sha(default=""), | ||||
|                 last_commit_sha=self.last_commit().get("oid", ""), | ||||
|                 merge_base_sha=self.get_merge_base(), | ||||
|                 merge_commit_sha=merge_commit_sha, | ||||
|                 is_failed=False, | ||||
| @ -1320,7 +1217,7 @@ class GitHubPR: | ||||
|             dry_run=dry_run, | ||||
|         ) | ||||
|  | ||||
|     def merge_changes_locally( | ||||
|     def merge_changes( | ||||
|         self, | ||||
|         repo: GitRepo, | ||||
|         skip_mandatory_checks: bool = False, | ||||
| @ -1329,15 +1226,27 @@ class GitHubPR: | ||||
|         skip_all_rule_checks: bool = False, | ||||
|     ) -> list["GitHubPR"]: | ||||
|         """ | ||||
|         :param skip_all_rule_checks: If true, skips all rule checks on ghstack PRs, useful for dry-running merge locally | ||||
|         :param skip_all_rule_checks: If true, skips all rule checks, useful for dry-running merge locally | ||||
|         """ | ||||
|         branch_to_merge_into = self.default_branch() if branch is None else branch | ||||
|         if repo.current_branch() != branch_to_merge_into: | ||||
|             repo.checkout(branch_to_merge_into) | ||||
|         if not self.is_ghstack_pr(): | ||||
|             msg = self.gen_commit_message() | ||||
|             pr_branch_name = f"__pull-request-{self.pr_num}__init__" | ||||
|             repo.fetch(self.last_commit()["oid"], pr_branch_name) | ||||
|             repo._run_git("merge", "--squash", pr_branch_name) | ||||
|             repo._run_git("commit", f'--author="{self.get_author()}"', "-m", msg) | ||||
|  | ||||
|         # It's okay to skip the commit SHA check for ghstack PRs since | ||||
|         # authoring requires write access to the repo. | ||||
|         if self.is_ghstack_pr(): | ||||
|             # Did the PR change since we started the merge? | ||||
|             pulled_sha = repo.show_ref(pr_branch_name) | ||||
|             latest_pr_status = GitHubPR(self.org, self.project, self.pr_num) | ||||
|             if pulled_sha != latest_pr_status.last_commit()["oid"]: | ||||
|                 raise RuntimeError( | ||||
|                     "PR has been updated since CI checks last passed. Please rerun the merge command." | ||||
|                 ) | ||||
|             return [] | ||||
|         else: | ||||
|             return self.merge_ghstack_into( | ||||
|                 repo, | ||||
|                 skip_mandatory_checks, | ||||
| @ -1345,48 +1254,6 @@ class GitHubPR: | ||||
|                 skip_all_rule_checks=skip_all_rule_checks, | ||||
|             ) | ||||
|  | ||||
|         msg = self.gen_commit_message() | ||||
|         pr_branch_name = f"__pull-request-{self.pr_num}__init__" | ||||
|  | ||||
|         # Determine which commit SHA to merge | ||||
|         commit_to_merge = None | ||||
|         if not comment_id: | ||||
|             raise ValueError("Must provide --comment-id when merging regular PRs") | ||||
|  | ||||
|         # Get the commit SHA that was present when the comment was made | ||||
|         commit_to_merge = self.get_commit_sha_at_comment(comment_id) | ||||
|         if not commit_to_merge: | ||||
|             raise RuntimeError( | ||||
|                 f"Could not find commit that was pushed before comment {comment_id}" | ||||
|             ) | ||||
|  | ||||
|         # Validate that this commit is the latest commit on the PR | ||||
|         latest_commit = self.last_commit_sha() | ||||
|         if commit_to_merge != latest_commit: | ||||
|             raise RuntimeError( | ||||
|                 f"Commit {commit_to_merge} was HEAD when comment {comment_id} was posted " | ||||
|                 f"but now the latest commit on the PR is {latest_commit}. " | ||||
|                 f"Please re-issue the merge command to merge the latest commit." | ||||
|             ) | ||||
|  | ||||
|         print(f"Merging commit {commit_to_merge} locally") | ||||
|  | ||||
|         repo.fetch(commit_to_merge, pr_branch_name) | ||||
|         repo._run_git("merge", "--squash", pr_branch_name) | ||||
|         repo._run_git("commit", f'--author="{self.get_author()}"', "-m", msg) | ||||
|  | ||||
|         # Did the PR change since we started the merge? | ||||
|         pulled_sha = repo.show_ref(pr_branch_name) | ||||
|         latest_pr_status = GitHubPR(self.org, self.project, self.pr_num) | ||||
|         if ( | ||||
|             pulled_sha != latest_pr_status.last_commit_sha() | ||||
|             or pulled_sha != commit_to_merge | ||||
|         ): | ||||
|             raise RuntimeError( | ||||
|                 "PR has been updated since CI checks last passed. Please rerun the merge command." | ||||
|             ) | ||||
|         return [] | ||||
|  | ||||
|  | ||||
| class MergeRuleFailedError(RuntimeError): | ||||
|     def __init__(self, message: str, rule: Optional["MergeRule"] = None) -> None: | ||||
| @ -1591,7 +1458,7 @@ def find_matching_merge_rule( | ||||
|             pending_checks = [] | ||||
|             failed_checks = [] | ||||
|  | ||||
|         hud_link = f"https://hud.pytorch.org/{pr.org}/{pr.project}/commit/{pr.last_commit_sha()}" | ||||
|         hud_link = f"https://hud.pytorch.org/{pr.org}/{pr.project}/commit/{pr.last_commit()['oid']}" | ||||
|         if len(failed_checks) > 0: | ||||
|             if reject_reason_score < 30000: | ||||
|                 reject_reason_score = 30000 | ||||
| @ -2289,14 +2156,14 @@ def categorize_checks( | ||||
| def merge( | ||||
|     pr: GitHubPR, | ||||
|     repo: GitRepo, | ||||
|     comment_id: int, | ||||
|     dry_run: bool = False, | ||||
|     skip_mandatory_checks: bool = False, | ||||
|     comment_id: Optional[int] = None, | ||||
|     timeout_minutes: int = 400, | ||||
|     stale_pr_days: int = 3, | ||||
|     ignore_current: bool = False, | ||||
| ) -> None: | ||||
|     initial_commit_sha = pr.last_commit_sha() | ||||
|     initial_commit_sha = pr.last_commit()["oid"] | ||||
|     pr_link = f"https://github.com/{pr.org}/{pr.project}/pull/{pr.pr_num}" | ||||
|     print(f"Attempting merge of {initial_commit_sha} ({pr_link})") | ||||
|  | ||||
| @ -2367,7 +2234,7 @@ def merge( | ||||
|             f"Attempting merge of https://github.com/{pr.org}/{pr.project}/pull/{pr.pr_num} ({elapsed_time / 60} minutes elapsed)" | ||||
|         ) | ||||
|         pr = GitHubPR(pr.org, pr.project, pr.pr_num) | ||||
|         if initial_commit_sha != pr.last_commit_sha(): | ||||
|         if initial_commit_sha != pr.last_commit()["oid"]: | ||||
|             raise RuntimeError( | ||||
|                 "New commits were pushed while merging. Please rerun the merge command." | ||||
|             ) | ||||
| @ -2534,7 +2401,7 @@ def main() -> None: | ||||
|     if args.check_mergeability: | ||||
|         if pr.is_ghstack_pr(): | ||||
|             get_ghstack_prs(repo, pr)  # raises error if out of sync | ||||
|         pr.merge_changes_locally( | ||||
|         pr.merge_changes( | ||||
|             repo, | ||||
|             skip_mandatory_checks=True, | ||||
|             skip_all_rule_checks=True, | ||||
| @ -2549,18 +2416,12 @@ def main() -> None: | ||||
|         gh_post_pr_comment(org, project, args.pr_num, message, dry_run=args.dry_run) | ||||
|         return | ||||
|     try: | ||||
|         # Ensure comment id is set, else fail | ||||
|         if not args.comment_id: | ||||
|             raise ValueError( | ||||
|                 "Comment ID is required for merging PRs, please provide it using --comment-id" | ||||
|             ) | ||||
|  | ||||
|         merge( | ||||
|             pr, | ||||
|             repo, | ||||
|             comment_id=args.comment_id, | ||||
|             dry_run=args.dry_run, | ||||
|             skip_mandatory_checks=args.force, | ||||
|             comment_id=args.comment_id, | ||||
|             ignore_current=args.ignore_current, | ||||
|         ) | ||||
|     except Exception as e: | ||||
| @ -2582,7 +2443,7 @@ def main() -> None: | ||||
|                 broken_trunk_checks=[], | ||||
|                 flaky_checks=[], | ||||
|                 unstable_checks=[], | ||||
|                 last_commit_sha=pr.last_commit_sha(default=""), | ||||
|                 last_commit_sha=pr.last_commit().get("oid", ""), | ||||
|                 merge_base_sha=pr.get_merge_base(), | ||||
|                 is_failed=True, | ||||
|                 skip_mandatory_checks=args.force, | ||||
|  | ||||
							
								
								
									
										2
									
								
								.github/templates/common.yml.j2
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/templates/common.yml.j2
									
									
									
									
										vendored
									
									
								
							| @ -4,7 +4,7 @@ | ||||
| {%- set download_artifact_action = "actions/download-artifact@v4.1.7" -%} | ||||
|  | ||||
| {%- set timeout_minutes = 240 -%} | ||||
| {%- set timeout_minutes_windows_binary = 360 -%} | ||||
| {%- set timeout_minutes_windows_binary = 300 -%} | ||||
|  | ||||
| {%- macro concurrency(build_environment) -%} | ||||
| concurrency: | ||||
|  | ||||
| @ -135,7 +135,7 @@ jobs: | ||||
|       contents: read | ||||
|     steps: | ||||
|       - name: Setup XPU | ||||
|         uses: pytorch/pytorch/.github/actions/setup-xpu@main | ||||
|         uses: ./.github/actions/setup-xpu | ||||
|       - name: configure aws credentials | ||||
|         id: aws_creds | ||||
|         uses: aws-actions/configure-aws-credentials@v4 | ||||
|  | ||||
| @ -22,16 +22,6 @@ name: !{{ build_environment }} | ||||
|           echo "MAC_PACKAGE_WORK_DIR=${RUNNER_TEMP}" >> "${GITHUB_ENV}" | ||||
| {%- endmacro %} | ||||
|  | ||||
| {%- macro setup_python(py_ver) -%} | ||||
|       - name: Setup Python | ||||
|         uses: actions/setup-python@v6 | ||||
|         with: | ||||
|           # TODO: Removeme once 3.14 is out | ||||
|           # .4 version is min minor for 3.10, and also no-gil version of 3.13 needs at least 3.13.3 | ||||
|           python-version: "!{{ (py_ver.strip('t') + '.4') if '3.14' not in py_ver else '3.14.0-rc.2' }}" | ||||
|           freethreaded: !{{ "true" if py_ver.endswith('t') else "false" }} | ||||
| {%- endmacro %} | ||||
|  | ||||
| on: | ||||
| # TODO: Migrate to new ciflow trigger, reference https://github.com/pytorch/pytorch/pull/70321 | ||||
|   push: | ||||
| @ -71,13 +61,28 @@ jobs: | ||||
|     {%- endif %} | ||||
|     steps: | ||||
|       !{{ set_runner_specific_vars() }} | ||||
|       !{{ setup_python(config.get("python_version", "3.10")) }} | ||||
|       - name: Install conda and dependencies | ||||
|         run: | | ||||
|           # Install conda, setup-miniconda messes with the path that messes with the ruby stuff we do later on | ||||
|           curl --retry 3 --retry-all-errors -o "${RUNNER_TEMP}/conda.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.5.2-0-MacOSX-$(uname -m).sh" | ||||
|           chmod +x "${RUNNER_TEMP}/conda.sh" | ||||
|           /bin/bash "${RUNNER_TEMP}/conda.sh" -b -p "${RUNNER_TEMP}/anaconda" | ||||
|           echo "${RUNNER_TEMP}/anaconda/bin" >> "${GITHUB_PATH}" | ||||
|           if [ -d "/Applications/Xcode_14.3.1.app" ]; then | ||||
|             echo "DEVELOPER_DIR=/Applications/Xcode_14.3.1.app/Contents/Developer" >> "${GITHUB_ENV}" | ||||
|           elif [ -d "/Applications/Xcode_13.3.1.app" ]; then | ||||
|             echo "DEVELOPER_DIR=/Applications/Xcode_13.3.1.app/Contents/Developer" >> "${GITHUB_ENV}" | ||||
|           fi | ||||
|       !{{ common.checkout(deep_clone=False, directory="pytorch") }} | ||||
|       - name: Populate binary env | ||||
|         run: | | ||||
|           # shellcheck disable=SC1091 | ||||
|           source "${RUNNER_TEMP}/anaconda/bin/activate" | ||||
|           "${PYTORCH_ROOT}/.circleci/scripts/binary_populate_env.sh" | ||||
|       - name: Build PyTorch binary | ||||
|         run: | | ||||
|           # shellcheck disable=SC1091 | ||||
|           source "${RUNNER_TEMP}/anaconda/bin/activate" | ||||
|           set -eux -o pipefail | ||||
|           # shellcheck disable=SC1090 | ||||
|           source "${BINARY_ENV_FILE:-/Users/distiller/project/env}" | ||||
| @ -94,6 +99,8 @@ jobs: | ||||
| {%- if config["package_type"] == "wheel" %} | ||||
|       - name: Test PyTorch wheel | ||||
|         run: | | ||||
|           # shellcheck disable=SC1091 | ||||
|           source "${RUNNER_TEMP}/anaconda/bin/activate" | ||||
|           set -eux -o pipefail | ||||
|           # shellcheck disable=SC1090 | ||||
|           source "${BINARY_ENV_FILE:-/Users/distiller/project/env}" | ||||
| @ -104,9 +111,33 @@ jobs: | ||||
|  | ||||
|           SMOKE_TEST_PARAMS="" | ||||
|  | ||||
|           EXTRA_CONDA_INSTALL_FLAGS="" | ||||
|           CONDA_ENV_CREATE_FLAGS="" | ||||
|           # shellcheck disable=SC2153 | ||||
|           case $DESIRED_PYTHON in | ||||
|             3.14t) | ||||
|               CONDA_ENV_CREATE_FLAGS="python-freethreading" | ||||
|               EXTRA_CONDA_INSTALL_FLAGS="-c conda-forge/label/python_rc -c conda-forge" | ||||
|               desired_python="3.14.0rc1" | ||||
|               ;; | ||||
|             3.14) | ||||
|               EXTRA_CONDA_INSTALL_FLAGS="-c conda-forge/label/python_rc -c conda-forge" | ||||
|               desired_python="3.14.0rc1" | ||||
|               ;; | ||||
|             3.13t) | ||||
|               CONDA_ENV_CREATE_FLAGS="python-freethreading" | ||||
|               EXTRA_CONDA_INSTALL_FLAGS="-c conda-forge" | ||||
|               desired_python="3.13" | ||||
|               ;; | ||||
|             *) | ||||
|               # shellcheck disable=SC2153 | ||||
|               desired_python=${DESIRED_PYTHON} | ||||
|               ;; | ||||
|           esac | ||||
|  | ||||
|           # shellcheck disable=SC2086 | ||||
|           python -mvenv test_venv | ||||
|           source test_venv/bin/activate | ||||
|           conda create -yn "test_conda_env" python="$desired_python" ${CONDA_ENV_CREATE_FLAGS} ${EXTRA_CONDA_INSTALL_FLAGS} | ||||
|           conda activate test_conda_env | ||||
|           pip install "$PYTORCH_FINAL_PACKAGE_DIR"/*.whl numpy -v | ||||
|  | ||||
|           # shellcheck disable=SC2086 | ||||
|  | ||||
							
								
								
									
										2
									
								
								.github/templates/upload.yml.j2
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/templates/upload.yml.j2
									
									
									
									
										vendored
									
									
								
							| @ -33,7 +33,7 @@ | ||||
|   {%- if is_windows %} | ||||
|       # This is a dummy value for libtorch to work correctly with our batch scripts | ||||
|       # without this value pip does not get installed for some reason | ||||
|       DESIRED_PYTHON: "3.10" | ||||
|       DESIRED_PYTHON: "3.9" | ||||
|   {%- endif %} | ||||
|  | ||||
| {%- else %} | ||||
|  | ||||
							
								
								
									
										2
									
								
								.github/workflows/_binary-test-linux.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/_binary-test-linux.yml
									
									
									
									
										vendored
									
									
								
							| @ -187,6 +187,8 @@ jobs: | ||||
|  | ||||
|       - name: Install nvidia driver, nvidia-docker runtime, set GPU_FLAG | ||||
|         uses: pytorch/test-infra/.github/actions/setup-nvidia@main | ||||
|         with: | ||||
|           driver-version: ${{ startsWith(inputs.GPU_ARCH_VERSION, '13') && '580.65.06' || '570.133.07' }} | ||||
|         if: ${{ inputs.GPU_ARCH_TYPE == 'cuda' && steps.filter.outputs.is-test-matrix-empty == 'False' }} | ||||
|  | ||||
|       - name: configure aws credentials | ||||
|  | ||||
							
								
								
									
										14
									
								
								.github/workflows/_docs.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										14
									
								
								.github/workflows/_docs.yml
									
									
									
									
										vendored
									
									
								
							| @ -75,6 +75,10 @@ jobs: | ||||
|             runner: ${{ inputs.runner_prefix }}linux.2xlarge | ||||
|             # It takes less than 30m to finish python docs unless there are issues | ||||
|             timeout-minutes: 30 | ||||
|           - docs_type: functorch | ||||
|             runner: ${{ inputs.runner_prefix }}linux.2xlarge | ||||
|             # It takes less than 15m to finish functorch docs unless there are issues | ||||
|             timeout-minutes: 15 | ||||
|     # Set a fixed name for this job instead of using the current matrix-generated name, i.e. build-docs (cpp, linux.12xlarge, 180) | ||||
|     # The current name requires updating the database last docs push query from test-infra every time the matrix is updated | ||||
|     name: build-docs-${{ matrix.docs_type }}-${{ inputs.push }} | ||||
| @ -207,6 +211,16 @@ jobs: | ||||
|           path: cppdocs/ | ||||
|           s3-prefix: pytorch/pytorch/${{ github.event.pull_request.number }}/cppdocs | ||||
|  | ||||
|       - name: Upload functorch Docs Preview | ||||
|         uses: seemethere/upload-artifact-s3@baba72d0712b404f646cebe0730933554ebce96a # v5.1.0 | ||||
|         if: ${{ github.event_name == 'pull_request' && matrix.docs_type == 'functorch' && steps.build-docs.outcome == 'success' }} | ||||
|         with: | ||||
|           retention-days: 14 | ||||
|           s3-bucket: doc-previews | ||||
|           if-no-files-found: error | ||||
|           path: functorch_ghpages/nightly/ | ||||
|           s3-prefix: pytorch/pytorch/${{ github.event.pull_request.number }}/functorchdocs | ||||
|  | ||||
|       - name: Teardown Linux | ||||
|         uses: pytorch/test-infra/.github/actions/teardown-linux@main | ||||
|         if: always() | ||||
|  | ||||
							
								
								
									
										28
									
								
								.github/workflows/_get-changed-files.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										28
									
								
								.github/workflows/_get-changed-files.yml
									
									
									
									
										vendored
									
									
								
							| @ -2,12 +2,6 @@ name: Get Changed Files | ||||
|  | ||||
| on: | ||||
|   workflow_call: | ||||
|     inputs: | ||||
|       all_files: | ||||
|         description: "Whether to return all files instead of just changed files" | ||||
|         required: false | ||||
|         type: boolean | ||||
|         default: false | ||||
|     outputs: | ||||
|       changed-files: | ||||
|         description: "List of changed files (space-separated) or '*' if not in a PR" | ||||
| @ -32,23 +26,17 @@ jobs: | ||||
|             # Get the PR number from the github context | ||||
|             PR_NUMBER="${{ github.event.number }}" | ||||
|  | ||||
|             # Check if all_files is requested | ||||
|             if [ "${{ inputs.all_files }}" = "true" ]; then | ||||
|               echo "all_files input is true, returning all files" | ||||
|               echo "changed-files=*" >> "$GITHUB_OUTPUT" | ||||
|             else | ||||
|               # Use gh CLI to get changed files in the PR with explicit repo | ||||
|               CHANGED_FILES=$(gh api repos/${{ github.repository }}/pulls/$PR_NUMBER/files --paginate --jq '.[] | select(.status != "removed") | .filename' | tr '\n' ' ' | sed 's/ $//') | ||||
|             # Use gh CLI to get changed files in the PR with explicit repo | ||||
|             CHANGED_FILES=$(gh api repos/${{ github.repository }}/pulls/$PR_NUMBER/files --paginate --jq '.[] | select(.status != "removed") | .filename' | tr '\n' ' ' | sed 's/ $//') | ||||
|  | ||||
|               if [ -z "$CHANGED_FILES" ]; then | ||||
|                 echo "No changed files found, setting to '*'" | ||||
|                 CHANGED_FILES="*" | ||||
|               fi | ||||
|  | ||||
|               echo "Changed files: $CHANGED_FILES" | ||||
|               echo "changed-files=$CHANGED_FILES" >> "$GITHUB_OUTPUT" | ||||
|             if [ -z "$CHANGED_FILES" ]; then | ||||
|               echo "No changed files found, setting to '*'" | ||||
|               CHANGED_FILES="*" | ||||
|             fi | ||||
|  | ||||
|             echo "Changed files: $CHANGED_FILES" | ||||
|             echo "changed-files=$CHANGED_FILES" >> "$GITHUB_OUTPUT" | ||||
|  | ||||
|           else | ||||
|             echo "Not in PR context, setting changed files to '*'" | ||||
|             echo "changed-files=*" >> "$GITHUB_OUTPUT" | ||||
|  | ||||
							
								
								
									
										2
									
								
								.github/workflows/_link_check.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/_link_check.yml
									
									
									
									
										vendored
									
									
								
							| @ -13,7 +13,6 @@ jobs: | ||||
|     if: ${{ github.event_name != 'pull_request' || !contains(github.event.pull_request.labels.*.name, 'skip-url-lint') }} | ||||
|     uses: pytorch/test-infra/.github/workflows/linux_job_v2.yml@main | ||||
|     with: | ||||
|       job-name: lint-urls | ||||
|       timeout: 120 | ||||
|       runner: ${{ inputs.runner }}linux.2xlarge | ||||
|       docker-image: ci-image:pytorch-linux-jammy-linter | ||||
| @ -39,7 +38,6 @@ jobs: | ||||
|     if: ${{ github.event_name != 'pull_request' || !contains(github.event.pull_request.labels.*.name, 'skip-xref-lint') }} | ||||
|     uses: pytorch/test-infra/.github/workflows/linux_job_v2.yml@main | ||||
|     with: | ||||
|       job-name: lint-xrefs | ||||
|       timeout: 60 | ||||
|       runner: ${{ inputs.runner }}linux.2xlarge | ||||
|       docker-image: ci-image:pytorch-linux-jammy-linter | ||||
|  | ||||
							
								
								
									
										4
									
								
								.github/workflows/_linux-test.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.github/workflows/_linux-test.yml
									
									
									
									
										vendored
									
									
								
							| @ -169,7 +169,7 @@ jobs: | ||||
|         id: install-nvidia-driver | ||||
|         uses: pytorch/test-infra/.github/actions/setup-nvidia@main | ||||
|         with: | ||||
|           driver-version: ${{ matrix.config == 'legacy_nvidia_driver' && '525.105.17' || '580.82.07' }} | ||||
|           driver-version: ${{ matrix.config == 'legacy_nvidia_driver' && '525.105.17' || '570.133.07' }} | ||||
|         if: ${{ contains(inputs.build-environment, 'cuda') && !contains(matrix.config, 'nogpu') && steps.check_container_runner.outputs.IN_CONTAINER_RUNNER == 'false' && !contains(matrix.runner, 'b200') }} | ||||
|  | ||||
|       - name: Setup GPU_FLAG for docker run | ||||
| @ -409,7 +409,7 @@ jobs: | ||||
|           job_identifier: ${{ github.workflow }}_${{ inputs.build-environment }} | ||||
|  | ||||
|       - name: Authenticate with AWS | ||||
|         if: ${{ always() && contains(matrix.runner, 'b200') }} | ||||
|         if: ${{ contains(matrix.runner, 'b200') }} | ||||
|         uses: aws-actions/configure-aws-credentials@ececac1a45f3b08a01d2dd070d28d111c5fe6722 # v4.1.0 | ||||
|         with: | ||||
|           role-to-assume: arn:aws:iam::308535385114:role/gha_workflow_upload-benchmark-results | ||||
|  | ||||
							
								
								
									
										33
									
								
								.github/workflows/_rocm-test.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										33
									
								
								.github/workflows/_rocm-test.yml
									
									
									
									
										vendored
									
									
								
							| @ -62,11 +62,6 @@ on: | ||||
|         required: false | ||||
|         type: number | ||||
|         default: 1 | ||||
|     secrets: | ||||
|       HUGGING_FACE_HUB_TOKEN: | ||||
|         required: false | ||||
|         description: | | ||||
|           HF Auth token to avoid rate limits when downloading models or datasets from hub | ||||
| env: | ||||
|   GIT_DEFAULT_BRANCH: ${{ github.event.repository.default_branch }} | ||||
|  | ||||
| @ -81,9 +76,10 @@ jobs: | ||||
|     strategy: | ||||
|       matrix: ${{ fromJSON(inputs.test-matrix) }} | ||||
|       fail-fast: false | ||||
|     runs-on: ${{ matrix.runner }} | ||||
|     timeout-minutes: ${{ matrix.mem_leak_check == 'mem_leak_check' && 600 || inputs.timeout-minutes }} | ||||
|     runs-on: ${{ matrix.runner }} | ||||
|     steps: | ||||
|       # [see note: pytorch repo ref] | ||||
|       - name: Checkout PyTorch | ||||
|         uses: pytorch/pytorch/.github/actions/checkout-pytorch@main | ||||
|         with: | ||||
| @ -135,9 +131,6 @@ jobs: | ||||
|  | ||||
|       - name: Start monitoring script | ||||
|         id: monitor-script | ||||
|         if: ${{ !inputs.disable-monitor }} | ||||
|         shell: bash | ||||
|         continue-on-error: true | ||||
|         env: | ||||
|           JOB_ID: ${{ steps.get-job-id.outputs.job-id }} | ||||
|           JOB_NAME: ${{ steps.get-job-id.outputs.job-name }} | ||||
| @ -145,6 +138,9 @@ jobs: | ||||
|           WORKFLOW_RUN_ID: ${{github.run_id}} | ||||
|           MONITOR_LOG_INTERVAL: ${{ inputs.monitor-log-interval }} | ||||
|           MONITOR_DATA_COLLECT_INTERVAL: ${{ inputs.monitor-data-collect-interval }} | ||||
|         if: ${{ !inputs.disable-monitor }} | ||||
|         shell: bash | ||||
|         continue-on-error: true | ||||
|         run: | | ||||
|           python3 -m pip install psutil==5.9.8 dataclasses_json==0.6.7 | ||||
|           python3 -m tools.stats.monitor --log-interval "$MONITOR_LOG_INTERVAL" --data-collect-interval "$MONITOR_DATA_COLLECT_INTERVAL" > usage_log.txt 2>&1 & | ||||
| @ -182,12 +178,6 @@ jobs: | ||||
|         run: | | ||||
|           echo "timeout=$((JOB_TIMEOUT-30))" >> "${GITHUB_OUTPUT}" | ||||
|  | ||||
|       - name: Preserve github env variables for use in docker | ||||
|         shell: bash | ||||
|         run: | | ||||
|           env | grep '^GITHUB' >> "/tmp/github_env_${GITHUB_RUN_ID}" | ||||
|           env | grep '^CI' >> "/tmp/github_env_${GITHUB_RUN_ID}" | ||||
|  | ||||
|       - name: Test | ||||
|         id: test | ||||
|         env: | ||||
| @ -203,22 +193,20 @@ jobs: | ||||
|           JOB_NAME: ${{ steps.get-job-id.outputs.job-name }} | ||||
|           BRANCH: ${{ steps.parse-ref.outputs.branch }} | ||||
|           SHA1: ${{ github.event.pull_request.head.sha || github.sha }} | ||||
|           BASE_SHA: ${{ github.event.pull_request.base.sha || github.sha }} | ||||
|           TEST_CONFIG: ${{ matrix.config }} | ||||
|           SHARD_NUMBER: ${{ matrix.shard }} | ||||
|           NUM_TEST_SHARDS: ${{ matrix.num_shards }} | ||||
|           REENABLED_ISSUES: ${{ steps.keep-going.outputs.reenabled-issues }} | ||||
|           CONTINUE_THROUGH_ERROR: ${{ steps.keep-going.outputs.keep-going }} | ||||
|           VERBOSE_TEST_LOGS: ${{ steps.keep-going.outputs.ci-verbose-test-logs }} | ||||
|           TEST_SHOWLOCALS: ${{ steps.keep-going.outputs.ci-test-showlocals }} | ||||
|           NO_TEST_TIMEOUT: ${{ steps.keep-going.outputs.ci-no-test-timeout }} | ||||
|           NO_TD: ${{ steps.keep-going.outputs.ci-no-td }} | ||||
|           TEST_CONFIG: ${{ matrix.config }} | ||||
|           SHARD_NUMBER: ${{ matrix.shard }} | ||||
|           NUM_TEST_SHARDS: ${{ matrix.num_shards }} | ||||
|           REENABLED_ISSUES: ${{ steps.keep-going.outputs.reenabled-issues }} | ||||
|           DOCKER_IMAGE: ${{ inputs.docker-image }} | ||||
|           PYTORCH_TEST_CUDA_MEM_LEAK_CHECK: ${{ matrix.mem_leak_check && '1' || '0' }} | ||||
|           PYTORCH_TEST_RERUN_DISABLED_TESTS: ${{ matrix.rerun_disabled_tests && '1' || '0' }} | ||||
|           TESTS_TO_INCLUDE: ${{ inputs.tests-to-include }} | ||||
|           DASHBOARD_TAG: ${{ inputs.dashboard-tag }} | ||||
|           HUGGING_FACE_HUB_TOKEN: ${{ secrets.HUGGING_FACE_HUB_TOKEN }} | ||||
|         timeout-minutes: ${{ fromJson(steps.test-timeout.outputs.timeout) }} | ||||
|         run: | | ||||
|           set -x | ||||
| @ -248,7 +236,6 @@ jobs: | ||||
|             -e GITHUB_RUN_ATTEMPT \ | ||||
|             -e JOB_ID \ | ||||
|             -e JOB_NAME \ | ||||
|             -e BASE_SHA \ | ||||
|             -e BRANCH \ | ||||
|             -e SHA1 \ | ||||
|             -e AWS_DEFAULT_REGION \ | ||||
| @ -266,12 +253,10 @@ jobs: | ||||
|             -e PYTORCH_TEST_CUDA_MEM_LEAK_CHECK \ | ||||
|             -e PYTORCH_TEST_RERUN_DISABLED_TESTS \ | ||||
|             -e TESTS_TO_INCLUDE \ | ||||
|             -e HUGGING_FACE_HUB_TOKEN \ | ||||
|             -e DASHBOARD_TAG \ | ||||
|             --env-file="${RUNNER_TEMP}/github_env_${GITHUB_RUN_ID}" \ | ||||
|             --ulimit stack=10485760:83886080 \ | ||||
|             --ulimit core=0 \ | ||||
|             --env-file="/tmp/github_env_${GITHUB_RUN_ID}" \ | ||||
|             --security-opt seccomp=unconfined \ | ||||
|             --cap-add=SYS_PTRACE \ | ||||
|             --shm-size="8g" \ | ||||
|  | ||||
							
								
								
									
										3
									
								
								.github/workflows/_win-build.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.github/workflows/_win-build.yml
									
									
									
									
										vendored
									
									
								
							| @ -77,7 +77,6 @@ jobs: | ||||
|         run: | | ||||
|           git config --global core.longpaths true | ||||
|           git config --global core.symlinks true | ||||
|           git config --global core.ignorecase false | ||||
|  | ||||
|           # https://git-scm.com/docs/git-fsmonitor--daemon.  The daemon could lock | ||||
|           # the directory on Windows and prevent GHA from checking out as reported | ||||
| @ -151,7 +150,7 @@ jobs: | ||||
|           BUILD_WHEEL: 1 | ||||
|           MAX_JOBS: 8 | ||||
|           CUDA_VERSION: ${{ inputs.cuda-version }} | ||||
|           PYTHON_VERSION: "3.10" | ||||
|           PYTHON_VERSION: "3.9" | ||||
|           SCCACHE_BUCKET: "ossci-compiler-cache" | ||||
|           SCCACHE_S3_KEY_PREFIX: ${{ github.workflow }} | ||||
|           SCCACHE_REGION: us-east-1 | ||||
|  | ||||
							
								
								
									
										3
									
								
								.github/workflows/_win-test.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.github/workflows/_win-test.yml
									
									
									
									
										vendored
									
									
								
							| @ -70,7 +70,6 @@ jobs: | ||||
|         run: | | ||||
|           git config --global core.longpaths true | ||||
|           git config --global core.symlinks true | ||||
|           git config --global core.ignorecase false | ||||
|  | ||||
|           # https://git-scm.com/docs/git-fsmonitor--daemon.  The daemon could lock | ||||
|           # the directory on Windows and prevent GHA from checking out as reported | ||||
| @ -184,7 +183,7 @@ jobs: | ||||
|         env: | ||||
|           USE_CUDA: ${{ inputs.cuda-version != 'cpu' && '1' || '0' }} | ||||
|           INSTALL_WINDOWS_SDK: 1 | ||||
|           PYTHON_VERSION: "3.10" | ||||
|           PYTHON_VERSION: 3.9 | ||||
|           CONTINUE_THROUGH_ERROR: ${{ steps.keep-going.outputs.keep-going }} | ||||
|           VERBOSE_TEST_LOGS: ${{ steps.keep-going.outputs.ci-verbose-test-logs }} | ||||
|           TEST_SHOWLOCALS: ${{ steps.keep-going.outputs.ci-test-showlocals }} | ||||
|  | ||||
							
								
								
									
										2
									
								
								.github/workflows/_xpu-test.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/_xpu-test.yml
									
									
									
									
										vendored
									
									
								
							| @ -275,7 +275,7 @@ jobs: | ||||
|       - name: Change permissions | ||||
|         if: ${{ always() && steps.test.conclusion }} | ||||
|         run: | | ||||
|           docker exec -t "${{ env.CONTAINER_NAME }}" sh -c "sudo chown -R 1000:1000 test" | ||||
|           docker exec -t "${{ env.CONTAINER_NAME }}" sh -c "sudo chown -R 1001:1001 test" | ||||
|  | ||||
|       - name: Print remaining test logs | ||||
|         shell: bash | ||||
|  | ||||
							
								
								
									
										3
									
								
								.github/workflows/build-manywheel-images.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.github/workflows/build-manywheel-images.yml
									
									
									
									
										vendored
									
									
								
							| @ -47,11 +47,12 @@ jobs: | ||||
|       matrix: | ||||
|         include: [ | ||||
|           { name: "manylinux2_28-builder",          tag: "cuda13.0",         runner: "linux.9xlarge.ephemeral" }, | ||||
|           { name: "manylinux2_28-builder",          tag: "cuda12.9",         runner: "linux.9xlarge.ephemeral" }, | ||||
|           { name: "manylinux2_28-builder",          tag: "cuda12.8",          runner: "linux.9xlarge.ephemeral" }, | ||||
|           { name: "manylinux2_28-builder",          tag: "cuda12.6",          runner: "linux.9xlarge.ephemeral" }, | ||||
|           { name: "manylinuxaarch64-builder",       tag: "cuda13.0",          runner: "linux.arm64.2xlarge.ephemeral" }, | ||||
|           { name: "manylinuxaarch64-builder",       tag: "cuda12.9",          runner: "linux.arm64.2xlarge.ephemeral" }, | ||||
|           { name: "manylinuxaarch64-builder",       tag: "cuda12.8",          runner: "linux.arm64.2xlarge.ephemeral" }, | ||||
|           { name: "manylinuxaarch64-builder",       tag: "cuda12.6",          runner: "linux.arm64.2xlarge.ephemeral" }, | ||||
|           { name: "manylinux2_28-builder",          tag: "rocm6.3",           runner: "linux.9xlarge.ephemeral" }, | ||||
|           { name: "manylinux2_28-builder",          tag: "rocm6.4",           runner: "linux.9xlarge.ephemeral" }, | ||||
|           { name: "manylinux2_28-builder",          tag: "cpu",               runner: "linux.9xlarge.ephemeral" }, | ||||
|  | ||||
							
								
								
									
										2
									
								
								.github/workflows/build-triton-wheel.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/build-triton-wheel.yml
									
									
									
									
										vendored
									
									
								
							| @ -145,7 +145,7 @@ jobs: | ||||
|           fi | ||||
|  | ||||
|           docker exec -t "${container_name}" yum install -y zlib-devel zip | ||||
|           docker exec -t "${container_name}" "${PYTHON_EXECUTABLE}"  -m pip install -U setuptools==78.1.0 pybind11==3.0.1 auditwheel wheel | ||||
|           docker exec -t "${container_name}" "${PYTHON_EXECUTABLE}"  -m pip install -U setuptools==78.1.0 pybind11==2.13.1 auditwheel wheel | ||||
|           set +e | ||||
|           docker exec -t "${container_name}" command -v pip | ||||
|           has_pip=$? | ||||
|  | ||||
							
								
								
									
										236
									
								
								.github/workflows/build-vllm-wheel.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										236
									
								
								.github/workflows/build-vllm-wheel.yml
									
									
									
									
										vendored
									
									
								
							| @ -1,236 +0,0 @@ | ||||
| name: Build vLLM wheels | ||||
|  | ||||
| on: | ||||
|   push: | ||||
|     branches: | ||||
|       - main | ||||
|     paths: | ||||
|       - .github/workflows/build-vllm-wheel.yml | ||||
|       - .github/ci_commit_pins/vllm.txt | ||||
|   workflow_dispatch: | ||||
|   pull_request: | ||||
|     paths: | ||||
|       - .github/workflows/build-vllm-wheel.yml | ||||
|       - .github/ci_commit_pins/vllm.txt | ||||
|   schedule: | ||||
|     # every morning at 01:30PM UTC, 9:30AM EST, 6:30AM PST | ||||
|     - cron: 30 13 * * * | ||||
|  | ||||
| concurrency: | ||||
|   group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }}-${{ github.event_name == 'workflow_dispatch' }} | ||||
|   cancel-in-progress: true | ||||
|  | ||||
| jobs: | ||||
|   build-wheel: | ||||
|     if: github.repository_owner == 'pytorch' | ||||
|     strategy: | ||||
|       fail-fast: false | ||||
|       matrix: | ||||
|         python-version: [ '3.12' ] | ||||
|         # TODO (huydhn): Add cu130 after https://github.com/vllm-project/vllm/issues/24464 is resolved | ||||
|         platform: [ 'manylinux_2_28_x86_64', 'manylinux_2_28_aarch64' ] | ||||
|         device: [ 'cu128', 'cu129' ] | ||||
|         include: | ||||
|           - platform: manylinux_2_28_x86_64 | ||||
|             device: cu128 | ||||
|             manylinux-image: 'pytorch/manylinux2_28-builder:cuda12.8' | ||||
|             runner: linux.12xlarge.memory | ||||
|           - platform: manylinux_2_28_x86_64 | ||||
|             device: cu129 | ||||
|             manylinux-image: 'pytorch/manylinux2_28-builder:cuda12.9' | ||||
|             runner: linux.12xlarge.memory | ||||
|           - platform: manylinux_2_28_aarch64 | ||||
|             device: cu128 | ||||
|             manylinux-image: 'pytorch/manylinuxaarch64-builder:cuda12.8' | ||||
|             runner: linux.arm64.r7g.12xlarge.memory | ||||
|           - platform: manylinux_2_28_aarch64 | ||||
|             device: cu129 | ||||
|             manylinux-image: 'pytorch/manylinuxaarch64-builder:cuda12.9' | ||||
|             runner: linux.arm64.r7g.12xlarge.memory | ||||
|     name: "Build ${{ matrix.device }} vLLM wheel on ${{ matrix.platform }}" | ||||
|     runs-on: ${{ matrix.runner }} | ||||
|     timeout-minutes: 480 | ||||
|     env: | ||||
|       PY_VERS: ${{ matrix.python-version }} | ||||
|       MANYLINUX_IMAGE: ${{ matrix.manylinux-image }} | ||||
|       PLATFORM: ${{ matrix.platform }} | ||||
|       BUILD_DEVICE: ${{ matrix.device }} | ||||
|     steps: | ||||
|       - name: Setup SSH (Click me for login details) | ||||
|         uses: pytorch/test-infra/.github/actions/setup-ssh@main | ||||
|         with: | ||||
|           github-secret: ${{ secrets.GITHUB_TOKEN }} | ||||
|  | ||||
|       - name: Checkout PyTorch | ||||
|         uses: pytorch/pytorch/.github/actions/checkout-pytorch@main | ||||
|         with: | ||||
|           submodules: false | ||||
|  | ||||
|       - name: Setup Linux | ||||
|         uses: ./.github/actions/setup-linux | ||||
|  | ||||
|       - name: Get latest PyTorch nightly | ||||
|         shell: bash | ||||
|         run: | | ||||
|           set -eux | ||||
|  | ||||
|           # Determine python executable for given version (copied from build-triton-wheel) | ||||
|           case $PY_VERS in | ||||
|           3.10) | ||||
|             PYTHON_EXECUTABLE=/opt/python/cp310-cp310/bin/python | ||||
|             ;; | ||||
|           3.11) | ||||
|             PYTHON_EXECUTABLE=/opt/python/cp311-cp311/bin/python | ||||
|             ;; | ||||
|           3.12) | ||||
|             PYTHON_EXECUTABLE=/opt/python/cp312-cp312/bin/python | ||||
|             ;; | ||||
|           3.13) | ||||
|             PYTHON_EXECUTABLE=/opt/python/cp313-cp313/bin/python | ||||
|             ;; | ||||
|           3.13t) | ||||
|             PYTHON_EXECUTABLE=/opt/python/cp313-cp313t/bin/python | ||||
|             ;; | ||||
|           3.14) | ||||
|             PYTHON_EXECUTABLE=/opt/python/cp314-cp314/bin/python | ||||
|             ;; | ||||
|           3.14t) | ||||
|             PYTHON_EXECUTABLE=/opt/python/cp314-cp314t/bin/python | ||||
|             ;; | ||||
|           *) | ||||
|             echo "Unsupported python version ${PY_VERS}" | ||||
|             exit 1 | ||||
|             ;; | ||||
|           esac | ||||
|  | ||||
|           # Keep PyTorch nightly wheel here so that we can install it later during | ||||
|           # vLLM build process | ||||
|           mkdir -p "${RUNNER_TEMP}/artifacts/" | ||||
|  | ||||
|           container_name=$(docker run \ | ||||
|             --tty \ | ||||
|             --detach \ | ||||
|             -e PLATFORM \ | ||||
|             -e PYTHON_EXECUTABLE="${PYTHON_EXECUTABLE}" \ | ||||
|             -v "${GITHUB_WORKSPACE}:/pytorch" \ | ||||
|             -v "${RUNNER_TEMP}/artifacts:/artifacts" \ | ||||
|             -w /artifacts/ \ | ||||
|             "${MANYLINUX_IMAGE}" | ||||
|           ) | ||||
|  | ||||
|           docker exec -t "${container_name}" "${PYTHON_EXECUTABLE}" -mpip install \ | ||||
|             --pre torch torchvision torchaudio \ | ||||
|             --index-url "https://download.pytorch.org/whl/nightly/${BUILD_DEVICE}" | ||||
|  | ||||
|           # I wonder if there is a command to both download and install the wheels | ||||
|           # in one go | ||||
|           docker exec -t "${container_name}" "${PYTHON_EXECUTABLE}" -mpip download \ | ||||
|             --pre torch torchvision torchaudio \ | ||||
|             --index-url "https://download.pytorch.org/whl/nightly/${BUILD_DEVICE}" | ||||
|  | ||||
|           # Save this for later | ||||
|           echo "container_name=${container_name}" >> "$GITHUB_ENV" | ||||
|  | ||||
|       - name: Build vLLM wheel | ||||
|         uses: ./.github/actions/build-external-packages | ||||
|         with: | ||||
|           build-targets: vllm | ||||
|           docker-image: ${{ env.MANYLINUX_IMAGE }} | ||||
|           cuda-arch-list: '8.0;8.9;9.0;10.0;12.0' | ||||
|           torch-wheel-dir: ${{ runner.temp }}/artifacts | ||||
|           output-dir: ${{ runner.temp }}/artifacts/externals | ||||
|  | ||||
|       - name: Prepare vLLM wheel | ||||
|         shell: bash | ||||
|         run: | | ||||
|           set -eux | ||||
|  | ||||
|           # Get these wheels ready, the vllm renaming logic is copied from its .buildkite/scripts/upload-wheels.sh | ||||
|           docker exec -t "${container_name}" bash -c /pytorch/.github/scripts/prepare_vllm_wheels.sh | ||||
|           docker exec -t "${container_name}" chown -R 1000:1000 /artifacts | ||||
|  | ||||
|       - uses: actions/upload-artifact@50769540e7f4bd5e21e526ee35c689e35e0d6874 # v4.4.0 | ||||
|         with: | ||||
|           name: vllm-wheel-${{ matrix.device }}-${{ matrix.platform }}-${{ matrix.python-version }} | ||||
|           if-no-files-found: error | ||||
|           path: ${{ runner.temp }}/artifacts/externals/vllm/wheels/*.whl | ||||
|  | ||||
|       - name: Teardown Linux | ||||
|         uses: pytorch/test-infra/.github/actions/teardown-linux@main | ||||
|         if: always() | ||||
|  | ||||
|   # Copied from build-triton-wheel workflow (mostly) | ||||
|   upload-wheel: | ||||
|     name: "Upload ${{ matrix.device }} vLLM wheel on ${{ matrix.platform }}" | ||||
|     needs: | ||||
|       - build-wheel | ||||
|     runs-on: ubuntu-latest | ||||
|     strategy: | ||||
|       fail-fast: false | ||||
|       matrix: | ||||
|         platform: [ 'manylinux_2_28_x86_64', 'manylinux_2_28_aarch64' ] | ||||
|         device: [ 'cu128', 'cu129' ] | ||||
|     env: | ||||
|       PLATFORM: ${{ matrix.platform }} | ||||
|       BUILD_DEVICE: ${{ matrix.device }} | ||||
|     permissions: | ||||
|       id-token: write | ||||
|       contents: read | ||||
|     container: | ||||
|       image: continuumio/miniconda3:4.12.0 | ||||
|     environment: ${{ ((github.event_name == 'push' && github.event.ref == 'refs/heads/main') || github.event_name == 'schedule' || github.event_name == 'workflow_dispatch') && 'nightly-wheel-upload' || '' }} | ||||
|     steps: | ||||
|       - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 | ||||
|  | ||||
|       - name: Configure AWS credentials(PyTorch account) for main | ||||
|         if: ${{ (github.event_name == 'push' && github.event.ref == 'refs/heads/main') || github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' }} | ||||
|         uses: aws-actions/configure-aws-credentials@ececac1a45f3b08a01d2dd070d28d111c5fe6722 # v4.1.0 | ||||
|         with: | ||||
|           role-to-assume: arn:aws:iam::749337293305:role/gha_workflow_nightly_build_wheels | ||||
|           aws-region: us-east-1 | ||||
|  | ||||
|       - name: Configure AWS credentials(PyTorch account) for RC builds | ||||
|         if: ${{ github.event_name == 'push' &&  (startsWith(github.event.ref, 'refs/tags/') && !startsWith(github.event.ref, 'refs/tags/ciflow/')) }} | ||||
|         uses: aws-actions/configure-aws-credentials@ececac1a45f3b08a01d2dd070d28d111c5fe6722 # v4.1.0 | ||||
|         with: | ||||
|           role-to-assume: arn:aws:iam::749337293305:role/gha_workflow_test_build_wheels | ||||
|           aws-region: us-east-1 | ||||
|  | ||||
|       - name: Download Build Artifacts | ||||
|         uses: actions/download-artifact@65a9edc5881444af0b9093a5e628f2fe47ea3b2e # v4.1.7 | ||||
|         with: | ||||
|           # Download all available artifacts | ||||
|           path: ${{ runner.temp }}/artifacts-all | ||||
|  | ||||
|       - name: Select Wheel Artifacts | ||||
|         shell: bash | ||||
|         run: | | ||||
|           set -eux | ||||
|           mkdir -p "${RUNNER_TEMP}/artifacts/" | ||||
|           mv "${RUNNER_TEMP}"/artifacts-all/vllm-wheel-"${BUILD_DEVICE}"-"${PLATFORM}"-*/* "${RUNNER_TEMP}/artifacts/" | ||||
|  | ||||
|       - name: Set DRY_RUN | ||||
|         if: ${{ (github.event_name == 'push' && (github.event.ref == 'refs/heads/main' || startsWith(github.event.ref, 'refs/tags/v'))) || github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' }} | ||||
|         shell: bash | ||||
|         run: | | ||||
|           echo "DRY_RUN=disabled" >> "$GITHUB_ENV" | ||||
|  | ||||
|       - name: Set UPLOAD_CHANNEL | ||||
|         if: ${{ github.event_name == 'push' && startsWith(github.event.ref, 'refs/tags/v') }} | ||||
|         shell: bash | ||||
|         run: | | ||||
|           set -ex | ||||
|  | ||||
|           if [[ "${GITHUB_REF_NAME}" = *-rc[0-9]* ]]; then | ||||
|             echo "UPLOAD_CHANNEL=test" >> "$GITHUB_ENV" | ||||
|           fi | ||||
|  | ||||
|       - name: Upload binaries | ||||
|         env: | ||||
|           PACKAGE_TYPE: wheel | ||||
|           UPLOAD_SUBFOLDER: ${{ env.BUILD_DEVICE }} | ||||
|           PKG_DIR: ${{ runner.temp }}/artifacts | ||||
|         shell: bash | ||||
|         run: | | ||||
|           set -ex | ||||
|           bash .circleci/scripts/binary_upload.sh | ||||
							
								
								
									
										22
									
								
								.github/workflows/docker-builds.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										22
									
								
								.github/workflows/docker-builds.yml
									
									
									
									
										vendored
									
									
								
							| @ -50,28 +50,30 @@ jobs: | ||||
|         runner: [linux.12xlarge] | ||||
|         docker-image-name: [ | ||||
|           pytorch-linux-jammy-cuda12.8-cudnn9-py3-gcc11, | ||||
|           pytorch-linux-jammy-cuda13.0-cudnn9-py3-gcc11, | ||||
|           pytorch-linux-jammy-cuda12.8-cudnn9-py3.12-gcc11-vllm, | ||||
|           pytorch-linux-jammy-cuda12.8-cudnn9-py3-gcc9-inductor-benchmarks, | ||||
|           pytorch-linux-jammy-cuda12.8-cudnn9-py3.12-gcc9-inductor-benchmarks, | ||||
|           pytorch-linux-jammy-cuda12.8-cudnn9-py3.13-gcc9-inductor-benchmarks, | ||||
|           pytorch-linux-jammy-cuda12.8-cudnn9-py3-gcc9, | ||||
|           pytorch-linux-jammy-cuda12.4-cudnn9-py3-gcc11, | ||||
|           pytorch-linux-jammy-py3.10-clang12, | ||||
|           pytorch-linux-jammy-py3.9-clang12, | ||||
|           pytorch-linux-jammy-py3.13-clang12, | ||||
|           pytorch-linux-jammy-rocm-n-py3, | ||||
|           pytorch-linux-noble-rocm-n-py3, | ||||
|           pytorch-linux-noble-rocm-alpha-py3, | ||||
|           pytorch-linux-jammy-rocm-n-py3-benchmarks, | ||||
|           pytorch-linux-jammy-cuda12.8-cudnn9-py3.10-clang12, | ||||
|           pytorch-linux-jammy-py3.10-gcc11, | ||||
|           pytorch-linux-jammy-py3-gcc11-inductor-benchmarks, | ||||
|           pytorch-linux-jammy-cuda12.8-cudnn9-py3.9-clang12, | ||||
|           pytorch-linux-jammy-py3.9-gcc11, | ||||
|           pytorch-linux-jammy-py3.9-gcc11-inductor-benchmarks, | ||||
|           pytorch-linux-jammy-py3.12-halide, | ||||
|           pytorch-linux-jammy-xpu-n-1-py3, | ||||
|           pytorch-linux-jammy-xpu-n-py3, | ||||
|           pytorch-linux-jammy-xpu-2025.0-py3, | ||||
|           pytorch-linux-jammy-xpu-2025.1-py3, | ||||
|           pytorch-linux-jammy-py3-clang18-asan, | ||||
|           pytorch-linux-jammy-py3-clang12-onnx, | ||||
|           pytorch-linux-jammy-linter, | ||||
|           pytorch-linux-jammy-cuda12.8-cudnn9-py3.10-linter, | ||||
|           pytorch-linux-jammy-py3-clang12-executorch, | ||||
|           pytorch-linux-jammy-cuda12.8-cudnn9-py3.9-linter, | ||||
|           # Executorch pin needs update | ||||
|           # pytorch-linux-jammy-py3-clang12-executorch, | ||||
|           pytorch-linux-jammy-py3.12-triton-cpu, | ||||
|           pytorch-linux-noble-riscv64-py3.12-gcc14 | ||||
|         ] | ||||
| @ -122,7 +124,7 @@ jobs: | ||||
|           GHCR_PAT: ${{ secrets.GHCR_PAT }} | ||||
|         with: | ||||
|           shell: bash | ||||
|           timeout_minutes: 60 | ||||
|           timeout_minutes: 30 | ||||
|           max_attempts: 5 | ||||
|           retry_wait_seconds: 90 | ||||
|           command: | | ||||
|  | ||||
							
								
								
									
										923
									
								
								.github/workflows/generated-linux-aarch64-binary-manywheel-nightly.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										923
									
								
								.github/workflows/generated-linux-aarch64-binary-manywheel-nightly.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										34
									
								
								.github/workflows/generated-linux-binary-libtorch-nightly.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										34
									
								
								.github/workflows/generated-linux-binary-libtorch-nightly.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -248,7 +248,7 @@ jobs: | ||||
|       github-token: ${{ secrets.GITHUB_TOKEN }} | ||||
|     uses: ./.github/workflows/_binary-upload.yml | ||||
|  | ||||
|   libtorch-cuda13_0-shared-with-deps-release-build: | ||||
|   libtorch-cuda12_9-shared-with-deps-release-build: | ||||
|     if: ${{ github.repository_owner == 'pytorch' }} | ||||
|     uses: ./.github/workflows/_binary-build-linux.yml | ||||
|     needs: get-label-type | ||||
| @ -257,22 +257,22 @@ jobs: | ||||
|       PACKAGE_TYPE: libtorch | ||||
|       # TODO: This is a legacy variable that we eventually want to get rid of in | ||||
|       #       favor of GPU_ARCH_VERSION | ||||
|       DESIRED_CUDA: cu130 | ||||
|       GPU_ARCH_VERSION: "13.0" | ||||
|       DESIRED_CUDA: cu129 | ||||
|       GPU_ARCH_VERSION: "12.9" | ||||
|       GPU_ARCH_TYPE: cuda | ||||
|       DOCKER_IMAGE: libtorch-cxx11-builder | ||||
|       DOCKER_IMAGE_TAG_PREFIX: cuda13.0 | ||||
|       DOCKER_IMAGE_TAG_PREFIX: cuda12.9 | ||||
|       LIBTORCH_CONFIG: release | ||||
|       LIBTORCH_VARIANT: shared-with-deps | ||||
|       runner_prefix: "${{ needs.get-label-type.outputs.label-type }}" | ||||
|       build_name: libtorch-cuda13_0-shared-with-deps-release | ||||
|       build_name: libtorch-cuda12_9-shared-with-deps-release | ||||
|       build_environment: linux-binary-libtorch | ||||
|     secrets: | ||||
|       github-token: ${{ secrets.GITHUB_TOKEN }} | ||||
|   libtorch-cuda13_0-shared-with-deps-release-test:  # Testing | ||||
|   libtorch-cuda12_9-shared-with-deps-release-test:  # Testing | ||||
|     if: ${{ github.repository_owner == 'pytorch' }} | ||||
|     needs: | ||||
|       - libtorch-cuda13_0-shared-with-deps-release-build | ||||
|       - libtorch-cuda12_9-shared-with-deps-release-build | ||||
|       - get-label-type | ||||
|     uses: ./.github/workflows/_binary-test-linux.yml | ||||
|     with: | ||||
| @ -280,38 +280,38 @@ jobs: | ||||
|       PACKAGE_TYPE: libtorch | ||||
|       # TODO: This is a legacy variable that we eventually want to get rid of in | ||||
|       #       favor of GPU_ARCH_VERSION | ||||
|       DESIRED_CUDA: cu130 | ||||
|       GPU_ARCH_VERSION: "13.0" | ||||
|       DESIRED_CUDA: cu129 | ||||
|       GPU_ARCH_VERSION: "12.9" | ||||
|       GPU_ARCH_TYPE: cuda | ||||
|       DOCKER_IMAGE: libtorch-cxx11-builder | ||||
|       DOCKER_IMAGE_TAG_PREFIX: cuda13.0 | ||||
|       DOCKER_IMAGE_TAG_PREFIX: cuda12.9 | ||||
|       LIBTORCH_CONFIG: release | ||||
|       LIBTORCH_VARIANT: shared-with-deps | ||||
|       build_name: libtorch-cuda13_0-shared-with-deps-release | ||||
|       build_name: libtorch-cuda12_9-shared-with-deps-release | ||||
|       build_environment: linux-binary-libtorch | ||||
|       runner_prefix: "${{ needs.get-label-type.outputs.label-type }}" | ||||
|       runs_on: linux.g4dn.4xlarge.nvidia.gpu # 12.8+ builds need sm_70+ runner | ||||
|     secrets: | ||||
|       github-token: ${{ secrets.GITHUB_TOKEN }} | ||||
|   libtorch-cuda13_0-shared-with-deps-release-upload:  # Uploading | ||||
|   libtorch-cuda12_9-shared-with-deps-release-upload:  # Uploading | ||||
|     if: ${{ github.repository_owner == 'pytorch' }} | ||||
|     permissions: | ||||
|       id-token: write | ||||
|       contents: read | ||||
|     needs: libtorch-cuda13_0-shared-with-deps-release-test | ||||
|     needs: libtorch-cuda12_9-shared-with-deps-release-test | ||||
|     with: | ||||
|       PYTORCH_ROOT: /pytorch | ||||
|       PACKAGE_TYPE: libtorch | ||||
|       # TODO: This is a legacy variable that we eventually want to get rid of in | ||||
|       #       favor of GPU_ARCH_VERSION | ||||
|       DESIRED_CUDA: cu130 | ||||
|       GPU_ARCH_VERSION: "13.0" | ||||
|       DESIRED_CUDA: cu129 | ||||
|       GPU_ARCH_VERSION: "12.9" | ||||
|       GPU_ARCH_TYPE: cuda | ||||
|       DOCKER_IMAGE: libtorch-cxx11-builder | ||||
|       DOCKER_IMAGE_TAG_PREFIX: cuda13.0 | ||||
|       DOCKER_IMAGE_TAG_PREFIX: cuda12.9 | ||||
|       LIBTORCH_CONFIG: release | ||||
|       LIBTORCH_VARIANT: shared-with-deps | ||||
|       build_name: libtorch-cuda13_0-shared-with-deps-release | ||||
|       build_name: libtorch-cuda12_9-shared-with-deps-release | ||||
|     secrets: | ||||
|       github-token: ${{ secrets.GITHUB_TOKEN }} | ||||
|     uses: ./.github/workflows/_binary-upload.yml | ||||
|  | ||||
							
								
								
									
										2
									
								
								.github/workflows/generated-linux-binary-manywheel-main.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/generated-linux-binary-manywheel-main.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -60,7 +60,7 @@ jobs: | ||||
|       runner_prefix: "${{ needs.get-label-type.outputs.label-type }}" | ||||
|       build_name: manywheel-py3_12-cuda12_8 | ||||
|       build_environment: linux-binary-manywheel | ||||
|       PYTORCH_EXTRA_INSTALL_REQUIREMENTS: nvidia-cuda-nvrtc-cu12==12.8.93; platform_system == 'Linux' | nvidia-cuda-runtime-cu12==12.8.90; platform_system == 'Linux' | nvidia-cuda-cupti-cu12==12.8.90; platform_system == 'Linux' | nvidia-cudnn-cu12==9.10.2.21; platform_system == 'Linux' | nvidia-cublas-cu12==12.8.4.1; platform_system == 'Linux' | nvidia-cufft-cu12==11.3.3.83; platform_system == 'Linux' | nvidia-curand-cu12==10.3.9.90; platform_system == 'Linux' | nvidia-cusolver-cu12==11.7.3.90; platform_system == 'Linux' | nvidia-cusparse-cu12==12.5.8.93; platform_system == 'Linux' | nvidia-cusparselt-cu12==0.7.1; platform_system == 'Linux' | nvidia-nccl-cu12==2.27.5; platform_system == 'Linux' | nvidia-nvshmem-cu12==3.3.24; platform_system == 'Linux' | nvidia-nvtx-cu12==12.8.90; platform_system == 'Linux' | nvidia-nvjitlink-cu12==12.8.93; platform_system == 'Linux' | nvidia-cufile-cu12==1.13.1.3; platform_system == 'Linux' | ||||
|       PYTORCH_EXTRA_INSTALL_REQUIREMENTS: nvidia-cuda-nvrtc-cu12==12.8.93; platform_system == 'Linux' and platform_machine == 'x86_64' | nvidia-cuda-runtime-cu12==12.8.90; platform_system == 'Linux' and platform_machine == 'x86_64' | nvidia-cuda-cupti-cu12==12.8.90; platform_system == 'Linux' and platform_machine == 'x86_64' | nvidia-cudnn-cu12==9.10.2.21; platform_system == 'Linux' and platform_machine == 'x86_64' | nvidia-cublas-cu12==12.8.4.1; platform_system == 'Linux' and platform_machine == 'x86_64' | nvidia-cufft-cu12==11.3.3.83; platform_system == 'Linux' and platform_machine == 'x86_64' | nvidia-curand-cu12==10.3.9.90; platform_system == 'Linux' and platform_machine == 'x86_64' | nvidia-cusolver-cu12==11.7.3.90; platform_system == 'Linux' and platform_machine == 'x86_64' | nvidia-cusparse-cu12==12.5.8.93; platform_system == 'Linux' and platform_machine == 'x86_64' | nvidia-cusparselt-cu12==0.7.1; platform_system == 'Linux' and platform_machine == 'x86_64' | nvidia-nccl-cu12==2.27.5; platform_system == 'Linux' and platform_machine == 'x86_64' | nvidia-nvshmem-cu12==3.3.20; platform_system == 'Linux' and platform_machine == 'x86_64' | nvidia-nvtx-cu12==12.8.90; platform_system == 'Linux' and platform_machine == 'x86_64' | nvidia-nvjitlink-cu12==12.8.93; platform_system == 'Linux' and platform_machine == 'x86_64' | nvidia-cufile-cu12==1.13.1.3; platform_system == 'Linux' and platform_machine == 'x86_64' | ||||
|     secrets: | ||||
|       github-token: ${{ secrets.GITHUB_TOKEN }} | ||||
|   manywheel-py3_12-cuda12_8-test:  # Testing | ||||
|  | ||||
							
								
								
									
										1190
									
								
								.github/workflows/generated-linux-binary-manywheel-nightly.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1190
									
								
								.github/workflows/generated-linux-binary-manywheel-nightly.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										14
									
								
								.github/workflows/generated-linux-binary-manywheel-rocm-main.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										14
									
								
								.github/workflows/generated-linux-binary-manywheel-rocm-main.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -44,7 +44,7 @@ jobs: | ||||
|       issue_owner: ${{ github.event.pull_request.user.login || github.event.issue.user.login }} | ||||
|       curr_branch: ${{ github.head_ref || github.ref_name }} | ||||
|       curr_ref_type: ${{ github.ref_type }} | ||||
|   manywheel-py3_10-rocm6_4-build: | ||||
|   manywheel-py3_9-rocm6_4-build: | ||||
|     if: ${{ github.repository_owner == 'pytorch' }} | ||||
|     uses: ./.github/workflows/_binary-build-linux.yml | ||||
|     needs: get-label-type | ||||
| @ -58,16 +58,16 @@ jobs: | ||||
|       GPU_ARCH_TYPE: rocm | ||||
|       DOCKER_IMAGE: manylinux2_28-builder | ||||
|       DOCKER_IMAGE_TAG_PREFIX: rocm6.4 | ||||
|       DESIRED_PYTHON: "3.10" | ||||
|       DESIRED_PYTHON: "3.9" | ||||
|       runner_prefix: "${{ needs.get-label-type.outputs.label-type }}" | ||||
|       build_name: manywheel-py3_10-rocm6_4 | ||||
|       build_name: manywheel-py3_9-rocm6_4 | ||||
|       build_environment: linux-binary-manywheel-rocm | ||||
|     secrets: | ||||
|       github-token: ${{ secrets.GITHUB_TOKEN }} | ||||
|   manywheel-py3_10-rocm6_4-test:  # Testing | ||||
|   manywheel-py3_9-rocm6_4-test:  # Testing | ||||
|     if: ${{ github.repository_owner == 'pytorch' }} | ||||
|     needs: | ||||
|       - manywheel-py3_10-rocm6_4-build | ||||
|       - manywheel-py3_9-rocm6_4-build | ||||
|       - get-label-type | ||||
|     runs-on: linux.rocm.gpu.mi250 | ||||
|     timeout-minutes: 240 | ||||
| @ -82,14 +82,14 @@ jobs: | ||||
|       SKIP_ALL_TESTS: 1 | ||||
|       DOCKER_IMAGE: manylinux2_28-builder | ||||
|       DOCKER_IMAGE_TAG_PREFIX: rocm6.4 | ||||
|       DESIRED_PYTHON: "3.10" | ||||
|       DESIRED_PYTHON: "3.9" | ||||
|     steps: | ||||
|       - name: Setup ROCm | ||||
|         uses: ./.github/actions/setup-rocm | ||||
|       - uses: actions/download-artifact@v4.1.7 | ||||
|         name: Download Build Artifacts | ||||
|         with: | ||||
|           name: manywheel-py3_10-rocm6_4 | ||||
|           name: manywheel-py3_9-rocm6_4 | ||||
|           path: "${{ runner.temp }}/artifacts/" | ||||
|       - name: Checkout PyTorch | ||||
|         uses: actions/checkout@v4 | ||||
|  | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user
	