切换Python3.9后AWS Lambda部署镜像出现Keras模块找不到问题
排查Python3.9 Lambda镜像中'keras.src'模块找不到的问题
我正在构建部署在API网关后方、与Sagemaker交互的AWS Lambda函数。此前使用其他Python镜像部署均正常,已有十余同类型Lambda在生产环境稳定运行。因需要使用Python3.9特性,切换至对应镜像后,未改动requirements.txt的情况下,Lambda运行时出现错误,提示找不到'keras.src'模块。
相关配置
requirements.txt
tensorflow==2.8.0 keras==2.8.* requests==2.28.2 pandas scikit-learn joblib==1.2 langdetect==1.0.9 beautifulsoup4==4.12.2 urllib3<2 dill protobuf<3.20
Dockerfile
FROM amazon/aws-lambda-python:3.9 COPY app.py ${LAMBDA_TASK_ROOT} COPY requirements.txt . RUN pip3 install -r requirements.txt --target "${LAMBDA_TASK_ROOT}" --verbose CMD [ "app.lambda_handler"]
部署脚本
docker build -t project-foo . --no-cache --progress=plain &> build.log docker tag project-foo:latest <aws-account-id>.dkr.ecr.eu-west-1.amazonaws.com/project-foo:latest docker push <aws-account-id>.dkr.ecr.eu-west-1.amazonaws.com/project-foo:latest aws lambda update-function-code --function-name project-foo-test --image-uri <aws-account-id>.dkr.ecr.eu-west-1.amazonaws.com/project-foo:latest > update_response.json
错误信息
{ "errorMessage": "Unable to import module 'app': No module named 'keras.src'", "errorType": "Runtime.ImportModuleError", "requestId": "<requestid>", "stackTrace": [] }
排查解决方法
- 核对Keras与TensorFlow版本兼容性:查看build.log中的安装日志,确认实际安装的Keras版本是否为2.8.x,以及TensorFlow是否正确关联Keras。TensorFlow 2.x本身内置Keras模块,单独安装的Keras可能与内置版本产生路径冲突。
- 移除单独的Keras依赖:TensorFlow 2.8.0已包含完整的Keras实现,无需单独安装
keras包。尝试从requirements.txt中删除keras==2.8.*,仅保留tensorflow==2.8.0,重新构建镜像测试。 - 验证镜像内的模块结构:本地运行构建好的镜像,进入容器后检查Lambda任务根目录下的Keras目录结构,确认是否存在
keras/src路径。执行命令示例:docker run -it --entrypoint bash project-foo:latest cd ${LAMBDA_TASK_ROOT} ls -la keras/ - 检查pip安装路径正确性:查看build.log中的pip输出,确认
--target参数是否正确指向/var/task(Lambda默认任务根目录),避免依赖被安装到系统路径而非任务目录。 - 强制指定Keras精确版本:将requirements.txt中的
keras==2.8.*改为keras==2.8.0,避免pip拉取2.8.x系列中可能存在路径结构变化的版本,重新构建测试。 - 排查Python环境系统依赖差异:对比之前正常运行的Python版本镜像(如3.8)与3.9镜像的系统依赖,查看是否缺少Keras运行所需的系统库。可在Dockerfile中添加
yum install -y <依赖库>补充必要包。
内容的提问来源于stack exchange,提问作者JeffLuppes
相关产品推荐
相关产品推荐

