问题背景
在做大模型微调训练时,执行python脚本时出现如下报错:
查看当前服务器版本,确实没有GLIBC_2.29的
strings /lib64/libm.so.6 | grep GLIBC_
GLIBC_2.2.5
GLIBC_2.4
GLIBC_2.15
GLIBC_2.18
GLIBC_2.23
GLIBC_2.24
GLIBC_2.25
GLIBC_2.26
GLIBC_2.27
GLIBC_2.28
GLIBC_PRIVATE
解决方案
在网上查了很多方法,都不太建议升级glibc版本,对系统影响比较大,而且升级起来很麻烦,很多底层的依赖也要跟着升级。
目前已经在ubuntu系统上是没问题的,但又不想重装系统,所以还是选择了在系统本地升级glibc版本。
具体方案如下:
在本地将glibc-2.29进行编译,然后根据python脚本执行报错所给出的路径信息,将glibc-2.29编译后的libm-2.29.so与/lib64/下的libm.so.6重新做个软连接,其他底层的依赖版本不进行更改。
其他报错也可以按照我这个方案进行软连接替换,提示什么就替换什么。
ImportError: /lib64/XXXX: version `GLIBC_2.29
下载GLIBC_2.29压缩包
wget http://ftp.gnu.org/gnu/glibc/glibc-2.29.tar.gz
解压进行编译
tar -zxvf glibc-2.29.tar.gz
cd glibc-2.29
mkdir build
cd build/
../configure --prefix=/usr/local --disable-sanity-checks
#这里可能会报错,提示要升级gcc、bison、python、make版本等信息
# These critical programs are missing or too old: make bison python
# Check the INSTALL file for required versions.# 根据报错的信息,进行安装就可以了
# 需要升级GCC的就升级GCC,需要升级make的就升级make,需要升级python的就升级python,我这里只需要升级make、bison、python即可
yum install make bison python3
安装
make -j18
make install
# 安装完成后可以输入echo $?验证下有没有报错
echo $? #如果返回的是0说明是安装成功的,非0说明安装失败
建立软连接
cd /lib64/
mv ./libm.so.6 ./libm.so.6_bak
ln -s /usr/local/lib/libm-2.29.so libm.so.6#因为编译的时候设置了--prefix=/usr/local,所以libm-2.29.so被安装在/usr/local/下
验证版本
strings /lib64/libm.so.6 | grep GLIBC_
# 就可以看到会出现GLIBC_2.29的版本
可以现在测试环境中试一下,进行重启系统后,看看是否都正常,确认没问题了再上开发环境更改。