Linux操作系统(三):详解Linux及2023年gcc/g++ 多版本间切换

1. Linux操作系统之Red hat与Centos

基于目前手头的Linux操作系统:

  1. 查看系统版本:cat /proc/version

    Linux version 3.10.0-1160.24.1.el7.x86_64 (mockbuild@kbuilder.bsys.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) ) #1 SMP Thu Apr 8 19:51:47 UTC 2021

    • 内核版本:3.10.0-1160.24.1.el7.x86_64
    • GCC(GNU Compiler Collection)版本:4.8.5 20150623 (Red Hat 4.8.5-44)
    • 发行日期:#1 SMP Thu Apr 8 19:51:47 UTC 2021。内核编译在2021年4月8日的19点51分47秒(UTC时区)编译的。
    • mockbuild@kbuilder.bsys.centos.org: 在 kbuilder.bsys.centos.org 这个服务器上使用 mockbuild 用户进行软件包的构建。  PS:在已部署的CentOS系统构建软件包可以实现自定义配置和依赖管理。后文说到的gcc/g++ 多版本间切换便属于依赖管理和自定义配置。

    在CentOS中进行软件包构建时,构建工具例如Mock会创建一个专门的用户帐户 mockbuild。这个用户帐户用于执行构建过程,以确保构建的安全性和隔离性。这样,如果构建过程中出现意外情况或者恶意软件,它不会对真实的系统产生影响,因为 mockbuild 用户没有超级用户权限。kbuilder.bsys.centos.org 是构建服务器的域名或主机名,用于标识构建过程所在的服务器。

  2. 为什么版本名称中既有Centos也有Red Hat

    • 系统名称查看cat /etc/redhat-release

      CentOS Linux release 7.9.2009 (Core)

      • 当前运行的CentOS Linux的主版本号是7,次版本号是9,修订号是2009。
    • CentOS 和 Red Hat关系

        CentOS是基于Red Hat Enterprise Linux(RHEL)的免费开源操作系统,它与RHEL兼容,并且主要通过移除商标和商业支持等元素来提供一个免费的替代版本。
        显然我手头的系统是CentOS7,使用的GCC编译器版本是4.8.5(这个也是CentOS7的默认gcc),在这个gcc版本号中包含了Red Hat 4.8.5-44的标识。但是,请注意,这个标识仅表示GCC编译器的发布和打包来源于Red Hat,而不是系统本身是Red Hat Linux。

2. 多个gcc/glibc版本的共存及指定gcc版本的编译

针对需求:不同version的cuda开发库使用的gcc版本不同。如果大模型需要的实验环境cuda版本不一样,在切换cuda版本后需要采用对应版本的gcc进行编译。
在这里插入图片描述
  “max supported GCC version” 表示CUDA所支持的最高GCC版本,即CUDA要求您使用不高于该版本的GCC编译器。CUDA通常是向下兼容的,这样做是为了确保CUDA代码可以在广泛的系统上编译和运行。

2.1 如何确定cuda版本和gcc版本不适配

  • 查询cuda版本nvcc --version

    Built on Tue_Sep_15_19:10:02_PDT_2020 (由NVIDIA在2020年9月15日(PDT时区)构建的)
    Cuda compilation tools, release 11.1, V11.1.74
    Build cuda_11.1.TC455_06.29069683_0
    (CUDA构建的详细信息,包含了特定构建版本的标识。)

    PS:nvidia-smi是NVIDIA系统管理器的命令行工具,用于查看GPU的状态和信息。它显示的是GPU驱动程序的版本信息,包括CUDA驱动版本。这台服务器CUDA Version: 11.2 ,但是Cuda compilation tools, release 11.1。实际上应该尽量确保所有的CUDA工具和驱动程序都是同一版本。这样可以避免版本不一致可能导致的问题。

  • 查询gcc版本gcc --version

    gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44)
    Copyright © 2015 Free Software Foundation, Inc.
    This is free software(GCC是自由软件,遵循GNU通用公共许可证(GNU General Public License,GPL)。自由软件意味着所有人都有权利查看、使用、复制、修改和传播该软件。); see the source for copying conditions. There is NOwarranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.( 免责声明。无论是商业性质还是适用于特定目的,都没有提供保证。这意味着使用GCC的风险和责任由用户自行承担。)

  • 在模型set_up时出现问题:RuntimeError: The current installed version of g++ (4.8.5) is less than the minimum required version by CUDA 11.1 (5.0.0). Please make sure to use an adequate version of g++ (>=5.0.0, <11.0).

  虽然但是,我在服务器上的部分python代码使用cuda可以正常运行。原因是使用的CUDA代码可能并不依赖于GCC编译器。有些CUDA代码是由NVIDIA提供的预编译的二进制代码,而不需要依赖于特定版本的GCC编译器。这些预编译的二进制代码通常可以在不同版本的GCC上正常运行。
  在服务器上通过python查看pytotch依赖的cuda版本:

