首页 > 解决方案 > 尝试从容器中的 AWS lambda 中使用 keras 模型超时

问题描述

我正在尝试遵循这些说明: https://docs.aws.amazon.com/lambda/latest/dg/python-image.html https://docs.aws.amazon.com/lambda/latest/dg/图像-create.html

不同之处在于我的应用程序尝试导入一些库并加载 Keras 模型以进行预测。这是我的 dockerfile:FROM amazon/aws-lambda-python:3.8

RUN pip install --no-cache-dir --upgrade pip && \
    pip install --no-cache-dir tensorflow keras numpy pillow

COPY app.py   ./
COPY cnn.h5   ./
CMD ["app.handler"]

这是 app.py 的代码:

import keras
import numpy as np
from keras.preprocessing import image
import json

my_dict = {"0": "123", "1": "456", "2": "789"}

cnn = keras.models.load_model('cnn.h5')

def downloadFromS3(strBucket, s3_path, local_path):
    s3_client = boto3.client('s3')
    s3_client.download_file(strBucket, s3_path, local_path)

def handler(event, context):
    bucket_name = event['Records'][0]['s3']['bucket']['name']
    file_path = event['Records'][0]['s3']['object']['key']
    file_name = file_path.split('/')[-1]
    downloadFromS3(bucket_name, file_path, '/tmp/' + file_name)
    test_image = image.load_img('/tmp/' + file_name, target_size = (224,224))
    
    test_image = image.img_to_array(test_image)
    test_image = np.expand_dims(test_image, axis = 0)
    result = cnn.predict(test_image)
    predicted_class = result[0].argmax()
    
    return my_dict[str(predicted_class)]

不幸的是,我一直遇到超时。我已经高达 3072MB 和 20 秒的超时,当我在 AWS 管理控制台中运行测试调用调用时,它仍然会引发超时错误。我开始认为这是一个 S3 权限问题,所以我创建了一个更简单的应用程序来测试。dockerfile 看起来像这样:

FROM amazon/aws-lambda-python:3.8

COPY app.py   ./
CMD ["app.handler"]

app.py 看起来像这样(是的,我意识到我正在下载一个文件并且什么都不做):

def downloadFromS3(strBucket, s3_path, local_path):
    s3_client = boto3.client('s3')
    s3_client.download_file(strBucket, s3_path, local_path)

def handler(event, context):
    bucket_name = event['Records'][0]['s3']['bucket']['name']
    file_path = event['Records'][0]['s3']['object']['key']
    file_name = file_path.split('/')[-1]
    downloadFromS3(bucket_name, file_path, '/tmp/' + file_name)
    
    return file_name

这个更简单的示例返回正常,这让我相信它从 S3 下载就好了。当我从笔记本电脑在 docker 中运行时,此代码会在大约 5 秒内返回,其中大部分是执行导入和加载模型。我不知道在哪里寻找为什么会超时。

标签: kerasaws-lambda

解决方案


推荐阅读