AWS Lambda升级Python版本后XGBoost库加载失败求助
问题描述
完整错误信息
[ERROR] XGBoostError: XGBoost Library (libxgboost.so) could not be loaded. Likely causes: * OpenMP runtime is not installed (vcomp140.dll or libgomp-1.dll for Windows, libgomp.so for UNIX-like OSes) * You are running 32-bit Python on a 64-bit OS Error message(s): ['libgomp.so.1: cannot open shared object file: No such file or directory']
环境背景
- 使用AWS Lambda函数
- 导入XGBoost时触发上述错误
- 升级Lambda运行时从Python 3.6到3.9后出现该问题
- 从S3存储桶的压缩包导入XGBoost
- 已尝试将
libgomp.so.1与XGBoost压缩包一起打包,但问题未解决
解决方案
1. 手动指定库路径并加载依赖
Lambda不会自动识别自定义打包的系统库,在导入XGBoost前添加以下代码:
import os from ctypes import cdll # 将libgomp.so.1所在目录加入系统库路径,替换为你实际的路径 os.environ['LD_LIBRARY_PATH'] = f"{os.environ.get('LD_LIBRARY_PATH', '')}:/var/task" # 手动加载库,路径对应压缩包中文件位置 cdll.LoadLibrary('/var/task/libgomp.so.1') # 之后再导入XGBoost import xgboost as xgb
如果libgomp.so.1放在子目录,就把路径改成对应子目录,比如/var/task/libs/libgomp.so.1。
2. 编译适配Amazon Linux 2的XGBoost包
Python 3.9的Lambda运行环境基于Amazon Linux 2,和Python 3.6使用的旧Amazon Linux AMI环境不兼容,之前的XGBoost包可能适配性不足。
- 切换到Amazon Linux 2环境(EC2实例或Docker镜像
amazonlinux:2)执行以下操作:# 安装编译依赖 yum install -y gcc-c++ python3-devel openmp-devel # 将XGBoost安装到指定目录 pip3 install xgboost -t ./lambda_pkg # 复制系统中的libgomp.so.1到包目录 cp /usr/lib64/libgomp.so.1 ./lambda_pkg/
将lambda_pkg目录打包上传到S3,让Lambda加载这个适配新环境的包。
3. 检查压缩包目录结构
确保压缩包解压后,XGBoost和libgomp.so.1都直接在/var/task路径下(Lambda代码默认解压到此目录),不要嵌套过深的子目录,否则导入时无法找到文件。
4. 改用Lambda层管理依赖
把XGBoost和依赖库做成Lambda层,更便于管理和复用:
- 按以下结构创建目录:
python/lib/python3.9/site-packages/ # 放置XGBoost lib/ # 放置libgomp.so.1 - 将目录打包成zip上传为Lambda层,然后关联到你的Lambda函数
- 代码中设置库路径指向层的目录:
os.environ['LD_LIBRARY_PATH'] = f"{os.environ.get('LD_LIBRARY_PATH', '')}:/opt/lib" cdll.LoadLibrary('/opt/lib/libgomp.so.1')
内容的提问来源于stack exchange,提问作者jeetendra swami
相关产品推荐
相关产品推荐

