summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam J. Stewart <ajstewart426@gmail.com>2019-08-15 17:54:09 -0500
committerGitHub <noreply@github.com>2019-08-15 17:54:09 -0500
commitf568f19b13f1ad0d304bb3d0baba176f19a98103 (patch)
tree0ef7b9ddf6800f6e65d93673534a7d85df0f7332
parent3a78f0e0fdb1bd40ed1f19a3d166cb8c26e8d75e (diff)
downloadspack-f568f19b13f1ad0d304bb3d0baba176f19a98103.tar.gz
spack-f568f19b13f1ad0d304bb3d0baba176f19a98103.tar.bz2
spack-f568f19b13f1ad0d304bb3d0baba176f19a98103.tar.xz
spack-f568f19b13f1ad0d304bb3d0baba176f19a98103.zip
Overhaul PyTorch package (#12420)
* Overhaul PyTorch package * Flake8 * Distributed requires MPI, NCCL not specified correctly * Binary was being specified incorrectly * Run tests at install time * Disable GLOO in addition to GLOO_IBVERBS
-rw-r--r--var/spack/repos/builtin/packages/py-torch/package.py185
1 files changed, 155 insertions, 30 deletions
diff --git a/var/spack/repos/builtin/packages/py-torch/package.py b/var/spack/repos/builtin/packages/py-torch/package.py
index 9a75cd956a..ce432ee33b 100644
--- a/var/spack/repos/builtin/packages/py-torch/package.py
+++ b/var/spack/repos/builtin/packages/py-torch/package.py
@@ -10,8 +10,9 @@ class PyTorch(PythonPackage):
"""Tensors and Dynamic neural networks in Python
with strong GPU acceleration."""
- homepage = "http://pytorch.org/"
+ homepage = "https://pytorch.org/"
git = "https://github.com/pytorch/pytorch.git"
+ install_time_test_callbacks = ['install_test', 'import_module_test']
maintainers = ['adamjstewart']
import_modules = [
@@ -48,6 +49,8 @@ class PyTorch(PythonPackage):
'torch.utils.data', 'torch.utils.data._utils'
]
+ version('master', branch='master', submodules=True)
+ version('1.2.0', tag='v1.2.0', submodules=True)
version('1.1.0', tag='v1.1.0', submodules=True)
version('1.0.1', tag='v1.0.1', submodules=True)
version('1.0.0', tag='v1.0.0', submodules=True)
@@ -55,59 +58,181 @@ class PyTorch(PythonPackage):
version('0.4.0', tag='v0.4.0', submodules=True)
version('0.3.1', tag='v0.3.1', submodules=True)
- variant('cuda', default='False', description='Add GPU support')
- variant('cudnn', default='False', description='Add cuDNN support')
- variant('nccl', default='False', description='Add NCCL support')
- variant('mkldnn', default='False', description='Add Intel MKL DNN support')
- variant('magma', default='False', description='Add MAGMA support')
+ variant('cuda', default=True, description='Enables CUDA build')
+ variant('cudnn', default=False, description='Enables the cuDNN build')
+ variant('magma', default=False, description='Enables the MAGMA build')
+ variant('fbgemm', default=False, description='Enables the FBGEMM build')
+ variant('test', default=False, description='Enables the test build')
+ variant('miopen', default=False, description='Enables the MIOpen build')
+ variant('mkldnn', default=False, description='Enables use of MKLDNN')
+ variant('nnpack', default=False, description='Enables NNPACK build')
+ variant('qnnpack', default=False, description='Enables QNNPACK build (quantized 8-bit operators)')
+ variant('distributed', default=False, description='Enables distributed (c10d, gloo, mpi, etc.) build')
+ variant('nccl', default=False, description='Use Spack-installed NCCL')
+ variant('caffe2', default=False, description='Enables Caffe2 operators build')
+ variant('gloo', default=False, description='Enables features related to distributed support')
+ variant('opencv', default=False, description='Enables use of OpenCV for additional operators')
+ variant('openmp', default=True, description='Enables use of OpenMP for parallelization')
+ variant('ffmpeg', default=False, description='Enables use of ffmpeg for additional operators')
+ variant('leveldb', default=False, description='Enables use of LevelDB for storage')
+ variant('lmdb', default=False, description='Enables use of LMDB for storage')
+ variant('binary', default=False, description='Enables the additional binaries/ build')
+ variant('redis', default=False, description='Use Redis for distributed workflows')
+ variant('zstd', default=False, description='Enables use of ZSTD')
+ variant('tbb', default=False, description='Enables TBB support')
conflicts('+cudnn', when='~cuda')
- conflicts('+nccl', when='~cuda')
conflicts('+magma', when='~cuda')
- conflicts('+mkldnn', when='@:0.3.2')
-
+ conflicts('+fbgemm', when='@:0.4')
+ conflicts('+miopen', when='@:0.4')
+ conflicts('+mkldnn', when='@:0.3')
+ conflicts('+qnnpack', when='@:0.4')
+ conflicts('+nccl', when='~cuda')
+ conflicts('+opencv', when='@:0.4')
+ conflicts('+ffmpeg', when='@:0.4')
+ conflicts('+leveldb', when='@:0.4')
+ conflicts('+lmdb', when='@:0.4')
+ conflicts('+binary', when='@:0.4')
+ conflicts('+redis', when='@:1.0')
+ conflicts('+zstd', when='@:1.0')
+ conflicts('+tbb', when='@:1.1')
+
+ # Required dependencies
+ depends_on('cmake@3.5:', type='build')
+ depends_on('python@2.7:2.8,3.5:', type=('build', 'run'))
depends_on('py-setuptools', type='build')
- depends_on('py-cffi', type='build')
depends_on('py-numpy', type=('run', 'build'))
+ depends_on('py-future', when='@1.1: ^python@:2', type='build')
+ depends_on('py-pyyaml', type=('run', 'build'))
+ depends_on('py-typing', when='@0.4: ^python@:3.4', type=('run', 'build'))
depends_on('blas')
depends_on('lapack')
- depends_on('py-pyyaml', type=('run', 'build'))
- depends_on('py-typing', when='@0.3.2: ^python@:3.4', type=('run', 'build'))
- depends_on('intel-mkl', when='+mkl')
+
+ # Optional dependencies
depends_on('cuda@7.5:', when='+cuda', type=('build', 'link', 'run'))
depends_on('cuda@9:', when='@1.1:+cuda', type=('build', 'link', 'run'))
- depends_on('cudnn@6:', when='+cuda+cudnn')
- depends_on('cudnn@7:', when='@1.1:+cuda+cudnn')
- depends_on('nccl', when='+cuda+nccl')
- depends_on('magma+shared', when='+cuda+magma')
+ depends_on('cudnn@6:', when='+cudnn')
+ depends_on('cudnn@7:', when='@1.1:+cudnn')
+ depends_on('magma', when='+magma')
+ # TODO: add dependency: https://github.com/pytorch/FBGEMM
+ depends_on('fbgemm', when='+fbgemm')
+ # TODO: add dependency: https://github.com/ROCmSoftwarePlatform/MIOpen
+ depends_on('miopen', when='+miopen')
+ depends_on('mkl', when='+mkldnn')
+ # TODO: add dependency: https://github.com/Maratyszcza/NNPACK
+ depends_on('nnpack', when='+nnpack')
+ # TODO: add dependency: https://github.com/pytorch/QNNPACK
+ depends_on('qnnpack', when='+qnnpack')
+ depends_on('mpi', when='+distributed')
+ depends_on('nccl', when='+nccl')
+ depends_on('gloo', when='+gloo')
+ depends_on('opencv', when='+opencv')
+ depends_on('llvm-openmp', when='%clang platform=darwin +openmp')
+ depends_on('ffmpeg', when='+ffmpeg')
+ depends_on('leveldb', when='+leveldb')
+ depends_on('lmdb', when='+lmdb')
+ depends_on('redis', when='+redis')
+ depends_on('zstd', when='+zstd')
+ depends_on('tbb', when='+tbb')
def setup_environment(self, build_env, run_env):
+ def enable_or_disable(variant, keyword='USE', var=None, newer=False):
+ """Set environment variable to enable or disable support for a
+ particular variant.
+
+ Parameters:
+ variant (str): the variant to check
+ keyword (str): the prefix to use for enabling/disabling
+ var (str): CMake variable to set. Defaults to variant.upper()
+ newer (bool): newer variants that never used NO_*
+ """
+ if var is None:
+ var = variant.upper()
+
+ # Version 1.1.0 switched from NO_* to USE_* or BUILD_*
+ # But some newer variants have always used USE_* or BUILD_*
+ if self.spec.satisfies('@1.1:') or newer:
+ if '+' + variant in self.spec:
+ build_env.set(keyword + '_' + var, 'ON')
+ else:
+ build_env.set(keyword + '_' + var, 'OFF')
+ else:
+ if '+' + variant in self.spec:
+ build_env.unset('NO_' + var)
+ else:
+ build_env.set('NO_' + var, 'ON')
+
build_env.set('MAX_JOBS', make_jobs)
+ enable_or_disable('cuda')
if '+cuda' in self.spec:
build_env.set('CUDA_HOME', self.spec['cuda'].prefix)
- else:
- build_env.set('NO_CUDA', 'TRUE')
+ enable_or_disable('cudnn')
if '+cudnn' in self.spec:
build_env.set('CUDNN_LIB_DIR',
- self.spec['cudnn'].prefix.lib)
+ self.spec['cudnn'].libs.directories[0])
build_env.set('CUDNN_INCLUDE_DIR',
self.spec['cudnn'].prefix.include)
- else:
- build_env.set('NO_CUDNN', 'TRUE')
+ build_env.set('CUDNN_LIBRARY', self.spec['cudnn'].libs[0])
- if '+nccl' in self.spec:
- build_env.set('NCCL_ROOT_DIR', self.spec['nccl'].prefix)
- else:
- build_env.set('NO_SYSTEM_NCCL', 'TRUE')
+ enable_or_disable('fbgemm')
+ enable_or_disable('test', keyword='BUILD')
+
+ enable_or_disable('miopen')
+ if '+miopen' in self.spec:
+ build_env.set('MIOPEN_LIB_DIR',
+ self.spec['miopen'].libs.directories[0])
+ build_env.set('MIOPEN_INCLUDE_DIR',
+ self.spec['miopen'].prefix.include)
+ build_env.set('MIOPEN_LIBRARY', self.spec['miopen'].libs[0])
+ enable_or_disable('mkldnn')
if '+mkldnn' in self.spec:
build_env.set('MKLDNN_HOME', self.spec['intel-mkl'].prefix)
- else:
- build_env.set('NO_MKLDNN', 'TRUE')
- build_env.set('NO_NNPACK', 'TRUE')
+ enable_or_disable('nnpack')
+ enable_or_disable('qnnpack')
+ enable_or_disable('distributed')
- build_env.set('PYTORCH_BUILD_VERSION', str(self.version))
+ enable_or_disable('nccl')
+ enable_or_disable('nccl', var='SYSTEM_NCCL')
+ if '+nccl' in self.spec:
+ build_env.set('NCCL_ROOT', self.spec['nccl'].prefix)
+ build_env.set('NCCL_LIB_DIR',
+ self.spec['nccl'].libs.directories[0])
+ build_env.set('NCCL_INCLUDE_DIR', self.spec['nccl'].prefix.include)
+
+ enable_or_disable('caffe2', keyword='BUILD', var='CAFFE2_OPS')
+ enable_or_disable('gloo', newer=True)
+ enable_or_disable('gloo', var='GLOO_IBVERBS', newer=True)
+ enable_or_disable('opencv', newer=True)
+ enable_or_disable('openmp', newer=True)
+ enable_or_disable('ffmpeg', newer=True)
+ enable_or_disable('leveldb', newer=True)
+ enable_or_disable('lmdb', newer=True)
+ enable_or_disable('binary', keyword='BUILD', newer=True)
+
+ build_env.set('PYTORCH_BUILD_VERSION', self.version)
build_env.set('PYTORCH_BUILD_NUMBER', 0)
+
+ # BLAS to be used by Caffe2. Can be MKL, Eigen, ATLAS, or OpenBLAS.
+ if '^mkl' in self.spec:
+ build_env.set('BLAS', 'MKL')
+ elif '^eigen' in self.spec:
+ build_env.set('BLAS', 'Eigen')
+ elif '^atlas' in self.spec:
+ build_env.set('BLAS', 'ATLAS')
+ elif '^openblas' in self.spec:
+ build_env.set('BLAS', 'OpenBLAS')
+
+ enable_or_disable('redis', newer=True)
+ enable_or_disable('zstd', newer=True)
+ enable_or_disable('tbb', newer=True)
+
+ def test(self):
+ pass
+
+ def install_test(self):
+ with working_dir('test'):
+ python('run_test.py')