mirror of
https://github.com/pytorch/pytorch.git
synced 2025-11-05 16:44:58 +08:00
Compare commits
3 Commits
try-removi
...
async_tp
| Author | SHA1 | Date | |
|---|---|---|---|
| 83349ae64d | |||
| bf08b164dc | |||
| da0b6aea11 |
@ -13,4 +13,3 @@ exclude:
|
|||||||
- "**/benchmarks/**"
|
- "**/benchmarks/**"
|
||||||
- "**/test_*.py"
|
- "**/test_*.py"
|
||||||
- "**/*_test.py"
|
- "**/*_test.py"
|
||||||
- "tools/**"
|
|
||||||
|
|||||||
@ -5,11 +5,9 @@ GPU_ARCH_VERSION=${GPU_ARCH_VERSION:-}
|
|||||||
|
|
||||||
# Set CUDA architecture lists to match x86 build_cuda.sh
|
# Set CUDA architecture lists to match x86 build_cuda.sh
|
||||||
if [[ "$GPU_ARCH_VERSION" == *"12.6"* ]]; then
|
if [[ "$GPU_ARCH_VERSION" == *"12.6"* ]]; then
|
||||||
export TORCH_CUDA_ARCH_LIST="8.0;9.0"
|
export TORCH_CUDA_ARCH_LIST="5.0;6.0;7.0;8.0;9.0"
|
||||||
elif [[ "$GPU_ARCH_VERSION" == *"12.8"* ]]; then
|
elif [[ "$GPU_ARCH_VERSION" == *"12.8"* ]]; then
|
||||||
export TORCH_CUDA_ARCH_LIST="8.0;9.0;10.0;12.0"
|
export TORCH_CUDA_ARCH_LIST="7.0;8.0;9.0;10.0;12.0"
|
||||||
elif [[ "$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
|
elif [[ "$GPU_ARCH_VERSION" == *"13.0"* ]]; then
|
||||||
export TORCH_CUDA_ARCH_LIST="8.0;9.0;10.0;11.0;12.0+PTX"
|
export TORCH_CUDA_ARCH_LIST="8.0;9.0;10.0;11.0;12.0+PTX"
|
||||||
fi
|
fi
|
||||||
@ -17,8 +15,6 @@ fi
|
|||||||
# Compress the fatbin with -compress-mode=size for CUDA 13
|
# Compress the fatbin with -compress-mode=size for CUDA 13
|
||||||
if [[ "$DESIRED_CUDA" == *"13"* ]]; then
|
if [[ "$DESIRED_CUDA" == *"13"* ]]; then
|
||||||
export TORCH_NVCC_FLAGS="-compress-mode=size"
|
export TORCH_NVCC_FLAGS="-compress-mode=size"
|
||||||
# Bundle ptxas into the cu13 wheel, see https://github.com/pytorch/pytorch/issues/163801
|
|
||||||
export BUILD_BUNDLE_PTXAS=1
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
SCRIPTPATH="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )"
|
SCRIPTPATH="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )"
|
||||||
@ -35,7 +31,8 @@ pip install -r /pytorch/requirements.txt
|
|||||||
pip install auditwheel==6.2.0 wheel
|
pip install auditwheel==6.2.0 wheel
|
||||||
if [ "$DESIRED_CUDA" = "cpu" ]; then
|
if [ "$DESIRED_CUDA" = "cpu" ]; then
|
||||||
echo "BASE_CUDA_VERSION is not set. Building cpu wheel."
|
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
|
else
|
||||||
echo "BASE_CUDA_VERSION is set to: $DESIRED_CUDA"
|
echo "BASE_CUDA_VERSION is set to: $DESIRED_CUDA"
|
||||||
export USE_SYSTEM_NCCL=1
|
export USE_SYSTEM_NCCL=1
|
||||||
@ -45,9 +42,13 @@ else
|
|||||||
echo "Bundling CUDA libraries with wheel for aarch64."
|
echo "Bundling CUDA libraries with wheel for aarch64."
|
||||||
else
|
else
|
||||||
echo "Using nvidia libs from pypi for aarch64."
|
echo "Using nvidia libs from pypi for aarch64."
|
||||||
|
# Fix platform constraints in PYTORCH_EXTRA_INSTALL_REQUIREMENTS for aarch64
|
||||||
|
# Replace 'platform_machine == "x86_64"' with 'platform_machine == "aarch64"'
|
||||||
|
export PYTORCH_EXTRA_INSTALL_REQUIREMENTS="${PYTORCH_EXTRA_INSTALL_REQUIREMENTS//platform_machine == \'x86_64\'/platform_machine == \'aarch64\'}"
|
||||||
echo "Updated PYTORCH_EXTRA_INSTALL_REQUIREMENTS for aarch64: $PYTORCH_EXTRA_INSTALL_REQUIREMENTS"
|
echo "Updated PYTORCH_EXTRA_INSTALL_REQUIREMENTS for aarch64: $PYTORCH_EXTRA_INSTALL_REQUIREMENTS"
|
||||||
export USE_NVIDIA_PYPI_LIBS=1
|
export USE_NVIDIA_PYPI_LIBS=1
|
||||||
fi
|
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
|
fi
|
||||||
|
|||||||
@ -13,6 +13,49 @@ def list_dir(path: str) -> list[str]:
|
|||||||
return check_output(["ls", "-1", path]).decode().split("\n")
|
return check_output(["ls", "-1", path]).decode().split("\n")
|
||||||
|
|
||||||
|
|
||||||
|
def build_ArmComputeLibrary() -> None:
|
||||||
|
"""
|
||||||
|
Using ArmComputeLibrary for aarch64 PyTorch
|
||||||
|
"""
|
||||||
|
print("Building Arm Compute Library")
|
||||||
|
acl_build_flags = [
|
||||||
|
"debug=0",
|
||||||
|
"neon=1",
|
||||||
|
"opencl=0",
|
||||||
|
"os=linux",
|
||||||
|
"openmp=1",
|
||||||
|
"cppthreads=0",
|
||||||
|
"arch=armv8a",
|
||||||
|
"multi_isa=1",
|
||||||
|
"fixed_format_kernels=1",
|
||||||
|
"build=native",
|
||||||
|
]
|
||||||
|
acl_install_dir = "/acl"
|
||||||
|
acl_checkout_dir = os.getenv("ACL_SOURCE_DIR", "ComputeLibrary")
|
||||||
|
if os.path.isdir(acl_install_dir):
|
||||||
|
shutil.rmtree(acl_install_dir)
|
||||||
|
if not os.path.isdir(acl_checkout_dir) or not len(os.listdir(acl_checkout_dir)):
|
||||||
|
check_call(
|
||||||
|
[
|
||||||
|
"git",
|
||||||
|
"clone",
|
||||||
|
"https://github.com/ARM-software/ComputeLibrary.git",
|
||||||
|
"-b",
|
||||||
|
"v25.02",
|
||||||
|
"--depth",
|
||||||
|
"1",
|
||||||
|
"--shallow-submodules",
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
|
check_call(
|
||||||
|
["scons", "Werror=1", f"-j{os.cpu_count()}"] + acl_build_flags,
|
||||||
|
cwd=acl_checkout_dir,
|
||||||
|
)
|
||||||
|
for d in ["arm_compute", "include", "utils", "support", "src", "build"]:
|
||||||
|
shutil.copytree(f"{acl_checkout_dir}/{d}", f"{acl_install_dir}/{d}")
|
||||||
|
|
||||||
|
|
||||||
def replace_tag(filename) -> None:
|
def replace_tag(filename) -> None:
|
||||||
with open(filename) as f:
|
with open(filename) as f:
|
||||||
lines = f.readlines()
|
lines = f.readlines()
|
||||||
@ -95,8 +138,6 @@ def package_cuda_wheel(wheel_path, desired_cuda) -> None:
|
|||||||
folder = os.path.dirname(wheel_path)
|
folder = os.path.dirname(wheel_path)
|
||||||
os.mkdir(f"{folder}/tmp")
|
os.mkdir(f"{folder}/tmp")
|
||||||
os.system(f"unzip {wheel_path} -d {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}")
|
|
||||||
|
|
||||||
# Check if we should use PyPI NVIDIA libraries or bundle system libraries
|
# Check if we should use PyPI NVIDIA libraries or bundle system libraries
|
||||||
use_nvidia_pypi_libs = os.getenv("USE_NVIDIA_PYPI_LIBS", "0") == "1"
|
use_nvidia_pypi_libs = os.getenv("USE_NVIDIA_PYPI_LIBS", "0") == "1"
|
||||||
@ -170,8 +211,7 @@ def package_cuda_wheel(wheel_path, desired_cuda) -> None:
|
|||||||
]
|
]
|
||||||
|
|
||||||
# CUDA version-specific libraries
|
# CUDA version-specific libraries
|
||||||
if "13" in desired_cuda:
|
if "130" in desired_cuda:
|
||||||
minor_version = desired_cuda[-1]
|
|
||||||
version_specific_libs = [
|
version_specific_libs = [
|
||||||
"/usr/local/cuda/extras/CUPTI/lib64/libcupti.so.13",
|
"/usr/local/cuda/extras/CUPTI/lib64/libcupti.so.13",
|
||||||
"/usr/local/cuda/lib64/libcublas.so.13",
|
"/usr/local/cuda/lib64/libcublas.so.13",
|
||||||
@ -181,7 +221,7 @@ def package_cuda_wheel(wheel_path, desired_cuda) -> None:
|
|||||||
"/usr/local/cuda/lib64/libcusolver.so.12",
|
"/usr/local/cuda/lib64/libcusolver.so.12",
|
||||||
"/usr/local/cuda/lib64/libnvJitLink.so.13",
|
"/usr/local/cuda/lib64/libnvJitLink.so.13",
|
||||||
"/usr/local/cuda/lib64/libnvrtc.so.13",
|
"/usr/local/cuda/lib64/libnvrtc.so.13",
|
||||||
f"/usr/local/cuda/lib64/libnvrtc-builtins.so.13.{minor_version}",
|
"/usr/local/cuda/lib64/libnvrtc-builtins.so.13.0",
|
||||||
]
|
]
|
||||||
elif "12" in desired_cuda:
|
elif "12" in desired_cuda:
|
||||||
# Get the last character for libnvrtc-builtins version (e.g., "129" -> "9")
|
# Get the last character for libnvrtc-builtins version (e.g., "129" -> "9")
|
||||||
@ -197,8 +237,6 @@ def package_cuda_wheel(wheel_path, desired_cuda) -> None:
|
|||||||
"/usr/local/cuda/lib64/libnvrtc.so.12",
|
"/usr/local/cuda/lib64/libnvrtc.so.12",
|
||||||
f"/usr/local/cuda/lib64/libnvrtc-builtins.so.12.{minor_version}",
|
f"/usr/local/cuda/lib64/libnvrtc-builtins.so.12.{minor_version}",
|
||||||
]
|
]
|
||||||
else:
|
|
||||||
raise ValueError(f"Unsupported CUDA version: {desired_cuda}.")
|
|
||||||
|
|
||||||
# Combine all libraries
|
# Combine all libraries
|
||||||
libs_to_copy = common_libs + version_specific_libs
|
libs_to_copy = common_libs + version_specific_libs
|
||||||
@ -237,7 +275,14 @@ def complete_wheel(folder: str) -> str:
|
|||||||
f"/{folder}/dist/{repaired_wheel_name}",
|
f"/{folder}/dist/{repaired_wheel_name}",
|
||||||
)
|
)
|
||||||
else:
|
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")
|
print(f"Copying {repaired_wheel_name} to artifacts")
|
||||||
shutil.copy2(
|
shutil.copy2(
|
||||||
@ -274,7 +319,7 @@ if __name__ == "__main__":
|
|||||||
).decode()
|
).decode()
|
||||||
|
|
||||||
print("Building PyTorch wheel")
|
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)
|
# MAX_JOB=5 is not required for CPU backend (see commit 465d98b)
|
||||||
if enable_cuda:
|
if enable_cuda:
|
||||||
build_vars += "MAX_JOBS=5 "
|
build_vars += "MAX_JOBS=5 "
|
||||||
@ -313,17 +358,23 @@ if __name__ == "__main__":
|
|||||||
build_vars += f"BUILD_TEST=0 PYTORCH_BUILD_VERSION={branch[1 : branch.find('-')]} PYTORCH_BUILD_NUMBER=1 "
|
build_vars += f"BUILD_TEST=0 PYTORCH_BUILD_VERSION={branch[1 : branch.find('-')]} PYTORCH_BUILD_NUMBER=1 "
|
||||||
|
|
||||||
if enable_mkldnn:
|
if enable_mkldnn:
|
||||||
|
build_ArmComputeLibrary()
|
||||||
print("build pytorch with mkldnn+acl backend")
|
print("build pytorch with mkldnn+acl backend")
|
||||||
build_vars += "USE_MKLDNN=ON USE_MKLDNN_ACL=ON "
|
build_vars += (
|
||||||
build_vars += "ACL_ROOT_DIR=/acl "
|
"USE_MKLDNN=ON USE_MKLDNN_ACL=ON "
|
||||||
|
"ACL_ROOT_DIR=/acl "
|
||||||
|
"LD_LIBRARY_PATH=/pytorch/build/lib:/acl/build:$LD_LIBRARY_PATH "
|
||||||
|
"ACL_INCLUDE_DIR=/acl/build "
|
||||||
|
"ACL_LIBRARY=/acl/build "
|
||||||
|
)
|
||||||
if enable_cuda:
|
if enable_cuda:
|
||||||
build_vars += "BLAS=NVPL "
|
build_vars += "BLAS=NVPL "
|
||||||
else:
|
else:
|
||||||
build_vars += "BLAS=OpenBLAS OpenBLAS_HOME=/opt/OpenBLAS "
|
build_vars += "BLAS=OpenBLAS OpenBLAS_HOME=/OpenBLAS "
|
||||||
else:
|
else:
|
||||||
print("build pytorch without mkldnn backend")
|
print("build pytorch without mkldnn backend")
|
||||||
|
|
||||||
os.system(f"cd /pytorch; {build_vars} python3 -m build --wheel --no-isolation")
|
os.system(f"cd /pytorch; {build_vars} python3 setup.py bdist_wheel")
|
||||||
if enable_cuda:
|
if enable_cuda:
|
||||||
print("Updating Cuda Dependency")
|
print("Updating Cuda Dependency")
|
||||||
filename = os.listdir("/pytorch/dist/")
|
filename = os.listdir("/pytorch/dist/")
|
||||||
|
|||||||
@ -241,7 +241,7 @@ def wait_for_connection(addr, port, timeout=15, attempt_cnt=5):
|
|||||||
try:
|
try:
|
||||||
with socket.create_connection((addr, port), timeout=timeout):
|
with socket.create_connection((addr, port), timeout=timeout):
|
||||||
return
|
return
|
||||||
except (ConnectionRefusedError, TimeoutError): # noqa: PERF203
|
except (ConnectionRefusedError, socket.timeout): # noqa: PERF203
|
||||||
if i == attempt_cnt - 1:
|
if i == attempt_cnt - 1:
|
||||||
raise
|
raise
|
||||||
time.sleep(timeout)
|
time.sleep(timeout)
|
||||||
@ -299,6 +299,40 @@ def install_condaforge_python(host: RemoteHost, python_version="3.8") -> None:
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def build_OpenBLAS(host: RemoteHost, git_clone_flags: str = "") -> None:
|
||||||
|
print("Building OpenBLAS")
|
||||||
|
host.run_cmd(
|
||||||
|
f"git clone https://github.com/xianyi/OpenBLAS -b v0.3.28 {git_clone_flags}"
|
||||||
|
)
|
||||||
|
make_flags = "NUM_THREADS=64 USE_OPENMP=1 NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=ARMV8"
|
||||||
|
host.run_cmd(
|
||||||
|
f"pushd OpenBLAS && make {make_flags} -j8 && sudo make {make_flags} install && popd && rm -rf OpenBLAS"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def build_ArmComputeLibrary(host: RemoteHost, git_clone_flags: str = "") -> None:
|
||||||
|
print("Building Arm Compute Library")
|
||||||
|
acl_build_flags = " ".join(
|
||||||
|
[
|
||||||
|
"debug=0",
|
||||||
|
"neon=1",
|
||||||
|
"opencl=0",
|
||||||
|
"os=linux",
|
||||||
|
"openmp=1",
|
||||||
|
"cppthreads=0",
|
||||||
|
"arch=armv8a",
|
||||||
|
"multi_isa=1",
|
||||||
|
"fixed_format_kernels=1",
|
||||||
|
"build=native",
|
||||||
|
]
|
||||||
|
)
|
||||||
|
host.run_cmd(
|
||||||
|
f"git clone https://github.com/ARM-software/ComputeLibrary.git -b v25.02 {git_clone_flags}"
|
||||||
|
)
|
||||||
|
|
||||||
|
host.run_cmd(f"cd ComputeLibrary && scons Werror=1 -j8 {acl_build_flags}")
|
||||||
|
|
||||||
|
|
||||||
def embed_libgomp(host: RemoteHost, use_conda, wheel_name) -> None:
|
def embed_libgomp(host: RemoteHost, use_conda, wheel_name) -> None:
|
||||||
host.run_cmd("pip3 install auditwheel")
|
host.run_cmd("pip3 install auditwheel")
|
||||||
host.run_cmd(
|
host.run_cmd(
|
||||||
@ -408,7 +442,7 @@ def build_torchvision(
|
|||||||
if host.using_docker():
|
if host.using_docker():
|
||||||
build_vars += " CMAKE_SHARED_LINKER_FLAGS=-Wl,-z,max-page-size=0x10000"
|
build_vars += " CMAKE_SHARED_LINKER_FLAGS=-Wl,-z,max-page-size=0x10000"
|
||||||
|
|
||||||
host.run_cmd(f"cd vision && {build_vars} python3 -m build --wheel --no-isolation")
|
host.run_cmd(f"cd vision && {build_vars} python3 setup.py bdist_wheel")
|
||||||
vision_wheel_name = host.list_dir("vision/dist")[0]
|
vision_wheel_name = host.list_dir("vision/dist")[0]
|
||||||
embed_libgomp(host, use_conda, os.path.join("vision", "dist", vision_wheel_name))
|
embed_libgomp(host, use_conda, os.path.join("vision", "dist", vision_wheel_name))
|
||||||
|
|
||||||
@ -463,7 +497,7 @@ def build_torchdata(
|
|||||||
if host.using_docker():
|
if host.using_docker():
|
||||||
build_vars += " CMAKE_SHARED_LINKER_FLAGS=-Wl,-z,max-page-size=0x10000"
|
build_vars += " CMAKE_SHARED_LINKER_FLAGS=-Wl,-z,max-page-size=0x10000"
|
||||||
|
|
||||||
host.run_cmd(f"cd data && {build_vars} python3 -m build --wheel --no-isolation")
|
host.run_cmd(f"cd data && {build_vars} python3 setup.py bdist_wheel")
|
||||||
wheel_name = host.list_dir("data/dist")[0]
|
wheel_name = host.list_dir("data/dist")[0]
|
||||||
embed_libgomp(host, use_conda, os.path.join("data", "dist", wheel_name))
|
embed_libgomp(host, use_conda, os.path.join("data", "dist", wheel_name))
|
||||||
|
|
||||||
@ -519,7 +553,7 @@ def build_torchtext(
|
|||||||
if host.using_docker():
|
if host.using_docker():
|
||||||
build_vars += " CMAKE_SHARED_LINKER_FLAGS=-Wl,-z,max-page-size=0x10000"
|
build_vars += " CMAKE_SHARED_LINKER_FLAGS=-Wl,-z,max-page-size=0x10000"
|
||||||
|
|
||||||
host.run_cmd(f"cd text && {build_vars} python3 -m build --wheel --no-isolation")
|
host.run_cmd(f"cd text && {build_vars} python3 setup.py bdist_wheel")
|
||||||
wheel_name = host.list_dir("text/dist")[0]
|
wheel_name = host.list_dir("text/dist")[0]
|
||||||
embed_libgomp(host, use_conda, os.path.join("text", "dist", wheel_name))
|
embed_libgomp(host, use_conda, os.path.join("text", "dist", wheel_name))
|
||||||
|
|
||||||
@ -580,7 +614,7 @@ def build_torchaudio(
|
|||||||
host.run_cmd(
|
host.run_cmd(
|
||||||
f"cd audio && export FFMPEG_ROOT=$(pwd)/third_party/ffmpeg && export USE_FFMPEG=1 \
|
f"cd audio && export FFMPEG_ROOT=$(pwd)/third_party/ffmpeg && export USE_FFMPEG=1 \
|
||||||
&& ./packaging/ffmpeg/build.sh \
|
&& ./packaging/ffmpeg/build.sh \
|
||||||
&& {build_vars} python3 -m build --wheel --no-isolation"
|
&& {build_vars} python3 setup.py bdist_wheel"
|
||||||
)
|
)
|
||||||
|
|
||||||
wheel_name = host.list_dir("audio/dist")[0]
|
wheel_name = host.list_dir("audio/dist")[0]
|
||||||
@ -666,6 +700,7 @@ def start_build(
|
|||||||
configure_system(
|
configure_system(
|
||||||
host, compiler=compiler, use_conda=use_conda, python_version=python_version
|
host, compiler=compiler, use_conda=use_conda, python_version=python_version
|
||||||
)
|
)
|
||||||
|
build_OpenBLAS(host, git_clone_flags)
|
||||||
|
|
||||||
if host.using_docker():
|
if host.using_docker():
|
||||||
print("Move libgfortant.a into a standard location")
|
print("Move libgfortant.a into a standard location")
|
||||||
@ -688,12 +723,10 @@ def start_build(
|
|||||||
f"git clone --recurse-submodules -b {branch} https://github.com/pytorch/pytorch {git_clone_flags}"
|
f"git clone --recurse-submodules -b {branch} https://github.com/pytorch/pytorch {git_clone_flags}"
|
||||||
)
|
)
|
||||||
|
|
||||||
host.run_cmd("pytorch/.ci/docker/common/install_openblas.sh")
|
|
||||||
|
|
||||||
print("Building PyTorch wheel")
|
print("Building PyTorch wheel")
|
||||||
build_opts = ""
|
build_opts = ""
|
||||||
if pytorch_build_number is not None:
|
if pytorch_build_number is not None:
|
||||||
build_opts += f" -C--build-option=--build-number={pytorch_build_number}"
|
build_opts += f" --build-number {pytorch_build_number}"
|
||||||
# Breakpad build fails on aarch64
|
# Breakpad build fails on aarch64
|
||||||
build_vars = "USE_BREAKPAD=0 "
|
build_vars = "USE_BREAKPAD=0 "
|
||||||
if branch == "nightly":
|
if branch == "nightly":
|
||||||
@ -710,18 +743,15 @@ def start_build(
|
|||||||
if host.using_docker():
|
if host.using_docker():
|
||||||
build_vars += " CMAKE_SHARED_LINKER_FLAGS=-Wl,-z,max-page-size=0x10000"
|
build_vars += " CMAKE_SHARED_LINKER_FLAGS=-Wl,-z,max-page-size=0x10000"
|
||||||
if enable_mkldnn:
|
if enable_mkldnn:
|
||||||
host.run_cmd("pytorch/.ci/docker/common/install_acl.sh")
|
build_ArmComputeLibrary(host, git_clone_flags)
|
||||||
print("build pytorch with mkldnn+acl backend")
|
print("build pytorch with mkldnn+acl backend")
|
||||||
build_vars += " USE_MKLDNN=ON USE_MKLDNN_ACL=ON"
|
build_vars += " USE_MKLDNN=ON USE_MKLDNN_ACL=ON"
|
||||||
build_vars += " BLAS=OpenBLAS"
|
|
||||||
build_vars += " OpenBLAS_HOME=/opt/OpenBLAS"
|
|
||||||
build_vars += " ACL_ROOT_DIR=/acl"
|
|
||||||
host.run_cmd(
|
host.run_cmd(
|
||||||
f"cd $HOME/pytorch && {build_vars} python3 -m build --wheel --no-isolation{build_opts}"
|
f"cd $HOME/pytorch && export ACL_ROOT_DIR=$HOME/ComputeLibrary && {build_vars} python3 setup.py bdist_wheel{build_opts}"
|
||||||
)
|
)
|
||||||
print("Repair the wheel")
|
print("Repair the wheel")
|
||||||
pytorch_wheel_name = host.list_dir("pytorch/dist")[0]
|
pytorch_wheel_name = host.list_dir("pytorch/dist")[0]
|
||||||
ld_library_path = "/acl/build:$HOME/pytorch/build/lib"
|
ld_library_path = "$HOME/acl/build:$HOME/pytorch/build/lib"
|
||||||
host.run_cmd(
|
host.run_cmd(
|
||||||
f"export LD_LIBRARY_PATH={ld_library_path} && auditwheel repair $HOME/pytorch/dist/{pytorch_wheel_name}"
|
f"export LD_LIBRARY_PATH={ld_library_path} && auditwheel repair $HOME/pytorch/dist/{pytorch_wheel_name}"
|
||||||
)
|
)
|
||||||
@ -733,7 +763,7 @@ def start_build(
|
|||||||
else:
|
else:
|
||||||
print("build pytorch without mkldnn backend")
|
print("build pytorch without mkldnn backend")
|
||||||
host.run_cmd(
|
host.run_cmd(
|
||||||
f"cd pytorch && {build_vars} python3 -m build --wheel --no-isolation{build_opts}"
|
f"cd pytorch && {build_vars} python3 setup.py bdist_wheel{build_opts}"
|
||||||
)
|
)
|
||||||
|
|
||||||
print("Deleting build folder")
|
print("Deleting build folder")
|
||||||
@ -877,7 +907,7 @@ def terminate_instances(instance_type: str) -> None:
|
|||||||
def parse_arguments():
|
def parse_arguments():
|
||||||
from argparse import ArgumentParser
|
from argparse import ArgumentParser
|
||||||
|
|
||||||
parser = ArgumentParser("Build and test AARCH64 wheels using EC2")
|
parser = ArgumentParser("Builid and test AARCH64 wheels using EC2")
|
||||||
parser.add_argument("--key-name", type=str)
|
parser.add_argument("--key-name", type=str)
|
||||||
parser.add_argument("--debug", action="store_true")
|
parser.add_argument("--debug", action="store_true")
|
||||||
parser.add_argument("--build-only", action="store_true")
|
parser.add_argument("--build-only", action="store_true")
|
||||||
@ -974,7 +1004,7 @@ if __name__ == "__main__":
|
|||||||
install_condaforge_python(host, args.python_version)
|
install_condaforge_python(host, args.python_version)
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
|
|
||||||
python_version = args.python_version if args.python_version is not None else "3.10"
|
python_version = args.python_version if args.python_version is not None else "3.9"
|
||||||
|
|
||||||
if args.use_torch_from_pypi:
|
if args.use_torch_from_pypi:
|
||||||
configure_system(host, compiler=args.compiler, python_version=python_version)
|
configure_system(host, compiler=args.compiler, python_version=python_version)
|
||||||
|
|||||||
@ -69,8 +69,7 @@ RUN bash ./install_cuda.sh 13.0
|
|||||||
ENV DESIRED_CUDA=13.0
|
ENV DESIRED_CUDA=13.0
|
||||||
|
|
||||||
FROM ${ROCM_IMAGE} as rocm
|
FROM ${ROCM_IMAGE} as rocm
|
||||||
ARG PYTORCH_ROCM_ARCH
|
ENV PYTORCH_ROCM_ARCH="gfx900;gfx906;gfx908;gfx90a;gfx942;gfx1030;gfx1100;gfx1101;gfx1102;gfx1200;gfx1201"
|
||||||
ENV PYTORCH_ROCM_ARCH ${PYTORCH_ROCM_ARCH}
|
|
||||||
ADD ./common/install_mkl.sh install_mkl.sh
|
ADD ./common/install_mkl.sh install_mkl.sh
|
||||||
RUN bash ./install_mkl.sh && rm install_mkl.sh
|
RUN bash ./install_mkl.sh && rm install_mkl.sh
|
||||||
ENV MKLROOT /opt/intel
|
ENV MKLROOT /opt/intel
|
||||||
|
|||||||
@ -36,12 +36,6 @@ case ${DOCKER_TAG_PREFIX} in
|
|||||||
;;
|
;;
|
||||||
rocm*)
|
rocm*)
|
||||||
BASE_TARGET=rocm
|
BASE_TARGET=rocm
|
||||||
PYTORCH_ROCM_ARCH="gfx900;gfx906;gfx908;gfx90a;gfx942;gfx1030;gfx1100;gfx1101;gfx1102;gfx1200;gfx1201"
|
|
||||||
# add gfx950, gfx115x conditionally starting in ROCm 7.0
|
|
||||||
if [[ "$ROCM_VERSION" == *"7.0"* ]]; then
|
|
||||||
PYTORCH_ROCM_ARCH="${PYTORCH_ROCM_ARCH};gfx950;gfx1150;gfx1151"
|
|
||||||
fi
|
|
||||||
EXTRA_BUILD_ARGS="${EXTRA_BUILD_ARGS} --build-arg PYTORCH_ROCM_ARCH=${PYTORCH_ROCM_ARCH}"
|
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
echo "ERROR: Unknown docker tag ${DOCKER_TAG_PREFIX}"
|
echo "ERROR: Unknown docker tag ${DOCKER_TAG_PREFIX}"
|
||||||
|
|||||||
@ -84,8 +84,8 @@ fi
|
|||||||
_UCX_COMMIT=7836b165abdbe468a2f607e7254011c07d788152
|
_UCX_COMMIT=7836b165abdbe468a2f607e7254011c07d788152
|
||||||
_UCC_COMMIT=430e241bf5d38cbc73fc7a6b89155397232e3f96
|
_UCC_COMMIT=430e241bf5d38cbc73fc7a6b89155397232e3f96
|
||||||
if [[ "$image" == *rocm* ]]; then
|
if [[ "$image" == *rocm* ]]; then
|
||||||
_UCX_COMMIT=29831d319e6be55cb8c768ca61de335c934ca39e
|
_UCX_COMMIT=cc312eaa4655c0cc5c2bcd796db938f90563bcf6
|
||||||
_UCC_COMMIT=9f4b242cbbd8b1462cbc732eb29316cdfa124b77
|
_UCC_COMMIT=0c0fc21559835044ab107199e334f7157d6a0d3d
|
||||||
fi
|
fi
|
||||||
|
|
||||||
tag=$(echo $image | awk -F':' '{print $2}')
|
tag=$(echo $image | awk -F':' '{print $2}')
|
||||||
@ -113,7 +113,6 @@ case "$tag" in
|
|||||||
UCX_COMMIT=${_UCX_COMMIT}
|
UCX_COMMIT=${_UCX_COMMIT}
|
||||||
UCC_COMMIT=${_UCC_COMMIT}
|
UCC_COMMIT=${_UCC_COMMIT}
|
||||||
TRITON=yes
|
TRITON=yes
|
||||||
INSTALL_MINGW=yes
|
|
||||||
;;
|
;;
|
||||||
pytorch-linux-jammy-cuda13.0-cudnn9-py3-gcc11)
|
pytorch-linux-jammy-cuda13.0-cudnn9-py3-gcc11)
|
||||||
CUDA_VERSION=13.0.0
|
CUDA_VERSION=13.0.0
|
||||||
@ -176,16 +175,27 @@ case "$tag" in
|
|||||||
fi
|
fi
|
||||||
GCC_VERSION=11
|
GCC_VERSION=11
|
||||||
VISION=yes
|
VISION=yes
|
||||||
|
ROCM_VERSION=6.4
|
||||||
|
NINJA_VERSION=1.9.0
|
||||||
|
TRITON=yes
|
||||||
|
KATEX=yes
|
||||||
|
UCX_COMMIT=${_UCX_COMMIT}
|
||||||
|
UCC_COMMIT=${_UCC_COMMIT}
|
||||||
|
if [[ $tag =~ "benchmarks" ]]; then
|
||||||
|
INDUCTOR_BENCHMARKS=yes
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
pytorch-linux-noble-rocm-alpha-py3)
|
||||||
|
ANACONDA_PYTHON_VERSION=3.12
|
||||||
|
GCC_VERSION=11
|
||||||
|
VISION=yes
|
||||||
ROCM_VERSION=7.0
|
ROCM_VERSION=7.0
|
||||||
NINJA_VERSION=1.9.0
|
NINJA_VERSION=1.9.0
|
||||||
TRITON=yes
|
TRITON=yes
|
||||||
KATEX=yes
|
KATEX=yes
|
||||||
UCX_COMMIT=${_UCX_COMMIT}
|
UCX_COMMIT=${_UCX_COMMIT}
|
||||||
UCC_COMMIT=${_UCC_COMMIT}
|
UCC_COMMIT=${_UCC_COMMIT}
|
||||||
PYTORCH_ROCM_ARCH="gfx90a;gfx942;gfx950;gfx1100"
|
PYTORCH_ROCM_ARCH="gfx90a;gfx942;gfx950"
|
||||||
if [[ $tag =~ "benchmarks" ]]; then
|
|
||||||
INDUCTOR_BENCHMARKS=yes
|
|
||||||
fi
|
|
||||||
;;
|
;;
|
||||||
pytorch-linux-jammy-xpu-n-1-py3)
|
pytorch-linux-jammy-xpu-n-1-py3)
|
||||||
ANACONDA_PYTHON_VERSION=3.10
|
ANACONDA_PYTHON_VERSION=3.10
|
||||||
@ -195,19 +205,17 @@ case "$tag" in
|
|||||||
NINJA_VERSION=1.9.0
|
NINJA_VERSION=1.9.0
|
||||||
TRITON=yes
|
TRITON=yes
|
||||||
;;
|
;;
|
||||||
pytorch-linux-jammy-xpu-n-py3 | pytorch-linux-jammy-xpu-n-py3-inductor-benchmarks)
|
pytorch-linux-jammy-xpu-n-py3)
|
||||||
ANACONDA_PYTHON_VERSION=3.10
|
ANACONDA_PYTHON_VERSION=3.10
|
||||||
GCC_VERSION=11
|
GCC_VERSION=11
|
||||||
VISION=yes
|
VISION=yes
|
||||||
XPU_VERSION=2025.2
|
XPU_VERSION=2025.2
|
||||||
NINJA_VERSION=1.9.0
|
NINJA_VERSION=1.9.0
|
||||||
TRITON=yes
|
TRITON=yes
|
||||||
if [[ $tag =~ "benchmarks" ]]; then
|
|
||||||
INDUCTOR_BENCHMARKS=yes
|
|
||||||
fi
|
|
||||||
;;
|
;;
|
||||||
pytorch-linux-jammy-py3-gcc11-inductor-benchmarks)
|
pytorch-linux-jammy-py3-gcc11-inductor-benchmarks)
|
||||||
ANACONDA_PYTHON_VERSION=3.10
|
# TODO (huydhn): Upgrade this to Python >= 3.10
|
||||||
|
ANACONDA_PYTHON_VERSION=3.9
|
||||||
GCC_VERSION=11
|
GCC_VERSION=11
|
||||||
VISION=yes
|
VISION=yes
|
||||||
KATEX=yes
|
KATEX=yes
|
||||||
@ -255,10 +263,13 @@ case "$tag" in
|
|||||||
TRITON_CPU=yes
|
TRITON_CPU=yes
|
||||||
;;
|
;;
|
||||||
pytorch-linux-jammy-linter)
|
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)
|
pytorch-linux-jammy-cuda12.8-cudnn9-py3.9-linter)
|
||||||
PYTHON_VERSION=3.10
|
PYTHON_VERSION=3.9
|
||||||
CUDA_VERSION=12.8.1
|
CUDA_VERSION=12.8.1
|
||||||
;;
|
;;
|
||||||
pytorch-linux-jammy-aarch64-py3.10-gcc11)
|
pytorch-linux-jammy-aarch64-py3.10-gcc11)
|
||||||
@ -348,7 +359,7 @@ docker build \
|
|||||||
--build-arg "NINJA_VERSION=${NINJA_VERSION:-}" \
|
--build-arg "NINJA_VERSION=${NINJA_VERSION:-}" \
|
||||||
--build-arg "KATEX=${KATEX:-}" \
|
--build-arg "KATEX=${KATEX:-}" \
|
||||||
--build-arg "ROCM_VERSION=${ROCM_VERSION:-}" \
|
--build-arg "ROCM_VERSION=${ROCM_VERSION:-}" \
|
||||||
--build-arg "PYTORCH_ROCM_ARCH=${PYTORCH_ROCM_ARCH}" \
|
--build-arg "PYTORCH_ROCM_ARCH=${PYTORCH_ROCM_ARCH:-gfx90a;gfx942}" \
|
||||||
--build-arg "IMAGE_NAME=${IMAGE_NAME}" \
|
--build-arg "IMAGE_NAME=${IMAGE_NAME}" \
|
||||||
--build-arg "UCX_COMMIT=${UCX_COMMIT}" \
|
--build-arg "UCX_COMMIT=${UCX_COMMIT}" \
|
||||||
--build-arg "UCC_COMMIT=${UCC_COMMIT}" \
|
--build-arg "UCC_COMMIT=${UCC_COMMIT}" \
|
||||||
@ -365,7 +376,6 @@ docker build \
|
|||||||
--build-arg "OPENBLAS=${OPENBLAS:-}" \
|
--build-arg "OPENBLAS=${OPENBLAS:-}" \
|
||||||
--build-arg "SKIP_SCCACHE_INSTALL=${SKIP_SCCACHE_INSTALL:-}" \
|
--build-arg "SKIP_SCCACHE_INSTALL=${SKIP_SCCACHE_INSTALL:-}" \
|
||||||
--build-arg "SKIP_LLVM_SRC_BUILD_INSTALL=${SKIP_LLVM_SRC_BUILD_INSTALL:-}" \
|
--build-arg "SKIP_LLVM_SRC_BUILD_INSTALL=${SKIP_LLVM_SRC_BUILD_INSTALL:-}" \
|
||||||
--build-arg "INSTALL_MINGW=${INSTALL_MINGW:-}" \
|
|
||||||
-f $(dirname ${DOCKERFILE})/Dockerfile \
|
-f $(dirname ${DOCKERFILE})/Dockerfile \
|
||||||
-t "$tmp_tag" \
|
-t "$tmp_tag" \
|
||||||
"$@" \
|
"$@" \
|
||||||
@ -446,3 +456,12 @@ elif [ "$HAS_TRITON" = "yes" ]; then
|
|||||||
echo "expecting triton to not be installed, but it is"
|
echo "expecting triton to not be installed, but it is"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Sanity check cmake version. Executorch reinstalls cmake and I'm not sure if
|
||||||
|
# they support 4.0.0 yet, so exclude them from this check.
|
||||||
|
CMAKE_VERSION=$(drun cmake --version)
|
||||||
|
if [[ "$EXECUTORCH" != *yes* && "$CMAKE_VERSION" != *4.* ]]; then
|
||||||
|
echo "CMake version is not 4.0.0:"
|
||||||
|
drun cmake --version
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|||||||
@ -56,13 +56,9 @@ ENV INSTALLED_VISION ${VISION}
|
|||||||
|
|
||||||
# Install rocm
|
# Install rocm
|
||||||
ARG ROCM_VERSION
|
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
|
COPY ./common/install_rocm.sh install_rocm.sh
|
||||||
RUN bash ./install_rocm.sh
|
RUN bash ./install_rocm.sh
|
||||||
RUN rm install_rocm.sh common_utils.sh
|
RUN rm install_rocm.sh
|
||||||
RUN rm -r ci_commit_pins
|
|
||||||
COPY ./common/install_rocm_magma.sh install_rocm_magma.sh
|
COPY ./common/install_rocm_magma.sh install_rocm_magma.sh
|
||||||
RUN bash ./install_rocm_magma.sh ${ROCM_VERSION}
|
RUN bash ./install_rocm_magma.sh ${ROCM_VERSION}
|
||||||
RUN rm install_rocm_magma.sh
|
RUN rm install_rocm_magma.sh
|
||||||
|
|||||||
@ -1 +1 @@
|
|||||||
deb42f2a8e48f5032b4a98ee781a15fa87a157cf
|
56392aa978594cc155fa8af48cd949f5b5f1823a
|
||||||
|
|||||||
@ -1,2 +1,2 @@
|
|||||||
transformers==4.56.0
|
transformers==4.54.0
|
||||||
soxr==0.5.0
|
soxr==0.5.0
|
||||||
|
|||||||
@ -1 +1 @@
|
|||||||
v2.27.5-1
|
v2.27.5-1
|
||||||
|
|||||||
@ -1 +0,0 @@
|
|||||||
7fe50dc3da2069d6645d9deb8c017a876472a977
|
|
||||||
@ -1 +1 @@
|
|||||||
7416ffcb92cdbe98d9f97e4e6f95247e46dfc9fd
|
fccfc522864cf8bc172abe0cd58ae5581e2d44b9
|
||||||
|
|||||||
27
.ci/docker/common/install_acl.sh
Executable file → Normal file
27
.ci/docker/common/install_acl.sh
Executable file → Normal file
@ -1,27 +1,16 @@
|
|||||||
#!/bin/bash
|
set -euo pipefail
|
||||||
# Script used only in CD pipeline
|
|
||||||
|
|
||||||
set -eux
|
readonly version=v25.02
|
||||||
|
readonly src_host=https://github.com/ARM-software
|
||||||
ACL_VERSION=${ACL_VERSION:-"v52.6.0"}
|
readonly src_repo=ComputeLibrary
|
||||||
ACL_INSTALL_DIR="/acl"
|
|
||||||
|
|
||||||
# Clone ACL
|
# Clone ACL
|
||||||
git clone https://github.com/ARM-software/ComputeLibrary.git -b "${ACL_VERSION}" --depth 1 --shallow-submodules
|
[[ ! -d ${src_repo} ]] && git clone ${src_host}/${src_repo}.git
|
||||||
|
cd ${src_repo}
|
||||||
|
|
||||||
|
git checkout $version
|
||||||
|
|
||||||
ACL_CHECKOUT_DIR="ComputeLibrary"
|
|
||||||
# Build with scons
|
# Build with scons
|
||||||
pushd $ACL_CHECKOUT_DIR
|
|
||||||
scons -j8 Werror=0 debug=0 neon=1 opencl=0 embed_kernels=0 \
|
scons -j8 Werror=0 debug=0 neon=1 opencl=0 embed_kernels=0 \
|
||||||
os=linux arch=armv8a build=native multi_isa=1 \
|
os=linux arch=armv8a build=native multi_isa=1 \
|
||||||
fixed_format_kernels=1 openmp=1 cppthreads=0
|
fixed_format_kernels=1 openmp=1 cppthreads=0
|
||||||
popd
|
|
||||||
|
|
||||||
# Install ACL
|
|
||||||
sudo mkdir -p ${ACL_INSTALL_DIR}
|
|
||||||
for d in arm_compute include utils support src build
|
|
||||||
do
|
|
||||||
sudo cp -r ${ACL_CHECKOUT_DIR}/${d} ${ACL_INSTALL_DIR}/${d}
|
|
||||||
done
|
|
||||||
|
|
||||||
rm -rf $ACL_CHECKOUT_DIR
|
|
||||||
@ -49,20 +49,12 @@ if [ -n "$ANACONDA_PYTHON_VERSION" ]; then
|
|||||||
export SYSROOT_DEP="sysroot_linux-64=2.17"
|
export SYSROOT_DEP="sysroot_linux-64=2.17"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Install correct Python version
|
|
||||||
# Also ensure sysroot is using a modern GLIBC to match system compilers
|
|
||||||
if [ "$ANACONDA_PYTHON_VERSION" = "3.14" ]; then
|
|
||||||
as_jenkins conda create -n py_$ANACONDA_PYTHON_VERSION -y\
|
|
||||||
python="3.14.0" \
|
|
||||||
${SYSROOT_DEP} \
|
|
||||||
-c conda-forge
|
|
||||||
else
|
|
||||||
# Install correct Python version
|
# Install correct Python version
|
||||||
# Also ensure sysroot is using a modern GLIBC to match system compilers
|
# Also ensure sysroot is using a modern GLIBC to match system compilers
|
||||||
as_jenkins conda create -n py_$ANACONDA_PYTHON_VERSION -y\
|
as_jenkins conda create -n py_$ANACONDA_PYTHON_VERSION -y\
|
||||||
python="$ANACONDA_PYTHON_VERSION" \
|
python="$ANACONDA_PYTHON_VERSION" \
|
||||||
${SYSROOT_DEP}
|
${SYSROOT_DEP}
|
||||||
fi
|
|
||||||
# libstdcxx from conda default channels are too old, we need GLIBCXX_3.4.30
|
# libstdcxx from conda default channels are too old, we need GLIBCXX_3.4.30
|
||||||
# which is provided in libstdcxx 12 and up.
|
# which is provided in libstdcxx 12 and up.
|
||||||
conda_install libstdcxx-ng=12.3.0 --update-deps -c conda-forge
|
conda_install libstdcxx-ng=12.3.0 --update-deps -c conda-forge
|
||||||
|
|||||||
@ -83,6 +83,10 @@ function build_cpython {
|
|||||||
py_suffix=${py_ver::-1}
|
py_suffix=${py_ver::-1}
|
||||||
py_folder=$py_suffix
|
py_folder=$py_suffix
|
||||||
fi
|
fi
|
||||||
|
# Update to rc2 due to https://github.com/python/cpython/commit/c72699086fe4
|
||||||
|
if [ "$py_suffix" == "3.14.0" ]; then
|
||||||
|
py_suffix="3.14.0rc2"
|
||||||
|
fi
|
||||||
wget -q $PYTHON_DOWNLOAD_URL/$py_folder/Python-$py_suffix.tgz -O Python-$py_ver.tgz
|
wget -q $PYTHON_DOWNLOAD_URL/$py_folder/Python-$py_suffix.tgz -O Python-$py_ver.tgz
|
||||||
do_cpython_build $py_ver Python-$py_suffix
|
do_cpython_build $py_ver Python-$py_suffix
|
||||||
|
|
||||||
|
|||||||
@ -10,7 +10,7 @@ else
|
|||||||
arch_path='sbsa'
|
arch_path='sbsa'
|
||||||
fi
|
fi
|
||||||
|
|
||||||
NVSHMEM_VERSION=3.4.5
|
NVSHMEM_VERSION=3.3.24
|
||||||
|
|
||||||
function install_cuda {
|
function install_cuda {
|
||||||
version=$1
|
version=$1
|
||||||
@ -150,7 +150,7 @@ function install_130 {
|
|||||||
CUDNN_VERSION=9.13.0.50
|
CUDNN_VERSION=9.13.0.50
|
||||||
echo "Installing CUDA 13.0 and cuDNN ${CUDNN_VERSION} and NVSHMEM and NCCL and cuSparseLt-0.7.1"
|
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 in the same container
|
||||||
install_cuda 13.0.2 cuda_13.0.2_580.95.05_linux
|
install_cuda 13.0.0 cuda_13.0.0_580.65.06_linux
|
||||||
|
|
||||||
# cuDNN license: https://developer.nvidia.com/cudnn/license_agreement
|
# cuDNN license: https://developer.nvidia.com/cudnn/license_agreement
|
||||||
install_cudnn 13 $CUDNN_VERSION
|
install_cudnn 13 $CUDNN_VERSION
|
||||||
|
|||||||
@ -42,27 +42,22 @@ install_pip_dependencies() {
|
|||||||
# A workaround, ExecuTorch has moved to numpy 2.0 which is not compatible with the current
|
# A workaround, ExecuTorch has moved to numpy 2.0 which is not compatible with the current
|
||||||
# numba and scipy version used in PyTorch CI
|
# numba and scipy version used in PyTorch CI
|
||||||
conda_run pip uninstall -y numba scipy
|
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
|
popd
|
||||||
}
|
}
|
||||||
|
|
||||||
setup_executorch() {
|
setup_executorch() {
|
||||||
|
pushd executorch
|
||||||
|
|
||||||
export PYTHON_EXECUTABLE=python
|
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
|
as_jenkins .ci/scripts/setup-linux.sh --build-tool cmake || true
|
||||||
|
popd
|
||||||
}
|
}
|
||||||
|
|
||||||
if [ $# -eq 0 ]; then
|
clone_executorch
|
||||||
clone_executorch
|
install_buck2
|
||||||
install_buck2
|
install_conda_dependencies
|
||||||
install_conda_dependencies
|
install_pip_dependencies
|
||||||
install_pip_dependencies
|
setup_executorch
|
||||||
pushd executorch
|
|
||||||
setup_executorch
|
|
||||||
popd
|
|
||||||
else
|
|
||||||
"$@"
|
|
||||||
fi
|
|
||||||
|
|||||||
@ -1,10 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
set -ex
|
|
||||||
|
|
||||||
# Install MinGW-w64 for Windows cross-compilation
|
|
||||||
apt-get update
|
|
||||||
apt-get install -y g++-mingw-w64-x86-64-posix
|
|
||||||
|
|
||||||
echo "MinGW-w64 installed successfully"
|
|
||||||
x86_64-w64-mingw32-g++ --version
|
|
||||||
@ -19,8 +19,8 @@ pip_install \
|
|||||||
transformers==4.36.2
|
transformers==4.36.2
|
||||||
|
|
||||||
pip_install coloredlogs packaging
|
pip_install coloredlogs packaging
|
||||||
pip_install onnxruntime==1.23.1
|
pip_install onnxruntime==1.22.1
|
||||||
pip_install onnxscript==0.5.4
|
pip_install onnxscript==0.4.0
|
||||||
|
|
||||||
# Cache the transformers model to be used later by ONNX tests. We need to run the transformers
|
# Cache the transformers model to be used later by ONNX tests. We need to run the transformers
|
||||||
# package to download the model. By default, the model is cached at ~/.cache/huggingface/hub/
|
# package to download the model. By default, the model is cached at ~/.cache/huggingface/hub/
|
||||||
|
|||||||
12
.ci/docker/common/install_openblas.sh
Executable file → Normal file
12
.ci/docker/common/install_openblas.sh
Executable file → Normal file
@ -3,10 +3,8 @@
|
|||||||
|
|
||||||
set -ex
|
set -ex
|
||||||
|
|
||||||
OPENBLAS_VERSION=${OPENBLAS_VERSION:-"v0.3.30"}
|
cd /
|
||||||
|
git clone https://github.com/OpenMathLib/OpenBLAS.git -b "${OPENBLAS_VERSION:-v0.3.30}" --depth 1 --shallow-submodules
|
||||||
# Clone OpenBLAS
|
|
||||||
git clone https://github.com/OpenMathLib/OpenBLAS.git -b "${OPENBLAS_VERSION}" --depth 1 --shallow-submodules
|
|
||||||
|
|
||||||
OPENBLAS_CHECKOUT_DIR="OpenBLAS"
|
OPENBLAS_CHECKOUT_DIR="OpenBLAS"
|
||||||
OPENBLAS_BUILD_FLAGS="
|
OPENBLAS_BUILD_FLAGS="
|
||||||
@ -19,7 +17,5 @@ CFLAGS=-O3
|
|||||||
BUILD_BFLOAT16=1
|
BUILD_BFLOAT16=1
|
||||||
"
|
"
|
||||||
|
|
||||||
make -j8 ${OPENBLAS_BUILD_FLAGS} -C $OPENBLAS_CHECKOUT_DIR
|
make -j8 ${OPENBLAS_BUILD_FLAGS} -C ${OPENBLAS_CHECKOUT_DIR}
|
||||||
sudo make install -C $OPENBLAS_CHECKOUT_DIR
|
make -j8 ${OPENBLAS_BUILD_FLAGS} install -C ${OPENBLAS_CHECKOUT_DIR}
|
||||||
|
|
||||||
rm -rf $OPENBLAS_CHECKOUT_DIR
|
|
||||||
|
|||||||
@ -2,11 +2,6 @@
|
|||||||
|
|
||||||
set -ex
|
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() {
|
ver() {
|
||||||
printf "%3d%03d%03d%03d" $(echo "$1" | tr '.' ' ');
|
printf "%3d%03d%03d%03d" $(echo "$1" | tr '.' ' ');
|
||||||
}
|
}
|
||||||
@ -40,7 +35,17 @@ EOF
|
|||||||
|
|
||||||
# Default url values
|
# Default url values
|
||||||
rocm_baseurl="http://repo.radeon.com/rocm/apt/${ROCM_VERSION}"
|
rocm_baseurl="http://repo.radeon.com/rocm/apt/${ROCM_VERSION}"
|
||||||
|
amdgpu_baseurl="https://repo.radeon.com/amdgpu/${ROCM_VERSION}/ubuntu"
|
||||||
|
|
||||||
|
# Special case for ROCM_VERSION == 7.0
|
||||||
|
if [[ $(ver "$ROCM_VERSION") -eq $(ver 7.0) ]]; then
|
||||||
|
rocm_baseurl="https://repo.radeon.com/rocm/apt/7.0_alpha2"
|
||||||
|
amdgpu_baseurl="https://repo.radeon.com/amdgpu/30.10_alpha2/ubuntu"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Add amdgpu repository
|
||||||
UBUNTU_VERSION_NAME=`cat /etc/os-release | grep UBUNTU_CODENAME | awk -F= '{print $2}'`
|
UBUNTU_VERSION_NAME=`cat /etc/os-release | grep UBUNTU_CODENAME | awk -F= '{print $2}'`
|
||||||
|
echo "deb [arch=amd64] ${amdgpu_baseurl} ${UBUNTU_VERSION_NAME} main" > /etc/apt/sources.list.d/amdgpu.list
|
||||||
|
|
||||||
# Add rocm repository
|
# Add rocm repository
|
||||||
wget -qO - http://repo.radeon.com/rocm/rocm.gpg.key | apt-key add -
|
wget -qO - http://repo.radeon.com/rocm/rocm.gpg.key | apt-key add -
|
||||||
@ -108,8 +113,6 @@ EOF
|
|||||||
rm -rf HIP clr
|
rm -rf HIP clr
|
||||||
fi
|
fi
|
||||||
|
|
||||||
pip_install "git+https://github.com/rocm/composable_kernel@$ROCM_COMPOSABLE_KERNEL_VERSION"
|
|
||||||
|
|
||||||
# Cleanup
|
# Cleanup
|
||||||
apt-get autoclean && apt-get clean
|
apt-get autoclean && apt-get clean
|
||||||
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
|
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
|
||||||
@ -173,8 +176,6 @@ install_centos() {
|
|||||||
sqlite3 $kdb "PRAGMA journal_mode=off; PRAGMA VACUUM;"
|
sqlite3 $kdb "PRAGMA journal_mode=off; PRAGMA VACUUM;"
|
||||||
done
|
done
|
||||||
|
|
||||||
pip_install "git+https://github.com/rocm/composable_kernel@$ROCM_COMPOSABLE_KERNEL_VERSION"
|
|
||||||
|
|
||||||
# Cleanup
|
# Cleanup
|
||||||
yum clean all
|
yum clean all
|
||||||
rm -rf /var/cache/yum
|
rm -rf /var/cache/yum
|
||||||
|
|||||||
@ -12,8 +12,8 @@ function do_install() {
|
|||||||
|
|
||||||
rocm_version_nodot=${rocm_version//./}
|
rocm_version_nodot=${rocm_version//./}
|
||||||
|
|
||||||
# post merge of https://github.com/icl-utk-edu/magma/pull/65
|
# Version 2.7.2 + ROCm related updates
|
||||||
MAGMA_VERSION=c0792ae825fb36872784892ea643dd6f3456bc5f
|
MAGMA_VERSION=a1625ff4d9bc362906bd01f805dbbe12612953f6
|
||||||
magma_archive="magma-rocm${rocm_version_nodot}-${MAGMA_VERSION}-1.tar.bz2"
|
magma_archive="magma-rocm${rocm_version_nodot}-${MAGMA_VERSION}-1.tar.bz2"
|
||||||
|
|
||||||
rocm_dir="/opt/rocm"
|
rocm_dir="/opt/rocm"
|
||||||
|
|||||||
@ -66,15 +66,15 @@ if [ -n "${UBUNTU_VERSION}" ] && [ -n "${GCC_VERSION}" ] && [[ "${GCC_VERSION}"
|
|||||||
# Triton needs at least gcc-9 to build
|
# Triton needs at least gcc-9 to build
|
||||||
apt-get install -y g++-9
|
apt-get install -y g++-9
|
||||||
|
|
||||||
CXX=g++-9 conda_run python -m build --wheel --no-isolation
|
CXX=g++-9 conda_run python setup.py bdist_wheel
|
||||||
elif [ -n "${UBUNTU_VERSION}" ] && [ -n "${CLANG_VERSION}" ]; then
|
elif [ -n "${UBUNTU_VERSION}" ] && [ -n "${CLANG_VERSION}" ]; then
|
||||||
# Triton needs <filesystem> which surprisingly is not available with clang-9 toolchain
|
# Triton needs <filesystem> which surprisingly is not available with clang-9 toolchain
|
||||||
add-apt-repository -y ppa:ubuntu-toolchain-r/test
|
add-apt-repository -y ppa:ubuntu-toolchain-r/test
|
||||||
apt-get install -y g++-9
|
apt-get install -y g++-9
|
||||||
|
|
||||||
CXX=g++-9 conda_run python -m build --wheel --no-isolation
|
CXX=g++-9 conda_run python setup.py bdist_wheel
|
||||||
else
|
else
|
||||||
conda_run python -m build --wheel --no-isolation
|
conda_run python setup.py bdist_wheel
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Copy the wheel to /opt for multi stage docker builds
|
# Copy the wheel to /opt for multi stage docker builds
|
||||||
|
|||||||
@ -1,9 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
set -xe
|
|
||||||
# Script used in Linux x86 and aarch64 CD pipeline
|
|
||||||
|
|
||||||
# Workaround for exposing statically linked libstdc++ CXX11 ABI symbols.
|
|
||||||
# see: https://github.com/pytorch/pytorch/issues/133437
|
|
||||||
LIBNONSHARED=$(gcc -print-file-name=libstdc++_nonshared.a)
|
|
||||||
nm -g $LIBNONSHARED | grep " T " | grep recursive_directory_iterator | cut -c 20- > weaken-symbols.txt
|
|
||||||
objcopy --weaken-symbols weaken-symbols.txt $LIBNONSHARED $LIBNONSHARED
|
|
||||||
@ -39,21 +39,13 @@ case ${DOCKER_TAG_PREFIX} in
|
|||||||
DOCKER_GPU_BUILD_ARG=""
|
DOCKER_GPU_BUILD_ARG=""
|
||||||
;;
|
;;
|
||||||
rocm*)
|
rocm*)
|
||||||
# we want the patch version of 7.0 instead
|
|
||||||
if [[ "$GPU_ARCH_VERSION" == *"7.0"* ]]; then
|
|
||||||
GPU_ARCH_VERSION="${GPU_ARCH_VERSION}.2"
|
|
||||||
fi
|
|
||||||
# we want the patch version of 6.4 instead
|
# we want the patch version of 6.4 instead
|
||||||
if [[ "$GPU_ARCH_VERSION" == *"6.4"* ]]; then
|
if [[ $(ver $GPU_ARCH_VERSION) -eq $(ver 6.4) ]]; then
|
||||||
GPU_ARCH_VERSION="${GPU_ARCH_VERSION}.4"
|
GPU_ARCH_VERSION="${GPU_ARCH_VERSION}.2"
|
||||||
fi
|
fi
|
||||||
BASE_TARGET=rocm
|
BASE_TARGET=rocm
|
||||||
GPU_IMAGE=rocm/dev-ubuntu-22.04:${GPU_ARCH_VERSION}-complete
|
GPU_IMAGE=rocm/dev-ubuntu-22.04:${GPU_ARCH_VERSION}-complete
|
||||||
PYTORCH_ROCM_ARCH="gfx900;gfx906;gfx908;gfx90a;gfx942;gfx1030;gfx1100;gfx1101;gfx1102;gfx1200;gfx1201"
|
PYTORCH_ROCM_ARCH="gfx900;gfx906;gfx908;gfx90a;gfx942;gfx1030;gfx1100;gfx1101;gfx1102;gfx1200;gfx1201"
|
||||||
# add gfx950, gfx115x conditionally starting in ROCm 7.0
|
|
||||||
if [[ "$GPU_ARCH_VERSION" == *"7.0"* ]]; then
|
|
||||||
PYTORCH_ROCM_ARCH="${PYTORCH_ROCM_ARCH};gfx950;gfx1150;gfx1151"
|
|
||||||
fi
|
|
||||||
DOCKER_GPU_BUILD_ARG="--build-arg PYTORCH_ROCM_ARCH=${PYTORCH_ROCM_ARCH} --build-arg ROCM_VERSION=${GPU_ARCH_VERSION}"
|
DOCKER_GPU_BUILD_ARG="--build-arg PYTORCH_ROCM_ARCH=${PYTORCH_ROCM_ARCH} --build-arg ROCM_VERSION=${GPU_ARCH_VERSION}"
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
|
|||||||
@ -130,8 +130,7 @@ ENV LD_LIBRARY_PATH=/opt/rh/gcc-toolset-${DEVTOOLSET_VERSION}/root/usr/lib64:/op
|
|||||||
RUN for cpython_version in "cp312-cp312" "cp313-cp313" "cp313-cp313t"; do \
|
RUN for cpython_version in "cp312-cp312" "cp313-cp313" "cp313-cp313t"; do \
|
||||||
/opt/python/${cpython_version}/bin/python -m pip install setuptools wheel; \
|
/opt/python/${cpython_version}/bin/python -m pip install setuptools wheel; \
|
||||||
done;
|
done;
|
||||||
ADD ./common/patch_libstdc.sh patch_libstdc.sh
|
|
||||||
RUN bash ./patch_libstdc.sh && rm patch_libstdc.sh
|
|
||||||
|
|
||||||
# cmake-3.18.4 from pip; force in case cmake3 already exists
|
# cmake-3.18.4 from pip; force in case cmake3 already exists
|
||||||
RUN yum install -y python3-pip && \
|
RUN yum install -y python3-pip && \
|
||||||
|
|||||||
@ -62,13 +62,6 @@ ARG OPENBLAS_VERSION
|
|||||||
ADD ./common/install_openblas.sh install_openblas.sh
|
ADD ./common/install_openblas.sh install_openblas.sh
|
||||||
RUN bash ./install_openblas.sh && rm install_openblas.sh
|
RUN bash ./install_openblas.sh && rm install_openblas.sh
|
||||||
|
|
||||||
# Install Arm Compute Library
|
|
||||||
FROM base as arm_compute
|
|
||||||
# use python3.9 to install scons
|
|
||||||
RUN python3.9 -m pip install scons==4.7.0
|
|
||||||
RUN ln -sf /opt/python/cp39-cp39/bin/scons /usr/local/bin
|
|
||||||
COPY ./common/install_acl.sh install_acl.sh
|
|
||||||
RUN bash ./install_acl.sh && rm install_acl.sh
|
|
||||||
FROM base as final
|
FROM base as final
|
||||||
|
|
||||||
# remove unnecessary python versions
|
# remove unnecessary python versions
|
||||||
@ -77,7 +70,4 @@ RUN rm -rf /opt/python/cp26-cp26mu /opt/_internal/cpython-2.6.9-ucs4
|
|||||||
RUN rm -rf /opt/python/cp33-cp33m /opt/_internal/cpython-3.3.6
|
RUN rm -rf /opt/python/cp33-cp33m /opt/_internal/cpython-3.3.6
|
||||||
RUN rm -rf /opt/python/cp34-cp34m /opt/_internal/cpython-3.4.6
|
RUN rm -rf /opt/python/cp34-cp34m /opt/_internal/cpython-3.4.6
|
||||||
COPY --from=openblas /opt/OpenBLAS/ /opt/OpenBLAS/
|
COPY --from=openblas /opt/OpenBLAS/ /opt/OpenBLAS/
|
||||||
COPY --from=arm_compute /acl /acl
|
ENV LD_LIBRARY_PATH=/opt/OpenBLAS/lib:$LD_LIBRARY_PATH
|
||||||
ENV LD_LIBRARY_PATH=/opt/OpenBLAS/lib:/acl/build/:$LD_LIBRARY_PATH
|
|
||||||
ADD ./common/patch_libstdc.sh patch_libstdc.sh
|
|
||||||
RUN bash ./patch_libstdc.sh && rm patch_libstdc.sh
|
|
||||||
|
|||||||
@ -86,15 +86,6 @@ FROM base as nvpl
|
|||||||
ADD ./common/install_nvpl.sh install_nvpl.sh
|
ADD ./common/install_nvpl.sh install_nvpl.sh
|
||||||
RUN bash ./install_nvpl.sh && rm install_nvpl.sh
|
RUN bash ./install_nvpl.sh && rm install_nvpl.sh
|
||||||
|
|
||||||
# Install Arm Compute Library
|
|
||||||
FROM base as arm_compute
|
|
||||||
# use python3.9 to install scons
|
|
||||||
RUN python3.9 -m pip install scons==4.7.0
|
|
||||||
RUN ln -sf /opt/python/cp39-cp39/bin/scons /usr/local/bin
|
|
||||||
COPY ./common/install_acl.sh install_acl.sh
|
|
||||||
RUN bash ./install_acl.sh && rm install_acl.sh
|
|
||||||
FROM base as final
|
|
||||||
|
|
||||||
FROM final as cuda_final
|
FROM final as cuda_final
|
||||||
ARG BASE_CUDA_VERSION
|
ARG BASE_CUDA_VERSION
|
||||||
RUN rm -rf /usr/local/cuda-${BASE_CUDA_VERSION}
|
RUN rm -rf /usr/local/cuda-${BASE_CUDA_VERSION}
|
||||||
@ -102,9 +93,5 @@ COPY --from=cuda /usr/local/cuda-${BASE_CUDA_VERSION} /usr/local/cuda-${BAS
|
|||||||
COPY --from=magma /usr/local/cuda-${BASE_CUDA_VERSION} /usr/local/cuda-${BASE_CUDA_VERSION}
|
COPY --from=magma /usr/local/cuda-${BASE_CUDA_VERSION} /usr/local/cuda-${BASE_CUDA_VERSION}
|
||||||
COPY --from=nvpl /opt/nvpl/lib/ /usr/local/lib/
|
COPY --from=nvpl /opt/nvpl/lib/ /usr/local/lib/
|
||||||
COPY --from=nvpl /opt/nvpl/include/ /usr/local/include/
|
COPY --from=nvpl /opt/nvpl/include/ /usr/local/include/
|
||||||
COPY --from=arm_compute /acl /acl
|
|
||||||
RUN ln -sf /usr/local/cuda-${BASE_CUDA_VERSION} /usr/local/cuda
|
RUN ln -sf /usr/local/cuda-${BASE_CUDA_VERSION} /usr/local/cuda
|
||||||
ENV PATH=/usr/local/cuda/bin:$PATH
|
ENV PATH=/usr/local/cuda/bin:$PATH
|
||||||
ENV LD_LIBRARY_PATH=/acl/build/:$LD_LIBRARY_PATH
|
|
||||||
ADD ./common/patch_libstdc.sh patch_libstdc.sh
|
|
||||||
RUN bash ./patch_libstdc.sh && rm patch_libstdc.sh
|
|
||||||
|
|||||||
71
.ci/docker/manywheel/Dockerfile_cxx11-abi
Normal file
71
.ci/docker/manywheel/Dockerfile_cxx11-abi
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
FROM centos:8 as base
|
||||||
|
|
||||||
|
ENV LC_ALL en_US.UTF-8
|
||||||
|
ENV LANG en_US.UTF-8
|
||||||
|
ENV LANGUAGE en_US.UTF-8
|
||||||
|
ENV PATH /opt/rh/gcc-toolset-11/root/bin/:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
|
||||||
|
|
||||||
|
# change to a valid repo
|
||||||
|
RUN sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-Linux-*.repo
|
||||||
|
# enable to install ninja-build
|
||||||
|
RUN sed -i 's|enabled=0|enabled=1|g' /etc/yum.repos.d/CentOS-Linux-PowerTools.repo
|
||||||
|
|
||||||
|
RUN yum -y update
|
||||||
|
RUN yum install -y wget curl perl util-linux xz bzip2 git patch which zlib-devel sudo
|
||||||
|
RUN yum install -y autoconf automake make cmake gdb gcc-toolset-11-gcc-c++
|
||||||
|
|
||||||
|
|
||||||
|
FROM base as openssl
|
||||||
|
ADD ./common/install_openssl.sh install_openssl.sh
|
||||||
|
RUN bash ./install_openssl.sh && rm install_openssl.sh
|
||||||
|
|
||||||
|
# Install python
|
||||||
|
FROM base as python
|
||||||
|
RUN yum install -y openssl-devel zlib-devel bzip2-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel libpcap-devel xz-devel libffi-devel
|
||||||
|
ADD common/install_cpython.sh install_cpython.sh
|
||||||
|
RUN bash ./install_cpython.sh && rm install_cpython.sh
|
||||||
|
|
||||||
|
FROM base as conda
|
||||||
|
ADD ./common/install_conda_docker.sh install_conda.sh
|
||||||
|
RUN bash ./install_conda.sh && rm install_conda.sh
|
||||||
|
RUN /opt/conda/bin/conda install -y cmake
|
||||||
|
|
||||||
|
FROM base as intel
|
||||||
|
# Install MKL
|
||||||
|
COPY --from=python /opt/python /opt/python
|
||||||
|
COPY --from=python /opt/_internal /opt/_internal
|
||||||
|
COPY --from=conda /opt/conda /opt/conda
|
||||||
|
ENV PATH=/opt/conda/bin:$PATH
|
||||||
|
ADD ./common/install_mkl.sh install_mkl.sh
|
||||||
|
RUN bash ./install_mkl.sh && rm install_mkl.sh
|
||||||
|
|
||||||
|
FROM base as patchelf
|
||||||
|
ADD ./common/install_patchelf.sh install_patchelf.sh
|
||||||
|
RUN bash ./install_patchelf.sh && rm install_patchelf.sh
|
||||||
|
RUN cp $(which patchelf) /patchelf
|
||||||
|
|
||||||
|
FROM base as jni
|
||||||
|
ADD ./common/install_jni.sh install_jni.sh
|
||||||
|
ADD ./java/jni.h jni.h
|
||||||
|
RUN bash ./install_jni.sh && rm install_jni.sh
|
||||||
|
|
||||||
|
FROM base as libpng
|
||||||
|
ADD ./common/install_libpng.sh install_libpng.sh
|
||||||
|
RUN bash ./install_libpng.sh && rm install_libpng.sh
|
||||||
|
|
||||||
|
FROM base as final
|
||||||
|
COPY --from=openssl /opt/openssl /opt/openssl
|
||||||
|
COPY --from=python /opt/python /opt/python
|
||||||
|
COPY --from=python /opt/_internal /opt/_internal
|
||||||
|
COPY --from=intel /opt/intel /opt/intel
|
||||||
|
COPY --from=conda /opt/conda /opt/conda
|
||||||
|
COPY --from=patchelf /usr/local/bin/patchelf /usr/local/bin/patchelf
|
||||||
|
COPY --from=jni /usr/local/include/jni.h /usr/local/include/jni.h
|
||||||
|
COPY --from=libpng /usr/local/bin/png* /usr/local/bin/
|
||||||
|
COPY --from=libpng /usr/local/bin/libpng* /usr/local/bin/
|
||||||
|
COPY --from=libpng /usr/local/include/png* /usr/local/include/
|
||||||
|
COPY --from=libpng /usr/local/include/libpng* /usr/local/include/
|
||||||
|
COPY --from=libpng /usr/local/lib/libpng* /usr/local/lib/
|
||||||
|
COPY --from=libpng /usr/local/lib/pkgconfig /usr/local/lib/pkgconfig
|
||||||
|
|
||||||
|
RUN yum install -y ninja-build
|
||||||
@ -115,9 +115,6 @@ RUN env GRPC_PYTHON_BUILD_SYSTEM_OPENSSL=True pip3 install grpcio
|
|||||||
# cmake-3.28.0 from pip for onnxruntime
|
# cmake-3.28.0 from pip for onnxruntime
|
||||||
RUN python3 -mpip install cmake==3.28.0
|
RUN python3 -mpip install cmake==3.28.0
|
||||||
|
|
||||||
ADD ./common/patch_libstdc.sh patch_libstdc.sh
|
|
||||||
RUN bash ./patch_libstdc.sh && rm patch_libstdc.sh
|
|
||||||
|
|
||||||
# build onnxruntime 1.21.0 from sources.
|
# build onnxruntime 1.21.0 from sources.
|
||||||
# it is not possible to build it from sources using pip,
|
# it is not possible to build it from sources using pip,
|
||||||
# so just build it from upstream repository.
|
# so just build it from upstream repository.
|
||||||
|
|||||||
@ -28,7 +28,6 @@ fi
|
|||||||
MANY_LINUX_VERSION=${MANY_LINUX_VERSION:-}
|
MANY_LINUX_VERSION=${MANY_LINUX_VERSION:-}
|
||||||
DOCKERFILE_SUFFIX=${DOCKERFILE_SUFFIX:-}
|
DOCKERFILE_SUFFIX=${DOCKERFILE_SUFFIX:-}
|
||||||
OPENBLAS_VERSION=${OPENBLAS_VERSION:-}
|
OPENBLAS_VERSION=${OPENBLAS_VERSION:-}
|
||||||
ACL_VERSION=${ACL_VERSION:-}
|
|
||||||
|
|
||||||
case ${image} in
|
case ${image} in
|
||||||
manylinux2_28-builder:cpu)
|
manylinux2_28-builder:cpu)
|
||||||
@ -42,6 +41,13 @@ case ${image} in
|
|||||||
GPU_IMAGE=arm64v8/almalinux:8
|
GPU_IMAGE=arm64v8/almalinux:8
|
||||||
DOCKER_GPU_BUILD_ARG=" --build-arg DEVTOOLSET_VERSION=13 --build-arg NINJA_VERSION=1.12.1"
|
DOCKER_GPU_BUILD_ARG=" --build-arg DEVTOOLSET_VERSION=13 --build-arg NINJA_VERSION=1.12.1"
|
||||||
MANY_LINUX_VERSION="2_28_aarch64"
|
MANY_LINUX_VERSION="2_28_aarch64"
|
||||||
|
OPENBLAS_VERSION="v0.3.30"
|
||||||
|
;;
|
||||||
|
manylinuxcxx11-abi-builder:cpu-cxx11-abi)
|
||||||
|
TARGET=final
|
||||||
|
GPU_IMAGE=""
|
||||||
|
DOCKER_GPU_BUILD_ARG=" --build-arg DEVTOOLSET_VERSION=9"
|
||||||
|
MANY_LINUX_VERSION="cxx11-abi"
|
||||||
;;
|
;;
|
||||||
manylinuxs390x-builder:cpu-s390x)
|
manylinuxs390x-builder:cpu-s390x)
|
||||||
TARGET=final
|
TARGET=final
|
||||||
@ -75,29 +81,21 @@ case ${image} in
|
|||||||
DOCKERFILE_SUFFIX="_cuda_aarch64"
|
DOCKERFILE_SUFFIX="_cuda_aarch64"
|
||||||
;;
|
;;
|
||||||
manylinux2_28-builder:rocm*)
|
manylinux2_28-builder:rocm*)
|
||||||
# we want the patch version of 7.0 instead
|
|
||||||
if [[ "$GPU_ARCH_VERSION" == *"7.0"* ]]; then
|
|
||||||
GPU_ARCH_VERSION="${GPU_ARCH_VERSION}.2"
|
|
||||||
fi
|
|
||||||
# we want the patch version of 6.4 instead
|
# we want the patch version of 6.4 instead
|
||||||
if [[ "$GPU_ARCH_VERSION" == *"6.4"* ]]; then
|
if [[ $(ver $GPU_ARCH_VERSION) -eq $(ver 6.4) ]]; then
|
||||||
GPU_ARCH_VERSION="${GPU_ARCH_VERSION}.4"
|
GPU_ARCH_VERSION="${GPU_ARCH_VERSION}.2"
|
||||||
fi
|
fi
|
||||||
TARGET=rocm_final
|
TARGET=rocm_final
|
||||||
MANY_LINUX_VERSION="2_28"
|
MANY_LINUX_VERSION="2_28"
|
||||||
DEVTOOLSET_VERSION="11"
|
DEVTOOLSET_VERSION="11"
|
||||||
GPU_IMAGE=rocm/dev-almalinux-8:${GPU_ARCH_VERSION}-complete
|
GPU_IMAGE=rocm/dev-almalinux-8:${GPU_ARCH_VERSION}-complete
|
||||||
PYTORCH_ROCM_ARCH="gfx900;gfx906;gfx908;gfx90a;gfx942;gfx1030;gfx1100;gfx1101;gfx1102;gfx1200;gfx1201"
|
PYTORCH_ROCM_ARCH="gfx900;gfx906;gfx908;gfx90a;gfx942;gfx1030;gfx1100;gfx1101;gfx1102;gfx1200;gfx1201"
|
||||||
# add gfx950, gfx115x conditionally starting in ROCm 7.0
|
|
||||||
if [[ "$GPU_ARCH_VERSION" == *"7.0"* ]]; then
|
|
||||||
PYTORCH_ROCM_ARCH="${PYTORCH_ROCM_ARCH};gfx950;gfx1150;gfx1151"
|
|
||||||
fi
|
|
||||||
DOCKER_GPU_BUILD_ARG="--build-arg ROCM_VERSION=${GPU_ARCH_VERSION} --build-arg PYTORCH_ROCM_ARCH=${PYTORCH_ROCM_ARCH} --build-arg DEVTOOLSET_VERSION=${DEVTOOLSET_VERSION}"
|
DOCKER_GPU_BUILD_ARG="--build-arg ROCM_VERSION=${GPU_ARCH_VERSION} --build-arg PYTORCH_ROCM_ARCH=${PYTORCH_ROCM_ARCH} --build-arg DEVTOOLSET_VERSION=${DEVTOOLSET_VERSION}"
|
||||||
;;
|
;;
|
||||||
manylinux2_28-builder:xpu)
|
manylinux2_28-builder:xpu)
|
||||||
TARGET=xpu_final
|
TARGET=xpu_final
|
||||||
GPU_IMAGE=amd64/almalinux:8
|
GPU_IMAGE=amd64/almalinux:8
|
||||||
DOCKER_GPU_BUILD_ARG=" --build-arg DEVTOOLSET_VERSION=13"
|
DOCKER_GPU_BUILD_ARG=" --build-arg DEVTOOLSET_VERSION=11"
|
||||||
MANY_LINUX_VERSION="2_28"
|
MANY_LINUX_VERSION="2_28"
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
@ -123,8 +121,7 @@ tmp_tag=$(basename "$(mktemp -u)" | tr '[:upper:]' '[:lower:]')
|
|||||||
DOCKER_BUILDKIT=1 docker build \
|
DOCKER_BUILDKIT=1 docker build \
|
||||||
${DOCKER_GPU_BUILD_ARG} \
|
${DOCKER_GPU_BUILD_ARG} \
|
||||||
--build-arg "GPU_IMAGE=${GPU_IMAGE}" \
|
--build-arg "GPU_IMAGE=${GPU_IMAGE}" \
|
||||||
--build-arg "OPENBLAS_VERSION=${OPENBLAS_VERSION:-}" \
|
--build-arg "OPENBLAS_VERSION=${OPENBLAS_VERSION}" \
|
||||||
--build-arg "ACL_VERSION=${ACL_VERSION:-}" \
|
|
||||||
--target "${TARGET}" \
|
--target "${TARGET}" \
|
||||||
-t "${tmp_tag}" \
|
-t "${tmp_tag}" \
|
||||||
$@ \
|
$@ \
|
||||||
|
|||||||
@ -10,6 +10,11 @@ BAD_SSL = "https://self-signed.badssl.com"
|
|||||||
|
|
||||||
print("Testing SSL certificate checking for Python:", sys.version)
|
print("Testing SSL certificate checking for Python:", sys.version)
|
||||||
|
|
||||||
|
if sys.version_info[:2] < (2, 7) or sys.version_info[:2] < (3, 4):
|
||||||
|
print("This version never checks SSL certs; skipping tests")
|
||||||
|
sys.exit(0)
|
||||||
|
|
||||||
|
|
||||||
EXC = OSError
|
EXC = OSError
|
||||||
|
|
||||||
print(f"Connecting to {GOOD_SSL} should work")
|
print(f"Connecting to {GOOD_SSL} should work")
|
||||||
|
|||||||
@ -10,11 +10,6 @@ boto3==1.35.42
|
|||||||
#Pinned versions: 1.19.12, 1.16.34
|
#Pinned versions: 1.19.12, 1.16.34
|
||||||
#test that import:
|
#test that import:
|
||||||
|
|
||||||
build==1.3.0
|
|
||||||
#Description: A simple, correct Python build frontend.
|
|
||||||
#Pinned versions: 1.3.0
|
|
||||||
#test that import:
|
|
||||||
|
|
||||||
click
|
click
|
||||||
#Description: Command Line Interface Creation Kit
|
#Description: Command Line Interface Creation Kit
|
||||||
#Pinned versions:
|
#Pinned versions:
|
||||||
@ -52,10 +47,10 @@ flatbuffers==24.12.23
|
|||||||
#Pinned versions: 24.12.23
|
#Pinned versions: 24.12.23
|
||||||
#test that import:
|
#test that import:
|
||||||
|
|
||||||
hypothesis==6.56.4
|
hypothesis==5.35.1
|
||||||
# Pin hypothesis to avoid flakiness: https://github.com/pytorch/pytorch/issues/31136
|
# Pin hypothesis to avoid flakiness: https://github.com/pytorch/pytorch/issues/31136
|
||||||
#Description: advanced library for generating parametrized tests
|
#Description: advanced library for generating parametrized tests
|
||||||
#Pinned versions: 6.56.4
|
#Pinned versions: 5.35.1
|
||||||
#test that import: test_xnnpack_integration.py, test_pruning_op.py, test_nn.py
|
#test that import: test_xnnpack_integration.py, test_pruning_op.py, test_nn.py
|
||||||
|
|
||||||
junitparser==2.1.1
|
junitparser==2.1.1
|
||||||
@ -98,9 +93,8 @@ librosa==0.10.2 ; python_version == "3.12" and platform_machine != "s390x"
|
|||||||
#Pinned versions:
|
#Pinned versions:
|
||||||
#test that import:
|
#test that import:
|
||||||
|
|
||||||
mypy==1.16.0 ; platform_system == "Linux"
|
mypy==1.16.0
|
||||||
# Pin MyPy version because new errors are likely to appear with each release
|
# 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
|
#Description: linter
|
||||||
#Pinned versions: 1.16.0
|
#Pinned versions: 1.16.0
|
||||||
#test that import: test_typing.py, test_type_hints.py
|
#test that import: test_typing.py, test_type_hints.py
|
||||||
@ -111,17 +105,20 @@ networkx==2.8.8
|
|||||||
#Pinned versions: 2.8.8
|
#Pinned versions: 2.8.8
|
||||||
#test that import: functorch
|
#test that import: functorch
|
||||||
|
|
||||||
ninja==1.11.1.4
|
ninja==1.11.1.3
|
||||||
#Description: build system. Used in some tests. Used in build to generate build
|
#Description: build system. Used in some tests. Used in build to generate build
|
||||||
#time tracing information
|
#time tracing information
|
||||||
#Pinned versions: 1.11.1.4
|
#Pinned versions: 1.11.1.3
|
||||||
#test that import: run_test.py, test_cpp_extensions_aot.py,test_determination.py
|
#test that import: run_test.py, test_cpp_extensions_aot.py,test_determination.py
|
||||||
|
|
||||||
|
numba==0.49.0 ; python_version < "3.9" and platform_machine != "s390x"
|
||||||
|
numba==0.55.2 ; python_version == "3.9" and platform_machine != "s390x"
|
||||||
numba==0.55.2 ; python_version == "3.10" and platform_machine != "s390x"
|
numba==0.55.2 ; python_version == "3.10" and platform_machine != "s390x"
|
||||||
numba==0.60.0 ; python_version == "3.12" and platform_machine != "s390x"
|
numba==0.60.0 ; python_version == "3.12" and platform_machine != "s390x"
|
||||||
#Description: Just-In-Time Compiler for Numerical Functions
|
#Description: Just-In-Time Compiler for Numerical Functions
|
||||||
#Pinned versions: 0.55.2, 0.60.0
|
#Pinned versions: 0.54.1, 0.49.0, <=0.49.1
|
||||||
#test that import: test_numba_integration.py
|
#test that import: test_numba_integration.py
|
||||||
|
#For numba issue see https://github.com/pytorch/pytorch/issues/51511
|
||||||
#Need release > 0.61.2 for s390x due to https://github.com/numba/numba/pull/10073
|
#Need release > 0.61.2 for s390x due to https://github.com/numba/numba/pull/10073
|
||||||
|
|
||||||
#numpy
|
#numpy
|
||||||
@ -136,14 +133,12 @@ numba==0.60.0 ; python_version == "3.12" and platform_machine != "s390x"
|
|||||||
#test_nn.py, test_namedtensor.py, test_linalg.py, test_jit_cuda_fuser.py,
|
#test_nn.py, test_namedtensor.py, test_linalg.py, test_jit_cuda_fuser.py,
|
||||||
#test_jit.py, test_indexing.py, test_datapipe.py, test_dataloader.py,
|
#test_jit.py, test_indexing.py, test_datapipe.py, test_dataloader.py,
|
||||||
#test_binary_ufuncs.py
|
#test_binary_ufuncs.py
|
||||||
numpy==1.22.4; python_version == "3.10"
|
numpy==1.22.4; python_version == "3.9" or python_version == "3.10"
|
||||||
numpy==1.26.2; python_version == "3.11" or python_version == "3.12"
|
numpy==1.26.2; python_version == "3.11" or python_version == "3.12"
|
||||||
numpy==2.1.2; python_version >= "3.13" and python_version < "3.14"
|
numpy==2.1.2; python_version >= "3.13"
|
||||||
numpy==2.3.4; python_version >= "3.14"
|
|
||||||
|
|
||||||
pandas==2.0.3; python_version < "3.13"
|
pandas==2.0.3; python_version < "3.13"
|
||||||
pandas==2.2.3; python_version >= "3.13" and python_version < "3.14"
|
pandas==2.2.3; python_version >= "3.13"
|
||||||
pandas==2.3.3; python_version >= "3.14"
|
|
||||||
|
|
||||||
#onnxruntime
|
#onnxruntime
|
||||||
#Description: scoring engine for Open Neural Network Exchange (ONNX) models
|
#Description: scoring engine for Open Neural Network Exchange (ONNX) models
|
||||||
@ -155,8 +150,7 @@ opt-einsum==3.3
|
|||||||
#Pinned versions: 3.3
|
#Pinned versions: 3.3
|
||||||
#test that import: test_linalg.py
|
#test that import: test_linalg.py
|
||||||
|
|
||||||
optree==0.13.0 ; python_version < "3.14"
|
optree==0.13.0
|
||||||
optree==0.17.0 ; python_version >= "3.14"
|
|
||||||
#Description: A library for tree manipulation
|
#Description: A library for tree manipulation
|
||||||
#Pinned versions: 0.13.0
|
#Pinned versions: 0.13.0
|
||||||
#test that import: test_vmap.py, test_aotdispatch.py, test_dynamic_shapes.py,
|
#test that import: test_vmap.py, test_aotdispatch.py, test_dynamic_shapes.py,
|
||||||
@ -171,12 +165,12 @@ optree==0.17.0 ; python_version >= "3.14"
|
|||||||
|
|
||||||
pillow==11.0.0
|
pillow==11.0.0
|
||||||
#Description: Python Imaging Library fork
|
#Description: Python Imaging Library fork
|
||||||
#Pinned versions: 11.0.0
|
#Pinned versions: 10.3.0
|
||||||
#test that import:
|
#test that import:
|
||||||
|
|
||||||
protobuf==5.29.5
|
protobuf==5.29.4
|
||||||
#Description: Google's data interchange format
|
#Description: Google's data interchange format
|
||||||
#Pinned versions: 5.29.5
|
#Pinned versions: 5.29.4
|
||||||
#test that import: test_tensorboard.py, test/onnx/*
|
#test that import: test_tensorboard.py, test/onnx/*
|
||||||
|
|
||||||
psutil
|
psutil
|
||||||
@ -219,7 +213,7 @@ pytest-subtests==0.13.1
|
|||||||
#Pinned versions:
|
#Pinned versions:
|
||||||
#test that import:
|
#test that import:
|
||||||
|
|
||||||
xdoctest==1.3.0
|
xdoctest==1.1.0
|
||||||
#Description: runs doctests in pytest
|
#Description: runs doctests in pytest
|
||||||
#Pinned versions: 1.1.0
|
#Pinned versions: 1.1.0
|
||||||
#test that import:
|
#test that import:
|
||||||
@ -244,9 +238,10 @@ pygments==2.15.0
|
|||||||
#Pinned versions: 14.1.0
|
#Pinned versions: 14.1.0
|
||||||
#test that import:
|
#test that import:
|
||||||
|
|
||||||
scikit-image==0.22.0
|
scikit-image==0.19.3 ; python_version < "3.10"
|
||||||
|
scikit-image==0.22.0 ; python_version >= "3.10"
|
||||||
#Description: image processing routines
|
#Description: image processing routines
|
||||||
#Pinned versions: 0.22.0
|
#Pinned versions:
|
||||||
#test that import: test_nn.py
|
#test that import: test_nn.py
|
||||||
|
|
||||||
#scikit-learn
|
#scikit-learn
|
||||||
@ -255,8 +250,7 @@ scikit-image==0.22.0
|
|||||||
#test that import:
|
#test that import:
|
||||||
|
|
||||||
scipy==1.10.1 ; python_version <= "3.11"
|
scipy==1.10.1 ; python_version <= "3.11"
|
||||||
scipy==1.14.1 ; python_version > "3.11" and python_version < "3.14"
|
scipy==1.14.1 ; python_version >= "3.12"
|
||||||
scipy==1.16.2 ; python_version >= "3.14"
|
|
||||||
# Pin SciPy because of failing distribution tests (see #60347)
|
# Pin SciPy because of failing distribution tests (see #60347)
|
||||||
#Description: scientific python
|
#Description: scientific python
|
||||||
#Pinned versions: 1.10.1
|
#Pinned versions: 1.10.1
|
||||||
@ -270,7 +264,7 @@ scipy==1.16.2 ; python_version >= "3.14"
|
|||||||
#test that import:
|
#test that import:
|
||||||
|
|
||||||
# needed by torchgen utils
|
# needed by torchgen utils
|
||||||
typing-extensions==4.12.2
|
typing-extensions>=4.10.0
|
||||||
#Description: type hints for python
|
#Description: type hints for python
|
||||||
#Pinned versions:
|
#Pinned versions:
|
||||||
#test that import:
|
#test that import:
|
||||||
@ -328,10 +322,11 @@ pywavelets==1.7.0 ; python_version >= "3.12"
|
|||||||
#Pinned versions: 1.4.1
|
#Pinned versions: 1.4.1
|
||||||
#test that import:
|
#test that import:
|
||||||
|
|
||||||
lxml==5.3.0 ; python_version < "3.14"
|
lxml==5.3.0
|
||||||
lxml==6.0.2 ; python_version >= "3.14"
|
|
||||||
#Description: This is a requirement of unittest-xml-reporting
|
#Description: This is a requirement of unittest-xml-reporting
|
||||||
|
|
||||||
|
# Python-3.9 binaries
|
||||||
|
|
||||||
PyGithub==2.3.0
|
PyGithub==2.3.0
|
||||||
|
|
||||||
sympy==1.13.3
|
sympy==1.13.3
|
||||||
@ -339,14 +334,12 @@ sympy==1.13.3
|
|||||||
#Pinned versions:
|
#Pinned versions:
|
||||||
#test that import:
|
#test that import:
|
||||||
|
|
||||||
onnx==1.19.1 ; python_version < "3.14"
|
onnx==1.18.0
|
||||||
# Unpin once Python 3.14 is supported. See onnxruntime issue 26309.
|
|
||||||
onnx==1.18.0 ; python_version == "3.14"
|
|
||||||
#Description: Required by onnx tests, and mypy and test_public_bindings.py when checking torch.onnx._internal
|
#Description: Required by onnx tests, and mypy and test_public_bindings.py when checking torch.onnx._internal
|
||||||
#Pinned versions:
|
#Pinned versions:
|
||||||
#test that import:
|
#test that import:
|
||||||
|
|
||||||
onnxscript==0.5.4
|
onnxscript==0.4.0
|
||||||
#Description: Required by mypy and test_public_bindings.py when checking torch.onnx._internal
|
#Description: Required by mypy and test_public_bindings.py when checking torch.onnx._internal
|
||||||
#Pinned versions:
|
#Pinned versions:
|
||||||
#test that import:
|
#test that import:
|
||||||
@ -366,10 +359,9 @@ pwlf==2.2.1
|
|||||||
#test that import: test_sac_estimator.py
|
#test that import: test_sac_estimator.py
|
||||||
|
|
||||||
# To build PyTorch itself
|
# To build PyTorch itself
|
||||||
pyyaml==6.0.3
|
pyyaml
|
||||||
pyzstd
|
pyzstd
|
||||||
setuptools==78.1.1
|
setuptools>=70.1.0
|
||||||
packaging==23.1
|
|
||||||
six
|
six
|
||||||
|
|
||||||
scons==4.5.2 ; platform_machine == "aarch64"
|
scons==4.5.2 ; platform_machine == "aarch64"
|
||||||
@ -384,16 +376,13 @@ dataclasses_json==0.6.7
|
|||||||
#Pinned versions: 0.6.7
|
#Pinned versions: 0.6.7
|
||||||
#test that import:
|
#test that import:
|
||||||
|
|
||||||
cmake==3.31.6
|
cmake==4.0.0
|
||||||
#Description: required for building
|
#Description: required for building
|
||||||
|
|
||||||
tlparse==0.4.0
|
tlparse==0.4.0
|
||||||
#Description: required for log parsing
|
#Description: required for log parsing
|
||||||
|
|
||||||
filelock==3.18.0
|
cuda-bindings>=12.0,<13.0 ; platform_machine != "s390x"
|
||||||
#Description: required for inductor testing
|
|
||||||
|
|
||||||
cuda-bindings>=12.0,<13.0 ; platform_machine != "s390x" and platform_system != "Darwin"
|
|
||||||
#Description: required for testing CUDAGraph::raw_cuda_graph(). See https://nvidia.github.io/cuda-python/cuda-bindings/latest/support.html for how this version was chosen. Note "Any fix in the latest bindings would be backported to the prior major version" means that only the newest version of cuda-bindings will get fixes. Depending on the latest version of 12.x is okay because all 12.y versions will be supported via "CUDA minor version compatibility". Pytorch builds against 13.z versions of cuda toolkit work with 12.x versions of cuda-bindings as well because newer drivers work with old toolkits.
|
#Description: required for testing CUDAGraph::raw_cuda_graph(). See https://nvidia.github.io/cuda-python/cuda-bindings/latest/support.html for how this version was chosen. Note "Any fix in the latest bindings would be backported to the prior major version" means that only the newest version of cuda-bindings will get fixes. Depending on the latest version of 12.x is okay because all 12.y versions will be supported via "CUDA minor version compatibility". Pytorch builds against 13.z versions of cuda toolkit work with 12.x versions of cuda-bindings as well because newer drivers work with old toolkits.
|
||||||
#test that import: test_cuda.py
|
#test that import: test_cuda.py
|
||||||
|
|
||||||
|
|||||||
@ -1,15 +1,8 @@
|
|||||||
sphinx==5.3.0
|
sphinx==5.3.0
|
||||||
#Description: This is used to generate PyTorch docs
|
#Description: This is used to generate PyTorch docs
|
||||||
#Pinned versions: 5.3.0
|
#Pinned versions: 5.3.0
|
||||||
|
-e git+https://github.com/pytorch/pytorch_sphinx_theme.git@1657ad2fc1acdc98aa719eebecbb0128a7c13ce4#egg=pytorch_sphinx_theme2
|
||||||
|
|
||||||
standard-imghdr==3.13.0; python_version >= "3.13"
|
|
||||||
#Description: This is needed by Sphinx, so it needs to be added here.
|
|
||||||
# The reasons are as follows:
|
|
||||||
# 1) This module has been removed from the Python standard library since Python 3.13(https://peps.python.org/pep-0594/#imghdr);
|
|
||||||
# 2) The current version of Sphinx (5.3.0) is not compatible with Python 3.13.
|
|
||||||
# Once Sphinx is upgraded to a version compatible with Python 3.13 or later, we can remove this dependency.
|
|
||||||
|
|
||||||
-e git+https://github.com/pytorch/pytorch_sphinx_theme.git@71e55749be14ceb56e7f8211a9fb649866b87ad4#egg=pytorch_sphinx_theme2
|
|
||||||
# TODO: sphinxcontrib.katex 0.9.0 adds a local KaTeX server to speed up pre-rendering
|
# 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
|
# but it doesn't seem to work and hangs around idly. The initial thought that it is probably
|
||||||
# something related to Docker setup. We can investigate this later.
|
# something related to Docker setup. We can investigate this later.
|
||||||
|
|||||||
@ -52,13 +52,9 @@ ENV INSTALLED_VISION ${VISION}
|
|||||||
|
|
||||||
# Install rocm
|
# Install rocm
|
||||||
ARG ROCM_VERSION
|
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
|
COPY ./common/install_rocm.sh install_rocm.sh
|
||||||
RUN bash ./install_rocm.sh
|
RUN bash ./install_rocm.sh
|
||||||
RUN rm install_rocm.sh common_utils.sh
|
RUN rm install_rocm.sh
|
||||||
RUN rm -r ci_commit_pins
|
|
||||||
COPY ./common/install_rocm_magma.sh install_rocm_magma.sh
|
COPY ./common/install_rocm_magma.sh install_rocm_magma.sh
|
||||||
RUN bash ./install_rocm_magma.sh ${ROCM_VERSION}
|
RUN bash ./install_rocm_magma.sh ${ROCM_VERSION}
|
||||||
RUN rm install_rocm_magma.sh
|
RUN rm install_rocm_magma.sh
|
||||||
|
|||||||
@ -54,15 +54,12 @@ ENV OPENSSL_DIR /opt/openssl
|
|||||||
RUN rm install_openssl.sh
|
RUN rm install_openssl.sh
|
||||||
|
|
||||||
ARG INDUCTOR_BENCHMARKS
|
ARG INDUCTOR_BENCHMARKS
|
||||||
ARG ANACONDA_PYTHON_VERSION
|
|
||||||
ENV ANACONDA_PYTHON_VERSION=$ANACONDA_PYTHON_VERSION
|
|
||||||
COPY ./common/install_inductor_benchmark_deps.sh install_inductor_benchmark_deps.sh
|
COPY ./common/install_inductor_benchmark_deps.sh install_inductor_benchmark_deps.sh
|
||||||
COPY ./common/common_utils.sh common_utils.sh
|
COPY ./common/common_utils.sh common_utils.sh
|
||||||
COPY ci_commit_pins/huggingface-requirements.txt huggingface-requirements.txt
|
COPY ci_commit_pins/huggingface-requirements.txt huggingface-requirements.txt
|
||||||
COPY ci_commit_pins/timm.txt timm.txt
|
COPY ci_commit_pins/timm.txt timm.txt
|
||||||
COPY ci_commit_pins/torchbench.txt torchbench.txt
|
|
||||||
RUN if [ -n "${INDUCTOR_BENCHMARKS}" ]; then bash ./install_inductor_benchmark_deps.sh; fi
|
RUN if [ -n "${INDUCTOR_BENCHMARKS}" ]; then bash ./install_inductor_benchmark_deps.sh; fi
|
||||||
RUN rm install_inductor_benchmark_deps.sh common_utils.sh timm.txt huggingface-requirements.txt torchbench.txt
|
RUN rm install_inductor_benchmark_deps.sh common_utils.sh timm.txt huggingface-requirements.txt
|
||||||
|
|
||||||
# Install XPU Dependencies
|
# Install XPU Dependencies
|
||||||
ARG XPU_VERSION
|
ARG XPU_VERSION
|
||||||
|
|||||||
@ -100,16 +100,9 @@ COPY ./common/common_utils.sh common_utils.sh
|
|||||||
COPY ci_commit_pins/huggingface-requirements.txt huggingface-requirements.txt
|
COPY ci_commit_pins/huggingface-requirements.txt huggingface-requirements.txt
|
||||||
COPY ci_commit_pins/timm.txt timm.txt
|
COPY ci_commit_pins/timm.txt timm.txt
|
||||||
COPY ci_commit_pins/torchbench.txt torchbench.txt
|
COPY ci_commit_pins/torchbench.txt torchbench.txt
|
||||||
# Only build aoti cpp tests when INDUCTOR_BENCHMARKS is set to True
|
|
||||||
ENV BUILD_AOT_INDUCTOR_TEST ${INDUCTOR_BENCHMARKS}
|
|
||||||
RUN if [ -n "${INDUCTOR_BENCHMARKS}" ]; then bash ./install_inductor_benchmark_deps.sh; fi
|
RUN if [ -n "${INDUCTOR_BENCHMARKS}" ]; then bash ./install_inductor_benchmark_deps.sh; fi
|
||||||
RUN rm install_inductor_benchmark_deps.sh common_utils.sh timm.txt huggingface-requirements.txt torchbench.txt
|
RUN rm install_inductor_benchmark_deps.sh common_utils.sh timm.txt huggingface-requirements.txt torchbench.txt
|
||||||
|
|
||||||
ARG INSTALL_MINGW
|
|
||||||
COPY ./common/install_mingw.sh install_mingw.sh
|
|
||||||
RUN if [ -n "${INSTALL_MINGW}" ]; then bash ./install_mingw.sh; fi
|
|
||||||
RUN rm install_mingw.sh
|
|
||||||
|
|
||||||
ARG TRITON
|
ARG TRITON
|
||||||
ARG TRITON_CPU
|
ARG TRITON_CPU
|
||||||
|
|
||||||
|
|||||||
@ -7,4 +7,4 @@ set -ex
|
|||||||
|
|
||||||
SCRIPTPATH="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
|
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
|
||||||
|
|||||||
@ -57,8 +57,8 @@ def clone_external_repo(target: str, repo: str, dst: str = "", update_submodules
|
|||||||
logger.info("Successfully cloned %s", target)
|
logger.info("Successfully cloned %s", target)
|
||||||
return r, commit
|
return r, commit
|
||||||
|
|
||||||
except GitCommandError:
|
except GitCommandError as e:
|
||||||
logger.exception("Git operation failed")
|
logger.error("Git operation failed: %s", e)
|
||||||
raise
|
raise
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -41,6 +41,7 @@ def sample_vllm_test_library():
|
|||||||
"pytest -v -s basic_correctness/test_cumem.py",
|
"pytest -v -s basic_correctness/test_cumem.py",
|
||||||
"pytest -v -s basic_correctness/test_basic_correctness.py",
|
"pytest -v -s basic_correctness/test_basic_correctness.py",
|
||||||
"pytest -v -s basic_correctness/test_cpu_offload.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": {
|
"vllm_basic_models_test": {
|
||||||
@ -67,12 +68,15 @@ def sample_vllm_test_library():
|
|||||||
"-v",
|
"-v",
|
||||||
"-s",
|
"-s",
|
||||||
"entrypoints/llm",
|
"entrypoints/llm",
|
||||||
|
"--ignore=entrypoints/llm/test_lazy_outlines.py",
|
||||||
"--ignore=entrypoints/llm/test_generate.py",
|
"--ignore=entrypoints/llm/test_generate.py",
|
||||||
|
"--ignore=entrypoints/llm/test_generate_multiple_loras.py",
|
||||||
"--ignore=entrypoints/llm/test_collective_rpc.py",
|
"--ignore=entrypoints/llm/test_collective_rpc.py",
|
||||||
]
|
]
|
||||||
),
|
),
|
||||||
"pytest -v -s entrypoints/llm/test_generate.py",
|
"pytest -v -s entrypoints/llm/test_lazy_outlines.py",
|
||||||
"pytest -v -s entrypoints/offline_mode",
|
"pytest -v -s entrypoints/llm/test_generate.py ",
|
||||||
|
"VLLM_USE_V1=0 pytest -v -s entrypoints/offline_mode",
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
"vllm_regression_test": {
|
"vllm_regression_test": {
|
||||||
@ -143,7 +147,7 @@ def sample_vllm_test_library():
|
|||||||
"pytest -v -s compile/test_decorator.py",
|
"pytest -v -s compile/test_decorator.py",
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
"vllm_language_model_test_extended_generation_28_failure_test": {
|
"vllm_languagde_model_test_extended_generation_28_failure_test": {
|
||||||
"title": "Language Models Test (Extended Generation) 2.8 release failure",
|
"title": "Language Models Test (Extended Generation) 2.8 release failure",
|
||||||
"id": "vllm_languagde_model_test_extended_generation_28_failure_test",
|
"id": "vllm_languagde_model_test_extended_generation_28_failure_test",
|
||||||
"package_install": [
|
"package_install": [
|
||||||
|
|||||||
@ -63,12 +63,7 @@ class VllmBuildParameters:
|
|||||||
# DOCKERFILE_PATH: path to Dockerfile used when use_local_dockerfile is True"
|
# DOCKERFILE_PATH: path to Dockerfile used when use_local_dockerfile is True"
|
||||||
use_local_dockerfile: bool = env_bool_field("USE_LOCAL_DOCKERFILE", True)
|
use_local_dockerfile: bool = env_bool_field("USE_LOCAL_DOCKERFILE", True)
|
||||||
dockerfile_path: Path = env_path_field(
|
dockerfile_path: Path = env_path_field(
|
||||||
"DOCKERFILE_PATH", ".github/ci_configs/vllm/Dockerfile"
|
"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: where docker buildx (local exporter) will write artifacts
|
||||||
@ -165,7 +160,6 @@ class VllmBuildRunner(BaseRunner):
|
|||||||
logger.info("Running vllm build with inputs: %s", inputs)
|
logger.info("Running vllm build with inputs: %s", inputs)
|
||||||
vllm_commit = clone_vllm()
|
vllm_commit = clone_vllm()
|
||||||
|
|
||||||
self.cp_torch_cleaning_script(inputs)
|
|
||||||
self.cp_dockerfile_if_exist(inputs)
|
self.cp_dockerfile_if_exist(inputs)
|
||||||
# cp torch wheels from root direct to vllm workspace if exist
|
# cp torch wheels from root direct to vllm workspace if exist
|
||||||
self.cp_torch_whls_if_exist(inputs)
|
self.cp_torch_whls_if_exist(inputs)
|
||||||
@ -211,11 +205,6 @@ class VllmBuildRunner(BaseRunner):
|
|||||||
copy(inputs.torch_whls_path, tmp_dir)
|
copy(inputs.torch_whls_path, tmp_dir)
|
||||||
return 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):
|
def cp_dockerfile_if_exist(self, inputs: VllmBuildParameters):
|
||||||
if not inputs.use_local_dockerfile:
|
if not inputs.use_local_dockerfile:
|
||||||
logger.info("using vllm default dockerfile.torch_nightly for build")
|
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.cli_helper import BaseRunner
|
||||||
from cli.lib.common.envs_helper import env_path_field, env_str_field, get_env
|
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 (
|
from cli.lib.common.pip_helper import (
|
||||||
pip_install_first_match,
|
pip_install_first_match,
|
||||||
pip_install_packages,
|
pip_install_packages,
|
||||||
@ -43,10 +43,6 @@ class VllmTestParameters:
|
|||||||
|
|
||||||
torch_cuda_arch_list: str = env_str_field("TORCH_CUDA_ARCH_LIST", "8.9")
|
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):
|
def __post_init__(self):
|
||||||
if not self.torch_whls_path.exists():
|
if not self.torch_whls_path.exists():
|
||||||
raise ValueError("missing torch_whls_path")
|
raise ValueError("missing torch_whls_path")
|
||||||
@ -96,13 +92,11 @@ class VllmTestRunner(BaseRunner):
|
|||||||
self._set_envs(params)
|
self._set_envs(params)
|
||||||
|
|
||||||
clone_vllm(dst=self.work_directory)
|
clone_vllm(dst=self.work_directory)
|
||||||
self.cp_torch_cleaning_script(params)
|
|
||||||
with working_directory(self.work_directory):
|
with working_directory(self.work_directory):
|
||||||
remove_dir(Path("vllm"))
|
remove_dir(Path("vllm"))
|
||||||
self._install_wheels(params)
|
self._install_wheels(params)
|
||||||
self._install_dependencies()
|
self._install_dependencies()
|
||||||
# verify the torches are not overridden by test dependencies
|
# verify the torches are not overridden by test dependencies
|
||||||
|
|
||||||
check_versions()
|
check_versions()
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
@ -131,11 +125,6 @@ class VllmTestRunner(BaseRunner):
|
|||||||
# double check the torches are not overridden by other packages
|
# double check the torches are not overridden by other packages
|
||||||
check_versions()
|
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)
|
|
||||||
|
|
||||||
def _install_wheels(self, params: VllmTestParameters):
|
def _install_wheels(self, params: VllmTestParameters):
|
||||||
logger.info("Running vllm test with inputs: %s", params)
|
logger.info("Running vllm test with inputs: %s", params)
|
||||||
if not pkg_exists("torch"):
|
if not pkg_exists("torch"):
|
||||||
|
|||||||
@ -6,7 +6,7 @@ dependencies = [
|
|||||||
"GitPython==3.1.45",
|
"GitPython==3.1.45",
|
||||||
"docker==7.1.0",
|
"docker==7.1.0",
|
||||||
"pytest==7.3.2",
|
"pytest==7.3.2",
|
||||||
"uv==0.9.6"
|
"uv==0.8.6"
|
||||||
]
|
]
|
||||||
|
|
||||||
[tool.setuptools]
|
[tool.setuptools]
|
||||||
|
|||||||
@ -1,11 +1,11 @@
|
|||||||
SHELL=/usr/bin/env bash
|
SHELL=/usr/bin/env bash
|
||||||
|
|
||||||
DOCKER_CMD ?= docker
|
DOCKER_CMD ?= docker
|
||||||
DESIRED_ROCM ?= 7.1
|
DESIRED_ROCM ?= 6.4
|
||||||
DESIRED_ROCM_SHORT = $(subst .,,$(DESIRED_ROCM))
|
DESIRED_ROCM_SHORT = $(subst .,,$(DESIRED_ROCM))
|
||||||
PACKAGE_NAME = magma-rocm
|
PACKAGE_NAME = magma-rocm
|
||||||
# inherit this from underlying docker image, do not pass this env var to docker
|
# inherit this from underlying docker image, do not pass this env var to docker
|
||||||
#PYTORCH_ROCM_ARCH ?= gfx900;gfx906;gfx908;gfx90a;gfx942;gfx950;gfx1030;gfx1100;gfx1101;gfx1102;gfx1150;gfx1151;gfx1200;gfx1201
|
#PYTORCH_ROCM_ARCH ?= gfx900;gfx906;gfx908;gfx90a;gfx942;gfx1030;gfx1100;gfx1101;gfx1102;gfx1200;gfx1201
|
||||||
|
|
||||||
DOCKER_RUN = set -eou pipefail; ${DOCKER_CMD} run --rm -i \
|
DOCKER_RUN = set -eou pipefail; ${DOCKER_CMD} run --rm -i \
|
||||||
-v $(shell git rev-parse --show-toplevel)/.ci:/builder \
|
-v $(shell git rev-parse --show-toplevel)/.ci:/builder \
|
||||||
@ -16,26 +16,20 @@ DOCKER_RUN = set -eou pipefail; ${DOCKER_CMD} run --rm -i \
|
|||||||
magma-rocm/build_magma.sh
|
magma-rocm/build_magma.sh
|
||||||
|
|
||||||
.PHONY: all
|
.PHONY: all
|
||||||
all: magma-rocm71
|
|
||||||
all: magma-rocm70
|
|
||||||
all: magma-rocm64
|
all: magma-rocm64
|
||||||
|
all: magma-rocm63
|
||||||
|
|
||||||
.PHONY:
|
.PHONY:
|
||||||
clean:
|
clean:
|
||||||
$(RM) -r magma-*
|
$(RM) -r magma-*
|
||||||
$(RM) -r output
|
$(RM) -r output
|
||||||
|
|
||||||
.PHONY: magma-rocm71
|
|
||||||
magma-rocm71: DESIRED_ROCM := 7.1
|
|
||||||
magma-rocm71:
|
|
||||||
$(DOCKER_RUN)
|
|
||||||
|
|
||||||
.PHONY: magma-rocm70
|
|
||||||
magma-rocm70: DESIRED_ROCM := 7.0
|
|
||||||
magma-rocm70:
|
|
||||||
$(DOCKER_RUN)
|
|
||||||
|
|
||||||
.PHONY: magma-rocm64
|
.PHONY: magma-rocm64
|
||||||
magma-rocm64: DESIRED_ROCM := 6.4
|
magma-rocm64: DESIRED_ROCM := 6.4
|
||||||
magma-rocm64:
|
magma-rocm64:
|
||||||
$(DOCKER_RUN)
|
$(DOCKER_RUN)
|
||||||
|
|
||||||
|
.PHONY: magma-rocm63
|
||||||
|
magma-rocm63: DESIRED_ROCM := 6.3
|
||||||
|
magma-rocm63:
|
||||||
|
$(DOCKER_RUN)
|
||||||
|
|||||||
@ -6,8 +6,8 @@ set -eou pipefail
|
|||||||
# The script expects DESIRED_CUDA and PACKAGE_NAME to be set
|
# The script expects DESIRED_CUDA and PACKAGE_NAME to be set
|
||||||
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||||
|
|
||||||
# post merge of https://github.com/icl-utk-edu/magma/pull/65
|
# Version 2.7.2 + ROCm related updates
|
||||||
MAGMA_VERSION=c0792ae825fb36872784892ea643dd6f3456bc5f
|
MAGMA_VERSION=a1625ff4d9bc362906bd01f805dbbe12612953f6
|
||||||
|
|
||||||
# Folders for the build
|
# Folders for the build
|
||||||
PACKAGE_FILES=${ROOT_DIR}/magma-rocm/package_files # metadata
|
PACKAGE_FILES=${ROOT_DIR}/magma-rocm/package_files # metadata
|
||||||
@ -20,7 +20,7 @@ mkdir -p ${PACKAGE_DIR} ${PACKAGE_OUTPUT}/linux-64 ${PACKAGE_BUILD} ${PACKAGE_RE
|
|||||||
|
|
||||||
# Fetch magma sources and verify checksum
|
# Fetch magma sources and verify checksum
|
||||||
pushd ${PACKAGE_DIR}
|
pushd ${PACKAGE_DIR}
|
||||||
git clone https://github.com/icl-utk-edu/magma
|
git clone https://bitbucket.org/icl/magma.git
|
||||||
pushd magma
|
pushd magma
|
||||||
git checkout ${MAGMA_VERSION}
|
git checkout ${MAGMA_VERSION}
|
||||||
popd
|
popd
|
||||||
|
|||||||
@ -142,7 +142,7 @@ time CMAKE_ARGS=${CMAKE_ARGS[@]} \
|
|||||||
EXTRA_CAFFE2_CMAKE_FLAGS=${EXTRA_CAFFE2_CMAKE_FLAGS[@]} \
|
EXTRA_CAFFE2_CMAKE_FLAGS=${EXTRA_CAFFE2_CMAKE_FLAGS[@]} \
|
||||||
BUILD_LIBTORCH_CPU_WITH_DEBUG=$BUILD_DEBUG_INFO \
|
BUILD_LIBTORCH_CPU_WITH_DEBUG=$BUILD_DEBUG_INFO \
|
||||||
USE_NCCL=${USE_NCCL} USE_RCCL=${USE_RCCL} USE_KINETO=${USE_KINETO} \
|
USE_NCCL=${USE_NCCL} USE_RCCL=${USE_RCCL} USE_KINETO=${USE_KINETO} \
|
||||||
python -m build --wheel --no-isolation --outdir /tmp/$WHEELHOUSE_DIR
|
python setup.py bdist_wheel -d /tmp/$WHEELHOUSE_DIR
|
||||||
echo "Finished setup.py bdist at $(date)"
|
echo "Finished setup.py bdist at $(date)"
|
||||||
|
|
||||||
# Build libtorch packages
|
# Build libtorch packages
|
||||||
|
|||||||
@ -187,22 +187,19 @@ if [[ $CUDA_VERSION == 12* || $CUDA_VERSION == 13* ]]; then
|
|||||||
export USE_CUFILE=0
|
export USE_CUFILE=0
|
||||||
else
|
else
|
||||||
DEPS_LIST+=(
|
DEPS_LIST+=(
|
||||||
|
"/usr/local/cuda/lib64/libnvToolsExt.so.1"
|
||||||
"/usr/local/cuda/lib64/libcublas.so.12"
|
"/usr/local/cuda/lib64/libcublas.so.12"
|
||||||
"/usr/local/cuda/lib64/libcublasLt.so.12"
|
"/usr/local/cuda/lib64/libcublasLt.so.12"
|
||||||
"/usr/local/cuda/lib64/libcudart.so.12"
|
"/usr/local/cuda/lib64/libcudart.so.12"
|
||||||
"/usr/local/cuda/lib64/libnvrtc.so.12"
|
"/usr/local/cuda/lib64/libnvrtc.so.12"
|
||||||
"/usr/local/cuda/extras/CUPTI/lib64/libcupti.so.12")
|
"/usr/local/cuda/extras/CUPTI/lib64/libcupti.so.12")
|
||||||
DEPS_SONAME+=(
|
DEPS_SONAME+=(
|
||||||
|
"libnvToolsExt.so.1"
|
||||||
"libcublas.so.12"
|
"libcublas.so.12"
|
||||||
"libcublasLt.so.12"
|
"libcublasLt.so.12"
|
||||||
"libcudart.so.12"
|
"libcudart.so.12"
|
||||||
"libnvrtc.so.12"
|
"libnvrtc.so.12"
|
||||||
"libcupti.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
|
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
echo "Using nvidia libs from pypi."
|
echo "Using nvidia libs from pypi."
|
||||||
|
|||||||
@ -104,7 +104,7 @@ if [[ "$DESIRED_CUDA" == *"rocm"* ]]; then
|
|||||||
export ROCclr_DIR=/opt/rocm/rocclr/lib/cmake/rocclr
|
export ROCclr_DIR=/opt/rocm/rocclr/lib/cmake/rocclr
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "Calling -m pip install . -v --no-build-isolation at $(date)"
|
echo "Calling 'python -m pip install .' at $(date)"
|
||||||
|
|
||||||
if [[ $LIBTORCH_VARIANT = *"static"* ]]; then
|
if [[ $LIBTORCH_VARIANT = *"static"* ]]; then
|
||||||
STATIC_CMAKE_FLAG="-DTORCH_STATIC=1"
|
STATIC_CMAKE_FLAG="-DTORCH_STATIC=1"
|
||||||
|
|||||||
@ -107,10 +107,6 @@ if [[ $ROCM_INT -ge 60200 ]]; then
|
|||||||
ROCM_SO_FILES+=("librocm-core.so")
|
ROCM_SO_FILES+=("librocm-core.so")
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ $ROCM_INT -ge 70000 ]]; then
|
|
||||||
ROCM_SO_FILES+=("librocroller.so")
|
|
||||||
fi
|
|
||||||
|
|
||||||
OS_NAME=`awk -F= '/^NAME/{print $2}' /etc/os-release`
|
OS_NAME=`awk -F= '/^NAME/{print $2}' /etc/os-release`
|
||||||
if [[ "$OS_NAME" == *"CentOS Linux"* || "$OS_NAME" == *"AlmaLinux"* ]]; then
|
if [[ "$OS_NAME" == *"CentOS Linux"* || "$OS_NAME" == *"AlmaLinux"* ]]; then
|
||||||
LIBGOMP_PATH="/usr/lib64/libgomp.so.1"
|
LIBGOMP_PATH="/usr/lib64/libgomp.so.1"
|
||||||
|
|||||||
@ -89,7 +89,7 @@ fi
|
|||||||
if [[ "$BUILD_ENVIRONMENT" == *aarch64* ]]; then
|
if [[ "$BUILD_ENVIRONMENT" == *aarch64* ]]; then
|
||||||
export USE_MKLDNN=1
|
export USE_MKLDNN=1
|
||||||
export USE_MKLDNN_ACL=1
|
export USE_MKLDNN_ACL=1
|
||||||
export ACL_ROOT_DIR=/acl
|
export ACL_ROOT_DIR=/ComputeLibrary
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ "$BUILD_ENVIRONMENT" == *riscv64* ]]; then
|
if [[ "$BUILD_ENVIRONMENT" == *riscv64* ]]; then
|
||||||
@ -233,9 +233,7 @@ if [[ "${BUILD_ENVIRONMENT}" != *cuda* ]]; then
|
|||||||
export BUILD_STATIC_RUNTIME_BENCHMARK=ON
|
export BUILD_STATIC_RUNTIME_BENCHMARK=ON
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ "$BUILD_ENVIRONMENT" == *-full-debug* ]]; then
|
if [[ "$BUILD_ENVIRONMENT" == *-debug* ]]; then
|
||||||
export CMAKE_BUILD_TYPE=Debug
|
|
||||||
elif [[ "$BUILD_ENVIRONMENT" == *-debug* ]]; then
|
|
||||||
export CMAKE_BUILD_TYPE=RelWithAssert
|
export CMAKE_BUILD_TYPE=RelWithAssert
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@ -292,20 +290,15 @@ else
|
|||||||
|
|
||||||
WERROR=1 python setup.py clean
|
WERROR=1 python setup.py clean
|
||||||
|
|
||||||
WERROR=1 python -m build --wheel --no-isolation
|
WERROR=1 python setup.py bdist_wheel
|
||||||
else
|
else
|
||||||
python setup.py clean
|
python setup.py clean
|
||||||
if [[ "$BUILD_ENVIRONMENT" == *xla* ]]; then
|
if [[ "$BUILD_ENVIRONMENT" == *xla* ]]; then
|
||||||
source .ci/pytorch/install_cache_xla.sh
|
source .ci/pytorch/install_cache_xla.sh
|
||||||
fi
|
fi
|
||||||
python -m build --wheel --no-isolation
|
python setup.py bdist_wheel
|
||||||
fi
|
fi
|
||||||
pip_install_whl "$(echo dist/*.whl)"
|
pip_install_whl "$(echo dist/*.whl)"
|
||||||
if [[ "$BUILD_ENVIRONMENT" == *full-debug* ]]; then
|
|
||||||
# Regression test for https://github.com/pytorch/pytorch/issues/164297
|
|
||||||
# Torch should be importable and that's about it
|
|
||||||
pushd /; python -c "import torch;print(torch.__config__.show(), torch.randn(5) + 1.7)"; popd
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ "${BUILD_ADDITIONAL_PACKAGES:-}" == *vision* ]]; then
|
if [[ "${BUILD_ADDITIONAL_PACKAGES:-}" == *vision* ]]; then
|
||||||
install_torchvision
|
install_torchvision
|
||||||
@ -426,7 +419,7 @@ fi
|
|||||||
if [[ "$BUILD_ENVIRONMENT" != *libtorch* && "$BUILD_ENVIRONMENT" != *bazel* ]]; then
|
if [[ "$BUILD_ENVIRONMENT" != *libtorch* && "$BUILD_ENVIRONMENT" != *bazel* ]]; then
|
||||||
# export test times so that potential sharded tests that'll branch off this build will use consistent data
|
# export test times so that potential sharded tests that'll branch off this build will use consistent data
|
||||||
# don't do this for libtorch as libtorch is C++ only and thus won't have python tests run on its build
|
# don't do this for libtorch as libtorch is C++ only and thus won't have python tests run on its build
|
||||||
PYTHONPATH=. python tools/stats/export_test_times.py
|
python tools/stats/export_test_times.py
|
||||||
fi
|
fi
|
||||||
# don't do this for bazel or s390x or riscv64 as they don't use sccache
|
# don't do this for bazel or s390x or riscv64 as they don't use sccache
|
||||||
if [[ "$BUILD_ENVIRONMENT" != *s390x* && "$BUILD_ENVIRONMENT" != *riscv64* && "$BUILD_ENVIRONMENT" != *-bazel-* ]]; then
|
if [[ "$BUILD_ENVIRONMENT" != *s390x* && "$BUILD_ENVIRONMENT" != *riscv64* && "$BUILD_ENVIRONMENT" != *-bazel-* ]]; then
|
||||||
|
|||||||
@ -258,19 +258,11 @@ function install_torchrec_and_fbgemm() {
|
|||||||
git clone --recursive https://github.com/pytorch/fbgemm
|
git clone --recursive https://github.com/pytorch/fbgemm
|
||||||
pushd fbgemm/fbgemm_gpu
|
pushd fbgemm/fbgemm_gpu
|
||||||
git checkout "${fbgemm_commit}" --recurse-submodules
|
git checkout "${fbgemm_commit}" --recurse-submodules
|
||||||
# until the fbgemm_commit includes the tbb patch
|
python setup.py bdist_wheel \
|
||||||
patch <<'EOF'
|
--build-variant=rocm \
|
||||||
--- a/FbgemmGpu.cmake
|
-DHIP_ROOT_DIR="${ROCM_PATH}" \
|
||||||
+++ b/FbgemmGpu.cmake
|
-DCMAKE_C_FLAGS="-DTORCH_USE_HIP_DSA" \
|
||||||
@@ -184,5 +184,6 @@ gpu_cpp_library(
|
-DCMAKE_CXX_FLAGS="-DTORCH_USE_HIP_DSA"
|
||||||
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
|
|
||||||
popd
|
popd
|
||||||
|
|
||||||
# Save the wheel before cleaning up
|
# Save the wheel before cleaning up
|
||||||
|
|||||||
@ -58,7 +58,7 @@ time python tools/setup_helpers/generate_code.py \
|
|||||||
|
|
||||||
# Build the docs
|
# Build the docs
|
||||||
pushd docs/cpp
|
pushd docs/cpp
|
||||||
time make VERBOSE=1 html
|
time make VERBOSE=1 html -j
|
||||||
|
|
||||||
popd
|
popd
|
||||||
popd
|
popd
|
||||||
|
|||||||
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,12 +35,11 @@ fi
|
|||||||
|
|
||||||
print_cmake_info
|
print_cmake_info
|
||||||
if [[ ${BUILD_ENVIRONMENT} == *"distributed"* ]]; then
|
if [[ ${BUILD_ENVIRONMENT} == *"distributed"* ]]; then
|
||||||
# Needed for inductor benchmarks, as lots of HF networks make `torch.distribtued` calls
|
USE_OPENMP=1 WERROR=1 python setup.py bdist_wheel
|
||||||
USE_DISTRIBUTED=1 USE_OPENMP=1 WERROR=1 python -m build --wheel --no-isolation
|
|
||||||
else
|
else
|
||||||
# Explicitly set USE_DISTRIBUTED=0 to align with the default build config on mac. This also serves as the sole CI config that tests
|
# NB: we always build with distributed; USE_DISTRIBUTED turns off all
|
||||||
# that building with USE_DISTRIBUTED=0 works at all. See https://github.com/pytorch/pytorch/issues/86448
|
# backends (specifically the gloo backend), so test that this case works too
|
||||||
USE_DISTRIBUTED=0 USE_OPENMP=1 MACOSX_DEPLOYMENT_TARGET=11.0 WERROR=1 BUILD_TEST=OFF USE_PYTORCH_METAL=1 python -m build --wheel --no-isolation -C--build-option=--plat-name=macosx_11_0_arm64
|
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
|
fi
|
||||||
if which sccache > /dev/null; then
|
if which sccache > /dev/null; then
|
||||||
print_sccache_stats
|
print_sccache_stats
|
||||||
|
|||||||
@ -13,9 +13,13 @@ if [[ ! $(python -c "import torch; print(int(torch.backends.openmp.is_available(
|
|||||||
fi
|
fi
|
||||||
popd
|
popd
|
||||||
|
|
||||||
|
python -mpip install -r requirements.txt
|
||||||
|
|
||||||
# enable debug asserts in serialization
|
# enable debug asserts in serialization
|
||||||
export TORCH_SERIALIZATION_DEBUG=1
|
export TORCH_SERIALIZATION_DEBUG=1
|
||||||
|
|
||||||
|
python -mpip install --no-input -r requirements.txt
|
||||||
|
|
||||||
setup_test_python() {
|
setup_test_python() {
|
||||||
# The CircleCI worker hostname doesn't resolve to an address.
|
# The CircleCI worker hostname doesn't resolve to an address.
|
||||||
# This environment variable makes ProcessGroupGloo default to
|
# This environment variable makes ProcessGroupGloo default to
|
||||||
@ -55,7 +59,7 @@ test_python_shard() {
|
|||||||
|
|
||||||
setup_test_python
|
setup_test_python
|
||||||
|
|
||||||
time python test/run_test.py --verbose --exclude-jit-executor --exclude-distributed-tests --exclude-quantization-tests --shard "$1" "$NUM_TEST_SHARDS"
|
time python test/run_test.py --verbose --exclude-jit-executor --exclude-distributed-tests --shard "$1" "$NUM_TEST_SHARDS"
|
||||||
|
|
||||||
assert_git_not_dirty
|
assert_git_not_dirty
|
||||||
}
|
}
|
||||||
@ -256,7 +260,7 @@ test_torchbench_smoketest() {
|
|||||||
local device=mps
|
local device=mps
|
||||||
local dtypes=(undefined float16 bfloat16 notset)
|
local dtypes=(undefined float16 bfloat16 notset)
|
||||||
local dtype=${dtypes[$1]}
|
local dtype=${dtypes[$1]}
|
||||||
local models=(llama BERT_pytorch dcgan yolov3 resnet152 sam sam_fast pytorch_unet stable_diffusion_text_encoder speech_transformer Super_SloMo doctr_det_predictor doctr_reco_predictor vgg16)
|
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)
|
||||||
|
|
||||||
for backend in eager inductor; do
|
for backend in eager inductor; do
|
||||||
|
|
||||||
@ -319,7 +323,7 @@ test_aoti_torchbench_smoketest() {
|
|||||||
local device=mps
|
local device=mps
|
||||||
local dtypes=(undefined float16 bfloat16 notset)
|
local dtypes=(undefined float16 bfloat16 notset)
|
||||||
local dtype=${dtypes[$1]}
|
local dtype=${dtypes[$1]}
|
||||||
local models=(llama BERT_pytorch dcgan yolov3 resnet152 sam sam_fast pytorch_unet stable_diffusion_text_encoder speech_transformer Super_SloMo doctr_det_predictor doctr_reco_predictor vgg16)
|
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}"
|
echo "Launching torchbench inference performance run for AOT Inductor and dtype ${dtype}"
|
||||||
local dtype_arg="--${dtype}"
|
local dtype_arg="--${dtype}"
|
||||||
|
|||||||
@ -26,7 +26,6 @@ if [[ "${SHARD_NUMBER:-2}" == "2" ]]; then
|
|||||||
time python test/run_test.py --verbose -i distributed/test_c10d_spawn_gloo
|
time python test/run_test.py --verbose -i distributed/test_c10d_spawn_gloo
|
||||||
time python test/run_test.py --verbose -i distributed/test_c10d_spawn_nccl
|
time python test/run_test.py --verbose -i distributed/test_c10d_spawn_nccl
|
||||||
time python test/run_test.py --verbose -i distributed/test_compute_comm_reordering
|
time python test/run_test.py --verbose -i distributed/test_compute_comm_reordering
|
||||||
time python test/run_test.py --verbose -i distributed/test_aten_comm_compute_reordering
|
|
||||||
time python test/run_test.py --verbose -i distributed/test_store
|
time python test/run_test.py --verbose -i distributed/test_store
|
||||||
time python test/run_test.py --verbose -i distributed/test_symmetric_memory
|
time python test/run_test.py --verbose -i distributed/test_symmetric_memory
|
||||||
time python test/run_test.py --verbose -i distributed/test_pg_wrapper
|
time python test/run_test.py --verbose -i distributed/test_pg_wrapper
|
||||||
|
|||||||
@ -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}')
|
|
||||||
@ -32,9 +32,6 @@ LIBTORCH_NAMESPACE_LIST = (
|
|||||||
"torch::",
|
"torch::",
|
||||||
)
|
)
|
||||||
|
|
||||||
# Patterns for detecting statically linked libstdc++ symbols
|
|
||||||
STATICALLY_LINKED_CXX11_ABI = [re.compile(r".*recursive_directory_iterator.*")]
|
|
||||||
|
|
||||||
|
|
||||||
def _apply_libtorch_symbols(symbols):
|
def _apply_libtorch_symbols(symbols):
|
||||||
return [
|
return [
|
||||||
@ -56,17 +53,12 @@ def get_symbols(lib: str) -> list[tuple[str, str, str]]:
|
|||||||
return [x.split(" ", 2) for x in lines.decode("latin1").split("\n")[:-1]]
|
return [x.split(" ", 2) for x in lines.decode("latin1").split("\n")[:-1]]
|
||||||
|
|
||||||
|
|
||||||
def grep_symbols(
|
def grep_symbols(lib: str, patterns: list[Any]) -> list[str]:
|
||||||
lib: str, patterns: list[Any], symbol_type: str | None = None
|
|
||||||
) -> list[str]:
|
|
||||||
def _grep_symbols(
|
def _grep_symbols(
|
||||||
symbols: list[tuple[str, str, str]], patterns: list[Any]
|
symbols: list[tuple[str, str, str]], patterns: list[Any]
|
||||||
) -> list[str]:
|
) -> list[str]:
|
||||||
rc = []
|
rc = []
|
||||||
for _s_addr, _s_type, s_name in symbols:
|
for _s_addr, _s_type, s_name in symbols:
|
||||||
# Filter by symbol type if specified
|
|
||||||
if symbol_type and _s_type != symbol_type:
|
|
||||||
continue
|
|
||||||
for pattern in patterns:
|
for pattern in patterns:
|
||||||
if pattern.match(s_name):
|
if pattern.match(s_name):
|
||||||
rc.append(s_name)
|
rc.append(s_name)
|
||||||
@ -88,18 +80,6 @@ def grep_symbols(
|
|||||||
return functools.reduce(list.__add__, (x.result() for x in tasks), [])
|
return functools.reduce(list.__add__, (x.result() for x in tasks), [])
|
||||||
|
|
||||||
|
|
||||||
def check_lib_statically_linked_libstdc_cxx_abi_symbols(lib: str) -> None:
|
|
||||||
cxx11_statically_linked_symbols = grep_symbols(
|
|
||||||
lib, STATICALLY_LINKED_CXX11_ABI, symbol_type="T"
|
|
||||||
)
|
|
||||||
num_statically_linked_symbols = len(cxx11_statically_linked_symbols)
|
|
||||||
print(f"num_statically_linked_symbols (T): {num_statically_linked_symbols}")
|
|
||||||
if num_statically_linked_symbols > 0:
|
|
||||||
raise RuntimeError(
|
|
||||||
f"Found statically linked libstdc++ symbols (recursive_directory_iterator): {cxx11_statically_linked_symbols[:100]}"
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def check_lib_symbols_for_abi_correctness(lib: str) -> None:
|
def check_lib_symbols_for_abi_correctness(lib: str) -> None:
|
||||||
print(f"lib: {lib}")
|
print(f"lib: {lib}")
|
||||||
cxx11_symbols = grep_symbols(lib, LIBTORCH_CXX11_PATTERNS)
|
cxx11_symbols = grep_symbols(lib, LIBTORCH_CXX11_PATTERNS)
|
||||||
@ -127,7 +107,6 @@ def main() -> None:
|
|||||||
|
|
||||||
libtorch_cpu_path = str(install_root / "lib" / "libtorch_cpu.so")
|
libtorch_cpu_path = str(install_root / "lib" / "libtorch_cpu.so")
|
||||||
check_lib_symbols_for_abi_correctness(libtorch_cpu_path)
|
check_lib_symbols_for_abi_correctness(libtorch_cpu_path)
|
||||||
check_lib_statically_linked_libstdc_cxx_abi_symbols(libtorch_cpu_path)
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|||||||
@ -386,8 +386,8 @@ def smoke_test_compile(device: str = "cpu") -> None:
|
|||||||
|
|
||||||
|
|
||||||
def smoke_test_nvshmem() -> None:
|
def smoke_test_nvshmem() -> None:
|
||||||
if not torch.cuda.is_available() or target_os == "windows":
|
if not torch.cuda.is_available():
|
||||||
print("Windows platform or CUDA is not available, skipping NVSHMEM test")
|
print("CUDA is not available, skipping NVSHMEM test")
|
||||||
return
|
return
|
||||||
|
|
||||||
# Check if NVSHMEM is compiled in current build
|
# Check if NVSHMEM is compiled in current build
|
||||||
@ -396,9 +396,7 @@ def smoke_test_nvshmem() -> None:
|
|||||||
except ImportError:
|
except ImportError:
|
||||||
# Not built with NVSHMEM support.
|
# Not built with NVSHMEM support.
|
||||||
# torch is not compiled with NVSHMEM prior to 2.9
|
# torch is not compiled with NVSHMEM prior to 2.9
|
||||||
from torch.torch_version import TorchVersion
|
if torch.__version__ < "2.9":
|
||||||
|
|
||||||
if TorchVersion(torch.__version__) < (2, 9):
|
|
||||||
return
|
return
|
||||||
else:
|
else:
|
||||||
# After 2.9: NVSHMEM is expected to be compiled in current build
|
# After 2.9: NVSHMEM is expected to be compiled in current build
|
||||||
|
|||||||
@ -32,18 +32,6 @@ if [[ "$BUILD_ENVIRONMENT" != *rocm* && "$BUILD_ENVIRONMENT" != *s390x* && -d /v
|
|||||||
git config --global --add safe.directory /var/lib/jenkins/workspace
|
git config --global --add safe.directory /var/lib/jenkins/workspace
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
# Patch numba to avoid CUDA-13 crash, see https://github.com/pytorch/pytorch/issues/162878
|
|
||||||
if [[ "$BUILD_ENVIRONMENT" == *cuda* ]]; then
|
|
||||||
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
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "Environment variables:"
|
echo "Environment variables:"
|
||||||
env
|
env
|
||||||
|
|
||||||
@ -324,26 +312,20 @@ test_python_shard() {
|
|||||||
|
|
||||||
# modify LD_LIBRARY_PATH to ensure it has the conda env.
|
# modify LD_LIBRARY_PATH to ensure it has the conda env.
|
||||||
# This set of tests has been shown to be buggy without it for the split-build
|
# This set of tests has been shown to be buggy without it for the split-build
|
||||||
time python test/run_test.py --exclude-jit-executor --exclude-distributed-tests --exclude-quantization-tests $INCLUDE_CLAUSE --shard "$1" "$NUM_TEST_SHARDS" --verbose $PYTHON_TEST_EXTRA_OPTION --upload-artifacts-while-running
|
time python test/run_test.py --exclude-jit-executor --exclude-distributed-tests $INCLUDE_CLAUSE --shard "$1" "$NUM_TEST_SHARDS" --verbose $PYTHON_TEST_EXTRA_OPTION --upload-artifacts-while-running
|
||||||
|
|
||||||
assert_git_not_dirty
|
assert_git_not_dirty
|
||||||
}
|
}
|
||||||
|
|
||||||
test_python() {
|
test_python() {
|
||||||
# shellcheck disable=SC2086
|
# shellcheck disable=SC2086
|
||||||
time python test/run_test.py --exclude-jit-executor --exclude-distributed-tests --exclude-quantization-tests $INCLUDE_CLAUSE --verbose $PYTHON_TEST_EXTRA_OPTION
|
time python test/run_test.py --exclude-jit-executor --exclude-distributed-tests $INCLUDE_CLAUSE --verbose $PYTHON_TEST_EXTRA_OPTION
|
||||||
assert_git_not_dirty
|
assert_git_not_dirty
|
||||||
}
|
}
|
||||||
|
|
||||||
test_python_smoke() {
|
test_python_smoke() {
|
||||||
# Smoke tests for H100/B200
|
# Smoke tests for H100
|
||||||
time python test/run_test.py --include test_matmul_cuda test_scaled_matmul_cuda inductor/test_fp8 inductor/test_max_autotune $PYTHON_TEST_EXTRA_OPTION --upload-artifacts-while-running
|
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 test_scaled_matmul_cuda inductor/test_fp8 $PYTHON_TEST_EXTRA_OPTION --upload-artifacts-while-running
|
|
||||||
assert_git_not_dirty
|
assert_git_not_dirty
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -392,7 +374,6 @@ test_dynamo_wrapped_shard() {
|
|||||||
--exclude-distributed-tests \
|
--exclude-distributed-tests \
|
||||||
--exclude-torch-export-tests \
|
--exclude-torch-export-tests \
|
||||||
--exclude-aot-dispatch-tests \
|
--exclude-aot-dispatch-tests \
|
||||||
--exclude-quantization-tests \
|
|
||||||
--shard "$1" "$NUM_TEST_SHARDS" \
|
--shard "$1" "$NUM_TEST_SHARDS" \
|
||||||
--verbose \
|
--verbose \
|
||||||
--upload-artifacts-while-running
|
--upload-artifacts-while-running
|
||||||
@ -437,7 +418,7 @@ test_inductor_distributed() {
|
|||||||
|
|
||||||
# this runs on both single-gpu and multi-gpu instance. It should be smart about skipping tests that aren't supported
|
# this runs on both single-gpu and multi-gpu instance. It should be smart about skipping tests that aren't supported
|
||||||
# with if required # gpus aren't available
|
# with if required # gpus aren't available
|
||||||
python test/run_test.py --include distributed/test_dynamo_distributed distributed/test_inductor_collectives distributed/test_aten_comm_compute_reordering distributed/test_compute_comm_reordering --verbose
|
python test/run_test.py --include distributed/test_dynamo_distributed distributed/test_inductor_collectives distributed/test_compute_comm_reordering --verbose
|
||||||
assert_git_not_dirty
|
assert_git_not_dirty
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -460,37 +441,31 @@ test_inductor_shard() {
|
|||||||
--verbose
|
--verbose
|
||||||
}
|
}
|
||||||
|
|
||||||
test_inductor_aoti_cpp() {
|
test_inductor_aoti() {
|
||||||
|
# docker build uses bdist_wheel which does not work with test_aot_inductor
|
||||||
|
# TODO: need a faster way to build
|
||||||
if [[ "$BUILD_ENVIRONMENT" == *rocm* ]]; then
|
if [[ "$BUILD_ENVIRONMENT" == *rocm* ]]; then
|
||||||
# We need to hipify before building again
|
# We need to hipify before building again
|
||||||
python3 tools/amd_build/build_amd.py
|
python3 tools/amd_build/build_amd.py
|
||||||
fi
|
fi
|
||||||
if [[ "$BUILD_ENVIRONMENT" == *sm86* ]]; then
|
if [[ "$BUILD_ENVIRONMENT" == *sm86* ]]; then
|
||||||
|
BUILD_COMMAND=(TORCH_CUDA_ARCH_LIST=8.6 USE_FLASH_ATTENTION=OFF python -m pip install --no-build-isolation -v -e .)
|
||||||
# TODO: Replace me completely, as one should not use conda libstdc++, nor need special path to TORCH_LIB
|
# TODO: Replace me completely, as one should not use conda libstdc++, nor need special path to TORCH_LIB
|
||||||
TEST_ENVS=(CPP_TESTS_DIR="${BUILD_BIN_DIR}" LD_LIBRARY_PATH="/opt/conda/envs/py_3.10/lib:${TORCH_LIB_DIR}:${LD_LIBRARY_PATH}")
|
TEST_ENVS=(CPP_TESTS_DIR="${BUILD_BIN_DIR}" LD_LIBRARY_PATH="/opt/conda/envs/py_3.10/lib:${TORCH_LIB_DIR}:${LD_LIBRARY_PATH}")
|
||||||
else
|
else
|
||||||
|
BUILD_COMMAND=(python -m pip install --no-build-isolation -v -e .)
|
||||||
TEST_ENVS=(CPP_TESTS_DIR="${BUILD_BIN_DIR}" LD_LIBRARY_PATH="${TORCH_LIB_DIR}")
|
TEST_ENVS=(CPP_TESTS_DIR="${BUILD_BIN_DIR}" LD_LIBRARY_PATH="${TORCH_LIB_DIR}")
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# aoti cmake custom command requires `torch` to be installed
|
||||||
|
# initialize the cmake build cache and install torch
|
||||||
|
/usr/bin/env "${BUILD_COMMAND[@]}"
|
||||||
|
# rebuild with the build cache with `BUILD_AOT_INDUCTOR_TEST` enabled
|
||||||
|
/usr/bin/env CMAKE_FRESH=1 BUILD_AOT_INDUCTOR_TEST=1 "${BUILD_COMMAND[@]}"
|
||||||
|
|
||||||
/usr/bin/env "${TEST_ENVS[@]}" python test/run_test.py --cpp --verbose -i cpp/test_aoti_abi_check cpp/test_aoti_inference cpp/test_vec_half_AVX2 -dist=loadfile
|
/usr/bin/env "${TEST_ENVS[@]}" python test/run_test.py --cpp --verbose -i cpp/test_aoti_abi_check cpp/test_aoti_inference cpp/test_vec_half_AVX2 -dist=loadfile
|
||||||
}
|
}
|
||||||
|
|
||||||
test_inductor_aoti_cross_compile_for_windows() {
|
|
||||||
|
|
||||||
TEST_REPORTS_DIR=$(pwd)/test/test-reports
|
|
||||||
mkdir -p "$TEST_REPORTS_DIR"
|
|
||||||
|
|
||||||
# Set WINDOWS_CUDA_HOME environment variable
|
|
||||||
WINDOWS_CUDA_HOME="$(pwd)/win-torch-wheel-extracted"
|
|
||||||
export WINDOWS_CUDA_HOME
|
|
||||||
|
|
||||||
echo "WINDOWS_CUDA_HOME is set to: $WINDOWS_CUDA_HOME"
|
|
||||||
echo "Contents:"
|
|
||||||
ls -lah "$(pwd)/win-torch-wheel-extracted/lib/x64/" || true
|
|
||||||
|
|
||||||
python test/inductor/test_aoti_cross_compile_windows.py -k compile --package-dir "$TEST_REPORTS_DIR" --win-torch-lib-dir "$(pwd)/win-torch-wheel-extracted/torch/lib"
|
|
||||||
}
|
|
||||||
|
|
||||||
test_inductor_cpp_wrapper_shard() {
|
test_inductor_cpp_wrapper_shard() {
|
||||||
if [[ -z "$NUM_TEST_SHARDS" ]]; then
|
if [[ -z "$NUM_TEST_SHARDS" ]]; then
|
||||||
echo "NUM_TEST_SHARDS must be defined to run a Python test shard"
|
echo "NUM_TEST_SHARDS must be defined to run a Python test shard"
|
||||||
@ -572,8 +547,6 @@ fi
|
|||||||
|
|
||||||
if [[ "${TEST_CONFIG}" == *cpu* ]]; then
|
if [[ "${TEST_CONFIG}" == *cpu* ]]; then
|
||||||
DYNAMO_BENCHMARK_FLAGS+=(--device cpu)
|
DYNAMO_BENCHMARK_FLAGS+=(--device cpu)
|
||||||
elif [[ "${TEST_CONFIG}" == *xpu* ]]; then
|
|
||||||
DYNAMO_BENCHMARK_FLAGS+=(--device xpu)
|
|
||||||
else
|
else
|
||||||
DYNAMO_BENCHMARK_FLAGS+=(--device cuda)
|
DYNAMO_BENCHMARK_FLAGS+=(--device cuda)
|
||||||
fi
|
fi
|
||||||
@ -667,8 +640,6 @@ test_perf_for_dashboard() {
|
|||||||
device=cuda_b200
|
device=cuda_b200
|
||||||
elif [[ "${TEST_CONFIG}" == *rocm* ]]; then
|
elif [[ "${TEST_CONFIG}" == *rocm* ]]; then
|
||||||
device=rocm
|
device=rocm
|
||||||
elif [[ "${TEST_CONFIG}" == *xpu* ]]; then
|
|
||||||
device=xpu
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
for mode in "${modes[@]}"; do
|
for mode in "${modes[@]}"; do
|
||||||
@ -848,7 +819,7 @@ test_dynamo_benchmark() {
|
|||||||
elif [[ "${suite}" == "timm_models" ]]; then
|
elif [[ "${suite}" == "timm_models" ]]; then
|
||||||
export TORCHBENCH_ONLY_MODELS="inception_v3"
|
export TORCHBENCH_ONLY_MODELS="inception_v3"
|
||||||
elif [[ "${suite}" == "torchbench" ]]; then
|
elif [[ "${suite}" == "torchbench" ]]; then
|
||||||
export TORCHBENCH_ONLY_MODELS="BERT_pytorch"
|
export TORCHBENCH_ONLY_MODELS="hf_Bert"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
test_single_dynamo_benchmark "dashboard" "$suite" "$shard_id" "$@"
|
test_single_dynamo_benchmark "dashboard" "$suite" "$shard_id" "$@"
|
||||||
@ -879,13 +850,13 @@ test_inductor_torchbench_smoketest_perf() {
|
|||||||
mkdir -p "$TEST_REPORTS_DIR"
|
mkdir -p "$TEST_REPORTS_DIR"
|
||||||
|
|
||||||
python benchmarks/dynamo/torchbench.py --device cuda --performance --backend inductor --float16 --training \
|
python benchmarks/dynamo/torchbench.py --device cuda --performance --backend inductor --float16 --training \
|
||||||
--batch-size-file "$(realpath benchmarks/dynamo/torchbench_models_list.txt)" --only BERT_pytorch \
|
--batch-size-file "$(realpath benchmarks/dynamo/torchbench_models_list.txt)" --only hf_Bert \
|
||||||
--output "$TEST_REPORTS_DIR/inductor_training_smoketest.csv"
|
--output "$TEST_REPORTS_DIR/inductor_training_smoketest.csv"
|
||||||
# The threshold value needs to be actively maintained to make this check useful
|
# The threshold value needs to be actively maintained to make this check useful
|
||||||
python benchmarks/dynamo/check_perf_csv.py -f "$TEST_REPORTS_DIR/inductor_training_smoketest.csv" -t 1.4
|
python benchmarks/dynamo/check_perf_csv.py -f "$TEST_REPORTS_DIR/inductor_training_smoketest.csv" -t 1.4
|
||||||
|
|
||||||
# Check memory compression ratio for a few models
|
# Check memory compression ratio for a few models
|
||||||
for test in BERT_pytorch yolov3; do
|
for test in hf_Albert timm_vision_transformer; do
|
||||||
python benchmarks/dynamo/torchbench.py --device cuda --performance --backend inductor --amp --training \
|
python benchmarks/dynamo/torchbench.py --device cuda --performance --backend inductor --amp --training \
|
||||||
--disable-cudagraphs --batch-size-file "$(realpath benchmarks/dynamo/torchbench_models_list.txt)" \
|
--disable-cudagraphs --batch-size-file "$(realpath benchmarks/dynamo/torchbench_models_list.txt)" \
|
||||||
--only $test --output "$TEST_REPORTS_DIR/inductor_training_smoketest_$test.csv"
|
--only $test --output "$TEST_REPORTS_DIR/inductor_training_smoketest_$test.csv"
|
||||||
@ -896,7 +867,7 @@ test_inductor_torchbench_smoketest_perf() {
|
|||||||
done
|
done
|
||||||
|
|
||||||
# Perform some "warm-start" runs for a few huggingface models.
|
# Perform some "warm-start" runs for a few huggingface models.
|
||||||
for test in AllenaiLongformerBase DistilBertForMaskedLM DistillGPT2 GoogleFnet YituTechConvBert; do
|
for test in AlbertForQuestionAnswering AllenaiLongformerBase DistilBertForMaskedLM DistillGPT2 GoogleFnet YituTechConvBert; do
|
||||||
python benchmarks/dynamo/huggingface.py --accuracy --training --amp --inductor --device cuda --warm-start-latency \
|
python benchmarks/dynamo/huggingface.py --accuracy --training --amp --inductor --device cuda --warm-start-latency \
|
||||||
--only $test --output "$TEST_REPORTS_DIR/inductor_warm_start_smoketest_$test.csv"
|
--only $test --output "$TEST_REPORTS_DIR/inductor_warm_start_smoketest_$test.csv"
|
||||||
python benchmarks/dynamo/check_accuracy.py \
|
python benchmarks/dynamo/check_accuracy.py \
|
||||||
@ -910,7 +881,7 @@ test_inductor_set_cpu_affinity(){
|
|||||||
export LD_PRELOAD="$JEMALLOC_LIB":"$LD_PRELOAD"
|
export LD_PRELOAD="$JEMALLOC_LIB":"$LD_PRELOAD"
|
||||||
export MALLOC_CONF="oversize_threshold:1,background_thread:true,metadata_thp:auto,dirty_decay_ms:-1,muzzy_decay_ms:-1"
|
export MALLOC_CONF="oversize_threshold:1,background_thread:true,metadata_thp:auto,dirty_decay_ms:-1,muzzy_decay_ms:-1"
|
||||||
|
|
||||||
if [[ "$(uname -m)" != "aarch64" ]]; then
|
if [[ "${TEST_CONFIG}" != *aarch64* ]]; then
|
||||||
# Use Intel OpenMP for x86
|
# Use Intel OpenMP for x86
|
||||||
IOMP_LIB="$(dirname "$(which python)")/../lib/libiomp5.so"
|
IOMP_LIB="$(dirname "$(which python)")/../lib/libiomp5.so"
|
||||||
export LD_PRELOAD="$IOMP_LIB":"$LD_PRELOAD"
|
export LD_PRELOAD="$IOMP_LIB":"$LD_PRELOAD"
|
||||||
@ -924,7 +895,7 @@ test_inductor_set_cpu_affinity(){
|
|||||||
cores=$((cpus / thread_per_core))
|
cores=$((cpus / thread_per_core))
|
||||||
|
|
||||||
# Set number of cores to 16 on aarch64 for performance runs
|
# Set number of cores to 16 on aarch64 for performance runs
|
||||||
if [[ "$(uname -m)" == "aarch64" && $cores -gt 16 ]]; then
|
if [[ "${TEST_CONFIG}" == *aarch64* && $cores -gt 16 ]]; then
|
||||||
cores=16
|
cores=16
|
||||||
fi
|
fi
|
||||||
export OMP_NUM_THREADS=$cores
|
export OMP_NUM_THREADS=$cores
|
||||||
@ -1175,12 +1146,6 @@ test_distributed() {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
test_quantization() {
|
|
||||||
echo "Testing quantization"
|
|
||||||
|
|
||||||
python test/test_quantization.py
|
|
||||||
}
|
|
||||||
|
|
||||||
test_rpc() {
|
test_rpc() {
|
||||||
echo "Testing RPC C++ tests"
|
echo "Testing RPC C++ tests"
|
||||||
# NB: the ending test_rpc must match the current function name for the current
|
# NB: the ending test_rpc must match the current function name for the current
|
||||||
@ -1427,7 +1392,7 @@ EOF
|
|||||||
pip3 install -r requirements.txt
|
pip3 install -r requirements.txt
|
||||||
# shellcheck source=./common-build.sh
|
# shellcheck source=./common-build.sh
|
||||||
source "$(dirname "${BASH_SOURCE[0]}")/common-build.sh"
|
source "$(dirname "${BASH_SOURCE[0]}")/common-build.sh"
|
||||||
python -m build --wheel --no-isolation -C--build-option=--bdist-dir="base_bdist_tmp" --outdir "base_dist"
|
python setup.py bdist_wheel --bdist-dir="base_bdist_tmp" --dist-dir="base_dist"
|
||||||
python -mpip install base_dist/*.whl
|
python -mpip install base_dist/*.whl
|
||||||
echo "::endgroup::"
|
echo "::endgroup::"
|
||||||
|
|
||||||
@ -1575,10 +1540,14 @@ test_executorch() {
|
|||||||
install_torchvision
|
install_torchvision
|
||||||
install_torchaudio
|
install_torchaudio
|
||||||
|
|
||||||
INSTALL_SCRIPT="$(pwd)/.ci/docker/common/install_executorch.sh"
|
|
||||||
|
|
||||||
pushd /executorch
|
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"
|
echo "Run ExecuTorch unit tests"
|
||||||
pytest -v -n auto
|
pytest -v -n auto
|
||||||
@ -1592,14 +1561,17 @@ test_executorch() {
|
|||||||
|
|
||||||
popd
|
popd
|
||||||
|
|
||||||
|
# Test torchgen generated code for Executorch.
|
||||||
|
echo "Testing ExecuTorch op registration"
|
||||||
|
"$BUILD_BIN_DIR"/test_edge_op_registration
|
||||||
|
|
||||||
assert_git_not_dirty
|
assert_git_not_dirty
|
||||||
}
|
}
|
||||||
|
|
||||||
test_linux_aarch64() {
|
test_linux_aarch64() {
|
||||||
python test/run_test.py --include test_modules test_mkldnn test_mkldnn_fusion test_openmp test_torch test_dynamic_shapes \
|
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_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 profiler/test_memory_profiler \
|
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
|
--shard "$SHARD_NUMBER" "$NUM_TEST_SHARDS" --verbose
|
||||||
|
|
||||||
# Dynamo tests
|
# Dynamo tests
|
||||||
@ -1625,12 +1597,11 @@ test_operator_benchmark() {
|
|||||||
TEST_REPORTS_DIR=$(pwd)/test/test-reports
|
TEST_REPORTS_DIR=$(pwd)/test/test-reports
|
||||||
mkdir -p "$TEST_REPORTS_DIR"
|
mkdir -p "$TEST_REPORTS_DIR"
|
||||||
TEST_DIR=$(pwd)
|
TEST_DIR=$(pwd)
|
||||||
ARCH=$(uname -m)
|
|
||||||
|
|
||||||
test_inductor_set_cpu_affinity
|
test_inductor_set_cpu_affinity
|
||||||
|
|
||||||
cd benchmarks/operator_benchmark/pt_extension
|
cd benchmarks/operator_benchmark/pt_extension
|
||||||
python -m pip install . -v --no-build-isolation
|
python -m pip install .
|
||||||
|
|
||||||
cd "${TEST_DIR}"/benchmarks/operator_benchmark
|
cd "${TEST_DIR}"/benchmarks/operator_benchmark
|
||||||
$TASKSET python -m benchmark_all_test --device "$1" --tag-filter "$2" \
|
$TASKSET python -m benchmark_all_test --device "$1" --tag-filter "$2" \
|
||||||
@ -1640,28 +1611,9 @@ test_operator_benchmark() {
|
|||||||
pip_install pandas
|
pip_install pandas
|
||||||
python check_perf_csv.py \
|
python check_perf_csv.py \
|
||||||
--actual "${TEST_REPORTS_DIR}/operator_benchmark_eager_float32_cpu.csv" \
|
--actual "${TEST_REPORTS_DIR}/operator_benchmark_eager_float32_cpu.csv" \
|
||||||
--expected "${ARCH}_expected_ci_operator_benchmark_eager_float32_cpu.csv"
|
--expected "expected_ci_operator_benchmark_eager_float32_cpu.csv"
|
||||||
}
|
}
|
||||||
|
|
||||||
test_operator_microbenchmark() {
|
|
||||||
TEST_REPORTS_DIR=$(pwd)/test/test-reports
|
|
||||||
mkdir -p "$TEST_REPORTS_DIR"
|
|
||||||
TEST_DIR=$(pwd)
|
|
||||||
|
|
||||||
cd benchmarks/operator_benchmark/pt_extension
|
|
||||||
python -m pip install .
|
|
||||||
|
|
||||||
cd "${TEST_DIR}"/benchmarks/operator_benchmark
|
|
||||||
|
|
||||||
for OP_BENCHMARK_TESTS in matmul mm addmm bmm; do
|
|
||||||
$TASKSET python -m pt.${OP_BENCHMARK_TESTS}_test --tag-filter long \
|
|
||||||
--output-json-for-dashboard "${TEST_REPORTS_DIR}/operator_microbenchmark_${OP_BENCHMARK_TESTS}_compile.json" \
|
|
||||||
--benchmark-name "PyTorch operator microbenchmark" --use-compile
|
|
||||||
$TASKSET python -m pt.${OP_BENCHMARK_TESTS}_test --tag-filter long \
|
|
||||||
--output-json-for-dashboard "${TEST_REPORTS_DIR}/operator_microbenchmark_${OP_BENCHMARK_TESTS}.json" \
|
|
||||||
--benchmark-name "PyTorch operator microbenchmark"
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
if ! [[ "${BUILD_ENVIRONMENT}" == *libtorch* || "${BUILD_ENVIRONMENT}" == *-bazel-* ]]; then
|
if ! [[ "${BUILD_ENVIRONMENT}" == *libtorch* || "${BUILD_ENVIRONMENT}" == *-bazel-* ]]; then
|
||||||
(cd test && python -c "import torch; print(torch.__config__.show())")
|
(cd test && python -c "import torch; print(torch.__config__.show())")
|
||||||
@ -1677,7 +1629,7 @@ if [[ "${TEST_CONFIG}" == *numpy_2* ]]; then
|
|||||||
python -m pip install --pre numpy==2.0.2 scipy==1.13.1 numba==0.60.0
|
python -m pip install --pre numpy==2.0.2 scipy==1.13.1 numba==0.60.0
|
||||||
fi
|
fi
|
||||||
python test/run_test.py --include dynamo/test_functions.py dynamo/test_unspec.py test_binary_ufuncs.py test_fake_tensor.py test_linalg.py test_numpy_interop.py test_tensor_creation_ops.py test_torch.py torch_np/test_basic.py
|
python test/run_test.py --include dynamo/test_functions.py dynamo/test_unspec.py test_binary_ufuncs.py test_fake_tensor.py test_linalg.py test_numpy_interop.py test_tensor_creation_ops.py test_torch.py torch_np/test_basic.py
|
||||||
elif [[ "${BUILD_ENVIRONMENT}" == *aarch64* && "${TEST_CONFIG}" == 'default' ]]; then
|
elif [[ "${BUILD_ENVIRONMENT}" == *aarch64* && "${TEST_CONFIG}" != *perf_cpu_aarch64* ]]; then
|
||||||
test_linux_aarch64
|
test_linux_aarch64
|
||||||
elif [[ "${TEST_CONFIG}" == *backward* ]]; then
|
elif [[ "${TEST_CONFIG}" == *backward* ]]; then
|
||||||
test_forward_backward_compatibility
|
test_forward_backward_compatibility
|
||||||
@ -1694,8 +1646,6 @@ elif [[ "${TEST_CONFIG}" == *executorch* ]]; then
|
|||||||
test_executorch
|
test_executorch
|
||||||
elif [[ "$TEST_CONFIG" == 'jit_legacy' ]]; then
|
elif [[ "$TEST_CONFIG" == 'jit_legacy' ]]; then
|
||||||
test_python_legacy_jit
|
test_python_legacy_jit
|
||||||
elif [[ "$TEST_CONFIG" == 'quantization' ]]; then
|
|
||||||
test_quantization
|
|
||||||
elif [[ "${BUILD_ENVIRONMENT}" == *libtorch* ]]; then
|
elif [[ "${BUILD_ENVIRONMENT}" == *libtorch* ]]; then
|
||||||
# TODO: run some C++ tests
|
# TODO: run some C++ tests
|
||||||
echo "no-op at the moment"
|
echo "no-op at the moment"
|
||||||
@ -1718,8 +1668,6 @@ elif [[ "${TEST_CONFIG}" == *operator_benchmark* ]]; then
|
|||||||
test_operator_benchmark cpu ${TEST_MODE}
|
test_operator_benchmark cpu ${TEST_MODE}
|
||||||
|
|
||||||
fi
|
fi
|
||||||
elif [[ "${TEST_CONFIG}" == *operator_microbenchmark* ]]; then
|
|
||||||
test_operator_microbenchmark
|
|
||||||
elif [[ "${TEST_CONFIG}" == *inductor_distributed* ]]; then
|
elif [[ "${TEST_CONFIG}" == *inductor_distributed* ]]; then
|
||||||
test_inductor_distributed
|
test_inductor_distributed
|
||||||
elif [[ "${TEST_CONFIG}" == *inductor-halide* ]]; then
|
elif [[ "${TEST_CONFIG}" == *inductor-halide* ]]; then
|
||||||
@ -1728,8 +1676,6 @@ elif [[ "${TEST_CONFIG}" == *inductor-triton-cpu* ]]; then
|
|||||||
test_inductor_triton_cpu
|
test_inductor_triton_cpu
|
||||||
elif [[ "${TEST_CONFIG}" == *inductor-micro-benchmark* ]]; then
|
elif [[ "${TEST_CONFIG}" == *inductor-micro-benchmark* ]]; then
|
||||||
test_inductor_micro_benchmark
|
test_inductor_micro_benchmark
|
||||||
elif [[ "${TEST_CONFIG}" == *aoti_cross_compile_for_windows* ]]; then
|
|
||||||
test_inductor_aoti_cross_compile_for_windows
|
|
||||||
elif [[ "${TEST_CONFIG}" == *huggingface* ]]; then
|
elif [[ "${TEST_CONFIG}" == *huggingface* ]]; then
|
||||||
install_torchvision
|
install_torchvision
|
||||||
id=$((SHARD_NUMBER-1))
|
id=$((SHARD_NUMBER-1))
|
||||||
@ -1761,7 +1707,7 @@ elif [[ "${TEST_CONFIG}" == *torchbench* ]]; then
|
|||||||
else
|
else
|
||||||
# Do this after checkout_install_torchbench to ensure we clobber any
|
# Do this after checkout_install_torchbench to ensure we clobber any
|
||||||
# nightlies that torchbench may pull in
|
# nightlies that torchbench may pull in
|
||||||
if [[ "${TEST_CONFIG}" != *cpu* && "${TEST_CONFIG}" != *xpu* ]]; then
|
if [[ "${TEST_CONFIG}" != *cpu* ]]; then
|
||||||
install_torchrec_and_fbgemm
|
install_torchrec_and_fbgemm
|
||||||
fi
|
fi
|
||||||
PYTHONPATH=/torchbench test_dynamo_benchmark torchbench "$id"
|
PYTHONPATH=/torchbench test_dynamo_benchmark torchbench "$id"
|
||||||
@ -1770,11 +1716,16 @@ elif [[ "${TEST_CONFIG}" == *inductor_cpp_wrapper* ]]; then
|
|||||||
install_torchvision
|
install_torchvision
|
||||||
PYTHONPATH=/torchbench test_inductor_cpp_wrapper_shard "$SHARD_NUMBER"
|
PYTHONPATH=/torchbench test_inductor_cpp_wrapper_shard "$SHARD_NUMBER"
|
||||||
if [[ "$SHARD_NUMBER" -eq "1" ]]; then
|
if [[ "$SHARD_NUMBER" -eq "1" ]]; then
|
||||||
test_inductor_aoti_cpp
|
test_inductor_aoti
|
||||||
fi
|
fi
|
||||||
elif [[ "${TEST_CONFIG}" == *inductor* ]]; then
|
elif [[ "${TEST_CONFIG}" == *inductor* ]]; then
|
||||||
install_torchvision
|
install_torchvision
|
||||||
test_inductor_shard "${SHARD_NUMBER}"
|
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
|
elif [[ "${TEST_CONFIG}" == *einops* ]]; then
|
||||||
test_einops
|
test_einops
|
||||||
elif [[ "${TEST_CONFIG}" == *dynamo_wrapped* ]]; then
|
elif [[ "${TEST_CONFIG}" == *dynamo_wrapped* ]]; then
|
||||||
@ -1824,14 +1775,10 @@ elif [[ "${BUILD_ENVIRONMENT}" == *xpu* ]]; then
|
|||||||
test_xpu_bin
|
test_xpu_bin
|
||||||
elif [[ "${TEST_CONFIG}" == smoke ]]; then
|
elif [[ "${TEST_CONFIG}" == smoke ]]; then
|
||||||
test_python_smoke
|
test_python_smoke
|
||||||
elif [[ "${TEST_CONFIG}" == smoke_b200 ]]; then
|
|
||||||
test_python_smoke_b200
|
|
||||||
elif [[ "${TEST_CONFIG}" == h100_distributed ]]; then
|
elif [[ "${TEST_CONFIG}" == h100_distributed ]]; then
|
||||||
test_h100_distributed
|
test_h100_distributed
|
||||||
elif [[ "${TEST_CONFIG}" == "h100-symm-mem" ]]; then
|
elif [[ "${TEST_CONFIG}" == "h100-symm-mem" ]]; then
|
||||||
test_h100_symm_mem
|
test_h100_symm_mem
|
||||||
elif [[ "${TEST_CONFIG}" == "b200-symm-mem" ]]; then
|
|
||||||
test_h100_symm_mem
|
|
||||||
elif [[ "${TEST_CONFIG}" == h100_cutlass_backend ]]; then
|
elif [[ "${TEST_CONFIG}" == h100_cutlass_backend ]]; then
|
||||||
test_h100_cutlass_backend
|
test_h100_cutlass_backend
|
||||||
else
|
else
|
||||||
|
|||||||
@ -1,32 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
set -ex -o pipefail
|
|
||||||
|
|
||||||
# Suppress ANSI color escape sequences
|
|
||||||
export TERM=vt100
|
|
||||||
|
|
||||||
# shellcheck source=./common.sh
|
|
||||||
source "$(dirname "${BASH_SOURCE[0]}")/common.sh"
|
|
||||||
# shellcheck source=./common-build.sh
|
|
||||||
source "$(dirname "${BASH_SOURCE[0]}")/common-build.sh"
|
|
||||||
|
|
||||||
echo "Environment variables"
|
|
||||||
env
|
|
||||||
|
|
||||||
echo "Testing FA3 stable wheel still works with currently built torch"
|
|
||||||
|
|
||||||
echo "Installing ABI Stable FA3 wheel"
|
|
||||||
# The wheel was built on https://github.com/Dao-AILab/flash-attention/commit/b3846b059bf6b143d1cd56879933be30a9f78c81
|
|
||||||
# on torch nightly torch==2.9.0.dev20250830+cu129
|
|
||||||
$MAYBE_SUDO pip -q install https://s3.amazonaws.com/ossci-linux/wheels/flash_attn_3-3.0.0b1-cp39-abi3-linux_x86_64.whl
|
|
||||||
|
|
||||||
pushd flash-attention/hopper
|
|
||||||
export PYTHONPATH=$PWD
|
|
||||||
pytest -v -s \
|
|
||||||
"test_flash_attn.py::test_flash_attn_output[1-1-192-False-False-False-0.0-False-False-mha-dtype0]" \
|
|
||||||
"test_flash_attn.py::test_flash_attn_varlen_output[511-1-64-True-False-False-0.0-False-False-gqa-dtype2]" \
|
|
||||||
"test_flash_attn.py::test_flash_attn_kvcache[1-128-128-False-False-True-None-0.0-False-False-True-False-True-False-gqa-dtype0]" \
|
|
||||||
"test_flash_attn.py::test_flash_attn_race_condition[97-97-192-True-dtype0]" \
|
|
||||||
"test_flash_attn.py::test_flash_attn_combine[2-3-64-dtype1]" \
|
|
||||||
"test_flash_attn.py::test_flash3_bw_compatibility"
|
|
||||||
popd
|
|
||||||
@ -70,7 +70,7 @@ sccache --zero-stats
|
|||||||
sccache --show-stats
|
sccache --show-stats
|
||||||
|
|
||||||
# Build the wheel
|
# Build the wheel
|
||||||
python -m build --wheel --no-build-isolation
|
python setup.py bdist_wheel
|
||||||
if ($LASTEXITCODE -ne 0) { exit 1 }
|
if ($LASTEXITCODE -ne 0) { exit 1 }
|
||||||
|
|
||||||
# Install the wheel locally
|
# Install the wheel locally
|
||||||
|
|||||||
@ -38,12 +38,10 @@ if errorlevel 1 goto fail
|
|||||||
if not errorlevel 0 goto fail
|
if not errorlevel 0 goto fail
|
||||||
|
|
||||||
:: Update CMake
|
:: Update CMake
|
||||||
:: TODO: Investigate why this helps MKL detection, even when CMake from choco is not used
|
|
||||||
call choco upgrade -y cmake --no-progress --installargs 'ADD_CMAKE_TO_PATH=System' --apply-install-arguments-to-dependencies --version=3.27.9
|
call choco upgrade -y cmake --no-progress --installargs 'ADD_CMAKE_TO_PATH=System' --apply-install-arguments-to-dependencies --version=3.27.9
|
||||||
if errorlevel 1 goto fail
|
if errorlevel 1 goto fail
|
||||||
if not errorlevel 0 goto fail
|
if not errorlevel 0 goto fail
|
||||||
|
|
||||||
:: TODO: Move to .ci/docker/requirements-ci.txt
|
|
||||||
call pip install mkl==2024.2.0 mkl-static==2024.2.0 mkl-include==2024.2.0
|
call pip install mkl==2024.2.0 mkl-static==2024.2.0 mkl-include==2024.2.0
|
||||||
if errorlevel 1 goto fail
|
if errorlevel 1 goto fail
|
||||||
if not errorlevel 0 goto fail
|
if not errorlevel 0 goto fail
|
||||||
@ -132,14 +130,14 @@ if "%USE_CUDA%"=="1" (
|
|||||||
:: Print all existing environment variable for debugging
|
:: Print all existing environment variable for debugging
|
||||||
set
|
set
|
||||||
|
|
||||||
python -m build --wheel --no-isolation
|
python setup.py bdist_wheel
|
||||||
if errorlevel 1 goto fail
|
if errorlevel 1 goto fail
|
||||||
if not errorlevel 0 goto fail
|
if not errorlevel 0 goto fail
|
||||||
sccache --show-stats
|
sccache --show-stats
|
||||||
python -c "import os, glob; os.system('python -mpip install --no-index --no-deps ' + glob.glob('dist/*.whl')[0])"
|
python -c "import os, glob; os.system('python -mpip install --no-index --no-deps ' + glob.glob('dist/*.whl')[0])"
|
||||||
(
|
(
|
||||||
if "%BUILD_ENVIRONMENT%"=="" (
|
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 (
|
) else (
|
||||||
copy /Y "dist\*.whl" "%PYTORCH_FINAL_PACKAGE_DIR%"
|
copy /Y "dist\*.whl" "%PYTORCH_FINAL_PACKAGE_DIR%"
|
||||||
|
|
||||||
|
|||||||
@ -3,12 +3,12 @@ if "%BUILD_ENVIRONMENT%"=="" (
|
|||||||
) else (
|
) else (
|
||||||
set CONDA_PARENT_DIR=C:\Jenkins
|
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
|
:: 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
|
:: 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
|
:: 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
|
set INSTALL_FRESH_CONDA=1
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -17,14 +17,10 @@ if "%INSTALL_FRESH_CONDA%"=="1" (
|
|||||||
if errorlevel 1 exit /b
|
if errorlevel 1 exit /b
|
||||||
if not errorlevel 0 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 errorlevel 1 exit /b
|
||||||
if not errorlevel 0 exit /b
|
if not errorlevel 0 exit /b
|
||||||
)
|
)
|
||||||
|
|
||||||
:: Activate conda so that we can use its commands, i.e. conda, python, pip
|
:: Activate conda so that we can use its commands, i.e. conda, python, pip
|
||||||
call %CONDA_ROOT_DIR%\Scripts\activate.bat %CONDA_ROOT_DIR%
|
call %CONDA_PARENT_DIR%\Miniconda3\Scripts\activate.bat %CONDA_PARENT_DIR%\Miniconda3
|
||||||
:: 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
|
|
||||||
|
|||||||
@ -14,7 +14,7 @@ if not errorlevel 0 exit /b
|
|||||||
:: build\torch. Rather than changing all these references, making a copy of torch folder
|
:: 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
|
:: from conda to the current workspace is easier. The workspace will be cleaned up after
|
||||||
:: the job anyway
|
:: 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 .
|
pushd .
|
||||||
if "%VC_VERSION%" == "" (
|
if "%VC_VERSION%" == "" (
|
||||||
|
|||||||
@ -15,35 +15,37 @@ if errorlevel 1 exit /b 1
|
|||||||
if not errorlevel 0 exit /b 1
|
if not errorlevel 0 exit /b 1
|
||||||
|
|
||||||
cd %TMP_DIR_WIN%\build\torch\test
|
cd %TMP_DIR_WIN%\build\torch\test
|
||||||
|
|
||||||
:: Enable delayed variable expansion to make the list
|
|
||||||
setlocal enabledelayedexpansion
|
|
||||||
set EXE_LIST=
|
|
||||||
for /r "." %%a in (*.exe) do (
|
for /r "." %%a in (*.exe) do (
|
||||||
if "%%~na" == "c10_intrusive_ptr_benchmark" (
|
call :libtorch_check "%%~na" "%%~fa"
|
||||||
@REM NB: This is not a gtest executable file, thus couldn't be handled by
|
|
||||||
@REM pytest-cpp and is excluded from test discovery by run_test
|
|
||||||
call "%%~fa"
|
|
||||||
if errorlevel 1 goto fail
|
if errorlevel 1 goto fail
|
||||||
if not errorlevel 0 goto fail
|
|
||||||
) else (
|
|
||||||
if "%%~na" == "verify_api_visibility" (
|
|
||||||
@REM Skip verify_api_visibility as it is a compile-level test
|
|
||||||
) else (
|
|
||||||
set EXE_LIST=!EXE_LIST! cpp/%%~na
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
goto :eof
|
||||||
|
|
||||||
|
:libtorch_check
|
||||||
|
|
||||||
cd %CWD%
|
cd %CWD%
|
||||||
set CPP_TESTS_DIR=%TMP_DIR_WIN%\build\torch\test
|
set CPP_TESTS_DIR=%TMP_DIR_WIN%\build\torch\test
|
||||||
|
|
||||||
:: Run python test\run_test.py on the list
|
:: Skip verify_api_visibility as it a compile level test
|
||||||
set NO_TD=True && python test\run_test.py --cpp --verbose -i !EXE_LIST!
|
if "%~1" == "verify_api_visibility" goto :eof
|
||||||
if errorlevel 1 goto fail
|
|
||||||
if not errorlevel 0 goto fail
|
|
||||||
|
|
||||||
goto :eof
|
echo Running "%~2"
|
||||||
|
if "%~1" == "c10_intrusive_ptr_benchmark" (
|
||||||
|
:: NB: This is not a gtest executable file, thus couldn't be handled by pytest-cpp
|
||||||
|
call "%~2"
|
||||||
|
goto :eof
|
||||||
|
)
|
||||||
|
|
||||||
|
python test\run_test.py --cpp --verbose -i "cpp/%~1"
|
||||||
|
if errorlevel 1 (
|
||||||
|
echo %1 failed with exit code %errorlevel%
|
||||||
|
goto fail
|
||||||
|
)
|
||||||
|
if not errorlevel 0 (
|
||||||
|
echo %1 failed with exit code %errorlevel%
|
||||||
|
goto fail
|
||||||
|
)
|
||||||
|
|
||||||
:eof
|
:eof
|
||||||
exit /b 0
|
exit /b 0
|
||||||
|
|||||||
@ -25,7 +25,7 @@ echo Copying over test times file
|
|||||||
robocopy /E "%PYTORCH_FINAL_PACKAGE_DIR_WIN%\.additional_ci_files" "%PROJECT_DIR_WIN%\.additional_ci_files"
|
robocopy /E "%PYTORCH_FINAL_PACKAGE_DIR_WIN%\.additional_ci_files" "%PROJECT_DIR_WIN%\.additional_ci_files"
|
||||||
|
|
||||||
echo Run nn tests
|
echo Run nn tests
|
||||||
python run_test.py --exclude-jit-executor --exclude-distributed-tests --exclude-quantization-tests --shard "%SHARD_NUMBER%" "%NUM_TEST_SHARDS%" --verbose
|
python run_test.py --exclude-jit-executor --exclude-distributed-tests --shard "%SHARD_NUMBER%" "%NUM_TEST_SHARDS%" --verbose
|
||||||
if ERRORLEVEL 1 goto fail
|
if ERRORLEVEL 1 goto fail
|
||||||
|
|
||||||
popd
|
popd
|
||||||
|
|||||||
@ -37,8 +37,23 @@ if [[ "$BUILD_ENVIRONMENT" == *cuda* ]]; then
|
|||||||
export PYTORCH_TESTING_DEVICE_ONLY_FOR="cuda"
|
export PYTORCH_TESTING_DEVICE_ONLY_FOR="cuda"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# TODO: Move this to .ci/docker/requirements-ci.txt
|
# TODO: Move both of them to Windows AMI
|
||||||
python -m pip install "psutil==5.9.1" nvidia-ml-py "pytest-shard==0.1.2"
|
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
|
||||||
|
|
||||||
|
# Install parameterized
|
||||||
|
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
|
||||||
|
|
||||||
run_tests() {
|
run_tests() {
|
||||||
# Run nvidia-smi if available
|
# Run nvidia-smi if available
|
||||||
|
|||||||
@ -48,7 +48,7 @@ sccache --zero-stats
|
|||||||
sccache --show-stats
|
sccache --show-stats
|
||||||
|
|
||||||
:: Call PyTorch build script
|
:: Call PyTorch build script
|
||||||
python -m build --wheel --no-isolation --outdir "%PYTORCH_FINAL_PACKAGE_DIR%"
|
python setup.py bdist_wheel -d "%PYTORCH_FINAL_PACKAGE_DIR%"
|
||||||
|
|
||||||
:: show sccache stats
|
:: show sccache stats
|
||||||
sccache --show-stats
|
sccache --show-stats
|
||||||
|
|||||||
@ -37,10 +37,10 @@ IF "%CUDA_PATH_V128%"=="" (
|
|||||||
)
|
)
|
||||||
|
|
||||||
IF "%BUILD_VISION%" == "" (
|
IF "%BUILD_VISION%" == "" (
|
||||||
set TORCH_CUDA_ARCH_LIST=7.0;7.5;8.0;8.6;9.0;10.0;12.0
|
set TORCH_CUDA_ARCH_LIST=6.1;7.0;7.5;8.0;8.6;9.0;10.0;12.0
|
||||||
set TORCH_NVCC_FLAGS=-Xfatbin -compress-all
|
set TORCH_NVCC_FLAGS=-Xfatbin -compress-all
|
||||||
) ELSE (
|
) ELSE (
|
||||||
set NVCC_FLAGS=-D__CUDA_NO_HALF_OPERATORS__ --expt-relaxed-constexpr -gencode=arch=compute_70,code=sm_70 -gencode=arch=compute_75,code=sm_75 -gencode=arch=compute_80,code=compute_80 -gencode=arch=compute_86,code=compute_86 -gencode=arch=compute_90,code=compute_90 -gencode=arch=compute_100,code=compute_100 -gencode=arch=compute_120,code=compute_120
|
set NVCC_FLAGS=-D__CUDA_NO_HALF_OPERATORS__ --expt-relaxed-constexpr -gencode=arch=compute_50,code=sm_50 -gencode=arch=compute_60,code=sm_60 -gencode=arch=compute_70,code=sm_70 -gencode=arch=compute_75,code=sm_75 -gencode=arch=compute_80,code=compute_80 -gencode=arch=compute_86,code=compute_86 -gencode=arch=compute_90,code=compute_90 -gencode=arch=compute_100,code=compute_100 -gencode=arch=compute_120,code=compute_120
|
||||||
)
|
)
|
||||||
|
|
||||||
set "CUDA_PATH=%CUDA_PATH_V128%"
|
set "CUDA_PATH=%CUDA_PATH_V128%"
|
||||||
|
|||||||
@ -1,9 +1,9 @@
|
|||||||
set WIN_DRIVER_VN=580.88
|
set WIN_DRIVER_VN=528.89
|
||||||
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
|
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-win10-win11-64bit-dch-international.exe
|
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
|
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
|
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
|
||||||
|
|||||||
@ -7,9 +7,12 @@ if "%DESIRED_PYTHON%" == "3.13t" (
|
|||||||
set "PYTHON_INSTALLER_URL=https://www.python.org/ftp/python/3.13.0/python-3.13.0-amd64.exe"
|
set "PYTHON_INSTALLER_URL=https://www.python.org/ftp/python/3.13.0/python-3.13.0-amd64.exe"
|
||||||
set ADDITIONAL_OPTIONS="Include_freethreaded=1"
|
set ADDITIONAL_OPTIONS="Include_freethreaded=1"
|
||||||
set PYTHON_EXEC="python3.13t"
|
set PYTHON_EXEC="python3.13t"
|
||||||
|
) else if "%DESIRED_PYTHON%"=="3.14" (
|
||||||
|
echo Python version is set to 3.14 or 3.14t
|
||||||
|
set "PYTHON_INSTALLER_URL=https://www.python.org/ftp/python/3.14.0/python-3.14.0rc1-amd64.exe"
|
||||||
) else if "%DESIRED_PYTHON%"=="3.14t" (
|
) else if "%DESIRED_PYTHON%"=="3.14t" (
|
||||||
echo Python version is set to 3.14 or 3.14t
|
echo Python version is set to 3.14 or 3.14t
|
||||||
set "PYTHON_INSTALLER_URL=https://www.python.org/ftp/python/3.14.0/python-3.14.0-amd64.exe"
|
set "PYTHON_INSTALLER_URL=https://www.python.org/ftp/python/3.14.0/python-3.14.0rc1-amd64.exe"
|
||||||
set ADDITIONAL_OPTIONS="Include_freethreaded=1"
|
set ADDITIONAL_OPTIONS="Include_freethreaded=1"
|
||||||
set PYTHON_EXEC="python3.14t"
|
set PYTHON_EXEC="python3.14t"
|
||||||
) else (
|
) else (
|
||||||
@ -25,5 +28,5 @@ start /wait "" python-amd64.exe /quiet InstallAllUsers=1 PrependPath=0 Include_t
|
|||||||
if errorlevel 1 exit /b 1
|
if errorlevel 1 exit /b 1
|
||||||
|
|
||||||
set "PATH=%CD%\Python\Scripts;%CD%\Python;%PATH%"
|
set "PATH=%CD%\Python\Scripts;%CD%\Python;%PATH%"
|
||||||
%PYTHON_EXEC% -m pip install --upgrade pip setuptools packaging wheel build
|
%PYTHON_EXEC% -m pip install --upgrade pip setuptools packaging wheel
|
||||||
if errorlevel 1 exit /b 1
|
if errorlevel 1 exit /b 1
|
||||||
|
|||||||
@ -86,7 +86,7 @@ copy /Y "%LIBTORCH_PREFIX%-%PYTORCH_BUILD_VERSION%.zip" "%PYTORCH_FINAL_PACKAGE_
|
|||||||
goto build_end
|
goto build_end
|
||||||
|
|
||||||
:pytorch
|
:pytorch
|
||||||
%PYTHON_EXEC% -m build --wheel --no-isolation --outdir "%PYTORCH_FINAL_PACKAGE_DIR%"
|
%PYTHON_EXEC% setup.py bdist_wheel -d "%PYTORCH_FINAL_PACKAGE_DIR%"
|
||||||
|
|
||||||
:build_end
|
:build_end
|
||||||
IF ERRORLEVEL 1 exit /b 1
|
IF ERRORLEVEL 1 exit /b 1
|
||||||
|
|||||||
@ -63,7 +63,7 @@ if errorlevel 1 exit /b 1
|
|||||||
call %CONDA_HOME%\condabin\activate.bat testenv
|
call %CONDA_HOME%\condabin\activate.bat testenv
|
||||||
if errorlevel 1 exit /b 1
|
if errorlevel 1 exit /b 1
|
||||||
|
|
||||||
call conda install -y -q -c conda-forge libuv=1.51
|
call conda install -y -q -c conda-forge libuv=1.39
|
||||||
call conda install -y -q intel-openmp
|
call conda install -y -q intel-openmp
|
||||||
|
|
||||||
echo "install and test libtorch"
|
echo "install and test libtorch"
|
||||||
|
|||||||
@ -18,7 +18,7 @@ if "%DESIRED_PYTHON%" == "3.9" %PYTHON_EXEC% -m pip install numpy==2.0.2 cmake
|
|||||||
|
|
||||||
%PYTHON_EXEC% -m pip install pyyaml
|
%PYTHON_EXEC% -m pip install pyyaml
|
||||||
%PYTHON_EXEC% -m pip install mkl-include mkl-static
|
%PYTHON_EXEC% -m pip install mkl-include mkl-static
|
||||||
%PYTHON_EXEC% -m pip install boto3 requests ninja typing_extensions setuptools==72.1.0
|
%PYTHON_EXEC% -m pip install boto3 ninja typing_extensions setuptools==72.1.0
|
||||||
|
|
||||||
where cmake.exe
|
where cmake.exe
|
||||||
|
|
||||||
|
|||||||
@ -85,7 +85,7 @@ mkdir -p "$PYTORCH_FINAL_PACKAGE_DIR" || true
|
|||||||
# Create an isolated directory to store this builds pytorch checkout and conda
|
# Create an isolated directory to store this builds pytorch checkout and conda
|
||||||
# installation
|
# installation
|
||||||
if [[ -z "$MAC_PACKAGE_WORK_DIR" ]]; then
|
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
|
fi
|
||||||
mkdir -p "$MAC_PACKAGE_WORK_DIR" || true
|
mkdir -p "$MAC_PACKAGE_WORK_DIR" || true
|
||||||
if [[ -n ${GITHUB_ACTIONS} ]]; then
|
if [[ -n ${GITHUB_ACTIONS} ]]; then
|
||||||
@ -96,11 +96,11 @@ fi
|
|||||||
whl_tmp_dir="${MAC_PACKAGE_WORK_DIR}/dist"
|
whl_tmp_dir="${MAC_PACKAGE_WORK_DIR}/dist"
|
||||||
mkdir -p "$whl_tmp_dir"
|
mkdir -p "$whl_tmp_dir"
|
||||||
|
|
||||||
mac_version='macosx-11_0-arm64'
|
mac_version='macosx_11_0_arm64'
|
||||||
libtorch_arch='arm64'
|
libtorch_arch='arm64'
|
||||||
|
|
||||||
# Create a consistent wheel package name to rename the wheel to
|
# 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"
|
||||||
|
|
||||||
###########################################################
|
###########################################################
|
||||||
|
|
||||||
@ -125,6 +125,7 @@ popd
|
|||||||
export TH_BINARY_BUILD=1
|
export TH_BINARY_BUILD=1
|
||||||
export INSTALL_TEST=0 # dont install test binaries into site-packages
|
export INSTALL_TEST=0 # dont install test binaries into site-packages
|
||||||
export MACOSX_DEPLOYMENT_TARGET=11.0
|
export MACOSX_DEPLOYMENT_TARGET=11.0
|
||||||
|
export CMAKE_PREFIX_PATH=${CONDA_PREFIX:-"$(dirname $(which conda))/../"}
|
||||||
|
|
||||||
EXTRA_CONDA_INSTALL_FLAGS=""
|
EXTRA_CONDA_INSTALL_FLAGS=""
|
||||||
CONDA_ENV_CREATE_FLAGS=""
|
CONDA_ENV_CREATE_FLAGS=""
|
||||||
@ -132,20 +133,25 @@ RENAME_WHEEL=true
|
|||||||
case $desired_python in
|
case $desired_python in
|
||||||
3.14t)
|
3.14t)
|
||||||
echo "Using 3.14 deps"
|
echo "Using 3.14 deps"
|
||||||
mac_version='macosx-11.0-arm64'
|
|
||||||
NUMPY_PINNED_VERSION="==2.1.0"
|
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
|
RENAME_WHEEL=false
|
||||||
;;
|
;;
|
||||||
3.14)
|
3.14)
|
||||||
echo "Using 3.14t deps"
|
echo "Using 3.14t deps"
|
||||||
mac_version='macosx-11.0-arm64'
|
|
||||||
NUMPY_PINNED_VERSION="==2.1.0"
|
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
|
RENAME_WHEEL=false
|
||||||
;;
|
;;
|
||||||
3.13t)
|
3.13t)
|
||||||
echo "Using 3.13t deps"
|
echo "Using 3.13 deps"
|
||||||
mac_version='macosx-11.0-arm64'
|
|
||||||
NUMPY_PINNED_VERSION="==2.1.0"
|
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
|
RENAME_WHEEL=false
|
||||||
;;
|
;;
|
||||||
3.13)
|
3.13)
|
||||||
@ -170,15 +176,21 @@ case $desired_python in
|
|||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
|
# 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"
|
||||||
|
|
||||||
PINNED_PACKAGES=(
|
PINNED_PACKAGES=(
|
||||||
"numpy${NUMPY_PINNED_VERSION}"
|
"numpy${NUMPY_PINNED_VERSION}"
|
||||||
)
|
)
|
||||||
python -mvenv ~/${desired_python}-build
|
retry pip install "${PINNED_PACKAGES[@]}" -r "${pytorch_rootdir}/requirements-build.txt"
|
||||||
source ~/${desired_python}-build/bin/activate
|
pip install requests ninja typing-extensions
|
||||||
retry pip install "${PINNED_PACKAGES[@]}" -r "${pytorch_rootdir}/requirements.txt"
|
retry pip install -r "${pytorch_rootdir}/requirements.txt" || true
|
||||||
retry brew install libomp
|
retry brew install libomp
|
||||||
|
|
||||||
# For USE_DISTRIBUTED=1 on macOS, need libuv, which is build as part of tensorpipe submodule
|
# For USE_DISTRIBUTED=1 on macOS, this enables gloo, which needs libuv, which
|
||||||
|
# is build as part of tensorpipe submodule
|
||||||
export USE_DISTRIBUTED=1
|
export USE_DISTRIBUTED=1
|
||||||
|
|
||||||
export USE_MKLDNN=OFF
|
export USE_MKLDNN=OFF
|
||||||
@ -186,11 +198,11 @@ export USE_QNNPACK=OFF
|
|||||||
export BUILD_TEST=OFF
|
export BUILD_TEST=OFF
|
||||||
|
|
||||||
pushd "$pytorch_rootdir"
|
pushd "$pytorch_rootdir"
|
||||||
echo "Calling -m build --wheel --no-isolation at $(date)"
|
echo "Calling setup.py bdist_wheel at $(date)"
|
||||||
|
|
||||||
_PYTHON_HOST_PLATFORM=${mac_version} ARCHFLAGS="-arch arm64" python -m build --wheel --no-isolation --outdir "$whl_tmp_dir" -C--plat-name="${mac_version//[-.]/_}"
|
python setup.py bdist_wheel -d "$whl_tmp_dir" --plat-name ${mac_version}
|
||||||
|
|
||||||
echo "Finished -m build --wheel --no-isolation at $(date)"
|
echo "Finished setup.py bdist_wheel at $(date)"
|
||||||
|
|
||||||
if [[ $package_type != 'libtorch' ]]; then
|
if [[ $package_type != 'libtorch' ]]; then
|
||||||
echo "delocating wheel dependencies"
|
echo "delocating wheel dependencies"
|
||||||
|
|||||||
@ -71,7 +71,14 @@ export PYTORCH_BUILD_NUMBER=1
|
|||||||
|
|
||||||
# Set triton version as part of PYTORCH_EXTRA_INSTALL_REQUIREMENTS
|
# Set triton version as part of PYTORCH_EXTRA_INSTALL_REQUIREMENTS
|
||||||
TRITON_VERSION=$(cat $PYTORCH_ROOT/.ci/docker/triton_version.txt)
|
TRITON_VERSION=$(cat $PYTORCH_ROOT/.ci/docker/triton_version.txt)
|
||||||
TRITON_CONSTRAINT="platform_system == 'Linux'"
|
|
||||||
|
# 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
|
||||||
|
TRITON_CONSTRAINT="platform_system == 'Linux'"
|
||||||
|
fi
|
||||||
|
|
||||||
if [[ "$PACKAGE_TYPE" =~ .*wheel.* && -n "${PYTORCH_EXTRA_INSTALL_REQUIREMENTS:-}" && ! "$PYTORCH_BUILD_VERSION" =~ .*xpu.* ]]; then
|
if [[ "$PACKAGE_TYPE" =~ .*wheel.* && -n "${PYTORCH_EXTRA_INSTALL_REQUIREMENTS:-}" && ! "$PYTORCH_BUILD_VERSION" =~ .*xpu.* ]]; then
|
||||||
TRITON_REQUIREMENT="triton==${TRITON_VERSION}; ${TRITON_CONSTRAINT}"
|
TRITON_REQUIREMENT="triton==${TRITON_VERSION}; ${TRITON_CONSTRAINT}"
|
||||||
@ -163,13 +170,8 @@ if [[ "$(uname)" != Darwin ]]; then
|
|||||||
MEMORY_LIMIT_MAX_JOBS=12
|
MEMORY_LIMIT_MAX_JOBS=12
|
||||||
NUM_CPUS=$(( $(nproc) - 2 ))
|
NUM_CPUS=$(( $(nproc) - 2 ))
|
||||||
|
|
||||||
if [[ "$(uname)" == Linux ]]; then
|
# Defaults here for **binary** linux builds so they can be changed in one place
|
||||||
# Defaults here for **binary** linux builds so they can be changed in one place
|
export MAX_JOBS=${MAX_JOBS:-$(( ${NUM_CPUS} > ${MEMORY_LIMIT_MAX_JOBS} ? ${MEMORY_LIMIT_MAX_JOBS} : ${NUM_CPUS} ))}
|
||||||
export MAX_JOBS=${MAX_JOBS:-$(( ${NUM_CPUS} > ${MEMORY_LIMIT_MAX_JOBS} ? ${MEMORY_LIMIT_MAX_JOBS} : ${NUM_CPUS} ))}
|
|
||||||
else
|
|
||||||
# For other builds
|
|
||||||
export MAX_JOBS=${NUM_CPUS}
|
|
||||||
fi
|
|
||||||
|
|
||||||
cat >>"$envfile" <<EOL
|
cat >>"$envfile" <<EOL
|
||||||
export MAX_JOBS="${MAX_JOBS}"
|
export MAX_JOBS="${MAX_JOBS}"
|
||||||
|
|||||||
47
.circleci/scripts/functorch_doc_push_script.sh
Executable file
47
.circleci/scripts/functorch_doc_push_script.sh
Executable file
@ -0,0 +1,47 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# =================== The following code **should** be executed inside Docker container ===================
|
||||||
|
|
||||||
|
# Install dependencies
|
||||||
|
sudo apt-get -y update
|
||||||
|
sudo apt-get -y install expect-dev
|
||||||
|
|
||||||
|
# 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
|
||||||
|
|
||||||
|
version=${DOCS_VERSION:-nightly}
|
||||||
|
echo "version: $version"
|
||||||
|
|
||||||
|
# Build functorch docs
|
||||||
|
pushd $pt_checkout/functorch/docs
|
||||||
|
pip -q install -r requirements.txt
|
||||||
|
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
|
||||||
|
# =================== The above code **should** be executed inside Docker container ===================
|
||||||
@ -59,21 +59,16 @@ performance-*,
|
|||||||
-performance-enum-size,
|
-performance-enum-size,
|
||||||
readability-container-size-empty,
|
readability-container-size-empty,
|
||||||
readability-delete-null-pointer,
|
readability-delete-null-pointer,
|
||||||
readability-duplicate-include,
|
readability-duplicate-include
|
||||||
readability-named-parameter,
|
|
||||||
readability-misplaced-array-index,
|
readability-misplaced-array-index,
|
||||||
readability-redundant*,
|
readability-redundant*
|
||||||
readability-simplify-subscript-expr,
|
readability-simplify-subscript-expr,
|
||||||
readability-static-definition-in-anonymous-namespace
|
|
||||||
readability-string-compare,
|
readability-string-compare,
|
||||||
-readability-redundant-access-specifiers,
|
-readability-redundant-access-specifiers,
|
||||||
-readability-redundant-control-flow,
|
-readability-redundant-control-flow,
|
||||||
-readability-redundant-inline-specifier,
|
|
||||||
'
|
'
|
||||||
HeaderFilterRegex: '^(aten/|c10/|torch/).*$'
|
HeaderFilterRegex: '^(aten/|c10/|torch/).*$'
|
||||||
WarningsAsErrors: '*'
|
WarningsAsErrors: '*'
|
||||||
LineFilter:
|
|
||||||
- name: '/usr/include/.*'
|
|
||||||
CheckOptions:
|
CheckOptions:
|
||||||
cppcoreguidelines-special-member-functions.AllowSoleDefaultDtor: true
|
cppcoreguidelines-special-member-functions.AllowSoleDefaultDtor: true
|
||||||
cppcoreguidelines-special-member-functions.AllowImplicitlyDeletedCopyOrMove: true
|
cppcoreguidelines-special-member-functions.AllowImplicitlyDeletedCopyOrMove: true
|
||||||
|
|||||||
@ -1,319 +0,0 @@
|
|||||||
---
|
|
||||||
name: add-uint-support
|
|
||||||
description: Add unsigned integer (uint) type support to PyTorch operators by updating AT_DISPATCH macros. Use when adding support for uint16, uint32, uint64 types to operators, kernels, or when user mentions enabling unsigned types, barebones unsigned types, or uint support.
|
|
||||||
---
|
|
||||||
|
|
||||||
# Add Unsigned Integer (uint) Support to Operators
|
|
||||||
|
|
||||||
This skill helps add support for unsigned integer types (uint16, uint32, uint64) to PyTorch operators by updating their AT_DISPATCH macros.
|
|
||||||
|
|
||||||
## When to use this skill
|
|
||||||
|
|
||||||
Use this skill when:
|
|
||||||
- Adding uint16, uint32, or uint64 support to an operator
|
|
||||||
- User mentions "unsigned types", "uint support", "barebones unsigned types"
|
|
||||||
- Enabling support for kUInt16, kUInt32, kUInt64 in kernels
|
|
||||||
- Working with operator implementations that need expanded type coverage
|
|
||||||
|
|
||||||
## Quick reference
|
|
||||||
|
|
||||||
**Add unsigned types to existing dispatch:**
|
|
||||||
```cpp
|
|
||||||
// Before
|
|
||||||
AT_DISPATCH_V2(dtype, "op", AT_WRAP([&]() {
|
|
||||||
kernel<scalar_t>();
|
|
||||||
}), AT_EXPAND(AT_ALL_TYPES));
|
|
||||||
|
|
||||||
// After (method 1: add unsigned types explicitly)
|
|
||||||
AT_DISPATCH_V2(dtype, "op", AT_WRAP([&]() {
|
|
||||||
kernel<scalar_t>();
|
|
||||||
}), AT_EXPAND(AT_ALL_TYPES), AT_EXPAND(AT_BAREBONES_UNSIGNED_TYPES));
|
|
||||||
|
|
||||||
// After (method 2: use V2 integral types if AT_INTEGRAL_TYPES present)
|
|
||||||
AT_DISPATCH_V2(dtype, "op", AT_WRAP([&]() {
|
|
||||||
kernel<scalar_t>();
|
|
||||||
}), AT_EXPAND(AT_INTEGRAL_TYPES_V2), AT_EXPAND(AT_FLOATING_TYPES));
|
|
||||||
```
|
|
||||||
|
|
||||||
## Type group reference
|
|
||||||
|
|
||||||
**Unsigned type groups:**
|
|
||||||
- `AT_BAREBONES_UNSIGNED_TYPES`: kUInt16, kUInt32, kUInt64
|
|
||||||
- `AT_INTEGRAL_TYPES_V2`: AT_INTEGRAL_TYPES + AT_BAREBONES_UNSIGNED_TYPES
|
|
||||||
|
|
||||||
**Relationship:**
|
|
||||||
```cpp
|
|
||||||
AT_INTEGRAL_TYPES // kByte, kChar, kInt, kLong, kShort
|
|
||||||
AT_BAREBONES_UNSIGNED_TYPES // kUInt16, kUInt32, kUInt64
|
|
||||||
AT_INTEGRAL_TYPES_V2 // INTEGRAL_TYPES + BAREBONES_UNSIGNED_TYPES
|
|
||||||
```
|
|
||||||
|
|
||||||
## Instructions
|
|
||||||
|
|
||||||
### Step 1: Determine if conversion to V2 is needed
|
|
||||||
|
|
||||||
Check if the file uses AT_DISPATCH_V2:
|
|
||||||
|
|
||||||
**If using old AT_DISPATCH:**
|
|
||||||
- First convert to AT_DISPATCH_V2 using the at-dispatch-v2 skill
|
|
||||||
- Then proceed with adding uint support
|
|
||||||
|
|
||||||
**If already using AT_DISPATCH_V2:**
|
|
||||||
- Proceed directly to Step 2
|
|
||||||
|
|
||||||
### Step 2: Analyze the current dispatch macro
|
|
||||||
|
|
||||||
Identify what type groups are currently in use:
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
AT_DISPATCH_V2(dtype, "op", AT_WRAP([&]() {
|
|
||||||
// body
|
|
||||||
}), AT_EXPAND(AT_ALL_TYPES), kHalf, kBFloat16);
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
Current type coverage
|
|
||||||
```
|
|
||||||
|
|
||||||
Common patterns:
|
|
||||||
- `AT_EXPAND(AT_ALL_TYPES)` → includes AT_INTEGRAL_TYPES + AT_FLOATING_TYPES
|
|
||||||
- `AT_EXPAND(AT_INTEGRAL_TYPES)` → signed integers only
|
|
||||||
- `AT_EXPAND(AT_FLOATING_TYPES)` → floating point types
|
|
||||||
|
|
||||||
### Step 3: Choose the uint addition method
|
|
||||||
|
|
||||||
Two approaches:
|
|
||||||
|
|
||||||
**Method 1: Add AT_BAREBONES_UNSIGNED_TYPES explicitly**
|
|
||||||
- Use when: You want to be explicit about adding uint support
|
|
||||||
- Add `AT_EXPAND(AT_BAREBONES_UNSIGNED_TYPES)` to the type list
|
|
||||||
|
|
||||||
**Method 2: Substitute AT_INTEGRAL_TYPES with AT_INTEGRAL_TYPES_V2**
|
|
||||||
- Use when: The dispatch already uses `AT_EXPAND(AT_INTEGRAL_TYPES)`
|
|
||||||
- More concise: replaces one type group with its superset
|
|
||||||
- Only applicable if AT_INTEGRAL_TYPES is present
|
|
||||||
|
|
||||||
### Step 4: Apply the transformation
|
|
||||||
|
|
||||||
**Method 1 example:**
|
|
||||||
```cpp
|
|
||||||
// Before
|
|
||||||
AT_DISPATCH_V2(
|
|
||||||
dtype,
|
|
||||||
"min_values_cuda",
|
|
||||||
AT_WRAP([&]() {
|
|
||||||
kernel_impl<scalar_t>(iter);
|
|
||||||
}),
|
|
||||||
AT_EXPAND(AT_ALL_TYPES),
|
|
||||||
kBFloat16, kHalf, kBool
|
|
||||||
);
|
|
||||||
|
|
||||||
// After (add unsigned types)
|
|
||||||
AT_DISPATCH_V2(
|
|
||||||
dtype,
|
|
||||||
"min_values_cuda",
|
|
||||||
AT_WRAP([&]() {
|
|
||||||
kernel_impl<scalar_t>(iter);
|
|
||||||
}),
|
|
||||||
AT_EXPAND(AT_ALL_TYPES),
|
|
||||||
AT_EXPAND(AT_BAREBONES_UNSIGNED_TYPES),
|
|
||||||
kBFloat16, kHalf, kBool
|
|
||||||
);
|
|
||||||
```
|
|
||||||
|
|
||||||
**Method 2 example:**
|
|
||||||
```cpp
|
|
||||||
// Before
|
|
||||||
AT_DISPATCH_V2(
|
|
||||||
dtype,
|
|
||||||
"integral_op",
|
|
||||||
AT_WRAP([&]() {
|
|
||||||
kernel<scalar_t>();
|
|
||||||
}),
|
|
||||||
AT_EXPAND(AT_INTEGRAL_TYPES)
|
|
||||||
);
|
|
||||||
|
|
||||||
// After (substitute with V2)
|
|
||||||
AT_DISPATCH_V2(
|
|
||||||
dtype,
|
|
||||||
"integral_op",
|
|
||||||
AT_WRAP([&]() {
|
|
||||||
kernel<scalar_t>();
|
|
||||||
}),
|
|
||||||
AT_EXPAND(AT_INTEGRAL_TYPES_V2)
|
|
||||||
);
|
|
||||||
```
|
|
||||||
|
|
||||||
### Step 5: Handle AT_ALL_TYPES vs individual type groups
|
|
||||||
|
|
||||||
If the dispatch uses `AT_EXPAND(AT_ALL_TYPES)`:
|
|
||||||
- `AT_ALL_TYPES` = `AT_INTEGRAL_TYPES` + `AT_FLOATING_TYPES`
|
|
||||||
- To add uint: add `AT_EXPAND(AT_BAREBONES_UNSIGNED_TYPES)` to the list
|
|
||||||
|
|
||||||
If the dispatch separately lists INTEGRAL and FLOATING:
|
|
||||||
```cpp
|
|
||||||
// Before
|
|
||||||
AT_EXPAND(AT_INTEGRAL_TYPES), AT_EXPAND(AT_FLOATING_TYPES)
|
|
||||||
|
|
||||||
// After (Method 2 preferred)
|
|
||||||
AT_EXPAND(AT_INTEGRAL_TYPES_V2), AT_EXPAND(AT_FLOATING_TYPES)
|
|
||||||
```
|
|
||||||
|
|
||||||
### Step 6: Verify all dispatch sites
|
|
||||||
|
|
||||||
Check the file for ALL dispatch macros that need uint support:
|
|
||||||
- Some operators have multiple dispatch sites (CPU, CUDA, different functions)
|
|
||||||
- Apply the transformation consistently across all sites
|
|
||||||
- Ensure each gets the same type coverage updates
|
|
||||||
|
|
||||||
### Step 7: Validate the changes
|
|
||||||
|
|
||||||
Check that:
|
|
||||||
- [ ] AT_DISPATCH_V2 format is used (not old AT_DISPATCH)
|
|
||||||
- [ ] Unsigned types are added via one of the two methods
|
|
||||||
- [ ] All relevant dispatch sites in the file are updated
|
|
||||||
- [ ] Type groups use `AT_EXPAND()`
|
|
||||||
- [ ] Arguments are properly formatted and comma-separated
|
|
||||||
|
|
||||||
## Common patterns
|
|
||||||
|
|
||||||
### Pattern 1: AT_ALL_TYPES + extras
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
// Before
|
|
||||||
AT_DISPATCH_V2(dtype, "op", AT_WRAP([&]() {
|
|
||||||
kernel<scalar_t>();
|
|
||||||
}), AT_EXPAND(AT_ALL_TYPES), kHalf, kBFloat16);
|
|
||||||
|
|
||||||
// After
|
|
||||||
AT_DISPATCH_V2(dtype, "op", AT_WRAP([&]() {
|
|
||||||
kernel<scalar_t>();
|
|
||||||
}), AT_EXPAND(AT_ALL_TYPES), AT_EXPAND(AT_BAREBONES_UNSIGNED_TYPES), kHalf, kBFloat16);
|
|
||||||
```
|
|
||||||
|
|
||||||
### Pattern 2: Separate INTEGRAL + FLOATING
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
// Before
|
|
||||||
AT_DISPATCH_V2(dtype, "op", AT_WRAP([&]() {
|
|
||||||
kernel<scalar_t>();
|
|
||||||
}), AT_EXPAND(AT_INTEGRAL_TYPES), AT_EXPAND(AT_FLOATING_TYPES));
|
|
||||||
|
|
||||||
// After
|
|
||||||
AT_DISPATCH_V2(dtype, "op", AT_WRAP([&]() {
|
|
||||||
kernel<scalar_t>();
|
|
||||||
}), AT_EXPAND(AT_INTEGRAL_TYPES_V2), AT_EXPAND(AT_FLOATING_TYPES));
|
|
||||||
```
|
|
||||||
|
|
||||||
### Pattern 3: Old dispatch needs conversion first
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
// Before (needs v2 conversion first)
|
|
||||||
AT_DISPATCH_ALL_TYPES_AND2(kHalf, kBFloat16, dtype, "op", [&]() {
|
|
||||||
kernel<scalar_t>();
|
|
||||||
});
|
|
||||||
|
|
||||||
// After v2 conversion
|
|
||||||
AT_DISPATCH_V2(dtype, "op", AT_WRAP([&]() {
|
|
||||||
kernel<scalar_t>();
|
|
||||||
}), AT_EXPAND(AT_ALL_TYPES), kHalf, kBFloat16);
|
|
||||||
|
|
||||||
// After adding uint support
|
|
||||||
AT_DISPATCH_V2(dtype, "op", AT_WRAP([&]() {
|
|
||||||
kernel<scalar_t>();
|
|
||||||
}), AT_EXPAND(AT_ALL_TYPES), AT_EXPAND(AT_BAREBONES_UNSIGNED_TYPES), kHalf, kBFloat16);
|
|
||||||
```
|
|
||||||
|
|
||||||
## Multiple dispatch sites example
|
|
||||||
|
|
||||||
For a file with multiple functions:
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
void min_values_kernel_cuda(TensorIterator& iter) {
|
|
||||||
AT_DISPATCH_V2(iter.dtype(), "min_values_cuda", AT_WRAP([&]() {
|
|
||||||
impl<scalar_t>(iter);
|
|
||||||
}), AT_EXPAND(AT_ALL_TYPES), AT_EXPAND(AT_BAREBONES_UNSIGNED_TYPES), kBFloat16, kHalf);
|
|
||||||
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
// Added uint support
|
|
||||||
}
|
|
||||||
|
|
||||||
void min_launch_kernel(TensorIterator &iter) {
|
|
||||||
AT_DISPATCH_V2(iter.input_dtype(), "min_cuda", AT_WRAP([&]() {
|
|
||||||
gpu_reduce_kernel<scalar_t>(iter);
|
|
||||||
}), AT_EXPAND(AT_ALL_TYPES), AT_EXPAND(AT_BAREBONES_UNSIGNED_TYPES), kBFloat16, kHalf);
|
|
||||||
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
// Added uint support here too
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## Decision tree
|
|
||||||
|
|
||||||
Use this decision tree to determine the approach:
|
|
||||||
|
|
||||||
```
|
|
||||||
Is the file using AT_DISPATCH_V2?
|
|
||||||
├─ No → Use at-dispatch-v2 skill first, then continue
|
|
||||||
└─ Yes
|
|
||||||
└─ Does it use AT_EXPAND(AT_INTEGRAL_TYPES)?
|
|
||||||
├─ Yes → Replace with AT_EXPAND(AT_INTEGRAL_TYPES_V2)
|
|
||||||
└─ No → Add AT_EXPAND(AT_BAREBONES_UNSIGNED_TYPES) to type list
|
|
||||||
```
|
|
||||||
|
|
||||||
## Edge cases
|
|
||||||
|
|
||||||
### Case 1: Dispatch with only floating types
|
|
||||||
|
|
||||||
If the operator only supports floating point types, don't add uint support:
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
// Leave as-is - floating point only operator
|
|
||||||
AT_DISPATCH_V2(dtype, "float_op", AT_WRAP([&]() {
|
|
||||||
kernel<scalar_t>();
|
|
||||||
}), AT_EXPAND(AT_FLOATING_TYPES), kHalf);
|
|
||||||
```
|
|
||||||
|
|
||||||
### Case 2: Complex types present
|
|
||||||
|
|
||||||
Unsigned types work alongside complex types:
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
AT_DISPATCH_V2(dtype, "op", AT_WRAP([&]() {
|
|
||||||
kernel<scalar_t>();
|
|
||||||
}), AT_EXPAND(AT_ALL_TYPES),
|
|
||||||
AT_EXPAND(AT_BAREBONES_UNSIGNED_TYPES),
|
|
||||||
AT_EXPAND(AT_COMPLEX_TYPES),
|
|
||||||
kHalf, kBFloat16);
|
|
||||||
```
|
|
||||||
|
|
||||||
### Case 3: Already has uint support
|
|
||||||
|
|
||||||
Check if uint types are already present:
|
|
||||||
- If `AT_INTEGRAL_TYPES_V2` is used → already has uint support
|
|
||||||
- If `AT_BAREBONES_UNSIGNED_TYPES` is already in list → already has uint support
|
|
||||||
- Skip the file if uint support is already present
|
|
||||||
|
|
||||||
## Workflow
|
|
||||||
|
|
||||||
When asked to add uint support:
|
|
||||||
|
|
||||||
1. Read the target file
|
|
||||||
2. Check if using AT_DISPATCH_V2:
|
|
||||||
- If not → use at-dispatch-v2 skill first
|
|
||||||
3. Identify all dispatch macro sites
|
|
||||||
4. For each dispatch:
|
|
||||||
- Analyze current type groups
|
|
||||||
- Choose method (add BAREBONES_UNSIGNED or upgrade to V2)
|
|
||||||
- Apply transformation with Edit tool
|
|
||||||
5. Show the user the changes
|
|
||||||
6. Explain what was modified
|
|
||||||
|
|
||||||
## Important notes
|
|
||||||
|
|
||||||
- Always check if v2 conversion is needed first
|
|
||||||
- Apply changes consistently across all dispatch sites in the file
|
|
||||||
- Method 2 (AT_INTEGRAL_TYPES_V2) is cleaner when applicable
|
|
||||||
- Method 1 (explicit AT_BAREBONES_UNSIGNED_TYPES) is more explicit
|
|
||||||
- Unsigned types are: kUInt16, kUInt32, kUInt64 (not kByte which is uint8)
|
|
||||||
- Some operators may not semantically support unsigned types - use judgment
|
|
||||||
|
|
||||||
## Testing
|
|
||||||
|
|
||||||
After adding uint support, the operator should accept uint16, uint32, and uint64 tensors. The user is responsible for functional testing.
|
|
||||||
@ -1,305 +0,0 @@
|
|||||||
---
|
|
||||||
name: at-dispatch-v2
|
|
||||||
description: Convert PyTorch AT_DISPATCH macros to AT_DISPATCH_V2 format in ATen C++ code. Use when porting AT_DISPATCH_ALL_TYPES_AND*, AT_DISPATCH_FLOATING_TYPES*, or other dispatch macros to the new v2 API. For ATen kernel files, CUDA kernels, and native operator implementations.
|
|
||||||
---
|
|
||||||
|
|
||||||
# AT_DISPATCH to AT_DISPATCH_V2 Converter
|
|
||||||
|
|
||||||
This skill helps convert PyTorch's legacy AT_DISPATCH macros to the new AT_DISPATCH_V2 format, as defined in `aten/src/ATen/Dispatch_v2.h`.
|
|
||||||
|
|
||||||
## When to use this skill
|
|
||||||
|
|
||||||
Use this skill when:
|
|
||||||
- Converting AT_DISPATCH_* macros to AT_DISPATCH_V2
|
|
||||||
- Porting ATen kernels to use the new dispatch API
|
|
||||||
- Working with files in `aten/src/ATen/native/` that use dispatch macros
|
|
||||||
- User mentions "AT_DISPATCH", "dispatch v2", "Dispatch_v2.h", or macro conversion
|
|
||||||
|
|
||||||
## Quick reference
|
|
||||||
|
|
||||||
**Old format:**
|
|
||||||
```cpp
|
|
||||||
AT_DISPATCH_ALL_TYPES_AND3(kBFloat16, kHalf, kBool, dtype, "kernel_name", [&]() {
|
|
||||||
// lambda body
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
**New format:**
|
|
||||||
```cpp
|
|
||||||
AT_DISPATCH_V2(dtype, "kernel_name", AT_WRAP([&]() {
|
|
||||||
// lambda body
|
|
||||||
}), AT_EXPAND(AT_ALL_TYPES), kBFloat16, kHalf, kBool);
|
|
||||||
```
|
|
||||||
|
|
||||||
## Key transformations
|
|
||||||
|
|
||||||
1. **Reorder arguments**: `scalar_type` and `name` come first, then lambda, then types
|
|
||||||
2. **Wrap the lambda**: Use `AT_WRAP(lambda)` to handle internal commas
|
|
||||||
3. **Expand type groups**: Use `AT_EXPAND(AT_ALL_TYPES)` instead of implicit expansion
|
|
||||||
4. **List individual types**: Add extra types (kHalf, kBFloat16, etc.) after expanded groups
|
|
||||||
5. **Add include**: `#include <ATen/Dispatch_v2.h>` near other Dispatch includes
|
|
||||||
|
|
||||||
## Instructions
|
|
||||||
|
|
||||||
### Step 1: Add the Dispatch_v2.h include
|
|
||||||
|
|
||||||
Add the v2 header near the existing `#include <ATen/Dispatch.h>`:
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
#include <ATen/Dispatch.h>
|
|
||||||
#include <ATen/Dispatch_v2.h>
|
|
||||||
```
|
|
||||||
|
|
||||||
Keep the old Dispatch.h include for now (other code may still need it).
|
|
||||||
|
|
||||||
### Step 2: Identify the old dispatch pattern
|
|
||||||
|
|
||||||
Common patterns to convert:
|
|
||||||
|
|
||||||
- `AT_DISPATCH_ALL_TYPES_AND{2,3,4}(type1, type2, ..., scalar_type, name, lambda)`
|
|
||||||
- `AT_DISPATCH_FLOATING_TYPES_AND{2,3}(type1, type2, ..., scalar_type, name, lambda)`
|
|
||||||
- `AT_DISPATCH_ALL_TYPES_AND_COMPLEX_AND{2,3}(type1, ..., scalar_type, name, lambda)`
|
|
||||||
- `AT_DISPATCH_FLOATING_AND_COMPLEX_TYPES_AND{2,3}(type1, ..., scalar_type, name, lambda)`
|
|
||||||
|
|
||||||
### Step 3: Map the old macro to type groups
|
|
||||||
|
|
||||||
Identify which type group macro corresponds to the base types:
|
|
||||||
|
|
||||||
| Old macro base | AT_DISPATCH_V2 type group |
|
|
||||||
|----------------|---------------------------|
|
|
||||||
| `ALL_TYPES` | `AT_EXPAND(AT_ALL_TYPES)` |
|
|
||||||
| `FLOATING_TYPES` | `AT_EXPAND(AT_FLOATING_TYPES)` |
|
|
||||||
| `INTEGRAL_TYPES` | `AT_EXPAND(AT_INTEGRAL_TYPES)` |
|
|
||||||
| `COMPLEX_TYPES` | `AT_EXPAND(AT_COMPLEX_TYPES)` |
|
|
||||||
| `ALL_TYPES_AND_COMPLEX` | `AT_EXPAND(AT_ALL_TYPES_AND_COMPLEX)` |
|
|
||||||
|
|
||||||
For combined patterns, use multiple `AT_EXPAND()` entries:
|
|
||||||
```cpp
|
|
||||||
// Old: AT_DISPATCH_ALL_TYPES_AND_COMPLEX_AND2(...)
|
|
||||||
// New: AT_EXPAND(AT_ALL_TYPES), AT_EXPAND(AT_COMPLEX_TYPES), type1, type2
|
|
||||||
```
|
|
||||||
|
|
||||||
### Step 4: Extract the individual types
|
|
||||||
|
|
||||||
From `AT_DISPATCH_*_AND2(type1, type2, ...)` or `AT_DISPATCH_*_AND3(type1, type2, type3, ...)`, extract the individual types (type1, type2, etc.).
|
|
||||||
|
|
||||||
These become the trailing arguments after the type group:
|
|
||||||
```cpp
|
|
||||||
AT_DISPATCH_V2(..., AT_EXPAND(AT_ALL_TYPES), kBFloat16, kHalf, kBool)
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
Individual types from AND3
|
|
||||||
```
|
|
||||||
|
|
||||||
### Step 5: Transform to AT_DISPATCH_V2
|
|
||||||
|
|
||||||
Apply the transformation:
|
|
||||||
|
|
||||||
**Pattern:**
|
|
||||||
```cpp
|
|
||||||
AT_DISPATCH_V2(
|
|
||||||
scalar_type, // 1st: The dtype expression
|
|
||||||
"name", // 2nd: The debug string
|
|
||||||
AT_WRAP(lambda), // 3rd: The lambda wrapped in AT_WRAP
|
|
||||||
type_groups, // 4th+: Type groups with AT_EXPAND()
|
|
||||||
individual_types // Last: Individual types
|
|
||||||
)
|
|
||||||
```
|
|
||||||
|
|
||||||
**Example transformation:**
|
|
||||||
```cpp
|
|
||||||
// BEFORE
|
|
||||||
AT_DISPATCH_ALL_TYPES_AND3(
|
|
||||||
kBFloat16, kHalf, kBool,
|
|
||||||
iter.dtype(),
|
|
||||||
"min_values_cuda",
|
|
||||||
[&]() {
|
|
||||||
min_values_kernel_cuda_impl<scalar_t>(iter);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
// AFTER
|
|
||||||
AT_DISPATCH_V2(
|
|
||||||
iter.dtype(),
|
|
||||||
"min_values_cuda",
|
|
||||||
AT_WRAP([&]() {
|
|
||||||
min_values_kernel_cuda_impl<scalar_t>(iter);
|
|
||||||
}),
|
|
||||||
AT_EXPAND(AT_ALL_TYPES),
|
|
||||||
kBFloat16, kHalf, kBool
|
|
||||||
);
|
|
||||||
```
|
|
||||||
|
|
||||||
### Step 6: Handle multi-line lambdas
|
|
||||||
|
|
||||||
For lambdas with internal commas or complex expressions, AT_WRAP is essential:
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
AT_DISPATCH_V2(
|
|
||||||
dtype,
|
|
||||||
"complex_kernel",
|
|
||||||
AT_WRAP([&]() {
|
|
||||||
gpu_reduce_kernel<scalar_t, scalar_t>(
|
|
||||||
iter,
|
|
||||||
MinOps<scalar_t>{},
|
|
||||||
thrust::pair<scalar_t, int64_t>(upper_bound(), 0) // Commas inside!
|
|
||||||
);
|
|
||||||
}),
|
|
||||||
AT_EXPAND(AT_ALL_TYPES)
|
|
||||||
);
|
|
||||||
```
|
|
||||||
|
|
||||||
### Step 7: Verify the conversion
|
|
||||||
|
|
||||||
Check that:
|
|
||||||
- [ ] `AT_WRAP()` wraps the entire lambda
|
|
||||||
- [ ] Type groups use `AT_EXPAND()`
|
|
||||||
- [ ] Individual types don't have `AT_EXPAND()` (just `kBFloat16`, not `AT_EXPAND(kBFloat16)`)
|
|
||||||
- [ ] Argument order is: scalar_type, name, lambda, types
|
|
||||||
- [ ] Include added: `#include <ATen/Dispatch_v2.h>`
|
|
||||||
|
|
||||||
## Type group reference
|
|
||||||
|
|
||||||
Available type group macros (use with `AT_EXPAND()`):
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
AT_INTEGRAL_TYPES // kByte, kChar, kInt, kLong, kShort
|
|
||||||
AT_FLOATING_TYPES // kDouble, kFloat
|
|
||||||
AT_COMPLEX_TYPES // kComplexDouble, kComplexFloat
|
|
||||||
AT_QINT_TYPES // kQInt8, kQUInt8, kQInt32
|
|
||||||
AT_ALL_TYPES // INTEGRAL_TYPES + FLOATING_TYPES
|
|
||||||
AT_ALL_TYPES_AND_COMPLEX // ALL_TYPES + COMPLEX_TYPES
|
|
||||||
AT_INTEGRAL_TYPES_V2 // INTEGRAL_TYPES + unsigned types
|
|
||||||
AT_BAREBONES_UNSIGNED_TYPES // kUInt16, kUInt32, kUInt64
|
|
||||||
AT_FLOAT8_TYPES // Float8 variants
|
|
||||||
```
|
|
||||||
|
|
||||||
## Common patterns
|
|
||||||
|
|
||||||
### Pattern: AT_DISPATCH_ALL_TYPES_AND2
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
// Before
|
|
||||||
AT_DISPATCH_ALL_TYPES_AND2(kHalf, kBFloat16, dtype, "op", [&]() {
|
|
||||||
kernel<scalar_t>(data);
|
|
||||||
});
|
|
||||||
|
|
||||||
// After
|
|
||||||
AT_DISPATCH_V2(dtype, "op", AT_WRAP([&]() {
|
|
||||||
kernel<scalar_t>(data);
|
|
||||||
}), AT_EXPAND(AT_ALL_TYPES), kHalf, kBFloat16);
|
|
||||||
```
|
|
||||||
|
|
||||||
### Pattern: AT_DISPATCH_FLOATING_TYPES_AND3
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
// Before
|
|
||||||
AT_DISPATCH_FLOATING_TYPES_AND3(kHalf, kBFloat16, kFloat8_e4m3fn,
|
|
||||||
tensor.scalar_type(), "float_op", [&] {
|
|
||||||
process<scalar_t>(tensor);
|
|
||||||
});
|
|
||||||
|
|
||||||
// After
|
|
||||||
AT_DISPATCH_V2(tensor.scalar_type(), "float_op", AT_WRAP([&] {
|
|
||||||
process<scalar_t>(tensor);
|
|
||||||
}), AT_EXPAND(AT_FLOATING_TYPES), kHalf, kBFloat16, kFloat8_e4m3fn);
|
|
||||||
```
|
|
||||||
|
|
||||||
### Pattern: AT_DISPATCH_ALL_TYPES_AND_COMPLEX_AND2
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
// Before
|
|
||||||
AT_DISPATCH_ALL_TYPES_AND_COMPLEX_AND2(
|
|
||||||
kComplexHalf, kHalf,
|
|
||||||
self.scalar_type(),
|
|
||||||
"complex_op",
|
|
||||||
[&] {
|
|
||||||
result = compute<scalar_t>(self);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
// After
|
|
||||||
AT_DISPATCH_V2(
|
|
||||||
self.scalar_type(),
|
|
||||||
"complex_op",
|
|
||||||
AT_WRAP([&] {
|
|
||||||
result = compute<scalar_t>(self);
|
|
||||||
}),
|
|
||||||
AT_EXPAND(AT_ALL_TYPES),
|
|
||||||
AT_EXPAND(AT_COMPLEX_TYPES),
|
|
||||||
kComplexHalf,
|
|
||||||
kHalf
|
|
||||||
);
|
|
||||||
```
|
|
||||||
|
|
||||||
## Edge cases
|
|
||||||
|
|
||||||
### Case 1: No extra types (rare)
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
// Before
|
|
||||||
AT_DISPATCH_ALL_TYPES(dtype, "op", [&]() { kernel<scalar_t>(); });
|
|
||||||
|
|
||||||
// After
|
|
||||||
AT_DISPATCH_V2(dtype, "op", AT_WRAP([&]() {
|
|
||||||
kernel<scalar_t>();
|
|
||||||
}), AT_EXPAND(AT_ALL_TYPES));
|
|
||||||
```
|
|
||||||
|
|
||||||
### Case 2: Many individual types (AND4, AND5, etc.)
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
// Before
|
|
||||||
AT_DISPATCH_FLOATING_TYPES_AND4(kHalf, kBFloat16, kFloat8_e4m3fn, kFloat8_e5m2,
|
|
||||||
dtype, "float8_op", [&]() { kernel<scalar_t>(); });
|
|
||||||
|
|
||||||
// After
|
|
||||||
AT_DISPATCH_V2(dtype, "float8_op", AT_WRAP([&]() {
|
|
||||||
kernel<scalar_t>();
|
|
||||||
}), AT_EXPAND(AT_FLOATING_TYPES), kHalf, kBFloat16, kFloat8_e4m3fn, kFloat8_e5m2);
|
|
||||||
```
|
|
||||||
|
|
||||||
### Case 3: Lambda with no captures
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
// Before
|
|
||||||
AT_DISPATCH_ALL_TYPES_AND2(kHalf, kBool, dtype, "op", []() {
|
|
||||||
static_kernel<scalar_t>();
|
|
||||||
});
|
|
||||||
|
|
||||||
// After
|
|
||||||
AT_DISPATCH_V2(dtype, "op", AT_WRAP([]() {
|
|
||||||
static_kernel<scalar_t>();
|
|
||||||
}), AT_EXPAND(AT_ALL_TYPES), kHalf, kBool);
|
|
||||||
```
|
|
||||||
|
|
||||||
## Benefits of AT_DISPATCH_V2
|
|
||||||
|
|
||||||
1. **No arity in macro name**: Don't need different macros for AND2, AND3, AND4
|
|
||||||
2. **Composable type sets**: Mix and match type groups with `AT_EXPAND()`
|
|
||||||
3. **Extensible**: Easy to add more types without hitting macro limits
|
|
||||||
4. **Clearer**: Type groups are explicit, not implicit in macro name
|
|
||||||
|
|
||||||
## Important notes
|
|
||||||
|
|
||||||
- Keep `#include <ATen/Dispatch.h>` - other code may need it
|
|
||||||
- The `AT_WRAP()` is mandatory - prevents comma parsing issues in the lambda
|
|
||||||
- Type groups need `AT_EXPAND()`, individual types don't
|
|
||||||
- The v2 API is in `aten/src/ATen/Dispatch_v2.h` - refer to it for full docs
|
|
||||||
- See the header file for the Python script to regenerate the macro implementation
|
|
||||||
|
|
||||||
## Workflow
|
|
||||||
|
|
||||||
When asked to convert AT_DISPATCH macros:
|
|
||||||
|
|
||||||
1. Read the file to identify all AT_DISPATCH uses
|
|
||||||
2. Add `#include <ATen/Dispatch_v2.h>` if not present
|
|
||||||
3. For each dispatch macro:
|
|
||||||
- Identify the pattern and extract components
|
|
||||||
- Map the base type group
|
|
||||||
- Extract individual types
|
|
||||||
- Construct the AT_DISPATCH_V2 call
|
|
||||||
- Apply with Edit tool
|
|
||||||
4. Show the user the complete converted file
|
|
||||||
5. Explain what was changed
|
|
||||||
|
|
||||||
Do NOT compile or test the code - focus on accurate conversion only.
|
|
||||||
@ -1,359 +0,0 @@
|
|||||||
---
|
|
||||||
name: docstring
|
|
||||||
description: Write docstrings for PyTorch functions and methods following PyTorch conventions. Use when writing or updating docstrings in PyTorch code.
|
|
||||||
---
|
|
||||||
|
|
||||||
# PyTorch Docstring Writing Guide
|
|
||||||
|
|
||||||
This skill describes how to write docstrings for functions and methods in the PyTorch project, following the conventions in `torch/_tensor_docs.py` and `torch/nn/functional.py`.
|
|
||||||
|
|
||||||
## General Principles
|
|
||||||
|
|
||||||
- Use **raw strings** (`r"""..."""`) for all docstrings to avoid issues with LaTeX/math backslashes
|
|
||||||
- Follow **Sphinx/reStructuredText** (reST) format for documentation
|
|
||||||
- Be **concise but complete** - include all essential information
|
|
||||||
- Always include **examples** when possible
|
|
||||||
- Use **cross-references** to related functions/classes
|
|
||||||
|
|
||||||
## Docstring Structure
|
|
||||||
|
|
||||||
### 1. Function Signature (First Line)
|
|
||||||
|
|
||||||
Start with the function signature showing all parameters:
|
|
||||||
|
|
||||||
```python
|
|
||||||
r"""function_name(param1, param2, *, kwarg1=default1, kwarg2=default2) -> ReturnType
|
|
||||||
```
|
|
||||||
|
|
||||||
**Notes:**
|
|
||||||
- Include the function name
|
|
||||||
- Show positional and keyword-only arguments (use `*` separator)
|
|
||||||
- Include default values
|
|
||||||
- Show return type annotation
|
|
||||||
- This line should NOT end with a period
|
|
||||||
|
|
||||||
### 2. Brief Description
|
|
||||||
|
|
||||||
Provide a one-line description of what the function does:
|
|
||||||
|
|
||||||
```python
|
|
||||||
r"""conv2d(input, weight, bias=None, stride=1, padding=0, dilation=1, groups=1) -> Tensor
|
|
||||||
|
|
||||||
Applies a 2D convolution over an input image composed of several input
|
|
||||||
planes.
|
|
||||||
```
|
|
||||||
|
|
||||||
### 3. Mathematical Formulas (if applicable)
|
|
||||||
|
|
||||||
Use Sphinx math directives for mathematical expressions:
|
|
||||||
|
|
||||||
```python
|
|
||||||
.. math::
|
|
||||||
\text{Softmax}(x_{i}) = \frac{\exp(x_i)}{\sum_j \exp(x_j)}
|
|
||||||
```
|
|
||||||
|
|
||||||
Or inline math: `:math:\`x^2\``
|
|
||||||
|
|
||||||
### 4. Cross-References
|
|
||||||
|
|
||||||
Link to related classes and functions using Sphinx roles:
|
|
||||||
|
|
||||||
- `:class:\`~torch.nn.ModuleName\`` - Link to a class
|
|
||||||
- `:func:\`torch.function_name\`` - Link to a function
|
|
||||||
- `:meth:\`~Tensor.method_name\`` - Link to a method
|
|
||||||
- `:attr:\`attribute_name\`` - Reference an attribute
|
|
||||||
- The `~` prefix shows only the last component (e.g., `Conv2d` instead of `torch.nn.Conv2d`)
|
|
||||||
|
|
||||||
**Example:**
|
|
||||||
```python
|
|
||||||
See :class:`~torch.nn.Conv2d` for details and output shape.
|
|
||||||
```
|
|
||||||
|
|
||||||
### 5. Notes and Warnings
|
|
||||||
|
|
||||||
Use admonitions for important information:
|
|
||||||
|
|
||||||
```python
|
|
||||||
.. note::
|
|
||||||
This function doesn't work directly with NLLLoss,
|
|
||||||
which expects the Log to be computed between the Softmax and itself.
|
|
||||||
Use log_softmax instead (it's faster and has better numerical properties).
|
|
||||||
|
|
||||||
.. warning::
|
|
||||||
:func:`new_tensor` always copies :attr:`data`. If you have a Tensor
|
|
||||||
``data`` and want to avoid a copy, use :func:`torch.Tensor.requires_grad_`
|
|
||||||
or :func:`torch.Tensor.detach`.
|
|
||||||
```
|
|
||||||
|
|
||||||
### 6. Args Section
|
|
||||||
|
|
||||||
Document all parameters with type annotations and descriptions:
|
|
||||||
|
|
||||||
```python
|
|
||||||
Args:
|
|
||||||
input (Tensor): input tensor of shape :math:`(\text{minibatch} , \text{in\_channels} , iH , iW)`
|
|
||||||
weight (Tensor): filters of shape :math:`(\text{out\_channels} , kH , kW)`
|
|
||||||
bias (Tensor, optional): optional bias tensor of shape :math:`(\text{out\_channels})`. Default: ``None``
|
|
||||||
stride (int or tuple): the stride of the convolving kernel. Can be a single number or a
|
|
||||||
tuple `(sH, sW)`. Default: 1
|
|
||||||
```
|
|
||||||
|
|
||||||
**Formatting rules:**
|
|
||||||
- Parameter name in **lowercase**
|
|
||||||
- Type in parentheses: `(Type)`, `(Type, optional)` for optional parameters
|
|
||||||
- Description follows the type
|
|
||||||
- For optional parameters, include "Default: ``value``" at the end
|
|
||||||
- Use double backticks for inline code: ``` ``None`` ```
|
|
||||||
- Indent continuation lines by 2 spaces
|
|
||||||
|
|
||||||
### 7. Keyword Args Section (if applicable)
|
|
||||||
|
|
||||||
Sometimes keyword arguments are documented separately:
|
|
||||||
|
|
||||||
```python
|
|
||||||
Keyword args:
|
|
||||||
dtype (:class:`torch.dtype`, optional): the desired type of returned tensor.
|
|
||||||
Default: if None, same :class:`torch.dtype` as this tensor.
|
|
||||||
device (:class:`torch.device`, optional): the desired device of returned tensor.
|
|
||||||
Default: if None, same :class:`torch.device` as this tensor.
|
|
||||||
requires_grad (bool, optional): If autograd should record operations on the
|
|
||||||
returned tensor. Default: ``False``.
|
|
||||||
```
|
|
||||||
|
|
||||||
### 8. Returns Section (if needed)
|
|
||||||
|
|
||||||
Document the return value:
|
|
||||||
|
|
||||||
```python
|
|
||||||
Returns:
|
|
||||||
Tensor: Sampled tensor of same shape as `logits` from the Gumbel-Softmax distribution.
|
|
||||||
If ``hard=True``, the returned samples will be one-hot, otherwise they will
|
|
||||||
be probability distributions that sum to 1 across `dim`.
|
|
||||||
```
|
|
||||||
|
|
||||||
Or simply include it in the function signature line if obvious from context.
|
|
||||||
|
|
||||||
### 9. Examples Section
|
|
||||||
|
|
||||||
Always include examples when possible:
|
|
||||||
|
|
||||||
```python
|
|
||||||
Examples::
|
|
||||||
|
|
||||||
>>> inputs = torch.randn(33, 16, 30)
|
|
||||||
>>> filters = torch.randn(20, 16, 5)
|
|
||||||
>>> F.conv1d(inputs, filters)
|
|
||||||
|
|
||||||
>>> # With square kernels and equal stride
|
|
||||||
>>> filters = torch.randn(8, 4, 3, 3)
|
|
||||||
>>> inputs = torch.randn(1, 4, 5, 5)
|
|
||||||
>>> F.conv2d(inputs, filters, padding=1)
|
|
||||||
```
|
|
||||||
|
|
||||||
**Formatting rules:**
|
|
||||||
- Use `Examples::` with double colon
|
|
||||||
- Use `>>>` prompt for Python code
|
|
||||||
- Include comments with `#` when helpful
|
|
||||||
- Show actual output when it helps understanding (indent without `>>>`)
|
|
||||||
|
|
||||||
### 10. External References
|
|
||||||
|
|
||||||
Link to papers or external documentation:
|
|
||||||
|
|
||||||
```python
|
|
||||||
.. _Link Name:
|
|
||||||
https://arxiv.org/abs/1611.00712
|
|
||||||
```
|
|
||||||
|
|
||||||
Reference them in text: ```See `Link Name`_```
|
|
||||||
|
|
||||||
## Method Types
|
|
||||||
|
|
||||||
### Native Python Functions
|
|
||||||
|
|
||||||
For regular Python functions, use a standard docstring:
|
|
||||||
|
|
||||||
```python
|
|
||||||
def relu(input: Tensor, inplace: bool = False) -> Tensor:
|
|
||||||
r"""relu(input, inplace=False) -> Tensor
|
|
||||||
|
|
||||||
Applies the rectified linear unit function element-wise. See
|
|
||||||
:class:`~torch.nn.ReLU` for more details.
|
|
||||||
"""
|
|
||||||
# implementation
|
|
||||||
```
|
|
||||||
|
|
||||||
### C-Bound Functions (using add_docstr)
|
|
||||||
|
|
||||||
For C-bound functions, use `_add_docstr`:
|
|
||||||
|
|
||||||
```python
|
|
||||||
conv1d = _add_docstr(
|
|
||||||
torch.conv1d,
|
|
||||||
r"""
|
|
||||||
conv1d(input, weight, bias=None, stride=1, padding=0, dilation=1, groups=1) -> Tensor
|
|
||||||
|
|
||||||
Applies a 1D convolution over an input signal composed of several input
|
|
||||||
planes.
|
|
||||||
|
|
||||||
See :class:`~torch.nn.Conv1d` for details and output shape.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
input: input tensor of shape :math:`(\text{minibatch} , \text{in\_channels} , iW)`
|
|
||||||
weight: filters of shape :math:`(\text{out\_channels} , kW)`
|
|
||||||
...
|
|
||||||
""",
|
|
||||||
)
|
|
||||||
```
|
|
||||||
|
|
||||||
### In-Place Variants
|
|
||||||
|
|
||||||
For in-place operations (ending with `_`), reference the original:
|
|
||||||
|
|
||||||
```python
|
|
||||||
add_docstr_all(
|
|
||||||
"abs_",
|
|
||||||
r"""
|
|
||||||
abs_() -> Tensor
|
|
||||||
|
|
||||||
In-place version of :meth:`~Tensor.abs`
|
|
||||||
""",
|
|
||||||
)
|
|
||||||
```
|
|
||||||
|
|
||||||
### Alias Functions
|
|
||||||
|
|
||||||
For aliases, simply reference the original:
|
|
||||||
|
|
||||||
```python
|
|
||||||
add_docstr_all(
|
|
||||||
"absolute",
|
|
||||||
r"""
|
|
||||||
absolute() -> Tensor
|
|
||||||
|
|
||||||
Alias for :func:`abs`
|
|
||||||
""",
|
|
||||||
)
|
|
||||||
```
|
|
||||||
|
|
||||||
## Common Patterns
|
|
||||||
|
|
||||||
### Shape Documentation
|
|
||||||
|
|
||||||
Use LaTeX math notation for tensor shapes:
|
|
||||||
|
|
||||||
```python
|
|
||||||
:math:`(\text{minibatch} , \text{in\_channels} , iH , iW)`
|
|
||||||
```
|
|
||||||
|
|
||||||
### Reusable Argument Definitions
|
|
||||||
|
|
||||||
For commonly used arguments, define them once and reuse:
|
|
||||||
|
|
||||||
```python
|
|
||||||
common_args = parse_kwargs(
|
|
||||||
"""
|
|
||||||
dtype (:class:`torch.dtype`, optional): the desired type of returned tensor.
|
|
||||||
Default: if None, same as this tensor.
|
|
||||||
"""
|
|
||||||
)
|
|
||||||
|
|
||||||
# Then use with .format():
|
|
||||||
r"""
|
|
||||||
...
|
|
||||||
|
|
||||||
Keyword args:
|
|
||||||
{dtype}
|
|
||||||
{device}
|
|
||||||
""".format(**common_args)
|
|
||||||
```
|
|
||||||
|
|
||||||
### Template Insertion
|
|
||||||
|
|
||||||
Insert reproducibility notes or other common text:
|
|
||||||
|
|
||||||
```python
|
|
||||||
r"""
|
|
||||||
{tf32_note}
|
|
||||||
|
|
||||||
{cudnn_reproducibility_note}
|
|
||||||
""".format(**reproducibility_notes, **tf32_notes)
|
|
||||||
```
|
|
||||||
|
|
||||||
## Complete Example
|
|
||||||
|
|
||||||
Here's a complete example showing all elements:
|
|
||||||
|
|
||||||
```python
|
|
||||||
def gumbel_softmax(
|
|
||||||
logits: Tensor,
|
|
||||||
tau: float = 1,
|
|
||||||
hard: bool = False,
|
|
||||||
eps: float = 1e-10,
|
|
||||||
dim: int = -1,
|
|
||||||
) -> Tensor:
|
|
||||||
r"""
|
|
||||||
Sample from the Gumbel-Softmax distribution and optionally discretize.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
logits (Tensor): `[..., num_features]` unnormalized log probabilities
|
|
||||||
tau (float): non-negative scalar temperature
|
|
||||||
hard (bool): if ``True``, the returned samples will be discretized as one-hot vectors,
|
|
||||||
but will be differentiated as if it is the soft sample in autograd. Default: ``False``
|
|
||||||
dim (int): A dimension along which softmax will be computed. Default: -1
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
Tensor: Sampled tensor of same shape as `logits` from the Gumbel-Softmax distribution.
|
|
||||||
If ``hard=True``, the returned samples will be one-hot, otherwise they will
|
|
||||||
be probability distributions that sum to 1 across `dim`.
|
|
||||||
|
|
||||||
.. note::
|
|
||||||
This function is here for legacy reasons, may be removed from nn.Functional in the future.
|
|
||||||
|
|
||||||
Examples::
|
|
||||||
>>> logits = torch.randn(20, 32)
|
|
||||||
>>> # Sample soft categorical using reparametrization trick:
|
|
||||||
>>> F.gumbel_softmax(logits, tau=1, hard=False)
|
|
||||||
>>> # Sample hard categorical using "Straight-through" trick:
|
|
||||||
>>> F.gumbel_softmax(logits, tau=1, hard=True)
|
|
||||||
|
|
||||||
.. _Link 1:
|
|
||||||
https://arxiv.org/abs/1611.00712
|
|
||||||
"""
|
|
||||||
# implementation
|
|
||||||
```
|
|
||||||
|
|
||||||
## Quick Checklist
|
|
||||||
|
|
||||||
When writing a PyTorch docstring, ensure:
|
|
||||||
|
|
||||||
- [ ] Use raw string (`r"""`)
|
|
||||||
- [ ] Include function signature on first line
|
|
||||||
- [ ] Provide brief description
|
|
||||||
- [ ] Document all parameters in Args section with types
|
|
||||||
- [ ] Include default values for optional parameters
|
|
||||||
- [ ] Use Sphinx cross-references (`:func:`, `:class:`, `:meth:`)
|
|
||||||
- [ ] Add mathematical formulas if applicable
|
|
||||||
- [ ] Include at least one example in Examples section
|
|
||||||
- [ ] Add warnings/notes for important caveats
|
|
||||||
- [ ] Link to related module class with `:class:`
|
|
||||||
- [ ] Use proper math notation for tensor shapes
|
|
||||||
- [ ] Follow consistent formatting and indentation
|
|
||||||
|
|
||||||
## Common Sphinx Roles Reference
|
|
||||||
|
|
||||||
- `:class:\`~torch.nn.Module\`` - Class reference
|
|
||||||
- `:func:\`torch.function\`` - Function reference
|
|
||||||
- `:meth:\`~Tensor.method\`` - Method reference
|
|
||||||
- `:attr:\`attribute\`` - Attribute reference
|
|
||||||
- `:math:\`equation\`` - Inline math
|
|
||||||
- `:ref:\`label\`` - Internal reference
|
|
||||||
- ``` ``code`` ``` - Inline code (use double backticks)
|
|
||||||
|
|
||||||
## Additional Notes
|
|
||||||
|
|
||||||
- **Indentation**: Use 4 spaces for code, 2 spaces for continuation of parameter descriptions
|
|
||||||
- **Line length**: Try to keep lines under 100 characters when possible
|
|
||||||
- **Periods**: End sentences with periods, but not the signature line
|
|
||||||
- **Backticks**: Use double backticks for code: ``` ``True`` ``None`` ``False`` ```
|
|
||||||
- **Types**: Common types are `Tensor`, `int`, `float`, `bool`, `str`, `tuple`, `list`, etc.
|
|
||||||
@ -1,385 +0,0 @@
|
|||||||
---
|
|
||||||
name: skill-writer
|
|
||||||
description: Guide users through creating Agent Skills for Claude Code. Use when the user wants to create, write, author, or design a new Skill, or needs help with SKILL.md files, frontmatter, or skill structure.
|
|
||||||
---
|
|
||||||
|
|
||||||
# Skill Writer
|
|
||||||
|
|
||||||
This Skill helps you create well-structured Agent Skills for Claude Code that follow best practices and validation requirements.
|
|
||||||
|
|
||||||
## When to use this Skill
|
|
||||||
|
|
||||||
Use this Skill when:
|
|
||||||
- Creating a new Agent Skill
|
|
||||||
- Writing or updating SKILL.md files
|
|
||||||
- Designing skill structure and frontmatter
|
|
||||||
- Troubleshooting skill discovery issues
|
|
||||||
- Converting existing prompts or workflows into Skills
|
|
||||||
|
|
||||||
## Instructions
|
|
||||||
|
|
||||||
### Step 1: Determine Skill scope
|
|
||||||
|
|
||||||
First, understand what the Skill should do:
|
|
||||||
|
|
||||||
1. **Ask clarifying questions**:
|
|
||||||
- What specific capability should this Skill provide?
|
|
||||||
- When should Claude use this Skill?
|
|
||||||
- What tools or resources does it need?
|
|
||||||
- Is this for personal use or team sharing?
|
|
||||||
|
|
||||||
2. **Keep it focused**: One Skill = one capability
|
|
||||||
- Good: "PDF form filling", "Excel data analysis"
|
|
||||||
- Too broad: "Document processing", "Data tools"
|
|
||||||
|
|
||||||
### Step 2: Choose Skill location
|
|
||||||
|
|
||||||
Determine where to create the Skill:
|
|
||||||
|
|
||||||
**Personal Skills** (`~/.claude/skills/`):
|
|
||||||
- Individual workflows and preferences
|
|
||||||
- Experimental Skills
|
|
||||||
- Personal productivity tools
|
|
||||||
|
|
||||||
**Project Skills** (`.claude/skills/`):
|
|
||||||
- Team workflows and conventions
|
|
||||||
- Project-specific expertise
|
|
||||||
- Shared utilities (committed to git)
|
|
||||||
|
|
||||||
### Step 3: Create Skill structure
|
|
||||||
|
|
||||||
Create the directory and files:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Personal
|
|
||||||
mkdir -p ~/.claude/skills/skill-name
|
|
||||||
|
|
||||||
# Project
|
|
||||||
mkdir -p .claude/skills/skill-name
|
|
||||||
```
|
|
||||||
|
|
||||||
For multi-file Skills:
|
|
||||||
```
|
|
||||||
skill-name/
|
|
||||||
├── SKILL.md (required)
|
|
||||||
├── reference.md (optional)
|
|
||||||
├── examples.md (optional)
|
|
||||||
├── scripts/
|
|
||||||
│ └── helper.py (optional)
|
|
||||||
└── templates/
|
|
||||||
└── template.txt (optional)
|
|
||||||
```
|
|
||||||
|
|
||||||
### Step 4: Write SKILL.md frontmatter
|
|
||||||
|
|
||||||
Create YAML frontmatter with required fields:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
---
|
|
||||||
name: skill-name
|
|
||||||
description: Brief description of what this does and when to use it
|
|
||||||
---
|
|
||||||
```
|
|
||||||
|
|
||||||
**Field requirements**:
|
|
||||||
|
|
||||||
- **name**:
|
|
||||||
- Lowercase letters, numbers, hyphens only
|
|
||||||
- Max 64 characters
|
|
||||||
- Must match directory name
|
|
||||||
- Good: `pdf-processor`, `git-commit-helper`
|
|
||||||
- Bad: `PDF_Processor`, `Git Commits!`
|
|
||||||
|
|
||||||
- **description**:
|
|
||||||
- Max 1024 characters
|
|
||||||
- Include BOTH what it does AND when to use it
|
|
||||||
- Use specific trigger words users would say
|
|
||||||
- Mention file types, operations, and context
|
|
||||||
|
|
||||||
**Optional frontmatter fields**:
|
|
||||||
|
|
||||||
- **allowed-tools**: Restrict tool access (comma-separated list)
|
|
||||||
```yaml
|
|
||||||
allowed-tools: Read, Grep, Glob
|
|
||||||
```
|
|
||||||
Use for:
|
|
||||||
- Read-only Skills
|
|
||||||
- Security-sensitive workflows
|
|
||||||
- Limited-scope operations
|
|
||||||
|
|
||||||
### Step 5: Write effective descriptions
|
|
||||||
|
|
||||||
The description is critical for Claude to discover your Skill.
|
|
||||||
|
|
||||||
**Formula**: `[What it does] + [When to use it] + [Key triggers]`
|
|
||||||
|
|
||||||
**Examples**:
|
|
||||||
|
|
||||||
✅ **Good**:
|
|
||||||
```yaml
|
|
||||||
description: Extract text and tables from PDF files, fill forms, merge documents. Use when working with PDF files or when the user mentions PDFs, forms, or document extraction.
|
|
||||||
```
|
|
||||||
|
|
||||||
✅ **Good**:
|
|
||||||
```yaml
|
|
||||||
description: Analyze Excel spreadsheets, create pivot tables, and generate charts. Use when working with Excel files, spreadsheets, or analyzing tabular data in .xlsx format.
|
|
||||||
```
|
|
||||||
|
|
||||||
❌ **Too vague**:
|
|
||||||
```yaml
|
|
||||||
description: Helps with documents
|
|
||||||
description: For data analysis
|
|
||||||
```
|
|
||||||
|
|
||||||
**Tips**:
|
|
||||||
- Include specific file extensions (.pdf, .xlsx, .json)
|
|
||||||
- Mention common user phrases ("analyze", "extract", "generate")
|
|
||||||
- List concrete operations (not generic verbs)
|
|
||||||
- Add context clues ("Use when...", "For...")
|
|
||||||
|
|
||||||
### Step 6: Structure the Skill content
|
|
||||||
|
|
||||||
Use clear Markdown sections:
|
|
||||||
|
|
||||||
```markdown
|
|
||||||
# Skill Name
|
|
||||||
|
|
||||||
Brief overview of what this Skill does.
|
|
||||||
|
|
||||||
## Quick start
|
|
||||||
|
|
||||||
Provide a simple example to get started immediately.
|
|
||||||
|
|
||||||
## Instructions
|
|
||||||
|
|
||||||
Step-by-step guidance for Claude:
|
|
||||||
1. First step with clear action
|
|
||||||
2. Second step with expected outcome
|
|
||||||
3. Handle edge cases
|
|
||||||
|
|
||||||
## Examples
|
|
||||||
|
|
||||||
Show concrete usage examples with code or commands.
|
|
||||||
|
|
||||||
## Best practices
|
|
||||||
|
|
||||||
- Key conventions to follow
|
|
||||||
- Common pitfalls to avoid
|
|
||||||
- When to use vs. not use
|
|
||||||
|
|
||||||
## Requirements
|
|
||||||
|
|
||||||
List any dependencies or prerequisites:
|
|
||||||
```bash
|
|
||||||
pip install package-name
|
|
||||||
```
|
|
||||||
|
|
||||||
## Advanced usage
|
|
||||||
|
|
||||||
For complex scenarios, see [reference.md](reference.md).
|
|
||||||
```
|
|
||||||
|
|
||||||
### Step 7: Add supporting files (optional)
|
|
||||||
|
|
||||||
Create additional files for progressive disclosure:
|
|
||||||
|
|
||||||
**reference.md**: Detailed API docs, advanced options
|
|
||||||
**examples.md**: Extended examples and use cases
|
|
||||||
**scripts/**: Helper scripts and utilities
|
|
||||||
**templates/**: File templates or boilerplate
|
|
||||||
|
|
||||||
Reference them from SKILL.md:
|
|
||||||
```markdown
|
|
||||||
For advanced usage, see [reference.md](reference.md).
|
|
||||||
|
|
||||||
Run the helper script:
|
|
||||||
\`\`\`bash
|
|
||||||
python scripts/helper.py input.txt
|
|
||||||
\`\`\`
|
|
||||||
```
|
|
||||||
|
|
||||||
### Step 8: Validate the Skill
|
|
||||||
|
|
||||||
Check these requirements:
|
|
||||||
|
|
||||||
✅ **File structure**:
|
|
||||||
- [ ] SKILL.md exists in correct location
|
|
||||||
- [ ] Directory name matches frontmatter `name`
|
|
||||||
|
|
||||||
✅ **YAML frontmatter**:
|
|
||||||
- [ ] Opening `---` on line 1
|
|
||||||
- [ ] Closing `---` before content
|
|
||||||
- [ ] Valid YAML (no tabs, correct indentation)
|
|
||||||
- [ ] `name` follows naming rules
|
|
||||||
- [ ] `description` is specific and < 1024 chars
|
|
||||||
|
|
||||||
✅ **Content quality**:
|
|
||||||
- [ ] Clear instructions for Claude
|
|
||||||
- [ ] Concrete examples provided
|
|
||||||
- [ ] Edge cases handled
|
|
||||||
- [ ] Dependencies listed (if any)
|
|
||||||
|
|
||||||
✅ **Testing**:
|
|
||||||
- [ ] Description matches user questions
|
|
||||||
- [ ] Skill activates on relevant queries
|
|
||||||
- [ ] Instructions are clear and actionable
|
|
||||||
|
|
||||||
### Step 9: Test the Skill
|
|
||||||
|
|
||||||
1. **Restart Claude Code** (if running) to load the Skill
|
|
||||||
|
|
||||||
2. **Ask relevant questions** that match the description:
|
|
||||||
```
|
|
||||||
Can you help me extract text from this PDF?
|
|
||||||
```
|
|
||||||
|
|
||||||
3. **Verify activation**: Claude should use the Skill automatically
|
|
||||||
|
|
||||||
4. **Check behavior**: Confirm Claude follows the instructions correctly
|
|
||||||
|
|
||||||
### Step 10: Debug if needed
|
|
||||||
|
|
||||||
If Claude doesn't use the Skill:
|
|
||||||
|
|
||||||
1. **Make description more specific**:
|
|
||||||
- Add trigger words
|
|
||||||
- Include file types
|
|
||||||
- Mention common user phrases
|
|
||||||
|
|
||||||
2. **Check file location**:
|
|
||||||
```bash
|
|
||||||
ls ~/.claude/skills/skill-name/SKILL.md
|
|
||||||
ls .claude/skills/skill-name/SKILL.md
|
|
||||||
```
|
|
||||||
|
|
||||||
3. **Validate YAML**:
|
|
||||||
```bash
|
|
||||||
cat SKILL.md | head -n 10
|
|
||||||
```
|
|
||||||
|
|
||||||
4. **Run debug mode**:
|
|
||||||
```bash
|
|
||||||
claude --debug
|
|
||||||
```
|
|
||||||
|
|
||||||
## Common patterns
|
|
||||||
|
|
||||||
### Read-only Skill
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
---
|
|
||||||
name: code-reader
|
|
||||||
description: Read and analyze code without making changes. Use for code review, understanding codebases, or documentation.
|
|
||||||
allowed-tools: Read, Grep, Glob
|
|
||||||
---
|
|
||||||
```
|
|
||||||
|
|
||||||
### Script-based Skill
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
---
|
|
||||||
name: data-processor
|
|
||||||
description: Process CSV and JSON data files with Python scripts. Use when analyzing data files or transforming datasets.
|
|
||||||
---
|
|
||||||
|
|
||||||
# Data Processor
|
|
||||||
|
|
||||||
## Instructions
|
|
||||||
|
|
||||||
1. Use the processing script:
|
|
||||||
\`\`\`bash
|
|
||||||
python scripts/process.py input.csv --output results.json
|
|
||||||
\`\`\`
|
|
||||||
|
|
||||||
2. Validate output with:
|
|
||||||
\`\`\`bash
|
|
||||||
python scripts/validate.py results.json
|
|
||||||
\`\`\`
|
|
||||||
```
|
|
||||||
|
|
||||||
### Multi-file Skill with progressive disclosure
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
---
|
|
||||||
name: api-designer
|
|
||||||
description: Design REST APIs following best practices. Use when creating API endpoints, designing routes, or planning API architecture.
|
|
||||||
---
|
|
||||||
|
|
||||||
# API Designer
|
|
||||||
|
|
||||||
Quick start: See [examples.md](examples.md)
|
|
||||||
|
|
||||||
Detailed reference: See [reference.md](reference.md)
|
|
||||||
|
|
||||||
## Instructions
|
|
||||||
|
|
||||||
1. Gather requirements
|
|
||||||
2. Design endpoints (see examples.md)
|
|
||||||
3. Document with OpenAPI spec
|
|
||||||
4. Review against best practices (see reference.md)
|
|
||||||
```
|
|
||||||
|
|
||||||
## Best practices for Skill authors
|
|
||||||
|
|
||||||
1. **One Skill, one purpose**: Don't create mega-Skills
|
|
||||||
2. **Specific descriptions**: Include trigger words users will say
|
|
||||||
3. **Clear instructions**: Write for Claude, not humans
|
|
||||||
4. **Concrete examples**: Show real code, not pseudocode
|
|
||||||
5. **List dependencies**: Mention required packages in description
|
|
||||||
6. **Test with teammates**: Verify activation and clarity
|
|
||||||
7. **Version your Skills**: Document changes in content
|
|
||||||
8. **Use progressive disclosure**: Put advanced details in separate files
|
|
||||||
|
|
||||||
## Validation checklist
|
|
||||||
|
|
||||||
Before finalizing a Skill, verify:
|
|
||||||
|
|
||||||
- [ ] Name is lowercase, hyphens only, max 64 chars
|
|
||||||
- [ ] Description is specific and < 1024 chars
|
|
||||||
- [ ] Description includes "what" and "when"
|
|
||||||
- [ ] YAML frontmatter is valid
|
|
||||||
- [ ] Instructions are step-by-step
|
|
||||||
- [ ] Examples are concrete and realistic
|
|
||||||
- [ ] Dependencies are documented
|
|
||||||
- [ ] File paths use forward slashes
|
|
||||||
- [ ] Skill activates on relevant queries
|
|
||||||
- [ ] Claude follows instructions correctly
|
|
||||||
|
|
||||||
## Troubleshooting
|
|
||||||
|
|
||||||
**Skill doesn't activate**:
|
|
||||||
- Make description more specific with trigger words
|
|
||||||
- Include file types and operations in description
|
|
||||||
- Add "Use when..." clause with user phrases
|
|
||||||
|
|
||||||
**Multiple Skills conflict**:
|
|
||||||
- Make descriptions more distinct
|
|
||||||
- Use different trigger words
|
|
||||||
- Narrow the scope of each Skill
|
|
||||||
|
|
||||||
**Skill has errors**:
|
|
||||||
- Check YAML syntax (no tabs, proper indentation)
|
|
||||||
- Verify file paths (use forward slashes)
|
|
||||||
- Ensure scripts have execute permissions
|
|
||||||
- List all dependencies
|
|
||||||
|
|
||||||
## Examples
|
|
||||||
|
|
||||||
See the documentation for complete examples:
|
|
||||||
- Simple single-file Skill (commit-helper)
|
|
||||||
- Skill with tool permissions (code-reviewer)
|
|
||||||
- Multi-file Skill (pdf-processing)
|
|
||||||
|
|
||||||
## Output format
|
|
||||||
|
|
||||||
When creating a Skill, I will:
|
|
||||||
|
|
||||||
1. Ask clarifying questions about scope and requirements
|
|
||||||
2. Suggest a Skill name and location
|
|
||||||
3. Create the SKILL.md file with proper frontmatter
|
|
||||||
4. Include clear instructions and examples
|
|
||||||
5. Add supporting files if needed
|
|
||||||
6. Provide testing instructions
|
|
||||||
7. Validate against all requirements
|
|
||||||
|
|
||||||
The result will be a complete, working Skill that follows all best practices and validation rules.
|
|
||||||
10
.flake8
10
.flake8
@ -7,12 +7,16 @@ max-line-length = 120
|
|||||||
# C408 ignored because we like the dict keyword argument syntax
|
# C408 ignored because we like the dict keyword argument syntax
|
||||||
# E501 is not flexible enough, we're using B950 instead
|
# E501 is not flexible enough, we're using B950 instead
|
||||||
ignore =
|
ignore =
|
||||||
E203,E305,E402,E501,E704,E741,F405,F841,F999,W503,W504,C408,E302,W291,E303,F824,
|
E203,E305,E402,E501,E704,E721,E741,F405,F841,F999,W503,W504,C408,E302,W291,E303,F824,
|
||||||
# shebang has extra meaning in fbcode lints, so I think it's not worth trying
|
# shebang has extra meaning in fbcode lints, so I think it's not worth trying
|
||||||
# to line this up with executable bit
|
# to line this up with executable bit
|
||||||
EXE001,
|
EXE001,
|
||||||
# these ignores are from flake8-bugbear; please fix!
|
# these ignores are from flake8-bugbear; please fix!
|
||||||
B007,B008,B017,B019,B023,B028,B903,B905,B906,B907,B908,B910
|
B007,B008,B017,B019,B023,B028,B903,B904,B905,B906,B907,B908,B910
|
||||||
|
# these ignores are from flake8-comprehensions; please fix!
|
||||||
|
C407,
|
||||||
|
# these ignores are from flake8-logging-format; please fix!
|
||||||
|
G100,G101,G200
|
||||||
# these ignores are from flake8-simplify. please fix or ignore with commented reason
|
# these ignores are from flake8-simplify. please fix or ignore with commented reason
|
||||||
SIM105,SIM108,SIM110,SIM111,SIM113,SIM114,SIM115,SIM116,SIM117,SIM118,SIM119,SIM12,
|
SIM105,SIM108,SIM110,SIM111,SIM113,SIM114,SIM115,SIM116,SIM117,SIM118,SIM119,SIM12,
|
||||||
# SIM104 is already covered by pyupgrade ruff
|
# SIM104 is already covered by pyupgrade ruff
|
||||||
@ -69,7 +73,7 @@ exclude =
|
|||||||
./docs/src,
|
./docs/src,
|
||||||
./functorch/docs,
|
./functorch/docs,
|
||||||
./functorch/examples,
|
./functorch/examples,
|
||||||
./functorch/docs/source/tutorials,
|
./functorch/notebooks,
|
||||||
./scripts,
|
./scripts,
|
||||||
./test/generated_type_hints_smoketest.py,
|
./test/generated_type_hints_smoketest.py,
|
||||||
./third_party,
|
./third_party,
|
||||||
|
|||||||
5
.github/ISSUE_TEMPLATE/ci-sev.md
vendored
5
.github/ISSUE_TEMPLATE/ci-sev.md
vendored
@ -1,14 +1,9 @@
|
|||||||
---
|
---
|
||||||
name: "⚠️ CI SEV"
|
name: "⚠️ CI SEV"
|
||||||
about: Tracking incidents for PyTorch's CI infra.
|
about: Tracking incidents for PyTorch's CI infra.
|
||||||
title: ''
|
|
||||||
labels: ''
|
|
||||||
assignees: ''
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
> NOTE: Remember to label this issue with "`ci: sev`"
|
> NOTE: Remember to label this issue with "`ci: sev`"
|
||||||
> If you want autorevert to be disabled, keep the ci: disable-autorevert label
|
|
||||||
|
|
||||||
<!-- Add the `merge blocking` label to this PR to prevent PRs from being merged while this issue is open -->
|
<!-- Add the `merge blocking` label to this PR to prevent PRs from being merged while this issue is open -->
|
||||||
|
|
||||||
|
|||||||
18
.github/ISSUE_TEMPLATE/disable-autorevert.md
vendored
18
.github/ISSUE_TEMPLATE/disable-autorevert.md
vendored
@ -1,18 +0,0 @@
|
|||||||
---
|
|
||||||
name: "D❌\U0001F519 ISABLE AUTOREVERT"
|
|
||||||
about: Disables autorevert when open
|
|
||||||
title: "[DISABLE AUTOREVERT]"
|
|
||||||
labels: 'ci: disable-autorevert'
|
|
||||||
assignees: ''
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
This issue, while open, disables the autorevert functionality.
|
|
||||||
|
|
||||||
More details can be found [here](https://github.com/pytorch/test-infra/blob/main/aws/lambda/pytorch-auto-revert/README.md)
|
|
||||||
|
|
||||||
|
|
||||||
## Why are you disabling autorevert?
|
|
||||||
|
|
||||||
|
|
||||||
## Links to any issues/commits/errors that shows the source of problem
|
|
||||||
6
.github/ISSUE_TEMPLATE/disable-ci-jobs.md
vendored
6
.github/ISSUE_TEMPLATE/disable-ci-jobs.md
vendored
@ -1,10 +1,8 @@
|
|||||||
---
|
---
|
||||||
name: Disable CI jobs (PyTorch Dev Infra only)
|
name: Disable CI jobs (PyTorch Dev Infra only)
|
||||||
about: Use this template to disable CI jobs
|
about: Use this template to disable CI jobs
|
||||||
title: DISABLED [WORKFLOW_NAME] / [PLATFORM_NAME] / [JOB_NAME]
|
title: "DISABLED [WORKFLOW_NAME] / [PLATFORM_NAME] / [JOB_NAME]"
|
||||||
labels: 'module: ci'
|
labels: "module: ci"
|
||||||
assignees: ''
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
> For example, DISABLED pull / win-vs2022-cpu-py3 / test (default). Once
|
> For example, DISABLED pull / win-vs2022-cpu-py3 / test (default). Once
|
||||||
|
|||||||
4
.github/actionlint.yaml
vendored
4
.github/actionlint.yaml
vendored
@ -21,10 +21,6 @@ self-hosted-runner:
|
|||||||
- linux.arm64.2xlarge.ephemeral
|
- linux.arm64.2xlarge.ephemeral
|
||||||
- linux.arm64.m7g.4xlarge
|
- linux.arm64.m7g.4xlarge
|
||||||
- linux.arm64.m7g.4xlarge.ephemeral
|
- linux.arm64.m7g.4xlarge.ephemeral
|
||||||
- linux.arm64.r7g.12xlarge.memory
|
|
||||||
- linux.aws.h100
|
|
||||||
- linux.aws.h100.4
|
|
||||||
- linux.aws.h100.8
|
|
||||||
- linux.4xlarge.nvidia.gpu
|
- linux.4xlarge.nvidia.gpu
|
||||||
- linux.8xlarge.nvidia.gpu
|
- linux.8xlarge.nvidia.gpu
|
||||||
- linux.16xlarge.nvidia.gpu
|
- linux.16xlarge.nvidia.gpu
|
||||||
|
|||||||
@ -65,7 +65,7 @@ runs:
|
|||||||
cd .ci/lumen_cli
|
cd .ci/lumen_cli
|
||||||
python3 -m pip install -e .
|
python3 -m pip install -e .
|
||||||
)
|
)
|
||||||
MAX_JOBS="$(nproc --ignore=10)"
|
MAX_JOBS="$(nproc --ignore=6)"
|
||||||
export MAX_JOBS
|
export MAX_JOBS
|
||||||
|
|
||||||
# Split the comma-separated list and build each target
|
# Split the comma-separated list and build each target
|
||||||
|
|||||||
4
.github/actions/diskspace-cleanup/action.yml
vendored
4
.github/actions/diskspace-cleanup/action.yml
vendored
@ -27,9 +27,7 @@ runs:
|
|||||||
docker system prune -af
|
docker system prune -af
|
||||||
diskspace_new=$(df -H --output=pcent ${docker_root_dir} | sed -n 2p | sed 's/%//' | sed 's/ //')
|
diskspace_new=$(df -H --output=pcent ${docker_root_dir} | sed -n 2p | sed 's/%//' | sed 's/ //')
|
||||||
if [[ "$diskspace_new" -gt "$diskspace_cutoff" ]] ; then
|
if [[ "$diskspace_new" -gt "$diskspace_cutoff" ]] ; then
|
||||||
diskspace_cutoff_int=$((diskspace_cutoff + 0))
|
echo "Error: Available diskspace is less than $diskspace_cutoff percent. Not enough diskspace."
|
||||||
difference=$((100 - diskspace_cutoff_int))
|
|
||||||
echo "Error: Available diskspace is less than $difference percent. Not enough diskspace."
|
|
||||||
echo "$msg"
|
echo "$msg"
|
||||||
exit 1
|
exit 1
|
||||||
else
|
else
|
||||||
|
|||||||
2
.github/actions/linux-test/action.yml
vendored
2
.github/actions/linux-test/action.yml
vendored
@ -274,6 +274,8 @@ runs:
|
|||||||
-w /var/lib/jenkins/workspace \
|
-w /var/lib/jenkins/workspace \
|
||||||
"${DOCKER_IMAGE}"
|
"${DOCKER_IMAGE}"
|
||||||
)
|
)
|
||||||
|
# Propagate download.pytorch.org IP to container
|
||||||
|
grep download.pytorch.org /etc/hosts | docker exec -i "${container_name}" sudo bash -c "/bin/cat >> /etc/hosts"
|
||||||
echo "DOCKER_CONTAINER_ID=${container_name}" >> "${GITHUB_ENV}"
|
echo "DOCKER_CONTAINER_ID=${container_name}" >> "${GITHUB_ENV}"
|
||||||
docker exec -t "${container_name}" sh -c "pip install $(echo dist/*.whl)[opt-einsum] && ${TEST_COMMAND}"
|
docker exec -t "${container_name}" sh -c "pip install $(echo dist/*.whl)[opt-einsum] && ${TEST_COMMAND}"
|
||||||
|
|
||||||
|
|||||||
@ -264,7 +264,7 @@ def unzip_artifact_and_replace_files() -> None:
|
|||||||
change_content_to_new_version(f"artifacts/dist/{old_stem}/torch/version.py")
|
change_content_to_new_version(f"artifacts/dist/{old_stem}/torch/version.py")
|
||||||
|
|
||||||
for file in Path(f"artifacts/dist/{old_stem}").glob(
|
for file in Path(f"artifacts/dist/{old_stem}").glob(
|
||||||
"*.dist-info/*",
|
"*.dist-info/**",
|
||||||
):
|
):
|
||||||
change_content_to_new_version(file)
|
change_content_to_new_version(file)
|
||||||
|
|
||||||
|
|||||||
35
.github/actions/setup-linux/action.yml
vendored
35
.github/actions/setup-linux/action.yml
vendored
@ -28,10 +28,6 @@ runs:
|
|||||||
echo "instance-type: $(get_ec2_metadata instance-type)"
|
echo "instance-type: $(get_ec2_metadata instance-type)"
|
||||||
echo "system info $(uname -a)"
|
echo "system info $(uname -a)"
|
||||||
|
|
||||||
- name: Print GPU info (if present)
|
|
||||||
shell: bash
|
|
||||||
run: if [ -f /usr/bin/nvidia-smi ]; then nvidia-smi; fi
|
|
||||||
|
|
||||||
- name: Check if in a container runner
|
- name: Check if in a container runner
|
||||||
shell: bash
|
shell: bash
|
||||||
id: check_container_runner
|
id: check_container_runner
|
||||||
@ -86,6 +82,37 @@ runs:
|
|||||||
# Prune all of the docker images
|
# Prune all of the docker images
|
||||||
docker system prune -af
|
docker system prune -af
|
||||||
|
|
||||||
|
- name: Manually resolve download.pytorch.org
|
||||||
|
shell: bash
|
||||||
|
continue-on-error: true
|
||||||
|
run: |
|
||||||
|
set +e
|
||||||
|
set -x
|
||||||
|
|
||||||
|
PT_DOMAIN=download.pytorch.org
|
||||||
|
# TODO: Flaky access to download.pytorch.org https://github.com/pytorch/pytorch/issues/100400,
|
||||||
|
# cleaning this up once the issue is fixed. There are more than one resolved IP here, the last
|
||||||
|
# one is returned at random
|
||||||
|
RESOLVED_IP=$(dig -4 +short "${PT_DOMAIN}" | tail -n1)
|
||||||
|
|
||||||
|
if [ -z "${RESOLVED_IP}" ]; then
|
||||||
|
echo "Couldn't resolve ${PT_DOMAIN}, retrying with Google DNS..."
|
||||||
|
RESOLVED_IP=$(dig -4 +short "${PT_DOMAIN}" @8.8.8.8 | tail -n1)
|
||||||
|
|
||||||
|
if [ -z "${RESOLVED_IP}" ]; then
|
||||||
|
echo "Couldn't resolve ${PT_DOMAIN}, exiting..."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if grep -r "${PT_DOMAIN}" /etc/hosts; then
|
||||||
|
# Clean up any old records first
|
||||||
|
sudo sed -i "/${PT_DOMAIN}/d" /etc/hosts
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "${RESOLVED_IP} ${PT_DOMAIN}" | sudo tee -a /etc/hosts
|
||||||
|
cat /etc/hosts
|
||||||
|
|
||||||
- name: Check that the docker daemon is running
|
- name: Check that the docker daemon is running
|
||||||
shell: bash
|
shell: bash
|
||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
|
|||||||
20
.github/actions/setup-rocm/action.yml
vendored
20
.github/actions/setup-rocm/action.yml
vendored
@ -111,23 +111,3 @@ runs:
|
|||||||
# This video group ID maps to subgid 1 inside the docker image due to the /etc/subgid entries.
|
# This video group ID maps to subgid 1 inside the docker image due to the /etc/subgid entries.
|
||||||
# The group name corresponding to group ID 1 can change depending on the OS, so both are necessary.
|
# The group name corresponding to group ID 1 can change depending on the OS, so both are necessary.
|
||||||
echo "GPU_FLAG=--device=/dev/mem --device=/dev/kfd $DEVICE_FLAG --group-add video --group-add $render_gid --group-add daemon --group-add bin --cap-add=SYS_PTRACE --security-opt seccomp=unconfined --network=host" >> "${GITHUB_ENV}"
|
echo "GPU_FLAG=--device=/dev/mem --device=/dev/kfd $DEVICE_FLAG --group-add video --group-add $render_gid --group-add daemon --group-add bin --cap-add=SYS_PTRACE --security-opt seccomp=unconfined --network=host" >> "${GITHUB_ENV}"
|
||||||
|
|
||||||
- name: configure aws credentials
|
|
||||||
id: aws_creds
|
|
||||||
uses: aws-actions/configure-aws-credentials@ececac1a45f3b08a01d2dd070d28d111c5fe6722 # v4.1.0
|
|
||||||
with:
|
|
||||||
role-to-assume: arn:aws:iam::308535385114:role/gha_workflow_s3_and_ecr_read_only
|
|
||||||
aws-region: us-east-1
|
|
||||||
role-duration-seconds: 18000
|
|
||||||
|
|
||||||
- name: Login to Amazon ECR
|
|
||||||
id: login-ecr
|
|
||||||
continue-on-error: true
|
|
||||||
uses: aws-actions/amazon-ecr-login@062b18b96a7aff071d4dc91bc00c4c1a7945b076 # v2.0.1
|
|
||||||
|
|
||||||
- name: Preserve github env variables for use in docker
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
env | grep '^GITHUB' >> "${RUNNER_TEMP}/github_env_${GITHUB_RUN_ID}"
|
|
||||||
env | grep '^CI' >> "${RUNNER_TEMP}/github_env_${GITHUB_RUN_ID}"
|
|
||||||
env | grep '^RUNNER' >> "${RUNNER_TEMP}/github_env_${GITHUB_RUN_ID}"
|
|
||||||
|
|||||||
16
.github/actions/setup-win/action.yml
vendored
16
.github/actions/setup-win/action.yml
vendored
@ -6,12 +6,6 @@ inputs:
|
|||||||
cuda-version:
|
cuda-version:
|
||||||
description: which cuda version to install, 'cpu' for none
|
description: which cuda version to install, 'cpu' for none
|
||||||
required: true
|
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:
|
runs:
|
||||||
using: composite
|
using: composite
|
||||||
@ -44,24 +38,18 @@ runs:
|
|||||||
CONDA="C:\Jenkins\Miniconda3\condabin\conda.bat"
|
CONDA="C:\Jenkins\Miniconda3\condabin\conda.bat"
|
||||||
|
|
||||||
{
|
{
|
||||||
echo "CONDA=${CONDA}";
|
|
||||||
echo "CONDA_RUN=${CONDA} run --no-capture-output";
|
echo "CONDA_RUN=${CONDA} run --no-capture-output";
|
||||||
echo "CONDA_BUILD=${CONDA} run conda-build";
|
echo "CONDA_BUILD=${CONDA} run conda-build";
|
||||||
echo "CONDA_INSTALL=${CONDA} install";
|
echo "CONDA_INSTALL=${CONDA} install";
|
||||||
} >> "${GITHUB_ENV}"
|
} >> "${GITHUB_ENV}"
|
||||||
|
|
||||||
- name: Setup Python3
|
- name: Setup Python3
|
||||||
env:
|
|
||||||
PYTHON_VERSION: ${{ inputs.python-version }}
|
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
set +e
|
set +e
|
||||||
set -x
|
set -x
|
||||||
|
|
||||||
# Create new py_tmp env with python-version
|
PYTHON3=$(${CONDA_RUN} which python3)
|
||||||
${CONDA} create -y -n py_tmp python=${PYTHON_VERSION} intel-openmp libuv
|
|
||||||
|
|
||||||
PYTHON3=$(${CONDA_RUN} -n py_tmp which python3)
|
|
||||||
EXIT_CODE=$?
|
EXIT_CODE=$?
|
||||||
|
|
||||||
if [[ "${EXIT_CODE}" == "0" ]]; then
|
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
|
# 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
|
# 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
|
# 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=$?
|
EXIT_CODE=$?
|
||||||
|
|
||||||
if [[ "${EXIT_CODE}" == "0" ]]; then
|
if [[ "${EXIT_CODE}" == "0" ]]; then
|
||||||
|
|||||||
3
.github/actions/teardown-win/action.yml
vendored
3
.github/actions/teardown-win/action.yml
vendored
@ -23,6 +23,9 @@ runs:
|
|||||||
run: |
|
run: |
|
||||||
.github\scripts\kill_active_ssh_sessions.ps1
|
.github\scripts\kill_active_ssh_sessions.ps1
|
||||||
|
|
||||||
|
- name: Clean up leftover processes on non-ephemeral Windows runner
|
||||||
|
uses: pytorch/test-infra/.github/actions/cleanup-runner@main
|
||||||
|
|
||||||
# Cleaning up Windows workspace sometimes fails flakily with device or resource busy
|
# Cleaning up Windows workspace sometimes fails flakily with device or resource busy
|
||||||
# error, meaning one or more processes haven't stopped completely yet. So trying to
|
# error, meaning one or more processes haven't stopped completely yet. So trying to
|
||||||
# retry this step several time similar to how checkout-pytorch GHA does
|
# retry this step several time similar to how checkout-pytorch GHA does
|
||||||
|
|||||||
@ -33,6 +33,10 @@ runs:
|
|||||||
)
|
)
|
||||||
|
|
||||||
echo "CONTAINER_NAME=${container_name}" >> "$GITHUB_ENV"
|
echo "CONTAINER_NAME=${container_name}" >> "$GITHUB_ENV"
|
||||||
|
if [[ "${GPU_ARCH_TYPE}" != "rocm" && "${BUILD_ENVIRONMENT}" != "linux-aarch64-binary-manywheel" && "${BUILD_ENVIRONMENT}" != "linux-s390x-binary-manywheel" && "${GPU_ARCH_TYPE}" != "xpu" ]]; then
|
||||||
|
# Propagate download.pytorch.org IP to container. This is only needed on Linux non aarch64 runner
|
||||||
|
grep download.pytorch.org /etc/hosts | docker exec -i "${container_name}" bash -c "/bin/cat >> /etc/hosts"
|
||||||
|
fi
|
||||||
|
|
||||||
docker exec -t -w "${PYTORCH_ROOT}" "${container_name}" bash -c "bash .circleci/scripts/binary_populate_env.sh"
|
docker exec -t -w "${PYTORCH_ROOT}" "${container_name}" bash -c "bash .circleci/scripts/binary_populate_env.sh"
|
||||||
# Generate test script
|
# Generate test script
|
||||||
|
|||||||
2
.github/ci_commit_pins/audio.txt
vendored
2
.github/ci_commit_pins/audio.txt
vendored
@ -1 +1 @@
|
|||||||
3b0e7a6f192ca2715e7e6cbe5db007aea7165fe2
|
27fc2493d383354a008106f22f3be232badee9a1
|
||||||
|
|||||||
2
.github/ci_commit_pins/fbgemm_rocm.txt
vendored
2
.github/ci_commit_pins/fbgemm_rocm.txt
vendored
@ -1 +1 @@
|
|||||||
08ae0af1395c8d8471f4025deb6af9aef90b342f
|
7f1de94a4c2d14f59ad4ca84538c36084ea6b2c8
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user