summaryrefslogtreecommitdiff
path: root/sci-ml/pytorch/pytorch-2.13.0-r3.ebuild
blob: 67b2974b345a6d774ffd07bea02fb520adfb1dba (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
# Copyright 2022-2026 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

EAPI=8

DISTUTILS_USE_PEP517=setuptools
PYTHON_COMPAT=( python3_{13..14} )
DISTUTILS_SINGLE_IMPL=1
DISTUTILS_EXT=1

ROCM_VERSION=6.1
inherit distutils-r1 prefix cuda flag-o-matic rocm multiprocessing

# pytorch-2.13.0 depends on specific commit of composable kernel
# TODO: replace it with DEPEND in the future
CK_COMMIT=f1746955fdaf80a3414de814bf32437686dac347
CK_P=composable_kernel-${CK_COMMIT:0:8}

# Starting from 2.7.0 pytorch moved flash attention out-of-tree,
# but hardcoded it as third_party subproject
# TODO: unbundle
FLASH_PV=2.7.4
FLASH_PN=flash-attention
FLASH_P=${FLASH_PN}-${FLASH_PV}
FLASH_ATT_URI="https://github.com/Dao-AILab/${FLASH_PN}/archive/refs/tags/v${FLASH_PV}.tar.gz -> ${FLASH_P}.gh.tar.gz"

DESCRIPTION="Tensors and Dynamic neural networks in Python with strong GPU acceleration"
HOMEPAGE="https://pytorch.org/"
SRC_URI="https://github.com/pytorch/${PN}/archive/refs/tags/v${PV}.tar.gz
	-> ${P}.tar.gz
	rocm? (
		https://github.com/ROCm/composable_kernel/archive/${CK_COMMIT}.tar.gz
		-> ${CK_P}.tar.gz
	)
	cuda? (
		flash? ( ${FLASH_ATT_URI} )
		memefficient? ( ${FLASH_ATT_URI} )
	)
"

LICENSE="BSD"
SLOT="0"
KEYWORDS="~amd64 ~arm64"
IUSE="cuda cusparselt distributed fbgemm flash gloo kineto memefficient
	mimalloc mkl mpi nccl nnpack +numpy onednn openblas opencl openmp qnnpack
	rocm xnnpack"
RESTRICT="test"

REQUIRED_USE="
	${PYTHON_REQUIRED_USE}
	mpi? ( distributed )
	gloo? ( distributed )
	?? ( cuda rocm )
	rocm? (
		|| ( ${ROCM_REQUIRED_USE} )
		memefficient? ( flash )
	)
	cusparselt? ( || ( cuda rocm ) )
	flash? ( || ( cuda rocm ) )
	memefficient? ( || ( cuda rocm ) )
	nccl? ( rocm )
"

RDEPEND="
	${PYTHON_DEPS}
	!sci-ml/caffe2
	dev-cpp/abseil-cpp:=
	dev-cpp/gflags:=
	>=dev-cpp/glog-0.6.0:=
	>=dev-libs/cpuinfo-2025.11.14
	dev-libs/libfmt:=
	dev-libs/protobuf:=
	dev-libs/sleef
	sci-ml/onnx
	$(python_gen_cond_dep '
		dev-python/sympy[${PYTHON_USEDEP}]
		dev-python/typing-extensions[${PYTHON_USEDEP}]
	')
	!mkl? ( !openblas? ( virtual/blas ) )
	cuda? (
		dev-libs/cudnn
		>=sci-ml/cudnn-frontend-1.12.0:=
		>=dev-util/nvidia-cuda-toolkit-12.9:=[profiler]
		cusparselt? ( dev-libs/cusparselt )
	)
	distributed? (
		!rocm? ( sci-ml/tensorpipe[cuda?] )
		dev-cpp/cpp-httplib:=
	)
	fbgemm? ( >=sci-ml/FBGEMM-1.4 )
	gloo? ( >=sci-ml/gloo-2025.06.04[cuda?,rocm?] )
	kineto? ( ~sci-ml/kineto-0.4.0_p20260603 )
	mimalloc? ( dev-libs/mimalloc )
	mkl? ( sci-libs/mkl )
	mpi? ( virtual/mpi )
	nnpack? (
		sci-ml/NNPACK
		dev-libs/pthreadpool
	)
	numpy? ( $(python_gen_cond_dep '
		dev-python/numpy[${PYTHON_USEDEP}]
	') )
	onednn? ( sci-ml/oneDNN )
	openblas? ( sci-libs/openblas )
	opencl? ( virtual/opencl )
	qnnpack? (
		!sci-libs/QNNPACK
		sci-ml/gemmlowp
		dev-libs/pthreadpool
	)
	rocm? (
		nccl? ( >=dev-libs/rccl-6.3:= <dev-libs/rccl-7.3:= )
		>=dev-util/hip-6.3:=       <dev-util/hip-7.3:=
		>=dev-util/roctracer-6.3:= <dev-util/roctracer-7.3:=
		>=sci-libs/hipBLAS-6.3:=   <sci-libs/hipBLAS-7.3:=[rocsolver(+)]
		>=sci-libs/hipBLASLt-6.3:= <sci-libs/hipBLASLt-7.3:=
		>=sci-libs/hipFFT-6.3:=    <sci-libs/hipFFT-7.3:=
		>=sci-libs/hipRAND-6.3:=   <sci-libs/hipRAND-7.3:=
		>=sci-libs/hipSOLVER-6.3:= <sci-libs/hipSOLVER-7.3:=
		>=sci-libs/hipSPARSE-6.3:= <sci-libs/hipSPARSE-7.3:=
		>=sci-libs/miopen-6.3:=    <sci-libs/miopen-7.3:=
		>=sci-libs/rocBLAS-6.3:=   <sci-libs/rocBLAS-7.3:=
		>=sci-libs/rocRAND-6.3:=   <sci-libs/rocRAND-7.3:=
		>=sci-libs/rocSOLVER-6.3:= <sci-libs/rocSOLVER-7.3:=
		memefficient? ( =sci-libs/aotriton-bin-0.13*:= )
		distributed? (
			>=dev-util/rocm-smi-6.3:= <dev-util/rocm-smi-7.3:=
			>=dev-util/amdsmi-6.3:= <dev-util/amdsmi-7.3:=
		)
		cusparselt? ( >=sci-libs/hipsparselt-6.3:= <sci-libs/hipsparselt-7.3:= )
	)
	xnnpack? (
		>=sci-ml/XNNPACK-2024.11
		dev-libs/pthreadpool
	)
"

DEPEND="
	${RDEPEND}
	dev-cpp/nlohmann_json
	dev-libs/flatbuffers
	dev-libs/FXdiv
	dev-libs/pocketfft
	dev-libs/psimd
	sci-ml/FP16
	$(python_gen_cond_dep '
		<dev-python/pybind11-3.0.5[${PYTHON_USEDEP}]
		dev-python/pyyaml[${PYTHON_USEDEP}]
		dev-python/typing-extensions[${PYTHON_USEDEP}]
	')
	cuda? ( ~dev-libs/cutlass-4.4.2[tools(+)] )
	onednn? ( sci-ml/ideep )
	rocm? (
		>=sci-libs/hipCUB-6.3:=    <sci-libs/hipCUB-7.3:=
		>=sci-libs/rocPRIM-6.3:=   <sci-libs/rocPRIM-7.3:=
		>=sci-libs/rocThrust-6.3:= <sci-libs/rocThrust-7.3:=
	)
	qnnpack? ( dev-libs/clog )
"

BDEPEND="dev-build/cmake"

PATCHES=(
	"${FILESDIR}"/${P}-aotriton-fixes.patch
	"${FILESDIR}"/${P}-glog.patch
	"${FILESDIR}"/${P}-mimalloc.patch
	"${FILESDIR}"/${P}-removekineto-pr178960.patch
	"${FILESDIR}"/${P}-rocm-assert-fix.patch
	"${FILESDIR}"/${P}-unbundle_fbgemm.patch
	"${FILESDIR}"/${P}-unbundle_flatbuffers.patch
	"${FILESDIR}"/${P}-unbundle_fmt.patch
	"${FILESDIR}"/${P}-unbundle_fxdiv.patch
	"${FILESDIR}"/${P}-unbundle_httplib.patch
	"${FILESDIR}"/${P}-unbundle_kineto.patch
	"${FILESDIR}"/${P}-unbundle_mkldnn.patch
	"${FILESDIR}"/${P}-unbundle_nnpack.patch
	"${FILESDIR}"/${P}-unbundle_pocketfft.patch
	"${FILESDIR}"/${P}-xnnpack.patch
)

src_prepare() {
	if use cuda && ( use flash || use memefficient ); then
		mv "${WORKDIR}"/${FLASH_P}/* third_party/${FLASH_PN}/ || die
	fi
	filter-lto #bug 862672

	eapply "${FILESDIR}/${PN}-2.10.0-cpp-extension-multilib.patch"
	# Replace placeholders added by cpp-extension.patch
	sed -e "s|%LIB_DIR%|$(get_libdir)|g" \
		-i torch/utils/cpp_extension.py || die

	# Unbundle fmt
	sed -i \
		-e 's|::fmt-header-only||' \
		c10/CMakeLists.txt \
		cmake/Dependencies.cmake \
		torch/CMakeLists.txt \
		|| die

	# tensorpipe is in system, not a build target of pytorch
	sed -e '/target_compile_options_if_supported(tensorpipe/d' -i cmake/Dependencies.cmake || die

	# Drop third_party from CMake tree
	sed -i \
		-e '/add_subdirectory.*third_party/d' \
		CMakeLists.txt \
		cmake/Dependencies.cmake \
		cmake/ProtoBuf.cmake \
		aten/src/ATen/CMakeLists.txt \
		|| die

	# Add needed file for cutlass as symbolic link
	ln -sf /usr/share/cutlass/examples third_party/cutlass/examples || die

	# cudnn_frontend is unbundled, but some targets still look for its
	# headers under third_party/cudnn_frontend/include.
	if use cuda; then
		mkdir -p third_party/cudnn_frontend || die
		ln -sf /usr/include third_party/cudnn_frontend/include || die
	fi

	distutils-r1_src_prepare

	# Noisy warnings from Logging.h
	sed -i 's/-Wextra-semi//' cmake/public/utils.cmake || die

	pushd torch/csrc/jit/serialization > /dev/null || die
	flatc --cpp --gen-mutable --scoped-enums mobile_bytecode.fbs || die
	popd > /dev/null || die

	# prefixify the hardcoded paths, after all patches are applied
	hprefixify \
		aten/CMakeLists.txt \
		caffe2/CMakeLists.txt \
		cmake/Metal.cmake \
		cmake/Modules/*.cmake \
		cmake/Modules_CUDA_fix/FindCUDNN.cmake \
		cmake/Modules_CUDA_fix/upstream/FindCUDA/make2cmake.cmake \
		cmake/Modules_CUDA_fix/upstream/FindPackageHandleStandardArgs.cmake \
		cmake/public/LoadHIP.cmake \
		cmake/public/cuda.cmake \
		cmake/Dependencies.cmake \
		tools/setup_helpers/env.py \
		torch/CMakeLists.txt \
		CMakeLists.txt

	if use rocm; then
		# TODO: delete, when caffe2 depends on systemwide composable_kernel
		sed -e "s:third_party/composable_kernel:../composable_kernel-${CK_COMMIT}:g" \
			-i aten/src/ATen/CMakeLists.txt || die

		# Workaround for libc++ issue https://github.com/llvm/llvm-project/issues/100802
		sed -e 's/std::memcpy/memcpy/g' \
			-i torch/headeronly/util/Half.h \
			-i aten/src/ATen/native/cuda/int4mm.cu || die

		ebegin "HIPifying cuda sources"
		FBCODE_BUILD_TOOL="buck" ${EPYTHON} tools/amd_build/build_amd.py || die
		eend $?
	fi
}

src_configure() {
	if use cuda && [[ -z ${TORCH_CUDA_ARCH_LIST} ]]; then
		ewarn "WARNING: pytorch is being built with its default CUDA compute capabilities: 3.5 and 7.0."
		ewarn "These may not be optimal for your GPU."
		ewarn ""
		ewarn "To configure pytorch with the CUDA compute capability that is optimal for your GPU,"
		ewarn "set TORCH_CUDA_ARCH_LIST in your make.conf, and re-emerge pytorch."
		ewarn "For example, to use CUDA capability 7.5 & 3.5, add: TORCH_CUDA_ARCH_LIST=7.5 3.5"
		ewarn "For a Maxwell model GPU, an example value would be: TORCH_CUDA_ARCH_LIST=Maxwell"
		ewarn ""
		ewarn "You can look up your GPU's CUDA compute capability at https://developer.nvidia.com/cuda-gpus"
		ewarn "or by running /opt/cuda/extras/demo_suite/deviceQuery | grep 'CUDA Capability'"
	fi
}

python_compile() {
	local -x BUILD_TEST=OFF
	local -x CMAKE_BUILD_DIR="${BUILD_DIR}"
	local -x MAX_JOBS=$(makeopts_jobs)
	local -x PYTORCH_BUILD_VERSION=${PV}
	local -x PYTORCH_BUILD_NUMBER=0
	local -x USE_CCACHE=OFF
	local -x USE_CUDA=$(usex cuda)
	local -x USE_DISTRIBUTED=$(usex distributed)
	local -x USE_FBGEMM=$(usex fbgemm)
	local -x USE_FLASH_ATTENTION=$(usex flash)
	local -x USE_GFLAGS=ON
	local -x USE_GLOG=ON
	local -x USE_GLOO=$(usex gloo)
	local -x USE_ITT=OFF
	local -x USE_KINETO=$(usex kineto)
	local -x USE_KLEIDIAI=OFF # TODO
	local -x USE_MAGMA=OFF # TODO: In GURU as sci-libs/magma
	local -x USE_MEM_EFF_ATTENTION=$(usex memefficient)
	local -x USE_MIMALLOC=$(usex mimalloc)
	local -x USE_MKLDNN=$(usex onednn)
	local -x USE_MPI=$(usex mpi)
	local -x USE_NNPACK=$(usex nnpack)
	local -x USE_NUMA=OFF
	local -x USE_NUMPY=$(usex numpy)
	local -x USE_OPENCL=$(usex opencl)
	local -x USE_OPENMP=$(usex openmp)
	local -x USE_PYTORCH_QNNPACK=$(usex qnnpack)
	local -x USE_PYTORCH_METAL=OFF
	local -x USE_ROCM=$(usex rocm)
	local -x USE_SYSTEM_LIBS=ON
	local -x USE_SYSTEM_XNNPACK=$(usex xnnpack)
	local -x USE_TENSORPIPE=$(usex distributed $(usex !rocm))
	local -x DUSE_UCC=OFF
	local -x USE_VALGRIND=OFF
	local -x USE_XNNPACK=$(usex xnnpack)
	local -x USE_XPU=OFF

	if use mkl; then
		local -x USE_BLAS=ON
		local -x BLAS=MKL
	elif use openblas; then
		local -x USE_BLAS=ON
		local -x BLAS=OpenBLAS
	else
		# Note: USE_BLAS=OFF does not properly work, instead pytorch still searches for libraries.
		# Even though it is easy to patch pytorch to disable BLAS usage completely,
		# it is practically not useful, as it would render the library barely usable.
		local -x USE_BLAS=ON
		local -x BLAS=Generic
		local -x GENERIC_BLAS_LIBRARIES=cblas
	fi

	if use cuda; then
		# bug 867706 926116
		cuda_add_sandbox
		addpredict "/dev/char/"

		local -x CMAKE_CUDA_FLAGS="$(cuda_gccdir -f | tr -d \")"
		local -x TORCH_CUDA_ARCH_LIST="${TORCH_CUDA_ARCH_LIST:-7.0}"
		local -x USE_CUDNN=ON
		local -x USE_FLASH_ATTENTION=OFF
		local -x USE_MEM_EFF_ATTENTION=OFF
		local -x USE_NCCL=OFF # TODO: NVIDIA Collective Communication Library

	elif use rocm; then
		export PYTORCH_ROCM_ARCH="$(get_amdgpu_flags)"

		if use memefficient; then
			export AOTRITON_INSTALLED_PREFIX="${ESYSROOT}/usr"
		fi

		local -x CMAKE_REQUIRE_FIND_PACKAGE_HIP=ON
		local -x USE_NCCL=$(usex nccl)
		local -x CMAKE_DISABLE_FIND_PACKAGE_hipsparselt=$(usex !cusparselt) # disable automagic
		local -x USE_ROCM_CK_SDPA=OFF # requires flash + aiter, works only on gfx90a/gfx942/gfx950
		local -x ROCM_PATH=/usr
		local -x HIP_CLANG_PATH=$(hipconfig --hipclangpath)

		# ROCm libraries produce too much warnings
		append-cxxflags -Wno-deprecated-declarations -Wno-unused-result -Wno-unused-value
	else
		local -x USE_NCCL=OFF
	fi

	distutils-r1_python_compile develop sdist
}