【机器学习】基于conda虚拟环境的gcc、g++版本升级
最近在学习大模型部署,需要安装flash-attn,在编译时报错
c++: error: unrecognized command line option ‘-std=c++17’
centos7.9默认gcc最高版本为4.8.5
(base) [root@xx ~]# cat /proc/version
Linux version 3.10.0-1160.el7.x86_64 (mockbuild@kbuilder.bsys.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) ) #1 SMP Mon Oct 19 16:18:59 UTC 2020
以上报错需要高版本的gcc支持,所以需要升级GCC的版本,对应关系参考
GCC版本对C++的支持情况
这里选择9.0版本进行升级。
网上搜索教程,多是 基于centos yun 安装替换方式,比较复杂,该文章基于conda虚拟环境来进行升级,操作简单,对原系统侵入少。
激活conda环境
conda是python的解释器环境,可以隔离不同的python解释环境,可以自动拉取环境所需的包,屏蔽了虚拟机底层的差异,避免了频繁的更换安装python解释器
所以我们选择在conda环境升级gcc、g++版本,来支撑这个环境下的编译工作。
#激活环境
conda activate ktransformers
#查看gcc可安装的版本
conda search gcc
# 查看g++可安装版本
conda search gxx
可以看到版本很多,这里选择gcc-linux-64=9.3.0,gxx-linux-64=9.3.0版本
安装gcc 、g++
# 安装gcc
conda install gcc_linux-64=9.3.0
# 安装gxx
conda install gxx_linux-64=9.3.0
会被安装到这个路径(你自己conda虚拟环境的目录,这里是ktransformers)
environment location: /home/xxx//envs/ktransformers
# 查看安装版本(conda下安装的gcc不叫gcc了,叫x86_64-conda-linux-gnu-cc)
x86_64-conda-linux-gnu-cc -v
# 查看gxx安装版本
x86_64-conda-linux-gnu-c++ -v
(ktransformers) [root@yd-ss ~]# x86_64-conda-linux-gnu-cc -v
Reading specs from /home/xxx//envs/ktransformers/bin/../lib/gcc/x86_64-conda-linux-gnu/9.3.0/specs
COLLECT_GCC=x86_64-conda-linux-gnu-cc
COLLECT_LTO_WRAPPER=/home/xxx//envs/ktransformers/bin/../libexec/gcc/x86_64-conda-linux-gnu/9.3.0/lto-wrapper
Target: x86_64-conda-linux-gnu
Configured with: /home/builder/ktietz/cos6/ci_cos6/ctng-compilers_1622658800915/work/.build/x86_64-conda-linux-gnu/src/gcc/configure --build=x86_64-build_pc-linux-gnu --host=x86_64-build_pc-linux-gnu --target=x86_64-conda-linux-gnu --prefix=/home/builder/ktietz/cos6/ci_cos6/ctng-compilers_1622658800915/work/gcc_built --with-sysroot=/home/builder/ktietz/cos6/ci_cos6/ctng-compilers_1622658800915/work/gcc_built/x86_64-conda-linux-gnu/sysroot --enable-languages=c,c++,fortran,objc,obj-c++ --with-pkgversion='crosstool-NG 1.24.0.133_b0863d8_dirty' --enable-__cxa_atexit --disable-libmudflap --enable-libgomp --disable-libssp --enable-libquadmath --enable-libquadmath-support --enable-libsanitizer --enable-libmpx --with-gmp=/home/builder/ktietz/cos6/ci_cos6/ctng-compilers_1622658800915/work/.build/x86_64-conda-linux-gnu/buildtools --with-mpfr=/home/builder/ktietz/cos6/ci_cos6/ctng-compilers_1622658800915/work/.build/x86_64-conda-linux-gnu/buildtools --with-mpc=/home/builder/ktietz/cos6/ci_cos6/ctng-compilers_1622658800915/work/.build/x86_64-conda-linux-gnu/buildtools --with-isl=/home/builder/ktietz/cos6/ci_cos6/ctng-compilers_1622658800915/work/.build/x86_64-conda-linux-gnu/buildtools --enable-lto --with-host-libstdcxx='-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm' --enable-threads=posix --enable-target-optspace --enable-plugin --enable-gold --disable-nls --disable-multilib --with-local-prefix=/home/builder/ktietz/cos6/ci_cos6/ctng-compilers_1622658800915/work/gcc_built/x86_64-conda-linux-gnu/sysroot --enable-long-long --enable-default-pie
Thread model: posix
gcc version 9.3.0 (crosstool-NG 1.24.0.133_b0863d8_dirty)
/envs/ktransformers/bin(ktransformers) [root@yd-ss bin]# x86_64-conda-linux-gnu-c++ -v
Reading specs from /home/xxx//envs/ktransformers/bin/../lib/gcc/x86_64-conda-linux-gnu/9.3.0/specs
COLLECT_GCC=x86_64-conda-linux-gnu-c++
COLLECT_LTO_WRAPPER=/home/xxx//envs/ktransformers/bin/../libexec/gcc/x86_64-conda-linux-gnu/9.3.0/lto-wrapper
Target: x86_64-conda-linux-gnu
Configured with: /home/builder/ktietz/cos6/ci_cos6/ctng-compilers_1622658800915/work/.build/x86_64-conda-linux-gnu/src/gcc/configure --build=x86_64-build_pc-linux-gnu --host=x86_64-build_pc-linux-gnu --target=x86_64-conda-linux-gnu --prefix=/home/builder/ktietz/cos6/ci_cos6/ctng-compilers_1622658800915/work/gcc_built --with-sysroot=/home/builder/ktietz/cos6/ci_cos6/ctng-compilers_1622658800915/work/gcc_built/x86_64-conda-linux-gnu/sysroot --enable-languages=c,c++,fortran,objc,obj-c++ --with-pkgversion='crosstool-NG 1.24.0.133_b0863d8_dirty' --enable-__cxa_atexit --disable-libmudflap --enable-libgomp --disable-libssp --enable-libquadmath --enable-libquadmath-support --enable-libsanitizer --enable-libmpx --with-gmp=/home/builder/ktietz/cos6/ci_cos6/ctng-compilers_1622658800915/work/.build/x86_64-conda-linux-gnu/buildtools --with-mpfr=/home/builder/ktietz/cos6/ci_cos6/ctng-compilers_1622658800915/work/.build/x86_64-conda-linux-gnu/buildtools --with-mpc=/home/builder/ktietz/cos6/ci_cos6/ctng-compilers_1622658800915/work/.build/x86_64-conda-linux-gnu/buildtools --with-isl=/home/builder/ktietz/cos6/ci_cos6/ctng-compilers_1622658800915/work/.build/x86_64-conda-linux-gnu/buildtools --enable-lto --with-host-libstdcxx='-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm' --enable-threads=posix --enable-target-optspace --enable-plugin --enable-gold --disable-nls --disable-multilib --with-local-prefix=/home/builder/ktietz/cos6/ci_cos6/ctng-compilers_1622658800915/work/gcc_built/x86_64-conda-linux-gnu/sysroot --enable-long-long --enable-default-pie
Thread model: posix
gcc version 9.3.0 (crosstool-NG 1.24.0.133_b0863d8_dirty)
可以看到已安装成功。
但是这名字系统是无法识别的,所以需要建立软连接,进行改名
# 进入ktransformers虚拟环境目录下 /home/xxx//envs/ktransformers/bin
ln -s ./x86_64-conda-linux-gnu-cc ./gcc
ln -s ./x86_64-conda-linux-gnu-c++ ./g++
再次测试版本,在/home/xxx//envs/ktransformers/bin目录下
./gcc -v
./g++ -v
发现已变成9.3.0
但是仅仅在目录下才能生效,在其他地方读的还是旧的版本,需要配置该新版本的环境变量,路径即指向,conda虚拟环境中安装的这个版本
# conda 环境的gcc 9.3.0 g++ 9.3.0
export PATH=/home/xxx//envs/ktransformers/bin/:$PATH
# 生效
source /etc/profile
再次查看版本,发现成功变成了9.3.0.这就是conda的神奇方便之处。
如果后续需要把gcc版本改回去,就直接去掉环境变量配置即可。
若想更换其他版本的gcc,按以上步骤操作即可。