Sagemaker图像分类:在S3中对许多图像进行推理的最佳方式?

时间:2018-04-26 18:39:35

标签: amazon-s3 resnet amazon-sagemaker

我使用内置的RESnet18泊坞窗图像训练了一个模型,现在我想将模型部署到端点并对大约100万张图像进行分类。我将所有训练,验证和测试图像以RecordIO格式存储在S3上(使用im2rec.py转换)。根据{{​​3}}:

  

Amazon SageMaker图像分类算法支持RecordIO(应用程序/ x-recordio)和图像(应用程序/ x-image)内容类型以进行培训。该算法仅支持application / x-image进行推理。

因此我无法以RecordIO格式对我的训练数据进行推断。为了解决这个问题,我将所有原始.jpg图像(~2GB)复制到我的Sagemaker Jupyter Notebook实例上,并按以下方式一次执行一次推理:

img_list = os.listdir('temp_data') # list of all ~1,000,000 images

for im in img_list:
    with open('temp_data/'+im, 'rb') as f:
        payload = f.read()
        payload = bytearray(payload)
    response = runtime.invoke_endpoint(EndpointName=endpoint_name, 
                                       ContentType='application/x-image', 
                                       Body=payload)

    etc...

毋庸置疑,将所有数据传输到我的Notebook实例上需要很长时间,我宁愿在运行推理之前不必这样做。为什么SageMaker图像分类不支持RecordIO进行推理?更重要的是,在不必从S3移动它们的情况下,对许多图像进行推理的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

RecordIO格式旨在将大量图像打包到单个文件中,因此我认为它不能很好地用于预测单个图像。

关于预测,您绝对不必将图像复制到笔记本实例或S3。您只需从任何地方加载它们并将它们内联到您的预测请求中即可。

如果您要基于HTTP的预测,请选择以下选项:

1)在任何机器上使用SageMaker SDK Predictor.predict()API(只要具有适当的AWS凭证即可)https://github.com/aws/sagemaker-python-sdk

2)在任何机器上使用AWS Python SDK(aka boto3)API invoke_endpoint()(只要它具有适当的AWS凭证)

您甚至可以构建一个简单的服务来使用Lambda进行预处理或后处理。这是一个示例:https://medium.com/@julsimon/using-chalice-to-serve-sagemaker-predictions-a2015c02b033

如果要批量预测:  最简单的方法是从SageMaker检索经过训练的模型,编写几行临时MXNet代码以加载它并运行所有预测。这是一个示例:https://mxnet.incubator.apache.org/tutorials/python/predict_image.html

希望这会有所帮助。

答案 1 :(得分:1)