Python 3.9.9 (main, Mar 7 2022, 14:19:54)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-44)] on linux

import torch; print(torch.version.cuda)

输出结果为11.7。许多GPU加速的库,包括PyTorch,通常会包含预编译的CUDA二进制代码,这些代码已经针对特定版本的CUDA进行了编译。因此,PyTorch的CUDA模块可能已经被编译为CUDA 11.7的版本,并且不直接依赖于系统上安装的GCC版本。预编译的CUDA二进制代码是为了跨平台兼容性和用户友好性。然而,为了获得最佳性能和稳定性,官方推荐使用与CUDA版本兼容的GCC编译器。

  通过这行代码可以查询预编译信息:

torch.__config__.show()
'PyTorch built with:\n  - GCC 9.3\n  - C++ Version: 201703\n  - Intel(R) Math Kernel Library Version 2017.0.1 Product Build 20161005 for Intel(R) 64 architecture applications\n  - Intel(R) MKL-DNN v2.7.3 (Git Hash 6dbeffbae1f23cbbeae17adb7b5b13f1f37c080e)\n  - OpenMP 201511 (a.k.a. OpenMP 4.5)\n  - LAPACK is enabled (usually provided by MKL)\n  - NNPACK is enabled\n  - CPU capability usage: AVX2\n  - CUDA Runtime 11.7\n  - NVCC architecture flags: -gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_60,code=sm_60;-gencode;arch=compute_70,code=sm_70;-gencode;arch=compute_75,code=sm_75;-gencode;arch=compute_80,code=sm_80;-gencode;arch=compute_86,code=sm_86\n  - CuDNN 8.3.2  (built against CUDA 11.5)\n    - Built with CuDNN 8.5\n  - Magma 2.6.1\n  - Build settings: BLAS_INFO=mkl, BUILD_TYPE=Release, CUDA_VERSION=11.7, CUDNN_VERSION=8.5.0, CXX_COMPILER=/opt/rh/devtoolset-9/root/usr/bin/c++, CXX_FLAGS= -D_GLIBCXX_USE_CXX11_ABI=0 -fabi-version=11 -Wno-deprecated -fvisibility-inlines-hidden -DUSE_PTHREADPOOL -DNDEBUG -DUSE_KINETO -DLIBKINETO_NOROCTRACER -DUSE_FBGEMM -DUSE_QNNPACK -DUSE_PYTORCH_QNNPACK -DUSE_XNNPACK -DSYMBOLICATE_MOBILE_DEBUG_HANDLE -O2 -fPIC -Wall -Wextra -Werror=return-type -Werror=non-virtual-dtor -Werror=bool-operation -Wnarrowing -Wno-missing-field-initializers -Wno-type-limits -Wno-array-bounds -Wno-unknown-pragmas -Wunused-local-typedefs -Wno-unused-parameter -Wno-unused-function -Wno-unused-result -Wno-strict-overflow -Wno-strict-aliasing -Wno-error=deprecated-declarations -Wno-stringop-overflow -Wno-psabi -Wno-error=pedantic -Wno-error=redundant-decls -Wno-error=old-style-cast -fdiagnostics-color=always -faligned-new -Wno-unused-but-set-variable -Wno-maybe-uninitialized -fno-math-errno -fno-trapping-math -Werror=format -Werror=cast-function-type -Wno-stringop-overflow, LAPACK_INFO=mkl, PERF_WITH_AVX=1, PERF_WITH_AVX2=1, PERF_WITH_AVX512=1, TORCH_DISABLE_GPU_ASSERTS=ON, TORCH_VERSION=2.0.0, USE_CUDA=ON, USE_CUDNN=ON, USE_EXCEPTION_PTR=1, USE_GFLAGS=OFF, USE_GLOG=OFF, USE_MKL=ON, USE_MKLDNN=ON, USE_MPI=OFF, USE_NCCL=1, USE_NNPACK=ON, USE_OPENMP=ON, USE_ROCM=OFF, \n'
  • GCC版本:GCC 9.3
    PyTorch编译时所使用的GCC编译器的版本是9.3。

  • C++版本:C++ Version: 201703
    C++编译器版本是201703,表示使用C++17标准进行编译。

  • CUDA版本:CUDA Runtime 11.7
    PyTorch编译时所使用的CUDA版本是11.7。

  • CuDNN版本:CuDNN 8.3.2 (built against CUDA 11.5), Built with CuDNN 8.5
    PyTorch编译时使用了CuDNN版本8.3.2,该版本是针对CUDA 11.5构建的,并且编译时还使用了CuDNN版本8.5。

  • CPU能力:CPU capability usage: AVX2
    PyTorch编译时启用了CPU的AVX2指令集优化。

  • 使用的其他库:NNPACK、LAPACK、Magma等
    编译时启用了NNPACK(用于CPU优化)、LAPACK(通常由MKL提供)和Magma等库。

