为没有 root 权限的 nvcc 指定 GCC 版本
Specify GCC version for nvcc without root priviledges
我正在使用一个 GPU 集群,其中提交的作业由 Slurm 管理。我在那台服务器上没有管理员/根权限。我目前正在尝试构建一个包含 .cpp
和 .cu
文件的项目。我通过调用 TORCH_CUDA_ARCH_LIST=7.2 CC=gcc-7 CXX=g++-7 python setup.py install
来做到这一点,因为集群使用 CUDA 10.1
并运行 V100
个 GPU(因此 gencode 是 sm_70
)。
但是,构建崩溃并显示以下错误消息:
building <filename> extension
gcc-7 -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes (...):
error: #error -- unsupported GNU version! gcc versions later than 8 are not supported!
138 | #error -- unsupported GNU version! gcc versions later than 8 are not supported!
| ^~~~~
error: command '/<somepath>/anaconda3/envs/pytorch14/bin/nvcc' failed with exit status 1
因此,从第二行的 gcc-7 调用可以看出,python 脚本使用了正确的编译器,但不幸的是,nvcc
调用使用了系统范围的编译器gcc 符号链接,即:/usr/bin/gcc: symbolic link to gcc-9
。我在网上找到了几个答案(包括 this and this)并尝试了建议的步骤。但是:因为我没有 root 访问权限,所以我无法创建新的符号链接/将现有的符号链接更改为另一个已安装的 gcc 版本,例如/usr/bin/gcc-7
:做 ln -s /usr/bin/gcc-7 /usr/bin/gcc
给我一个 ln: failed to create symbolic link '/usr/bin/gcc': File exists
错误,并且将文件复制到 /usr/local/bin
,正如其他答案中所建议的那样,由于缺少特权而无法工作。
我真的很茫然,觉得这可能是一条死胡同。有人有什么建议吗?
作为参考,这是我的 setup.py 的样子:
from setuptools import setup
from torch.utils.cpp_extension import BuildExtension, CUDAExtension
setup(
name='noise_cuda',
ext_modules=[
CUDAExtension('noise_cuda', [
'noise_cuda.cpp',
'noise_cuda_kernel.cu',
]),
],
cmdclass={
'build_ext': BuildExtension
})
我不是 pytorch 用户,但如果我没看错 docs,这应该可行:
import sysconfig
from setuptools import setup
from torch.utils.cpp_extension import BuildExtension, CUDAExtension
setup(
name='noise_cuda',
ext_modules=[
CUDAExtension('noise_cuda', [
'noise_cuda.cpp',
'noise_cuda_kernel.cu',
], extra_compile_args={'cxx': sysconfig.get_config_var('CFLAGS').split(),
'nvcc': ['-ccbin=/usr/bin/gcc-7']}),
],
cmdclass={
'build_ext': BuildExtension
})
我正在使用一个 GPU 集群,其中提交的作业由 Slurm 管理。我在那台服务器上没有管理员/根权限。我目前正在尝试构建一个包含 .cpp
和 .cu
文件的项目。我通过调用 TORCH_CUDA_ARCH_LIST=7.2 CC=gcc-7 CXX=g++-7 python setup.py install
来做到这一点,因为集群使用 CUDA 10.1
并运行 V100
个 GPU(因此 gencode 是 sm_70
)。
但是,构建崩溃并显示以下错误消息:
building <filename> extension
gcc-7 -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes (...):
error: #error -- unsupported GNU version! gcc versions later than 8 are not supported!
138 | #error -- unsupported GNU version! gcc versions later than 8 are not supported!
| ^~~~~
error: command '/<somepath>/anaconda3/envs/pytorch14/bin/nvcc' failed with exit status 1
因此,从第二行的 gcc-7 调用可以看出,python 脚本使用了正确的编译器,但不幸的是,nvcc
调用使用了系统范围的编译器gcc 符号链接,即:/usr/bin/gcc: symbolic link to gcc-9
。我在网上找到了几个答案(包括 this and this)并尝试了建议的步骤。但是:因为我没有 root 访问权限,所以我无法创建新的符号链接/将现有的符号链接更改为另一个已安装的 gcc 版本,例如/usr/bin/gcc-7
:做 ln -s /usr/bin/gcc-7 /usr/bin/gcc
给我一个 ln: failed to create symbolic link '/usr/bin/gcc': File exists
错误,并且将文件复制到 /usr/local/bin
,正如其他答案中所建议的那样,由于缺少特权而无法工作。
我真的很茫然,觉得这可能是一条死胡同。有人有什么建议吗?
作为参考,这是我的 setup.py 的样子:
from setuptools import setup
from torch.utils.cpp_extension import BuildExtension, CUDAExtension
setup(
name='noise_cuda',
ext_modules=[
CUDAExtension('noise_cuda', [
'noise_cuda.cpp',
'noise_cuda_kernel.cu',
]),
],
cmdclass={
'build_ext': BuildExtension
})
我不是 pytorch 用户,但如果我没看错 docs,这应该可行:
import sysconfig
from setuptools import setup
from torch.utils.cpp_extension import BuildExtension, CUDAExtension
setup(
name='noise_cuda',
ext_modules=[
CUDAExtension('noise_cuda', [
'noise_cuda.cpp',
'noise_cuda_kernel.cu',
], extra_compile_args={'cxx': sysconfig.get_config_var('CFLAGS').split(),
'nvcc': ['-ccbin=/usr/bin/gcc-7']}),
],
cmdclass={
'build_ext': BuildExtension
})