为没有 root 权限的 nvcc 指定 GCC 版本

Posted

技术标签:

【中文标题】为没有 root 权限的 nvcc 指定 GCC 版本【英文标题】:Specify GCC version for nvcc without root priviledges 【发布时间】:2021-10-05 18:29:12 【问题描述】:

我正在使用一个 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 符号链接,即:@987654332 @。我在网上找到了几个答案(包括this 和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
    )

【问题讨论】:

直接使用nvcc时直接指定宿主编译器没有问题(见here)。但是我不知道如何在这个 python 上下文中执行此操作。 只需更改 PATH 以首先指向您具有写入权限的目录(~/bin 可能已经存在),然后在该目录中添加符号链接? 【参考方案1】:

我不是 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
    )


【讨论】:

是的,确实,这就是解决问题的方法!我会稍微更新您的答案(将extra_compile_args 放在正确的位置)并且必须指定cxx 属性,否则编译器会抱怨KeyError。非常感谢!真的很感激:)

以上是关于为没有 root 权限的 nvcc 指定 GCC 版本的主要内容,如果未能解决你的问题,请参考以下文章

在没有 gcc 或 root 访问权限的共享主机上安装需要 gcc 的 python 模块

[ubuntu][原创]如何在没有root权限下更换成自己gcc

是否可以在 Windows 中将 nvcc 与 gcc/g++ 集成?

没有GPU的Nvcc

gcc-via-nvcc 是不是矢量化这些总和和最大减少?

使用gcc和nvcc编译时,eigen :: matrix反转的行为不同