然而,对于没有预编译的模型,需要考虑版本兼容,否则会在模型set_up时报错:

RuntimeError: The current installed version of g++ (4.8.5) is less than the minimum required version by CUDA 11.1 (5.0.0). Please make sure to use an adequate version of g++ (>=5.0.0, <11.0).

2.2介绍通过cuda降级实现编译。2.3通过cuda、gcc多版本管理实现编译。

2.2 cuda降级(不推荐)

GCC 4.8.5最多兼容的CUDA版本是10.2。要使用更高版本的CUDA,需要升级GCC。

Cuda升级、降级操作

有些模型要求在cuda降级后就无法编译成功了。比如Grounding-DINO,官方建议的版本为cuda-11.3。

2.3 gcc多版本管理

  在Linux系统中,升级默认的GCC并不推荐!因为系统可能依赖于特定版本的GCC来编译和运行一些软件包和组件。更改默认的GCC版本后可能会导致一些软件出现兼容性问题。
  该部分参考CentOS 管理多版本gcc,本人已经配置过yum源,所以下面两步即可:

  1. 安装GCC 9.4和相关的开发工具:
sudo yum install centos-release-scl
sudo yum install devtoolset-9
  1. 启用GCC 9.4环境:
sudo dnf install gcc-toolset-9

启用sudo dnf install gcc-toolset-9只是在系统中安装了GCC 9,并通过gcc-toolset-9的软件包来提供对GCC 9的访问。但这不会自动使得Python在使用CUDA编译后自动使用正确的GCC版本。

创建一个新的python虚拟环境并指定CC=gcc-9 CXX=g+±9 virtualenv -p /home/---------/python3.9/Python-3.9.9/python GroundingDINO 即可。

2.4 直接换一台服务器

  恰好还有一台服务器,ubuntu系统20.04默认gcc为9.4.0,系统安装了与CUDA 11.7兼容的NVIDIA驱动程序。所以安装一个cuda-11.7然后重新配置一个新的虚拟环境即可。
cat /proc/version :Linux version 5.4.0-146-generic (buildd@lcy02-amd64-026) (gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.1)) #163-Ubuntu SMP Fri Mar 17 18:26:02 UTC 2023
nvcc --version :cuda-11.7,安装新cuda编译器可以参考Linux (Ubuntu)安装 cuda 11.7
source/home/paresaw/axy/Envs/GroundingDINO/bin/activate激活 :Python 3.9.17

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值