AWS Lambda在部署映像时无法找到keras,但只是有时?

af7jpaap  于 2023-10-19  发布在  其他
关注(0)|答案(1)|浏览(133)

我正在构建一个用于与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": []
}

我已经无计可施了。有什么想法吗?

chhqkbe1

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:

tokenizer = joblib.load("artifacts/tokenizer.joblib")
tokenizer_json = tokenizer.to_json()
with open(f'artifacts/tokenizer.json', 'w', encoding='utf-8') as f:
    f.write(json.dumps(tokenizer_json, ensure_ascii=False))

在app.py中:

with open(f'artifacts/tokenizer.json') as f:
    data = json.load(f)
    tokenizer = tf.keras.preprocessing.text.tokenizer_from_json(data)

这究竟是如何成为一个问题,或者为什么它以前工作仍然是一个谜。我希望这能帮助任何遇到同样错误的人。

相关问题