Files
2026-06-07 20:57:59 -04:00

239 lines
8.5 KiB
Tcl

# -*- coding: utf-8; mode: tcl; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- vim:fenc=utf-8:ft=tcl:et:sw=4:ts=4:sts=4
PortSystem 1.0
PortGroup github 1.0
PortGroup mpi 1.0
PortGroup python 1.0
github.setup pytorch pytorch 2.12.0 v
revision 0
name py-${github.project}
license BSD
maintainers nomaintainer
supported_archs arm64 x86_64
github.tarball_from releases
description Tensors and dynamic neural networks in Python \
with strong GPU acceleration
long_description PyTorch is a Python package that provides two \
high-level features: Tensor computation (like \
NumPy) with strong GPU acceleration\; Deep neural \
networks built on a tape-based autograd \
system. You can reuse your favorite Python \
packages such as NumPy, SciPy and Cython to extend \
PyTorch when needed.
homepage https://pytorch.org/
distname ${github.project}-${github.tag_prefix}${version}
checksums rmd160 9e979813d9fe7a417b9c127a8773b83d6c6a607d \
sha256 7cc1deb309f402ad67e9f45bbe311a40def4db19d66fddb9b01950f9bfc5ccb1 \
size 430864016
python.versions 310 311 312 313 314
# third_party/pthreadpool needs DISPATCH_APPLY_AUTO (as of torch 2.0.0), requiring 10.12+
# But builds fail for 10.12 - 10.14, so exclude those too
platforms {darwin >= 19}
mpi.setup
# Compiler selection
compiler.cxx_standard 2017
compiler.blacklist-append *gcc*
compiler.blacklist-append {clang < 1700}
variant mkl description {Enable Intel Math Kernel Library support} { }
# py-mkl supports x86_64 and 10.12 and later only
if {${configure.build_arch} eq "x86_64" && !($universal_possible && [variant_isset universal])
&& !(${os.platform} eq "darwin" && ${os.major} <= 15)} {
default_variants-append +mkl
}
platform darwin {
if {${os.major} >= 18} {
variant mps description {Enable Apple Metal Performance Shaders (MPS) support} {
use_xcode yes
# Align the sysroot with the Xcode SDK so AvailabilityMacros.h defines
# __MAC_15_0 (and __MAC_26_0 etc.), preventing the forward-compat shims
# in MPSGraphSequoiaOps.h from being compiled when the Xcode SDK already
# provides those Metal/MPS symbols via its framework headers.
configure.sdkroot \
[exec xcrun --sdk macosx --show-sdk-path]
build.env-append \
APPLE=ON \
USE_MPS=ON \
USE_PYTORCH_METAL=ON \
USE_PYTORCH_METAL_EXPORT=ON
notes-append \
"
The port ${subport} is built with Apple Metal Performance Shaders (MPS)\
support for GPU hardware acceleration. To enable Apple GPU devices,\
use device \"mps\". Matrix multiplication example:
import torch
mpsDevice = torch.device(\"mps\" if\
torch.backends.mps.is_available() else \"cpu\")
x = torch.randn((10_000, 1_000), device=mpsDevice)
cov = (x.T @ x)/x.shape\[0]
"
}
default_variants-append +mps
}
}
if {${name} ne ${subport}} {
depends_build-append \
port:git \
path:bin/doxygen:doxygen \
port:cctools \
path:bin/cmake:cmake \
path:bin/ninja:ninja \
port:py${python.version}-requests
depends_lib-append \
path:share/pkgconfig/eigen3.pc:eigen3 \
port:gflags \
port:google-glog \
port:libomp \
port:protobuf3-cpp \
port:py${python.version}-click \
port:py${python.version}-future \
port:py${python.version}-numpy \
port:py${python.version}-pybind11 \
port:py${python.version}-six \
port:py${python.version}-sympy \
port:py${python.version}-typing_extensions \
port:py${python.version}-yaml \
port:zstd
depends_run-append \
port:py${python.version}-onnx \
port:py${python.version}-packaging \
port:py${python.version}-zstd
# remove unnecessary dependencies and version pinning
patchfiles-append patch-pyproject_toml.diff
# Patch to fix init issue with google-glog 0.5.0, caused by breaking API change.
# Refer to patch comments for detailed background.
# Upstream PyTorch issue: https://github.com/pytorch/pytorch/issues/58054
# diff -NaurdwB ./py-pytorch-orig/c10/util/Logging.cpp ./py-pytorch-new/c10/util/Logging.cpp | sed -E -e 's/\.\/py-pytorch-(orig|new)/\./g' | sed -E -e 's|/opt/local|@@PREFIX@@|g' > ~/Downloads/patch-glog-init-check.diff
patchfiles-append patch-glog-init-check.diff
# Use Intel Math kernel Library
if {[variant_isset mkl]} {
patchfiles-append FindMKL-OMP.patch
pre-build {
# Hacks to get search paths into builds
reinplace "s|/opt/intel/mkl|${python.prefix}|g" \
cmake/Modules/FindMKL.cmake
reinplace "s|mklvers \"intel64\"|mklvers \"\"|g" \
cmake/Modules/FindMKL.cmake
reinplace "s|MACPORTS_PREFIX|${prefix}|g" \
cmake/Modules/FindMKL.cmake
}
depends_lib-append port:py${python.version}-mkl
depends_build-append port:py${python.version}-mkl-include
build.env-append \
BLAS_SET_BY_USER=ON
}
compiler.cpath-append \
${prefix}/include/libomp
compiler.library_path-append \
${prefix}/lib/libomp
configure.cppflags-append \
-I${prefix}/include/libomp
# ccache configuration
configure.ccache yes
set ccache_dir ${workpath}/.ccache
if {[option configure.ccache]} {
depends_build-append \
path:bin/ccache:ccache
post-patch {
xinstall -d ${ccache_dir}
}
configure.env-append CCACHE_DIR=${ccache_dir} USE_CCACHE=ON
build.env-append CCACHE_DIR=${ccache_dir} USE_CCACHE=ON
destroot.env-append CCACHE_DIR=${ccache_dir} USE_CCACHE=ON
} else {
# commands to disable ccache
configure.ccache no
configure.env-append CCACHE_DISABLE=1 USE_CCACHE=OFF
build.env-append CCACHE_DISABLE=1 USE_CCACHE=OFF
destroot.env-append CCACHE_DISABLE=1 USE_CCACHE=OFF
# Limit cores for parallel builds
# Note: parallel builds observed to fail on 8, 24 cores without ccache
use_parallel_build yes
set max_build_jobs 4
if {[option build.jobs] < ${max_build_jobs}} {
set max_build_jobs [option build.jobs]
}
build.env-append \
CMAKE_BUILD_PARALLEL_LEVEL=${max_build_jobs}
}
build.env-append \
BUILD_CUSTOM_PROTOBUF=OFF \
USE_CUDA=OFF \
USE_DISTRIBUTED=ON \
USE_EIGEN_SPARSE=ON \
USE_GFLAGS=ON \
USE_GLOG=ON \
USE_GLOO=ON \
USE_LITE_PROTO=ON \
USE_NCCL=OFF \
USE_OPENMP=ON \
USE_RCCL=OFF \
USE_ROCM=OFF \
USE_SYSTEM_EIGEN_INSTALL=ON \
USE_SYSTEM_PYBIND11=ON \
USE_XPU=OFF
post-destroot {
set py_torch_root ${python.pkgd}/torch
foreach slib [glob -directory ${destroot}${py_torch_root} *.so] {
system "install_name_tool -add_rpath ${py_torch_root}/lib ${slib}"
}
# Upstream PyTorch bundles pybind11 headers in its include directory.
# Since we use USE_SYSTEM_PYBIND11=ON, create a symlink so downstream
# packages (torchaudio, torchvision, etc.) can find pybind11 headers.
ln -s ${python.pkgd}/pybind11/include/pybind11 \
${destroot}${py_torch_root}/include/pybind11
set docdir ${prefix}/share/doc/${subport}
xinstall -d ${destroot}${docdir}
xinstall -m 0644 -W ${worksrcpath} LICENSE README.md \
${destroot}${docdir}
}
# pytorch's tests all use GPU compilation
if { [lsearch ${build.env} {USE_CUDA=OFF}] != -1 } {
test.run yes
}
} else {
# overload the github livecheck regex to look for versions that
# are just numbers and '.', no letters (e.g., "3.7.3_rc2").
livecheck.url https://github.com/pytorch/pytorch/releases
livecheck.regex {/tree/v(([[:digit:]]+\.)+[[:digit:]]+)}
}