我正在构建一个用于与API GW背后的Sagemaker进行交互的API。
昨天,我在app.py上使用requirements.txt和一个dockerfile来部署一个lambda函数。这通常是很好的。我们在生产中也有大约十几个这样的Apache,它们不会抛出错误。然而,因为我想使用python 3.9的功能,我已经更改为python 3.9 dockerfile。
今天,似乎对requirements.txt文件没有任何更改,我的lambda显示了一个运行时错误,因为它找不到Keras。昨天它还能好好的。
以下是我的要求.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"]
我使用ECR并使用以下部署脚本,编辑以隐藏帐户ID:
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": []
}
我已经无计可施了。有什么想法吗?
1条答案
按热度按时间chhqkbe11#
所以我设法解决这个问题后,大量的调试,检查图像和什么。
问题出在我试图导入的两个标记器上。它不是用来导入keras或tensorflow的。这些标记器是我正在加载的引用keras的二进制文件。
Tokenizer 1是新的-使用tensorflow 2.13制作,而tokenizer 2是旧的(可能是使用tensorflow 2.1,python 3.6制作的)。在加载时,它们分别需要Keras.src和Keras_preprocessing(python 3.6及更低版本的遗留Keras库)。我不确定是怎么回事。由于模型托管在一个单独的端点上,这从来都不相关(keras tokenizer本质上只是一个将单词转换为数字索引的巨大查找表)。
我已经设法绕过了这个要求,将tokenizer保存到json中并单独加载它们,这将tokenizer转储为一个普通的,几乎是不可知的格式。缺点是我的tokenizer在其json定义中每个都有80 MB。
在代码中,我的修复涉及运行以下片段将joblib转换为json:
在app.py中:
这究竟是如何成为一个问题,或者为什么它以前工作仍然是一个谜。我希望这能帮助任何遇到同样错误的人。